use std::sync::{RwLock, RwLockReadGuard};
use serde::{Deserialize, Serialize};
use servo_config_macro::ServoPreferences;
pub use crate::pref_util::PrefValue;
static PREFERENCES: RwLock<Preferences> = RwLock::new(Preferences::new());
#[inline]
pub fn get() -> RwLockReadGuard<'static, Preferences> {
PREFERENCES.read().unwrap()
}
pub fn set(preferences: Preferences) {
stylo_config::set_bool("layout.unimplemented", preferences.layout_unimplemented);
stylo_config::set_i32("layout.threads", preferences.layout_threads as i32);
stylo_config::set_bool("layout.flexbox.enabled", preferences.layout_flexbox_enabled);
stylo_config::set_bool("layout.columns.enabled", preferences.layout_columns_enabled);
stylo_config::set_bool("layout.grid.enabled", preferences.layout_grid_enabled);
stylo_config::set_bool(
"layout.css.transition-behavior.enabled",
preferences.layout_css_transition_behavior_enabled,
);
stylo_config::set_bool(
"layout.writing-mode.enabled",
preferences.layout_writing_mode_enabled,
);
stylo_config::set_bool(
"layout.container-queries.enabled",
preferences.layout_container_queries_enabled,
);
*PREFERENCES.write().unwrap() = preferences;
}
#[macro_export]
macro_rules! pref {
($name: ident) => {
$crate::prefs::get().$name.clone()
};
}
#[derive(Clone, Deserialize, Serialize, ServoPreferences)]
pub struct Preferences {
pub fonts_default: String,
pub fonts_serif: String,
pub fonts_sans_serif: String,
pub fonts_monospace: String,
pub fonts_default_size: i64,
pub fonts_default_monospace_size: i64,
pub css_animations_testing_enabled: bool,
pub devtools_server_enabled: bool,
pub devtools_server_port: i64,
pub dom_webgpu_enabled: bool,
pub dom_webgpu_wgpu_backend: String,
pub dom_abort_controller_enabled: bool,
pub dom_bluetooth_enabled: bool,
pub dom_bluetooth_testing_enabled: bool,
pub dom_allow_scripts_to_close_windows: bool,
pub dom_canvas_capture_enabled: bool,
pub dom_canvas_text_enabled: bool,
pub dom_clipboardevent_enabled: bool,
pub dom_composition_event_enabled: bool,
pub dom_crypto_subtle_enabled: bool,
pub dom_customelements_enabled: bool,
pub dom_document_dblclick_timeout: i64,
pub dom_document_dblclick_dist: i64,
pub dom_fontface_enabled: bool,
pub dom_forcetouch_enabled: bool,
pub dom_fullscreen_test: bool,
pub dom_gamepad_enabled: bool,
pub dom_imagebitmap_enabled: bool,
pub dom_intersection_observer_enabled: bool,
pub dom_microdata_testing_enabled: bool,
pub dom_mouse_event_which_enabled: bool,
pub dom_mutation_observer_enabled: bool,
pub dom_notification_enabled: bool,
pub dom_offscreen_canvas_enabled: bool,
pub dom_permissions_enabled: bool,
pub dom_permissions_testing_allowed_in_nonsecure_contexts: bool,
pub dom_resize_observer_enabled: bool,
pub dom_script_asynch: bool,
pub dom_serviceworker_enabled: bool,
pub dom_serviceworker_timeout_seconds: i64,
pub dom_servo_helpers_enabled: bool,
pub dom_servoparser_async_html_tokenizer_enabled: bool,
pub dom_shadowdom_enabled: bool,
pub dom_svg_enabled: bool,
pub dom_testable_crash_enabled: bool,
pub dom_testbinding_enabled: bool,
pub dom_testbinding_prefcontrolled_enabled: bool,
pub dom_testbinding_prefcontrolled2_enabled: bool,
pub dom_testbinding_preference_value_falsy: bool,
pub dom_testbinding_preference_value_quote_string_test: String,
pub dom_testbinding_preference_value_space_string_test: String,
pub dom_testbinding_preference_value_string_empty: String,
pub dom_testbinding_preference_value_string_test: String,
pub dom_testbinding_preference_value_truthy: bool,
pub dom_testing_element_activation_enabled: bool,
pub dom_testing_html_input_element_select_files_enabled: bool,
pub dom_testperf_enabled: bool,
pub dom_xpath_enabled: bool,
pub dom_webgl2_enabled: bool,
pub dom_webrtc_enabled: bool,
pub dom_webrtc_transceiver_enabled: bool,
pub dom_webvtt_enabled: bool,
pub dom_webxr_enabled: bool,
pub dom_webxr_test: bool,
pub dom_webxr_first_person_observer_view: bool,
pub dom_webxr_glwindow_enabled: bool,
pub dom_webxr_glwindow_left_right: bool,
pub dom_webxr_glwindow_red_cyan: bool,
pub dom_webxr_glwindow_spherical: bool,
pub dom_webxr_glwindow_cubemap: bool,
pub dom_webxr_hands_enabled: bool,
pub dom_webxr_layers_enabled: bool,
pub dom_webxr_openxr_enabled: bool,
pub dom_webxr_sessionavailable: bool,
pub dom_webxr_unsafe_assume_user_intent: bool,
pub dom_worklet_enabled: bool,
pub dom_worklet_blockingsleep: bool,
pub dom_worklet_testing_enabled: bool,
pub dom_worklet_timeout_ms: i64,
pub gfx_precache_shaders: bool,
pub gfx_text_antialiasing_enabled: bool,
pub gfx_subpixel_text_antialiasing_enabled: bool,
pub gfx_texture_swizzling_enabled: bool,
pub inspector_show_servo_internal_shadow_roots: bool,
pub js_asmjs_enabled: bool,
pub js_asyncstack: bool,
pub js_baseline_interpreter_enabled: bool,
pub js_disable_jit: bool,
pub js_baseline_jit_enabled: bool,
pub js_baseline_jit_unsafe_eager_compilation_enabled: bool,
pub js_discard_system_source: bool,
pub js_dump_stack_on_debuggee_would_run: bool,
pub js_ion_enabled: bool,
pub js_ion_offthread_compilation_enabled: bool,
pub js_ion_unsafe_eager_compilation_enabled: bool,
pub js_mem_gc_allocation_threshold_mb: i64,
pub js_mem_gc_allocation_threshold_factor: i64,
pub js_mem_gc_allocation_threshold_avoid_interrupt_factor: i64,
pub js_mem_gc_compacting_enabled: bool,
pub js_mem_gc_decommit_threshold_mb: i64,
pub js_mem_gc_dynamic_heap_growth_enabled: bool,
pub js_mem_gc_dynamic_mark_slice_enabled: bool,
pub js_mem_gc_empty_chunk_count_max: i64,
pub js_mem_gc_empty_chunk_count_min: i64,
pub js_mem_gc_high_frequency_heap_growth_max: i64,
pub js_mem_gc_high_frequency_heap_growth_min: i64,
pub js_mem_gc_high_frequency_high_limit_mb: i64,
pub js_mem_gc_high_frequency_low_limit_mb: i64,
pub js_mem_gc_high_frequency_time_limit_ms: i64,
pub js_mem_gc_incremental_enabled: bool,
pub js_mem_gc_incremental_slice_ms: i64,
pub js_mem_gc_low_frequency_heap_growth: i64,
pub js_mem_gc_per_zone_enabled: bool,
pub js_mem_gc_zeal_frequency: i64,
pub js_mem_gc_zeal_level: i64,
pub js_mem_max: i64,
pub js_native_regex_enabled: bool,
pub js_offthread_compilation_enabled: bool,
pub js_parallel_parsing_enabled: bool,
pub js_shared_memory: bool,
pub js_throw_on_asmjs_validation_failure: bool,
pub js_throw_on_debuggee_would_run: bool,
pub js_timers_minimum_duration: i64,
pub js_wasm_baseline_enabled: bool,
pub js_wasm_enabled: bool,
pub js_wasm_ion_enabled: bool,
pub js_werror_enabled: bool,
pub layout_animations_test_enabled: bool,
pub layout_columns_enabled: bool,
pub layout_grid_enabled: bool,
pub layout_container_queries_enabled: bool,
pub layout_css_transition_behavior_enabled: bool,
pub layout_flexbox_enabled: bool,
pub layout_threads: i64,
pub layout_unimplemented: bool,
pub layout_writing_mode_enabled: bool,
pub media_glvideo_enabled: bool,
pub media_testing_enabled: bool,
pub network_enforce_tls_enabled: bool,
pub network_enforce_tls_localhost: bool,
pub network_enforce_tls_onion: bool,
pub network_http_cache_disabled: bool,
pub network_local_directory_listing_enabled: bool,
pub network_mime_sniff: bool,
pub session_history_max_length: i64,
pub shell_background_color_rgba: [f64; 4],
pub webgl_testing_context_creation_error: bool,
pub threadpools_fallback_worker_num: i64,
pub threadpools_image_cache_workers_max: i64,
pub threadpools_async_runtime_workers_max: i64,
pub threadpools_resource_workers_max: i64,
pub threadpools_webrender_workers_max: i64,
}
impl Preferences {
const fn new() -> Self {
Self {
css_animations_testing_enabled: false,
devtools_server_enabled: false,
devtools_server_port: 0,
dom_abort_controller_enabled: false,
dom_allow_scripts_to_close_windows: false,
dom_bluetooth_enabled: false,
dom_bluetooth_testing_enabled: false,
dom_canvas_capture_enabled: false,
dom_canvas_text_enabled: true,
dom_clipboardevent_enabled: true,
dom_composition_event_enabled: false,
dom_crypto_subtle_enabled: true,
dom_customelements_enabled: true,
dom_document_dblclick_dist: 1,
dom_document_dblclick_timeout: 300,
dom_fontface_enabled: false,
dom_forcetouch_enabled: false,
dom_fullscreen_test: false,
dom_gamepad_enabled: true,
dom_imagebitmap_enabled: false,
dom_intersection_observer_enabled: false,
dom_microdata_testing_enabled: false,
dom_mouse_event_which_enabled: false,
dom_mutation_observer_enabled: true,
dom_notification_enabled: false,
dom_offscreen_canvas_enabled: false,
dom_permissions_enabled: false,
dom_permissions_testing_allowed_in_nonsecure_contexts: false,
dom_resize_observer_enabled: false,
dom_script_asynch: true,
dom_serviceworker_enabled: false,
dom_serviceworker_timeout_seconds: 60,
dom_servo_helpers_enabled: false,
dom_servoparser_async_html_tokenizer_enabled: false,
dom_shadowdom_enabled: true,
dom_svg_enabled: false,
dom_testable_crash_enabled: false,
dom_testbinding_enabled: false,
dom_testbinding_prefcontrolled2_enabled: false,
dom_testbinding_prefcontrolled_enabled: false,
dom_testbinding_preference_value_falsy: false,
dom_testbinding_preference_value_quote_string_test: String::new(),
dom_testbinding_preference_value_space_string_test: String::new(),
dom_testbinding_preference_value_string_empty: String::new(),
dom_testbinding_preference_value_string_test: String::new(),
dom_testbinding_preference_value_truthy: false,
dom_testing_element_activation_enabled: false,
dom_testing_html_input_element_select_files_enabled: false,
dom_testperf_enabled: false,
dom_webgl2_enabled: false,
dom_webgpu_enabled: false,
dom_webgpu_wgpu_backend: String::new(),
dom_webrtc_enabled: false,
dom_webrtc_transceiver_enabled: false,
dom_webvtt_enabled: false,
dom_webxr_enabled: true,
dom_webxr_first_person_observer_view: false,
dom_webxr_glwindow_cubemap: false,
dom_webxr_glwindow_enabled: true,
dom_webxr_glwindow_left_right: false,
dom_webxr_glwindow_red_cyan: false,
dom_webxr_glwindow_spherical: false,
dom_webxr_hands_enabled: true,
dom_webxr_layers_enabled: false,
dom_webxr_openxr_enabled: true,
dom_webxr_sessionavailable: false,
dom_webxr_test: false,
dom_webxr_unsafe_assume_user_intent: false,
dom_worklet_blockingsleep: false,
dom_worklet_enabled: false,
dom_worklet_testing_enabled: false,
dom_worklet_timeout_ms: 10,
dom_xpath_enabled: false,
fonts_default: String::new(),
fonts_default_monospace_size: 13,
fonts_default_size: 16,
fonts_monospace: String::new(),
fonts_sans_serif: String::new(),
fonts_serif: String::new(),
gfx_precache_shaders: false,
gfx_text_antialiasing_enabled: true,
gfx_subpixel_text_antialiasing_enabled: true,
gfx_texture_swizzling_enabled: true,
inspector_show_servo_internal_shadow_roots: false,
js_asmjs_enabled: true,
js_asyncstack: false,
js_baseline_interpreter_enabled: true,
js_baseline_jit_enabled: true,
js_baseline_jit_unsafe_eager_compilation_enabled: false,
js_disable_jit: false,
js_discard_system_source: false,
js_dump_stack_on_debuggee_would_run: false,
js_ion_enabled: true,
js_ion_offthread_compilation_enabled: true,
js_ion_unsafe_eager_compilation_enabled: false,
js_mem_gc_allocation_threshold_avoid_interrupt_factor: 100,
js_mem_gc_allocation_threshold_factor: 100,
js_mem_gc_allocation_threshold_mb: 30,
js_mem_gc_compacting_enabled: true,
js_mem_gc_decommit_threshold_mb: 32,
js_mem_gc_dynamic_heap_growth_enabled: true,
js_mem_gc_dynamic_mark_slice_enabled: true,
js_mem_gc_empty_chunk_count_max: 30,
js_mem_gc_empty_chunk_count_min: 1,
js_mem_gc_high_frequency_heap_growth_max: 300,
js_mem_gc_high_frequency_heap_growth_min: 150,
js_mem_gc_high_frequency_high_limit_mb: 500,
js_mem_gc_high_frequency_low_limit_mb: 100,
js_mem_gc_high_frequency_time_limit_ms: 1000,
js_mem_gc_incremental_enabled: true,
js_mem_gc_incremental_slice_ms: 10,
js_mem_gc_low_frequency_heap_growth: 150,
js_mem_gc_per_zone_enabled: false,
js_mem_gc_zeal_frequency: 100,
js_mem_gc_zeal_level: 0,
js_mem_max: -1,
js_native_regex_enabled: true,
js_offthread_compilation_enabled: true,
js_parallel_parsing_enabled: true,
js_shared_memory: true,
js_throw_on_asmjs_validation_failure: false,
js_throw_on_debuggee_would_run: false,
js_timers_minimum_duration: 1000,
js_wasm_baseline_enabled: true,
js_wasm_enabled: true,
js_wasm_ion_enabled: true,
js_werror_enabled: false,
layout_animations_test_enabled: false,
layout_columns_enabled: false,
layout_container_queries_enabled: false,
layout_css_transition_behavior_enabled: true,
layout_flexbox_enabled: true,
layout_grid_enabled: false,
layout_threads: 3,
layout_unimplemented: false,
layout_writing_mode_enabled: false,
media_glvideo_enabled: false,
media_testing_enabled: false,
network_enforce_tls_enabled: false,
network_enforce_tls_localhost: false,
network_enforce_tls_onion: false,
network_http_cache_disabled: false,
network_local_directory_listing_enabled: true,
network_mime_sniff: false,
session_history_max_length: 20,
shell_background_color_rgba: [1.0, 1.0, 1.0, 1.0],
threadpools_async_runtime_workers_max: 6,
threadpools_fallback_worker_num: 3,
threadpools_image_cache_workers_max: 4,
threadpools_resource_workers_max: 4,
threadpools_webrender_workers_max: 4,
webgl_testing_context_creation_error: false,
}
}
}
impl Default for Preferences {
fn default() -> Self {
Self::new()
}
}