From 0e616e0c5d2bef8a6de1df25f2419a435837ed63 Mon Sep 17 00:00:00 2001 From: Martin Robinson Date: Tue, 14 Jan 2025 14:54:06 +0100 Subject: api: Flatten and simplify Servo preferences (#34966) Flatten and simplify Servo's preferences code. In addition, have both preferences and options passed in as arguments to `Servo::new()` and make sure not to use the globally set preferences in `servoshell` (as much as possible now). Instead of a complex procedural macro to generate preferences, just expose a very simple derive macro that adds string based getters and setters. - All command-line parsing is moved to servoshell. - There is no longer the concept of a missing preference. - Preferences no longer have to be part of the resources bundle because they now have reasonable default values. - servoshell specific preferences are no longer part of the preferences exposed by the Servo API. Signed-off-by: Martin Robinson --- Cargo.lock | 26 +- components/bluetooth/lib.rs | 2 +- components/compositing/compositor.rs | 2 +- components/config/Cargo.toml | 9 +- components/config/basedir.rs | 44 - components/config/lib.rs | 5 +- components/config/macro/Cargo.toml | 19 + components/config/macro/lib.rs | 55 ++ components/config/opts.rs | 522 +---------- components/config/pref_util.rs | 282 ++---- components/config/prefs.rs | 999 ++++++++------------- components/config/tests/prefs.rs | 333 ------- components/config_plugins/Cargo.toml | 19 - components/config_plugins/lib.rs | 206 ----- components/config_plugins/parse.rs | 151 ---- components/constellation/constellation.rs | 6 +- components/constellation/pipeline.rs | 15 +- components/constellation/sandboxing.rs | 5 +- components/constellation/serviceworker.rs | 13 +- components/devtools/actors/preference.rs | 189 ++-- components/fonts/system_font_service.rs | 8 +- components/layout_thread/lib.rs | 6 +- components/layout_thread_2020/lib.rs | 6 +- components/net/async_runtime.rs | 4 +- components/net/decoder.rs | 2 +- components/net/filemanager_thread.rs | 4 +- components/net/hsts.rs | 6 +- components/net/http_cache.rs | 2 +- components/net/image_cache.rs | 5 +- components/net/local_directory_listing.rs | 2 +- components/net/resource_thread.rs | 4 +- components/net/tests/filemanager_thread.rs | 7 +- components/script/dom/bindings/codegen/run.py | 23 +- components/script/dom/bindings/guard.rs | 4 +- components/script/dom/create.rs | 2 +- components/script/dom/document.rs | 14 +- components/script/dom/htmlmediaelement.rs | 2 +- components/script/dom/htmlscriptelement.rs | 2 +- components/script/dom/mouseevent.rs | 2 +- components/script/dom/paintworkletglobalscope.rs | 2 +- components/script/dom/permissions.rs | 2 +- components/script/dom/serviceworkerglobalscope.rs | 2 +- components/script/dom/servoparser/mod.rs | 2 +- components/script/dom/testbinding.rs | 17 +- components/script/dom/webgl2renderingcontext.rs | 2 +- components/script/dom/webglrenderingcontext.rs | 2 +- .../script/dom/webidls/AbortController.webidl | 2 +- .../script/dom/webidls/ActivatableElement.webidl | 4 +- components/script/dom/webidls/Bluetooth.webidl | 2 +- .../dom/webidls/BluetoothAdvertisingEvent.webidl | 2 +- .../BluetoothCharacteristicProperties.webidl | 2 +- .../script/dom/webidls/BluetoothDevice.webidl | 2 +- .../dom/webidls/BluetoothPermissionResult.webidl | 2 +- .../BluetoothRemoteGATTCharacteristic.webidl | 2 +- .../webidls/BluetoothRemoteGATTDescriptor.webidl | 2 +- .../dom/webidls/BluetoothRemoteGATTServer.webidl | 2 +- .../dom/webidls/BluetoothRemoteGATTService.webidl | 2 +- components/script/dom/webidls/BluetoothUUID.webidl | 2 +- components/script/dom/webidls/CSS.webidl | 2 +- components/script/dom/webidls/CSSStyleValue.webidl | 2 +- .../dom/webidls/CanvasRenderingContext2D.webidl | 4 +- components/script/dom/webidls/Client.webidl | 2 +- .../script/dom/webidls/CompositionEvent.webidl | 2 +- components/script/dom/webidls/Crypto.webidl | 2 +- components/script/dom/webidls/CryptoKey.webidl | 2 +- .../dom/webidls/CustomElementRegistry.webidl | 2 +- components/script/dom/webidls/Element.webidl | 2 +- .../script/dom/webidls/ExtendableEvent.webidl | 2 +- .../dom/webidls/ExtendableMessageEvent.webidl | 2 +- components/script/dom/webidls/FakeXRDevice.webidl | 2 +- .../dom/webidls/FakeXRInputController.webidl | 2 +- .../script/dom/webidls/GPUCanvasContext.webidl | 2 +- components/script/dom/webidls/Gamepad.webidl | 2 +- components/script/dom/webidls/GamepadButton.webidl | 2 +- .../script/dom/webidls/GamepadButtonList.webidl | 2 +- components/script/dom/webidls/GamepadEvent.webidl | 2 +- .../dom/webidls/GamepadHapticActuator.webidl | 2 +- components/script/dom/webidls/GamepadPose.webidl | 2 +- .../script/dom/webidls/HTMLCanvasElement.webidl | 2 +- components/script/dom/webidls/HTMLElement.webidl | 4 +- .../script/dom/webidls/HTMLInputElement.webidl | 2 +- .../script/dom/webidls/HTMLVideoElement.webidl | 2 +- components/script/dom/webidls/ImageBitmap.webidl | 2 +- .../script/dom/webidls/IntersectionObserver.webidl | 2 +- .../dom/webidls/IntersectionObserverEntry.webidl | 2 +- .../script/dom/webidls/MediaDeviceInfo.webidl | 2 +- components/script/dom/webidls/MediaDevices.webidl | 4 +- components/script/dom/webidls/MouseEvent.webidl | 2 +- .../script/dom/webidls/MutationObserver.webidl | 2 +- .../script/dom/webidls/MutationRecord.webidl | 2 +- .../dom/webidls/NavigationPreloadManager.webidl | 2 +- components/script/dom/webidls/Navigator.webidl | 8 +- .../script/dom/webidls/OffscreenCanvas.webidl | 2 +- .../OffscreenCanvasRenderingContext2D.webidl | 2 +- .../dom/webidls/PaintRenderingContext2D.webidl | 2 +- components/script/dom/webidls/PaintSize.webidl | 2 +- .../dom/webidls/PaintWorkletGlobalScope.webidl | 4 +- .../dom/webidls/PerformanceNavigationTiming.webidl | 2 +- .../script/dom/webidls/PermissionStatus.webidl | 2 +- components/script/dom/webidls/Permissions.webidl | 2 +- .../script/dom/webidls/RTCDataChannel.webidl | 2 +- .../script/dom/webidls/RTCDataChannelEvent.webidl | 2 +- components/script/dom/webidls/RTCError.webidl | 2 +- components/script/dom/webidls/RTCErrorEvent.webidl | 2 +- .../script/dom/webidls/RTCIceCandidate.webidl | 2 +- .../script/dom/webidls/RTCPeerConnection.webidl | 4 +- .../dom/webidls/RTCPeerConnectionIceEvent.webidl | 2 +- components/script/dom/webidls/RTCRtpSender.webidl | 2 +- .../script/dom/webidls/RTCRtpTransceiver.webidl | 2 +- .../dom/webidls/RTCSessionDescription.webidl | 2 +- components/script/dom/webidls/RTCTrackEvent.webidl | 2 +- .../script/dom/webidls/ResizeObserver.webidl | 2 +- .../script/dom/webidls/ResizeObserverEntry.webidl | 2 +- .../script/dom/webidls/ResizeObserverSize.webidl | 2 +- components/script/dom/webidls/SVGElement.webidl | 2 +- .../script/dom/webidls/SVGGraphicsElement.webidl | 2 +- components/script/dom/webidls/SVGSVGElement.webidl | 2 +- components/script/dom/webidls/ServiceWorker.webidl | 2 +- .../dom/webidls/ServiceWorkerContainer.webidl | 2 +- .../dom/webidls/ServiceWorkerGlobalScope.webidl | 2 +- .../dom/webidls/ServiceWorkerRegistration.webidl | 2 +- .../dom/webidls/StylePropertyMapReadOnly.webidl | 2 +- components/script/dom/webidls/SubtleCrypto.webidl | 2 +- components/script/dom/webidls/TestBinding.webidl | 28 +- .../script/dom/webidls/TestBindingIterable.webidl | 2 +- .../script/dom/webidls/TestBindingMaplike.webidl | 2 +- .../dom/webidls/TestBindingPairIterable.webidl | 2 +- .../script/dom/webidls/TestBindingProxy.webidl | 2 +- .../script/dom/webidls/TestBindingSetlike.webidl | 2 +- components/script/dom/webidls/TestRunner.webidl | 2 +- components/script/dom/webidls/TestWorklet.webidl | 2 +- .../dom/webidls/TestWorkletGlobalScope.webidl | 2 +- components/script/dom/webidls/TextMetrics.webidl | 2 +- components/script/dom/webidls/VTTCue.webidl | 2 +- components/script/dom/webidls/VTTRegion.webidl | 2 +- components/script/dom/webidls/WebGLQuery.webidl | 2 +- components/script/dom/webidls/WebGLSampler.webidl | 2 +- components/script/dom/webidls/WebGLSync.webidl | 2 +- .../dom/webidls/WebGLTransformFeedback.webidl | 2 +- .../dom/webidls/WebGLVertexArrayObject.webidl | 2 +- components/script/dom/webidls/WebGPU.webidl | 86 +- components/script/dom/webidls/Window.webidl | 12 +- .../dom/webidls/WindowOrWorkerGlobalScope.webidl | 2 +- .../script/dom/webidls/WorkerNavigator.webidl | 2 +- components/script/dom/webidls/Worklet.webidl | 2 +- .../script/dom/webidls/WorkletGlobalScope.webidl | 2 +- .../script/dom/webidls/XPathEvaluator.webidl | 6 +- .../script/dom/webidls/XPathExpression.webidl | 2 +- components/script/dom/webidls/XPathResult.webidl | 2 +- .../dom/webidls/XRBoundedReferenceSpace.webidl | 2 +- .../script/dom/webidls/XRCompositionLayer.webidl | 2 +- components/script/dom/webidls/XRCubeLayer.webidl | 2 +- .../script/dom/webidls/XRCylinderLayer.webidl | 2 +- .../script/dom/webidls/XREquirectLayer.webidl | 2 +- components/script/dom/webidls/XRFrame.webidl | 8 +- components/script/dom/webidls/XRHand.webidl | 2 +- components/script/dom/webidls/XRInputSource.webidl | 4 +- .../script/dom/webidls/XRInputSourceArray.webidl | 2 +- .../script/dom/webidls/XRInputSourceEvent.webidl | 2 +- .../dom/webidls/XRInputSourcesChangeEvent.webidl | 2 +- components/script/dom/webidls/XRJointPose.webidl | 2 +- components/script/dom/webidls/XRJointSpace.webidl | 2 +- components/script/dom/webidls/XRLayer.webidl | 2 +- components/script/dom/webidls/XRLayerEvent.webidl | 2 +- .../script/dom/webidls/XRMediaBinding.webidl | 2 +- components/script/dom/webidls/XRPose.webidl | 2 +- .../script/dom/webidls/XRProjectionLayer.webidl | 2 +- components/script/dom/webidls/XRQuadLayer.webidl | 2 +- components/script/dom/webidls/XRRay.webidl | 2 +- .../script/dom/webidls/XRReferenceSpace.webidl | 2 +- .../dom/webidls/XRReferenceSpaceEvent.webidl | 2 +- components/script/dom/webidls/XRRenderState.webidl | 2 +- .../script/dom/webidls/XRRigidTransform.webidl | 2 +- components/script/dom/webidls/XRSession.webidl | 2 +- .../script/dom/webidls/XRSessionEvent.webidl | 2 +- components/script/dom/webidls/XRSpace.webidl | 2 +- components/script/dom/webidls/XRSubImage.webidl | 2 +- components/script/dom/webidls/XRSystem.webidl | 6 +- components/script/dom/webidls/XRTest.webidl | 2 +- components/script/dom/webidls/XRView.webidl | 2 +- components/script/dom/webidls/XRViewerPose.webidl | 2 +- components/script/dom/webidls/XRViewport.webidl | 2 +- .../script/dom/webidls/XRWebGLBinding.webidl | 2 +- components/script/dom/webidls/XRWebGLLayer.webidl | 4 +- .../script/dom/webidls/XRWebGLSubImage.webidl | 2 +- components/script/dom/webxr/xrsystem.rs | 4 +- components/script/dom/window.rs | 2 +- components/script/init.rs | 2 +- components/script/script_runtime.rs | 56 +- components/script/script_thread.rs | 2 +- components/script/serviceworker_manager.rs | 2 +- components/script/timers.rs | 2 +- components/servo/lib.rs | 29 +- components/shared/canvas/webgl.rs | 2 +- components/shared/embedder/resources.rs | 5 - components/webdriver_server/lib.rs | 48 +- components/webgpu/lib.rs | 2 +- components/webgpu/wgpu_thread.rs | 2 +- ports/servoshell/Cargo.toml | 4 +- ports/servoshell/desktop/app.rs | 76 +- ports/servoshell/desktop/cli.rs | 101 +-- ports/servoshell/desktop/embedder.rs | 2 +- ports/servoshell/desktop/events_loop.rs | 5 - ports/servoshell/desktop/headed_window.rs | 14 +- ports/servoshell/desktop/headless_window.rs | 4 +- ports/servoshell/desktop/minibrowser.rs | 11 +- ports/servoshell/desktop/webview.rs | 20 +- ports/servoshell/desktop/window_trait.rs | 6 +- ports/servoshell/egl/android.rs | 13 - ports/servoshell/egl/android/resources.rs | 1 - ports/servoshell/egl/android/simpleservo.rs | 36 +- ports/servoshell/egl/ohos/simpleservo.rs | 64 +- ports/servoshell/egl/servo_glue.rs | 11 +- ports/servoshell/panic_hook.rs | 2 + ports/servoshell/parser.rs | 35 +- ports/servoshell/prefs.rs | 794 ++++++++++++++-- ports/servoshell/test.rs | 8 +- resources/prefs.json | 266 +++--- resources/wpt-prefs.json | 4 +- .../meta-legacy-layout/WebCryptoAPI/__dir__.ini | 2 +- tests/wpt/meta-legacy-layout/__dir__.ini | 2 +- tests/wpt/meta-legacy-layout/bluetooth/__dir__.ini | 2 +- .../requestDevice/canonicalizeFilter/__dir__.ini | 2 +- .../meta-legacy-layout/css/css-flexbox/__dir__.ini | 2 +- .../css/css-multicol/__dir__.ini | 2 +- .../css/css-paint-api/__dir__.ini | 2 +- tests/wpt/meta-legacy-layout/dom/nodes/__dir__.ini | 2 +- tests/wpt/meta-legacy-layout/gamepad/__dir__.ini | 2 +- .../wpt/meta-legacy-layout/html/canvas/__dir__.ini | 2 +- .../wpt/meta-legacy-layout/permissions/__dir__.ini | 2 +- .../meta-legacy-layout/service-workers/__dir__.ini | 2 +- tests/wpt/meta-legacy-layout/webvtt/__dir__.ini | 2 +- tests/wpt/meta-legacy-layout/webxr/__dir__.ini | 2 +- tests/wpt/meta/WebCryptoAPI/__dir__.ini | 2 +- tests/wpt/meta/__dir__.ini | 2 +- tests/wpt/meta/css/css-align/__dir__.ini | 2 +- tests/wpt/meta/css/css-flexbox/__dir__.ini | 2 +- tests/wpt/meta/css/css-grid/__dir__.ini | 2 +- tests/wpt/meta/gamepad/__dir__.ini | 2 +- tests/wpt/meta/resize-observer/__dir__.ini | 2 +- tests/wpt/meta/webxr/__dir__.ini | 2 +- .../meta-legacy-layout/bluetooth/__dir__.ini | 2 +- .../meta-legacy-layout/css/animations/__dir__.ini | 4 +- .../css/animations/animation-events.html.ini | 4 +- .../css/animations/transition-events.html.ini | 4 +- .../css/direction_style_caching.html.ini | 2 +- .../size_attributes_vertical_writing_mode.html.ini | 2 +- .../css/vertical-lr-blocks.html.ini | 2 +- .../css/writing-mode_change_display.html.ini | 2 +- .../mozilla/FileAPI/blob_url_upload.html.ini | 2 +- .../mozilla/FileAPI/file-select.html.ini | 2 +- .../mozilla/FileAPI/file-upload.html.ini | 2 +- .../meta-legacy-layout/mozilla/activation.html.ini | 2 +- .../mozilla/binding_keyword.html.ini | 2 +- .../meta-legacy-layout/mozilla/calc.html.ini | 2 +- .../mozilla/codegen_unions.html.ini | 2 +- .../mozilla/custom_auto_rooter.html.ini | 2 +- .../mozilla/dictionary_to_jsval.html.ini | 2 +- .../mozilla/exceptionToRejection.any.js.ini | 4 +- .../mozilla/fullscreen/reftests/__dir__.ini | 2 +- .../mozilla/globals/entry.html.ini | 2 +- .../mozilla/globals/entry.worker.js.ini | 2 +- .../meta-legacy-layout/mozilla/http-cache.html.ini | 2 +- .../mozilla/interface_member_exposed.html.ini | 2 +- .../mozilla/interfaces.https.html.ini | 2 +- .../meta-legacy-layout/mozilla/iterable.html.ini | 2 +- .../meta-legacy-layout/mozilla/like.any.js.ini | 4 +- .../mozilla/media_query_list_gc.html.ini | 2 +- .../mozilla/microdata/__dir__.ini | 2 +- .../meta-legacy-layout/mozilla/ns.any.js.ini | 4 +- .../mozilla/overload_dict.html.ini | 2 +- .../mozilla/partial_shadow_dom.html.ini | 2 +- .../partial_shadow_dom_layout_style.html.ini | 2 +- .../mozilla/preferences.html.ini | 2 +- .../meta-legacy-layout/mozilla/promise.html.ini | 2 +- .../meta-legacy-layout/mozilla/prototypes.html.ini | 2 +- .../mozilla/sequence-hole.html.ini | 2 +- .../mozilla/service-workers/__dir__.ini | 2 +- .../meta-legacy-layout/mozilla/sigsegv.html.ini | 2 +- .../meta-legacy-layout/mozilla/svg/svg.html.ini | 2 +- .../meta-legacy-layout/mozilla/trace_null.html.ini | 2 +- .../mozilla/transitionend_safety.html.ini | 2 +- .../mozilla/variadic-interface.html.ini | 2 +- .../mozilla/video_poster_frame.html.ini | 2 +- .../meta-legacy-layout/mozilla/weakref.html.ini | 2 +- .../mozilla/webgl/context_creation_error.html.ini | 2 +- ...window_performance_topLevelDomComplete.html.ini | 2 +- .../mozilla/worklets/__dir__.ini | 2 +- .../worklets/test_paint_worklet_timeout.html.ini | 2 +- .../mozilla/worklets/test_worklet.html.ini | 2 +- .../mozilla/meta-legacy-layout/webxr/__dir__.ini | 2 +- .../webxr/layerevents.https.html.ini | 2 +- .../meta-legacy-layout/webxr/layers.https.html.ini | 2 +- .../webxr/sessionavailable.https.html.ini | 2 +- tests/wpt/mozilla/meta/css/animations/__dir__.ini | 4 +- .../meta/css/animations/animation-events.html.ini | 4 +- .../meta/css/animations/transition-events.html.ini | 4 +- .../flex_align_content_stretch_subpixel.html.ini | 2 +- .../mozilla/DOMParser-parseFromString.html.ini | 2 +- .../meta/mozilla/dictionary_to_jsval.html.ini | 2 +- .../meta/mozilla/exceptionToRejection.any.js.ini | 4 +- .../mozilla/meta/mozilla/interfaces.https.html.ini | 2 +- tests/wpt/mozilla/meta/mozilla/like.any.js.ini | 4 +- .../meta/mozilla/media_query_list_gc.html.ini | 2 +- tests/wpt/mozilla/meta/mozilla/ns.any.js.ini | 4 +- .../mozilla/meta/mozilla/overload_dict.html.ini | 2 +- tests/wpt/mozilla/meta/mozilla/prototypes.html.ini | 2 +- .../mozilla/meta/mozilla/sequence-hole.html.ini | 2 +- tests/wpt/mozilla/meta/mozilla/trace_null.html.ini | 2 +- .../meta/mozilla/transitionend_safety.html.ini | 2 +- tests/wpt/mozilla/meta/mozilla/weakref.html.ini | 2 +- .../meta-legacy-layout/conformance/__dir__.ini | 2 +- .../meta-legacy-layout/conformance2/__dir__.ini | 2 +- .../conformance2/offscreencanvas/__dir__.ini | 2 +- tests/wpt/webgl/meta/__dir__.ini | 2 +- .../meta/conformance2/offscreencanvas/__dir__.ini | 2 +- tests/wpt/webgpu/meta/__dir__.ini | 2 +- 317 files changed, 2089 insertions(+), 3236 deletions(-) delete mode 100644 components/config/basedir.rs create mode 100644 components/config/macro/Cargo.toml create mode 100644 components/config/macro/lib.rs delete mode 100644 components/config/tests/prefs.rs delete mode 100644 components/config_plugins/Cargo.toml delete mode 100644 components/config_plugins/lib.rs delete mode 100644 components/config_plugins/parse.rs diff --git a/Cargo.lock b/Cargo.lock index 0c17fb13f03..c0459162263 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -949,7 +949,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "117725a109d387c937a1533ce01b450cbde6b88abceea8473c4d7a85853cda3c" dependencies = [ "lazy_static", - "windows-sys 0.59.0", + "windows-sys 0.48.0", ] [[package]] @@ -1854,7 +1854,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" dependencies = [ "libc", - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] @@ -2375,7 +2375,7 @@ dependencies = [ "gobject-sys", "libc", "system-deps", - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] @@ -4160,7 +4160,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" dependencies = [ "cfg-if", - "windows-targets 0.52.6", + "windows-targets 0.48.5", ] [[package]] @@ -6025,7 +6025,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys", - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] @@ -6619,29 +6619,24 @@ dependencies = [ name = "servo_config" version = "0.0.1" dependencies = [ - "dirs", - "embedder_traits", "euclid", - "getopts", "log", - "num_cpus", "serde", "serde_json", - "servo_config_plugins", + "servo_config_macro", "servo_geometry", "servo_url", "style_config", - "url", ] [[package]] -name = "servo_config_plugins" +name = "servo_config_macro" version = "0.0.1" dependencies = [ - "itertools 0.13.0", "proc-macro2", "quote", "syn", + "synstructure", ] [[package]] @@ -6721,6 +6716,7 @@ dependencies = [ "backtrace", "cc", "cfg-if", + "dirs", "egui", "egui-winit", "egui_glow", @@ -7312,7 +7308,7 @@ dependencies = [ "getrandom", "once_cell", "rustix", - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] @@ -8595,7 +8591,7 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.48.0", ] [[package]] diff --git a/components/bluetooth/lib.rs b/components/bluetooth/lib.rs index d2476c7f371..eb380429d0d 100644 --- a/components/bluetooth/lib.rs +++ b/components/bluetooth/lib.rs @@ -76,7 +76,7 @@ pub trait BluetoothThreadFactory { impl BluetoothThreadFactory for IpcSender { fn new(embedder_proxy: EmbedderProxy) -> IpcSender { let (sender, receiver) = ipc::channel().unwrap(); - let adapter = if pref!(dom.bluetooth.enabled) { + let adapter = if pref!(dom_bluetooth_enabled) { BluetoothAdapter::new() } else { BluetoothAdapter::new_mock() diff --git a/components/compositing/compositor.rs b/components/compositing/compositor.rs index ff3d62e8868..3f8bf0c1c3f 100644 --- a/components/compositing/compositor.rs +++ b/components/compositing/compositor.rs @@ -2303,7 +2303,7 @@ impl IOCompositor { self.assert_gl_framebuffer_complete(); // Set the viewport background based on prefs. - let color = servo_config::pref!(shell.background_color.rgba); + let color = servo_config::pref!(shell_background_color_rgba); gl.clear_color( color[0] as f32, color[1] as f32, diff --git a/components/config/Cargo.toml b/components/config/Cargo.toml index ea2feb49b5e..450e6298471 100644 --- a/components/config/Cargo.toml +++ b/components/config/Cargo.toml @@ -12,18 +12,11 @@ name = "servo_config" path = "lib.rs" [dependencies] -embedder_traits = { workspace = true } euclid = { workspace = true } -getopts = { workspace = true } log = { workspace = true } -num_cpus = { workspace = true } serde = { workspace = true, features = ["derive"] } serde_json = { workspace = true } -servo_config_plugins = { path = "../config_plugins" } +servo_config_macro = { path = "macro" } servo_geometry = { path = "../geometry" } servo_url = { path = "../url" } style_config = { workspace = true } -url = { workspace = true } - -[target.'cfg(not(any(target_os = "android", target_env = "ohos")))'.dependencies] -dirs = "5.0" diff --git a/components/config/basedir.rs b/components/config/basedir.rs deleted file mode 100644 index 2fa70408a34..00000000000 --- a/components/config/basedir.rs +++ /dev/null @@ -1,44 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ - -//! Contains routines for retrieving default config directories. -//! For linux based platforms, it uses the XDG base directory spec but provides -//! similar abstractions for non-linux platforms. - -use std::path::PathBuf; - -#[cfg(all( - unix, - not(target_os = "macos"), - not(target_os = "ios"), - not(target_os = "android"), - not(target_env = "ohos") -))] -pub fn default_config_dir() -> Option { - let mut config_dir = ::dirs::config_dir().unwrap(); - config_dir.push("servo"); - config_dir.push("default"); - Some(config_dir) -} - -#[cfg(any(target_os = "android", target_env = "ohos"))] -pub fn default_config_dir() -> Option { - None -} - -#[cfg(target_os = "macos")] -pub fn default_config_dir() -> Option { - // FIXME: use `config_dir()` ($HOME/Library/Preferences) - // instead of `data_dir()` ($HOME/Library/Application Support) ? - let mut config_dir = ::dirs::data_dir().unwrap(); - config_dir.push("Servo"); - Some(config_dir) -} - -#[cfg(target_os = "windows")] -pub fn default_config_dir() -> Option { - let mut config_dir = ::dirs::config_dir().unwrap(); - config_dir.push("Servo"); - Some(config_dir) -} diff --git a/components/config/lib.rs b/components/config/lib.rs index ce19ea49849..5ecd439d801 100644 --- a/components/config/lib.rs +++ b/components/config/lib.rs @@ -4,9 +4,6 @@ #![deny(unsafe_code)] +pub mod opts; pub mod pref_util; pub mod prefs; - -pub mod basedir; -#[allow(unsafe_code)] -pub mod opts; diff --git a/components/config/macro/Cargo.toml b/components/config/macro/Cargo.toml new file mode 100644 index 00000000000..17ff88fbe9f --- /dev/null +++ b/components/config/macro/Cargo.toml @@ -0,0 +1,19 @@ +[package] +name = "servo_config_macro" +version.workspace = true +authors.workspace = true +license.workspace = true +edition.workspace = true +publish.workspace = true +rust-version.workspace = true + +[lib] +name = "servo_config_macro" +proc-macro = true +path = "lib.rs" + +[dependencies] +proc-macro2 = { workspace = true } +quote = { workspace = true } +syn = { workspace = true } +synstructure = { workspace = true } diff --git a/components/config/macro/lib.rs b/components/config/macro/lib.rs new file mode 100644 index 00000000000..da5d3635bc8 --- /dev/null +++ b/components/config/macro/lib.rs @@ -0,0 +1,55 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ + +use proc_macro2::TokenStream; +use quote::quote; +use syn::{Data, Fields}; +use synstructure::decl_derive; + +decl_derive!([ServoPreferences] => servo_preferences_derive); + +/// A derive macro that adds string-based getter and setter for each field of this struct +/// (enums and other types are not supported). Each field must be able to be convertable +/// (with `into()`) into a `PrefValue`. +fn servo_preferences_derive(input: synstructure::Structure) -> TokenStream { + let ast = input.ast(); + + let Data::Struct(ref data) = ast.data else { + unimplemented!(); + }; + let Fields::Named(ref named_fields) = data.fields else { + unimplemented!() + }; + + let mut get_match_cases = quote!(); + for field in named_fields.named.iter() { + let name = field.ident.as_ref().unwrap(); + get_match_cases.extend(quote!(stringify!(#name) => self.#name.clone().into(),)) + } + + let mut set_match_cases = quote!(); + for field in named_fields.named.iter() { + let name = field.ident.as_ref().unwrap(); + set_match_cases.extend(quote!(stringify!(#name) => self.#name = value.try_into().unwrap(),)) + } + + let structure_name = &ast.ident; + quote! { + impl #structure_name { + pub fn get_value(&self, name: &str) -> PrefValue { + match name { + #get_match_cases + _ => { panic!("Unknown preference: {:?}", name); } + } + } + + pub fn set_value(&mut self, name: &str, value: PrefValue) { + match name { + #set_match_cases + _ => { panic!("Unknown preference: {:?}", name); } + } + } + } + } +} diff --git a/components/config/opts.rs b/components/config/opts.rs index 22e16286254..5b31ba595cf 100644 --- a/components/config/opts.rs +++ b/components/config/opts.rs @@ -6,22 +6,13 @@ //! from command line arguments. use std::default::Default; -use std::fs::{self, File}; -use std::io::Read; -use std::path::{Path, PathBuf}; -use std::sync::atomic::{AtomicBool, Ordering}; +use std::path::PathBuf; use std::sync::{LazyLock, RwLock, RwLockReadGuard}; -use std::{env, process}; use euclid::Size2D; -use getopts::{Matches, Options}; -use log::error; use serde::{Deserialize, Serialize}; use servo_geometry::DeviceIndependentPixel; use servo_url::ServoUrl; -use url::{self, Url}; - -use crate::{pref, set_pref}; /// Global flags for Servo, currently set on the command line. #[derive(Clone, Debug, Deserialize, Serialize)] @@ -69,13 +60,6 @@ pub struct Opts { /// behavior for debugging purposes. pub debug: DebugOptions, - /// Port number to start a server to listen to remote Firefox devtools connections. - /// 0 for random port. - pub devtools_port: u16, - - /// Start the devtools server at startup - pub devtools_server_enabled: bool, - /// `None` to disable WebDriver or `Some` with a port number to start a server to listen to /// remote WebDriver commands. pub webdriver_port: Option, @@ -113,9 +97,6 @@ pub struct Opts { /// Directory for a default config directory pub config_dir: Option, - /// Print the version and exit. - pub is_printing_version: bool, - /// Path to PEM encoded SSL CA certificate store. pub certificate_path: Option, @@ -137,14 +118,6 @@ pub struct Opts { pub print_pwm: bool, } -fn print_usage(app: &str, opts: &Options) { - let message = format!( - "Usage: {} [ options ... ] [URL]\n\twhere options include", - app - ); - println!("{}", opts.usage(&message)); -} - /// Debug options for Servo, currently set on the command line with -Z #[derive(Clone, Debug, Default, Deserialize, Serialize)] pub struct DebugOptions { @@ -278,104 +251,6 @@ impl DebugOptions { Ok(()) } - - fn print_usage(app: &str) { - fn print_option(name: &str, description: &str) { - println!("\t{:<35} {}", name, description); - } - - println!( - "Usage: {} debug option,[options,...]\n\twhere options include\n\nOptions:", - app - ); - - print_option( - "bubble-inline-sizes-separately", - "Bubble intrinsic widths separately like other engines.", - ); - print_option( - "convert-mouse-to-touch", - "Send touch events instead of mouse events", - ); - print_option( - "disable-canvas-aa", - "Disable antialiasing on the HTML canvas element.", - ); - print_option( - "disable-share-style-cache", - "Disable the style sharing cache.", - ); - print_option( - "disable-subpixel-aa", - "Disable subpixel text antialiasing overriding preference.", - ); - print_option("disable-text-aa", "Disable antialiasing of rendered text."); - print_option( - "dump-stacking-context-tree", - "Print the stacking context tree after each layout.", - ); - print_option( - "dump-display-list", - "Print the display list after each layout.", - ); - print_option( - "dump-display-list-json", - "Print the display list in JSON form.", - ); - print_option( - "dump-flow-tree", - "Print the flow tree (Layout 2013) or fragment tree (Layout 2020) after each layout.", - ); - print_option( - "dump-rule-tree", - "Print the style rule tree after each layout.", - ); - print_option( - "dump-style-tree", - "Print the DOM with computed styles after each restyle.", - ); - print_option("dump-style-stats", "Print style statistics each restyle."); - print_option("gc-profile", "Log GC passes and their durations."); - print_option( - "load-webfonts-synchronously", - "Load web fonts synchronously to avoid non-deterministic network-driven reflows", - ); - print_option( - "parallel-display-list-building", - "Build display lists in parallel.", - ); - print_option("precache-shaders", "Compile all shaders during init."); - print_option( - "profile-script-events", - "Enable profiling of script-related events.", - ); - print_option( - "relayout-event", - "Print notifications when there is a relayout.", - ); - print_option("replace-surrogates", "Replace unpaires surrogates in DOM strings with U+FFFD. See https://github.com/servo/servo/issues/6564"); - print_option( - "show-fragment-borders", - "Paint borders along fragment boundaries.", - ); - print_option( - "show-parallel-layout", - "Mark which thread laid each flow out with colors.", - ); - print_option( - "signpost", - "Emit native OS signposts for profile events (currently macOS only)", - ); - print_option( - "trace-layout", - "Write layout trace to an external file for debugging.", - ); - print_option("wr-stats", "Show WebRender profiler on screen."); - - println!(); - - process::exit(0) - } } #[derive(Clone, Debug, Deserialize, Serialize)] @@ -385,18 +260,6 @@ pub enum OutputOptions { Stdout(f64), } -fn args_fail(msg: &str) -> ! { - eprintln!("{}", msg); - process::exit(1) -} - -static MULTIPROCESS: AtomicBool = AtomicBool::new(false); - -#[inline] -pub fn multiprocess() -> bool { - MULTIPROCESS.load(Ordering::Relaxed) -} - pub fn default_opts() -> Opts { Opts { legacy_layout: false, @@ -410,8 +273,6 @@ pub fn default_opts() -> Opts { output_file: None, headless: false, hard_fail: true, - devtools_port: 0, - devtools_server_enabled: false, webdriver_port: None, initial_window_size: Size2D::new(1024, 740), screen_size_override: None, @@ -423,7 +284,6 @@ pub fn default_opts() -> Opts { debug: Default::default(), exit_after_load: false, config_dir: None, - is_printing_version: false, shaders_dir: None, certificate_path: None, ignore_certificate_errors: false, @@ -434,392 +294,12 @@ pub fn default_opts() -> Opts { } } -pub fn from_cmdline_args(mut opts: Options, args: &[String]) -> ArgumentParsingResult { - let (app_name, args) = args.split_first().unwrap(); - - opts.optflag("", "legacy-layout", "Use the legacy layout engine"); - opts.optopt("o", "output", "Output file", "output.png"); - opts.optopt("s", "size", "Size of tiles", "512"); - opts.optflagopt( - "p", - "profile", - "Time profiler flag and either a TSV output filename \ - OR an interval for output to Stdout (blank for Stdout with interval of 5s)", - "10 \ - OR time.tsv", - ); - opts.optflagopt( - "", - "profiler-trace-path", - "Path to dump a self-contained HTML timeline of profiler traces", - "", - ); - opts.optflagopt( - "m", - "memory-profile", - "Memory profiler flag and output interval", - "10", - ); - opts.optflag("x", "exit", "Exit after load flag"); - opts.optopt( - "y", - "layout-threads", - "Number of threads to use for layout", - "1", - ); - opts.optflag( - "i", - "nonincremental-layout", - "Enable to turn off incremental layout.", - ); - opts.optflagopt( - "", - "userscripts", - "Uses userscripts in resources/user-agent-js, or a specified full path", - "", - ); - opts.optmulti( - "", - "user-stylesheet", - "A user stylesheet to be added to every document", - "file.css", - ); - opts.optopt( - "", - "shaders", - "Shaders will be loaded from the specified directory instead of using the builtin ones.", - "", - ); - opts.optflag("z", "headless", "Headless mode"); - opts.optflag( - "f", - "hard-fail", - "Exit on thread failure instead of displaying about:failure", - ); - opts.optflag( - "F", - "soft-fail", - "Display about:failure on thread failure instead of exiting", - ); - opts.optflagopt("", "devtools", "Start remote devtools server on port", "0"); - opts.optflagopt( - "", - "webdriver", - "Start remote WebDriver server on port", - "7000", - ); - opts.optopt( - "", - "window-size", - "Set the initial window size in logical (device independenrt) pixels", - "1024x740", - ); - opts.optopt( - "", - "screen-size", - "Override the screen resolution in logical (device independent) pixels", - "1024x768", - ); - opts.optflag("M", "multiprocess", "Run in multiprocess mode"); - opts.optflag("B", "bhm", "Background Hang Monitor enabled"); - opts.optflag("S", "sandbox", "Run in a sandbox if multiprocess"); - opts.optopt( - "", - "random-pipeline-closure-probability", - "Probability of randomly closing a pipeline (for testing constellation hardening).", - "0.0", - ); - opts.optopt( - "", - "random-pipeline-closure-seed", - "A fixed seed for repeatbility of random pipeline closure.", - "", - ); - opts.optmulti( - "Z", - "debug", - "A comma-separated string of debug options. Pass help to show available options.", - "", - ); - opts.optflag("h", "help", "Print this message"); - opts.optopt( - "", - "resources-path", - "Path to find static resources", - "/home/servo/resources", - ); - opts.optopt( - "", - "certificate-path", - "Path to find SSL certificates", - "/home/servo/resources/certs", - ); - opts.optflag( - "", - "ignore-certificate-errors", - "Whether or not to completely ignore certificate errors", - ); - opts.optopt( - "", - "content-process", - "Run as a content process and connect to the given pipe", - "servo-ipc-channel.abcdefg", - ); - opts.optopt( - "", - "config-dir", - "config directory following xdg spec on linux platform", - "", - ); - opts.optflag("v", "version", "Display servo version information"); - opts.optflag("", "unminify-js", "Unminify Javascript"); - opts.optflag("", "print-pwm", "Print Progressive Web Metrics"); - opts.optopt( - "", - "local-script-source", - "Directory root with unminified scripts", - "", - ); - opts.optflag("", "unminify-css", "Unminify Css"); - - let opt_match = match opts.parse(args) { - Ok(m) => m, - Err(f) => args_fail(&f.to_string()), - }; - - if opt_match.opt_present("h") || opt_match.opt_present("help") { - print_usage(app_name, &opts); - process::exit(0); - }; - - // If this is the content process, we'll receive the real options over IPC. So just fill in - // some dummy options for now. - if let Some(content_process) = opt_match.opt_str("content-process") { - MULTIPROCESS.store(true, Ordering::SeqCst); - return ArgumentParsingResult::ContentProcess(opt_match, content_process); - } - - let mut debug_options = DebugOptions::default(); - for debug_string in opt_match.opt_strs("Z") { - if let Err(e) = debug_options.extend(debug_string) { - args_fail(&format!("error: unrecognized debug option: {}", e)); - } - } - - if debug_options.help { - DebugOptions::print_usage(app_name) - } - - let tile_size: usize = match opt_match.opt_str("s") { - Some(tile_size_str) => tile_size_str - .parse() - .unwrap_or_else(|err| args_fail(&format!("Error parsing option: -s ({})", err))), - None => 512, - }; - - // If only the flag is present, default to a 5 second period for both profilers - let time_profiling = if opt_match.opt_present("p") { - match opt_match.opt_str("p") { - Some(argument) => match argument.parse::() { - Ok(interval) => Some(OutputOptions::Stdout(interval)), - Err(_) => match ServoUrl::parse(&argument) { - Ok(_) => panic!("influxDB isn't supported anymore"), - Err(_) => Some(OutputOptions::FileName(argument)), - }, - }, - None => Some(OutputOptions::Stdout(5.0)), - } - } else { - // if the p option doesn't exist: - None - }; - - if let Some(ref time_profiler_trace_path) = opt_match.opt_str("profiler-trace-path") { - let mut path = PathBuf::from(time_profiler_trace_path); - path.pop(); - if let Err(why) = fs::create_dir_all(&path) { - error!( - "Couldn't create/open {:?}: {:?}", - Path::new(time_profiler_trace_path).to_string_lossy(), - why - ); - } - } - - let mem_profiler_period = opt_match.opt_default("m", "5").map(|period| { - period - .parse() - .unwrap_or_else(|err| args_fail(&format!("Error parsing option: -m ({})", err))) - }); - - let mut layout_threads: Option = opt_match.opt_str("y").map(|layout_threads_str| { - layout_threads_str - .parse() - .unwrap_or_else(|err| args_fail(&format!("Error parsing option: -y ({})", err))) - }); - - let nonincremental_layout = opt_match.opt_present("i"); - - let random_pipeline_closure_probability = opt_match - .opt_str("random-pipeline-closure-probability") - .map(|prob| { - prob.parse().unwrap_or_else(|err| { - args_fail(&format!( - "Error parsing option: --random-pipeline-closure-probability ({})", - err - )) - }) - }); - - let random_pipeline_closure_seed = - opt_match - .opt_str("random-pipeline-closure-seed") - .map(|seed| { - seed.parse().unwrap_or_else(|err| { - args_fail(&format!( - "Error parsing option: --random-pipeline-closure-seed ({})", - err - )) - }) - }); - - if debug_options.trace_layout { - layout_threads = Some(1); - } - - let (devtools_server_enabled, devtools_port) = if opt_match.opt_present("devtools") { - let port = opt_match - .opt_str("devtools") - .map(|port| { - port.parse().unwrap_or_else(|err| { - args_fail(&format!("Error parsing option: --devtools ({})", err)) - }) - }) - .unwrap_or(pref!(devtools.server.port)); - (true, port as u16) - } else { - ( - pref!(devtools.server.enabled), - pref!(devtools.server.port) as u16, - ) - }; - - let webdriver_port = opt_match.opt_default("webdriver", "7000").map(|port| { - port.parse().unwrap_or_else(|err| { - args_fail(&format!("Error parsing option: --webdriver ({})", err)) - }) - }); - - let parse_resolution_string = |string: String| { - let components: Vec = string - .split('x') - .map(|component| { - component.parse().unwrap_or_else(|error| { - args_fail(&format!("Error parsing resolution '{string}': {error}")); - }) - }) - .collect(); - Size2D::new(components[0], components[1]) - }; - - let screen_size_override = opt_match - .opt_str("screen-size") - .map(parse_resolution_string); - - // Make sure the default window size is not larger than any provided screen size. - let default_window_size = Size2D::new(1024, 740); - let default_window_size = screen_size_override - .map_or(default_window_size, |screen_size_override| { - default_window_size.min(screen_size_override) - }); - - let initial_window_size = opt_match - .opt_str("window-size") - .map_or(default_window_size, parse_resolution_string); - - if opt_match.opt_present("M") { - MULTIPROCESS.store(true, Ordering::SeqCst) - } - - let user_stylesheets = opt_match - .opt_strs("user-stylesheet") - .iter() - .map(|filename| { - let cwd = env::current_dir().unwrap(); - let path = cwd.join(filename); - let url = ServoUrl::from_url(Url::from_file_path(&path).unwrap()); - let mut contents = Vec::new(); - File::open(path) - .unwrap_or_else(|err| args_fail(&format!("Couldn't open {}: {}", filename, err))) - .read_to_end(&mut contents) - .unwrap_or_else(|err| args_fail(&format!("Couldn't read {}: {}", filename, err))); - (contents, url) - }) - .collect(); - - let is_printing_version = opt_match.opt_present("v") || opt_match.opt_present("version"); - - let legacy_layout = opt_match.opt_present("legacy-layout"); - if legacy_layout { - set_pref!(layout.legacy_layout, true); - } - - let opts = Opts { - debug: debug_options.clone(), - legacy_layout, - tile_size, - time_profiling, - time_profiler_trace_path: opt_match.opt_str("profiler-trace-path"), - mem_profiler_period, - nonincremental_layout, - userscripts: opt_match.opt_default("userscripts", ""), - user_stylesheets, - output_file: opt_match.opt_str("o"), - headless: opt_match.opt_present("z"), - hard_fail: opt_match.opt_present("f") && !opt_match.opt_present("F"), - devtools_port, - devtools_server_enabled, - webdriver_port, - initial_window_size, - screen_size_override, - multiprocess: opt_match.opt_present("M"), - background_hang_monitor: opt_match.opt_present("B"), - sandbox: opt_match.opt_present("S"), - random_pipeline_closure_probability, - random_pipeline_closure_seed, - exit_after_load: opt_match.opt_present("x"), - config_dir: opt_match.opt_str("config-dir").map(Into::into), - is_printing_version, - shaders_dir: opt_match.opt_str("shaders").map(Into::into), - certificate_path: opt_match.opt_str("certificate-path"), - ignore_certificate_errors: opt_match.opt_present("ignore-certificate-errors"), - unminify_js: opt_match.opt_present("unminify-js"), - local_script_source: opt_match.opt_str("local-script-source"), - unminify_css: opt_match.opt_present("unminify-css"), - print_pwm: opt_match.opt_present("print-pwm"), - }; - - set_options(opts); - - if let Some(layout_threads) = layout_threads { - set_pref!(layout.threads, layout_threads as i64); - } - - ArgumentParsingResult::ChromeProcess(opt_match) -} - -pub enum ArgumentParsingResult { - ChromeProcess(Matches), - ContentProcess(Matches, String), -} - // Make Opts available globally. This saves having to clone and pass // opts everywhere it is used, which gets particularly cumbersome // when passing through the DOM structures. static OPTIONS: LazyLock> = LazyLock::new(|| RwLock::new(default_opts())); pub fn set_options(opts: Opts) { - MULTIPROCESS.store(opts.multiprocess, Ordering::SeqCst); *OPTIONS.write().unwrap() = opts; } diff --git a/components/config/pref_util.rs b/components/config/pref_util.rs index 4499cd89d37..47598206e05 100644 --- a/components/config/pref_util.rs +++ b/components/config/pref_util.rs @@ -2,11 +2,6 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ -use std::collections::HashMap; -use std::fmt; -use std::str::FromStr; -use std::sync::RwLock; - use serde::{Deserialize, Serialize}; use serde_json::Value; @@ -17,70 +12,46 @@ pub enum PrefValue { Str(String), Bool(bool), Array(Vec), - Missing, } impl PrefValue { - pub fn as_str(&self) -> Option<&str> { - if let PrefValue::Str(val) = self { - Some(val) - } else { - None - } - } - - pub fn as_i64(&self) -> Option { - if let PrefValue::Int(val) = self { - Some(*val) - } else { - None - } - } - - pub fn as_f64(&self) -> Option { - if let PrefValue::Float(val) = self { - Some(*val) - } else { - None - } - } - - pub fn as_bool(&self) -> Option { - if let PrefValue::Bool(val) = self { - Some(*val) - } else { - None + pub fn from_booleanish_str(input: &str) -> Self { + match input { + "false" => PrefValue::Bool(false), + "true" => PrefValue::Bool(true), + _ => input + .parse::() + .map(PrefValue::Int) + .or_else(|_| input.parse::().map(PrefValue::Float)) + .unwrap_or_else(|_| PrefValue::from(input)), } } +} - pub fn is_missing(&self) -> bool { - matches!(self, PrefValue::Missing) - } +impl TryFrom<&Value> for PrefValue { + type Error = String; - pub fn from_json_value(value: &Value) -> Option { + fn try_from(value: &Value) -> Result { match value { - Value::Bool(b) => Some(PrefValue::Bool(*b)), - Value::Number(n) if n.is_i64() => Some(PrefValue::Int(n.as_i64().unwrap())), - Value::Number(n) if n.is_f64() => Some(PrefValue::Float(n.as_f64().unwrap())), - Value::String(s) => Some(PrefValue::Str(s.to_owned())), - _ => None, - } - } -} - -impl FromStr for PrefValue { - type Err = PrefError; - fn from_str(s: &str) -> Result { - if s == "false" { - Ok(PrefValue::Bool(false)) - } else if s == "true" { - Ok(PrefValue::Bool(true)) - } else if let Ok(float) = s.parse::() { - Ok(PrefValue::Float(float)) - } else if let Ok(integer) = s.parse::() { - Ok(PrefValue::Int(integer)) - } else { - Ok(PrefValue::from(s)) + Value::Null => Err("Cannot turn null into preference".into()), + Value::Bool(value) => Ok((*value).into()), + Value::Number(number) => number + .as_i64() + .map(Into::into) + .or_else(|| number.as_f64().map(Into::into)) + .map(Ok) + .unwrap_or(Err("Could not parse number from JSON".into())), + Value::String(value) => Ok(value.clone().into()), + Value::Array(array) => { + let mut array = array.iter().map(TryInto::try_into); + if !array.all(|v| v.is_ok()) { + return Err(format!( + "Cannot turn all array avlues into preference: {array:?}" + )); + } + Ok(PrefValue::Array(array.map(Result::unwrap).collect())) + }, + Value::Object(_) => Err("Cannot turn object into preference".into()), } } } @@ -94,37 +65,18 @@ macro_rules! impl_pref_from { } } )+ - $( - impl From> for PrefValue { - fn from(other: Option<$t>) -> Self { - other.map(|val| $variant(val.into())).unwrap_or(PrefValue::Missing) - } - } - )+ } } macro_rules! impl_from_pref { ($($variant: path => $t: ty,)*) => { $( - impl From for $t { - #[allow(unsafe_code)] - fn from(other: PrefValue) -> Self { - if let $variant(value) = other { - value.into() - } else { - panic!("Cannot convert {:?} to {:?}", other, std::any::type_name::<$t>()) - } - } - } - )+ - $( - impl From for Option<$t> { - fn from(other: PrefValue) -> Self { - if let PrefValue::Missing = other { - None - } else { - Some(other.into()) + impl TryFrom for $t { + type Error = String; + fn try_from(other: PrefValue) -> Result { + match other { + $variant(value) => Ok(value.into()), + _ => Err(format!("Cannot convert {other:?} to {}", std::any::type_name::<$t>())), } } } @@ -157,9 +109,13 @@ impl From for [f64; 4] { fn from(other: PrefValue) -> [f64; 4] { match other { PrefValue::Array(values) if values.len() == 4 => { - let f = values.into_iter().map(Into::into).collect::>(); - if f.len() == 4 { - [f[0], f[1], f[2], f[3]] + let values: Vec = values + .into_iter() + .map(TryFrom::try_from) + .filter_map(Result::ok) + .collect(); + if values.len() == 4 { + [values[0], values[1], values[2], values[3]] } else { panic!( "Cannot convert PrefValue to {:?}", @@ -176,144 +132,20 @@ impl From for [f64; 4] { } } -#[derive(Debug)] -pub enum PrefError { - NoSuchPref(String), - InvalidValue(String), - JsonParseErr(serde_json::error::Error), -} +#[test] +fn test_pref_value_from_str() { + let value = PrefValue::from_booleanish_str("21"); + assert_eq!(value, PrefValue::Int(21)); -impl fmt::Display for PrefError { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - match self { - PrefError::NoSuchPref(s) | PrefError::InvalidValue(s) => f.write_str(s), - PrefError::JsonParseErr(e) => e.fmt(f), - } - } -} + let value = PrefValue::from_booleanish_str("12.5"); + assert_eq!(value, PrefValue::Float(12.5)); -impl std::error::Error for PrefError {} + let value = PrefValue::from_booleanish_str("a string"); + assert_eq!(value, PrefValue::Str("a string".into())); -pub struct Accessor { - pub getter: Box V + Sync + Send>, - #[allow(clippy::type_complexity)] - pub setter: Box, -} + let value = PrefValue::from_booleanish_str("false"); + assert_eq!(value, PrefValue::Bool(false)); -impl Accessor { - pub fn new(getter: G, setter: S) -> Self - where - G: Fn(&P) -> V + Sync + Send + 'static, - S: Fn(&mut P, V) + Sync + Send + 'static, - { - Accessor { - getter: Box::new(getter), - setter: Box::new(setter), - } - } -} - -pub struct Preferences<'m, P> { - user_prefs: RwLock

, - default_prefs: P, - accessors: &'m HashMap>, -} - -impl<'m, P: Clone> Preferences<'m, P> { - /// Create a new `Preferences` object. The values provided in `default_prefs` are immutable and - /// can always be restored using `reset` or `reset_all`. - pub fn new(default_prefs: P, accessors: &'m HashMap>) -> Self { - Self { - user_prefs: RwLock::new(default_prefs.clone()), - default_prefs, - accessors, - } - } - - /// Access to the data structure holding the preference values. - pub fn values(&self) -> &RwLock

{ - &self.user_prefs - } - - /// Retrieve a preference using its key - pub fn get(&self, key: &str) -> PrefValue { - if let Some(accessor) = self.accessors.get(key) { - let prefs = self.user_prefs.read().unwrap(); - (accessor.getter)(&prefs) - } else { - PrefValue::Missing - } - } - - /// Has the preference been modified from its original value? - pub fn is_default(&self, key: &str) -> Result { - if let Some(accessor) = self.accessors.get(key) { - let user = (accessor.getter)(&self.default_prefs); - let default = (accessor.getter)(&self.user_prefs.read().unwrap()); - Ok(default == user) - } else { - Err(PrefError::NoSuchPref(String::from(key))) - } - } - - /// Creates an iterator over all keys and values - pub fn iter(&self) -> impl Iterator + '_ { - let prefs = self.user_prefs.read().unwrap(); - self.accessors - .iter() - .map(move |(k, accessor)| (k.clone(), (accessor.getter)(&prefs))) - } - - /// Creates an iterator over all keys - pub fn keys(&self) -> impl Iterator { - self.accessors.keys().map(String::as_str) - } - - fn set_inner(&self, key: &str, prefs: &mut P, val: V) -> Result<(), PrefError> - where - V: Into, - { - if let Some(accessor) = self.accessors.get(key) { - (accessor.setter)(prefs, val.into()); - Ok(()) - } else { - Err(PrefError::NoSuchPref(String::from(key))) - } - } - - /// Set a new value for a preference, using its key. - pub fn set(&self, key: &str, val: V) -> Result<(), PrefError> - where - V: Into, - { - let mut prefs = self.user_prefs.write().unwrap(); - self.set_inner(key, &mut prefs, val) - } - - pub fn set_all(&self, values: M) -> Result<(), PrefError> - where - M: IntoIterator, - { - let mut prefs = self.user_prefs.write().unwrap(); - for (k, v) in values.into_iter() { - self.set_inner(&k, &mut prefs, v)?; - } - Ok(()) - } - - pub fn reset(&self, key: &str) -> Result { - if let Some(accessor) = self.accessors.get(key) { - let mut prefs = self.user_prefs.write().unwrap(); - let old_pref = (accessor.getter)(&prefs); - let default_pref = (accessor.getter)(&self.default_prefs); - (accessor.setter)(&mut prefs, default_pref); - Ok(old_pref) - } else { - Err(PrefError::NoSuchPref(String::from(key))) - } - } - - pub fn reset_all(&self) { - *self.user_prefs.write().unwrap() = self.default_prefs.clone(); - } + let value = PrefValue::from_booleanish_str("true"); + assert_eq!(value, PrefValue::Bool(true)); } diff --git a/components/config/prefs.rs b/components/config/prefs.rs index 87eea9a1cc0..9c4edf30e3a 100644 --- a/components/config/prefs.rs +++ b/components/config/prefs.rs @@ -2,659 +2,386 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ -use std::borrow::ToOwned; -use std::collections::HashMap; -use std::convert::{TryFrom, TryInto}; -use std::sync::LazyLock; +use std::sync::{RwLock, RwLockReadGuard}; -use embedder_traits::resources::{self, Resource}; -use gen::Prefs; -use log::{error, warn}; -use serde_json::{self, Value}; +use serde::{Deserialize, Serialize}; +use servo_config_macro::ServoPreferences; -use crate::pref_util::Preferences; -pub use crate::pref_util::{PrefError, PrefValue}; +pub use crate::pref_util::PrefValue; -static PREFS: LazyLock> = LazyLock::new(|| { - let def_prefs: Prefs = serde_json::from_str(&resources::read_string(Resource::Preferences)) - .unwrap_or_else(|_| { - error!("Preference json file is invalid. Setting Preference to default values"); - Prefs::default() - }); - let result = Preferences::new(def_prefs, &gen::PREF_ACCESSORS); - for (key, value) in result.iter() { - set_stylo_pref_ref(&key, &value); - } - result -}); - -/// A convenience macro for accessing a preference value using its static path. -/// Passing an invalid path is a compile-time error. -#[macro_export] -macro_rules! pref { - ($($segment: ident).+) => {{ - let values = $crate::prefs::pref_map().values(); - let lock = values.read() - .map(|prefs| prefs $(.$segment)+.clone()); - lock.unwrap() - }}; -} - -/// A convenience macro for updating a preference value using its static path. -/// Passing an invalid path is a compile-time error. -#[macro_export] -macro_rules! set_pref { - ($($segment: ident).+, $value: expr) => {{ - let value = $value; - $crate::prefs::set_stylo_pref(stringify!($($segment).+), value); - let values = $crate::prefs::pref_map().values(); - let mut lock = values.write().unwrap(); - lock$ (.$segment)+ = value; - }}; -} +static PREFERENCES: RwLock = RwLock::new(Preferences::new()); -/// Access preferences using their `String` keys. Note that the key may be different from the -/// static path because legacy keys contain hyphens, or because a preference name has been renamed. -/// -/// When retrieving a preference, the value will always be a `PrefValue`. When setting a value, it -/// may be a `PrefValue` or the type that converts into the correct underlying value; one of `bool`, -/// `i64`, `f64` or `String`. #[inline] -pub fn pref_map() -> &'static Preferences<'static, Prefs> { - &PREFS -} - -pub fn add_user_prefs(prefs: HashMap) { - for (key, value) in prefs.iter() { - set_stylo_pref_ref(key, value); - } - if let Err(error) = PREFS.set_all(prefs) { - panic!("Error setting preference: {:?}", error); - } +/// Get the current set of global preferences for Servo. +pub fn get() -> RwLockReadGuard<'static, Preferences> { + PREFERENCES.read().unwrap() } -pub fn set_stylo_pref(key: &str, value: impl Into) { - set_stylo_pref_ref(key, &value.into()); -} +pub fn set(preferences: Preferences) { + // Map between Stylo preference names and Servo preference names as the This should be + // kept in sync with components/script/dom/bindings/codegen/run.py which generates the + // DOM CSS style accessors. + style_config::set_bool("layout.unimplemented", preferences.layout_unimplemented); + style_config::set_i32("layout.threads", preferences.layout_threads as i32); + style_config::set_bool("layout.legacy_layout", preferences.layout_legacy_layout); + style_config::set_bool("layout.flexbox.enabled", preferences.layout_flexbox_enabled); + style_config::set_bool("layout.columns.enabled", preferences.layout_columns_enabled); + style_config::set_bool("layout.grid.enabled", preferences.layout_grid_enabled); + style_config::set_bool( + "layout.css.transition-behavior.enabled", + preferences.layout_css_transition_behavior_enabled, + ); + style_config::set_bool( + "layout.writing-mode.enabled", + preferences.layout_writing_mode_enabled, + ); + style_config::set_bool( + "layout.container-queries.enabled", + preferences.layout_container_queries_enabled, + ); -fn set_stylo_pref_ref(key: &str, value: &PrefValue) { - match value.try_into() { - Ok(StyloPrefValue::Bool(value)) => style_config::set_bool(key, value), - Ok(StyloPrefValue::Int(value)) => style_config::set_i32(key, value), - Err(TryFromPrefValueError::IntegerOverflow(value)) => { - // TODO: logging doesn’t actually work this early, so we should - // split PrefValue into i32 and i64 variants. - warn!("Pref value too big for Stylo: {} ({})", key, value); - }, - Err(TryFromPrefValueError::UnmappedType) => { - // Most of Servo’s prefs will hit this. When adding a new pref type - // in Stylo, update TryFrom<&PrefValue> for StyloPrefValue as well. - }, - } + *PREFERENCES.write().unwrap() = preferences; } -enum StyloPrefValue { - Bool(bool), - Int(i32), +/// A convenience macro for accessing a preference value using its static path. +/// Passing an invalid path is a compile-time error. +#[macro_export] +macro_rules! pref { + ($name: ident) => { + $crate::prefs::get().$name.clone() + }; } -enum TryFromPrefValueError { - IntegerOverflow(i64), - UnmappedType, +#[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, + /// Start the devtools server at startup + pub devtools_server_enabled: bool, + /// Port number to start a server to listen to remote Firefox devtools connections. + /// 0 for random port. + pub devtools_server_port: i64, + pub dom_webgpu_enabled: bool, + /// List of comma-separated backends to be used by wgpu. + 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_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_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_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, + /// Enable WebGL2 APIs. + 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_subpixel_text_antialiasing_enabled: bool, + pub gfx_texture_swizzling_enabled: bool, + pub js_asmjs_enabled: bool, + pub js_asyncstack: bool, + pub js_baseline_interpreter_enabled: bool, + /// Whether to disable the jit within SpiderMonkey + 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_legacy_layout: bool, + pub layout_threads: i64, + pub layout_unimplemented: bool, + pub layout_writing_mode_enabled: bool, + /// Enable hardware acceleration for video playback. + pub media_glvideo_enabled: bool, + /// Enable a non-standard event handler for verifying behavior of media elements during tests. + 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, + /// Ignore `std::io::Error` with `ErrorKind::UnexpectedEof` received when a TLS connection + /// is closed without a close_notify. + /// + /// Used for tests because WPT server doesn't properly close the TLS connection. + // TODO: remove this when WPT server is updated to use a proper TLS implementation. + pub network_tls_ignore_unexpected_eof: bool, + pub session_history_max_length: i64, + /// The background color of shell's viewport. This will be used by OpenGL's `glClearColor`. + pub shell_background_color_rgba: [f64; 4], + pub webgl_testing_context_creation_error: bool, + /// Number of workers per threadpool, if we fail to detect how much + /// parallelism is available at runtime. + pub threadpools_fallback_worker_num: i64, + /// Maximum number of workers for the Image Cache thread pool + pub threadpools_image_cache_workers_max: i64, + /// Maximum number of workers for the Networking async runtime thread pool + pub threadpools_async_runtime_workers_max: i64, + /// Maximum number of workers for the Core Resource Manager + pub threadpools_resource_workers_max: i64, + /// Maximum number of workers for webrender + pub threadpools_webrender_workers_max: i64, } -impl TryFrom<&PrefValue> for StyloPrefValue { - type Error = TryFromPrefValueError; - - fn try_from(value: &PrefValue) -> Result { - match *value { - PrefValue::Int(value) => { - if let Ok(value) = value.try_into() { - Ok(Self::Int(value)) - } else { - Err(TryFromPrefValueError::IntegerOverflow(value)) - } - }, - PrefValue::Bool(value) => Ok(Self::Bool(value)), - _ => Err(TryFromPrefValueError::UnmappedType), +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_composition_event_enabled: false, + dom_crypto_subtle_enabled: true, + dom_customelements_enabled: true, + dom_document_dblclick_dist: 1, + dom_document_dblclick_timeout: 300, + 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_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: false, + 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_subpixel_text_antialiasing_enabled: true, + gfx_texture_swizzling_enabled: true, + 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_legacy_layout: false, + // TODO(mrobinson): This should likely be based on the number of processors. + 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: false, + network_mime_sniff: false, + network_tls_ignore_unexpected_eof: 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, } } } -pub fn read_prefs_map(txt: &str) -> Result, PrefError> { - let prefs: HashMap = - serde_json::from_str(txt).map_err(PrefError::JsonParseErr)?; - prefs - .into_iter() - .map(|(k, pref_value)| { - Ok({ - let v = match &pref_value { - Value::Bool(b) => PrefValue::Bool(*b), - Value::Number(n) if n.is_i64() => PrefValue::Int(n.as_i64().unwrap()), - Value::Number(n) if n.is_f64() => PrefValue::Float(n.as_f64().unwrap()), - Value::String(s) => PrefValue::Str(s.to_owned()), - Value::Array(v) => { - let mut array = v.iter().map(PrefValue::from_json_value); - if array.all(|v| v.is_some()) { - PrefValue::Array(array.flatten().collect()) - } else { - return Err(PrefError::InvalidValue(format!( - "Invalid value: {}", - pref_value - ))); - } - }, - _ => { - return Err(PrefError::InvalidValue(format!( - "Invalid value: {}", - pref_value - ))); - }, - }; - (k.to_owned(), v) - }) - }) - .collect() -} - -mod gen { - use serde::{Deserialize, Serialize}; - use servo_config_plugins::build_structs; - - // The number of layout threads is calculated if it is not present in `prefs.json`. - fn default_layout_threads() -> i64 { - std::cmp::max(num_cpus::get() * 3 / 4, 1) as i64 - } - - fn default_font_size() -> i64 { - 16 - } - - fn default_monospace_font_size() -> i64 { - 13 - } - - build_structs! { - // type of the accessors - accessor_type = crate::pref_util::Accessor::, - // name of the constant, which will hold a HashMap of preference accessors - gen_accessors = PREF_ACCESSORS, - // tree of structs to generate - gen_types = Prefs { - fonts: { - #[serde(default)] - default: String, - #[serde(default)] - serif: String, - #[serde(default)] - #[serde(rename = "fonts.sans-serif")] - sans_serif: String, - #[serde(default)] - monospace: String, - #[serde(default = "default_font_size")] - #[serde(rename = "fonts.default-size")] - default_size: i64, - #[serde(default = "default_monospace_font_size")] - #[serde(rename = "fonts.default-monospace-size")] - default_monospace_size: i64, - }, - /// Allows customizing the different threadpools used by servo - threadpools: { - /// Number of workers per threadpool, if we fail to detect how much - /// parallelism is available at runtime. - fallback_worker_num: i64, - image_cache_workers: { - /// Maximum number of workers for the Image Cache thread pool - max: i64, - }, - async_runtime_workers: { - /// Maximum number of workers for the Networking async runtime thread pool - max: i64 - }, - resource_workers: { - /// Maximum number of workers for the Core Resource Manager - max: i64, - }, - webrender_workers: { - /// Maximum number of workers for webrender - max: i64, - }, - }, - css: { - animations: { - testing: { - #[serde(default)] - enabled: bool, - }, - }, - }, - devtools: { - server: { - enabled: bool, - port: i64, - }, - }, - dom: { - webgpu: { - /// Enable WebGPU APIs. - enabled: bool, - /// List of comma-separated backends to be used by wgpu - wgpu_backend: String, - }, - bluetooth: { - enabled: bool, - testing: { - enabled: bool, - } - }, - abort_controller: { - /// Whether to expose the AbortControll/AbortSignal DOM interfaces. - enabled: bool, - }, - allow_scripts_to_close_windows: bool, - canvas_capture: { - enabled: bool, - }, - canvas_text: { - enabled: bool, - }, - composition_event: { - #[serde(rename = "dom.compositionevent.enabled")] - enabled: bool, - }, - crypto: { - subtle: { - enabled: bool, - } - }, - custom_elements: { - #[serde(rename = "dom.customelements.enabled")] - enabled: bool, - }, - document: { - dblclick_timeout: i64, - dblclick_dist: i64, - }, - forcetouch: { - enabled: bool, - }, - fullscreen: { - test: bool, - }, - gamepad: { - enabled: bool, - }, - imagebitmap: { - enabled: bool, - }, - intersection_observer: { - enabled: bool, - }, - microdata: { - testing: { - enabled: bool, - } - }, - mouse_event: { - which: { - #[serde(rename = "dom.mouseevent.which.enabled")] - enabled: bool, - } - }, - mutation_observer: { - enabled: bool, - }, - offscreen_canvas: { - enabled: bool, - }, - permissions: { - enabled: bool, - testing: { - allowed_in_nonsecure_contexts: bool, - } - }, - resize_observer: { - enabled: bool, - }, - script: { - asynch: bool, - }, - serviceworker: { - enabled: bool, - timeout_seconds: i64, - }, - servo_helpers: { - enabled: bool, - }, - servoparser: { - async_html_tokenizer: { - enabled: bool, - } - }, - shadowdom: { - enabled: bool, - }, - svg: { - enabled: bool, - }, - testable_crash: { - enabled: bool, - }, - testbinding: { - enabled: bool, - prefcontrolled: { - #[serde(default)] - enabled: bool, - }, - prefcontrolled2: { - #[serde(default)] - enabled: bool, - }, - preference_value: { - #[serde(default)] - falsy: bool, - #[serde(default)] - quote_string_test: String, - #[serde(default)] - space_string_test: String, - #[serde(default)] - string_empty: String, - #[serde(default)] - string_test: String, - #[serde(default)] - truthy: bool, - }, - }, - testing: { - element: { - activation: { - #[serde(default)] - enabled: bool, - } - }, - html_input_element: { - select_files: { - #[serde(rename = "dom.testing.htmlinputelement.select_files.enabled")] - enabled: bool, - } - }, - }, - testperf: { - #[serde(default)] - enabled: bool, - }, - webgl2: { - /// Enable WebGL2 APIs. - enabled: bool, - }, - webrtc: { - transceiver: { - enabled: bool, - }, - #[serde(default)] - enabled: bool, - }, - webvtt: { - enabled: bool, - }, - webxr: { - #[serde(default)] - enabled: bool, - #[serde(default)] - test: bool, - first_person_observer_view: bool, - glwindow: { - /// Enable servo/webxr's glwindow port. This is enabled only if openxr is - /// disabled. - #[serde(default)] - enabled: bool, - #[serde(rename = "dom.webxr.glwindow.left-right")] - left_right: bool, - #[serde(rename = "dom.webxr.glwindow.red-cyan")] - red_cyan: bool, - spherical: bool, - cubemap: bool, - }, - hands: { - #[serde(default)] - enabled: bool, - }, - layers: { - enabled: bool, - }, - openxr: { - /// Enable servo/webxr's openxr port - enabled: bool, - }, - sessionavailable: bool, - #[serde(rename = "dom.webxr.unsafe-assume-user-intent")] - unsafe_assume_user_intent: bool, - }, - worklet: { - blockingsleep: { - #[serde(default)] - enabled: bool, - }, - #[serde(default)] - enabled: bool, - testing: { - #[serde(default)] - enabled: bool, - }, - timeout_ms: i64, - }, - xpath: { - enabled: bool, - } - }, - gfx: { - subpixel_text_antialiasing: { - #[serde(rename = "gfx.subpixel-text-antialiasing.enabled")] - enabled: bool, - }, - texture_swizzling: { - #[serde(rename = "gfx.texture-swizzling.enabled")] - enabled: bool, - }, - }, - js: { - asmjs: { - enabled: bool, - }, - asyncstack: { - enabled: bool, - }, - baseline_interpreter: { - enabled: bool, - }, - /// Whether to disable the jit within SpiderMonkey - disable_jit: bool, - baseline_jit: { - enabled: bool, - unsafe_eager_compilation: { - enabled: bool, - }, - }, - discard_system_source: { - enabled: bool, - }, - dump_stack_on_debuggee_would_run: { - enabled: bool, - }, - ion: { - enabled: bool, - offthread_compilation: { - enabled: bool, - }, - unsafe_eager_compilation: { - enabled: bool, - }, - }, - mem: { - gc: { - allocation_threshold_mb: i64, - allocation_threshold_factor: i64, - allocation_threshold_avoid_interrupt_factor: i64, - compacting: { - enabled: bool, - }, - decommit_threshold_mb: i64, - dynamic_heap_growth: { - enabled: bool, - }, - dynamic_mark_slice: { - enabled: bool, - }, - empty_chunk_count_max: i64, - empty_chunk_count_min: i64, - high_frequency_heap_growth_max: i64, - high_frequency_heap_growth_min: i64, - high_frequency_high_limit_mb: i64, - high_frequency_low_limit_mb: i64, - high_frequency_time_limit_ms: i64, - incremental: { - enabled: bool, - slice_ms: i64, - }, - low_frequency_heap_growth: i64, - per_zone: { - enabled: bool, - }, - zeal: { - frequency: i64, - level: i64, - }, - }, - max: i64, - }, - native_regex: { - enabled: bool, - }, - offthread_compilation: { - enabled: bool, - }, - parallel_parsing: { - enabled: bool, - }, - shared_memory: { - enabled: bool, - }, - throw_on_asmjs_validation_failure: { - enabled: bool, - }, - throw_on_debuggee_would_run: { - enabled: bool, - }, - timers: { - minimum_duration: i64, - }, - wasm: { - baseline: { - enabled: bool, - }, - enabled: bool, - ion: { - enabled: bool, - } - }, - werror: { - enabled: bool, - }, - }, - layout: { - animations: { - test: { - enabled: bool, - } - }, - columns: { - enabled: bool, - }, - css: { - transition_behavior: { - #[serde(rename = "layout.css.transition-behavior.enabled")] - enabled: bool, - } - }, - flexbox: { - enabled: bool, - }, - grid: { - enabled: bool, - }, - legacy_layout: bool, - #[serde(default = "default_layout_threads")] - threads: i64, - writing_mode: { - #[serde(rename = "layout.writing-mode.enabled")] - enabled: bool, - } - }, - media: { - glvideo: { - /// Enable hardware acceleration for video playback. - enabled: bool, - }, - testing: { - /// Enable a non-standard event handler for verifying behavior of media elements during tests. - enabled: bool, - } - }, - network: { - enforce_tls: { - enabled: bool, - localhost: bool, - onion: bool, - }, - http_cache: { - #[serde(rename = "network.http-cache.disabled")] - disabled: bool, - }, - local_directory_listing: { - enabled: bool, - }, - mime: { - sniff: bool, - }, - tls: { - /// Ignore `std::io::Error` with `ErrorKind::UnexpectedEof` received when a TLS connection - /// is closed without a close_notify. - /// - /// Used for tests because WPT server doesn't properly close the TLS connection. - // TODO: remove this when WPT server is updated to use a proper TLS implementation. - ignore_unexpected_eof: bool, - }, - }, - session_history: { - #[serde(rename = "session-history.max-length")] - max_length: i64, - }, - shell: { - background_color: { - /// The background color of shell's viewport. This will be used by OpenGL's `glClearColor`. - #[serde(rename = "shell.background-color.rgba")] - rgba: [f64; 4], - }, - crash_reporter: { - enabled: bool, - }, - /// URL string of the homepage. - homepage: String, - #[serde(rename = "shell.native-orientation")] - native_orientation: String, - native_titlebar: { - /// Enable native window's titlebar and decorations. - #[serde(rename = "shell.native-titlebar.enabled")] - enabled: bool, - }, - /// URL string of the search engine page (for example or and . - searchpage: String, - }, - webgl: { - testing: { - context_creation_error: bool, - } - }, - } +impl Default for Preferences { + fn default() -> Self { + Self::new() } } diff --git a/components/config/tests/prefs.rs b/components/config/tests/prefs.rs deleted file mode 100644 index 4ff37299a8d..00000000000 --- a/components/config/tests/prefs.rs +++ /dev/null @@ -1,333 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ - -use std::collections::HashMap; -use std::error::Error; -use std::fs::{self, File}; -use std::io::{Read, Write}; - -use servo_config::basedir; -use servo_config::pref_util::Preferences; -use servo_config::prefs::{read_prefs_map, PrefValue}; - -#[test] -fn test_create_prefs_map() { - let json_str = "{ - \"layout.writing-mode.enabled\": true, - \"network.mime.sniff\": false, - \"shell.homepage\": \"https://servo.org\" - }"; - let prefs = read_prefs_map(json_str); - assert!(prefs.is_ok()); - let prefs = prefs.unwrap(); - assert_eq!(prefs.len(), 3); -} - -#[test] -fn test_generated_accessors_get() { - let prefs: gen::TestPrefs = serde_json::from_str(DEF_JSON_STR).unwrap(); - let map: HashMap = gen::TEST_PREF_ACCESSORS - .iter() - .map(move |(key, accessor)| { - let pref_value = (accessor.getter)(&prefs); - (key.clone(), pref_value) - }) - .collect(); - - assert_eq!(&PrefValue::from("hello"), map.get("pref_string").unwrap()); - assert_eq!(&PrefValue::from(23_i64), map.get("pref_i64").unwrap()); - assert_eq!(&PrefValue::from(1.5_f64), map.get("pref_f64").unwrap()); - assert_eq!(&PrefValue::from(true), map.get("pref_bool").unwrap()); - assert_eq!( - &PrefValue::from(333_i64), - map.get("group.nested.nested_i64").unwrap() - ); - assert_eq!(&PrefValue::from(42_i64), map.get("a.renamed.pref").unwrap()); -} - -#[test] -fn test_generated_accessors_set() { - let mut prefs: gen::TestPrefs = serde_json::from_str(DEF_JSON_STR).unwrap(); - let setters: HashMap = gen::TEST_PREF_ACCESSORS - .iter() - .map(|(key, accessor)| (key.clone(), &accessor.setter)) - .collect(); - - (setters.get("pref_string").unwrap())(&mut prefs, PrefValue::Str(String::from("boo"))); - (setters.get("pref_i64").unwrap())(&mut prefs, PrefValue::Int(-25)); - (setters.get("pref_f64").unwrap())(&mut prefs, PrefValue::Float(-1.9)); - (setters.get("pref_bool").unwrap())(&mut prefs, PrefValue::Bool(false)); - (setters.get("group.nested.nested_i64").unwrap())(&mut prefs, PrefValue::Int(10)); - (setters.get("a.renamed.pref").unwrap())(&mut prefs, PrefValue::Int(11)); - - assert_eq!("boo", prefs.pref_string); - assert_eq!(-25, prefs.pref_i64); - assert_eq!(-1.9, prefs.pref_f64); - assert_eq!(false, prefs.pref_bool); - assert_eq!(10, prefs.group.nested.nested_i64); - assert_eq!(11, prefs.group.nested.renamed); -} - -#[test] -fn test_static_struct() { - let prefs: gen::TestPrefs = serde_json::from_str(DEF_JSON_STR).unwrap(); - assert_eq!("hello", prefs.pref_string); - assert_eq!(23, prefs.pref_i64); - assert_eq!(1.5, prefs.pref_f64); - assert_eq!(true, prefs.pref_bool); - assert_eq!(333, prefs.group.nested.nested_i64); - assert_eq!(42, prefs.group.nested.renamed); -} - -#[test] -fn test_set_pref() { - let prefs = Preferences::new(gen::TestPrefs::default(), &gen::TEST_PREF_ACCESSORS); - assert_eq!(Some(0), prefs.get("group.nested.nested_i64").as_i64()); - let result = prefs.set("group.nested.nested_i64", 1); - assert_eq!(true, result.is_ok()); - assert_eq!(Some(1), prefs.get("group.nested.nested_i64").as_i64()); - assert_eq!(1, prefs.values().read().unwrap().group.nested.nested_i64); -} - -#[test] -fn test_set_unknown_pref_is_err() -> Result<(), Box> { - let prefs = Preferences::new(gen::TestPrefs::default(), &gen::TEST_PREF_ACCESSORS); - let result = prefs.set("unknown_pref", 1); - assert_eq!(true, result.is_err()); - Ok(()) -} - -#[test] -fn test_reset_pref() -> Result<(), Box> { - let mut def_prefs = gen::TestPrefs::default(); - def_prefs.group.nested.nested_i64 = 999; - let prefs = Preferences::new(def_prefs, &gen::TEST_PREF_ACCESSORS); - assert_eq!(Some(999), prefs.get("group.nested.nested_i64").as_i64()); - - prefs.set("group.nested.nested_i64", 1)?; - assert_eq!(Some(1), prefs.get("group.nested.nested_i64").as_i64()); - - prefs.reset("group.nested.nested_i64")?; - assert_eq!(Some(999), prefs.get("group.nested.nested_i64").as_i64()); - assert_eq!(999, prefs.values().read().unwrap().group.nested.nested_i64); - Ok(()) -} - -#[test] -fn test_default_values() -> Result<(), Box> { - let def_prefs: gen::TestPrefs = serde_json::from_str(DEF_JSON_STR)?; - let prefs = Preferences::new(def_prefs, &gen::TEST_PREF_ACCESSORS); - assert_eq!(Some(0), prefs.get("default_value").as_i64()); - assert_eq!(Some(555), prefs.get("computed_default_value").as_i64()); - Ok(()) -} - -#[test] -fn test_override_default_values() -> Result<(), Box> { - let def_prefs: gen::TestPrefs = serde_json::from_str(WITHOUT_DEFAULTS_JSON_STR)?; - let prefs = Preferences::new(def_prefs, &gen::TEST_PREF_ACCESSORS); - assert_eq!(Some(-1), prefs.get("default_value").as_i64()); - assert_eq!(Some(-1), prefs.get("computed_default_value").as_i64()); - Ok(()) -} - -#[test] -fn test_update_reset_default_values() -> Result<(), Box> { - let def_prefs: gen::TestPrefs = serde_json::from_str(DEF_JSON_STR)?; - let prefs = Preferences::new(def_prefs, &gen::TEST_PREF_ACCESSORS); - - prefs.set("default_value", 99)?; - prefs.set("computed_default_value", 199)?; - assert_eq!(Some(99), prefs.get("default_value").as_i64()); - assert_eq!(Some(199), prefs.get("computed_default_value").as_i64()); - - prefs.reset("default_value")?; - prefs.reset("computed_default_value")?; - assert_eq!(Some(0), prefs.get("default_value").as_i64()); - assert_eq!(Some(555), prefs.get("computed_default_value").as_i64()); - Ok(()) -} - -#[test] -fn test_update_reset_overridden_default_values() -> Result<(), Box> { - let def_prefs: gen::TestPrefs = serde_json::from_str(WITHOUT_DEFAULTS_JSON_STR)?; - let prefs = Preferences::new(def_prefs, &gen::TEST_PREF_ACCESSORS); - prefs.set("default_value", 99)?; - prefs.set("computed_default_value", 199)?; - assert_eq!(Some(99), prefs.get("default_value").as_i64()); - assert_eq!(Some(199), prefs.get("computed_default_value").as_i64()); - - prefs.reset("default_value")?; - prefs.reset("computed_default_value")?; - assert_eq!(Some(-1), prefs.get("default_value").as_i64()); - assert_eq!(Some(-1), prefs.get("computed_default_value").as_i64()); - Ok(()) -} - -#[test] -fn test_user_prefs_override_and_reset() -> Result<(), Box> { - let mut def_prefs = gen::TestPrefs::default(); - def_prefs.group.nested.nested_i64 = 999; - let prefs = Preferences::new(def_prefs, &gen::TEST_PREF_ACCESSORS); - - prefs.set("group.nested.nested_i64", 45)?; - assert_eq!(Some(45), prefs.get("group.nested.nested_i64").as_i64()); - - prefs.reset("group.nested.nested_i64")?; - assert_eq!(Some(999), prefs.get("group.nested.nested_i64").as_i64()); - Ok(()) -} - -#[test] -fn test_reset_all() -> Result<(), Box> { - let def_prefs: gen::TestPrefs = serde_json::from_str(DEF_JSON_STR)?; - let prefs = Preferences::new(def_prefs, &gen::TEST_PREF_ACCESSORS); - prefs.set_all(read_prefs_map(USER_JSON_STR)?)?; - - let values = prefs.values(); - assert_eq!("bye", values.read().unwrap().pref_string); - assert_eq!(-1, values.read().unwrap().pref_i64); - assert_eq!(-1.0, values.read().unwrap().pref_f64); - assert_eq!(false, values.read().unwrap().pref_bool); - assert_eq!(-1, values.read().unwrap().group.nested.nested_i64); - assert_eq!(-1, values.read().unwrap().group.nested.renamed); - - prefs.reset_all(); - - let values = prefs.values(); - assert_eq!("hello", values.read().unwrap().pref_string); - assert_eq!(23, values.read().unwrap().pref_i64); - assert_eq!(1.5, values.read().unwrap().pref_f64); - assert_eq!(true, values.read().unwrap().pref_bool); - assert_eq!(333, values.read().unwrap().group.nested.nested_i64); - assert_eq!(42, values.read().unwrap().group.nested.renamed); - Ok(()) -} - -#[test] -fn test_set_all_from_map() -> Result<(), Box> { - let def_prefs: gen::TestPrefs = serde_json::from_str(DEF_JSON_STR)?; - let prefs = Preferences::new(def_prefs, &gen::TEST_PREF_ACCESSORS); - prefs.set_all(read_prefs_map(USER_JSON_STR)?)?; - - let mut overrides = HashMap::new(); - overrides.insert(String::from("pref_string"), PrefValue::from("new value")); - overrides.insert( - String::from("group.nested.nested_i64"), - PrefValue::from(1001), - ); - overrides.insert(String::from("a.renamed.pref"), PrefValue::from(47)); - - let result = prefs.set_all(overrides.into_iter()); - assert_eq!(true, result.is_ok()); - - let values = prefs.values(); - assert_eq!("new value", values.read().unwrap().pref_string); - assert_eq!(1001, values.read().unwrap().group.nested.nested_i64); - assert_eq!(47, values.read().unwrap().group.nested.renamed); - Ok(()) -} - -#[test] -fn test_set_all_error_on_unknown_field() -> Result<(), Box> { - let def_prefs: gen::TestPrefs = serde_json::from_str(DEF_JSON_STR)?; - let prefs = Preferences::new(def_prefs, &gen::TEST_PREF_ACCESSORS); - - let mut overrides = HashMap::new(); - overrides.insert(String::from("doesnt_exist"), PrefValue::from(1001)); - - let result = prefs.set_all(overrides.into_iter()); - assert_eq!(true, result.is_err()); - Ok(()) -} - -#[cfg(not(target_os = "android"))] -#[test] -fn test_default_config_dir_create_read_write() { - let json_str = "{\ - \"layout.writing-mode.enabled\": true,\ - \"extra.stuff\": false,\ - \"shell.homepage\": \"https://google.com\"\ - }"; - let mut expected_json = String::new(); - let config_path = basedir::default_config_dir().unwrap(); - - if !config_path.exists() { - fs::create_dir_all(&config_path).unwrap(); - } - - let json_path = config_path.join("test_config.json"); - - let mut fd = File::create(&json_path).unwrap(); - assert_eq!(json_path.exists(), true); - - fd.write_all(json_str.as_bytes()).unwrap(); - let mut fd = File::open(&json_path).unwrap(); - fd.read_to_string(&mut expected_json).unwrap(); - - assert_eq!(json_str, expected_json); - - fs::remove_file(&json_path).unwrap(); -} - -static DEF_JSON_STR: &'static str = r#"{ - "pref_string": "hello", - "pref_i64": 23, - "pref_f64": 1.5, - "pref_bool": true, - "group.nested.nested_i64": 333, - "a.renamed.pref": 42 -}"#; - -static USER_JSON_STR: &'static str = r#"{ - "pref_string": "bye", - "pref_i64": -1, - "pref_f64": -1.0, - "pref_bool": false, - "group.nested.nested_i64": -1, - "a.renamed.pref": -1 -}"#; - -static WITHOUT_DEFAULTS_JSON_STR: &'static str = r#"{ - "pref_string": "bye", - "pref_i64": -1, - "pref_f64": -1.0, - "pref_bool": false, - "group.nested.nested_i64": -1, - "a.renamed.pref": -1, - "computed_default_value": -1, - "default_value": -1 -}"#; - -mod gen { - use serde::{Deserialize, Serialize}; - use servo_config::pref_util::{Accessor, PrefValue}; - use servo_config_plugins::build_structs; - - fn compute_default() -> i64 { - 555 - } - - build_structs! { - accessor_type = Accessor::, - gen_accessors = TEST_PREF_ACCESSORS, - gen_types = TestPrefs { - pref_string: String, - pref_i64: i64, - pref_f64: f64, - pref_bool: bool, - #[serde(default)] - default_value: i64, - #[serde(default = "compute_default")] - computed_default_value: i64, - group: { - nested: { - nested_i64: i64, - #[serde(rename = "a.renamed.pref")] - renamed: i64, - } - } - } - } -} diff --git a/components/config_plugins/Cargo.toml b/components/config_plugins/Cargo.toml deleted file mode 100644 index 8c94090a61d..00000000000 --- a/components/config_plugins/Cargo.toml +++ /dev/null @@ -1,19 +0,0 @@ -[package] -name = "servo_config_plugins" -version.workspace = true -authors.workspace = true -license.workspace = true -edition.workspace = true -publish.workspace = true -rust-version.workspace = true - -[lib] -name = "servo_config_plugins" -proc-macro = true -path = "lib.rs" - -[dependencies] -itertools = { workspace = true } -proc-macro2 = { workspace = true } -quote = { workspace = true } -syn = { workspace = true } diff --git a/components/config_plugins/lib.rs b/components/config_plugins/lib.rs deleted file mode 100644 index 4d2eb61943c..00000000000 --- a/components/config_plugins/lib.rs +++ /dev/null @@ -1,206 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ - -use std::collections::{hash_map, HashMap}; -use std::fmt::Write; -use std::iter; - -use itertools::Itertools; -use proc_macro2::{Span, TokenStream}; -use quote::*; -use syn::parse::Result; -use syn::spanned::Spanned; -use syn::{parse_macro_input, Attribute, Ident, LitStr, Path}; - -mod parse; -use parse::*; - -#[proc_macro] -pub fn build_structs(tokens: proc_macro::TokenStream) -> proc_macro::TokenStream { - let input: MacroInput = parse_macro_input!(tokens); - let out = Build::new(&input) - .build(&input.type_def) - .unwrap_or_else(|e| syn::Error::new(e.span(), e).to_compile_error()); - out.into() -} - -struct Build { - root_type_name: Ident, - gen_accessors: Ident, - accessor_type: Path, - output: TokenStream, - path_stack: Vec, - path_map: HashMap>, -} - -impl Build { - fn new(input: &MacroInput) -> Self { - Build { - root_type_name: input.type_def.type_name.clone(), - gen_accessors: input.gen_accessors.clone(), - accessor_type: input.accessor_type.clone(), - output: TokenStream::new(), - path_stack: Vec::new(), - path_map: HashMap::new(), - } - } - - fn build(mut self, type_def: &RootTypeDef) -> Result { - self.walk(&type_def.type_def)?; - self.build_accessors(); - Ok(self.output) - } - - fn walk(&mut self, type_def: &NewTypeDef) -> Result<()> { - self.define_pref_struct(type_def)?; - - for field in type_def.fields.iter() { - self.path_stack.push(field.name.clone()); - - if let FieldType::NewTypeDef(new_def) = &field.field_type { - self.walk(new_def)?; - } else { - let pref_name = - self.pref_name(field, &self.path_stack[..self.path_stack.len() - 1]); - if let hash_map::Entry::Vacant(slot) = self.path_map.entry(pref_name) { - slot.insert(self.path_stack.clone()); - } else { - return Err(err(&field.name, "duplicate preference name")); - } - } - - self.path_stack.pop(); - } - Ok(()) - } - - fn define_pref_struct(&mut self, type_def: &NewTypeDef) -> Result<()> { - let struct_name = self.path_to_name(self.path_stack.iter()); - let field_defs = type_def - .fields - .iter() - .map(|field| self.field_to_tokens(field, &self.path_stack)) - .collect::>>()?; - self.output.extend(quote! { - #[derive(Clone, Debug, Default, Deserialize, PartialEq, Serialize)] - #[allow(non_camel_case_types)] - pub struct #struct_name { - #(#field_defs), * - } - }); - Ok(()) - } - - fn build_accessors(&mut self) { - let accessor_type = &self.accessor_type; - let values = self.path_map.iter().map(|(key, path)| { - quote! { - map.insert(String::from(#key), - #accessor_type::new( - |prefs| prefs #(.#path)*.clone().into(), - |prefs, value| prefs #(.#path)* = value.into() - ) - ); - } - }); - - let gen_accessors = &self.gen_accessors; - let num_prefs = self.path_map.len(); - - self.output.extend(quote! { - pub static #gen_accessors: std::sync::LazyLock> = - std::sync::LazyLock::new(|| { - let mut map = std::collections::HashMap::with_capacity(#num_prefs); - #(#values)* - map - }); - }); - } - - fn pref_name(&self, field: &Field, path_stack: &[Ident]) -> String { - field - .get_field_name_mapping() - .map(|pref_attr| pref_attr.value()) - .unwrap_or_else(|| { - Itertools::intersperse( - path_stack - .iter() - .chain(iter::once(&field.name)) - .map(Ident::to_string), - String::from("."), - ) - .collect() - }) - } - - fn field_to_tokens(&self, field: &Field, path_stack: &[Ident]) -> Result { - let name = &field.name; - Ok(match &field.field_type { - FieldType::NewTypeDef(_) => { - let type_name = self.path_to_name(path_stack.iter().chain(iter::once(name))); - quote! { - #[serde(flatten)] - pub #name: #type_name - } - }, - FieldType::Existing(type_name) => { - let pref_name = self.pref_name(field, path_stack); - let attributes = field.get_attributes(&pref_name); - quote! { - #attributes - pub #name: #type_name - } - }, - }) - } - - fn path_to_name<'p, P: Iterator + 'p>(&self, path: P) -> Ident { - let mut name = format!("{}", self.root_type_name); - for part in path { - name.write_fmt(format_args!("__{}", part)).unwrap(); - } - Ident::new(&name, Span::call_site()) - } -} - -impl Field { - fn get_attributes(&self, pref_name: &str) -> TokenStream { - let mut tokens = TokenStream::new(); - for attr in self - .attributes - .iter() - .filter(|attr| attr_to_pref_name(attr).is_none()) - { - attr.to_tokens(&mut tokens); - } - tokens.extend(quote! { - #[serde(rename = #pref_name)] - }); - tokens - } - - fn get_field_name_mapping(&self) -> Option { - self.attributes.iter().filter_map(attr_to_pref_name).next() - } -} - -fn attr_to_pref_name(attr: &Attribute) -> Option { - if attr.path().is_ident("serde") { - // If `parse_nested_meta()` fails, `result` will remain None. - let mut result = None; - let _ = attr.parse_nested_meta(|meta| { - if meta.path.is_ident("rename") { - result = Some(meta.value()?.parse()?); - } - Ok(()) - }); - result - } else { - None - } -} - -fn err(s: S, msg: &str) -> syn::Error { - syn::Error::new(s.span(), msg) -} diff --git a/components/config_plugins/parse.rs b/components/config_plugins/parse.rs deleted file mode 100644 index 63a3d66dfda..00000000000 --- a/components/config_plugins/parse.rs +++ /dev/null @@ -1,151 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ - -use proc_macro2::Span; -use syn::parse::{Parse, ParseStream, Result}; -use syn::punctuated::Punctuated; -use syn::{braced, token, Attribute, Ident, Path, Token, Type}; - -#[allow(non_camel_case_types)] -mod kw { - syn::custom_keyword!(accessor_type); - syn::custom_keyword!(gen_accessors); - syn::custom_keyword!(gen_types); -} - -pub struct MacroInput { - pub type_def: RootTypeDef, - pub gen_accessors: Ident, - pub accessor_type: Path, -} - -enum MacroArg { - GenAccessors(ArgInner), - AccessorType(ArgInner), - Types(ArgInner), -} - -struct ArgInner { - _field_kw: K, - _equals: Token![=], - value: V, -} - -pub struct Field { - pub attributes: Vec, - pub name: Ident, - _colon: Token![:], - pub field_type: FieldType, -} - -pub enum FieldType { - Existing(Type), - NewTypeDef(NewTypeDef), -} - -pub struct NewTypeDef { - _braces: token::Brace, - pub fields: Punctuated, -} - -pub struct RootTypeDef { - pub type_name: Ident, - pub type_def: NewTypeDef, -} - -impl Parse for MacroInput { - fn parse(input: ParseStream<'_>) -> Result { - let fields: Punctuated = - Punctuated::parse_terminated_with(input, MacroArg::parse)?; - let mut gen_accessors = None; - let mut type_def = None; - let mut accessor_type = None; - for arg in fields.into_iter() { - match arg { - MacroArg::GenAccessors(ArgInner { value, .. }) => gen_accessors = Some(value), - MacroArg::AccessorType(ArgInner { value, .. }) => accessor_type = Some(value), - MacroArg::Types(ArgInner { value, .. }) => type_def = Some(value), - } - } - - fn missing_attr(att_name: &str) -> syn::Error { - syn::Error::new( - Span::call_site(), - format!("Expected `{}` attribute", att_name), - ) - } - - Ok(MacroInput { - type_def: type_def.ok_or_else(|| missing_attr("gen_types"))?, - gen_accessors: gen_accessors.ok_or_else(|| missing_attr("gen_accessors"))?, - accessor_type: accessor_type.ok_or_else(|| missing_attr("accessor_type"))?, - }) - } -} - -impl Parse for MacroArg { - fn parse(input: ParseStream<'_>) -> Result { - let lookahead = input.lookahead1(); - if lookahead.peek(kw::gen_types) { - Ok(MacroArg::Types(input.parse()?)) - } else if lookahead.peek(kw::gen_accessors) { - Ok(MacroArg::GenAccessors(input.parse()?)) - } else if lookahead.peek(kw::accessor_type) { - Ok(MacroArg::AccessorType(input.parse()?)) - } else { - Err(lookahead.error()) - } - } -} - -impl Parse for ArgInner { - fn parse(input: ParseStream<'_>) -> Result { - Ok(ArgInner { - _field_kw: input.parse()?, - _equals: input.parse()?, - value: input.parse()?, - }) - } -} - -impl Parse for Field { - fn parse(input: ParseStream<'_>) -> Result { - Ok(Field { - attributes: input.call(Attribute::parse_outer)?, - name: input.parse()?, - _colon: input.parse()?, - field_type: input.parse()?, - }) - } -} - -impl Parse for RootTypeDef { - fn parse(input: ParseStream<'_>) -> Result { - Ok(RootTypeDef { - type_name: input.parse()?, - type_def: input.parse()?, - }) - } -} - -impl Parse for NewTypeDef { - fn parse(input: ParseStream<'_>) -> Result { - let content; - #[allow(clippy::mixed_read_write_in_expression)] - Ok(NewTypeDef { - _braces: braced!(content in input), - fields: Punctuated::parse_terminated_with(&content, Field::parse)?, - }) - } -} - -impl Parse for FieldType { - fn parse(input: ParseStream<'_>) -> Result { - if input.peek(token::Brace) { - Ok(FieldType::NewTypeDef(input.parse()?)) - } else { - Ok(FieldType::Existing(input.parse()?)) - } - } -} diff --git a/components/constellation/constellation.rs b/components/constellation/constellation.rs index 55777f1b6a1..0558c234f51 100644 --- a/components/constellation/constellation.rs +++ b/components/constellation/constellation.rs @@ -660,7 +660,7 @@ where // a dedicated per-process hang monitor will be initialized later inside the content process. // See run_content_process in servo/lib.rs let (background_monitor_register, background_hang_monitor_control_ipc_senders) = - if opts::multiprocess() { + if opts::get().multiprocess { (None, vec![]) } else { let ( @@ -2502,7 +2502,7 @@ where }; let content = ServiceWorkerUnprivilegedContent::new(sw_senders, origin); - if opts::multiprocess() { + if opts::get().multiprocess { if content.spawn_multiprocess().is_err() { return warn!("Failed to spawn process for SW manager."); } @@ -5034,7 +5034,7 @@ where let pipelines_to_evict = { let session_history = self.get_joint_session_history(top_level_browsing_context_id); - let history_length = pref!(session_history.max_length) as usize; + let history_length = pref!(session_history_max_length) as usize; // The past is stored with older entries at the front. // We reverse the iter so that newer entries are at the front and then diff --git a/components/constellation/pipeline.rs b/components/constellation/pipeline.rs index d8dd2028ebb..73bdd612884 100644 --- a/components/constellation/pipeline.rs +++ b/components/constellation/pipeline.rs @@ -3,7 +3,7 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ use std::borrow::Cow; -use std::collections::{HashMap, HashSet}; +use std::collections::HashSet; use std::rc::Rc; use std::sync::Arc; @@ -39,8 +39,7 @@ use script_traits::{ }; use serde::{Deserialize, Serialize}; use servo_config::opts::{self, Opts}; -use servo_config::prefs; -use servo_config::prefs::PrefValue; +use servo_config::prefs::{self, Preferences}; use servo_url::ServoUrl; use webrender_api::DocumentId; use webrender_traits::CrossProcessCompositorApi; @@ -283,7 +282,7 @@ impl Pipeline { load_data: state.load_data.clone(), script_port, opts: (*opts::get()).clone(), - prefs: prefs::pref_map().iter().collect(), + prefs: Box::new(prefs::get().clone()), pipeline_namespace_id: state.pipeline_namespace_id, webrender_document: state.webrender_document, cross_process_compositor_api: state @@ -300,7 +299,7 @@ impl Pipeline { // Spawn the child process. // // Yes, that's all there is to it! - let bhm_control_chan = if opts::multiprocess() { + let bhm_control_chan = if opts::get().multiprocess { let (bhm_control_chan, bhm_control_port) = ipc::channel().expect("Sampler chan"); unprivileged_pipeline_content.bhm_control_port = Some(bhm_control_port); @@ -490,7 +489,7 @@ pub struct UnprivilegedPipelineContent { load_data: LoadData, script_port: IpcReceiver, opts: Opts, - prefs: HashMap, + prefs: Box, pipeline_namespace_id: PipelineNamespaceId, cross_process_compositor_api: CrossProcessCompositorApi, webrender_document: DocumentId, @@ -581,7 +580,7 @@ impl UnprivilegedPipelineContent { self.opts.clone() } - pub fn prefs(&self) -> HashMap { - self.prefs.clone() + pub fn prefs(&self) -> &Preferences { + &self.prefs } } diff --git a/components/constellation/sandboxing.rs b/components/constellation/sandboxing.rs index ffb0d44d5cc..0f883b4743a 100644 --- a/components/constellation/sandboxing.rs +++ b/components/constellation/sandboxing.rs @@ -2,7 +2,6 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ -use std::collections::HashMap; #[cfg(not(windows))] use std::env; use std::ffi::OsStr; @@ -23,7 +22,7 @@ use gaol::profile::{Operation, PathPattern, Profile}; use ipc_channel::Error; use serde::{Deserialize, Serialize}; use servo_config::opts::Opts; -use servo_config::prefs::PrefValue; +use servo_config::prefs::Preferences; use crate::pipeline::UnprivilegedPipelineContent; use crate::serviceworker::ServiceWorkerUnprivilegedContent; @@ -43,7 +42,7 @@ impl UnprivilegedContent { } } - pub fn prefs(&self) -> HashMap { + pub fn prefs(&self) -> &Preferences { match self { UnprivilegedContent::Pipeline(content) => content.prefs(), UnprivilegedContent::ServiceWorker(content) => content.prefs(), diff --git a/components/constellation/serviceworker.rs b/components/constellation/serviceworker.rs index 9db6a8d8281..c4b13d7dbff 100644 --- a/components/constellation/serviceworker.rs +++ b/components/constellation/serviceworker.rs @@ -2,13 +2,12 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ -use std::collections::HashMap; - use ipc_channel::Error; use script_traits::{SWManagerSenders, ServiceWorkerManagerFactory}; use serde::{Deserialize, Serialize}; use servo_config::opts::{self, Opts}; -use servo_config::prefs::{self, PrefValue}; +use servo_config::prefs; +use servo_config::prefs::Preferences; use servo_url::ImmutableOrigin; use crate::sandboxing::{spawn_multiprocess, UnprivilegedContent}; @@ -18,7 +17,7 @@ use crate::sandboxing::{spawn_multiprocess, UnprivilegedContent}; #[derive(Deserialize, Serialize)] pub struct ServiceWorkerUnprivilegedContent { opts: Opts, - prefs: HashMap, + prefs: Box, senders: SWManagerSenders, origin: ImmutableOrigin, } @@ -30,7 +29,7 @@ impl ServiceWorkerUnprivilegedContent { ) -> ServiceWorkerUnprivilegedContent { ServiceWorkerUnprivilegedContent { opts: (*opts::get()).clone(), - prefs: prefs::pref_map().iter().collect(), + prefs: Box::new(prefs::get().clone()), senders, origin, } @@ -53,7 +52,7 @@ impl ServiceWorkerUnprivilegedContent { self.opts.clone() } - pub fn prefs(&self) -> HashMap { - self.prefs.clone() + pub fn prefs(&self) -> &Preferences { + &self.prefs } } diff --git a/components/devtools/actors/preference.rs b/components/devtools/actors/preference.rs index 10bb402cc2f..bb48057e0da 100644 --- a/components/devtools/actors/preference.rs +++ b/components/devtools/actors/preference.rs @@ -2,14 +2,12 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ -use std::collections::HashMap; use std::net::TcpStream; use log::warn; use serde::Serialize; use serde_json::{Map, Value}; -use servo_config::pref_util::PrefValue; -use servo_config::prefs::pref_map; +use servo_config::pref; use crate::actor::{Actor, ActorMessageStatus, ActorRegistry}; use crate::protocol::JsonPacketStream; @@ -38,128 +36,93 @@ impl Actor for PreferenceActor { stream: &mut TcpStream, _id: StreamId, ) -> Result { - let Some(mut key) = msg.get("value").and_then(|v| v.as_str()) else { + let Some(key) = msg.get("value").and_then(|v| v.as_str()) else { warn!("PreferenceActor: handle_message: value is not a string"); return Ok(ActorMessageStatus::Ignored); }; - // Mapping to translate a Firefox preference name onto the corresponding Servo preference name - let pref_name_mapping: HashMap<&str, &str> = - [("dom.serviceWorkers.enabled", "dom.serviceworker.enabled")] - .iter() - .copied() - .collect(); - if pref_name_mapping.contains_key(key) { - key = pref_name_mapping.get(key).unwrap(); - } - - let pref_value = pref_map().get(key); - Ok(handle_preference_value( - pref_value, - self.name(), - msg_type, - stream, - )) + // TODO: Map more preferences onto their Servo values. + Ok(match key { + "dom.serviceWorkers.enabled" => { + self.write_bool(pref!(dom_serviceworker_enabled), stream) + }, + _ => self.handle_missing_preference(msg_type, stream), + }) } } -fn handle_preference_value( - pref_value: PrefValue, - name: String, - msg_type: &str, - stream: &mut TcpStream, -) -> ActorMessageStatus { - match pref_value { - PrefValue::Float(value) => { - let reply = FloatReply { from: name, value }; - let _ = stream.write_json_packet(&reply); - ActorMessageStatus::Processed - }, - PrefValue::Int(value) => { - let reply = IntReply { from: name, value }; - let _ = stream.write_json_packet(&reply); - ActorMessageStatus::Processed - }, - PrefValue::Str(value) => { - let reply = CharReply { from: name, value }; - let _ = stream.write_json_packet(&reply); - ActorMessageStatus::Processed - }, - PrefValue::Bool(value) => { - let reply = BoolReply { from: name, value }; - let _ = stream.write_json_packet(&reply); - ActorMessageStatus::Processed - }, - PrefValue::Array(values) => { - let mut result = ActorMessageStatus::Processed; - for value in values { - result = handle_preference_value(value, name.clone(), msg_type, stream); - } - result - }, - PrefValue::Missing => handle_missing_preference(name, msg_type, stream), +impl PreferenceActor { + fn handle_missing_preference( + &self, + msg_type: &str, + stream: &mut TcpStream, + ) -> ActorMessageStatus { + match msg_type { + "getBoolPref" => self.write_bool(false, stream), + "getCharPref" => self.write_char("".into(), stream), + "getIntPref" => self.write_int(0, stream), + "getFloatPref" => self.write_float(0., stream), + _ => ActorMessageStatus::Ignored, + } } -} -// if the preferences are missing from pref_map then we return a -// fake preference response based on msg_type. -fn handle_missing_preference( - name: String, - msg_type: &str, - stream: &mut TcpStream, -) -> ActorMessageStatus { - match msg_type { - "getBoolPref" => { - let reply = BoolReply { - from: name, - value: false, - }; - let _ = stream.write_json_packet(&reply); - ActorMessageStatus::Processed - }, - - "getCharPref" => { - let reply = CharReply { - from: name, - value: "".to_owned(), - }; - let _ = stream.write_json_packet(&reply); - ActorMessageStatus::Processed - }, - - "getIntPref" => { - let reply = IntReply { - from: name, - value: 0, - }; - let _ = stream.write_json_packet(&reply); - ActorMessageStatus::Processed - }, - - _ => ActorMessageStatus::Ignored, + fn write_bool(&self, pref_value: bool, stream: &mut TcpStream) -> ActorMessageStatus { + #[derive(Serialize)] + struct BoolReply { + from: String, + value: bool, + } + + let reply = BoolReply { + from: self.name.clone(), + value: pref_value, + }; + let _ = stream.write_json_packet(&reply); + ActorMessageStatus::Processed } -} -#[derive(Serialize)] -struct BoolReply { - from: String, - value: bool, -} + fn write_char(&self, pref_value: String, stream: &mut TcpStream) -> ActorMessageStatus { + #[derive(Serialize)] + struct CharReply { + from: String, + value: String, + } -#[derive(Serialize)] -struct CharReply { - from: String, - value: String, -} + let reply = CharReply { + from: self.name.clone(), + value: pref_value, + }; + let _ = stream.write_json_packet(&reply); + ActorMessageStatus::Processed + } -#[derive(Serialize)] -struct IntReply { - from: String, - value: i64, -} + fn write_int(&self, pref_value: i64, stream: &mut TcpStream) -> ActorMessageStatus { + #[derive(Serialize)] + struct IntReply { + from: String, + value: i64, + } -#[derive(Serialize)] -struct FloatReply { - from: String, - value: f64, + let reply = IntReply { + from: self.name.clone(), + value: pref_value, + }; + let _ = stream.write_json_packet(&reply); + ActorMessageStatus::Processed + } + + fn write_float(&self, pref_value: f64, stream: &mut TcpStream) -> ActorMessageStatus { + #[derive(Serialize)] + struct FloatReply { + from: String, + value: f64, + } + + let reply = FloatReply { + from: self.name.clone(), + value: pref_value, + }; + let _ = stream.write_json_packet(&reply); + ActorMessageStatus::Processed + } } diff --git a/components/fonts/system_font_service.rs b/components/fonts/system_font_service.rs index 42acc5ab85b..b29eca6b86c 100644 --- a/components/fonts/system_font_service.rs +++ b/components/fonts/system_font_service.rs @@ -323,10 +323,10 @@ impl SystemFontService { .get_or_init(|| { // First check whether the font is set in the preferences. let family_name = match generic { - GenericFontFamily::None => pref!(fonts.default), - GenericFontFamily::Serif => pref!(fonts.serif), - GenericFontFamily::SansSerif => pref!(fonts.sans_serif), - GenericFontFamily::Monospace => pref!(fonts.monospace), + GenericFontFamily::None => pref!(fonts_default), + GenericFontFamily::Serif => pref!(fonts_serif), + GenericFontFamily::SansSerif => pref!(fonts_sans_serif), + GenericFontFamily::Monospace => pref!(fonts_monospace), _ => String::new(), }; diff --git a/components/layout_thread/lib.rs b/components/layout_thread/lib.rs index 1a5630293b3..d0eae9afb45 100644 --- a/components/layout_thread/lib.rs +++ b/components/layout_thread/lib.rs @@ -520,7 +520,7 @@ impl LayoutThread { compositor_api.send_initial_transaction(id.into()); let mut font = Font::initial_values(); - let default_font_size = pref!(fonts.default_size); + let default_font_size = pref!(fonts_default_size); font.font_size = FontSize { computed_size: NonNegativeLength::new(default_font_size as f32), used_size: NonNegativeLength::new(default_font_size as f32), @@ -1519,8 +1519,8 @@ impl FontMetricsProvider for LayoutFontMetricsProvider { fn base_size_for_generic(&self, generic: GenericFontFamily) -> Length { Length::new(match generic { - GenericFontFamily::Monospace => pref!(fonts.default_monospace_size), - _ => pref!(fonts.default_size), + GenericFontFamily::Monospace => pref!(fonts_default_monospace_size), + _ => pref!(fonts_default_size), } as f32) .max(Length::new(0.0)) } diff --git a/components/layout_thread_2020/lib.rs b/components/layout_thread_2020/lib.rs index 496e15b16ee..85d499ecfde 100644 --- a/components/layout_thread_2020/lib.rs +++ b/components/layout_thread_2020/lib.rs @@ -495,7 +495,7 @@ impl LayoutThread { compositor_api.send_initial_transaction(id.into()); let mut font = Font::initial_values(); - let default_font_size = pref!(fonts.default_size); + let default_font_size = pref!(fonts_default_size); font.font_size = FontSize { computed_size: NonNegativeLength::new(default_font_size as f32), used_size: NonNegativeLength::new(default_font_size as f32), @@ -1232,8 +1232,8 @@ impl FontMetricsProvider for LayoutFontMetricsProvider { fn base_size_for_generic(&self, generic: GenericFontFamily) -> Length { Length::new(match generic { - GenericFontFamily::Monospace => pref!(fonts.default_monospace_size), - _ => pref!(fonts.default_size), + GenericFontFamily::Monospace => pref!(fonts_default_monospace_size), + _ => pref!(fonts_default_size), } as f32) .max(Length::new(0.0)) } diff --git a/components/net/async_runtime.rs b/components/net/async_runtime.rs index 7d1fb9daeaa..c99068b1076 100644 --- a/components/net/async_runtime.rs +++ b/components/net/async_runtime.rs @@ -19,9 +19,9 @@ pub static HANDLE: LazyLock>> = LazyLock::new(|| { .worker_threads( thread::available_parallelism() .map(|i| i.get()) - .unwrap_or(servo_config::pref!(threadpools.fallback_worker_num) as usize) + .unwrap_or(servo_config::pref!(threadpools_fallback_worker_num) as usize) .min( - servo_config::pref!(threadpools.async_runtime_workers.max).max(1) as usize, + servo_config::pref!(threadpools_async_runtime_workers_max).max(1) as usize, ), ) .enable_io() diff --git a/components/net/decoder.rs b/components/net/decoder.rs index 9b6c8f1a3d0..4d0973cdac2 100644 --- a/components/net/decoder.rs +++ b/components/net/decoder.rs @@ -280,7 +280,7 @@ impl Stream for BodyStream { .content_length .map_or(false, |c| c.0 == self.total_read); if self.is_secure_scheme && - (all_content_read || pref!(network.tls.ignore_unexpected_eof)) + (all_content_read || pref!(network_tls_ignore_unexpected_eof)) { let source = err.source(); let is_unexpected_eof = source diff --git a/components/net/filemanager_thread.rs b/components/net/filemanager_thread.rs index e72290b2694..65c3736bf24 100644 --- a/components/net/filemanager_thread.rs +++ b/components/net/filemanager_thread.rs @@ -602,7 +602,7 @@ impl FileManagerStore { // Check if the select_files preference is enabled // to ensure process-level security against compromised script; // Then try applying opt_test_path directly for testing convenience - let opt_s = if pref!(dom.testing.html_input_element.select_files.enabled) { + let opt_s = if pref!(dom_testing_html_input_element_select_files_enabled) { opt_test_path } else { self.query_files_from_embedder(patterns, false, embedder_proxy) @@ -632,7 +632,7 @@ impl FileManagerStore { // Check if the select_files preference is enabled // to ensure process-level security against compromised script; // Then try applying opt_test_paths directly for testing convenience - let opt_v = if pref!(dom.testing.html_input_element.select_files.enabled) { + let opt_v = if pref!(dom_testing_html_input_element_select_files_enabled) { opt_test_paths } else { self.query_files_from_embedder(patterns, true, embedder_proxy) diff --git a/components/net/hsts.rs b/components/net/hsts.rs index ebaf6e783bd..da57051790f 100644 --- a/components/net/hsts.rs +++ b/components/net/hsts.rs @@ -144,8 +144,8 @@ impl HstsList { return; } - let upgrade_scheme = if pref!(network.enforce_tls.enabled) { - if (!pref!(network.enforce_tls.localhost) && + let upgrade_scheme = if pref!(network_enforce_tls_enabled) { + if (!pref!(network_enforce_tls_localhost) && match url.host() { Some(Host::Domain(domain)) => { domain.ends_with(".localhost") || domain == "localhost" @@ -154,7 +154,7 @@ impl HstsList { Some(Host::Ipv6(ipv6)) => ipv6.is_loopback(), _ => false, }) || - (!pref!(network.enforce_tls.onion) && + (!pref!(network_enforce_tls_onion) && url.domain() .is_some_and(|domain| domain.ends_with(".onion"))) { diff --git a/components/net/http_cache.rs b/components/net/http_cache.rs index bf6d28de220..0f0f715b3f6 100644 --- a/components/net/http_cache.rs +++ b/components/net/http_cache.rs @@ -756,7 +756,7 @@ impl HttpCache { /// Storing Responses in Caches. /// pub fn store(&mut self, request: &Request, response: &Response) { - if pref!(network.http_cache.disabled) { + if pref!(network_http_cache_disabled) { return; } if request.method != Method::GET { diff --git a/components/net/image_cache.rs b/components/net/image_cache.rs index 3d2ffcf5706..a9a6e558919 100644 --- a/components/net/image_cache.rs +++ b/components/net/image_cache.rs @@ -17,6 +17,7 @@ use net_traits::image_cache::{ use net_traits::request::CorsSettings; use net_traits::{FetchMetadata, FetchResponseMsg, FilteredMetadata, NetworkError}; use pixels::{load_from_memory, CorsStatus, Image, ImageMetadata, PixelFormat}; +use servo_config::pref; use servo_url::{ImmutableOrigin, ServoUrl}; use webrender_api::units::DeviceIntSize; use webrender_api::{ImageDescriptor, ImageDescriptorFlags, ImageFormat}; @@ -422,8 +423,8 @@ impl ImageCache for ImageCacheImpl { // If no information can be obtained about the system, uses 4 threads as a default let thread_count = thread::available_parallelism() .map(|i| i.get()) - .unwrap_or(servo_config::pref!(threadpools.fallback_worker_num) as usize) - .min(servo_config::pref!(threadpools.async_runtime_workers.max).max(1) as usize); + .unwrap_or(pref!(threadpools_fallback_worker_num) as usize) + .min(pref!(threadpools_async_runtime_workers_max).max(1) as usize); ImageCacheImpl { store: Arc::new(Mutex::new(ImageCacheStore { diff --git a/components/net/local_directory_listing.rs b/components/net/local_directory_listing.rs index 39e6a98d66c..ab89e054b20 100644 --- a/components/net/local_directory_listing.rs +++ b/components/net/local_directory_listing.rs @@ -16,7 +16,7 @@ use servo_url::ServoUrl; use url::Url; pub fn fetch(request: &mut Request, url: ServoUrl, path_buf: PathBuf) -> Response { - if !pref!(network.local_directory_listing.enabled) { + if !pref!(network_local_directory_listing_enabled) { // If you want to be able to browse local directories, configure Servo prefs so that // "network.local_directory_listing.enabled" is set to true. return Response::network_error(NetworkError::Internal( diff --git a/components/net/resource_thread.rs b/components/net/resource_thread.rs index 2001faccd22..12278d4c326 100644 --- a/components/net/resource_thread.rs +++ b/components/net/resource_thread.rs @@ -695,8 +695,8 @@ impl CoreResourceManager { ) -> CoreResourceManager { let num_threads = thread::available_parallelism() .map(|i| i.get()) - .unwrap_or(servo_config::pref!(threadpools.fallback_worker_num) as usize) - .min(servo_config::pref!(threadpools.resource_workers.max).max(1) as usize); + .unwrap_or(servo_config::pref!(threadpools_fallback_worker_num) as usize) + .min(servo_config::pref!(threadpools_resource_workers_max).max(1) as usize); let pool = CoreResourceThreadPool::new(num_threads, "CoreResourceThreadPool".to_string()); let pool_handle = Arc::new(pool); CoreResourceManager { diff --git a/components/net/tests/filemanager_thread.rs b/components/net/tests/filemanager_thread.rs index 9a1b33becec..0e3e8aeb91a 100644 --- a/components/net/tests/filemanager_thread.rs +++ b/components/net/tests/filemanager_thread.rs @@ -15,16 +15,19 @@ use net_traits::blob_url_store::BlobURLStoreError; use net_traits::filemanager_thread::{ FileManagerThreadError, FileManagerThreadMsg, ReadFileProgress, }; -use servo_config::set_pref; +use servo_config::prefs::Preferences; use crate::create_embedder_proxy; #[test] fn test_filemanager() { + let mut preferences = Preferences::default(); + preferences.dom_testing_html_input_element_select_files_enabled = true; + servo_config::prefs::set(preferences); + let pool = CoreResourceThreadPool::new(1, "CoreResourceTestPool".to_string()); let pool_handle = Arc::new(pool); let filemanager = FileManager::new(create_embedder_proxy(), Arc::downgrade(&pool_handle)); - set_pref!(dom.testing.html_input_element.select_files.enabled, true); // Try to open a dummy file "components/net/tests/test.jpeg" in tree let mut handler = File::open("tests/test.jpeg").expect("test.jpeg is stolen"); diff --git a/components/script/dom/bindings/codegen/run.py b/components/script/dom/bindings/codegen/run.py index 2dee39814b2..d60cff896da 100644 --- a/components/script/dom/bindings/codegen/run.py +++ b/components/script/dom/bindings/codegen/run.py @@ -89,10 +89,31 @@ def generate(config, name, filename): def add_css_properties_attributes(css_properties_json, parser): + def map_preference_name(preference_name: str): + """Map between Stylo preference names and Servo preference names as the + `css-properties.json` file is generated by Stylo. This should be kept in sync with the + preference mapping done in `components/servo_config/prefs.rs`, which handles the runtime version of + these preferences.""" + MAPPING = [ + ["layout.unimplemented", "layout_unimplemented"], + ["layout.threads", "layout_threads"], + ["layout.legacy_layout", "layout_legacy_layout"], + ["layout.flexbox.enabled", "layout_flexbox_enabled"], + ["layout.columns.enabled", "layout_columns_enabled"], + ["layout.grid.enabled", "layout_grid_enabled"], + ["layout.css.transition-behavior.enabled", "layout_css_transition_behavior_enabled"], + ["layout.writing-mode.enabled", "layout_writing_mode_enabled"], + ["layout.container-queries.enabled", "layout_container_queries_enabled"], + ] + for mapping in MAPPING: + if mapping[0] == preference_name: + return mapping[1] + return preference_name + css_properties = json.load(open(css_properties_json, "rb")) idl = "partial interface CSSStyleDeclaration {\n%s\n};\n" % "\n".join( " [%sCEReactions, SetterThrows] attribute [LegacyNullToEmptyString] DOMString %s;" % ( - ('Pref="%s", ' % data["pref"] if data["pref"] else ""), + (f'Pref="{map_preference_name(data["pref"])}", ' if data["pref"] else ""), attribute_name ) for (kind, properties_list) in sorted(css_properties.items()) diff --git a/components/script/dom/bindings/guard.rs b/components/script/dom/bindings/guard.rs index 45e4473d821..fb2b2ebc807 100644 --- a/components/script/dom/bindings/guard.rs +++ b/components/script/dom/bindings/guard.rs @@ -5,7 +5,7 @@ //! Machinery to conditionally expose things. use js::rust::HandleObject; -use servo_config::prefs; +use servo_config::prefs::get; use crate::dom::bindings::codegen::InterfaceObjectMap; use crate::dom::bindings::interface::is_exposed_in; @@ -85,7 +85,7 @@ impl Condition { global: HandleObject, ) -> bool { match *self { - Condition::Pref(name) => prefs::pref_map().get(name).as_bool().unwrap_or(false), + Condition::Pref(name) => get().get_value(name).try_into().unwrap_or(false), Condition::Func(f) => f(cx, obj), Condition::Exposed(globals) => is_exposed_in(global, globals), Condition::SecureContext() => is_secure_context(cx), diff --git a/components/script/dom/create.rs b/components/script/dom/create.rs index 7f3dfdac540..cde5bcbb13f 100644 --- a/components/script/dom/create.rs +++ b/components/script/dom/create.rs @@ -108,7 +108,7 @@ fn create_svg_element( }) ); - if !pref!(dom.svg.enabled) { + if !pref!(dom_svg_enabled) { return Element::new(name.local, name.ns, prefix, document, proto, CanGc::note()); } diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs index 11602547b7e..11a0c0935cd 100644 --- a/components/script/dom/document.rs +++ b/components/script/dom/document.rs @@ -1356,8 +1356,8 @@ impl Document { if let Some((last_time, last_pos)) = opt { let DBL_CLICK_TIMEOUT = - Duration::from_millis(pref!(dom.document.dblclick_timeout) as u64); - let DBL_CLICK_DIST_THRESHOLD = pref!(dom.document.dblclick_dist) as u64; + Duration::from_millis(pref!(dom_document_dblclick_timeout) as u64); + let DBL_CLICK_DIST_THRESHOLD = pref!(dom_document_dblclick_dist) as u64; // Calculate distance between this click and the previous click. let line = click_pos - last_pos; @@ -2469,7 +2469,7 @@ impl Document { // https://immersive-web.github.io/webxr/#user-intention // https://github.com/immersive-web/navigation/issues/10 #[cfg(feature = "webxr")] - if pref!(dom.webxr.sessionavailable) && self.window.is_top_level() { + if pref!(dom_webxr_sessionavailable) && self.window.is_top_level() { self.window.Navigator().Xr().dispatch_sessionavailable(); } @@ -2850,7 +2850,7 @@ impl Document { local_name: &LocalName, is: Option<&LocalName>, ) -> Option> { - if !pref!(dom.custom_elements.enabled) { + if !pref!(dom_customelements_enabled) { return None; } @@ -3344,7 +3344,7 @@ impl Document { #[cfg(feature = "webgpu")] webgpu_contexts: Rc::new(RefCell::new(HashMapTracedValues::new())), selection: MutNullableDom::new(None), - animation_timeline: if pref!(layout.animations.test.enabled) { + animation_timeline: if pref!(layout_animations_test_enabled) { DomRefCell::new(AnimationTimeline::new_for_testing()) } else { DomRefCell::new(AnimationTimeline::new()) @@ -3826,7 +3826,7 @@ impl Document { error = true; } - if pref!(dom.fullscreen.test) { + if pref!(dom_fullscreen_test) { // For reftests we just take over the current window, // and don't try to really enter fullscreen. info!("Tests don't really enter fullscreen."); @@ -4109,7 +4109,7 @@ impl Document { /// An implementation of . pub(crate) fn update_animations_and_send_events(&self, can_gc: CanGc) { // Only update the time if it isn't being managed by a test. - if !pref!(layout.animations.test.enabled) { + if !pref!(layout_animations_test_enabled) { self.animation_timeline.borrow_mut().update(); } diff --git a/components/script/dom/htmlmediaelement.rs b/components/script/dom/htmlmediaelement.rs index 22fb9084189..704ec00f45c 100644 --- a/components/script/dom/htmlmediaelement.rs +++ b/components/script/dom/htmlmediaelement.rs @@ -1325,7 +1325,7 @@ impl HTMLMediaElement { .render_poster_frame(image); self.upcast::().dirty(NodeDamage::OtherNodeDamage); - if pref!(media.testing.enabled) { + if pref!(media_testing_enabled) { self.owner_global() .task_manager() .media_element_task_source() diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index b0d8d5ab47b..c76075a93aa 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -463,7 +463,7 @@ impl FetchResponseListener for ClassicContext { /* let options = unsafe { CompileOptionsWrapper::new(*cx, final_url.as_str(), 1) }; - let can_compile_off_thread = pref!(dom.script.asynch) && + let can_compile_off_thread = pref!(dom_script_asynch) && unsafe { CanCompileOffThread(*cx, options.ptr as *const _, source_text.len()) }; if can_compile_off_thread { diff --git a/components/script/dom/mouseevent.rs b/components/script/dom/mouseevent.rs index 1d616c5f1ab..7d2a51bc8f7 100644 --- a/components/script/dom/mouseevent.rs +++ b/components/script/dom/mouseevent.rs @@ -408,7 +408,7 @@ impl MouseEventMethods for MouseEvent { // This returns the same result as current gecko. // https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/which fn Which(&self) -> i32 { - if pref!(dom.mouse_event.which.enabled) { + if pref!(dom_mouse_event_which_enabled) { (self.button.get() + 1) as i32 } else { 0 diff --git a/components/script/dom/paintworkletglobalscope.rs b/components/script/dom/paintworkletglobalscope.rs index b806927a9b9..b971bbbd35f 100644 --- a/components/script/dom/paintworkletglobalscope.rs +++ b/components/script/dom/paintworkletglobalscope.rs @@ -421,7 +421,7 @@ impl PaintWorkletGlobalScope { .expect("Locking a painter.") .schedule_a_worklet_task(WorkletTask::Paint(task)); - let timeout = pref!(dom.worklet.timeout_ms) as u64; + let timeout = pref!(dom_worklet_timeout_ms) as u64; receiver .recv_timeout(Duration::from_millis(timeout)) diff --git a/components/script/dom/permissions.rs b/components/script/dom/permissions.rs index badadb9b0ee..8efa1b09765 100644 --- a/components/script/dom/permissions.rs +++ b/components/script/dom/permissions.rs @@ -301,7 +301,7 @@ pub(crate) fn get_descriptor_permission_state( // and let the user decide to grant the permission or not. let state = if allowed_in_nonsecure_contexts(&permission_name) { PermissionState::Prompt - } else if pref!(dom.permissions.testing.allowed_in_nonsecure_contexts) { + } else if pref!(dom_permissions_testing_allowed_in_nonsecure_contexts) { PermissionState::Granted } else { globalscope diff --git a/components/script/dom/serviceworkerglobalscope.rs b/components/script/dom/serviceworkerglobalscope.rs index 870940d0609..aa9184a3dc9 100644 --- a/components/script/dom/serviceworkerglobalscope.rs +++ b/components/script/dom/serviceworkerglobalscope.rs @@ -306,7 +306,7 @@ impl ServiceWorkerGlobalScope { // Service workers are time limited // https://w3c.github.io/ServiceWorker/#service-worker-lifetime - let sw_lifetime_timeout = pref!(dom.serviceworker.timeout_seconds) as u64; + let sw_lifetime_timeout = pref!(dom_serviceworker_timeout_seconds) as u64; let time_out_port = after(Duration::new(sw_lifetime_timeout, 0)); let (devtools_mpsc_chan, devtools_mpsc_port) = unbounded(); diff --git a/components/script/dom/servoparser/mod.rs b/components/script/dom/servoparser/mod.rs index 18a7aed45f0..fe9719f5569 100644 --- a/components/script/dom/servoparser/mod.rs +++ b/components/script/dom/servoparser/mod.rs @@ -158,7 +158,7 @@ impl ServoParser { url: ServoUrl, can_gc: CanGc, ) { - let parser = if pref!(dom.servoparser.async_html_tokenizer.enabled) { + let parser = if pref!(dom_servoparser_async_html_tokenizer_enabled) { ServoParser::new( document, Tokenizer::AsyncHtml(self::async_html::Tokenizer::new(document, url, None)), diff --git a/components/script/dom/testbinding.rs b/components/script/dom/testbinding.rs index 9e3aa7749c6..0677623ea36 100644 --- a/components/script/dom/testbinding.rs +++ b/components/script/dom/testbinding.rs @@ -880,17 +880,18 @@ impl TestBindingMethods for TestBinding { fn PassVariadicAny(&self, _: SafeJSContext, _: Vec) {} fn PassVariadicObject(&self, _: SafeJSContext, _: Vec<*mut JSObject>) {} fn BooleanMozPreference(&self, pref_name: DOMString) -> bool { - prefs::pref_map() - .get(pref_name.as_ref()) - .as_bool() + prefs::get() + .get_value(pref_name.as_ref()) + .try_into() .unwrap_or(false) } fn StringMozPreference(&self, pref_name: DOMString) -> DOMString { - prefs::pref_map() - .get(pref_name.as_ref()) - .as_str() - .map(DOMString::from) - .unwrap_or_default() + DOMString::from_string( + prefs::get() + .get_value(pref_name.as_ref()) + .try_into() + .unwrap_or_default(), + ) } fn PrefControlledAttributeDisabled(&self) -> bool { false diff --git a/components/script/dom/webgl2renderingcontext.rs b/components/script/dom/webgl2renderingcontext.rs index c351f025245..db81983c106 100644 --- a/components/script/dom/webgl2renderingcontext.rs +++ b/components/script/dom/webgl2renderingcontext.rs @@ -198,7 +198,7 @@ impl WebGL2RenderingContext { #[allow(unsafe_code)] pub(crate) fn is_webgl2_enabled(_cx: JSContext, global: HandleObject) -> bool { - if pref!(dom.webgl2.enabled) { + if pref!(dom_webgl2_enabled) { return true; } diff --git a/components/script/dom/webglrenderingcontext.rs b/components/script/dom/webglrenderingcontext.rs index 0b8e53f5961..1ca324baaab 100644 --- a/components/script/dom/webglrenderingcontext.rs +++ b/components/script/dom/webglrenderingcontext.rs @@ -222,7 +222,7 @@ impl WebGLRenderingContext { size: Size2D, attrs: GLContextAttributes, ) -> Result { - if pref!(webgl.testing.context_creation_error) { + if pref!(webgl_testing_context_creation_error) { return Err("WebGL context creation error forced by pref `webgl.testing.context_creation_error`".into()); } diff --git a/components/script/dom/webidls/AbortController.webidl b/components/script/dom/webidls/AbortController.webidl index faeaf9cbd44..cef49010d3c 100644 --- a/components/script/dom/webidls/AbortController.webidl +++ b/components/script/dom/webidls/AbortController.webidl @@ -3,7 +3,7 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ // https://dom.spec.whatwg.org/#interface-abortcontroller -[Exposed=*, Pref="dom.abort_controller.enabled"] +[Exposed=*, Pref="dom_abort_controller_enabled"] interface AbortController { constructor(); diff --git a/components/script/dom/webidls/ActivatableElement.webidl b/components/script/dom/webidls/ActivatableElement.webidl index e9d959c8470..99a250a4b55 100644 --- a/components/script/dom/webidls/ActivatableElement.webidl +++ b/components/script/dom/webidls/ActivatableElement.webidl @@ -7,9 +7,9 @@ // web pages. [Exposed=(Window,Worker)] interface mixin ActivatableElement { - [Throws, Pref="dom.testing.element.activation.enabled"] + [Throws, Pref="dom_testing_element_activation_enabled"] undefined enterFormalActivationState(); - [Throws, Pref="dom.testing.element.activation.enabled"] + [Throws, Pref="dom_testing_element_activation_enabled"] undefined exitFormalActivationState(); }; diff --git a/components/script/dom/webidls/Bluetooth.webidl b/components/script/dom/webidls/Bluetooth.webidl index e5e135c0577..65ce8ea79b3 100644 --- a/components/script/dom/webidls/Bluetooth.webidl +++ b/components/script/dom/webidls/Bluetooth.webidl @@ -25,7 +25,7 @@ dictionary RequestDeviceOptions { boolean acceptAllDevices = false; }; -[Exposed=Window, Pref="dom.bluetooth.enabled"] +[Exposed=Window, Pref="dom_bluetooth_enabled"] interface Bluetooth : EventTarget { [SecureContext] Promise getAvailability(); diff --git a/components/script/dom/webidls/BluetoothAdvertisingEvent.webidl b/components/script/dom/webidls/BluetoothAdvertisingEvent.webidl index a7dd3fe947f..c6f3c6a8480 100644 --- a/components/script/dom/webidls/BluetoothAdvertisingEvent.webidl +++ b/components/script/dom/webidls/BluetoothAdvertisingEvent.webidl @@ -10,7 +10,7 @@ interface BluetoothServiceDataMap { readonly maplike; };*/ -[Exposed=Window, Pref="dom.bluetooth.enabled"] +[Exposed=Window, Pref="dom_bluetooth_enabled"] interface BluetoothAdvertisingEvent : Event { [Throws] constructor(DOMString type, BluetoothAdvertisingEventInit init); [SameObject] diff --git a/components/script/dom/webidls/BluetoothCharacteristicProperties.webidl b/components/script/dom/webidls/BluetoothCharacteristicProperties.webidl index 124f881a2e0..fb812ff7c46 100644 --- a/components/script/dom/webidls/BluetoothCharacteristicProperties.webidl +++ b/components/script/dom/webidls/BluetoothCharacteristicProperties.webidl @@ -4,7 +4,7 @@ // https://webbluetoothcg.github.io/web-bluetooth/#characteristicproperties -[Exposed=Window, Pref="dom.bluetooth.enabled"] +[Exposed=Window, Pref="dom_bluetooth_enabled"] interface BluetoothCharacteristicProperties { readonly attribute boolean broadcast; readonly attribute boolean read; diff --git a/components/script/dom/webidls/BluetoothDevice.webidl b/components/script/dom/webidls/BluetoothDevice.webidl index c514132140d..f9cb44dda5a 100644 --- a/components/script/dom/webidls/BluetoothDevice.webidl +++ b/components/script/dom/webidls/BluetoothDevice.webidl @@ -4,7 +4,7 @@ // https://webbluetoothcg.github.io/web-bluetooth/#bluetoothdevice -[Exposed=Window, Pref="dom.bluetooth.enabled"] +[Exposed=Window, Pref="dom_bluetooth_enabled"] interface BluetoothDevice : EventTarget { readonly attribute DOMString id; readonly attribute DOMString? name; diff --git a/components/script/dom/webidls/BluetoothPermissionResult.webidl b/components/script/dom/webidls/BluetoothPermissionResult.webidl index 95c06797aef..67822fc55cf 100644 --- a/components/script/dom/webidls/BluetoothPermissionResult.webidl +++ b/components/script/dom/webidls/BluetoothPermissionResult.webidl @@ -12,7 +12,7 @@ dictionary BluetoothPermissionDescriptor : PermissionDescriptor { boolean acceptAllDevices = false; }; -[Exposed=Window, Pref="dom.bluetooth.enabled"] +[Exposed=Window, Pref="dom_bluetooth_enabled"] interface BluetoothPermissionResult : PermissionStatus { // attribute FrozenArray devices; // Workaround until FrozenArray get implemented. diff --git a/components/script/dom/webidls/BluetoothRemoteGATTCharacteristic.webidl b/components/script/dom/webidls/BluetoothRemoteGATTCharacteristic.webidl index 9f41d2450f9..9e0140d8129 100644 --- a/components/script/dom/webidls/BluetoothRemoteGATTCharacteristic.webidl +++ b/components/script/dom/webidls/BluetoothRemoteGATTCharacteristic.webidl @@ -4,7 +4,7 @@ // https://webbluetoothcg.github.io/web-bluetooth/#bluetoothremotegattcharacteristic -[Exposed=Window, Pref="dom.bluetooth.enabled"] +[Exposed=Window, Pref="dom_bluetooth_enabled"] interface BluetoothRemoteGATTCharacteristic : EventTarget { [SameObject] readonly attribute BluetoothRemoteGATTService service; diff --git a/components/script/dom/webidls/BluetoothRemoteGATTDescriptor.webidl b/components/script/dom/webidls/BluetoothRemoteGATTDescriptor.webidl index 29cbc3040a4..31e19a850fc 100644 --- a/components/script/dom/webidls/BluetoothRemoteGATTDescriptor.webidl +++ b/components/script/dom/webidls/BluetoothRemoteGATTDescriptor.webidl @@ -4,7 +4,7 @@ // http://webbluetoothcg.github.io/web-bluetooth/#bluetoothremotegattdescriptor -[Exposed=Window, Pref="dom.bluetooth.enabled"] +[Exposed=Window, Pref="dom_bluetooth_enabled"] interface BluetoothRemoteGATTDescriptor { [SameObject] readonly attribute BluetoothRemoteGATTCharacteristic characteristic; diff --git a/components/script/dom/webidls/BluetoothRemoteGATTServer.webidl b/components/script/dom/webidls/BluetoothRemoteGATTServer.webidl index e46cef4a079..3d60ace070f 100644 --- a/components/script/dom/webidls/BluetoothRemoteGATTServer.webidl +++ b/components/script/dom/webidls/BluetoothRemoteGATTServer.webidl @@ -4,7 +4,7 @@ //https://webbluetoothcg.github.io/web-bluetooth/#bluetoothremotegattserver -[Exposed=Window, Pref="dom.bluetooth.enabled"] +[Exposed=Window, Pref="dom_bluetooth_enabled"] interface BluetoothRemoteGATTServer { [SameObject] readonly attribute BluetoothDevice device; diff --git a/components/script/dom/webidls/BluetoothRemoteGATTService.webidl b/components/script/dom/webidls/BluetoothRemoteGATTService.webidl index 7e9f624dd1c..e505ae3aabe 100644 --- a/components/script/dom/webidls/BluetoothRemoteGATTService.webidl +++ b/components/script/dom/webidls/BluetoothRemoteGATTService.webidl @@ -4,7 +4,7 @@ // https://webbluetoothcg.github.io/web-bluetooth/#bluetoothremotegattservice -[Exposed=Window, Pref="dom.bluetooth.enabled"] +[Exposed=Window, Pref="dom_bluetooth_enabled"] interface BluetoothRemoteGATTService : EventTarget { [SameObject] readonly attribute BluetoothDevice device; diff --git a/components/script/dom/webidls/BluetoothUUID.webidl b/components/script/dom/webidls/BluetoothUUID.webidl index dde82d3acb7..5ee501bf6e6 100644 --- a/components/script/dom/webidls/BluetoothUUID.webidl +++ b/components/script/dom/webidls/BluetoothUUID.webidl @@ -4,7 +4,7 @@ // https://webbluetoothcg.github.io/web-bluetooth/#bluetoothuuid -[Exposed=Window, Pref="dom.bluetooth.enabled"] +[Exposed=Window, Pref="dom_bluetooth_enabled"] interface BluetoothUUID { [Throws] static UUID getService(BluetoothServiceUUID name); diff --git a/components/script/dom/webidls/CSS.webidl b/components/script/dom/webidls/CSS.webidl index 15049ae7539..2a199569cd8 100644 --- a/components/script/dom/webidls/CSS.webidl +++ b/components/script/dom/webidls/CSS.webidl @@ -20,5 +20,5 @@ partial interface CSS { // https://drafts.css-houdini.org/css-paint-api-1/#paint-worklet partial interface CSS { - [SameObject, Pref="dom.worklet.enabled"] static readonly attribute Worklet paintWorklet; + [SameObject, Pref="dom_worklet_enabled"] static readonly attribute Worklet paintWorklet; }; diff --git a/components/script/dom/webidls/CSSStyleValue.webidl b/components/script/dom/webidls/CSSStyleValue.webidl index 3cd075b67e8..a87c2b29910 100644 --- a/components/script/dom/webidls/CSSStyleValue.webidl +++ b/components/script/dom/webidls/CSSStyleValue.webidl @@ -4,7 +4,7 @@ // https://drafts.css-houdini.org/css-typed-om-1/#cssstylevalue // NOTE: should this be exposed to Window? -[Pref="dom.worklet.enabled", Exposed=(Worklet)] +[Pref="dom_worklet_enabled", Exposed=(Worklet)] interface CSSStyleValue { stringifier; }; diff --git a/components/script/dom/webidls/CanvasRenderingContext2D.webidl b/components/script/dom/webidls/CanvasRenderingContext2D.webidl index 0a7dbf6ab94..4479d068186 100644 --- a/components/script/dom/webidls/CanvasRenderingContext2D.webidl +++ b/components/script/dom/webidls/CanvasRenderingContext2D.webidl @@ -139,12 +139,12 @@ interface mixin CanvasUserInterface { interface mixin CanvasText { // text (see also the CanvasPathDrawingStyles and CanvasTextDrawingStyles interfaces) - [Pref="dom.canvas_text.enabled"] + [Pref="dom_canvas_text_enabled"] undefined fillText(DOMString text, unrestricted double x, unrestricted double y, optional unrestricted double maxWidth); //void strokeText(DOMString text, unrestricted double x, unrestricted double y, // optional unrestricted double maxWidth); - [Pref="dom.canvas_text.enabled"] + [Pref="dom_canvas_text_enabled"] TextMetrics measureText(DOMString text); }; diff --git a/components/script/dom/webidls/Client.webidl b/components/script/dom/webidls/Client.webidl index f5a9dee934e..f2b144ffa07 100644 --- a/components/script/dom/webidls/Client.webidl +++ b/components/script/dom/webidls/Client.webidl @@ -4,7 +4,7 @@ // https://w3c.github.io/ServiceWorker/#client -[Pref="dom.serviceworker.enabled", Exposed=ServiceWorker] +[Pref="dom_serviceworker_enabled", Exposed=ServiceWorker] interface Client { readonly attribute USVString url; readonly attribute FrameType frameType; diff --git a/components/script/dom/webidls/CompositionEvent.webidl b/components/script/dom/webidls/CompositionEvent.webidl index 1ed323d26b3..3eeba65e29a 100644 --- a/components/script/dom/webidls/CompositionEvent.webidl +++ b/components/script/dom/webidls/CompositionEvent.webidl @@ -8,7 +8,7 @@ */ // https://w3c.github.io/uievents/#idl-compositionevent -[Exposed=Window, Pref="dom.composition_event.enabled"] +[Exposed=Window, Pref="dom_composition_event_enabled"] interface CompositionEvent : UIEvent { [Throws] constructor(DOMString type, optional CompositionEventInit eventInitDict = {}); readonly attribute DOMString data; diff --git a/components/script/dom/webidls/Crypto.webidl b/components/script/dom/webidls/Crypto.webidl index 828273f4afa..cdda53e27ac 100644 --- a/components/script/dom/webidls/Crypto.webidl +++ b/components/script/dom/webidls/Crypto.webidl @@ -13,7 +13,7 @@ partial interface mixin WindowOrWorkerGlobalScope { [Exposed=(Window,Worker)] interface Crypto { - [SecureContext, Pref="dom.crypto.subtle.enabled"] readonly attribute SubtleCrypto subtle; + [SecureContext, Pref="dom_crypto_subtle_enabled"] readonly attribute SubtleCrypto subtle; [Throws] ArrayBufferView getRandomValues(ArrayBufferView array); [SecureContext] DOMString randomUUID(); }; diff --git a/components/script/dom/webidls/CryptoKey.webidl b/components/script/dom/webidls/CryptoKey.webidl index 1cad0097df2..4387ef75d98 100644 --- a/components/script/dom/webidls/CryptoKey.webidl +++ b/components/script/dom/webidls/CryptoKey.webidl @@ -8,7 +8,7 @@ enum KeyType { "public", "private", "secret" }; enum KeyUsage { "encrypt", "decrypt", "sign", "verify", "deriveKey", "deriveBits", "wrapKey", "unwrapKey" }; -[SecureContext, Exposed=(Window,Worker), Serializable, Pref="dom.crypto.subtle.enabled"] +[SecureContext, Exposed=(Window,Worker), Serializable, Pref="dom_crypto_subtle_enabled"] interface CryptoKey { readonly attribute KeyType type; readonly attribute boolean extractable; diff --git a/components/script/dom/webidls/CustomElementRegistry.webidl b/components/script/dom/webidls/CustomElementRegistry.webidl index be3d19b1cdd..818e8892461 100644 --- a/components/script/dom/webidls/CustomElementRegistry.webidl +++ b/components/script/dom/webidls/CustomElementRegistry.webidl @@ -3,7 +3,7 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ // https://html.spec.whatwg.org/multipage/#customelementregistry -[Exposed=Window, Pref="dom.custom_elements.enabled"] +[Exposed=Window, Pref="dom_customelements_enabled"] interface CustomElementRegistry { [Throws, CEReactions] undefined define( diff --git a/components/script/dom/webidls/Element.webidl b/components/script/dom/webidls/Element.webidl index 1a99d5ec480..c7884925541 100644 --- a/components/script/dom/webidls/Element.webidl +++ b/components/script/dom/webidls/Element.webidl @@ -83,7 +83,7 @@ interface Element : Node { [CEReactions, Throws] undefined insertAdjacentHTML(DOMString position, DOMString html); - [Throws, Pref="dom.shadowdom.enabled"] ShadowRoot attachShadow(ShadowRootInit init); + [Throws, Pref="dom_shadowdom_enabled"] ShadowRoot attachShadow(ShadowRootInit init); readonly attribute ShadowRoot? shadowRoot; }; diff --git a/components/script/dom/webidls/ExtendableEvent.webidl b/components/script/dom/webidls/ExtendableEvent.webidl index 0b030873fc5..cf8a42169a0 100644 --- a/components/script/dom/webidls/ExtendableEvent.webidl +++ b/components/script/dom/webidls/ExtendableEvent.webidl @@ -5,7 +5,7 @@ // https://w3c.github.io/ServiceWorker/#extendable-event [Exposed=ServiceWorker, - Pref="dom.serviceworker.enabled"] + Pref="dom_serviceworker_enabled"] interface ExtendableEvent : Event { [Throws] constructor(DOMString type, optional ExtendableEventInit eventInitDict = {}); diff --git a/components/script/dom/webidls/ExtendableMessageEvent.webidl b/components/script/dom/webidls/ExtendableMessageEvent.webidl index 247c08e7989..66fbb46371e 100644 --- a/components/script/dom/webidls/ExtendableMessageEvent.webidl +++ b/components/script/dom/webidls/ExtendableMessageEvent.webidl @@ -5,7 +5,7 @@ // https://w3c.github.io/ServiceWorker/#extendablemessage-event-section [Exposed=ServiceWorker, - Pref="dom.serviceworker.enabled"] + Pref="dom_serviceworker_enabled"] interface ExtendableMessageEvent : ExtendableEvent { [Throws] constructor(DOMString type, optional ExtendableMessageEventInit eventInitDict = {}); readonly attribute any data; diff --git a/components/script/dom/webidls/FakeXRDevice.webidl b/components/script/dom/webidls/FakeXRDevice.webidl index 22a2ddbbd27..dd0bb24b8a4 100644 --- a/components/script/dom/webidls/FakeXRDevice.webidl +++ b/components/script/dom/webidls/FakeXRDevice.webidl @@ -6,7 +6,7 @@ // https://github.com/immersive-web/webxr-test-api/ -[Exposed=Window, Pref="dom.webxr.test"] +[Exposed=Window, Pref="dom_webxr_test"] interface FakeXRDevice { // Sets the values to be used for subsequent requestAnimationFrame() callbacks. [Throws] undefined setViews(sequence views, optional sequence secondaryViews); diff --git a/components/script/dom/webidls/FakeXRInputController.webidl b/components/script/dom/webidls/FakeXRInputController.webidl index 42230c980bb..25237f54c7d 100644 --- a/components/script/dom/webidls/FakeXRInputController.webidl +++ b/components/script/dom/webidls/FakeXRInputController.webidl @@ -6,7 +6,7 @@ // https://immersive-web.github.io/webxr-test-api/#fakexrinputcontroller -[Exposed=Window, Pref="dom.webxr.test"] +[Exposed=Window, Pref="dom_webxr_test"] interface FakeXRInputController { undefined setHandedness(XRHandedness handedness); undefined setTargetRayMode(XRTargetRayMode targetRayMode); diff --git a/components/script/dom/webidls/GPUCanvasContext.webidl b/components/script/dom/webidls/GPUCanvasContext.webidl index b85bb3c9bdf..e83421fa5ea 100644 --- a/components/script/dom/webidls/GPUCanvasContext.webidl +++ b/components/script/dom/webidls/GPUCanvasContext.webidl @@ -3,7 +3,7 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ // https://html.spec.whatwg.org/multipage/#htmlcanvaselement -[Exposed=(Window, DedicatedWorker), Pref="dom.webgpu.enabled"] +[Exposed=(Window, DedicatedWorker), Pref="dom_webgpu_enabled"] interface GPUCanvasContext { readonly attribute (HTMLCanvasElement or OffscreenCanvas) canvas; }; diff --git a/components/script/dom/webidls/Gamepad.webidl b/components/script/dom/webidls/Gamepad.webidl index d716f0c0bc4..bef601c5c7c 100644 --- a/components/script/dom/webidls/Gamepad.webidl +++ b/components/script/dom/webidls/Gamepad.webidl @@ -3,7 +3,7 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ // https://w3c.github.io/gamepad/#gamepad-interface -[Exposed=Window, Pref="dom.gamepad.enabled"] +[Exposed=Window, Pref="dom_gamepad_enabled"] interface Gamepad { readonly attribute DOMString id; readonly attribute long index; diff --git a/components/script/dom/webidls/GamepadButton.webidl b/components/script/dom/webidls/GamepadButton.webidl index 748d47232ac..d4aa41be8d9 100644 --- a/components/script/dom/webidls/GamepadButton.webidl +++ b/components/script/dom/webidls/GamepadButton.webidl @@ -3,7 +3,7 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ // https://w3c.github.io/gamepad/#gamepadbutton-interface -[Exposed=Window, Pref="dom.gamepad.enabled"] +[Exposed=Window, Pref="dom_gamepad_enabled"] interface GamepadButton { readonly attribute boolean pressed; readonly attribute boolean touched; diff --git a/components/script/dom/webidls/GamepadButtonList.webidl b/components/script/dom/webidls/GamepadButtonList.webidl index 34ea9857071..24a82a4b322 100644 --- a/components/script/dom/webidls/GamepadButtonList.webidl +++ b/components/script/dom/webidls/GamepadButtonList.webidl @@ -3,7 +3,7 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ // https://w3c.github.io/gamepad/#dom-gamepad-buttons -[Exposed=Window, Pref="dom.gamepad.enabled"] +[Exposed=Window, Pref="dom_gamepad_enabled"] interface GamepadButtonList { getter GamepadButton? item(unsigned long index); readonly attribute unsigned long length; diff --git a/components/script/dom/webidls/GamepadEvent.webidl b/components/script/dom/webidls/GamepadEvent.webidl index 0da800bafe2..0dc82e4083b 100644 --- a/components/script/dom/webidls/GamepadEvent.webidl +++ b/components/script/dom/webidls/GamepadEvent.webidl @@ -3,7 +3,7 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ // https://w3c.github.io/gamepad/#gamepadevent-interface -[Exposed=Window, Pref="dom.gamepad.enabled"] +[Exposed=Window, Pref="dom_gamepad_enabled"] interface GamepadEvent : Event { [Throws] constructor(DOMString type, GamepadEventInit eventInitDict); readonly attribute Gamepad gamepad; diff --git a/components/script/dom/webidls/GamepadHapticActuator.webidl b/components/script/dom/webidls/GamepadHapticActuator.webidl index 1961da4c541..db6f6eb5f8b 100644 --- a/components/script/dom/webidls/GamepadHapticActuator.webidl +++ b/components/script/dom/webidls/GamepadHapticActuator.webidl @@ -3,7 +3,7 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ // https://w3c.github.io/gamepad/#gamepadhapticactuator-interface -[Exposed=Window, Pref="dom.gamepad.enabled"] +[Exposed=Window, Pref="dom_gamepad_enabled"] interface GamepadHapticActuator { /* [SameObject] */ readonly attribute /* FrozenArray */ any effects; [NewObject] diff --git a/components/script/dom/webidls/GamepadPose.webidl b/components/script/dom/webidls/GamepadPose.webidl index 5afa9f3251e..aeb5411b12b 100644 --- a/components/script/dom/webidls/GamepadPose.webidl +++ b/components/script/dom/webidls/GamepadPose.webidl @@ -3,7 +3,7 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ // https://w3c.github.io/gamepad/extensions.html#gamepadpose-interface -[Exposed=Window, Pref="dom.gamepad.enabled"] +[Exposed=Window, Pref="dom_gamepad_enabled"] interface GamepadPose { readonly attribute boolean hasOrientation; readonly attribute boolean hasPosition; diff --git a/components/script/dom/webidls/HTMLCanvasElement.webidl b/components/script/dom/webidls/HTMLCanvasElement.webidl index cbcb6b4d030..2e7be0389be 100644 --- a/components/script/dom/webidls/HTMLCanvasElement.webidl +++ b/components/script/dom/webidls/HTMLCanvasElement.webidl @@ -29,7 +29,7 @@ interface HTMLCanvasElement : HTMLElement { }; partial interface HTMLCanvasElement { - [Pref="dom.canvas_capture.enabled"] + [Pref="dom_canvas_capture_enabled"] MediaStream captureStream (optional double frameRequestRate); }; diff --git a/components/script/dom/webidls/HTMLElement.webidl b/components/script/dom/webidls/HTMLElement.webidl index a67a13d4be4..76bfada1b94 100644 --- a/components/script/dom/webidls/HTMLElement.webidl +++ b/components/script/dom/webidls/HTMLElement.webidl @@ -24,9 +24,9 @@ interface HTMLElement : Element { // attribute DOMString itemId; //readonly attribute HTMLPropertiesCollection properties; // attribute any itemValue; // acts as DOMString on setting - [Pref="dom.microdata.testing.enabled"] + [Pref="dom_microdata_testing_enabled"] sequence? propertyNames(); - [Pref="dom.microdata.testing.enabled"] + [Pref="dom_microdata_testing_enabled"] sequence? itemtypes(); // user interaction diff --git a/components/script/dom/webidls/HTMLInputElement.webidl b/components/script/dom/webidls/HTMLInputElement.webidl index 519198cebd9..724f2cff9b5 100644 --- a/components/script/dom/webidls/HTMLInputElement.webidl +++ b/components/script/dom/webidls/HTMLInputElement.webidl @@ -109,7 +109,7 @@ interface HTMLInputElement : HTMLElement { // also has obsolete members // Select with file-system paths for testing purpose - [Pref="dom.testing.htmlinputelement.select_files.enabled"] + [Pref="dom_testing_html_input_element_select_files_enabled"] undefined selectFiles(sequence path); }; diff --git a/components/script/dom/webidls/HTMLVideoElement.webidl b/components/script/dom/webidls/HTMLVideoElement.webidl index d9e6b86e4bb..f4550e9857b 100644 --- a/components/script/dom/webidls/HTMLVideoElement.webidl +++ b/components/script/dom/webidls/HTMLVideoElement.webidl @@ -17,6 +17,6 @@ interface HTMLVideoElement : HTMLMediaElement { }; partial interface HTMLVideoElement { - [Pref="media.testing.enabled"] + [Pref="media_testing_enabled"] attribute EventHandler onpostershown; }; diff --git a/components/script/dom/webidls/ImageBitmap.webidl b/components/script/dom/webidls/ImageBitmap.webidl index e2ace645e74..aaa35c67995 100644 --- a/components/script/dom/webidls/ImageBitmap.webidl +++ b/components/script/dom/webidls/ImageBitmap.webidl @@ -10,7 +10,7 @@ */ //[Exposed=(Window,Worker), Serializable, Transferable] -[Exposed=(Window,Worker), Pref="dom.imagebitmap.enabled"] +[Exposed=(Window,Worker), Pref="dom_imagebitmap_enabled"] interface ImageBitmap { readonly attribute unsigned long width; readonly attribute unsigned long height; diff --git a/components/script/dom/webidls/IntersectionObserver.webidl b/components/script/dom/webidls/IntersectionObserver.webidl index dc24a856363..9607864408e 100644 --- a/components/script/dom/webidls/IntersectionObserver.webidl +++ b/components/script/dom/webidls/IntersectionObserver.webidl @@ -16,7 +16,7 @@ dictionary IntersectionObserverInit { boolean trackVisibility = false; }; -[Pref="dom.intersection_observer.enabled", Exposed=(Window)] +[Pref="dom_intersection_observer_enabled", Exposed=(Window)] interface IntersectionObserver { constructor(IntersectionObserverCallback callback, optional IntersectionObserverInit options = {}); readonly attribute (Element or Document)? root; diff --git a/components/script/dom/webidls/IntersectionObserverEntry.webidl b/components/script/dom/webidls/IntersectionObserverEntry.webidl index 108ad6636de..5e9423a965c 100644 --- a/components/script/dom/webidls/IntersectionObserverEntry.webidl +++ b/components/script/dom/webidls/IntersectionObserverEntry.webidl @@ -4,7 +4,7 @@ // https://w3c.github.io/IntersectionObserver/#intersection-observer-entry -[Pref="dom.intersection_observer.enabled", Exposed=(Window)] +[Pref="dom_intersection_observer_enabled", Exposed=(Window)] interface IntersectionObserverEntry { constructor(IntersectionObserverEntryInit intersectionObserverEntryInit); readonly attribute DOMHighResTimeStamp time; diff --git a/components/script/dom/webidls/MediaDeviceInfo.webidl b/components/script/dom/webidls/MediaDeviceInfo.webidl index ab24f8046f9..d6caaa43499 100644 --- a/components/script/dom/webidls/MediaDeviceInfo.webidl +++ b/components/script/dom/webidls/MediaDeviceInfo.webidl @@ -5,7 +5,7 @@ // https://w3c.github.io/mediacapture-main/#device-info [Exposed=Window, -SecureContext, Pref="dom.webrtc.enabled"] +SecureContext, Pref="dom_webrtc_enabled"] interface MediaDeviceInfo { readonly attribute DOMString deviceId; readonly attribute MediaDeviceKind kind; diff --git a/components/script/dom/webidls/MediaDevices.webidl b/components/script/dom/webidls/MediaDevices.webidl index 53e6c3599a4..8d14e60abb5 100644 --- a/components/script/dom/webidls/MediaDevices.webidl +++ b/components/script/dom/webidls/MediaDevices.webidl @@ -5,7 +5,7 @@ // https://w3c.github.io/mediacapture-main/#dom-mediadevices [Exposed=Window, -SecureContext, Pref="dom.webrtc.enabled"] +SecureContext, Pref="dom_webrtc_enabled"] interface MediaDevices : EventTarget { // attribute EventHandler ondevicechange; Promise> enumerateDevices(); @@ -13,7 +13,7 @@ interface MediaDevices : EventTarget { partial interface Navigator { // [SameObject, SecureContext] - [Pref="dom.webrtc.enabled"] readonly attribute MediaDevices mediaDevices; + [Pref="dom_webrtc_enabled"] readonly attribute MediaDevices mediaDevices; }; partial interface MediaDevices { diff --git a/components/script/dom/webidls/MouseEvent.webidl b/components/script/dom/webidls/MouseEvent.webidl index ba717f724a4..0a3c5c015fd 100644 --- a/components/script/dom/webidls/MouseEvent.webidl +++ b/components/script/dom/webidls/MouseEvent.webidl @@ -26,7 +26,7 @@ interface MouseEvent : UIEvent { readonly attribute unsigned short buttons; //boolean getModifierState (DOMString keyArg); - [Pref="dom.mouseevent.which.enabled"] + [Pref="dom_mouse_event_which_enabled"] readonly attribute long which; }; diff --git a/components/script/dom/webidls/MutationObserver.webidl b/components/script/dom/webidls/MutationObserver.webidl index baa9a1a79b0..4f643c7b222 100644 --- a/components/script/dom/webidls/MutationObserver.webidl +++ b/components/script/dom/webidls/MutationObserver.webidl @@ -7,7 +7,7 @@ */ // https://dom.spec.whatwg.org/#mutationobserver -[Exposed=Window, Pref="dom.mutation_observer.enabled"] +[Exposed=Window, Pref="dom_mutation_observer_enabled"] interface MutationObserver { [Throws] constructor(MutationCallback callback); [Throws] diff --git a/components/script/dom/webidls/MutationRecord.webidl b/components/script/dom/webidls/MutationRecord.webidl index 2c08fcea71f..edc5c9e8825 100644 --- a/components/script/dom/webidls/MutationRecord.webidl +++ b/components/script/dom/webidls/MutationRecord.webidl @@ -7,7 +7,7 @@ */ // https://dom.spec.whatwg.org/#mutationrecord -[Pref="dom.mutation_observer.enabled", Exposed=Window] +[Pref="dom_mutation_observer_enabled", Exposed=Window] interface MutationRecord { readonly attribute DOMString type; [SameObject] diff --git a/components/script/dom/webidls/NavigationPreloadManager.webidl b/components/script/dom/webidls/NavigationPreloadManager.webidl index 1c2e4d09189..026bcafea13 100644 --- a/components/script/dom/webidls/NavigationPreloadManager.webidl +++ b/components/script/dom/webidls/NavigationPreloadManager.webidl @@ -3,7 +3,7 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ // https://w3c.github.io/ServiceWorker/#navigation-preload-manager -[Pref="dom.serviceworker.enabled", SecureContext, Exposed=(Window,Worker)] +[Pref="dom_serviceworker_enabled", SecureContext, Exposed=(Window,Worker)] interface NavigationPreloadManager { Promise enable(); Promise disable(); diff --git a/components/script/dom/webidls/Navigator.webidl b/components/script/dom/webidls/Navigator.webidl index 2fcef010b4a..05fbdf62024 100644 --- a/components/script/dom/webidls/Navigator.webidl +++ b/components/script/dom/webidls/Navigator.webidl @@ -33,12 +33,12 @@ interface mixin NavigatorID { // https://webbluetoothcg.github.io/web-bluetooth/#navigator-extensions partial interface Navigator { - [SameObject, Pref="dom.bluetooth.enabled"] readonly attribute Bluetooth bluetooth; + [SameObject, Pref="dom_bluetooth_enabled"] readonly attribute Bluetooth bluetooth; }; // https://w3c.github.io/ServiceWorker/#navigator-service-worker partial interface Navigator { - [SameObject, Pref="dom.serviceworker.enabled"] readonly attribute ServiceWorkerContainer serviceWorker; + [SameObject, Pref="dom_serviceworker_enabled"] readonly attribute ServiceWorkerContainer serviceWorker; }; // https://html.spec.whatwg.org/multipage/#navigatorlanguage @@ -63,12 +63,12 @@ interface mixin NavigatorCookies { // https://w3c.github.io/permissions/#navigator-and-workernavigator-extension [Exposed=(Window)] partial interface Navigator { - [Pref="dom.permissions.enabled"] readonly attribute Permissions permissions; + [Pref="dom_permissions_enabled"] readonly attribute Permissions permissions; }; // https://w3c.github.io/gamepad/#navigator-interface-extension partial interface Navigator { - [Pref="dom.gamepad.enabled"] sequence getGamepads(); + [Pref="dom_gamepad_enabled"] sequence getGamepads(); }; // https://html.spec.whatwg.org/multipage/#navigatorconcurrenthardware diff --git a/components/script/dom/webidls/OffscreenCanvas.webidl b/components/script/dom/webidls/OffscreenCanvas.webidl index 04c28f989a5..cc19cefa868 100644 --- a/components/script/dom/webidls/OffscreenCanvas.webidl +++ b/components/script/dom/webidls/OffscreenCanvas.webidl @@ -13,7 +13,7 @@ dictionary ImageEncodeOptions { //enum OffscreenRenderingContextId { "2d", "webgl", "webgl2" }; -[Exposed=(Window,Worker)/*, Transferable*/, Pref="dom.offscreen_canvas.enabled"] +[Exposed=(Window,Worker)/*, Transferable*/, Pref="dom_offscreen_canvas_enabled"] interface OffscreenCanvas : EventTarget { [Throws] constructor([EnforceRange] unsigned long long width, [EnforceRange] unsigned long long height); attribute [EnforceRange] unsigned long long width; diff --git a/components/script/dom/webidls/OffscreenCanvasRenderingContext2D.webidl b/components/script/dom/webidls/OffscreenCanvasRenderingContext2D.webidl index c129bfa8e47..5d6aef5e014 100644 --- a/components/script/dom/webidls/OffscreenCanvasRenderingContext2D.webidl +++ b/components/script/dom/webidls/OffscreenCanvasRenderingContext2D.webidl @@ -3,7 +3,7 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ // https://html.spec.whatwg.org/multipage/#the-offscreen-2d-rendering-context -[Exposed=(Window,Worker), Pref="dom.offscreen_canvas.enabled"] +[Exposed=(Window,Worker), Pref="dom_offscreen_canvas_enabled"] interface OffscreenCanvasRenderingContext2D { //void commit(); readonly attribute OffscreenCanvas canvas; diff --git a/components/script/dom/webidls/PaintRenderingContext2D.webidl b/components/script/dom/webidls/PaintRenderingContext2D.webidl index bc415450358..8361c298866 100644 --- a/components/script/dom/webidls/PaintRenderingContext2D.webidl +++ b/components/script/dom/webidls/PaintRenderingContext2D.webidl @@ -3,7 +3,7 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ // https://drafts.css-houdini.org/css-paint-api/#paintrenderingcontext2d -[Pref="dom.worklet.enabled", Exposed=PaintWorklet] +[Pref="dom_worklet_enabled", Exposed=PaintWorklet] interface PaintRenderingContext2D { }; PaintRenderingContext2D includes CanvasState; diff --git a/components/script/dom/webidls/PaintSize.webidl b/components/script/dom/webidls/PaintSize.webidl index ed1b46d29f4..2c3e669d32e 100644 --- a/components/script/dom/webidls/PaintSize.webidl +++ b/components/script/dom/webidls/PaintSize.webidl @@ -3,7 +3,7 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ // https://drafts.css-houdini.org/css-paint-api/#paintsize -[Pref="dom.worklet.enabled", Exposed=PaintWorklet] +[Pref="dom_worklet_enabled", Exposed=PaintWorklet] interface PaintSize { readonly attribute double width; readonly attribute double height; diff --git a/components/script/dom/webidls/PaintWorkletGlobalScope.webidl b/components/script/dom/webidls/PaintWorkletGlobalScope.webidl index 981df09321f..a5918c06616 100644 --- a/components/script/dom/webidls/PaintWorkletGlobalScope.webidl +++ b/components/script/dom/webidls/PaintWorkletGlobalScope.webidl @@ -3,11 +3,11 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ // https://drafts.css-houdini.org/css-paint-api/#paintworkletglobalscope -[Global=(Worklet,PaintWorklet), Pref="dom.worklet.enabled", Exposed=PaintWorklet] +[Global=(Worklet,PaintWorklet), Pref="dom_worklet_enabled", Exposed=PaintWorklet] interface PaintWorkletGlobalScope : WorkletGlobalScope { [Throws] undefined registerPaint(DOMString name, VoidFunction paintCtor); // This function is to be used only for testing, and should not be // accessible outside of that use. - [Pref="dom.worklet.blockingsleep.enabled"] + [Pref="dom_worklet_blockingsleep_enabled"] undefined sleep(unsigned long long ms); }; diff --git a/components/script/dom/webidls/PerformanceNavigationTiming.webidl b/components/script/dom/webidls/PerformanceNavigationTiming.webidl index 8bd657dbdfb..4757e7fd7d0 100644 --- a/components/script/dom/webidls/PerformanceNavigationTiming.webidl +++ b/components/script/dom/webidls/PerformanceNavigationTiming.webidl @@ -27,6 +27,6 @@ interface PerformanceNavigationTiming : PerformanceResourceTiming { readonly attribute unsigned short redirectCount; [Default] object toJSON(); /* Servo-only attribute for measuring when the top-level document (not iframes) is complete. */ - [Pref="dom.testperf.enabled"] + [Pref="dom_testperf_enabled"] readonly attribute DOMHighResTimeStamp topLevelDomComplete; }; diff --git a/components/script/dom/webidls/PermissionStatus.webidl b/components/script/dom/webidls/PermissionStatus.webidl index 83c0371e0de..a5aebda20dd 100644 --- a/components/script/dom/webidls/PermissionStatus.webidl +++ b/components/script/dom/webidls/PermissionStatus.webidl @@ -28,7 +28,7 @@ enum PermissionName { "persistent-storage", }; -[Pref="dom.permissions.enabled", Exposed=(Window,Worker)] +[Pref="dom_permissions_enabled", Exposed=(Window,Worker)] interface PermissionStatus : EventTarget { readonly attribute PermissionState state; attribute EventHandler onchange; diff --git a/components/script/dom/webidls/Permissions.webidl b/components/script/dom/webidls/Permissions.webidl index 5b4092cc645..21e20eb2bf5 100644 --- a/components/script/dom/webidls/Permissions.webidl +++ b/components/script/dom/webidls/Permissions.webidl @@ -4,7 +4,7 @@ // https://w3c.github.io/permissions/#permissions-interface -[Pref="dom.permissions.enabled", Exposed=(Window,Worker)] +[Pref="dom_permissions_enabled", Exposed=(Window,Worker)] interface Permissions { Promise query(object permissionDesc); diff --git a/components/script/dom/webidls/RTCDataChannel.webidl b/components/script/dom/webidls/RTCDataChannel.webidl index e67c299bcea..419b05bd3f9 100644 --- a/components/script/dom/webidls/RTCDataChannel.webidl +++ b/components/script/dom/webidls/RTCDataChannel.webidl @@ -4,7 +4,7 @@ // https://w3c.github.io/webrtc-pc/#dom-rtcdatachannel -[Exposed=Window, Pref="dom.webrtc.enabled"] +[Exposed=Window, Pref="dom_webrtc_enabled"] interface RTCDataChannel : EventTarget { readonly attribute USVString label; readonly attribute boolean ordered; diff --git a/components/script/dom/webidls/RTCDataChannelEvent.webidl b/components/script/dom/webidls/RTCDataChannelEvent.webidl index bc564a12138..5d2a8e6df24 100644 --- a/components/script/dom/webidls/RTCDataChannelEvent.webidl +++ b/components/script/dom/webidls/RTCDataChannelEvent.webidl @@ -4,7 +4,7 @@ // https://w3c.github.io/webrtc-pc/#dom-rtcdatachannelevent -[Exposed=Window, Pref="dom.webrtc.enabled"] +[Exposed=Window, Pref="dom_webrtc_enabled"] interface RTCDataChannelEvent : Event { constructor(DOMString type, RTCDataChannelEventInit eventInitDict); readonly attribute RTCDataChannel channel; diff --git a/components/script/dom/webidls/RTCError.webidl b/components/script/dom/webidls/RTCError.webidl index f7ffa3d2d57..a745cf5e77f 100644 --- a/components/script/dom/webidls/RTCError.webidl +++ b/components/script/dom/webidls/RTCError.webidl @@ -4,7 +4,7 @@ // https://w3c.github.io/webrtc-pc/#dom-rtcerror -[Exposed=Window, Pref="dom.webrtc.enabled"] +[Exposed=Window, Pref="dom_webrtc_enabled"] interface RTCError : DOMException { constructor(RTCErrorInit init, optional DOMString message = ""); readonly attribute RTCErrorDetailType errorDetail; diff --git a/components/script/dom/webidls/RTCErrorEvent.webidl b/components/script/dom/webidls/RTCErrorEvent.webidl index d3ac256744c..c5b7c3e9cc8 100644 --- a/components/script/dom/webidls/RTCErrorEvent.webidl +++ b/components/script/dom/webidls/RTCErrorEvent.webidl @@ -4,7 +4,7 @@ // https://w3c.github.io/webrtc-pc/#dom-rtcerrorevent -[Exposed=Window, Pref="dom.webrtc.enabled"] +[Exposed=Window, Pref="dom_webrtc_enabled"] interface RTCErrorEvent : Event { constructor(DOMString type, RTCErrorEventInit eventInitDict); [SameObject] readonly attribute RTCError error; diff --git a/components/script/dom/webidls/RTCIceCandidate.webidl b/components/script/dom/webidls/RTCIceCandidate.webidl index fde0421c8c0..266fe353f37 100644 --- a/components/script/dom/webidls/RTCIceCandidate.webidl +++ b/components/script/dom/webidls/RTCIceCandidate.webidl @@ -5,7 +5,7 @@ // https://w3c.github.io/webrtc-pc/#rtcicecandidate-interface -[Exposed=Window, Pref="dom.webrtc.enabled"] +[Exposed=Window, Pref="dom_webrtc_enabled"] interface RTCIceCandidate { [Throws] constructor(optional RTCIceCandidateInit candidateInitDict = {}); readonly attribute DOMString candidate; diff --git a/components/script/dom/webidls/RTCPeerConnection.webidl b/components/script/dom/webidls/RTCPeerConnection.webidl index 85a7297fce1..24ced7bcce6 100644 --- a/components/script/dom/webidls/RTCPeerConnection.webidl +++ b/components/script/dom/webidls/RTCPeerConnection.webidl @@ -4,7 +4,7 @@ // https://w3c.github.io/webrtc-pc/#interface-definition -[Exposed=Window, Pref="dom.webrtc.enabled"] +[Exposed=Window, Pref="dom_webrtc_enabled"] interface RTCPeerConnection : EventTarget { [Throws] constructor(optional RTCConfiguration configuration = {}); Promise createOffer(optional RTCOfferOptions options = {}); @@ -138,7 +138,7 @@ partial interface RTCPeerConnection { // RTCRtpSender addTrack(MediaStreamTrack track, // MediaStream... streams); // void removeTrack(RTCRtpSender sender); - [Pref="dom.webrtc.transceiver.enabled"] + [Pref="dom_webrtc_transceiver_enabled"] RTCRtpTransceiver addTransceiver((MediaStreamTrack or DOMString) trackOrKind, optional RTCRtpTransceiverInit init = {}); attribute EventHandler ontrack; diff --git a/components/script/dom/webidls/RTCPeerConnectionIceEvent.webidl b/components/script/dom/webidls/RTCPeerConnectionIceEvent.webidl index 2ffd69cea50..95094c45f3b 100644 --- a/components/script/dom/webidls/RTCPeerConnectionIceEvent.webidl +++ b/components/script/dom/webidls/RTCPeerConnectionIceEvent.webidl @@ -4,7 +4,7 @@ // https://w3c.github.io/webrtc-pc/#rtcpeerconnectioniceevent -[Exposed=Window, Pref="dom.webrtc.enabled"] +[Exposed=Window, Pref="dom_webrtc_enabled"] interface RTCPeerConnectionIceEvent : Event { [Throws] constructor(DOMString type, optional RTCPeerConnectionIceEventInit eventInitDict = {}); readonly attribute RTCIceCandidate? candidate; diff --git a/components/script/dom/webidls/RTCRtpSender.webidl b/components/script/dom/webidls/RTCRtpSender.webidl index 752ab7682b8..938ca9e8a63 100644 --- a/components/script/dom/webidls/RTCRtpSender.webidl +++ b/components/script/dom/webidls/RTCRtpSender.webidl @@ -34,7 +34,7 @@ dictionary RTCRtpSendParameters : RTCRtpParameters { required sequence encodings; }; -[Exposed=Window, Pref="dom.webrtc.transceiver.enabled"] +[Exposed=Window, Pref="dom_webrtc_transceiver_enabled"] interface RTCRtpSender { //readonly attribute MediaStreamTrack? track; //readonly attribute RTCDtlsTransport? transport; diff --git a/components/script/dom/webidls/RTCRtpTransceiver.webidl b/components/script/dom/webidls/RTCRtpTransceiver.webidl index 408c2708709..f11b9853682 100644 --- a/components/script/dom/webidls/RTCRtpTransceiver.webidl +++ b/components/script/dom/webidls/RTCRtpTransceiver.webidl @@ -4,7 +4,7 @@ // https://w3c.github.io/webrtc-pc/#rtcrtptransceiver-interface -[Exposed=Window, Pref="dom.webrtc.transceiver.enabled"] +[Exposed=Window, Pref="dom_webrtc_transceiver_enabled"] interface RTCRtpTransceiver { //readonly attribute DOMString? mid; [SameObject] readonly attribute RTCRtpSender sender; diff --git a/components/script/dom/webidls/RTCSessionDescription.webidl b/components/script/dom/webidls/RTCSessionDescription.webidl index f13d0fd0d9f..0fb325eae41 100644 --- a/components/script/dom/webidls/RTCSessionDescription.webidl +++ b/components/script/dom/webidls/RTCSessionDescription.webidl @@ -4,7 +4,7 @@ // https://w3c.github.io/webrtc-pc/#rtcsessiondescription-class -[Exposed=Window, Pref="dom.webrtc.enabled"] +[Exposed=Window, Pref="dom_webrtc_enabled"] interface RTCSessionDescription { [Throws] constructor(RTCSessionDescriptionInit descriptionInitDict); readonly attribute RTCSdpType type; diff --git a/components/script/dom/webidls/RTCTrackEvent.webidl b/components/script/dom/webidls/RTCTrackEvent.webidl index c2283e5a803..c43b86710b4 100644 --- a/components/script/dom/webidls/RTCTrackEvent.webidl +++ b/components/script/dom/webidls/RTCTrackEvent.webidl @@ -4,7 +4,7 @@ // https://w3c.github.io/webrtc-pc/#dom-rtctrackevent -[Exposed=Window, Pref="dom.webrtc.enabled"] +[Exposed=Window, Pref="dom_webrtc_enabled"] interface RTCTrackEvent : Event { [Throws] constructor(DOMString type, RTCTrackEventInit eventInitDict); // readonly attribute RTCRtpReceiver receiver; diff --git a/components/script/dom/webidls/ResizeObserver.webidl b/components/script/dom/webidls/ResizeObserver.webidl index fc0a87589d5..2f3b9064477 100644 --- a/components/script/dom/webidls/ResizeObserver.webidl +++ b/components/script/dom/webidls/ResizeObserver.webidl @@ -4,7 +4,7 @@ // https://drafts.csswg.org/resize-observer/#resize-observer-interface -[Pref="dom.resize_observer.enabled", Exposed=(Window)] +[Pref="dom_resize_observer_enabled", Exposed=(Window)] interface ResizeObserver { constructor(ResizeObserverCallback callback); undefined observe(Element target, optional ResizeObserverOptions options = {}); diff --git a/components/script/dom/webidls/ResizeObserverEntry.webidl b/components/script/dom/webidls/ResizeObserverEntry.webidl index 8cb8802023a..0b7b5c2f5a9 100644 --- a/components/script/dom/webidls/ResizeObserverEntry.webidl +++ b/components/script/dom/webidls/ResizeObserverEntry.webidl @@ -4,7 +4,7 @@ // https://drafts.csswg.org/resize-observer/#resize-observer-entry-interface -[Pref="dom.resize_observer.enabled", Exposed=Window] +[Pref="dom_resize_observer_enabled", Exposed=Window] interface ResizeObserverEntry { readonly attribute Element target; readonly attribute DOMRectReadOnly contentRect; diff --git a/components/script/dom/webidls/ResizeObserverSize.webidl b/components/script/dom/webidls/ResizeObserverSize.webidl index 5cc8db2dbcd..e4bcb1ace78 100644 --- a/components/script/dom/webidls/ResizeObserverSize.webidl +++ b/components/script/dom/webidls/ResizeObserverSize.webidl @@ -4,7 +4,7 @@ // https://drafts.csswg.org/resize-observer/#resizeobserversize -[Pref="dom.resize_observer.enabled", Exposed=Window] +[Pref="dom_resize_observer_enabled", Exposed=Window] interface ResizeObserverSize { readonly attribute unrestricted double inlineSize; readonly attribute unrestricted double blockSize; diff --git a/components/script/dom/webidls/SVGElement.webidl b/components/script/dom/webidls/SVGElement.webidl index e826c741e66..e6bc468d5dc 100644 --- a/components/script/dom/webidls/SVGElement.webidl +++ b/components/script/dom/webidls/SVGElement.webidl @@ -3,7 +3,7 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ // https://svgwg.org/svg2-draft/types.html#InterfaceSVGElement -[Exposed=Window, Pref="dom.svg.enabled"] +[Exposed=Window, Pref="dom_svg_enabled"] interface SVGElement : Element { //[SameObject] readonly attribute SVGAnimatedString className; diff --git a/components/script/dom/webidls/SVGGraphicsElement.webidl b/components/script/dom/webidls/SVGGraphicsElement.webidl index 052182e374d..ab08503e7ef 100644 --- a/components/script/dom/webidls/SVGGraphicsElement.webidl +++ b/components/script/dom/webidls/SVGGraphicsElement.webidl @@ -10,7 +10,7 @@ // boolean clipped = false; //}; -[Exposed=Window, Abstract, Pref="dom.svg.enabled"] +[Exposed=Window, Abstract, Pref="dom_svg_enabled"] interface SVGGraphicsElement : SVGElement { //[SameObject] readonly attribute SVGAnimatedTransformList transform; diff --git a/components/script/dom/webidls/SVGSVGElement.webidl b/components/script/dom/webidls/SVGSVGElement.webidl index 0e61776a40e..25b390cf15a 100644 --- a/components/script/dom/webidls/SVGSVGElement.webidl +++ b/components/script/dom/webidls/SVGSVGElement.webidl @@ -3,7 +3,7 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ // https://svgwg.org/svg2-draft/struct.html#InterfaceSVGSVGElement -[Exposed=Window, Pref="dom.svg.enabled"] +[Exposed=Window, Pref="dom_svg_enabled"] interface SVGSVGElement : SVGGraphicsElement { //[SameObject] readonly attribute SVGAnimatedLength x; diff --git a/components/script/dom/webidls/ServiceWorker.webidl b/components/script/dom/webidls/ServiceWorker.webidl index a5bc8938602..ee12c92b6e2 100644 --- a/components/script/dom/webidls/ServiceWorker.webidl +++ b/components/script/dom/webidls/ServiceWorker.webidl @@ -3,7 +3,7 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ // https://w3c.github.io/ServiceWorker/#serviceworker-interface -[Pref="dom.serviceworker.enabled", SecureContext, Exposed=(Window,Worker)] +[Pref="dom_serviceworker_enabled", SecureContext, Exposed=(Window,Worker)] interface ServiceWorker : EventTarget { readonly attribute USVString scriptURL; readonly attribute ServiceWorkerState state; diff --git a/components/script/dom/webidls/ServiceWorkerContainer.webidl b/components/script/dom/webidls/ServiceWorkerContainer.webidl index 18deb5e58f4..540079583b9 100644 --- a/components/script/dom/webidls/ServiceWorkerContainer.webidl +++ b/components/script/dom/webidls/ServiceWorkerContainer.webidl @@ -3,7 +3,7 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ // https://w3c.github.io/ServiceWorker/#serviceworkercontainer-interface -[Pref="dom.serviceworker.enabled", Exposed=(Window,Worker)] +[Pref="dom_serviceworker_enabled", Exposed=(Window,Worker)] interface ServiceWorkerContainer : EventTarget { readonly attribute ServiceWorker? controller; //readonly attribute Promise ready; diff --git a/components/script/dom/webidls/ServiceWorkerGlobalScope.webidl b/components/script/dom/webidls/ServiceWorkerGlobalScope.webidl index 257f3ff3252..f7535867deb 100644 --- a/components/script/dom/webidls/ServiceWorkerGlobalScope.webidl +++ b/components/script/dom/webidls/ServiceWorkerGlobalScope.webidl @@ -5,7 +5,7 @@ // https://w3c.github.io/ServiceWorker/#serviceworkerglobalscope [Global=(Worker,ServiceWorker), Exposed=ServiceWorker, - Pref="dom.serviceworker.enabled"] + Pref="dom_serviceworker_enabled"] interface ServiceWorkerGlobalScope : WorkerGlobalScope { // A container for a list of Client objects that correspond to // browsing contexts (or shared workers) that are on the origin of this SW diff --git a/components/script/dom/webidls/ServiceWorkerRegistration.webidl b/components/script/dom/webidls/ServiceWorkerRegistration.webidl index f7a10659513..29982ee8ec3 100644 --- a/components/script/dom/webidls/ServiceWorkerRegistration.webidl +++ b/components/script/dom/webidls/ServiceWorkerRegistration.webidl @@ -3,7 +3,7 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ // https://w3c.github.io/ServiceWorker/#serviceworkerregistration-interface -[Pref="dom.serviceworker.enabled", SecureContext, Exposed=(Window,Worker)] +[Pref="dom_serviceworker_enabled", SecureContext, Exposed=(Window,Worker)] interface ServiceWorkerRegistration : EventTarget { readonly attribute ServiceWorker? installing; readonly attribute ServiceWorker? waiting; diff --git a/components/script/dom/webidls/StylePropertyMapReadOnly.webidl b/components/script/dom/webidls/StylePropertyMapReadOnly.webidl index 7f3860ee701..b427ebd7ba0 100644 --- a/components/script/dom/webidls/StylePropertyMapReadOnly.webidl +++ b/components/script/dom/webidls/StylePropertyMapReadOnly.webidl @@ -4,7 +4,7 @@ // https://drafts.css-houdini.org/css-typed-om-1/#stylepropertymapreadonly // NOTE: should this be exposed to Window? -[Pref="dom.worklet.enabled", Exposed=(Worklet)] +[Pref="dom_worklet_enabled", Exposed=(Worklet)] interface StylePropertyMapReadOnly { CSSStyleValue? get(DOMString property); // sequence getAll(DOMString property); diff --git a/components/script/dom/webidls/SubtleCrypto.webidl b/components/script/dom/webidls/SubtleCrypto.webidl index be01cebf589..e0bc1bc04a5 100644 --- a/components/script/dom/webidls/SubtleCrypto.webidl +++ b/components/script/dom/webidls/SubtleCrypto.webidl @@ -18,7 +18,7 @@ dictionary KeyAlgorithm { enum KeyFormat { "raw", "spki", "pkcs8", "jwk" }; -[SecureContext,Exposed=(Window,Worker),Pref="dom.crypto.subtle.enabled"] +[SecureContext,Exposed=(Window,Worker),Pref="dom_crypto_subtle_enabled"] interface SubtleCrypto { Promise encrypt(AlgorithmIdentifier algorithm, CryptoKey key, diff --git a/components/script/dom/webidls/TestBinding.webidl b/components/script/dom/webidls/TestBinding.webidl index bd6cb2432a4..ee13ed57d55 100644 --- a/components/script/dom/webidls/TestBinding.webidl +++ b/components/script/dom/webidls/TestBinding.webidl @@ -100,7 +100,7 @@ dictionary TestURLLike { required DOMString href; }; -[Pref="dom.testbinding.enabled", +[Pref="dom_testbinding_enabled", Exposed=(Window,Worker) ] interface TestBinding { @@ -516,28 +516,28 @@ interface TestBinding { boolean BooleanMozPreference(DOMString pref_name); DOMString StringMozPreference(DOMString pref_name); - [Pref="dom.testbinding.prefcontrolled.enabled"] + [Pref="dom_testbinding_prefcontrolled_enabled"] readonly attribute boolean prefControlledAttributeDisabled; - [Pref="dom.testbinding.prefcontrolled.enabled"] + [Pref="dom_testbinding_prefcontrolled_enabled"] static readonly attribute boolean prefControlledStaticAttributeDisabled; - [Pref="dom.testbinding.prefcontrolled.enabled"] + [Pref="dom_testbinding_prefcontrolled_enabled"] undefined prefControlledMethodDisabled(); - [Pref="dom.testbinding.prefcontrolled.enabled"] + [Pref="dom_testbinding_prefcontrolled_enabled"] static undefined prefControlledStaticMethodDisabled(); - [Pref="dom.testbinding.prefcontrolled.enabled"] + [Pref="dom_testbinding_prefcontrolled_enabled"] const unsigned short prefControlledConstDisabled = 0; - [Pref="layout.animations.test.enabled"] + [Pref="layout_animations_test_enabled"] undefined advanceClock(long millis); - [Pref="dom.testbinding.prefcontrolled2.enabled"] + [Pref="dom_testbinding_prefcontrolled2_enabled"] readonly attribute boolean prefControlledAttributeEnabled; - [Pref="dom.testbinding.prefcontrolled2.enabled"] + [Pref="dom_testbinding_prefcontrolled2_enabled"] static readonly attribute boolean prefControlledStaticAttributeEnabled; - [Pref="dom.testbinding.prefcontrolled2.enabled"] + [Pref="dom_testbinding_prefcontrolled2_enabled"] undefined prefControlledMethodEnabled(); - [Pref="dom.testbinding.prefcontrolled2.enabled"] + [Pref="dom_testbinding_prefcontrolled2_enabled"] static undefined prefControlledStaticMethodEnabled(); - [Pref="dom.testbinding.prefcontrolled2.enabled"] + [Pref="dom_testbinding_prefcontrolled2_enabled"] const unsigned short prefControlledConstEnabled = 0; [Func="TestBinding::condition_unsatisfied"] @@ -609,11 +609,11 @@ callback SimpleCallback = undefined(any value); callback callbackWithOnlyOneOptionalArg = Promise (optional any reason); partial interface TestBinding { - [Pref="dom.testable_crash.enabled"] + [Pref="dom_testable_crash_enabled"] undefined crashHard(); }; -[Exposed=(Window,Worker), Pref="dom.testbinding.enabled"] +[Exposed=(Window,Worker), Pref="dom_testbinding_enabled"] namespace TestNS { const unsigned long ONE = 1; const unsigned long TWO = 0x2; diff --git a/components/script/dom/webidls/TestBindingIterable.webidl b/components/script/dom/webidls/TestBindingIterable.webidl index 46a2d319e3d..cc7628af707 100644 --- a/components/script/dom/webidls/TestBindingIterable.webidl +++ b/components/script/dom/webidls/TestBindingIterable.webidl @@ -5,7 +5,7 @@ // This interface is entirely internal to Servo, and should not be accessible to // web pages. -[Pref="dom.testbinding.enabled", Exposed=(Window,Worker)] +[Pref="dom_testbinding_enabled", Exposed=(Window,Worker)] interface TestBindingIterable { [Throws] constructor(); undefined add(DOMString arg); diff --git a/components/script/dom/webidls/TestBindingMaplike.webidl b/components/script/dom/webidls/TestBindingMaplike.webidl index f9712d63a8a..8debb804a3e 100644 --- a/components/script/dom/webidls/TestBindingMaplike.webidl +++ b/components/script/dom/webidls/TestBindingMaplike.webidl @@ -5,7 +5,7 @@ // This interface is entirely internal to Servo, and should not be accessible to // web pages. -[Pref="dom.testbinding.enabled", Exposed=(Window,Worker)] +[Pref="dom_testbinding_enabled", Exposed=(Window,Worker)] interface TestBindingMaplike { [Throws] constructor(); diff --git a/components/script/dom/webidls/TestBindingPairIterable.webidl b/components/script/dom/webidls/TestBindingPairIterable.webidl index 64499e7464c..e3106949e3e 100644 --- a/components/script/dom/webidls/TestBindingPairIterable.webidl +++ b/components/script/dom/webidls/TestBindingPairIterable.webidl @@ -5,7 +5,7 @@ // This interface is entirely internal to Servo, and should not be accessible to // web pages. -[Pref="dom.testbinding.enabled", Exposed=(Window,Worker)] +[Pref="dom_testbinding_enabled", Exposed=(Window,Worker)] interface TestBindingPairIterable { [Throws] constructor(); undefined add(DOMString key, unsigned long value); diff --git a/components/script/dom/webidls/TestBindingProxy.webidl b/components/script/dom/webidls/TestBindingProxy.webidl index b16d5104242..957db0f0302 100644 --- a/components/script/dom/webidls/TestBindingProxy.webidl +++ b/components/script/dom/webidls/TestBindingProxy.webidl @@ -11,7 +11,7 @@ // This interface is entirely internal to Servo, and should not be accessible to // web pages. -[Pref="dom.testbinding.enabled", Exposed=(Window,Worker)] +[Pref="dom_testbinding_enabled", Exposed=(Window,Worker)] interface TestBindingProxy : TestBinding { readonly attribute unsigned long length; diff --git a/components/script/dom/webidls/TestBindingSetlike.webidl b/components/script/dom/webidls/TestBindingSetlike.webidl index c8cfcf73b86..16b264bb9f6 100644 --- a/components/script/dom/webidls/TestBindingSetlike.webidl +++ b/components/script/dom/webidls/TestBindingSetlike.webidl @@ -5,7 +5,7 @@ // This interface is entirely internal to Servo, and should not be accessible to // web pages. -[Pref="dom.testbinding.enabled", Exposed=(Window,Worker)] +[Pref="dom_testbinding_enabled", Exposed=(Window,Worker)] interface TestBindingSetlike { [Throws] constructor(); diff --git a/components/script/dom/webidls/TestRunner.webidl b/components/script/dom/webidls/TestRunner.webidl index 448be17c4d4..4be17153247 100644 --- a/components/script/dom/webidls/TestRunner.webidl +++ b/components/script/dom/webidls/TestRunner.webidl @@ -6,7 +6,7 @@ // callback BluetoothManualChooserEventsCallback = void(sequence events); -[Pref="dom.bluetooth.testing.enabled", Exposed=Window] +[Pref="dom_bluetooth_testing_enabled", Exposed=Window] interface TestRunner { [Throws] undefined setBluetoothMockDataSet(DOMString dataSetName); diff --git a/components/script/dom/webidls/TestWorklet.webidl b/components/script/dom/webidls/TestWorklet.webidl index 81b02da0731..8e5898736b0 100644 --- a/components/script/dom/webidls/TestWorklet.webidl +++ b/components/script/dom/webidls/TestWorklet.webidl @@ -5,7 +5,7 @@ // This interface is entirely internal to Servo, and should not be accessible to // web pages. -[Pref="dom.worklet.testing.enabled", Exposed=(Window)] +[Pref="dom_worklet_testing_enabled", Exposed=(Window)] interface TestWorklet { [Throws] constructor(); [NewObject] Promise addModule(USVString moduleURL, optional WorkletOptions options = {}); diff --git a/components/script/dom/webidls/TestWorkletGlobalScope.webidl b/components/script/dom/webidls/TestWorkletGlobalScope.webidl index 1c2735dbc65..86599a2c257 100644 --- a/components/script/dom/webidls/TestWorkletGlobalScope.webidl +++ b/components/script/dom/webidls/TestWorkletGlobalScope.webidl @@ -5,7 +5,7 @@ // This interface is entirely internal to Servo, and should not be accessible to // web pages. -[Global=(Worklet,TestWorklet), Pref="dom.worklet.enabled", Exposed=TestWorklet] +[Global=(Worklet,TestWorklet), Pref="dom_worklet_enabled", Exposed=TestWorklet] interface TestWorkletGlobalScope : WorkletGlobalScope { undefined registerKeyValue(DOMString key, DOMString value); }; diff --git a/components/script/dom/webidls/TextMetrics.webidl b/components/script/dom/webidls/TextMetrics.webidl index efba27450fe..ebf0bd8a3dc 100644 --- a/components/script/dom/webidls/TextMetrics.webidl +++ b/components/script/dom/webidls/TextMetrics.webidl @@ -3,7 +3,7 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ // https://html.spec.whatwg.org/multipage/#textmetrics -[Exposed=(PaintWorklet, Window, Worker), Pref="dom.canvas_text.enabled"] +[Exposed=(PaintWorklet, Window, Worker), Pref="dom_canvas_text_enabled"] interface TextMetrics { // x-direction readonly attribute double width; // advance width diff --git a/components/script/dom/webidls/VTTCue.webidl b/components/script/dom/webidls/VTTCue.webidl index 073aa12f79b..ccbd342a788 100644 --- a/components/script/dom/webidls/VTTCue.webidl +++ b/components/script/dom/webidls/VTTCue.webidl @@ -11,7 +11,7 @@ enum LineAlignSetting { "start", "center", "end" }; enum PositionAlignSetting { "line-left", "center", "line-right", "auto" }; enum AlignSetting { "start", "center", "end", "left", "right" }; -[Pref="dom.webvtt.enabled", Exposed=Window] +[Pref="dom_webvtt_enabled", Exposed=Window] interface VTTCue : TextTrackCue { constructor(double startTime, double endTime, DOMString text); attribute VTTRegion? region; diff --git a/components/script/dom/webidls/VTTRegion.webidl b/components/script/dom/webidls/VTTRegion.webidl index 12fbe16170b..f4a616ef323 100644 --- a/components/script/dom/webidls/VTTRegion.webidl +++ b/components/script/dom/webidls/VTTRegion.webidl @@ -6,7 +6,7 @@ enum ScrollSetting { "" /* none */, "up"}; -[Pref="dom.webvtt.enabled", Exposed=Window] +[Pref="dom_webvtt_enabled", Exposed=Window] interface VTTRegion { [Throws] constructor(); attribute DOMString id; diff --git a/components/script/dom/webidls/WebGLQuery.webidl b/components/script/dom/webidls/WebGLQuery.webidl index 04b3711dd86..feea145c611 100644 --- a/components/script/dom/webidls/WebGLQuery.webidl +++ b/components/script/dom/webidls/WebGLQuery.webidl @@ -6,6 +6,6 @@ // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.8 // -[Exposed=Window, Pref="dom.webgl2.enabled"] +[Exposed=Window, Pref="dom_webgl2_enabled"] interface WebGLQuery : WebGLObject { }; diff --git a/components/script/dom/webidls/WebGLSampler.webidl b/components/script/dom/webidls/WebGLSampler.webidl index 90c66b65a1d..4669aebeabd 100644 --- a/components/script/dom/webidls/WebGLSampler.webidl +++ b/components/script/dom/webidls/WebGLSampler.webidl @@ -6,6 +6,6 @@ // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.8 // -[Exposed=Window, Pref="dom.webgl2.enabled"] +[Exposed=Window, Pref="dom_webgl2_enabled"] interface WebGLSampler : WebGLObject { }; diff --git a/components/script/dom/webidls/WebGLSync.webidl b/components/script/dom/webidls/WebGLSync.webidl index f8cd33ef9ce..66640a888f0 100644 --- a/components/script/dom/webidls/WebGLSync.webidl +++ b/components/script/dom/webidls/WebGLSync.webidl @@ -6,6 +6,6 @@ // https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.14 // -[Exposed=Window, Pref="dom.webgl2.enabled"] +[Exposed=Window, Pref="dom_webgl2_enabled"] interface WebGLSync : WebGLObject { }; diff --git a/components/script/dom/webidls/WebGLTransformFeedback.webidl b/components/script/dom/webidls/WebGLTransformFeedback.webidl index 871c0f15c7b..ee666366dd4 100644 --- a/components/script/dom/webidls/WebGLTransformFeedback.webidl +++ b/components/script/dom/webidls/WebGLTransformFeedback.webidl @@ -6,6 +6,6 @@ // https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.15 // -[Exposed=(Window), Pref="dom.webgl2.enabled"] +[Exposed=(Window), Pref="dom_webgl2_enabled"] interface WebGLTransformFeedback : WebGLObject { }; diff --git a/components/script/dom/webidls/WebGLVertexArrayObject.webidl b/components/script/dom/webidls/WebGLVertexArrayObject.webidl index a42d8cbe051..c6649e17ef8 100644 --- a/components/script/dom/webidls/WebGLVertexArrayObject.webidl +++ b/components/script/dom/webidls/WebGLVertexArrayObject.webidl @@ -6,6 +6,6 @@ // https://www.khronos.org/registry/webgl/specs/latest/2.0/#3.7.17 // -[Exposed=(Window), Pref="dom.webgl2.enabled"] +[Exposed=(Window), Pref="dom_webgl2_enabled"] interface WebGLVertexArrayObject : WebGLObject { }; diff --git a/components/script/dom/webidls/WebGPU.webidl b/components/script/dom/webidls/WebGPU.webidl index 5f0572c768a..41bee4718cb 100644 --- a/components/script/dom/webidls/WebGPU.webidl +++ b/components/script/dom/webidls/WebGPU.webidl @@ -16,7 +16,7 @@ dictionary GPUObjectDescriptorBase { USVString label = ""; }; -[Exposed=(Window, DedicatedWorker), Pref="dom.webgpu.enabled"] +[Exposed=(Window, DedicatedWorker), Pref="dom_webgpu_enabled"] interface GPUSupportedLimits { readonly attribute unsigned long maxTextureDimension1D; readonly attribute unsigned long maxTextureDimension2D; @@ -52,17 +52,17 @@ interface GPUSupportedLimits { readonly attribute unsigned long maxComputeWorkgroupsPerDimension; }; -[Exposed=(Window, DedicatedWorker), Pref="dom.webgpu.enabled"] +[Exposed=(Window, DedicatedWorker), Pref="dom_webgpu_enabled"] interface GPUSupportedFeatures { readonly setlike; }; -[Exposed=(Window, DedicatedWorker), Pref="dom.webgpu.enabled"] +[Exposed=(Window, DedicatedWorker), Pref="dom_webgpu_enabled"] interface WGSLLanguageFeatures { readonly setlike; }; -[Exposed=(Window, DedicatedWorker), Pref="dom.webgpu.enabled"] +[Exposed=(Window, DedicatedWorker), Pref="dom_webgpu_enabled"] interface GPUAdapterInfo { readonly attribute DOMString vendor; readonly attribute DOMString architecture; @@ -71,13 +71,13 @@ interface GPUAdapterInfo { }; interface mixin NavigatorGPU { - [SameObject, Pref="dom.webgpu.enabled", Exposed=(Window /* ,DedicatedWorker */)] readonly attribute GPU gpu; + [SameObject, Pref="dom_webgpu_enabled", Exposed=(Window /* ,DedicatedWorker */)] readonly attribute GPU gpu; }; Navigator includes NavigatorGPU; WorkerNavigator includes NavigatorGPU; -[Exposed=(Window, DedicatedWorker), Pref="dom.webgpu.enabled"] +[Exposed=(Window, DedicatedWorker), Pref="dom_webgpu_enabled"] interface GPU { [NewObject] Promise requestAdapter(optional GPURequestAdapterOptions options = {}); @@ -95,7 +95,7 @@ enum GPUPowerPreference { "high-performance" }; -[Exposed=(Window, DedicatedWorker), Pref="dom.webgpu.enabled"] +[Exposed=(Window, DedicatedWorker), Pref="dom_webgpu_enabled"] interface GPUAdapter { [SameObject] readonly attribute GPUSupportedFeatures features; [SameObject] readonly attribute GPUSupportedLimits limits; @@ -129,7 +129,7 @@ enum GPUFeatureName { "dual-source-blending", }; -[Exposed=(Window, DedicatedWorker), /*Serializable,*/ Pref="dom.webgpu.enabled"] +[Exposed=(Window, DedicatedWorker), /*Serializable,*/ Pref="dom_webgpu_enabled"] interface GPUDevice: EventTarget { [SameObject] readonly attribute GPUSupportedFeatures features; [SameObject] readonly attribute GPUSupportedLimits limits; @@ -170,7 +170,7 @@ interface GPUDevice: EventTarget { }; GPUDevice includes GPUObjectBase; -[Exposed=(Window, DedicatedWorker), Serializable, Pref="dom.webgpu.enabled"] +[Exposed=(Window, DedicatedWorker), Serializable, Pref="dom_webgpu_enabled"] interface GPUBuffer { readonly attribute GPUSize64Out size; readonly attribute GPUFlagsConstant usage; @@ -201,7 +201,7 @@ dictionary GPUBufferDescriptor : GPUObjectDescriptorBase { }; typedef [EnforceRange] unsigned long GPUBufferUsageFlags; -[Exposed=(Window, DedicatedWorker), Pref="dom.webgpu.enabled"] +[Exposed=(Window, DedicatedWorker), Pref="dom_webgpu_enabled"] namespace GPUBufferUsage { const GPUFlagsConstant MAP_READ = 0x0001; const GPUFlagsConstant MAP_WRITE = 0x0002; @@ -216,13 +216,13 @@ namespace GPUBufferUsage { }; typedef [EnforceRange] unsigned long GPUMapModeFlags; -[Exposed=(Window, DedicatedWorker), Pref="dom.webgpu.enabled"] +[Exposed=(Window, DedicatedWorker), Pref="dom_webgpu_enabled"] namespace GPUMapMode { const GPUFlagsConstant READ = 0x0001; const GPUFlagsConstant WRITE = 0x0002; }; -[Exposed=(Window, DedicatedWorker), Serializable , Pref="dom.webgpu.enabled"] +[Exposed=(Window, DedicatedWorker), Serializable , Pref="dom_webgpu_enabled"] interface GPUTexture { [Throws, NewObject] GPUTextureView createView(optional GPUTextureViewDescriptor descriptor = {}); @@ -257,7 +257,7 @@ enum GPUTextureDimension { }; typedef [EnforceRange] unsigned long GPUTextureUsageFlags; -[Exposed=(Window, DedicatedWorker), Pref="dom.webgpu.enabled"] +[Exposed=(Window, DedicatedWorker), Pref="dom_webgpu_enabled"] interface GPUTextureUsage { const GPUTextureUsageFlags COPY_SRC = 0x01; const GPUTextureUsageFlags COPY_DST = 0x02; @@ -266,7 +266,7 @@ interface GPUTextureUsage { const GPUTextureUsageFlags RENDER_ATTACHMENT = 0x10; }; -[Exposed=(Window, DedicatedWorker), Pref="dom.webgpu.enabled"] +[Exposed=(Window, DedicatedWorker), Pref="dom_webgpu_enabled"] interface GPUTextureView { }; GPUTextureView includes GPUObjectBase; @@ -418,7 +418,7 @@ enum GPUTextureFormat { "astc-12x12-unorm-srgb", }; -[Exposed=(Window, DedicatedWorker), Pref="dom.webgpu.enabled"] +[Exposed=(Window, DedicatedWorker), Pref="dom_webgpu_enabled"] interface GPUSampler { }; GPUSampler includes GPUObjectBase; @@ -458,7 +458,7 @@ enum GPUCompareFunction { "always" }; -[Exposed=(Window, DedicatedWorker), Serializable, Pref="dom.webgpu.enabled"] +[Exposed=(Window, DedicatedWorker), Serializable, Pref="dom_webgpu_enabled"] interface GPUBindGroupLayout { }; GPUBindGroupLayout includes GPUObjectBase; @@ -479,7 +479,7 @@ dictionary GPUBindGroupLayoutEntry { }; typedef [EnforceRange] unsigned long GPUShaderStageFlags; -[Exposed=(Window, DedicatedWorker), Serializable, Pref="dom.webgpu.enabled"] +[Exposed=(Window, DedicatedWorker), Serializable, Pref="dom_webgpu_enabled"] interface GPUShaderStage { const GPUShaderStageFlags VERTEX = 1; const GPUShaderStageFlags FRAGMENT = 2; @@ -537,7 +537,7 @@ dictionary GPUStorageTextureBindingLayout { dictionary GPUExternalTextureBindingLayout { }; -[Exposed=(Window, DedicatedWorker), Pref="dom.webgpu.enabled"] +[Exposed=(Window, DedicatedWorker), Pref="dom_webgpu_enabled"] interface GPUBindGroup { }; GPUBindGroup includes GPUObjectBase; @@ -560,7 +560,7 @@ dictionary GPUBufferBinding { GPUSize64 size; }; -[Exposed=(Window, DedicatedWorker), Serializable, Pref="dom.webgpu.enabled"] +[Exposed=(Window, DedicatedWorker), Serializable, Pref="dom_webgpu_enabled"] interface GPUPipelineLayout { }; GPUPipelineLayout includes GPUObjectBase; @@ -569,7 +569,7 @@ dictionary GPUPipelineLayoutDescriptor : GPUObjectDescriptorBase { required sequence bindGroupLayouts; }; -[Exposed=(Window, DedicatedWorker), Serializable, Pref="dom.webgpu.enabled"] +[Exposed=(Window, DedicatedWorker), Serializable, Pref="dom_webgpu_enabled"] interface GPUShaderModule { Promise getCompilationInfo(); }; @@ -587,7 +587,7 @@ enum GPUCompilationMessageType { "info" }; -[Exposed=(Window, DedicatedWorker), Pref="dom.webgpu.enabled"] +[Exposed=(Window, DedicatedWorker), Pref="dom_webgpu_enabled"] interface GPUCompilationMessage { readonly attribute DOMString message; readonly attribute GPUCompilationMessageType type; @@ -597,13 +597,13 @@ interface GPUCompilationMessage { readonly attribute unsigned long long length; }; -[Exposed=(Window, DedicatedWorker), Pref="dom.webgpu.enabled"] +[Exposed=(Window, DedicatedWorker), Pref="dom_webgpu_enabled"] interface GPUCompilationInfo { //readonly attribute FrozenArray messages; readonly attribute any messages; }; -[Exposed=(Window, Worker), Pref="dom.webgpu.enabled"] +[Exposed=(Window, Worker), Pref="dom_webgpu_enabled"] interface GPUPipelineError : DOMException { constructor(optional DOMString message = "", GPUPipelineErrorInit options); readonly attribute GPUPipelineErrorReason reason; @@ -638,7 +638,7 @@ dictionary GPUProgrammableStage { typedef double GPUPipelineConstantValue; // May represent WGSL's bool, f32, i32, u32, and f16 if enabled. -[Exposed=(Window, DedicatedWorker), Serializable, Pref="dom.webgpu.enabled"] +[Exposed=(Window, DedicatedWorker), Serializable, Pref="dom_webgpu_enabled"] interface GPUComputePipeline { }; GPUComputePipeline includes GPUObjectBase; @@ -648,7 +648,7 @@ dictionary GPUComputePipelineDescriptor : GPUPipelineDescriptorBase { required GPUProgrammableStage compute; }; -[Exposed=(Window, DedicatedWorker), Serializable, Pref="dom.webgpu.enabled"] +[Exposed=(Window, DedicatedWorker), Serializable, Pref="dom_webgpu_enabled"] interface GPURenderPipeline { }; GPURenderPipeline includes GPUObjectBase; @@ -712,7 +712,7 @@ dictionary GPUBlendState { }; typedef [EnforceRange] unsigned long GPUColorWriteFlags; -[Exposed=(Window, DedicatedWorker), Pref="dom.webgpu.enabled"] +[Exposed=(Window, DedicatedWorker), Pref="dom_webgpu_enabled"] interface GPUColorWrite { const GPUColorWriteFlags RED = 0x1; const GPUColorWriteFlags GREEN = 0x2; @@ -873,7 +873,7 @@ dictionary GPUImageCopyExternalImage { boolean flipY = false; }; -[Exposed=(Window, DedicatedWorker), Serializable, Pref="dom.webgpu.enabled"] +[Exposed=(Window, DedicatedWorker), Serializable, Pref="dom_webgpu_enabled"] interface GPUCommandBuffer { }; GPUCommandBuffer includes GPUObjectBase; @@ -881,7 +881,7 @@ GPUCommandBuffer includes GPUObjectBase; dictionary GPUCommandBufferDescriptor : GPUObjectDescriptorBase { }; -[Exposed=(Window, DedicatedWorker), Serializable, Pref="dom.webgpu.enabled"] +[Exposed=(Window, DedicatedWorker), Serializable, Pref="dom_webgpu_enabled"] interface GPUCommandEncoder { [NewObject] GPUComputePassEncoder beginComputePass(optional GPUComputePassDescriptor descriptor = {}); @@ -939,11 +939,11 @@ dictionary GPUCommandEncoderDescriptor : GPUObjectDescriptorBase { boolean measureExecutionTime = false; }; -[Exposed=(Window, DedicatedWorker), Serializable, Pref="dom.webgpu.enabled"] +[Exposed=(Window, DedicatedWorker), Serializable, Pref="dom_webgpu_enabled"] interface GPUComputePassEncoder { undefined setPipeline(GPUComputePipeline pipeline); undefined dispatchWorkgroups(GPUSize32 x, optional GPUSize32 y = 1, optional GPUSize32 z = 1); - //[Pref="dom.webgpu.indirect-dispatch.enabled"] + //[Pref="dom_webgpu_indirect-dispatch.enabled"] undefined dispatchWorkgroupsIndirect(GPUBuffer indirectBuffer, GPUSize64 indirectOffset); undefined end(); @@ -954,7 +954,7 @@ GPUComputePassEncoder includes GPUProgrammablePassEncoder; dictionary GPUComputePassDescriptor : GPUObjectDescriptorBase { }; -[Exposed=(Window, DedicatedWorker), Pref="dom.webgpu.enabled"] +[Exposed=(Window, DedicatedWorker), Pref="dom_webgpu_enabled"] interface GPURenderPassEncoder { undefined setViewport(float x, float y, float width, float height, @@ -1063,13 +1063,13 @@ interface mixin GPURenderEncoderBase { optional GPUSignedOffset32 baseVertex = 0, optional GPUSize32 firstInstance = 0); - //[Pref="dom.webgpu.indirect-dispatch.enabled"] + //[Pref="dom_webgpu_indirect-dispatch.enabled"] undefined drawIndirect(GPUBuffer indirectBuffer, GPUSize64 indirectOffset); - //[Pref="dom.webgpu.indirect-dispatch.enabled"] + //[Pref="dom_webgpu_indirect-dispatch.enabled"] undefined drawIndexedIndirect(GPUBuffer indirectBuffer, GPUSize64 indirectOffset); }; -[Exposed=(Window, DedicatedWorker), Pref="dom.webgpu.enabled"] +[Exposed=(Window, DedicatedWorker), Pref="dom_webgpu_enabled"] interface GPURenderBundle { }; GPURenderBundle includes GPUObjectBase; @@ -1077,7 +1077,7 @@ GPURenderBundle includes GPUObjectBase; dictionary GPURenderBundleDescriptor : GPUObjectDescriptorBase { }; -[Exposed=(Window, DedicatedWorker), Pref="dom.webgpu.enabled"] +[Exposed=(Window, DedicatedWorker), Pref="dom_webgpu_enabled"] interface GPURenderBundleEncoder { GPURenderBundle finish(optional GPURenderBundleDescriptor descriptor = {}); }; @@ -1090,7 +1090,7 @@ dictionary GPURenderBundleEncoderDescriptor : GPURenderPassLayout { boolean stencilReadOnly = false; }; -[Exposed=(Window, DedicatedWorker), Serializable, Pref="dom.webgpu.enabled"] +[Exposed=(Window, DedicatedWorker), Serializable, Pref="dom_webgpu_enabled"] interface GPUQueue { undefined submit(sequence buffers); @@ -1119,7 +1119,7 @@ interface GPUQueue { }; GPUQueue includes GPUObjectBase; -[Exposed=(Window, DedicatedWorker), Serializable, Pref="dom.webgpu.enabled"] +[Exposed=(Window, DedicatedWorker), Serializable, Pref="dom_webgpu_enabled"] interface GPUQuerySet { undefined destroy(); }; @@ -1173,7 +1173,7 @@ enum GPUDeviceLostReason { "destroyed", }; -[Exposed=(Window, Worker), Pref="dom.webgpu.enabled"] +[Exposed=(Window, Worker), Pref="dom_webgpu_enabled"] interface GPUDeviceLostInfo { readonly attribute GPUDeviceLostReason reason; readonly attribute DOMString message; @@ -1183,24 +1183,24 @@ partial interface GPUDevice { readonly attribute Promise lost; }; -[Exposed=(Window, Worker), Pref="dom.webgpu.enabled"] +[Exposed=(Window, Worker), Pref="dom_webgpu_enabled"] interface GPUError { readonly attribute DOMString message; }; -[Exposed=(Window, Worker), Pref="dom.webgpu.enabled"] +[Exposed=(Window, Worker), Pref="dom_webgpu_enabled"] interface GPUValidationError : GPUError { constructor(DOMString message); }; -[Exposed=(Window, Worker), Pref="dom.webgpu.enabled"] +[Exposed=(Window, Worker), Pref="dom_webgpu_enabled"] interface GPUOutOfMemoryError : GPUError { constructor(DOMString message); }; -[Exposed=(Window, Worker), Pref="dom.webgpu.enabled"] +[Exposed=(Window, Worker), Pref="dom_webgpu_enabled"] interface GPUInternalError : GPUError { constructor(DOMString message); @@ -1218,7 +1218,7 @@ partial interface GPUDevice { Promise popErrorScope(); }; -[Exposed=(Window, Worker), Pref="dom.webgpu.enabled"] +[Exposed=(Window, Worker), Pref="dom_webgpu_enabled"] interface GPUUncapturedErrorEvent : Event { constructor( DOMString type, diff --git a/components/script/dom/webidls/Window.webidl b/components/script/dom/webidls/Window.webidl index 84871494d2b..64d7563b38e 100644 --- a/components/script/dom/webidls/Window.webidl +++ b/components/script/dom/webidls/Window.webidl @@ -15,7 +15,7 @@ [PutForwards=href, LegacyUnforgeable, CrossOriginReadable, CrossOriginWritable] readonly attribute Location location; readonly attribute History history; - [Pref="dom.customelements.enabled"] + [Pref="dom_customelements_enabled"] readonly attribute CustomElementRegistry customElements; //[Replaceable] readonly attribute BarProp locationbar; //[Replaceable] readonly attribute BarProp menubar; @@ -136,11 +136,11 @@ partial interface Window { // Proprietary extensions. partial interface Window { - [Pref="dom.servo_helpers.enabled"] + [Pref="dom_servo_helpers_enabled"] undefined debug(DOMString arg); - [Pref="dom.servo_helpers.enabled"] + [Pref="dom_servo_helpers_enabled"] undefined gc(); - [Pref="dom.servo_helpers.enabled"] + [Pref="dom_servo_helpers_enabled"] undefined js_backtrace(); }; @@ -168,13 +168,13 @@ callback FrameRequestCallback = undefined (DOMHighResTimeStamp time); // https://webbluetoothcg.github.io/web-bluetooth/tests#test-interfaces partial interface Window { - [Pref="dom.bluetooth.testing.enabled", Exposed=Window] + [Pref="dom_bluetooth_testing_enabled", Exposed=Window] readonly attribute TestRunner testRunner; //readonly attribute EventSender eventSender; }; partial interface Window { - [Pref="css.animations.testing.enabled"] + [Pref="css_animations_testing_enabled"] readonly attribute unsigned long runningAnimationCount; }; diff --git a/components/script/dom/webidls/WindowOrWorkerGlobalScope.webidl b/components/script/dom/webidls/WindowOrWorkerGlobalScope.webidl index dbcce406a43..d9204c11774 100644 --- a/components/script/dom/webidls/WindowOrWorkerGlobalScope.webidl +++ b/components/script/dom/webidls/WindowOrWorkerGlobalScope.webidl @@ -24,7 +24,7 @@ interface mixin WindowOrWorkerGlobalScope { undefined queueMicrotask(VoidFunction callback); // ImageBitmap - [Pref="dom.imagebitmap.enabled"] + [Pref="dom_imagebitmap_enabled"] Promise createImageBitmap(ImageBitmapSource image, optional ImageBitmapOptions options = {}); // Promise createImageBitmap( // ImageBitmapSource image, long sx, long sy, long sw, long sh, optional ImageBitmapOptions options); diff --git a/components/script/dom/webidls/WorkerNavigator.webidl b/components/script/dom/webidls/WorkerNavigator.webidl index 3de4be96ebc..33ddfade93d 100644 --- a/components/script/dom/webidls/WorkerNavigator.webidl +++ b/components/script/dom/webidls/WorkerNavigator.webidl @@ -14,6 +14,6 @@ WorkerNavigator includes NavigatorConcurrentHardware; [Exposed=(Worker)] partial interface WorkerNavigator { - [Pref="dom.permissions.enabled"] readonly attribute Permissions permissions; + [Pref="dom_permissions_enabled"] readonly attribute Permissions permissions; }; diff --git a/components/script/dom/webidls/Worklet.webidl b/components/script/dom/webidls/Worklet.webidl index 249f9c9d470..a656c1e3865 100644 --- a/components/script/dom/webidls/Worklet.webidl +++ b/components/script/dom/webidls/Worklet.webidl @@ -3,7 +3,7 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ // https://drafts.css-houdini.org/worklets/#worklet -[Pref="dom.worklet.enabled", Exposed=(Window)] +[Pref="dom_worklet_enabled", Exposed=(Window)] interface Worklet { [NewObject] Promise addModule(USVString moduleURL, optional WorkletOptions options = {}); }; diff --git a/components/script/dom/webidls/WorkletGlobalScope.webidl b/components/script/dom/webidls/WorkletGlobalScope.webidl index 21f7a7e0af0..33283c84161 100644 --- a/components/script/dom/webidls/WorkletGlobalScope.webidl +++ b/components/script/dom/webidls/WorkletGlobalScope.webidl @@ -5,6 +5,6 @@ // https://drafts.css-houdini.org/worklets/#workletglobalscope // TODO: The spec IDL doesn't make this a subclass of EventTarget // https://github.com/whatwg/html/issues/2611 -[Pref="dom.worklet.enabled", Exposed=Worklet] +[Pref="dom_worklet_enabled", Exposed=Worklet] interface WorkletGlobalScope: GlobalScope { }; diff --git a/components/script/dom/webidls/XPathEvaluator.webidl b/components/script/dom/webidls/XPathEvaluator.webidl index 8586b19232b..ebb505c104c 100644 --- a/components/script/dom/webidls/XPathEvaluator.webidl +++ b/components/script/dom/webidls/XPathEvaluator.webidl @@ -4,13 +4,13 @@ // https://dom.spec.whatwg.org/#mixin-xpathevaluatorbase interface mixin XPathEvaluatorBase { - [NewObject, Throws, Pref="dom.xpath.enabled"] XPathExpression createExpression( + [NewObject, Throws, Pref="dom_xpath_enabled"] XPathExpression createExpression( DOMString expression, optional XPathNSResolver? resolver = null ); Node createNSResolver(Node nodeResolver); // legacy // XPathResult.ANY_TYPE = 0 - [Throws, Pref="dom.xpath.enabled"] XPathResult evaluate( + [Throws, Pref="dom_xpath_enabled"] XPathResult evaluate( DOMString expression, Node contextNode, optional XPathNSResolver? resolver = null, @@ -22,7 +22,7 @@ interface mixin XPathEvaluatorBase { Document includes XPathEvaluatorBase; // https://dom.spec.whatwg.org/#interface-xpathevaluator -[Exposed=Window, Pref="dom.xpath.enabled"] +[Exposed=Window, Pref="dom_xpath_enabled"] interface XPathEvaluator { constructor(); }; diff --git a/components/script/dom/webidls/XPathExpression.webidl b/components/script/dom/webidls/XPathExpression.webidl index bf5ba2b83aa..29cbd23e757 100644 --- a/components/script/dom/webidls/XPathExpression.webidl +++ b/components/script/dom/webidls/XPathExpression.webidl @@ -3,7 +3,7 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ // https://dom.spec.whatwg.org/#interface-xpathexpression -[Exposed=Window, Pref="dom.xpath.enabled"] +[Exposed=Window, Pref="dom_xpath_enabled"] interface XPathExpression { // XPathResult.ANY_TYPE = 0 [Throws] XPathResult evaluate( diff --git a/components/script/dom/webidls/XPathResult.webidl b/components/script/dom/webidls/XPathResult.webidl index 25e87e3024a..ed0e9804ca4 100644 --- a/components/script/dom/webidls/XPathResult.webidl +++ b/components/script/dom/webidls/XPathResult.webidl @@ -3,7 +3,7 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ // https://dom.spec.whatwg.org/#interface-xpathresult -[Exposed=Window, Pref="dom.xpath.enabled"] +[Exposed=Window, Pref="dom_xpath_enabled"] interface XPathResult { const unsigned short ANY_TYPE = 0; const unsigned short NUMBER_TYPE = 1; diff --git a/components/script/dom/webidls/XRBoundedReferenceSpace.webidl b/components/script/dom/webidls/XRBoundedReferenceSpace.webidl index c028f740c87..9bf63f7f685 100644 --- a/components/script/dom/webidls/XRBoundedReferenceSpace.webidl +++ b/components/script/dom/webidls/XRBoundedReferenceSpace.webidl @@ -6,7 +6,7 @@ // https://immersive-web.github.io/webxr/#xrboundedreferencespace-interface -[SecureContext, Exposed=Window, Pref="dom.webxr.enabled"] +[SecureContext, Exposed=Window, Pref="dom_webxr_enabled"] interface XRBoundedReferenceSpace : XRReferenceSpace { readonly attribute /*FrozenArray*/ any boundsGeometry; }; diff --git a/components/script/dom/webidls/XRCompositionLayer.webidl b/components/script/dom/webidls/XRCompositionLayer.webidl index e8cedf71240..bdfe3435965 100644 --- a/components/script/dom/webidls/XRCompositionLayer.webidl +++ b/components/script/dom/webidls/XRCompositionLayer.webidl @@ -8,7 +8,7 @@ // https://github.com/servo/servo/issues/27493 // https://immersive-web.github.io/layers/#xrcompositionlayer -[SecureContext, Exposed=Window, Pref="dom.webxr.layers.enabled"] +[SecureContext, Exposed=Window, Pref="dom_webxr_layers_enabled"] interface XRCompositionLayer : XRLayer { // readonly attribute XRLayerLayout layout; // diff --git a/components/script/dom/webidls/XRCubeLayer.webidl b/components/script/dom/webidls/XRCubeLayer.webidl index 1b213f34be3..30744201a87 100644 --- a/components/script/dom/webidls/XRCubeLayer.webidl +++ b/components/script/dom/webidls/XRCubeLayer.webidl @@ -9,7 +9,7 @@ // https://immersive-web.github.io/layers/#xrcubelayer -[SecureContext, Exposed=Window, Pref="dom.webxr.layers.enabled"] +[SecureContext, Exposed=Window, Pref="dom_webxr_layers_enabled"] interface XRCubeLayer : XRCompositionLayer { // attribute XRSpace space; // attribute DOMPointReadOnly orientation; diff --git a/components/script/dom/webidls/XRCylinderLayer.webidl b/components/script/dom/webidls/XRCylinderLayer.webidl index e290aecdee4..c20801f81a0 100644 --- a/components/script/dom/webidls/XRCylinderLayer.webidl +++ b/components/script/dom/webidls/XRCylinderLayer.webidl @@ -8,7 +8,7 @@ // https://github.com/servo/servo/issues/27493 // https://immersive-web.github.io/layers/#xrcylinderlayer -[SecureContext, Exposed=Window, Pref="dom.webxr.layers.enabled"] +[SecureContext, Exposed=Window, Pref="dom_webxr_layers_enabled"] interface XRCylinderLayer : XRCompositionLayer { // attribute XRSpace space; // attribute XRRigidTransform transform; diff --git a/components/script/dom/webidls/XREquirectLayer.webidl b/components/script/dom/webidls/XREquirectLayer.webidl index f7eeb327b9a..7b1d1584d62 100644 --- a/components/script/dom/webidls/XREquirectLayer.webidl +++ b/components/script/dom/webidls/XREquirectLayer.webidl @@ -8,7 +8,7 @@ // https://github.com/servo/servo/issues/27493 // https://immersive-web.github.io/layers/#xrequirectlayer -[SecureContext, Exposed=Window, Pref="dom.webxr.layers.enabled"] +[SecureContext, Exposed=Window, Pref="dom_webxr_layers_enabled"] interface XREquirectLayer : XRCompositionLayer { // attribute XRSpace space; // attribute XRRigidTransform transform; diff --git a/components/script/dom/webidls/XRFrame.webidl b/components/script/dom/webidls/XRFrame.webidl index 2e05028ec0c..d5ec4b6ef21 100644 --- a/components/script/dom/webidls/XRFrame.webidl +++ b/components/script/dom/webidls/XRFrame.webidl @@ -6,7 +6,7 @@ // https://immersive-web.github.io/webxr/#xrframe-interface -[SecureContext, Exposed=Window, Pref="dom.webxr.enabled"] +[SecureContext, Exposed=Window, Pref="dom_webxr_enabled"] interface XRFrame { [SameObject] readonly attribute XRSession session; readonly attribute DOMHighResTimeStamp predictedDisplayTime; @@ -15,12 +15,12 @@ interface XRFrame { [Throws] XRPose? getPose(XRSpace space, XRSpace baseSpace); // WebXR Hand Input - [Pref="dom.webxr.hands.enabled", Throws] + [Pref="dom_webxr_hands_enabled", Throws] XRJointPose? getJointPose(XRJointSpace joint, XRSpace baseSpace); - [Pref="dom.webxr.hands.enabled", Throws] + [Pref="dom_webxr_hands_enabled", Throws] boolean fillJointRadii(sequence jointSpaces, Float32Array radii); - [Pref="dom.webxr.hands.enabled", Throws] + [Pref="dom_webxr_hands_enabled", Throws] boolean fillPoses(sequence spaces, XRSpace baseSpace, Float32Array transforms); // WebXR Hit Test diff --git a/components/script/dom/webidls/XRHand.webidl b/components/script/dom/webidls/XRHand.webidl index ad46e719f2b..6749eab8dd5 100644 --- a/components/script/dom/webidls/XRHand.webidl +++ b/components/script/dom/webidls/XRHand.webidl @@ -39,7 +39,7 @@ enum XRHandJoint { "pinky-finger-tip" }; -[SecureContext, Exposed=Window, Pref="dom.webxr.hands.enabled"] +[SecureContext, Exposed=Window, Pref="dom_webxr_hands_enabled"] interface XRHand { iterable; diff --git a/components/script/dom/webidls/XRInputSource.webidl b/components/script/dom/webidls/XRInputSource.webidl index 820f24c363f..7b82b050777 100644 --- a/components/script/dom/webidls/XRInputSource.webidl +++ b/components/script/dom/webidls/XRInputSource.webidl @@ -19,7 +19,7 @@ enum XRTargetRayMode { "transient-pointer" }; -[SecureContext, Exposed=Window, Pref="dom.webxr.enabled"] +[SecureContext, Exposed=Window, Pref="dom_webxr_enabled"] interface XRInputSource { readonly attribute XRHandedness handedness; readonly attribute XRTargetRayMode targetRayMode; @@ -32,6 +32,6 @@ interface XRInputSource { [SameObject] readonly attribute Gamepad? gamepad; // Hand Input - [Pref="dom.webxr.hands.enabled"] + [Pref="dom_webxr_hands_enabled"] readonly attribute XRHand? hand; }; diff --git a/components/script/dom/webidls/XRInputSourceArray.webidl b/components/script/dom/webidls/XRInputSourceArray.webidl index 5987c0039d3..093eab67ed9 100644 --- a/components/script/dom/webidls/XRInputSourceArray.webidl +++ b/components/script/dom/webidls/XRInputSourceArray.webidl @@ -6,7 +6,7 @@ // https://immersive-web.github.io/webxr/#xrinputsourcearray-interface -[SecureContext, Exposed=Window, Pref="dom.webxr.enabled"] +[SecureContext, Exposed=Window, Pref="dom_webxr_enabled"] interface XRInputSourceArray { iterable; readonly attribute unsigned long length; diff --git a/components/script/dom/webidls/XRInputSourceEvent.webidl b/components/script/dom/webidls/XRInputSourceEvent.webidl index e2cb1b394c9..11055b3f247 100644 --- a/components/script/dom/webidls/XRInputSourceEvent.webidl +++ b/components/script/dom/webidls/XRInputSourceEvent.webidl @@ -6,7 +6,7 @@ // https://immersive-web.github.io/webxr/#xrinputsourceevent-interface -[SecureContext, Exposed=Window, Pref="dom.webxr.enabled"] +[SecureContext, Exposed=Window, Pref="dom_webxr_enabled"] interface XRInputSourceEvent : Event { [Throws] constructor(DOMString type, XRInputSourceEventInit eventInitDict); [SameObject] readonly attribute XRFrame frame; diff --git a/components/script/dom/webidls/XRInputSourcesChangeEvent.webidl b/components/script/dom/webidls/XRInputSourcesChangeEvent.webidl index 25a4885cca3..f6b65d12a09 100644 --- a/components/script/dom/webidls/XRInputSourcesChangeEvent.webidl +++ b/components/script/dom/webidls/XRInputSourcesChangeEvent.webidl @@ -6,7 +6,7 @@ // https://immersive-web.github.io/webxr/#xrinputsourceschangedevent-interface -[SecureContext, Exposed=Window, Pref="dom.webxr.test"] +[SecureContext, Exposed=Window, Pref="dom_webxr_test"] interface XRInputSourcesChangeEvent : Event { constructor(DOMString type, XRInputSourcesChangeEventInit eventInitDict); [SameObject] readonly attribute XRSession session; diff --git a/components/script/dom/webidls/XRJointPose.webidl b/components/script/dom/webidls/XRJointPose.webidl index e824745588e..73bde0ca6e6 100644 --- a/components/script/dom/webidls/XRJointPose.webidl +++ b/components/script/dom/webidls/XRJointPose.webidl @@ -6,7 +6,7 @@ // https://github.com/immersive-web/webxr-hands-input/blob/master/explainer.md -[SecureContext, Exposed=Window, Pref="dom.webxr.hands.enabled"] +[SecureContext, Exposed=Window, Pref="dom_webxr_hands_enabled"] interface XRJointPose: XRPose { readonly attribute float? radius; }; diff --git a/components/script/dom/webidls/XRJointSpace.webidl b/components/script/dom/webidls/XRJointSpace.webidl index 7326e9990a1..2eeca7edc15 100644 --- a/components/script/dom/webidls/XRJointSpace.webidl +++ b/components/script/dom/webidls/XRJointSpace.webidl @@ -6,7 +6,7 @@ // https://github.com/immersive-web/webxr-hands-input/blob/master/explainer.md -[SecureContext, Exposed=Window, Pref="dom.webxr.hands.enabled"] +[SecureContext, Exposed=Window, Pref="dom_webxr_hands_enabled"] interface XRJointSpace: XRSpace { readonly attribute XRHandJoint jointName; }; diff --git a/components/script/dom/webidls/XRLayer.webidl b/components/script/dom/webidls/XRLayer.webidl index 122946defb9..fdc9b2bee3a 100644 --- a/components/script/dom/webidls/XRLayer.webidl +++ b/components/script/dom/webidls/XRLayer.webidl @@ -5,5 +5,5 @@ // skip-unless CARGO_FEATURE_WEBXR // https://immersive-web.github.io/webxr/#xrlayer -[SecureContext, Exposed=Window, Pref="dom.webxr.enabled"] +[SecureContext, Exposed=Window, Pref="dom_webxr_enabled"] interface XRLayer : EventTarget {}; diff --git a/components/script/dom/webidls/XRLayerEvent.webidl b/components/script/dom/webidls/XRLayerEvent.webidl index e45f116da34..553a70fcaec 100644 --- a/components/script/dom/webidls/XRLayerEvent.webidl +++ b/components/script/dom/webidls/XRLayerEvent.webidl @@ -5,7 +5,7 @@ // skip-unless CARGO_FEATURE_WEBXR // https://immersive-web.github.io/layers/#xrlayerevent-interface -[SecureContext, Exposed=Window, Pref="dom.webxr.layers.enabled"] +[SecureContext, Exposed=Window, Pref="dom_webxr_layers_enabled"] interface XRLayerEvent : Event { constructor(DOMString type, XRLayerEventInit eventInitDict); [SameObject] readonly attribute XRLayer layer; diff --git a/components/script/dom/webidls/XRMediaBinding.webidl b/components/script/dom/webidls/XRMediaBinding.webidl index 4c3bfc91e80..558aa0596c3 100644 --- a/components/script/dom/webidls/XRMediaBinding.webidl +++ b/components/script/dom/webidls/XRMediaBinding.webidl @@ -5,7 +5,7 @@ // skip-unless CARGO_FEATURE_WEBXR // https://immersive-web.github.io/layers/#xrmediabindingtype -[SecureContext, Exposed=Window, Pref="dom.webxr.layers.enabled"] +[SecureContext, Exposed=Window, Pref="dom_webxr_layers_enabled"] interface XRMediaBinding { [Throws] constructor(XRSession session); diff --git a/components/script/dom/webidls/XRPose.webidl b/components/script/dom/webidls/XRPose.webidl index dab2d9e7af9..2ac5f372cdd 100644 --- a/components/script/dom/webidls/XRPose.webidl +++ b/components/script/dom/webidls/XRPose.webidl @@ -6,7 +6,7 @@ // https://immersive-web.github.io/webxr/#xrpose-interface -[SecureContext, Exposed=Window, Pref="dom.webxr.enabled"] +[SecureContext, Exposed=Window, Pref="dom_webxr_enabled"] interface XRPose { [SameObject] readonly attribute XRRigidTransform transform; [SameObject] readonly attribute DOMPointReadOnly? linearVelocity; diff --git a/components/script/dom/webidls/XRProjectionLayer.webidl b/components/script/dom/webidls/XRProjectionLayer.webidl index 0c812948795..bdb9de13dd2 100644 --- a/components/script/dom/webidls/XRProjectionLayer.webidl +++ b/components/script/dom/webidls/XRProjectionLayer.webidl @@ -8,7 +8,7 @@ // https://github.com/servo/servo/issues/27493 // https://immersive-web.github.io/layers/#xrprojectionlayer -[SecureContext, Exposed=Window, Pref="dom.webxr.layers.enabled"] +[SecureContext, Exposed=Window, Pref="dom_webxr_layers_enabled"] interface XRProjectionLayer : XRCompositionLayer { // readonly attribute boolean ignoreDepthValues; }; diff --git a/components/script/dom/webidls/XRQuadLayer.webidl b/components/script/dom/webidls/XRQuadLayer.webidl index a4c43b0b62e..0b4afcac9be 100644 --- a/components/script/dom/webidls/XRQuadLayer.webidl +++ b/components/script/dom/webidls/XRQuadLayer.webidl @@ -8,7 +8,7 @@ // https://github.com/servo/servo/issues/27493 // https://immersive-web.github.io/layers/#xrquadlayer -[SecureContext, Exposed=Window, Pref="dom.webxr.layers.enabled"] +[SecureContext, Exposed=Window, Pref="dom_webxr_layers_enabled"] interface XRQuadLayer : XRCompositionLayer { // attribute XRSpace space; // attribute XRRigidTransform transform; diff --git a/components/script/dom/webidls/XRRay.webidl b/components/script/dom/webidls/XRRay.webidl index 748bd085147..b5fd7ed3494 100644 --- a/components/script/dom/webidls/XRRay.webidl +++ b/components/script/dom/webidls/XRRay.webidl @@ -13,7 +13,7 @@ dictionary XRRayDirectionInit { double w = 0; }; -[SecureContext, Exposed=Window, Pref="dom.webxr.enabled"] +[SecureContext, Exposed=Window, Pref="dom_webxr_enabled"] interface XRRay { [Throws] constructor(optional DOMPointInit origin = {}, optional XRRayDirectionInit direction = {}); [Throws] constructor(XRRigidTransform transform); diff --git a/components/script/dom/webidls/XRReferenceSpace.webidl b/components/script/dom/webidls/XRReferenceSpace.webidl index ad9bd41659c..aad31702f01 100644 --- a/components/script/dom/webidls/XRReferenceSpace.webidl +++ b/components/script/dom/webidls/XRReferenceSpace.webidl @@ -14,7 +14,7 @@ enum XRReferenceSpaceType { "unbounded" }; -[SecureContext, Exposed=Window, Pref="dom.webxr.enabled"] +[SecureContext, Exposed=Window, Pref="dom_webxr_enabled"] interface XRReferenceSpace : XRSpace { [NewObject] XRReferenceSpace getOffsetReferenceSpace(XRRigidTransform originOffset); diff --git a/components/script/dom/webidls/XRReferenceSpaceEvent.webidl b/components/script/dom/webidls/XRReferenceSpaceEvent.webidl index a15e7aba316..b9075294d1e 100644 --- a/components/script/dom/webidls/XRReferenceSpaceEvent.webidl +++ b/components/script/dom/webidls/XRReferenceSpaceEvent.webidl @@ -6,7 +6,7 @@ // https://immersive-web.github.io/webxr/#xrreferencespaceevent-interface -[SecureContext, Exposed=Window, Pref="dom.webxr.enabled"] +[SecureContext, Exposed=Window, Pref="dom_webxr_enabled"] interface XRReferenceSpaceEvent : Event { [Throws] constructor(DOMString type, XRReferenceSpaceEventInit eventInitDict); [SameObject] readonly attribute XRReferenceSpace referenceSpace; diff --git a/components/script/dom/webidls/XRRenderState.webidl b/components/script/dom/webidls/XRRenderState.webidl index d02ab20646a..ff91e0d2fea 100644 --- a/components/script/dom/webidls/XRRenderState.webidl +++ b/components/script/dom/webidls/XRRenderState.webidl @@ -14,7 +14,7 @@ dictionary XRRenderStateInit { sequence? layers; }; -[SecureContext, Exposed=Window, Pref="dom.webxr.enabled"] interface XRRenderState { +[SecureContext, Exposed=Window, Pref="dom_webxr_enabled"] interface XRRenderState { readonly attribute double depthNear; readonly attribute double depthFar; readonly attribute double? inlineVerticalFieldOfView; diff --git a/components/script/dom/webidls/XRRigidTransform.webidl b/components/script/dom/webidls/XRRigidTransform.webidl index 85fb73509fe..11fbf9615b7 100644 --- a/components/script/dom/webidls/XRRigidTransform.webidl +++ b/components/script/dom/webidls/XRRigidTransform.webidl @@ -6,7 +6,7 @@ // https://immersive-web.github.io/webxr/#xrrigidtransform-interface -[SecureContext, Exposed=Window, Pref="dom.webxr.enabled"] +[SecureContext, Exposed=Window, Pref="dom_webxr_enabled"] interface XRRigidTransform { [Throws] constructor(optional DOMPointInit position = {}, optional DOMPointInit orientation = {}); readonly attribute DOMPointReadOnly position; diff --git a/components/script/dom/webidls/XRSession.webidl b/components/script/dom/webidls/XRSession.webidl index a214d6aa133..ccd72b187c6 100644 --- a/components/script/dom/webidls/XRSession.webidl +++ b/components/script/dom/webidls/XRSession.webidl @@ -25,7 +25,7 @@ enum XRInteractionMode { callback XRFrameRequestCallback = undefined (DOMHighResTimeStamp time, XRFrame frame); -[SecureContext, Exposed=Window, Pref="dom.webxr.enabled"] +[SecureContext, Exposed=Window, Pref="dom_webxr_enabled"] interface XRSession : EventTarget { // Attributes readonly attribute XRVisibilityState visibilityState; diff --git a/components/script/dom/webidls/XRSessionEvent.webidl b/components/script/dom/webidls/XRSessionEvent.webidl index 19ddd9e1b95..4e48f0c6c5c 100644 --- a/components/script/dom/webidls/XRSessionEvent.webidl +++ b/components/script/dom/webidls/XRSessionEvent.webidl @@ -6,7 +6,7 @@ // https://immersive-web.github.io/webxr/#xrsessionevent-interface -[SecureContext, Exposed=Window, Pref="dom.webxr.enabled"] +[SecureContext, Exposed=Window, Pref="dom_webxr_enabled"] interface XRSessionEvent : Event { [Throws] constructor(DOMString type, XRSessionEventInit eventInitDict); [SameObject] readonly attribute XRSession session; diff --git a/components/script/dom/webidls/XRSpace.webidl b/components/script/dom/webidls/XRSpace.webidl index 3f85f4e4a52..236c9164402 100644 --- a/components/script/dom/webidls/XRSpace.webidl +++ b/components/script/dom/webidls/XRSpace.webidl @@ -6,7 +6,7 @@ // https://immersive-web.github.io/webxr/#xrspace-interface -[SecureContext, Exposed=Window, Pref="dom.webxr.enabled"] +[SecureContext, Exposed=Window, Pref="dom_webxr_enabled"] interface XRSpace : EventTarget { // XRRigidTransform? getTransformTo(XRSpace other); }; diff --git a/components/script/dom/webidls/XRSubImage.webidl b/components/script/dom/webidls/XRSubImage.webidl index 109ee39513b..3e8efdb24d7 100644 --- a/components/script/dom/webidls/XRSubImage.webidl +++ b/components/script/dom/webidls/XRSubImage.webidl @@ -5,7 +5,7 @@ // skip-unless CARGO_FEATURE_WEBXR // https://immersive-web.github.io/layers/#xrsubimagetype -[SecureContext, Exposed=Window, Pref="dom.webxr.layers.enabled"] +[SecureContext, Exposed=Window, Pref="dom_webxr_layers_enabled"] interface XRSubImage { [SameObject] readonly attribute XRViewport viewport; }; diff --git a/components/script/dom/webidls/XRSystem.webidl b/components/script/dom/webidls/XRSystem.webidl index 41682865cd4..ef5537ebdac 100644 --- a/components/script/dom/webidls/XRSystem.webidl +++ b/components/script/dom/webidls/XRSystem.webidl @@ -5,7 +5,7 @@ // skip-unless CARGO_FEATURE_WEBXR // https://immersive-web.github.io/webxr/#xrsystem-interface -[SecureContext, Exposed=Window, Pref="dom.webxr.enabled"] +[SecureContext, Exposed=Window, Pref="dom_webxr_enabled"] interface XRSystem: EventTarget { // Methods Promise isSessionSupported(XRSessionMode mode); @@ -17,7 +17,7 @@ interface XRSystem: EventTarget { [SecureContext] partial interface Navigator { - [SameObject, Pref="dom.webxr.enabled"] readonly attribute XRSystem xr; + [SameObject, Pref="dom_webxr_enabled"] readonly attribute XRSystem xr; }; enum XRSessionMode { @@ -33,5 +33,5 @@ dictionary XRSessionInit { partial interface XRSystem { // https://github.com/immersive-web/webxr-test-api/ - [SameObject, Pref="dom.webxr.test"] readonly attribute XRTest test; + [SameObject, Pref="dom_webxr_test"] readonly attribute XRTest test; }; diff --git a/components/script/dom/webidls/XRTest.webidl b/components/script/dom/webidls/XRTest.webidl index 2421f873976..710d3520249 100644 --- a/components/script/dom/webidls/XRTest.webidl +++ b/components/script/dom/webidls/XRTest.webidl @@ -6,7 +6,7 @@ // https://github.com/immersive-web/webxr-test-api/ -[Exposed=Window, Pref="dom.webxr.test"] +[Exposed=Window, Pref="dom_webxr_test"] interface XRTest { // Simulates connecting a device to the system. // Used to instantiate a fake device for use in tests. diff --git a/components/script/dom/webidls/XRView.webidl b/components/script/dom/webidls/XRView.webidl index 2050afe028a..235eb5a6b2b 100644 --- a/components/script/dom/webidls/XRView.webidl +++ b/components/script/dom/webidls/XRView.webidl @@ -12,7 +12,7 @@ enum XREye { "none", }; -[SecureContext, Exposed=Window, Pref="dom.webxr.enabled"] +[SecureContext, Exposed=Window, Pref="dom_webxr_enabled"] interface XRView { readonly attribute XREye eye; readonly attribute Float32Array projectionMatrix; diff --git a/components/script/dom/webidls/XRViewerPose.webidl b/components/script/dom/webidls/XRViewerPose.webidl index 06274c3dfeb..82f57571f8f 100644 --- a/components/script/dom/webidls/XRViewerPose.webidl +++ b/components/script/dom/webidls/XRViewerPose.webidl @@ -6,7 +6,7 @@ // https://immersive-web.github.io/webxr/#xrviewerpose-interface -[SecureContext, Exposed=Window, Pref="dom.webxr.enabled"] +[SecureContext, Exposed=Window, Pref="dom_webxr_enabled"] interface XRViewerPose : XRPose { // readonly attribute FrozenArray views; // workaround until we have FrozenArray diff --git a/components/script/dom/webidls/XRViewport.webidl b/components/script/dom/webidls/XRViewport.webidl index 079c2d11e2d..4fc6c7afd86 100644 --- a/components/script/dom/webidls/XRViewport.webidl +++ b/components/script/dom/webidls/XRViewport.webidl @@ -6,7 +6,7 @@ // https://immersive-web.github.io/webxr/#xrviewport-interface -[SecureContext, Exposed=Window, Pref="dom.webxr.enabled"] +[SecureContext, Exposed=Window, Pref="dom_webxr_enabled"] interface XRViewport { readonly attribute long x; readonly attribute long y; diff --git a/components/script/dom/webidls/XRWebGLBinding.webidl b/components/script/dom/webidls/XRWebGLBinding.webidl index 5bcb4b381fa..121c2c1db86 100644 --- a/components/script/dom/webidls/XRWebGLBinding.webidl +++ b/components/script/dom/webidls/XRWebGLBinding.webidl @@ -5,7 +5,7 @@ // skip-unless CARGO_FEATURE_WEBXR // https://immersive-web.github.io/layers/#XRWebGLBindingtype -[SecureContext, Exposed=Window, Pref="dom.webxr.layers.enabled"] +[SecureContext, Exposed=Window, Pref="dom_webxr_layers_enabled"] interface XRWebGLBinding { [Throws] constructor(XRSession session, XRWebGLRenderingContext context); diff --git a/components/script/dom/webidls/XRWebGLLayer.webidl b/components/script/dom/webidls/XRWebGLLayer.webidl index c3bd54b3d03..e69033fcd2a 100644 --- a/components/script/dom/webidls/XRWebGLLayer.webidl +++ b/components/script/dom/webidls/XRWebGLLayer.webidl @@ -18,7 +18,7 @@ dictionary XRWebGLLayerInit { double framebufferScaleFactor = 1.0; }; -[SecureContext, Exposed=Window, Pref="dom.webxr.enabled"] +[SecureContext, Exposed=Window, Pref="dom_webxr_enabled"] interface XRWebGLLayer: XRLayer { [Throws] constructor(XRSession session, XRWebGLRenderingContext context, @@ -40,5 +40,5 @@ interface XRWebGLLayer: XRLayer { }; partial interface mixin WebGLRenderingContextBase { - [Pref="dom.webxr.enabled"] Promise makeXRCompatible(); + [Pref="dom_webxr_enabled"] Promise makeXRCompatible(); }; diff --git a/components/script/dom/webidls/XRWebGLSubImage.webidl b/components/script/dom/webidls/XRWebGLSubImage.webidl index d93f12ff4c5..83ccdd91166 100644 --- a/components/script/dom/webidls/XRWebGLSubImage.webidl +++ b/components/script/dom/webidls/XRWebGLSubImage.webidl @@ -5,7 +5,7 @@ // skip-unless CARGO_FEATURE_WEBXR // https://immersive-web.github.io/layers/#xrwebglsubimagetype -[SecureContext, Exposed=Window, Pref="dom.webxr.layers.enabled"] +[SecureContext, Exposed=Window, Pref="dom_webxr_layers_enabled"] interface XRWebGLSubImage : XRSubImage { [SameObject] readonly attribute WebGLTexture colorTexture; [SameObject] readonly attribute WebGLTexture? depthStencilTexture; diff --git a/components/script/dom/webxr/xrsystem.rs b/components/script/dom/webxr/xrsystem.rs index 82736d540e9..f5f50ab93f1 100644 --- a/components/script/dom/webxr/xrsystem.rs +++ b/components/script/dom/webxr/xrsystem.rs @@ -168,7 +168,7 @@ impl XRSystemMethods for XRSystem { if mode != XRSessionMode::Inline { if !ScriptThread::is_user_interacting() { - if pref!(dom.webxr.unsafe_assume_user_intent) { + if pref!(dom_webxr_unsafe_assume_user_intent) { warn!("The dom.webxr.unsafe-assume-user-intent preference assumes user intent to enter WebXR."); } else { promise.reject_error(Error::Security); @@ -232,7 +232,7 @@ impl XRSystemMethods for XRSystem { let init = SessionInit { required_features, optional_features, - first_person_observer_view: pref!(dom.webxr.first_person_observer_view), + first_person_observer_view: pref!(dom_webxr_first_person_observer_view), }; let mut trusted = Some(TrustedPromise::new(promise.clone())); diff --git a/components/script/dom/window.rs b/components/script/dom/window.rs index 2b79e923590..41fd03f3996 100644 --- a/components/script/dom/window.rs +++ b/components/script/dom/window.rs @@ -802,7 +802,7 @@ impl WindowMethods for Window { // https://html.spec.whatwg.org/multipage/#script-closable let is_script_closable = (self.is_top_level() && history_length == 1) || is_auxiliary || - pref!(dom.allow_scripts_to_close_windows); + pref!(dom_allow_scripts_to_close_windows); // TODO: rest of Step 3: // Is the incumbent settings object's responsible browsing context familiar with current? diff --git a/components/script/init.rs b/components/script/init.rs index 324714a3831..f2e88f6ea1a 100644 --- a/components/script/init.rs +++ b/components/script/init.rs @@ -62,7 +62,7 @@ unsafe extern "C" fn is_dom_object(obj: *mut JSObject) -> bool { #[allow(unsafe_code)] pub fn init() -> JSEngineSetup { unsafe { - if pref!(js.disable_jit) { + if pref!(js_disable_jit) { js::jsapi::DisableJitBackend(); } proxyhandler::init(); diff --git a/components/script/script_runtime.rs b/components/script/script_runtime.rs index 5f084685445..910e1ba0ef7 100644 --- a/components/script/script_runtime.rs +++ b/components/script/script_runtime.rs @@ -615,24 +615,24 @@ impl Runtime { JS_SetGlobalJitCompilerOption( cx, JSJitCompilerOption::JSJITCOMPILER_BASELINE_INTERPRETER_ENABLE, - pref!(js.baseline_interpreter.enabled) as u32, + pref!(js_baseline_interpreter_enabled) as u32, ); JS_SetGlobalJitCompilerOption( cx, JSJitCompilerOption::JSJITCOMPILER_BASELINE_ENABLE, - pref!(js.baseline_jit.enabled) as u32, + pref!(js_baseline_jit_enabled) as u32, ); JS_SetGlobalJitCompilerOption( cx, JSJitCompilerOption::JSJITCOMPILER_ION_ENABLE, - pref!(js.ion.enabled) as u32, + pref!(js_ion_enabled) as u32, ); - cx_opts.compileOptions_.asmJSOption_ = if pref!(js.asmjs.enabled) { + cx_opts.compileOptions_.asmJSOption_ = if pref!(js_asmjs_enabled) { AsmJSOption::Enabled } else { AsmJSOption::DisabledByAsmJSPref }; - let wasm_enabled = pref!(js.wasm.enabled); + let wasm_enabled = pref!(js_wasm_enabled); cx_opts.set_wasm_(wasm_enabled); if wasm_enabled { // If WASM is enabled without setting the buildIdOp, @@ -640,20 +640,20 @@ impl Runtime { // https://dxr.mozilla.org/mozilla-central/source/js/src/wasm/WasmTypes.cpp#458 SetProcessBuildIdOp(Some(servo_build_id)); } - cx_opts.set_wasmBaseline_(pref!(js.wasm.baseline.enabled)); - cx_opts.set_wasmIon_(pref!(js.wasm.ion.enabled)); + cx_opts.set_wasmBaseline_(pref!(js_wasm_baseline_enabled)); + cx_opts.set_wasmIon_(pref!(js_wasm_ion_enabled)); // TODO: handle js.throw_on_asmjs_validation_failure (needs new Spidermonkey) JS_SetGlobalJitCompilerOption( cx, JSJitCompilerOption::JSJITCOMPILER_NATIVE_REGEXP_ENABLE, - pref!(js.native_regex.enabled) as u32, + pref!(js_native_regex_enabled) as u32, ); - JS_SetParallelParsingEnabled(cx, pref!(js.parallel_parsing.enabled)); - JS_SetOffthreadIonCompilationEnabled(cx, pref!(js.offthread_compilation.enabled)); + JS_SetParallelParsingEnabled(cx, pref!(js_parallel_parsing_enabled)); + JS_SetOffthreadIonCompilationEnabled(cx, pref!(js_offthread_compilation_enabled)); JS_SetGlobalJitCompilerOption( cx, JSJitCompilerOption::JSJITCOMPILER_BASELINE_WARMUP_TRIGGER, - if pref!(js.baseline_jit.unsafe_eager_compilation.enabled) { + if pref!(js_baseline_jit_unsafe_eager_compilation_enabled) { 0 } else { u32::MAX @@ -662,7 +662,7 @@ impl Runtime { JS_SetGlobalJitCompilerOption( cx, JSJitCompilerOption::JSJITCOMPILER_ION_NORMAL_WARMUP_TRIGGER, - if pref!(js.ion.unsafe_eager_compilation.enabled) { + if pref!(js_ion_unsafe_eager_compilation_enabled) { 0 } else { u32::MAX @@ -676,7 +676,7 @@ impl Runtime { JS_SetGCParameter( cx, JSGCParamKey::JSGC_MAX_BYTES, - in_range(pref!(js.mem.max), 1, 0x100) + in_range(pref!(js_mem_max), 1, 0x100) .map(|val| (val * 1024 * 1024) as u32) .unwrap_or(u32::MAX), ); @@ -684,49 +684,49 @@ impl Runtime { JS_SetGCParameter( cx, JSGCParamKey::JSGC_INCREMENTAL_GC_ENABLED, - pref!(js.mem.gc.incremental.enabled) as u32, + pref!(js_mem_gc_incremental_enabled) as u32, ); JS_SetGCParameter( cx, JSGCParamKey::JSGC_PER_ZONE_GC_ENABLED, - pref!(js.mem.gc.per_zone.enabled) as u32, + pref!(js_mem_gc_per_zone_enabled) as u32, ); - if let Some(val) = in_range(pref!(js.mem.gc.incremental.slice_ms), 0, 100_000) { + if let Some(val) = in_range(pref!(js_mem_gc_incremental_slice_ms), 0, 100_000) { JS_SetGCParameter(cx, JSGCParamKey::JSGC_SLICE_TIME_BUDGET_MS, val as u32); } JS_SetGCParameter( cx, JSGCParamKey::JSGC_COMPACTING_ENABLED, - pref!(js.mem.gc.compacting.enabled) as u32, + pref!(js_mem_gc_compacting_enabled) as u32, ); - if let Some(val) = in_range(pref!(js.mem.gc.high_frequency_time_limit_ms), 0, 10_000) { + if let Some(val) = in_range(pref!(js_mem_gc_high_frequency_time_limit_ms), 0, 10_000) { JS_SetGCParameter(cx, JSGCParamKey::JSGC_HIGH_FREQUENCY_TIME_LIMIT, val as u32); } - if let Some(val) = in_range(pref!(js.mem.gc.low_frequency_heap_growth), 0, 10_000) { + if let Some(val) = in_range(pref!(js_mem_gc_low_frequency_heap_growth), 0, 10_000) { JS_SetGCParameter(cx, JSGCParamKey::JSGC_LOW_FREQUENCY_HEAP_GROWTH, val as u32); } - if let Some(val) = in_range(pref!(js.mem.gc.high_frequency_heap_growth_min), 0, 10_000) { + if let Some(val) = in_range(pref!(js_mem_gc_high_frequency_heap_growth_min), 0, 10_000) { JS_SetGCParameter( cx, JSGCParamKey::JSGC_HIGH_FREQUENCY_LARGE_HEAP_GROWTH, val as u32, ); } - if let Some(val) = in_range(pref!(js.mem.gc.high_frequency_heap_growth_max), 0, 10_000) { + if let Some(val) = in_range(pref!(js_mem_gc_high_frequency_heap_growth_max), 0, 10_000) { JS_SetGCParameter( cx, JSGCParamKey::JSGC_HIGH_FREQUENCY_SMALL_HEAP_GROWTH, val as u32, ); } - if let Some(val) = in_range(pref!(js.mem.gc.high_frequency_low_limit_mb), 0, 10_000) { + if let Some(val) = in_range(pref!(js_mem_gc_high_frequency_low_limit_mb), 0, 10_000) { JS_SetGCParameter(cx, JSGCParamKey::JSGC_SMALL_HEAP_SIZE_MAX, val as u32); } - if let Some(val) = in_range(pref!(js.mem.gc.high_frequency_high_limit_mb), 0, 10_000) { + if let Some(val) = in_range(pref!(js_mem_gc_high_frequency_high_limit_mb), 0, 10_000) { JS_SetGCParameter(cx, JSGCParamKey::JSGC_LARGE_HEAP_SIZE_MIN, val as u32); } - /*if let Some(val) = in_range(pref!(js.mem.gc.allocation_threshold_factor), 0, 10_000) { + /*if let Some(val) = in_range(pref!(js_mem_gc_allocation_threshold_factor), 0, 10_000) { JS_SetGCParameter(cx, JSGCParamKey::JSGC_NON_INCREMENTAL_FACTOR, val as u32); }*/ /* @@ -736,10 +736,10 @@ impl Runtime { // JSGC_LARGE_HEAP_INCREMENTAL_LIMIT pref("javascript.options.mem.gc_large_heap_incremental_limit", 110); */ - if let Some(val) = in_range(pref!(js.mem.gc.empty_chunk_count_min), 0, 10_000) { + if let Some(val) = in_range(pref!(js_mem_gc_empty_chunk_count_min), 0, 10_000) { JS_SetGCParameter(cx, JSGCParamKey::JSGC_MIN_EMPTY_CHUNK_COUNT, val as u32); } - if let Some(val) = in_range(pref!(js.mem.gc.empty_chunk_count_max), 0, 10_000) { + if let Some(val) = in_range(pref!(js_mem_gc_empty_chunk_count_max), 0, 10_000) { JS_SetGCParameter(cx, JSGCParamKey::JSGC_MAX_EMPTY_CHUNK_COUNT, val as u32); } @@ -911,11 +911,11 @@ unsafe extern "C" fn servo_build_id(build_id: *mut BuildIdCharVector) -> bool { unsafe fn set_gc_zeal_options(cx: *mut RawJSContext) { use js::jsapi::SetGCZeal; - let level = match pref!(js.mem.gc.zeal.level) { + let level = match pref!(js_mem_gc_zeal_level) { level @ 0..=14 => level as u8, _ => return, }; - let frequency = match pref!(js.mem.gc.zeal.frequency) { + let frequency = match pref!(js_mem_gc_zeal_frequency) { frequency if frequency >= 0 => frequency as u32, // https://searchfox.org/mozilla-esr128/source/js/public/GCAPI.h#1392 _ => 5000, diff --git a/components/script/script_thread.rs b/components/script/script_thread.rs index a4704cb2b42..0cf14937c4c 100644 --- a/components/script/script_thread.rs +++ b/components/script/script_thread.rs @@ -2794,7 +2794,7 @@ impl ScriptThread { self.background_hang_monitor.unregister(); // If we're in multiprocess mode, shut-down the IPC router for this process. - if opts::multiprocess() { + if opts::get().multiprocess { debug!("Exiting IPC router thread in script thread."); ROUTER.shutdown(); } diff --git a/components/script/serviceworker_manager.rs b/components/script/serviceworker_manager.rs index 9f1ad777110..23723ca39df 100644 --- a/components/script/serviceworker_manager.rs +++ b/components/script/serviceworker_manager.rs @@ -517,5 +517,5 @@ impl ServiceWorkerManagerFactory for ServiceWorkerManager { } pub(crate) fn serviceworker_enabled() -> bool { - pref!(dom.serviceworker.enabled) + pref!(dom_serviceworker_enabled) } diff --git a/components/script/timers.rs b/components/script/timers.rs index 9999dac01d7..60b079ebcf8 100644 --- a/components/script/timers.rs +++ b/components/script/timers.rs @@ -237,7 +237,7 @@ impl OneshotTimers { } pub(crate) fn slow_down(&self) { - let min_duration_ms = pref!(js.timers.minimum_duration) as u64; + let min_duration_ms = pref!(js_timers_minimum_duration) as u64; self.js_timers .set_min_duration(Duration::from_millis(min_duration_ms)); } diff --git a/components/servo/lib.rs b/components/servo/lib.rs index 93f51c318eb..d9b2e560fba 100644 --- a/components/servo/lib.rs +++ b/components/servo/lib.rs @@ -78,6 +78,8 @@ use profile_traits::{mem, time}; use script::{JSEngineSetup, ServiceWorkerManager}; use script_layout_interface::LayoutFactory; use script_traits::{ScriptToConstellationChan, WindowSizeData}; +use servo_config::opts::Opts; +use servo_config::prefs::Preferences; use servo_config::{opts, pref, prefs}; use servo_media::player::context::GlContext; use servo_media::ServoMedia; @@ -232,6 +234,8 @@ where )] #[allow(clippy::new_ret_no_self)] pub fn new( + opts: Opts, + preferences: Preferences, rendering_context: RenderingContext, mut embedder: Box, window: Rc, @@ -239,8 +243,13 @@ where composite_target: CompositeTarget, ) -> Servo { // Global configuration options, parsed from the command line. + opts::set_options(opts); let opts = opts::get(); + // Set the preferences globally. + // TODO: It would be better to make these private to a particular Servo instance. + servo_config::prefs::set(preferences); + use std::sync::atomic::Ordering; style::context::DEFAULT_DISABLE_STYLE_SHARING_CACHE @@ -309,9 +318,9 @@ where ); let mem_profiler_chan = profile_mem::Profiler::create(opts.mem_profiler_period); - let devtools_sender = if opts.devtools_server_enabled { + let devtools_sender = if pref!(devtools_server_enabled) { Some(devtools::start_server( - opts.devtools_port, + pref!(devtools_server_port) as u16, embedder_proxy.clone(), )) } else { @@ -330,7 +339,7 @@ where ); let render_notifier = Box::new(RenderNotifier::new(compositor_proxy.clone())); - let clear_color = servo_config::pref!(shell.background_color.rgba); + let clear_color = servo_config::pref!(shell_background_color_rgba); let clear_color = ColorF::new( clear_color[0] as f32, clear_color[1] as f32, @@ -346,8 +355,8 @@ where }; let worker_threads = thread::available_parallelism() .map(|i| i.get()) - .unwrap_or(pref!(threadpools.fallback_worker_num) as usize) - .min(pref!(threadpools.webrender_workers.max).max(1) as usize); + .unwrap_or(pref!(threadpools_fallback_worker_num) as usize) + .min(pref!(threadpools_webrender_workers_max).max(1) as usize); let workers = Some(Arc::new( rayon::ThreadPoolBuilder::new() .num_threads(worker_threads) @@ -372,9 +381,9 @@ where } else { ShaderPrecacheFlags::empty() }, - enable_subpixel_aa: pref!(gfx.subpixel_text_antialiasing.enabled) && + enable_subpixel_aa: pref!(gfx_subpixel_text_antialiasing_enabled) && !opts.debug.disable_subpixel_text_antialiasing, - allow_texture_swizzling: pref!(gfx.texture_swizzling.enabled), + allow_texture_swizzling: pref!(gfx_texture_swizzling_enabled), clear_color, upload_method, workers, @@ -427,7 +436,7 @@ where webxr::MainThreadRegistry::new(event_loop_waker, webxr_layer_grand_manager) .expect("Failed to create WebXR device registry"); #[cfg(feature = "webxr")] - if pref!(dom.webxr.enabled) { + if pref!(dom_webxr_enabled) { embedder.register_webxr(&mut webxr_main_thread, embedder_proxy.clone()); } @@ -587,7 +596,7 @@ where external_images: Arc>, rendering_context: &RenderingContext, ) -> (WindowGLContext, Option) { - if !pref!(media.glvideo.enabled) { + if !pref!(media_glvideo_enabled) { return ( WindowGLContext { gl_context: GlContext::Unknown, @@ -1192,7 +1201,7 @@ pub fn run_content_process(token: String) { let unprivileged_content = unprivileged_content_receiver.recv().unwrap(); opts::set_options(unprivileged_content.opts()); - prefs::add_user_prefs(unprivileged_content.prefs()); + prefs::set(unprivileged_content.prefs().clone()); // Enter the sandbox if necessary. if opts::get().sandbox { diff --git a/components/shared/canvas/webgl.rs b/components/shared/canvas/webgl.rs index 4fb5691fd58..8bd1d9cd440 100644 --- a/components/shared/canvas/webgl.rs +++ b/components/shared/canvas/webgl.rs @@ -33,7 +33,7 @@ pub fn webgl_channel() -> Option<(WebGLSender, WebGLReceiver)> where T: for<'de> Deserialize<'de> + Serialize, { - base::generic_channel::channel(servo_config::opts::multiprocess()) + base::generic_channel::channel(servo_config::opts::get().multiprocess) } /// Entry point channel type used for sending WebGLMsg messages to the WebGL renderer. diff --git a/components/shared/embedder/resources.rs b/components/shared/embedder/resources.rs index 9fdb8548135..a29abf5328b 100644 --- a/components/shared/embedder/resources.rs +++ b/components/shared/embedder/resources.rs @@ -55,9 +55,6 @@ pub fn sandbox_access_files_dirs() -> Vec { } pub enum Resource { - /// A json file of `servo_config::pref_util::Preferences` configuration. - /// It can be empty but lots of features will be disabled. - Preferences, /// A list of GATT services that are blocked from being used by web bluetooth. /// The format of the file is a list of UUIDs, one per line, with an optional second word to specify the /// type of blocklist. @@ -121,7 +118,6 @@ pub enum Resource { impl Resource { pub fn filename(&self) -> &'static str { match self { - Resource::Preferences => "prefs.json", Resource::BluetoothBlocklist => "gatt_blocklist.txt", Resource::DomainList => "public_domains.txt", Resource::HstsPreloadList => "hsts_preload.json", @@ -164,7 +160,6 @@ fn resources_for_tests() -> Box { } fn read(&self, file: Resource) -> Vec { match file { - Resource::Preferences => &include_bytes!("../../../resources/prefs.json")[..], Resource::BluetoothBlocklist => { &include_bytes!("../../../resources/gatt_blocklist.txt")[..] }, diff --git a/components/webdriver_server/lib.rs b/components/webdriver_server/lib.rs index 74b0a0b8f23..c99cd726275 100644 --- a/components/webdriver_server/lib.rs +++ b/components/webdriver_server/lib.rs @@ -41,8 +41,7 @@ use serde::de::{Deserializer, MapAccess, Visitor}; use serde::ser::Serializer; use serde::{Deserialize, Serialize}; use serde_json::{json, Value}; -use servo_config::prefs; -use servo_config::prefs::PrefValue; +use servo_config::prefs::{self, PrefValue, Preferences}; use servo_url::ServoUrl; use style_traits::CSSPixel; use uuid::Uuid; @@ -295,7 +294,6 @@ impl Serialize for WebDriverPrefValue { PrefValue::Str(ref s) => serializer.serialize_str(s), PrefValue::Float(f) => serializer.serialize_f64(f), PrefValue::Int(i) => serializer.serialize_i64(i), - PrefValue::Missing => serializer.serialize_unit(), PrefValue::Array(ref v) => v .iter() .map(|value| WebDriverPrefValue(value.clone())) @@ -1759,7 +1757,7 @@ impl Handler { .map(|item| { ( item.clone(), - serde_json::to_value(prefs::pref_map().get(item)).unwrap(), + serde_json::to_value(prefs::get().get_value(item)).unwrap(), ) }) .collect::>(); @@ -1773,12 +1771,12 @@ impl Handler { &self, parameters: &SetPrefsParameters, ) -> WebDriverResult { + let mut current_preferences = prefs::get().clone(); for (key, value) in parameters.prefs.iter() { - prefs::set_stylo_pref(key, value.0.clone()); - prefs::pref_map() - .set(key, value.0.clone()) - .expect("Failed to set preference"); + current_preferences.set_value(key, value.0.clone()); } + prefs::set(current_preferences); + Ok(WebDriverResponse::Void) } @@ -1786,27 +1784,29 @@ impl Handler { &self, parameters: &GetPrefsParameters, ) -> WebDriverResult { - let prefs = if parameters.prefs.is_empty() { - //TODO: support resetting stylo preferences - prefs::pref_map().reset_all(); - BTreeMap::new() + let (new_preferences, map) = if parameters.prefs.is_empty() { + (Preferences::default(), BTreeMap::new()) } else { - parameters + // If we only want to reset some of the preferences. + let mut new_preferences = prefs::get().clone(); + let default_preferences = Preferences::default(); + for key in parameters.prefs.iter() { + new_preferences.set_value(key, default_preferences.get_value(key)) + } + + let map = parameters .prefs .iter() - .map(|item| { - ( - item.clone(), - serde_json::to_value( - prefs::pref_map().reset(item).unwrap_or(PrefValue::Missing), - ) - .unwrap(), - ) - }) - .collect::>() + .map(|item| (item.clone(), new_preferences.get_value(item))) + .collect::>(); + + (new_preferences, map) }; + + prefs::set(new_preferences); + Ok(WebDriverResponse::Generic(ValueResponse( - serde_json::to_value(prefs)?, + serde_json::to_value(map)?, ))) } } diff --git a/components/webgpu/lib.rs b/components/webgpu/lib.rs index 7d953d0ca6c..f67c55ab02e 100644 --- a/components/webgpu/lib.rs +++ b/components/webgpu/lib.rs @@ -44,7 +44,7 @@ impl WebGPU { external_images: Arc>, wgpu_image_map: WGPUImageMap, ) -> Option<(Self, IpcReceiver)> { - if !pref!(dom.webgpu.enabled) { + if !pref!(dom_webgpu_enabled) { return None; } let (sender, receiver) = match ipc::channel() { diff --git a/components/webgpu/wgpu_thread.rs b/components/webgpu/wgpu_thread.rs index b2aa784754a..374fe2e8265 100644 --- a/components/webgpu/wgpu_thread.rs +++ b/components/webgpu/wgpu_thread.rs @@ -127,7 +127,7 @@ impl WGPU { external_images: Arc>, wgpu_image_map: WGPUImageMap, ) -> Self { - let backend_pref = pref!(dom.webgpu.wgpu_backend); + let backend_pref = pref!(dom_webgpu_wgpu_backend); let backends = if backend_pref.is_empty() { wgt::Backends::PRIMARY } else { diff --git a/ports/servoshell/Cargo.toml b/ports/servoshell/Cargo.toml index af50b5ebc6f..835c854ecfd 100644 --- a/ports/servoshell/Cargo.toml +++ b/ports/servoshell/Cargo.toml @@ -56,6 +56,7 @@ webxr = ["dep:webxr", "libservo/webxr"] webgpu = ["libservo/webgpu"] [dependencies] +euclid = { workspace = true } libc = { workspace = true } libservo = { path = "../../components/servo" } cfg-if = { workspace = true } @@ -104,10 +105,10 @@ webxr = { workspace = true, optional = true } # For optional feature servo_allocator/use-system-allocator servo_allocator = { path = "../../components/allocator" } arboard = { version = "3" } +dirs = "5.0" egui = { version = "0.30.0" } egui_glow = { version = "0.30.0", features = ["winit"] } egui-winit = { version = "0.30.0", default-features = false, features = ["clipboard", "wayland"] } -euclid = { workspace = true } gilrs = "0.11.0" gleam = { workspace = true } glow = "0.16.0" @@ -116,6 +117,7 @@ http = { workspace = true } net = { path = "../../components/net" } net_traits = { workspace = true } raw-window-handle = "0.6" +serde_json = { workspace = true } shellwords = "1.0.0" surfman = { workspace = true, features = ["sm-x11", "sm-raw-window-handle-06"] } tinyfiledialogs = "3.0" diff --git a/ports/servoshell/desktop/app.rs b/ports/servoshell/desktop/app.rs index b65d495ee50..8014b48cba3 100644 --- a/ports/servoshell/desktop/app.rs +++ b/ports/servoshell/desktop/app.rs @@ -15,7 +15,8 @@ use raw_window_handle::HasDisplayHandle; use servo::base::id::WebViewId; use servo::compositing::windowing::EmbedderEvent; use servo::compositing::CompositeTarget; -use servo::config::opts; +use servo::config::opts::Opts; +use servo::config::prefs::Preferences; use servo::embedder_traits::EventLoopWaker; use servo::servo_config::pref; use servo::url::ServoUrl; @@ -38,21 +39,22 @@ use crate::desktop::embedder::{EmbedderCallbacks, XrDiscovery}; use crate::desktop::tracing::trace_winit_event; use crate::desktop::window_trait::WindowPortsMethods; use crate::parser::get_default_url; +use crate::prefs::ServoShellPreferences; pub struct App { + opts: Opts, + preferences: Preferences, + servo_shell_preferences: ServoShellPreferences, servo: Option>, webviews: Option>, event_queue: Vec, suspended: Cell, windows: HashMap>, minibrowser: Option, - user_agent: Option, waker: Box, initial_url: ServoUrl, t_start: Instant, t: Instant, - do_not_use_native_titlebar: bool, - device_pixel_ratio_override: Option, } enum Present { @@ -73,38 +75,40 @@ enum PumpResult { impl App { pub fn new( + opts: Opts, + preferences: Preferences, + servo_shell_preferences: ServoShellPreferences, events_loop: &EventsLoop, - user_agent: Option, - url: Option, - do_not_use_native_titlebar: bool, - device_pixel_ratio_override: Option, ) -> Self { - // Handle browser state. - let initial_url = get_default_url(url.as_deref(), env::current_dir().unwrap(), |path| { - fs::metadata(path).is_ok() - }); + let initial_url = get_default_url( + servo_shell_preferences.url.as_deref(), + env::current_dir().unwrap(), + |path| fs::metadata(path).is_ok(), + &servo_shell_preferences, + ); + let t = Instant::now(); App { + opts, + preferences, + servo_shell_preferences, event_queue: vec![], webviews: None, servo: None, suspended: Cell::new(false), windows: HashMap::new(), minibrowser: None, - user_agent, waker: events_loop.create_event_loop_waker(), initial_url: initial_url.clone(), t_start: t, t, - do_not_use_native_titlebar, - device_pixel_ratio_override, } } /// Initialize Application once event loop start running. pub fn init(&mut self, event_loop: Option<&ActiveEventLoop>) { // Create rendering context - let rendering_context = if opts::get().headless { + let rendering_context = if self.opts.headless { let connection = Connection::new().expect("Failed to create connection"); let adapter = connection .create_software_adapter() @@ -112,7 +116,7 @@ impl App { RenderingContext::create( &connection, &adapter, - Some(opts::get().initial_window_size.to_untyped().to_i32()), + Some(self.opts.initial_window_size.to_untyped().to_i32()), ) .expect("Failed to create WR surfman") } else { @@ -129,18 +133,20 @@ impl App { .expect("Failed to create WR surfman") }; - let window = if opts::get().headless { + let window = if self.opts.headless { headless_window::Window::new( - opts::get().initial_window_size, - self.device_pixel_ratio_override, + self.opts.initial_window_size, + self.servo_shell_preferences.device_pixel_ratio_override, + self.opts.screen_size_override, ) } else { Rc::new(headed_window::Window::new( + &self.opts, &rendering_context, - opts::get().initial_window_size, + self.opts.initial_window_size, event_loop.unwrap(), - self.do_not_use_native_titlebar, - self.device_pixel_ratio_override, + self.servo_shell_preferences.no_native_titlebar, + self.servo_shell_preferences.device_pixel_ratio_override, )) }; @@ -171,7 +177,7 @@ impl App { self.event_queue.push(EmbedderEvent::Idle); let (_, window) = self.windows.iter().next().unwrap(); - let xr_discovery = if pref!(dom.webxr.openxr.enabled) && !opts::get().headless { + let xr_discovery = if pref!(dom_webxr_openxr_enabled) && !self.opts.headless { #[cfg(target_os = "windows")] let openxr = { let app_info = AppInfo::new("Servoshell", 0, "Servo", 0); @@ -181,7 +187,7 @@ impl App { let openxr = None; openxr - } else if pref!(dom.webxr.glwindow.enabled) && !opts::get().headless { + } else if pref!(dom_webxr_glwindow_enabled) && !self.opts.headless { let window = window.new_glwindow(event_loop.unwrap()); Some(XrDiscovery::GlWindow(GlWindowDiscovery::new(window))) } else { @@ -198,10 +204,12 @@ impl App { CompositeTarget::Window }; let mut servo = Servo::new( + self.opts.clone(), + self.preferences.clone(), rendering_context, embedder, window.clone(), - self.user_agent.clone(), + self.servo_shell_preferences.user_agent.clone(), composite_target, ); @@ -243,7 +251,7 @@ impl App { // If the Gamepad API is enabled, handle gamepad events from GilRs. // Checking for focused_webview_id should ensure we'll have a valid browsing context. - if pref!(dom.gamepad.enabled) && webviews.focused_webview_id().is_some() { + if pref!(dom_gamepad_enabled) && webviews.focused_webview_id().is_some() { webviews.handle_gamepad_events(); } @@ -254,7 +262,7 @@ impl App { let mut need_update = false; loop { // Consume and handle those embedder messages. - let servo_event_response = webviews.handle_servo_events(embedder_messages); + let servo_event_response = webviews.handle_servo_events(&self.opts, embedder_messages); need_present |= servo_event_response.need_present; need_update |= servo_event_response.need_update; @@ -524,7 +532,11 @@ impl ApplicationHandler for App { if let Some(ref minibrowser) = self.minibrowser { let webviews = &mut self.webviews.as_mut().unwrap(); let app_event_queue = &mut self.event_queue; - minibrowser.queue_embedder_events_for_minibrowser_events(webviews, app_event_queue); + minibrowser.queue_embedder_events_for_minibrowser_events( + webviews, + app_event_queue, + &self.servo_shell_preferences, + ); } self.handle_events_with_winit(event_loop, window); @@ -565,7 +577,11 @@ impl ApplicationHandler for App { if let Some(ref minibrowser) = self.minibrowser { let webviews = &mut self.webviews.as_mut().unwrap(); let app_event_queue = &mut self.event_queue; - minibrowser.queue_embedder_events_for_minibrowser_events(webviews, app_event_queue); + minibrowser.queue_embedder_events_for_minibrowser_events( + webviews, + app_event_queue, + &self.servo_shell_preferences, + ); } self.handle_events_with_winit(event_loop, window); diff --git a/ports/servoshell/desktop/cli.rs b/ports/servoshell/desktop/cli.rs index ff9315a4bb9..1241e4e2af3 100644 --- a/ports/servoshell/desktop/cli.rs +++ b/ports/servoshell/desktop/cli.rs @@ -2,16 +2,12 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ -use std::{env, panic, process}; - -use getopts::Options; -use log::error; -use servo::config::opts::{self, ArgumentParsingResult}; -use servo::servo_config::pref; +use std::{env, panic}; use crate::desktop::app::App; use crate::desktop::events_loop::EventsLoop; use crate::panic_hook; +use crate::prefs::{parse_command_line_arguments, ArgumentParsingResult}; pub fn main() { crate::crash_handler::install(); @@ -19,98 +15,23 @@ pub fn main() { crate::init_crypto(); crate::resources::init(); - // Parse the command line options and store them globally - let args: Vec = env::args().collect(); - let mut opts = Options::new(); - opts.optflag( - "", - "clean-shutdown", - "Do not shutdown until all threads have finished (macos only)", - ); - opts.optflag("b", "no-native-titlebar", "Do not use native titlebar"); - opts.optopt("", "device-pixel-ratio", "Device pixels per px", ""); - opts.optopt( - "u", - "user-agent", - "Set custom user agent string (or ios / android / desktop for platform default)", - "NCSA Mosaic/1.0 (X11;SunOS 4.1.4 sun4m)", - ); - opts.optmulti( - "", - "pref", - "A preference to set to enable", - "dom.bluetooth.enabled", - ); - opts.optmulti( - "", - "pref", - "A preference to set to disable", - "dom.webgpu.enabled=false", - ); - opts.optmulti( - "", - "prefs-file", - "Load in additional prefs from a file.", - "--prefs-file /path/to/prefs.json", - ); - - let opts_matches; - let content_process_token; - - match opts::from_cmdline_args(opts, &args) { - ArgumentParsingResult::ContentProcess(matches, token) => { - opts_matches = matches; - content_process_token = Some(token); - }, - ArgumentParsingResult::ChromeProcess(matches) => { - opts_matches = matches; - content_process_token = None; - }, - }; - - crate::prefs::register_user_prefs(&opts_matches); - // TODO: once log-panics is released, can this be replaced by // log_panics::init()? panic::set_hook(Box::new(panic_hook::panic_hook)); - if let Some(token) = content_process_token { - return servo::run_content_process(token); - } - - if opts::get().is_printing_version { - println!("{}", crate::servo_version()); - process::exit(0); - } - - let clean_shutdown = opts_matches.opt_present("clean-shutdown"); - let do_not_use_native_titlebar = - opts_matches.opt_present("no-native-titlebar") || !(pref!(shell.native_titlebar.enabled)); - let device_pixel_ratio_override = opts_matches.opt_str("device-pixel-ratio").map(|dppx_str| { - dppx_str.parse().unwrap_or_else(|err| { - error!("Error parsing option: --device-pixel-ratio ({})", err); - process::exit(1); - }) - }); - - let user_agent = opts_matches.opt_str("u"); - - let url_opt = if !opts_matches.free.is_empty() { - Some(&opts_matches.free[0][..]) - } else { - None + let args = env::args().collect(); + let (opts, preferences, servoshell_preferences) = match parse_command_line_arguments(args) { + ArgumentParsingResult::ContentProcess(token) => return servo::run_content_process(token), + ArgumentParsingResult::ChromeProcess(opts, preferences, servoshell_preferences) => { + (opts, preferences, servoshell_preferences) + }, }; - let event_loop = EventsLoop::new(opts::get().headless, opts::get().output_file.is_some()) + let clean_shutdown = servoshell_preferences.clean_shutdown; + let event_loop = EventsLoop::new(opts.headless, opts.output_file.is_some()) .expect("Failed to create events loop"); - let mut app = App::new( - &event_loop, - user_agent, - url_opt.map(|s| s.to_string()), - do_not_use_native_titlebar, - device_pixel_ratio_override, - ); + let mut app = App::new(opts, preferences, servoshell_preferences, &event_loop); event_loop.run_app(&mut app); diff --git a/ports/servoshell/desktop/embedder.rs b/ports/servoshell/desktop/embedder.rs index 16164ac199a..7d4d7d4a47d 100644 --- a/ports/servoshell/desktop/embedder.rs +++ b/ports/servoshell/desktop/embedder.rs @@ -48,7 +48,7 @@ impl EmbedderMethods for EmbedderCallbacks { xr: &mut webxr::MainThreadRegistry, _embedder_proxy: EmbedderProxy, ) { - if pref!(dom.webxr.test) { + if pref!(dom_webxr_test) { xr.register_mock(webxr::headless::HeadlessMockDiscovery::new()); } else if let Some(xr_discovery) = self.xr_discovery.take() { match xr_discovery { diff --git a/ports/servoshell/desktop/events_loop.rs b/ports/servoshell/desktop/events_loop.rs index 7dc7b803f56..1ebaf42dc67 100644 --- a/ports/servoshell/desktop/events_loop.rs +++ b/ports/servoshell/desktop/events_loop.rs @@ -8,7 +8,6 @@ use std::sync::{Arc, Condvar, Mutex}; use std::time; use log::warn; -use servo::config::{pref, set_pref}; use servo::embedder_traits::EventLoopWaker; use winit::error::EventLoopError; use winit::event_loop::EventLoop as WinitEventLoop; @@ -90,10 +89,6 @@ impl EventsLoop { }, EventLoop::Headless(ref data) => { let (flag, condvar) = &**data; - if pref!(media.glvideo.enabled) { - warn!("GL video rendering is not supported on headless windows."); - set_pref!(media.glvideo.enabled, false); - } app.init(None); loop { diff --git a/ports/servoshell/desktop/headed_window.rs b/ports/servoshell/desktop/headed_window.rs index 14f322d67a5..e0214997c2f 100644 --- a/ports/servoshell/desktop/headed_window.rs +++ b/ports/servoshell/desktop/headed_window.rs @@ -14,10 +14,11 @@ use raw_window_handle::{HasDisplayHandle, HasWindowHandle}; use servo::compositing::windowing::{ AnimationState, EmbedderCoordinates, EmbedderEvent, MouseWindowEvent, WindowMethods, }; +use servo::config::opts::Opts; use servo::embedder_traits::Cursor; use servo::keyboard_types::{Key, KeyState, KeyboardEvent}; use servo::script_traits::{TouchEventType, WheelDelta, WheelMode}; -use servo::servo_config::{opts, pref}; +use servo::servo_config::pref; use servo::servo_geometry::DeviceIndependentPixel; use servo::webrender_api::units::{DeviceIntPoint, DeviceIntRect, DeviceIntSize, DevicePixel}; use servo::webrender_api::ScrollLocation; @@ -57,14 +58,13 @@ pub struct Window { impl Window { pub fn new( + opts: &Opts, rendering_context: &RenderingContext, window_size: Size2D, event_loop: &ActiveEventLoop, no_native_titlebar: bool, device_pixel_ratio_override: Option, ) -> Window { - let opts = opts::get(); - // If there's no chrome, start off with the window invisible. It will be set to visible in // `load_end()`. This avoids an ugly flash of unstyled content (especially important since // unstyled content is white and chrome often has a transparent background). See issue @@ -625,13 +625,13 @@ impl webxr::glwindow::GlWindow for XRWindow { } fn get_mode(&self) -> webxr::glwindow::GlWindowMode { - if pref!(dom.webxr.glwindow.red_cyan) { + if pref!(dom_webxr_glwindow_red_cyan) { webxr::glwindow::GlWindowMode::StereoRedCyan - } else if pref!(dom.webxr.glwindow.left_right) { + } else if pref!(dom_webxr_glwindow_left_right) { webxr::glwindow::GlWindowMode::StereoLeftRight - } else if pref!(dom.webxr.glwindow.spherical) { + } else if pref!(dom_webxr_glwindow_spherical) { webxr::glwindow::GlWindowMode::Spherical - } else if pref!(dom.webxr.glwindow.cubemap) { + } else if pref!(dom_webxr_glwindow_cubemap) { webxr::glwindow::GlWindowMode::Cubemap } else { webxr::glwindow::GlWindowMode::Blit diff --git a/ports/servoshell/desktop/headless_window.rs b/ports/servoshell/desktop/headless_window.rs index cb9aecb909d..06dbaa5983b 100644 --- a/ports/servoshell/desktop/headless_window.rs +++ b/ports/servoshell/desktop/headless_window.rs @@ -13,7 +13,6 @@ use euclid::{Box2D, Length, Point2D, Scale, Size2D}; use servo::compositing::windowing::{ AnimationState, EmbedderCoordinates, EmbedderEvent, WindowMethods, }; -use servo::config::opts; use servo::servo_geometry::DeviceIndependentPixel; use servo::webrender_api::units::{DeviceIntSize, DevicePixel}; @@ -34,6 +33,7 @@ impl Window { pub fn new( size: Size2D, device_pixel_ratio_override: Option, + screen_size_override: Option>, ) -> Rc { let device_pixel_ratio_override: Option> = device_pixel_ratio_override.map(Scale::new); @@ -43,7 +43,7 @@ impl Window { let inner_size = Cell::new((size.to_f32() * hidpi_factor).to_i32()); let window_rect = Box2D::from_origin_and_size(Point2D::zero(), size); - let screen_size = opts::get().screen_size_override.map_or_else( + let screen_size = screen_size_override.map_or_else( || window_rect.size(), |screen_size_override| screen_size_override.to_i32(), ); diff --git a/ports/servoshell/desktop/minibrowser.rs b/ports/servoshell/desktop/minibrowser.rs index 51bfbb76ecc..8d4345a27a1 100644 --- a/ports/servoshell/desktop/minibrowser.rs +++ b/ports/servoshell/desktop/minibrowser.rs @@ -36,6 +36,7 @@ use super::geometry::winit_position_to_euclid_point; use super::webview::{LoadStatus, WebViewManager}; use super::window_trait::WindowPortsMethods; use crate::parser::location_bar_input_to_url; +use crate::prefs::ServoShellPreferences; pub struct Minibrowser { pub context: EguiGlow, @@ -497,18 +498,20 @@ impl Minibrowser { &self, browser: &WebViewManager, app_event_queue: &mut Vec, + preferences: &ServoShellPreferences, ) { for event in self.event_queue.borrow_mut().drain(..) { let browser_id = browser.focused_webview_id().unwrap(); match event { MinibrowserEvent::Go => { let location = self.location.borrow(); - if let Some(url) = location_bar_input_to_url(&location.clone()) { - app_event_queue.push(EmbedderEvent::LoadUrl(browser_id, url)); - } else { + let Some(url) = + location_bar_input_to_url(&location.clone(), &preferences.searchpage) + else { warn!("failed to parse location"); break; - } + }; + app_event_queue.push(EmbedderEvent::LoadUrl(browser_id, url)); }, MinibrowserEvent::Back => { app_event_queue.push(EmbedderEvent::Navigation( diff --git a/ports/servoshell/desktop/webview.rs b/ports/servoshell/desktop/webview.rs index 43e4007d77d..8a08ac2ec45 100644 --- a/ports/servoshell/desktop/webview.rs +++ b/ports/servoshell/desktop/webview.rs @@ -19,6 +19,7 @@ use keyboard_types::{Key, KeyboardEvent, Modifiers, ShortcutMatcher}; use log::{debug, error, info, trace, warn}; use servo::base::id::TopLevelBrowsingContextId as WebViewId; use servo::compositing::windowing::{EmbedderEvent, WebRenderDebugOption}; +use servo::config::opts::Opts; use servo::embedder_traits::{ CompositorEventVariant, ContextMenuResult, DualRumbleEffectParams, EmbedderMsg, FilterPattern, GamepadHapticEffectType, PermissionPrompt, PermissionRequest, PromptCredentialsInput, @@ -29,7 +30,6 @@ use servo::script_traits::{ GamepadEvent, GamepadIndex, GamepadInputBounds, GamepadSupportedHapticEffects, GamepadUpdateType, TouchEventType, TraversalDirection, }; -use servo::servo_config::opts; use servo::servo_url::ServoUrl; use servo::webrender_api::units::DeviceRect; use servo::webrender_api::ScrollLocation; @@ -630,6 +630,7 @@ where /// Returns true if the caller needs to manually present a new frame. pub fn handle_servo_events( &mut self, + opts: &Opts, events: Drain<'_, (Option, EmbedderMsg)>, ) -> ServoEventResponse { let mut need_present = self.load_status() != LoadStatus::LoadComplete; @@ -685,7 +686,7 @@ where self.window.request_inner_size(size); }, EmbedderMsg::Prompt(definition, origin) => { - let res = if opts::get().headless { + let res = if opts.headless { match definition { PromptDefinition::Alert(_message, sender) => sender.send(()), PromptDefinition::YesNo(_message, sender) => { @@ -927,10 +928,7 @@ where }; }, EmbedderMsg::SelectFiles(patterns, multiple_files, sender) => { - let res = match ( - opts::get().headless, - get_selected_files(patterns, multiple_files), - ) { + let res = match (opts.headless, get_selected_files(patterns, multiple_files)) { (true, _) | (false, None) => sender.send(None), (false, Some(files)) => sender.send(Some(files)), }; @@ -941,8 +939,10 @@ where }; }, EmbedderMsg::PromptPermission(prompt, sender) => { - let permission_state = prompt_user(prompt); - let _ = sender.send(permission_state); + let _ = sender.send(match opts.headless { + true => PermissionRequest::Denied, + false => prompt_user(prompt), + }); }, EmbedderMsg::ShowIME(_kind, _text, _multiline, _rect) => { debug!("ShowIME received"); @@ -1007,10 +1007,6 @@ where #[cfg(target_os = "linux")] fn prompt_user(prompt: PermissionPrompt) -> PermissionRequest { - if opts::get().headless { - return PermissionRequest::Denied; - } - let message = match prompt { PermissionPrompt::Request(permission_name) => { format!("Do you want to grant permission for {:?}?", permission_name) diff --git a/ports/servoshell/desktop/window_trait.rs b/ports/servoshell/desktop/window_trait.rs index 030fa112056..356230feeb3 100644 --- a/ports/servoshell/desktop/window_trait.rs +++ b/ports/servoshell/desktop/window_trait.rs @@ -9,7 +9,6 @@ use std::rc::Rc; use euclid::{Length, Scale}; use servo::compositing::windowing::{EmbedderEvent, WindowMethods}; -use servo::config::opts; use servo::embedder_traits::Cursor; use servo::servo_geometry::DeviceIndependentPixel; use servo::webrender_api::units::{DeviceIntPoint, DeviceIntSize, DevicePixel}; @@ -22,10 +21,7 @@ pub trait WindowPortsMethods: WindowMethods { fn id(&self) -> winit::window::WindowId; fn hidpi_factor(&self) -> Scale { self.device_pixel_ratio_override() - .unwrap_or_else(|| match opts::get().output_file { - Some(_) => Scale::new(1.0), - None => self.device_hidpi_factor(), - }) + .unwrap_or_else(|| self.device_hidpi_factor()) } fn device_hidpi_factor(&self) -> Scale; fn device_pixel_ratio_override( diff --git a/ports/servoshell/egl/android.rs b/ports/servoshell/egl/android.rs index 02eb9640e18..8845e43af85 100644 --- a/ports/servoshell/egl/android.rs +++ b/ports/servoshell/egl/android.rs @@ -7,7 +7,6 @@ mod resources; mod simpleservo; -use std::collections::HashMap; use std::os::raw::{c_char, c_int, c_void}; use std::sync::Arc; @@ -830,17 +829,6 @@ fn get_options<'local>( let native_window = unsafe { ANativeWindow_fromSurface(env.get_native_interface(), surface.as_raw()) }; - // FIXME: enable JIT compilation on 32-bit Android after the startup crash issue (#31134) is fixed. - let prefs = if cfg!(target_pointer_width = "32") { - let mut prefs = HashMap::new(); - prefs.insert("js.baseline_interpreter.enabled".to_string(), false.into()); - prefs.insert("js.baseline_jit.enabled".to_string(), false.into()); - prefs.insert("js.ion.enabled".to_string(), false.into()); - Some(prefs) - } else { - None - }; - let opts = InitOptions { args: args.unwrap_or(vec![]), url, @@ -848,7 +836,6 @@ fn get_options<'local>( density, xr_discovery: None, surfman_integration: simpleservo::SurfmanIntegration::Widget(native_window), - prefs, }; Ok((opts, log, log_str, gst_debug_str)) diff --git a/ports/servoshell/egl/android/resources.rs b/ports/servoshell/egl/android/resources.rs index fb9d837aeb6..227d97742a6 100644 --- a/ports/servoshell/egl/android/resources.rs +++ b/ports/servoshell/egl/android/resources.rs @@ -16,7 +16,6 @@ impl ResourceReaderInstance { impl ResourceReaderMethods for ResourceReaderInstance { fn read(&self, res: Resource) -> Vec { Vec::from(match res { - Resource::Preferences => &include_bytes!("../../../../resources/prefs.json")[..], Resource::HstsPreloadList => { &include_bytes!("../../../../resources/hsts_preload.json")[..] }, diff --git a/ports/servoshell/egl/android/simpleservo.rs b/ports/servoshell/egl/android/simpleservo.rs index 4d249e844d1..2e0b4786a11 100644 --- a/ports/servoshell/egl/android/simpleservo.rs +++ b/ports/servoshell/egl/android/simpleservo.rs @@ -3,23 +3,19 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ use std::cell::RefCell; -use std::collections::HashMap; use std::mem; use std::os::raw::c_void; use std::rc::Rc; -use getopts::Options; use servo::base::id::WebViewId; use servo::compositing::windowing::EmbedderEvent; use servo::compositing::CompositeTarget; -pub use servo::config::prefs::{add_user_prefs, PrefValue}; use servo::embedder_traits::resources; /// The EventLoopWaker::wake function will be called from any thread. /// It will be called to notify embedder that some events are available, /// and that perform_updates need to be called pub use servo::embedder_traits::EventLoopWaker; pub use servo::embedder_traits::{InputMethodType, MediaSessionPlaybackState, PromptResult}; -use servo::servo_config::{opts, pref}; use servo::servo_url::ServoUrl; pub use servo::webrender_api::units::DeviceIntRect; use servo::webrender_traits::RenderingContext; @@ -31,6 +27,7 @@ use crate::egl::host_trait::HostTrait; use crate::egl::servo_glue::{ Coordinates, ServoEmbedderCallbacks, ServoGlue, ServoWindowCallbacks, }; +use crate::prefs::{parse_command_line_arguments, ArgumentParsingResult}; thread_local! { pub static SERVO: RefCell> = RefCell::new(None); @@ -44,7 +41,6 @@ pub struct InitOptions { #[cfg(feature = "webxr")] pub xr_discovery: Option, pub surfman_integration: SurfmanIntegration, - pub prefs: Option>, } /// Controls how this embedding's rendering will integrate with the embedder. @@ -64,17 +60,24 @@ pub fn init( crate::init_crypto(); resources::set(Box::new(ResourceReaderInstance::new())); - if let Some(prefs) = init_opts.prefs { - add_user_prefs(prefs); - } - + // `parse_command_line_arguments` expects the first argument to be the binary name. let mut args = mem::replace(&mut init_opts.args, vec![]); - // opts::from_cmdline_args expects the first argument to be the binary name. args.insert(0, "servo".to_string()); - opts::from_cmdline_args(Options::new(), &args); + + let (opts, preferences, servoshell_preferences) = match parse_command_line_arguments(args) { + ArgumentParsingResult::ContentProcess(..) => { + unreachable!("Android does not have support for multiprocess yet.") + }, + ArgumentParsingResult::ChromeProcess(opts, preferences, servoshell_preferences) => { + (opts, preferences, servoshell_preferences) + }, + }; let embedder_url = init_opts.url.as_ref().and_then(|s| ServoUrl::parse(s).ok()); - let pref_url = ServoUrl::parse(&pref!(shell.homepage)).ok(); + let pref_url = servoshell_preferences + .url + .as_ref() + .and_then(|s| ServoUrl::parse(s).ok()); let blank_url = ServoUrl::parse("about:blank").ok(); let url = embedder_url.or(pref_url).or(blank_url).unwrap(); @@ -117,6 +120,8 @@ pub fn init( )); let servo = Servo::new( + opts, + preferences, rendering_context.clone(), embedder_callbacks, window_callbacks.clone(), @@ -125,7 +130,12 @@ pub fn init( ); SERVO.with(|s| { - let mut servo_glue = ServoGlue::new(rendering_context, servo, window_callbacks, None); + let mut servo_glue = ServoGlue::new( + rendering_context, + servo, + window_callbacks, + servoshell_preferences, + ); let _ = servo_glue.process_event(EmbedderEvent::NewWebView(url, WebViewId::new())); *s.borrow_mut() = Some(servo_glue); }); diff --git a/ports/servoshell/egl/ohos/simpleservo.rs b/ports/servoshell/egl/ohos/simpleservo.rs index d1c153ac2e6..d642db4718f 100644 --- a/ports/servoshell/egl/ohos/simpleservo.rs +++ b/ports/servoshell/egl/ohos/simpleservo.rs @@ -17,8 +17,6 @@ use servo::embedder_traits::resources; /// and that perform_updates need to be called pub use servo::embedder_traits::EventLoopWaker; use servo::euclid::Size2D; -use servo::servo_config::opts; -use servo::servo_config::opts::ArgumentParsingResult; use servo::servo_url::ServoUrl; use servo::webrender_traits::RenderingContext; use servo::{self, Servo}; @@ -31,6 +29,7 @@ use crate::egl::ohos::InitOpts; use crate::egl::servo_glue::{ Coordinates, ServoEmbedderCallbacks, ServoGlue, ServoWindowCallbacks, }; +use crate::prefs::{parse_command_line_arguments, ArgumentParsingResult}; /// Initialize Servo. At that point, we need a valid GL context. /// In the future, this will be done in multiple steps. @@ -46,53 +45,27 @@ pub fn init( crate::init_crypto(); let resource_dir = PathBuf::from(&options.resource_dir).join("servo"); resources::set(Box::new(ResourceReaderInstance::new(resource_dir))); - let mut args = vec!["servoshell".to_string()]; + // It would be nice if `from_cmdline_args()` could accept str slices, to avoid allocations here. // Then again, this code could and maybe even should be disabled in production builds. - let split_args: Vec = options - .commandline_args - .split("\u{1f}") - .map(|arg| arg.to_string()) - .collect(); - args.extend(split_args); - debug!("Servo commandline args: {:?}", args); - - let mut opts = getopts::Options::new(); - opts.optopt( - "u", - "user-agent", - "Set custom user agent string (or ios / android / desktop for platform default)", - "NCSA Mosaic/1.0 (X11;SunOS 4.1.4 sun4m)", - ); - opts.optmulti( - "", - "pref", - "A preference to set to enable", - "dom.bluetooth.enabled", - ); - opts.optmulti( - "", - "pref", - "A preference to set to disable", - "dom.webgpu.enabled=false", - ); - opts.optmulti( - "", - "prefs-file", - "Load in additional prefs from a file.", - "--prefs-file /path/to/prefs.json", + let mut args = vec!["servoshell".to_string()]; + args.extend( + options + .commandline_args + .split("\u{1f}") + .map(|arg| arg.to_string()), ); + debug!("Servo commandline args: {:?}", args); - let opts_matches = match opts::from_cmdline_args(opts, &args) { - ArgumentParsingResult::ContentProcess(matches, _token) => { - error!("Content Process mode not supported / tested yet on OpenHarmony!"); - matches + let (opts, preferences, servoshell_preferences) = match parse_command_line_arguments(args) { + ArgumentParsingResult::ContentProcess(..) => { + unreachable!("OHOS does not have support for multiprocess yet.") + }, + ArgumentParsingResult::ChromeProcess(opts, preferences, servoshell_preferences) => { + (opts, preferences, servoshell_preferences) }, - ArgumentParsingResult::ChromeProcess(matches) => matches, }; - crate::prefs::register_user_prefs(&opts_matches); - // Initialize surfman let connection = Connection::new().or(Err("Failed to create connection"))?; let adapter = connection @@ -144,11 +117,12 @@ pub fn init( )); let servo = Servo::new( + opts, + preferences, rendering_context.clone(), embedder_callbacks, window_callbacks.clone(), - // User agent: Mozilla/5.0 (; HarmonyOS 5.0) bla bla - None, + None, /* user_agent */ CompositeTarget::Window, ); @@ -156,7 +130,7 @@ pub fn init( rendering_context, servo, window_callbacks, - Some(options.resource_dir), + servoshell_preferences, ); let initial_url = ServoUrl::parse(options.url.as_str()) diff --git a/ports/servoshell/egl/servo_glue.rs b/ports/servoshell/egl/servo_glue.rs index 042bff8c957..ed3f4ae02a3 100644 --- a/ports/servoshell/egl/servo_glue.rs +++ b/ports/servoshell/egl/servo_glue.rs @@ -31,6 +31,7 @@ use servo::webrender_traits::RenderingContext; use servo::{Servo, TopLevelBrowsingContextId}; use crate::egl::host_trait::HostTrait; +use crate::prefs::ServoShellPreferences; #[derive(Clone, Debug)] pub struct Coordinates { @@ -84,7 +85,6 @@ pub struct ServoGlue { need_present: bool, callbacks: Rc, events: Vec, - resource_dir: Option, context_menu_sender: Option>, /// List of top-level browsing contexts. @@ -98,6 +98,9 @@ pub struct ServoGlue { /// The webview that is currently focused. /// Modified by EmbedderMsg::WebViewFocused and EmbedderMsg::WebViewBlurred. focused_webview_id: Option, + + /// servoshell specific preferences created during startup of the application. + servoshell_preferences: ServoShellPreferences, } #[allow(unused)] @@ -106,7 +109,7 @@ impl ServoGlue { rendering_context: RenderingContext, servo: Servo, callbacks: Rc, - resource_dir: Option, + servoshell_preferences: ServoShellPreferences, ) -> Self { Self { rendering_context, @@ -115,11 +118,11 @@ impl ServoGlue { need_present: false, callbacks, events: vec![], - resource_dir, context_menu_sender: None, webviews: HashMap::default(), creation_order: vec![], focused_webview_id: None, + servoshell_preferences, } } @@ -173,7 +176,7 @@ impl ServoGlue { /// Load an URL. pub fn load_uri(&mut self, url: &str) -> Result<(), &'static str> { info!("load_uri: {}", url); - crate::parser::location_bar_input_to_url(url) + crate::parser::location_bar_input_to_url(url, &self.servoshell_preferences.searchpage) .ok_or("Can't parse URL") .and_then(|url| { let browser_id = self.get_browser_id()?; diff --git a/ports/servoshell/panic_hook.rs b/ports/servoshell/panic_hook.rs index bb904493beb..7cbf24302af 100644 --- a/ports/servoshell/panic_hook.rs +++ b/ports/servoshell/panic_hook.rs @@ -41,6 +41,8 @@ pub(crate) fn panic_hook(info: &PanicHookInfo) { } drop(stderr); + // TODO: This shouldn't be using internal Servo options here. Perhaps this functionality should + // move into libservo itself. if opts::get().hard_fail && !opts::get().multiprocess { // When we are exiting due to a hard-failure mode, we trigger a segfault so that crash // tests detect that we crashed. If we exit normally it just looks like a non-crash exit. diff --git a/ports/servoshell/parser.rs b/ports/servoshell/parser.rs index e1635b0f8fc..d52fc64bead 100644 --- a/ports/servoshell/parser.rs +++ b/ports/servoshell/parser.rs @@ -6,7 +6,6 @@ use std::path::{Path, PathBuf}; use servo::net_traits::pub_domains::is_reg_domain; -use servo::servo_config::pref; use servo::servo_url::ServoUrl; #[cfg(not(any(target_os = "android", target_env = "ohos")))] @@ -25,6 +24,7 @@ pub fn get_default_url( url_opt: Option<&str>, cwd: impl AsRef, exists: impl FnOnce(&PathBuf) -> bool, + preferences: &crate::prefs::ServoShellPreferences, ) -> ServoUrl { // If the url is not provided, we fallback to the homepage in prefs, // or a blank page in case the homepage is not set either. @@ -48,13 +48,10 @@ pub fn get_default_url( } if new_url.is_none() && url_opt.is_some() { - new_url = location_bar_input_to_url(url_opt.unwrap()); + new_url = location_bar_input_to_url(url_opt.unwrap(), &preferences.searchpage); } - let pref_url = { - let homepage_url = pref!(shell.homepage); - parse_url_or_filename(cwd.as_ref(), &homepage_url).ok() - }; + let pref_url = parse_url_or_filename(cwd.as_ref(), &preferences.homepage).ok(); let blank_url = ServoUrl::parse("about:blank").ok(); new_url.or(pref_url).or(blank_url).unwrap() @@ -64,21 +61,15 @@ pub fn get_default_url( /// /// If this is not a valid URL, try to "fix" it by adding a scheme or if all else fails, /// interpret the string as a search term. -pub fn location_bar_input_to_url(request: &str) -> Option { +pub(crate) fn location_bar_input_to_url(request: &str, searchpage: &str) -> Option { let request = request.trim(); - ServoUrl::parse(request) - .ok() - .or_else(|| { - if request.starts_with('/') { - ServoUrl::parse(&format!("file://{}", request)).ok() - } else if request.contains('/') || is_reg_domain(request) { - ServoUrl::parse(&format!("https://{}", request)).ok() - } else { - None - } - }) - .or_else(|| { - let url = pref!(shell.searchpage).replace("%s", request); - ServoUrl::parse(&url).ok() - }) + ServoUrl::parse(request).ok().or_else(|| { + if request.starts_with('/') { + ServoUrl::parse(&format!("file://{}", request)).ok() + } else if request.contains('/') || is_reg_domain(request) { + ServoUrl::parse(&format!("https://{}", request)).ok() + } else { + ServoUrl::parse(&searchpage.replace("%s", request)).ok() + } + }) } diff --git a/ports/servoshell/prefs.rs b/ports/servoshell/prefs.rs index 100fa80c4fd..79e7d8540ae 100644 --- a/ports/servoshell/prefs.rs +++ b/ports/servoshell/prefs.rs @@ -3,123 +3,737 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ use std::collections::HashMap; -use std::fs::File; +use std::fs::{read_to_string, File}; use std::io::Read; +use std::path::{Path, PathBuf}; +use std::{env, fs, process}; -use getopts::Matches; -use servo::config::opts; -use servo::config::prefs::{self, PrefValue}; -use servo::servo_config::basedir; +use euclid::Size2D; +use getopts::{Matches, Options}; +use log::{error, warn}; +use serde_json::Value; +use servo::config::opts::{DebugOptions, Opts, OutputOptions}; +use servo::config::prefs::{PrefValue, Preferences}; +use servo::url::ServoUrl; +use url::Url; -pub fn register_user_prefs(opts_matches: &Matches) { - // Read user's prefs.json and then parse --pref command line args. +pub(crate) struct ServoShellPreferences { + /// The user agent to use for servoshell. + pub user_agent: Option, + /// A URL to load when starting servoshell. + pub url: Option, + /// An override value for the device pixel ratio. + pub device_pixel_ratio_override: Option, + /// Whether or not to attempt clean shutdown. + pub clean_shutdown: bool, + /// Enable native window's titlebar and decorations. + pub no_native_titlebar: bool, + /// URL string of the homepage. + pub homepage: String, + /// URL string of the search engine page with '%s' standing in for the search term. + /// For example . + pub searchpage: String, +} + +impl Default for ServoShellPreferences { + fn default() -> Self { + Self { + user_agent: None, + url: None, + device_pixel_ratio_override: None, + clean_shutdown: false, + homepage: "https://servo.org".into(), + no_native_titlebar: true, + searchpage: "https://duckduckgo.com/html/?q=%s".into(), + } + } +} + +#[cfg(all( + unix, + not(target_os = "macos"), + not(target_os = "ios"), + not(target_os = "android"), + not(target_env = "ohos") +))] +pub fn default_config_dir() -> Option { + let mut config_dir = ::dirs::config_dir().unwrap(); + config_dir.push("servo"); + config_dir.push("default"); + Some(config_dir) +} + +#[cfg(any(target_os = "android", target_env = "ohos"))] +pub fn default_config_dir() -> Option { + None +} + +#[cfg(target_os = "macos")] +pub fn default_config_dir() -> Option { + // FIXME: use `config_dir()` ($HOME/Library/Preferences) + // instead of `data_dir()` ($HOME/Library/Application Support) ? + let mut config_dir = ::dirs::data_dir().unwrap(); + config_dir.push("Servo"); + Some(config_dir) +} - let user_prefs_path = opts::get() - .config_dir +#[cfg(target_os = "windows")] +pub fn default_config_dir() -> Option { + let mut config_dir = ::dirs::config_dir().unwrap(); + config_dir.push("Servo"); + Some(config_dir) +} + +/// Get a Servo [`Preferences`] to use when initializing Servo by first reading the user +/// preferences file and then overriding these preferences with the ones from the `--prefs-file` +/// command-line argument, if given. +fn get_preferences(opts_matches: &Matches, config_dir: &Option) -> Preferences { + // Do not read any preferences files from the disk when testing as we do not want it + // to throw off test results. + if cfg!(test) { + return Preferences::default(); + } + + let user_prefs_path = config_dir .clone() - .or_else(basedir::default_config_dir) + .or_else(default_config_dir) .map(|path| path.join("prefs.json")) .filter(|path| path.exists()); + let user_prefs_hash = user_prefs_path.map(read_prefs_file).unwrap_or_default(); + + let apply_preferences = + |preferences: &mut Preferences, preferences_hash: HashMap| { + for (key, value) in preferences_hash.iter() { + preferences.set_value(key, value.clone()); + } + }; - let mut userprefs = if let Some(path) = user_prefs_path { - read_prefs_file(path.to_str().expect("Failed to read user prefs")) + let mut preferences = Preferences::default(); + apply_preferences(&mut preferences, user_prefs_hash); + for pref_file_path in opts_matches.opt_strs("prefs-file").iter() { + apply_preferences(&mut preferences, read_prefs_file(pref_file_path)) + } + + preferences +} + +fn read_prefs_file>(path: P) -> HashMap { + read_prefs_map(&read_to_string(path).expect("Error opening user prefs")) +} + +pub fn read_prefs_map(txt: &str) -> HashMap { + let prefs: HashMap = serde_json::from_str(txt) + .map_err(|_| panic!("Could not parse preferences JSON")) + .unwrap(); + prefs + .into_iter() + .map(|(key, value)| { + let value = (&value) + .try_into() + .map_err(|error| panic!("{error}")) + .unwrap(); + (key, value) + }) + .collect() +} + +#[allow(clippy::large_enum_variant)] +pub(crate) enum ArgumentParsingResult { + ChromeProcess(Opts, Preferences, ServoShellPreferences), + ContentProcess(String), +} + +pub(crate) fn parse_command_line_arguments(args: Vec) -> ArgumentParsingResult { + let (app_name, args) = args.split_first().unwrap(); + + let mut opts = Options::new(); + opts.optflag("", "legacy-layout", "Use the legacy layout engine"); + opts.optopt("o", "output", "Output file", "output.png"); + opts.optopt("s", "size", "Size of tiles", "512"); + opts.optflagopt( + "p", + "profile", + "Time profiler flag and either a TSV output filename \ + OR an interval for output to Stdout (blank for Stdout with interval of 5s)", + "10 \ + OR time.tsv", + ); + opts.optflagopt( + "", + "profiler-trace-path", + "Path to dump a self-contained HTML timeline of profiler traces", + "", + ); + opts.optflagopt( + "m", + "memory-profile", + "Memory profiler flag and output interval", + "10", + ); + opts.optflag("x", "exit", "Exit after load flag"); + opts.optopt( + "y", + "layout-threads", + "Number of threads to use for layout", + "1", + ); + opts.optflag( + "i", + "nonincremental-layout", + "Enable to turn off incremental layout.", + ); + opts.optflagopt( + "", + "userscripts", + "Uses userscripts in resources/user-agent-js, or a specified full path", + "", + ); + opts.optmulti( + "", + "user-stylesheet", + "A user stylesheet to be added to every document", + "file.css", + ); + opts.optopt( + "", + "shaders", + "Shaders will be loaded from the specified directory instead of using the builtin ones.", + "", + ); + opts.optflag("z", "headless", "Headless mode"); + opts.optflag( + "f", + "hard-fail", + "Exit on thread failure instead of displaying about:failure", + ); + opts.optflag( + "F", + "soft-fail", + "Display about:failure on thread failure instead of exiting", + ); + opts.optflagopt("", "devtools", "Start remote devtools server on port", "0"); + opts.optflagopt( + "", + "webdriver", + "Start remote WebDriver server on port", + "7000", + ); + opts.optopt( + "", + "window-size", + "Set the initial window size in logical (device independenrt) pixels", + "1024x740", + ); + opts.optopt( + "", + "screen-size", + "Override the screen resolution in logical (device independent) pixels", + "1024x768", + ); + opts.optflag("M", "multiprocess", "Run in multiprocess mode"); + opts.optflag("B", "bhm", "Background Hang Monitor enabled"); + opts.optflag("S", "sandbox", "Run in a sandbox if multiprocess"); + opts.optopt( + "", + "random-pipeline-closure-probability", + "Probability of randomly closing a pipeline (for testing constellation hardening).", + "0.0", + ); + opts.optopt( + "", + "random-pipeline-closure-seed", + "A fixed seed for repeatbility of random pipeline closure.", + "", + ); + opts.optmulti( + "Z", + "debug", + "A comma-separated string of debug options. Pass help to show available options.", + "", + ); + opts.optflag("h", "help", "Print this message"); + opts.optopt( + "", + "resources-path", + "Path to find static resources", + "/home/servo/resources", + ); + opts.optopt( + "", + "certificate-path", + "Path to find SSL certificates", + "/home/servo/resources/certs", + ); + opts.optflag( + "", + "ignore-certificate-errors", + "Whether or not to completely ignore certificate errors", + ); + opts.optopt( + "", + "content-process", + "Run as a content process and connect to the given pipe", + "servo-ipc-channel.abcdefg", + ); + opts.optopt( + "", + "config-dir", + "config directory following xdg spec on linux platform", + "", + ); + opts.optflag("v", "version", "Display servo version information"); + opts.optflag("", "unminify-js", "Unminify Javascript"); + opts.optflag("", "print-pwm", "Print Progressive Web Metrics"); + opts.optopt( + "", + "local-script-source", + "Directory root with unminified scripts", + "", + ); + opts.optflag("", "unminify-css", "Unminify Css"); + + opts.optflag( + "", + "clean-shutdown", + "Do not shutdown until all threads have finished (macos only)", + ); + opts.optflag("b", "no-native-titlebar", "Do not use native titlebar"); + opts.optopt("", "device-pixel-ratio", "Device pixels per px", ""); + opts.optopt( + "u", + "user-agent", + "Set custom user agent string (or ios / android / desktop for platform default)", + "NCSA Mosaic/1.0 (X11;SunOS 4.1.4 sun4m)", + ); + opts.optmulti( + "", + "pref", + "A preference to set to enable", + "dom.bluetooth.enabled", + ); + opts.optmulti( + "", + "pref", + "A preference to set to disable", + "dom.webgpu.enabled=false", + ); + opts.optmulti( + "", + "prefs-file", + "Load in additional prefs from a file.", + "--prefs-file /path/to/prefs.json", + ); + + let opt_match = match opts.parse(args) { + Ok(m) => m, + Err(f) => args_fail(&f.to_string()), + }; + + if opt_match.opt_present("v") || opt_match.opt_present("version") { + println!("{}", crate::servo_version()); + process::exit(0); + } + + if opt_match.opt_present("h") || opt_match.opt_present("help") { + print_usage(app_name, &opts); + process::exit(0); + }; + + let config_dir = opt_match.opt_str("config-dir").map(Into::into); + let mut preferences = get_preferences(&opt_match, &config_dir); + + // If this is the content process, we'll receive the real options over IPC. So just fill in + // some dummy options for now. + if let Some(content_process) = opt_match.opt_str("content-process") { + return ArgumentParsingResult::ContentProcess(content_process); + } + + let mut debug_options = DebugOptions::default(); + for debug_string in opt_match.opt_strs("Z") { + if let Err(e) = debug_options.extend(debug_string) { + args_fail(&format!("error: unrecognized debug option: {}", e)); + } + } + + if debug_options.help { + print_debug_options_usage(app_name); + } + + let tile_size: usize = match opt_match.opt_str("s") { + Some(tile_size_str) => tile_size_str + .parse() + .unwrap_or_else(|err| args_fail(&format!("Error parsing option: -s ({})", err))), + None => 512, + }; + + // If only the flag is present, default to a 5 second period for both profilers + let time_profiling = if opt_match.opt_present("p") { + match opt_match.opt_str("p") { + Some(argument) => match argument.parse::() { + Ok(interval) => Some(OutputOptions::Stdout(interval)), + Err(_) => match ServoUrl::parse(&argument) { + Ok(_) => panic!("influxDB isn't supported anymore"), + Err(_) => Some(OutputOptions::FileName(argument)), + }, + }, + None => Some(OutputOptions::Stdout(5.0)), + } } else { - HashMap::new() + // if the p option doesn't exist: + None }; - let prefs_from_files: Vec> = opts_matches - .opt_strs("prefs-file") - .iter() - .map(|path| read_prefs_file(path)) - .collect(); + if let Some(ref time_profiler_trace_path) = opt_match.opt_str("profiler-trace-path") { + let mut path = PathBuf::from(time_profiler_trace_path); + path.pop(); + if let Err(why) = fs::create_dir_all(&path) { + error!( + "Couldn't create/open {:?}: {:?}", + Path::new(time_profiler_trace_path).to_string_lossy(), + why + ); + } + } + + let mem_profiler_period = opt_match.opt_default("m", "5").map(|period| { + period + .parse() + .unwrap_or_else(|err| args_fail(&format!("Error parsing option: -m ({})", err))) + }); - let argprefs: HashMap = opts_matches - .opt_strs("pref") + let mut layout_threads: Option = opt_match.opt_str("y").map(|layout_threads_str| { + layout_threads_str + .parse() + .unwrap_or_else(|err| args_fail(&format!("Error parsing option: -y ({})", err))) + }); + + let nonincremental_layout = opt_match.opt_present("i"); + + let random_pipeline_closure_probability = opt_match + .opt_str("random-pipeline-closure-probability") + .map(|prob| { + prob.parse().unwrap_or_else(|err| { + args_fail(&format!( + "Error parsing option: --random-pipeline-closure-probability ({})", + err + )) + }) + }); + + let random_pipeline_closure_seed = + opt_match + .opt_str("random-pipeline-closure-seed") + .map(|seed| { + seed.parse().unwrap_or_else(|err| { + args_fail(&format!( + "Error parsing option: --random-pipeline-closure-seed ({})", + err + )) + }) + }); + + if debug_options.trace_layout { + layout_threads = Some(1); + } + + if opt_match.opt_present("devtools") { + let port = opt_match + .opt_str("devtools") + .map(|port| { + port.parse().unwrap_or_else(|err| { + args_fail(&format!("Error parsing option: --devtools ({})", err)) + }) + }) + .unwrap_or(preferences.devtools_server_port); + preferences.devtools_server_enabled = true; + preferences.devtools_server_port = port; + } + + let webdriver_port = opt_match.opt_default("webdriver", "7000").map(|port| { + port.parse().unwrap_or_else(|err| { + args_fail(&format!("Error parsing option: --webdriver ({})", err)) + }) + }); + + let parse_resolution_string = |string: String| { + let components: Vec = string + .split('x') + .map(|component| { + component.parse().unwrap_or_else(|error| { + args_fail(&format!("Error parsing resolution '{string}': {error}")); + }) + }) + .collect(); + Size2D::new(components[0], components[1]) + }; + + let screen_size_override = opt_match + .opt_str("screen-size") + .map(parse_resolution_string); + + // Make sure the default window size is not larger than any provided screen size. + let default_window_size = Size2D::new(1024, 740); + let default_window_size = screen_size_override + .map_or(default_window_size, |screen_size_override| { + default_window_size.min(screen_size_override) + }); + + let initial_window_size = opt_match + .opt_str("window-size") + .map_or(default_window_size, parse_resolution_string); + + let user_stylesheets = opt_match + .opt_strs("user-stylesheet") .iter() - .map(|pref| { - let split: Vec<&str> = pref.splitn(2, '=').collect(); - let pref_name = split[0]; - let pref_value = match split.get(1).cloned() { - Some("true") | None => PrefValue::Bool(true), - Some("false") => PrefValue::Bool(false), - Some(string) => { - if let Ok(int) = string.parse::() { - PrefValue::Int(int) - } else if let Ok(float) = string.parse::() { - PrefValue::Float(float) - } else { - PrefValue::from(string) - } - }, - }; - (pref_name.to_string(), pref_value) + .map(|filename| { + let cwd = env::current_dir().unwrap(); + let path = cwd.join(filename); + let url = ServoUrl::from_url(Url::from_file_path(&path).unwrap()); + let mut contents = Vec::new(); + File::open(path) + .unwrap_or_else(|err| args_fail(&format!("Couldn't open {}: {}", filename, err))) + .read_to_end(&mut contents) + .unwrap_or_else(|err| args_fail(&format!("Couldn't read {}: {}", filename, err))); + (contents, url) }) .collect(); - // Apply --prefs-file prefs first - for prefs in prefs_from_files { - userprefs.extend(prefs); + // Handle all command-line preferences overrides. + for pref in opt_match.opt_strs("pref") { + let split: Vec<&str> = pref.splitn(2, '=').collect(); + let pref_name = split[0]; + let pref_value = PrefValue::from_booleanish_str(split.get(1).copied().unwrap_or("true")); + preferences.set_value(pref_name, pref_value); } - // Then apply individually passed prefs from --pref - userprefs.extend(argprefs); + let legacy_layout = opt_match.opt_present("legacy-layout"); + if legacy_layout { + preferences.layout_legacy_layout = true; + } - prefs::add_user_prefs(userprefs); + if let Some(layout_threads) = layout_threads { + preferences.layout_threads = layout_threads as i64; + } + + let no_native_titlebar = opt_match.opt_present("no-native-titlebar"); + let mut device_pixel_ratio_override = opt_match.opt_str("device-pixel-ratio").map(|dppx_str| { + dppx_str.parse().unwrap_or_else(|err| { + error!("Error parsing option: --device-pixel-ratio ({})", err); + process::exit(1); + }) + }); + + // If an output file is specified the device pixel ratio is always 1. + let output_file = opt_match.opt_str("o"); + if output_file.is_some() { + device_pixel_ratio_override = Some(1.0); + } + + let url = if !opt_match.free.is_empty() { + Some(opt_match.free[0][..].into()) + } else { + None + }; + + // FIXME: enable JIT compilation on 32-bit Android after the startup crash issue (#31134) is fixed. + if cfg!(target_os = "android") && cfg!(target_pointer_width = "32") { + preferences.js_baseline_interpreter_enabled = false; + preferences.js_baseline_jit_enabled = false; + preferences.js_ion_enabled = false; + } + + let servoshell_preferences = ServoShellPreferences { + user_agent: opt_match.opt_str("u"), + url, + no_native_titlebar, + device_pixel_ratio_override, + clean_shutdown: opt_match.opt_present("clean-shutdown"), + ..Default::default() + }; + + let headless = opt_match.opt_present("z"); + if headless && preferences.media_glvideo_enabled { + warn!("GL video rendering is not supported on headless windows."); + preferences.media_glvideo_enabled = false; + } + + let opts = Opts { + debug: debug_options.clone(), + legacy_layout, + tile_size, + time_profiling, + time_profiler_trace_path: opt_match.opt_str("profiler-trace-path"), + mem_profiler_period, + nonincremental_layout, + userscripts: opt_match.opt_default("userscripts", ""), + user_stylesheets, + output_file, + headless, + hard_fail: opt_match.opt_present("f") && !opt_match.opt_present("F"), + webdriver_port, + initial_window_size, + screen_size_override, + multiprocess: opt_match.opt_present("M"), + background_hang_monitor: opt_match.opt_present("B"), + sandbox: opt_match.opt_present("S"), + random_pipeline_closure_probability, + random_pipeline_closure_seed, + exit_after_load: opt_match.opt_present("x"), + config_dir, + shaders_dir: opt_match.opt_str("shaders").map(Into::into), + certificate_path: opt_match.opt_str("certificate-path"), + ignore_certificate_errors: opt_match.opt_present("ignore-certificate-errors"), + unminify_js: opt_match.opt_present("unminify-js"), + local_script_source: opt_match.opt_str("local-script-source"), + unminify_css: opt_match.opt_present("unminify-css"), + print_pwm: opt_match.opt_present("print-pwm"), + }; + + ArgumentParsingResult::ChromeProcess(opts, preferences, servoshell_preferences) } -fn read_prefs_file(path: &str) -> HashMap { - let mut file = File::open(path).expect("Error opening user prefs"); - let mut txt = String::new(); - file.read_to_string(&mut txt) - .expect("Can't read user prefs file"); - prefs::read_prefs_map(&txt).expect("Can't parse user prefs file") +fn args_fail(msg: &str) -> ! { + eprintln!("{}", msg); + process::exit(1) +} + +fn print_usage(app: &str, opts: &Options) { + let message = format!( + "Usage: {} [ options ... ] [URL]\n\twhere options include", + app + ); + println!("{}", opts.usage(&message)); +} + +fn print_debug_options_usage(app: &str) { + fn print_option(name: &str, description: &str) { + println!("\t{:<35} {}", name, description); + } + + println!( + "Usage: {} debug option,[options,...]\n\twhere options include\n\nOptions:", + app + ); + + print_option( + "bubble-inline-sizes-separately", + "Bubble intrinsic widths separately like other engines.", + ); + print_option( + "convert-mouse-to-touch", + "Send touch events instead of mouse events", + ); + print_option( + "disable-canvas-aa", + "Disable antialiasing on the HTML canvas element.", + ); + print_option( + "disable-share-style-cache", + "Disable the style sharing cache.", + ); + print_option( + "disable-subpixel-aa", + "Disable subpixel text antialiasing overriding preference.", + ); + print_option("disable-text-aa", "Disable antialiasing of rendered text."); + print_option( + "dump-stacking-context-tree", + "Print the stacking context tree after each layout.", + ); + print_option( + "dump-display-list", + "Print the display list after each layout.", + ); + print_option( + "dump-display-list-json", + "Print the display list in JSON form.", + ); + print_option( + "dump-flow-tree", + "Print the flow tree (Layout 2013) or fragment tree (Layout 2020) after each layout.", + ); + print_option( + "dump-rule-tree", + "Print the style rule tree after each layout.", + ); + print_option( + "dump-style-tree", + "Print the DOM with computed styles after each restyle.", + ); + print_option("dump-style-stats", "Print style statistics each restyle."); + print_option("gc-profile", "Log GC passes and their durations."); + print_option( + "load-webfonts-synchronously", + "Load web fonts synchronously to avoid non-deterministic network-driven reflows", + ); + print_option( + "parallel-display-list-building", + "Build display lists in parallel.", + ); + print_option("precache-shaders", "Compile all shaders during init."); + print_option( + "profile-script-events", + "Enable profiling of script-related events.", + ); + print_option( + "relayout-event", + "Print notifications when there is a relayout.", + ); + print_option("replace-surrogates", "Replace unpaires surrogates in DOM strings with U+FFFD. See https://github.com/servo/servo/issues/6564"); + print_option( + "show-fragment-borders", + "Paint borders along fragment boundaries.", + ); + print_option( + "show-parallel-layout", + "Mark which thread laid each flow out with colors.", + ); + print_option( + "signpost", + "Emit native OS signposts for profile events (currently macOS only)", + ); + print_option( + "trace-layout", + "Write layout trace to an external file for debugging.", + ); + print_option("wr-stats", "Show WebRender profiler on screen."); + + println!(); + + process::exit(0) } #[cfg(test)] -fn test_parse_pref(arg: &str) { - let mut opts = getopts::Options::new(); - opts.optmulti("", "pref", "", ""); - opts.optmulti("", "prefs-file", "", ""); +fn test_parse_pref(arg: &str) -> Preferences { let args = vec!["servo".to_string(), "--pref".to_string(), arg.to_string()]; - let matches = match opts::from_cmdline_args(opts, &args) { - opts::ArgumentParsingResult::ContentProcess(m, _) => m, - opts::ArgumentParsingResult::ChromeProcess(m) => m, - }; - register_user_prefs(&matches); + match parse_command_line_arguments(args) { + ArgumentParsingResult::ContentProcess(..) => { + unreachable!("No preferences for content process") + }, + ArgumentParsingResult::ChromeProcess(_, preferences, _) => preferences, + } } #[test] fn test_parse_pref_from_command_line() { - use servo::servo_config::pref; // Test with boolean values. - test_parse_pref("dom.bluetooth.enabled=true"); - assert_eq!( - prefs::pref_map().get("dom.bluetooth.enabled"), - PrefValue::Bool(true) - ); - assert!(pref!(dom.bluetooth.enabled)); + let preferences = test_parse_pref("dom_bluetooth_enabled=true"); + assert!(preferences.dom_bluetooth_enabled); - test_parse_pref("dom.bluetooth.enabled=false"); - assert_eq!( - prefs::pref_map().get("dom.bluetooth.enabled"), - PrefValue::Bool(false) - ); - assert_eq!(pref!(dom.bluetooth.enabled), false); + let preferences = test_parse_pref("dom_bluetooth_enabled=false"); + assert!(!preferences.dom_bluetooth_enabled); // Test with numbers - test_parse_pref("layout.threads=42"); - assert_eq!(pref!(layout.threads), 42); + let preferences = test_parse_pref("layout_threads=42"); + assert_eq!(preferences.layout_threads, 42); // Test string. - test_parse_pref("shell.homepage=str"); - assert_eq!(pref!(shell.homepage), "str"); + let preferences = test_parse_pref("fonts_default=Lucida"); + assert_eq!(preferences.fonts_default, "Lucida"); // Test with no value (defaults to true). - prefs::pref_map() - .set("dom.bluetooth.enabled", false) - .unwrap(); - test_parse_pref("dom.bluetooth.enabled"); - assert!(pref!(dom.bluetooth.enabled)); + let preferences = test_parse_pref("dom_bluetooth_enabled"); + assert!(preferences.dom_bluetooth_enabled); } #[test] @@ -130,12 +744,18 @@ fn test_invalid_prefs_from_command_line_panics() { .err() .and_then(|a| a.downcast_ref::().cloned()) .expect("Should panic"); - assert!( - err_msg.starts_with("Error setting preference"), + assert_eq!( + err_msg, "Unknown preference: \"doesntexist\"", "Message should describe the problem" - ); - assert!( - err_msg.contains("doesntexist"), - "Message should mention the name of the preference" - ); + ) +} + +#[test] +fn test_create_prefs_map() { + let json_str = "{ + \"layout.writing-mode.enabled\": true, + \"network.mime.sniff\": false, + \"shell.homepage\": \"https://servo.org\" + }"; + assert_eq!(read_prefs_map(json_str).len(), 3); } diff --git a/ports/servoshell/test.rs b/ports/servoshell/test.rs index 0ee94d44829..0ff470f8b90 100644 --- a/ports/servoshell/test.rs +++ b/ports/servoshell/test.rs @@ -89,15 +89,17 @@ fn test_argument_parsing_special() { // Helper function to test url fn test_url(input: &str, location: &str, cmdline_if_exists: &str, cmdline_otherwise: &str) { assert_eq!( - location_bar_input_to_url(input).unwrap().into_string(), + location_bar_input_to_url(input, "https://duckduckgo.com/html/?q=%s") + .unwrap() + .into_string(), location ); assert_eq!( - get_default_url(Some(input), FAKE_CWD, |_| true).into_string(), + get_default_url(Some(input), FAKE_CWD, |_| true, &Default::default()).into_string(), cmdline_if_exists ); assert_eq!( - get_default_url(Some(input), FAKE_CWD, |_| false).into_string(), + get_default_url(Some(input), FAKE_CWD, |_| false, &Default::default()).into_string(), cmdline_otherwise ); } diff --git a/resources/prefs.json b/resources/prefs.json index d831ccf4d6a..3ae80ab9da7 100644 --- a/resources/prefs.json +++ b/resources/prefs.json @@ -1,135 +1,135 @@ { - "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.compositionevent.enabled": false, - "dom.crypto.subtle.enabled": true, - "dom.customelements.enabled": true, - "dom.document.dblclick_dist": 1, - "dom.document.dblclick_timeout": 300, - "dom.forcetouch.enabled": false, - "dom.fullscreen.test": false, - "dom.gamepad.enabled": true, - "dom.imagebitmap.enabled": false, - "dom.intersection_observer.enabled": false, - "dom.microdata.enabled": false, - "dom.microdata.testing.enabled": false, - "dom.mouseevent.which.enabled": false, - "dom.mutation_observer.enabled": true, - "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": false, - "dom.svg.enabled": false, - "dom.testable_crash.enabled": false, - "dom.testbinding.enabled": false, - "dom.testing.htmlinputelement.select_files.enabled": false, - "dom.webgl2.enabled": false, - "dom.webgpu.enabled": false, - "dom.webgpu.wgpu_backend": "", - "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.timeout_ms": 10, - "dom.xpath.enabled": false, - "gfx.subpixel-text-antialiasing.enabled": true, - "gfx.texture-swizzling.enabled": true, - "js.asmjs.enabled": true, - "js.asyncstack.enabled": 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.enabled": false, - "js.dump_stack_on_debuggee_would_run.enabled": 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.enabled": true, - "js.throw_on_asmjs_validation_failure.enabled": false, - "js.throw_on_debuggee_would_run.enabled": 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.css.transition-behavior.enabled": true, - "layout.flexbox.enabled": true, - "layout.grid.enabled": false, - "layout.legacy_layout": false, - "layout.threads": 3, - "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": false, - "network.mime.sniff": false, - "network.tls.ignore_unexpected_eof": false, - "session-history.max-length": 20, - "shell.background-color.rgba": [1.0, 1.0, 1.0, 1.0], - "shell.crash_reporter.enabled": false, - "shell.homepage": "https://servo.org", - "shell.keep_screen_on.enabled": false, - "shell.native-orientation": "both", - "shell.native-titlebar.enabled": true, - "shell.searchpage": "https://duckduckgo.com/html/?q=%s", - "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 + "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_compositionevent_enabled": false, + "dom_crypto_subtle_enabled": true, + "dom_customelements_enabled": true, + "dom_document_dblclick_dist": 1, + "dom_document_dblclick_timeout": 300, + "dom_forcetouch_enabled": false, + "dom_fullscreen_test": false, + "dom_gamepad_enabled": true, + "dom_imagebitmap_enabled": false, + "dom_intersection_observer_enabled": false, + "dom_microdata_enabled": false, + "dom_microdata_testing_enabled": false, + "dom_mouse_event_which_enabled": false, + "dom_mutation_observer_enabled": true, + "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": false, + "dom_svg_enabled": false, + "dom_testable_crash_enabled": false, + "dom_testbinding_enabled": false, + "dom_testing_html_input_element_select_files_enabled": false, + "dom_webgl2_enabled": false, + "dom_webgpu_enabled": false, + "dom_webgpu_wgpu_backend": "", + "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_timeout_ms": 10, + "dom_xpath_enabled": false, + "gfx_subpixel-text-antialiasing_enabled": true, + "gfx_texture-swizzling_enabled": true, + "js_asmjs_enabled": true, + "js_asyncstack_enabled": 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_enabled": false, + "js_dump_stack_on_debuggee_would_run_enabled": 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_enabled": true, + "js_throw_on_asmjs_validation_failure_enabled": false, + "js_throw_on_debuggee_would_run_enabled": 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_css_transition-behavior_enabled": true, + "layout_flexbox_enabled": true, + "layout_grid_enabled": false, + "layout_legacy_layout": false, + "layout_threads": 3, + "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": false, + "network_mime_sniff": false, + "network_tls_ignore_unexpected_eof": false, + "session-history_max-length": 20, + "shell_background-color_rgba": [1.0, 1.0, 1.0, 1.0], + "shell_crash_reporter_enabled": false, + "shell_homepage": "https://servo_org", + "shell_keep_screen_on_enabled": false, + "shell_native-orientation": "both", + "shell_native-titlebar_enabled": true, + "shell_searchpage": "https://duckduckgo_com/html/?q=%s", + "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 } diff --git a/resources/wpt-prefs.json b/resources/wpt-prefs.json index bb3185e2630..6de7b9efbf1 100644 --- a/resources/wpt-prefs.json +++ b/resources/wpt-prefs.json @@ -1,4 +1,4 @@ { - "dom.webxr.test": true, - "network.tls.ignore_unexpected_eof": true + "dom_webxr_test": true, + "network_tls_ignore_unexpected_eof": true } diff --git a/tests/wpt/meta-legacy-layout/WebCryptoAPI/__dir__.ini b/tests/wpt/meta-legacy-layout/WebCryptoAPI/__dir__.ini index 71feefa5fb7..67f689a6cde 100644 --- a/tests/wpt/meta-legacy-layout/WebCryptoAPI/__dir__.ini +++ b/tests/wpt/meta-legacy-layout/WebCryptoAPI/__dir__.ini @@ -1 +1 @@ -prefs: [dom.crypto.subtle.enabled: true] \ No newline at end of file +prefs: [dom_crypto_subtle_enabled: true] \ No newline at end of file diff --git a/tests/wpt/meta-legacy-layout/__dir__.ini b/tests/wpt/meta-legacy-layout/__dir__.ini index 60a490fc6ff..c512e4494a3 100644 --- a/tests/wpt/meta-legacy-layout/__dir__.ini +++ b/tests/wpt/meta-legacy-layout/__dir__.ini @@ -1 +1 @@ -prefs: ["dom.imagebitmap.enabled:true"] +prefs: ["dom_imagebitmap_enabled:true"] diff --git a/tests/wpt/meta-legacy-layout/bluetooth/__dir__.ini b/tests/wpt/meta-legacy-layout/bluetooth/__dir__.ini index dfe57e6fd66..bc634adeb33 100644 --- a/tests/wpt/meta-legacy-layout/bluetooth/__dir__.ini +++ b/tests/wpt/meta-legacy-layout/bluetooth/__dir__.ini @@ -1 +1 @@ -prefs: ["dom.bluetooth.enabled:true"] +prefs: ["dom_bluetooth_enabled:true"] diff --git a/tests/wpt/meta-legacy-layout/bluetooth/requestDevice/canonicalizeFilter/__dir__.ini b/tests/wpt/meta-legacy-layout/bluetooth/requestDevice/canonicalizeFilter/__dir__.ini index 22af3fbe970..bb4133833c8 100644 --- a/tests/wpt/meta-legacy-layout/bluetooth/requestDevice/canonicalizeFilter/__dir__.ini +++ b/tests/wpt/meta-legacy-layout/bluetooth/requestDevice/canonicalizeFilter/__dir__.ini @@ -1,2 +1,2 @@ -prefs: ["dom.bluetooth.enabled:true"] +prefs: ["dom_bluetooth_enabled:true"] disabled: "#23066" diff --git a/tests/wpt/meta-legacy-layout/css/css-flexbox/__dir__.ini b/tests/wpt/meta-legacy-layout/css/css-flexbox/__dir__.ini index e4af70583e1..bd1bf899085 100644 --- a/tests/wpt/meta-legacy-layout/css/css-flexbox/__dir__.ini +++ b/tests/wpt/meta-legacy-layout/css/css-flexbox/__dir__.ini @@ -1 +1 @@ -prefs: ["layout.columns.enabled:true", "layout.flexbox.enabled:true"] +prefs: ["layout_columns_enabled:true", "layout_flexbox_enabled:true"] diff --git a/tests/wpt/meta-legacy-layout/css/css-multicol/__dir__.ini b/tests/wpt/meta-legacy-layout/css/css-multicol/__dir__.ini index 383f96c4de9..892701f1faa 100644 --- a/tests/wpt/meta-legacy-layout/css/css-multicol/__dir__.ini +++ b/tests/wpt/meta-legacy-layout/css/css-multicol/__dir__.ini @@ -1 +1 @@ -prefs: ["layout.columns.enabled:true"] +prefs: ["layout_columns_enabled:true"] diff --git a/tests/wpt/meta-legacy-layout/css/css-paint-api/__dir__.ini b/tests/wpt/meta-legacy-layout/css/css-paint-api/__dir__.ini index 40806a19f49..ae295782025 100644 --- a/tests/wpt/meta-legacy-layout/css/css-paint-api/__dir__.ini +++ b/tests/wpt/meta-legacy-layout/css/css-paint-api/__dir__.ini @@ -1 +1 @@ -prefs: [dom.worklet.enabled:true, dom.worklet.timeout_ms:5000] +prefs: [dom_worklet_enabled:true, dom_worklet_timeout_ms:5000] diff --git a/tests/wpt/meta-legacy-layout/dom/nodes/__dir__.ini b/tests/wpt/meta-legacy-layout/dom/nodes/__dir__.ini index 9aec2255c10..9743a9a6251 100644 --- a/tests/wpt/meta-legacy-layout/dom/nodes/__dir__.ini +++ b/tests/wpt/meta-legacy-layout/dom/nodes/__dir__.ini @@ -1,2 +1,2 @@ -prefs: ["dom.mutation_observer.enabled:true"] +prefs: ["dom_mutation_observer_enabled:true"] diff --git a/tests/wpt/meta-legacy-layout/gamepad/__dir__.ini b/tests/wpt/meta-legacy-layout/gamepad/__dir__.ini index 7c5c7c7dd57..f10d7d4f48e 100644 --- a/tests/wpt/meta-legacy-layout/gamepad/__dir__.ini +++ b/tests/wpt/meta-legacy-layout/gamepad/__dir__.ini @@ -1 +1 @@ -prefs: [dom.gamepad.enabled:true] +prefs: [dom_gamepad_enabled:true] diff --git a/tests/wpt/meta-legacy-layout/html/canvas/__dir__.ini b/tests/wpt/meta-legacy-layout/html/canvas/__dir__.ini index 03004f6efd7..e0b3c7bf146 100644 --- a/tests/wpt/meta-legacy-layout/html/canvas/__dir__.ini +++ b/tests/wpt/meta-legacy-layout/html/canvas/__dir__.ini @@ -1 +1 @@ -prefs: ["dom.offscreen_canvas.enabled:true"] +prefs: ["dom_offscreen_canvas_enabled:true"] diff --git a/tests/wpt/meta-legacy-layout/permissions/__dir__.ini b/tests/wpt/meta-legacy-layout/permissions/__dir__.ini index dbc555f5fe3..6e0ca3e9bce 100644 --- a/tests/wpt/meta-legacy-layout/permissions/__dir__.ini +++ b/tests/wpt/meta-legacy-layout/permissions/__dir__.ini @@ -1 +1 @@ -prefs: ["dom.permissions.enabled:true"] +prefs: ["dom_permissions_enabled:true"] diff --git a/tests/wpt/meta-legacy-layout/service-workers/__dir__.ini b/tests/wpt/meta-legacy-layout/service-workers/__dir__.ini index 263f9e73533..188c43180a1 100644 --- a/tests/wpt/meta-legacy-layout/service-workers/__dir__.ini +++ b/tests/wpt/meta-legacy-layout/service-workers/__dir__.ini @@ -1,2 +1,2 @@ -prefs: ["dom.serviceworker.enabled:true"] +prefs: ["dom_serviceworker_enabled:true"] diff --git a/tests/wpt/meta-legacy-layout/webvtt/__dir__.ini b/tests/wpt/meta-legacy-layout/webvtt/__dir__.ini index a1f438d013a..69d02fac171 100644 --- a/tests/wpt/meta-legacy-layout/webvtt/__dir__.ini +++ b/tests/wpt/meta-legacy-layout/webvtt/__dir__.ini @@ -1,2 +1,2 @@ -prefs: ["dom.webvtt.enabled:true"] +prefs: ["dom_webvtt_enabled:true"] diff --git a/tests/wpt/meta-legacy-layout/webxr/__dir__.ini b/tests/wpt/meta-legacy-layout/webxr/__dir__.ini index 828dff7605a..361edc79149 100644 --- a/tests/wpt/meta-legacy-layout/webxr/__dir__.ini +++ b/tests/wpt/meta-legacy-layout/webxr/__dir__.ini @@ -1 +1 @@ -prefs: [dom.webxr.test:true, dom.webgl2.enabled: true] +prefs: [dom_webxr_test:true, dom_webgl2_enabled: true] diff --git a/tests/wpt/meta/WebCryptoAPI/__dir__.ini b/tests/wpt/meta/WebCryptoAPI/__dir__.ini index 71feefa5fb7..67f689a6cde 100644 --- a/tests/wpt/meta/WebCryptoAPI/__dir__.ini +++ b/tests/wpt/meta/WebCryptoAPI/__dir__.ini @@ -1 +1 @@ -prefs: [dom.crypto.subtle.enabled: true] \ No newline at end of file +prefs: [dom_crypto_subtle_enabled: true] \ No newline at end of file diff --git a/tests/wpt/meta/__dir__.ini b/tests/wpt/meta/__dir__.ini index bb3e3d73f05..b78ab9506b3 100644 --- a/tests/wpt/meta/__dir__.ini +++ b/tests/wpt/meta/__dir__.ini @@ -1 +1 @@ -prefs: ["dom.imagebitmap.enabled:true", "dom.offscreen_canvas.enabled:true", "dom.shadowdom.enabled:true", "dom.xpath.enabled:true"] +prefs: ["dom_imagebitmap_enabled:true", "dom_offscreen_canvas_enabled:true", "dom_shadowdom_enabled:true", "dom_xpath_enabled:true"] diff --git a/tests/wpt/meta/css/css-align/__dir__.ini b/tests/wpt/meta/css/css-align/__dir__.ini index e4af70583e1..bd1bf899085 100644 --- a/tests/wpt/meta/css/css-align/__dir__.ini +++ b/tests/wpt/meta/css/css-align/__dir__.ini @@ -1 +1 @@ -prefs: ["layout.columns.enabled:true", "layout.flexbox.enabled:true"] +prefs: ["layout_columns_enabled:true", "layout_flexbox_enabled:true"] diff --git a/tests/wpt/meta/css/css-flexbox/__dir__.ini b/tests/wpt/meta/css/css-flexbox/__dir__.ini index e4af70583e1..bd1bf899085 100644 --- a/tests/wpt/meta/css/css-flexbox/__dir__.ini +++ b/tests/wpt/meta/css/css-flexbox/__dir__.ini @@ -1 +1 @@ -prefs: ["layout.columns.enabled:true", "layout.flexbox.enabled:true"] +prefs: ["layout_columns_enabled:true", "layout_flexbox_enabled:true"] diff --git a/tests/wpt/meta/css/css-grid/__dir__.ini b/tests/wpt/meta/css/css-grid/__dir__.ini index 7d65365a765..745da0bac0a 100644 --- a/tests/wpt/meta/css/css-grid/__dir__.ini +++ b/tests/wpt/meta/css/css-grid/__dir__.ini @@ -1 +1 @@ -prefs: ["layout.columns.enabled:true", "layout.flexbox.enabled:true", "layout.grid.enabled:true"] +prefs: ["layout_columns_enabled:true", "layout_flexbox_enabled:true", "layout_grid_enabled:true"] diff --git a/tests/wpt/meta/gamepad/__dir__.ini b/tests/wpt/meta/gamepad/__dir__.ini index 18827c1dbe2..925bd35d947 100644 --- a/tests/wpt/meta/gamepad/__dir__.ini +++ b/tests/wpt/meta/gamepad/__dir__.ini @@ -1 +1 @@ -prefs: [dom.gamepad.enabled: true] \ No newline at end of file +prefs: [dom_gamepad_enabled: true] \ No newline at end of file diff --git a/tests/wpt/meta/resize-observer/__dir__.ini b/tests/wpt/meta/resize-observer/__dir__.ini index 4d4f1e646b2..19c126482f0 100644 --- a/tests/wpt/meta/resize-observer/__dir__.ini +++ b/tests/wpt/meta/resize-observer/__dir__.ini @@ -1 +1 @@ -prefs: ["dom.resize_observer.enabled:true"] +prefs: ["dom_resize_observer_enabled:true"] diff --git a/tests/wpt/meta/webxr/__dir__.ini b/tests/wpt/meta/webxr/__dir__.ini index 16c2a8593c1..2e3a5cdb659 100644 --- a/tests/wpt/meta/webxr/__dir__.ini +++ b/tests/wpt/meta/webxr/__dir__.ini @@ -1 +1 @@ -prefs: [dom.webxr.test: true, dom.webgl2.enabled: true, dom.webxr.layers.enabled: true] \ No newline at end of file +prefs: [dom_webxr_test: true, dom_webgl2_enabled: true, dom_webxr_layers_enabled: true] \ No newline at end of file diff --git a/tests/wpt/mozilla/meta-legacy-layout/bluetooth/__dir__.ini b/tests/wpt/mozilla/meta-legacy-layout/bluetooth/__dir__.ini index c95b7c11c1d..1afc2794872 100644 --- a/tests/wpt/mozilla/meta-legacy-layout/bluetooth/__dir__.ini +++ b/tests/wpt/mozilla/meta-legacy-layout/bluetooth/__dir__.ini @@ -1 +1 @@ -prefs: [dom.bluetooth.enabled:true, dom.bluetooth.testing.enabled:true, dom.permissions.testing.allowed_in_nonsecure_contexts:true] +prefs: [dom_bluetooth_enabled:true, dom_bluetooth_testing_enabled:true, dom_permissions_testing_allowed_in_nonsecure_contexts:true] diff --git a/tests/wpt/mozilla/meta-legacy-layout/css/animations/__dir__.ini b/tests/wpt/mozilla/meta-legacy-layout/css/animations/__dir__.ini index 696581b4a4a..f66ed2ce1a5 100644 --- a/tests/wpt/mozilla/meta-legacy-layout/css/animations/__dir__.ini +++ b/tests/wpt/mozilla/meta-legacy-layout/css/animations/__dir__.ini @@ -1,2 +1,2 @@ -prefs: ["layout.animations.test.enabled:true", - "dom.testbinding.enabled:true"] +prefs: ["layout_animations_test_enabled:true", + "dom_testbinding_enabled:true"] diff --git a/tests/wpt/mozilla/meta-legacy-layout/css/animations/animation-events.html.ini b/tests/wpt/mozilla/meta-legacy-layout/css/animations/animation-events.html.ini index 33f08914f30..e0b3b5f6997 100644 --- a/tests/wpt/mozilla/meta-legacy-layout/css/animations/animation-events.html.ini +++ b/tests/wpt/mozilla/meta-legacy-layout/css/animations/animation-events.html.ini @@ -1,2 +1,2 @@ -prefs: ["layout.animations.test.enabled:false", - "dom.testbinding.enabled:false"] +prefs: ["layout_animations_test_enabled:false", + "dom_testbinding_enabled:false"] diff --git a/tests/wpt/mozilla/meta-legacy-layout/css/animations/transition-events.html.ini b/tests/wpt/mozilla/meta-legacy-layout/css/animations/transition-events.html.ini index f53fd6a5050..3e398039c00 100644 --- a/tests/wpt/mozilla/meta-legacy-layout/css/animations/transition-events.html.ini +++ b/tests/wpt/mozilla/meta-legacy-layout/css/animations/transition-events.html.ini @@ -1,3 +1,3 @@ -prefs: ["layout.animations.test.enabled:false", - "dom.testbinding.enabled:false"] +prefs: ["layout_animations_test_enabled:false", + "dom_testbinding_enabled:false"] diff --git a/tests/wpt/mozilla/meta-legacy-layout/css/direction_style_caching.html.ini b/tests/wpt/mozilla/meta-legacy-layout/css/direction_style_caching.html.ini index b04e9dc858f..02119ac9454 100644 --- a/tests/wpt/mozilla/meta-legacy-layout/css/direction_style_caching.html.ini +++ b/tests/wpt/mozilla/meta-legacy-layout/css/direction_style_caching.html.ini @@ -1,3 +1,3 @@ -prefs: [layout.threads:1] +prefs: [layout_threads:1] [direction_style_caching.html] type: reftest diff --git a/tests/wpt/mozilla/meta-legacy-layout/css/iframe/size_attributes_vertical_writing_mode.html.ini b/tests/wpt/mozilla/meta-legacy-layout/css/iframe/size_attributes_vertical_writing_mode.html.ini index b7fd0e36dd6..52fb0568645 100644 --- a/tests/wpt/mozilla/meta-legacy-layout/css/iframe/size_attributes_vertical_writing_mode.html.ini +++ b/tests/wpt/mozilla/meta-legacy-layout/css/iframe/size_attributes_vertical_writing_mode.html.ini @@ -1,3 +1,3 @@ -prefs: [layout.writing-mode.enabled:true] +prefs: [layout_writing_mode_enabled:true] [size_attributes_vertical_writing_mode.html] type: reftest diff --git a/tests/wpt/mozilla/meta-legacy-layout/css/vertical-lr-blocks.html.ini b/tests/wpt/mozilla/meta-legacy-layout/css/vertical-lr-blocks.html.ini index 2858c27f6ed..4710d41093f 100644 --- a/tests/wpt/mozilla/meta-legacy-layout/css/vertical-lr-blocks.html.ini +++ b/tests/wpt/mozilla/meta-legacy-layout/css/vertical-lr-blocks.html.ini @@ -1,4 +1,4 @@ -prefs: [layout.writing-mode.enabled:true] +prefs: [layout_writing_mode_enabled:true] [vertical-lr-blocks.html] type: reftest expected: FAIL diff --git a/tests/wpt/mozilla/meta-legacy-layout/css/writing-mode_change_display.html.ini b/tests/wpt/mozilla/meta-legacy-layout/css/writing-mode_change_display.html.ini index 15717811207..a1b4bf67748 100644 --- a/tests/wpt/mozilla/meta-legacy-layout/css/writing-mode_change_display.html.ini +++ b/tests/wpt/mozilla/meta-legacy-layout/css/writing-mode_change_display.html.ini @@ -1,3 +1,3 @@ -prefs: [layout.writing-mode.enabled:true] +prefs: [layout_writing_mode_enabled:true] [writing-mode_change_display.html] type: testharness diff --git a/tests/wpt/mozilla/meta-legacy-layout/mozilla/FileAPI/blob_url_upload.html.ini b/tests/wpt/mozilla/meta-legacy-layout/mozilla/FileAPI/blob_url_upload.html.ini index 6ad257ede65..bc735bc38a2 100644 --- a/tests/wpt/mozilla/meta-legacy-layout/mozilla/FileAPI/blob_url_upload.html.ini +++ b/tests/wpt/mozilla/meta-legacy-layout/mozilla/FileAPI/blob_url_upload.html.ini @@ -1,3 +1,3 @@ [blob_url_upload.html] type: reftest - prefs: [dom.testing.htmlinputelement.select_files.enabled:true] + prefs: [dom_testing_html_input_element_select_files_enabled:true] diff --git a/tests/wpt/mozilla/meta-legacy-layout/mozilla/FileAPI/file-select.html.ini b/tests/wpt/mozilla/meta-legacy-layout/mozilla/FileAPI/file-select.html.ini index b047e230d99..318e272941d 100644 --- a/tests/wpt/mozilla/meta-legacy-layout/mozilla/FileAPI/file-select.html.ini +++ b/tests/wpt/mozilla/meta-legacy-layout/mozilla/FileAPI/file-select.html.ini @@ -1,3 +1,3 @@ [file-select.html] type: testharness - prefs: [dom.testing.htmlinputelement.select_files.enabled:true] + prefs: [dom_testing_html_input_element_select_files_enabled:true] diff --git a/tests/wpt/mozilla/meta-legacy-layout/mozilla/FileAPI/file-upload.html.ini b/tests/wpt/mozilla/meta-legacy-layout/mozilla/FileAPI/file-upload.html.ini index f3715f47bf9..26ffa70324d 100644 --- a/tests/wpt/mozilla/meta-legacy-layout/mozilla/FileAPI/file-upload.html.ini +++ b/tests/wpt/mozilla/meta-legacy-layout/mozilla/FileAPI/file-upload.html.ini @@ -1,3 +1,3 @@ [file-upload.html] type: testharness - prefs: [dom.testing.htmlinputelement.select_files.enabled:true] + prefs: [dom_testing_html_input_element_select_files_enabled:true] diff --git a/tests/wpt/mozilla/meta-legacy-layout/mozilla/activation.html.ini b/tests/wpt/mozilla/meta-legacy-layout/mozilla/activation.html.ini index e7b9f2349c3..96bb5bc6f86 100644 --- a/tests/wpt/mozilla/meta-legacy-layout/mozilla/activation.html.ini +++ b/tests/wpt/mozilla/meta-legacy-layout/mozilla/activation.html.ini @@ -1,3 +1,3 @@ [activation.html] type: testharness - prefs: [dom.testing.element.activation.enabled:true] + prefs: [dom_testing_element_activation_enabled:true] diff --git a/tests/wpt/mozilla/meta-legacy-layout/mozilla/binding_keyword.html.ini b/tests/wpt/mozilla/meta-legacy-layout/mozilla/binding_keyword.html.ini index 4b7bda760f0..2f27eb85244 100644 --- a/tests/wpt/mozilla/meta-legacy-layout/mozilla/binding_keyword.html.ini +++ b/tests/wpt/mozilla/meta-legacy-layout/mozilla/binding_keyword.html.ini @@ -1,3 +1,3 @@ [binding_keyword.html] type: testharness - prefs: [dom.testbinding.enabled:true] + prefs: [dom_testbinding_enabled:true] diff --git a/tests/wpt/mozilla/meta-legacy-layout/mozilla/calc.html.ini b/tests/wpt/mozilla/meta-legacy-layout/mozilla/calc.html.ini index e962fd6bbd5..c69d9c8e4ff 100644 --- a/tests/wpt/mozilla/meta-legacy-layout/mozilla/calc.html.ini +++ b/tests/wpt/mozilla/meta-legacy-layout/mozilla/calc.html.ini @@ -1,3 +1,3 @@ [calc.html] type: testharness - prefs: [layout.columns.enabled:true] + prefs: [layout_columns_enabled:true] diff --git a/tests/wpt/mozilla/meta-legacy-layout/mozilla/codegen_unions.html.ini b/tests/wpt/mozilla/meta-legacy-layout/mozilla/codegen_unions.html.ini index 6a8744c375d..1466ea82c0d 100644 --- a/tests/wpt/mozilla/meta-legacy-layout/mozilla/codegen_unions.html.ini +++ b/tests/wpt/mozilla/meta-legacy-layout/mozilla/codegen_unions.html.ini @@ -1,3 +1,3 @@ [codegen_unions.html] type: testharness - prefs: [dom.testbinding.enabled:true] + prefs: [dom_testbinding_enabled:true] diff --git a/tests/wpt/mozilla/meta-legacy-layout/mozilla/custom_auto_rooter.html.ini b/tests/wpt/mozilla/meta-legacy-layout/mozilla/custom_auto_rooter.html.ini index def641a83ba..4d3562b0c1c 100644 --- a/tests/wpt/mozilla/meta-legacy-layout/mozilla/custom_auto_rooter.html.ini +++ b/tests/wpt/mozilla/meta-legacy-layout/mozilla/custom_auto_rooter.html.ini @@ -1,3 +1,3 @@ [custom_auto_rooter.html] type: testharness - prefs: [dom.testbinding.enabled:true] + prefs: [dom_testbinding_enabled:true] diff --git a/tests/wpt/mozilla/meta-legacy-layout/mozilla/dictionary_to_jsval.html.ini b/tests/wpt/mozilla/meta-legacy-layout/mozilla/dictionary_to_jsval.html.ini index 850a38abfbc..ff7a331d22b 100644 --- a/tests/wpt/mozilla/meta-legacy-layout/mozilla/dictionary_to_jsval.html.ini +++ b/tests/wpt/mozilla/meta-legacy-layout/mozilla/dictionary_to_jsval.html.ini @@ -1,2 +1,2 @@ [dictionary_to_jsval.html] - prefs: [dom.testbinding.enabled:true] + prefs: [dom_testbinding_enabled:true] diff --git a/tests/wpt/mozilla/meta-legacy-layout/mozilla/exceptionToRejection.any.js.ini b/tests/wpt/mozilla/meta-legacy-layout/mozilla/exceptionToRejection.any.js.ini index 7d7e4d9cdc7..ee2780a9a5a 100644 --- a/tests/wpt/mozilla/meta-legacy-layout/mozilla/exceptionToRejection.any.js.ini +++ b/tests/wpt/mozilla/meta-legacy-layout/mozilla/exceptionToRejection.any.js.ini @@ -1,7 +1,7 @@ [exceptionToRejection.any.html] type: testharness - prefs: [dom.testbinding.enabled:true] + prefs: [dom_testbinding_enabled:true] [exceptionToRejection.any.worker.html] type: testharness - prefs: [dom.testbinding.enabled:true] \ No newline at end of file + prefs: [dom_testbinding_enabled:true] \ No newline at end of file diff --git a/tests/wpt/mozilla/meta-legacy-layout/mozilla/fullscreen/reftests/__dir__.ini b/tests/wpt/mozilla/meta-legacy-layout/mozilla/fullscreen/reftests/__dir__.ini index d2259b78e4e..91f58deb0c0 100644 --- a/tests/wpt/mozilla/meta-legacy-layout/mozilla/fullscreen/reftests/__dir__.ini +++ b/tests/wpt/mozilla/meta-legacy-layout/mozilla/fullscreen/reftests/__dir__.ini @@ -1 +1 @@ -prefs: ["dom.fullscreen.test:true"] +prefs: ["dom_fullscreen_test:true"] diff --git a/tests/wpt/mozilla/meta-legacy-layout/mozilla/globals/entry.html.ini b/tests/wpt/mozilla/meta-legacy-layout/mozilla/globals/entry.html.ini index 52b122bc295..fe0c41210ac 100644 --- a/tests/wpt/mozilla/meta-legacy-layout/mozilla/globals/entry.html.ini +++ b/tests/wpt/mozilla/meta-legacy-layout/mozilla/globals/entry.html.ini @@ -1,3 +1,3 @@ [entry.html] type: testharness - prefs: [dom.testbinding.enabled:true] + prefs: [dom_testbinding_enabled:true] diff --git a/tests/wpt/mozilla/meta-legacy-layout/mozilla/globals/entry.worker.js.ini b/tests/wpt/mozilla/meta-legacy-layout/mozilla/globals/entry.worker.js.ini index 2205984347e..29638929d3f 100644 --- a/tests/wpt/mozilla/meta-legacy-layout/mozilla/globals/entry.worker.js.ini +++ b/tests/wpt/mozilla/meta-legacy-layout/mozilla/globals/entry.worker.js.ini @@ -1,3 +1,3 @@ [entry.worker.html] type: testharness - prefs: [dom.testbinding.enabled:true] + prefs: [dom_testbinding_enabled:true] diff --git a/tests/wpt/mozilla/meta-legacy-layout/mozilla/http-cache.html.ini b/tests/wpt/mozilla/meta-legacy-layout/mozilla/http-cache.html.ini index d52addb7abc..e14018c7235 100644 --- a/tests/wpt/mozilla/meta-legacy-layout/mozilla/http-cache.html.ini +++ b/tests/wpt/mozilla/meta-legacy-layout/mozilla/http-cache.html.ini @@ -1,6 +1,6 @@ [http-cache.html] type: testharness - prefs: [network.http-cache.disabled:true] + prefs: [network_http_cache_disabled:true] [HTTP cache, when disabled, does not cache a 200 response.] expected: FAIL diff --git a/tests/wpt/mozilla/meta-legacy-layout/mozilla/interface_member_exposed.html.ini b/tests/wpt/mozilla/meta-legacy-layout/mozilla/interface_member_exposed.html.ini index cb010511bf7..cfd83349642 100644 --- a/tests/wpt/mozilla/meta-legacy-layout/mozilla/interface_member_exposed.html.ini +++ b/tests/wpt/mozilla/meta-legacy-layout/mozilla/interface_member_exposed.html.ini @@ -1,3 +1,3 @@ [interface_member_exposed.html] type: testharness - prefs: [dom.testbinding.enabled:true, dom.testbinding.prefcontrolled2.enabled:true] + prefs: [dom_testbinding_enabled:true, dom_testbinding_prefcontrolled2_enabled:true] diff --git a/tests/wpt/mozilla/meta-legacy-layout/mozilla/interfaces.https.html.ini b/tests/wpt/mozilla/meta-legacy-layout/mozilla/interfaces.https.html.ini index 32a9f966eeb..605489ac6bc 100644 --- a/tests/wpt/mozilla/meta-legacy-layout/mozilla/interfaces.https.html.ini +++ b/tests/wpt/mozilla/meta-legacy-layout/mozilla/interfaces.https.html.ini @@ -1 +1 @@ -prefs: [dom.webxr.test: false] \ No newline at end of file +prefs: [dom_webxr_test: false] \ No newline at end of file diff --git a/tests/wpt/mozilla/meta-legacy-layout/mozilla/iterable.html.ini b/tests/wpt/mozilla/meta-legacy-layout/mozilla/iterable.html.ini index 2316a8b3984..23e8bef9480 100644 --- a/tests/wpt/mozilla/meta-legacy-layout/mozilla/iterable.html.ini +++ b/tests/wpt/mozilla/meta-legacy-layout/mozilla/iterable.html.ini @@ -1,3 +1,3 @@ [iterable.html] type: testharness - prefs: [dom.testbinding.enabled:true] + prefs: [dom_testbinding_enabled:true] diff --git a/tests/wpt/mozilla/meta-legacy-layout/mozilla/like.any.js.ini b/tests/wpt/mozilla/meta-legacy-layout/mozilla/like.any.js.ini index 626c7c904f2..a4040cad82c 100644 --- a/tests/wpt/mozilla/meta-legacy-layout/mozilla/like.any.js.ini +++ b/tests/wpt/mozilla/meta-legacy-layout/mozilla/like.any.js.ini @@ -1,6 +1,6 @@ [like.any.html] type: testharness - prefs: [dom.testbinding.enabled:true] + prefs: [dom_testbinding_enabled:true] [Test defaulting arguments on setlike to undefined] expected: FAIL @@ -12,7 +12,7 @@ [like.any.worker.html] type: testharness - prefs: [dom.testbinding.enabled:true] + prefs: [dom_testbinding_enabled:true] [Test defaulting arguments on setlike to undefined] expected: FAIL diff --git a/tests/wpt/mozilla/meta-legacy-layout/mozilla/media_query_list_gc.html.ini b/tests/wpt/mozilla/meta-legacy-layout/mozilla/media_query_list_gc.html.ini index e30744b586d..f4ee735be13 100644 --- a/tests/wpt/mozilla/meta-legacy-layout/mozilla/media_query_list_gc.html.ini +++ b/tests/wpt/mozilla/meta-legacy-layout/mozilla/media_query_list_gc.html.ini @@ -1 +1 @@ -prefs: ["dom.servo_helpers.enabled:true"] +prefs: ["dom_servo_helpers_enabled:true"] diff --git a/tests/wpt/mozilla/meta-legacy-layout/mozilla/microdata/__dir__.ini b/tests/wpt/mozilla/meta-legacy-layout/mozilla/microdata/__dir__.ini index f199618497d..b68814a2034 100644 --- a/tests/wpt/mozilla/meta-legacy-layout/mozilla/microdata/__dir__.ini +++ b/tests/wpt/mozilla/meta-legacy-layout/mozilla/microdata/__dir__.ini @@ -1 +1 @@ -prefs: ["dom.microdata.testing.enabled:true"] +prefs: ["dom_microdata_testing_enabled:true"] diff --git a/tests/wpt/mozilla/meta-legacy-layout/mozilla/ns.any.js.ini b/tests/wpt/mozilla/meta-legacy-layout/mozilla/ns.any.js.ini index 1028c1162dd..749cda0d24e 100644 --- a/tests/wpt/mozilla/meta-legacy-layout/mozilla/ns.any.js.ini +++ b/tests/wpt/mozilla/meta-legacy-layout/mozilla/ns.any.js.ini @@ -1,7 +1,7 @@ [ns.any.html] type: testharness - prefs: [dom.testbinding.enabled:true] + prefs: [dom_testbinding_enabled:true] [ns.any.worker.html] type: testharness - prefs: [dom.testbinding.enabled:true] + prefs: [dom_testbinding_enabled:true] diff --git a/tests/wpt/mozilla/meta-legacy-layout/mozilla/overload_dict.html.ini b/tests/wpt/mozilla/meta-legacy-layout/mozilla/overload_dict.html.ini index 646813bf83c..12d91fea367 100644 --- a/tests/wpt/mozilla/meta-legacy-layout/mozilla/overload_dict.html.ini +++ b/tests/wpt/mozilla/meta-legacy-layout/mozilla/overload_dict.html.ini @@ -1,3 +1,3 @@ [overload_dict.html] type: testharness - prefs: [dom.testbinding.enabled:true] + prefs: [dom_testbinding_enabled:true] diff --git a/tests/wpt/mozilla/meta-legacy-layout/mozilla/partial_shadow_dom.html.ini b/tests/wpt/mozilla/meta-legacy-layout/mozilla/partial_shadow_dom.html.ini index 570ed139ec1..5e99741dc6f 100644 --- a/tests/wpt/mozilla/meta-legacy-layout/mozilla/partial_shadow_dom.html.ini +++ b/tests/wpt/mozilla/meta-legacy-layout/mozilla/partial_shadow_dom.html.ini @@ -1,4 +1,4 @@ [partial_shadow_dom.html] - prefs: [dom.shadowdom.enabled:true] + prefs: [dom_shadowdom_enabled:true] [partial_shadow_dom] expected: FAIL diff --git a/tests/wpt/mozilla/meta-legacy-layout/mozilla/partial_shadow_dom_layout_style.html.ini b/tests/wpt/mozilla/meta-legacy-layout/mozilla/partial_shadow_dom_layout_style.html.ini index 6612e2fb467..ebc51a2e59d 100644 --- a/tests/wpt/mozilla/meta-legacy-layout/mozilla/partial_shadow_dom_layout_style.html.ini +++ b/tests/wpt/mozilla/meta-legacy-layout/mozilla/partial_shadow_dom_layout_style.html.ini @@ -1,2 +1,2 @@ [partial_shadow_dom_layout_style.html] - prefs: [dom.shadowdom.enabled:true] + prefs: [dom_shadowdom_enabled:true] diff --git a/tests/wpt/mozilla/meta-legacy-layout/mozilla/preferences.html.ini b/tests/wpt/mozilla/meta-legacy-layout/mozilla/preferences.html.ini index 83de4dd69cd..986d3d09917 100644 --- a/tests/wpt/mozilla/meta-legacy-layout/mozilla/preferences.html.ini +++ b/tests/wpt/mozilla/meta-legacy-layout/mozilla/preferences.html.ini @@ -1,3 +1,3 @@ [preferences.html] type: testharness - prefs: [dom.testbinding.enabled:true, dom.testbinding.preference_value.falsy:false, dom.testbinding.preference_value.truthy:true, dom.testbinding.preference_value.string_empty:, dom.testbinding.preference_value.string_test:test, dom.testbinding.preference_value.space_string_test:test1 test2, dom.testbinding.preference_value.quote_string_test:"test1 test2"] + prefs: [dom_testbinding_enabled:true, dom_testbinding_preference_value_falsy:false, dom_testbinding_preference_value_truthy:true, dom_testbinding_preference_value_string_empty:, dom_testbinding_preference_value_string_test:test, dom_testbinding_preference_value_space_string_test:test1 test2, dom_testbinding_preference_value_quote_string_test:"test1 test2"] diff --git a/tests/wpt/mozilla/meta-legacy-layout/mozilla/promise.html.ini b/tests/wpt/mozilla/meta-legacy-layout/mozilla/promise.html.ini index e5ac0e78cd9..85f32f8d2a1 100644 --- a/tests/wpt/mozilla/meta-legacy-layout/mozilla/promise.html.ini +++ b/tests/wpt/mozilla/meta-legacy-layout/mozilla/promise.html.ini @@ -1,6 +1,6 @@ [promise.html] type: testharness - prefs: [dom.testbinding.enabled:true] + prefs: [dom_testbinding_enabled:true] [Native promise from async callback can be resolved] expected: FAIL diff --git a/tests/wpt/mozilla/meta-legacy-layout/mozilla/prototypes.html.ini b/tests/wpt/mozilla/meta-legacy-layout/mozilla/prototypes.html.ini index e30744b586d..f4ee735be13 100644 --- a/tests/wpt/mozilla/meta-legacy-layout/mozilla/prototypes.html.ini +++ b/tests/wpt/mozilla/meta-legacy-layout/mozilla/prototypes.html.ini @@ -1 +1 @@ -prefs: ["dom.servo_helpers.enabled:true"] +prefs: ["dom_servo_helpers_enabled:true"] diff --git a/tests/wpt/mozilla/meta-legacy-layout/mozilla/sequence-hole.html.ini b/tests/wpt/mozilla/meta-legacy-layout/mozilla/sequence-hole.html.ini index e3da43f8d3b..3e1cd2169c8 100644 --- a/tests/wpt/mozilla/meta-legacy-layout/mozilla/sequence-hole.html.ini +++ b/tests/wpt/mozilla/meta-legacy-layout/mozilla/sequence-hole.html.ini @@ -1,3 +1,3 @@ [sequence-hole.html] type: testharness - prefs: [dom.testbinding.enabled:true] + prefs: [dom_testbinding_enabled:true] diff --git a/tests/wpt/mozilla/meta-legacy-layout/mozilla/service-workers/__dir__.ini b/tests/wpt/mozilla/meta-legacy-layout/mozilla/service-workers/__dir__.ini index e4456cb4756..5baa980a233 100644 --- a/tests/wpt/mozilla/meta-legacy-layout/mozilla/service-workers/__dir__.ini +++ b/tests/wpt/mozilla/meta-legacy-layout/mozilla/service-workers/__dir__.ini @@ -1 +1 @@ -prefs: ["dom.serviceworker.enabled:true"] +prefs: ["dom_serviceworker_enabled:true"] diff --git a/tests/wpt/mozilla/meta-legacy-layout/mozilla/sigsegv.html.ini b/tests/wpt/mozilla/meta-legacy-layout/mozilla/sigsegv.html.ini index 63ad264be81..4f116d7c3f8 100644 --- a/tests/wpt/mozilla/meta-legacy-layout/mozilla/sigsegv.html.ini +++ b/tests/wpt/mozilla/meta-legacy-layout/mozilla/sigsegv.html.ini @@ -1,4 +1,4 @@ [sigsegv.html] type: testharness - prefs: [dom.testbinding.enabled:true, dom.testable_crash.enabled:true] + prefs: [dom_testbinding_enabled:true, dom_testable_crash_enabled:true] expected: CRASH diff --git a/tests/wpt/mozilla/meta-legacy-layout/mozilla/svg/svg.html.ini b/tests/wpt/mozilla/meta-legacy-layout/mozilla/svg/svg.html.ini index 2f440fde23f..6d1a5d0b3ee 100644 --- a/tests/wpt/mozilla/meta-legacy-layout/mozilla/svg/svg.html.ini +++ b/tests/wpt/mozilla/meta-legacy-layout/mozilla/svg/svg.html.ini @@ -1,3 +1,3 @@ [svg.html] type: reftest - prefs: [dom.svg.enabled:true] + prefs: [dom_svg_enabled:true] diff --git a/tests/wpt/mozilla/meta-legacy-layout/mozilla/trace_null.html.ini b/tests/wpt/mozilla/meta-legacy-layout/mozilla/trace_null.html.ini index e30744b586d..f4ee735be13 100644 --- a/tests/wpt/mozilla/meta-legacy-layout/mozilla/trace_null.html.ini +++ b/tests/wpt/mozilla/meta-legacy-layout/mozilla/trace_null.html.ini @@ -1 +1 @@ -prefs: ["dom.servo_helpers.enabled:true"] +prefs: ["dom_servo_helpers_enabled:true"] diff --git a/tests/wpt/mozilla/meta-legacy-layout/mozilla/transitionend_safety.html.ini b/tests/wpt/mozilla/meta-legacy-layout/mozilla/transitionend_safety.html.ini index e30744b586d..f4ee735be13 100644 --- a/tests/wpt/mozilla/meta-legacy-layout/mozilla/transitionend_safety.html.ini +++ b/tests/wpt/mozilla/meta-legacy-layout/mozilla/transitionend_safety.html.ini @@ -1 +1 @@ -prefs: ["dom.servo_helpers.enabled:true"] +prefs: ["dom_servo_helpers_enabled:true"] diff --git a/tests/wpt/mozilla/meta-legacy-layout/mozilla/variadic-interface.html.ini b/tests/wpt/mozilla/meta-legacy-layout/mozilla/variadic-interface.html.ini index f21720b9363..ac12007d5e1 100644 --- a/tests/wpt/mozilla/meta-legacy-layout/mozilla/variadic-interface.html.ini +++ b/tests/wpt/mozilla/meta-legacy-layout/mozilla/variadic-interface.html.ini @@ -1,3 +1,3 @@ [variadic-interface.html] type: testharness - prefs: [dom.testbinding.enabled:true] + prefs: [dom_testbinding_enabled:true] diff --git a/tests/wpt/mozilla/meta-legacy-layout/mozilla/video_poster_frame.html.ini b/tests/wpt/mozilla/meta-legacy-layout/mozilla/video_poster_frame.html.ini index 300efbf7350..7594b72f4c4 100644 --- a/tests/wpt/mozilla/meta-legacy-layout/mozilla/video_poster_frame.html.ini +++ b/tests/wpt/mozilla/meta-legacy-layout/mozilla/video_poster_frame.html.ini @@ -1,2 +1,2 @@ [video_poster_frame.html] - prefs: [media.testing.enabled:true] + prefs: [media_testing_enabled:true] diff --git a/tests/wpt/mozilla/meta-legacy-layout/mozilla/weakref.html.ini b/tests/wpt/mozilla/meta-legacy-layout/mozilla/weakref.html.ini index 8faf1a9b047..17ca8b55091 100644 --- a/tests/wpt/mozilla/meta-legacy-layout/mozilla/weakref.html.ini +++ b/tests/wpt/mozilla/meta-legacy-layout/mozilla/weakref.html.ini @@ -1,3 +1,3 @@ [weakref.html] type: testharness - prefs: ["dom.testbinding.enabled:true", "dom.servo_helpers.enabled:true"] + prefs: ["dom_testbinding_enabled:true", "dom_servo_helpers_enabled:true"] diff --git a/tests/wpt/mozilla/meta-legacy-layout/mozilla/webgl/context_creation_error.html.ini b/tests/wpt/mozilla/meta-legacy-layout/mozilla/webgl/context_creation_error.html.ini index cce1d7c3a5f..67020650ae9 100644 --- a/tests/wpt/mozilla/meta-legacy-layout/mozilla/webgl/context_creation_error.html.ini +++ b/tests/wpt/mozilla/meta-legacy-layout/mozilla/webgl/context_creation_error.html.ini @@ -1,3 +1,3 @@ [context_creation_error.html] type: testharness - prefs: [webgl.testing.context_creation_error:true] + prefs: [webgl_testing_context_creation_error:true] diff --git a/tests/wpt/mozilla/meta-legacy-layout/mozilla/window_performance_topLevelDomComplete.html.ini b/tests/wpt/mozilla/meta-legacy-layout/mozilla/window_performance_topLevelDomComplete.html.ini index ac65905cb3d..5beb7dc6158 100644 --- a/tests/wpt/mozilla/meta-legacy-layout/mozilla/window_performance_topLevelDomComplete.html.ini +++ b/tests/wpt/mozilla/meta-legacy-layout/mozilla/window_performance_topLevelDomComplete.html.ini @@ -1,3 +1,3 @@ [window_performance_topLevelDomComplete.html] type: testharness - prefs: [dom.testperf.enabled:true] + prefs: [dom_testperf_enabled:true] diff --git a/tests/wpt/mozilla/meta-legacy-layout/mozilla/worklets/__dir__.ini b/tests/wpt/mozilla/meta-legacy-layout/mozilla/worklets/__dir__.ini index c000a50cb3b..1d33f917a21 100644 --- a/tests/wpt/mozilla/meta-legacy-layout/mozilla/worklets/__dir__.ini +++ b/tests/wpt/mozilla/meta-legacy-layout/mozilla/worklets/__dir__.ini @@ -1 +1 @@ -prefs: [dom.worklet.enabled:true,dom.worklet.blockingsleep.enabled:true,dom.worklet.timeout_ms:5000] +prefs: [dom_worklet_enabled:true,dom_worklet_blockingsleep_enabled:true,dom_worklet_timeout_ms:5000] diff --git a/tests/wpt/mozilla/meta-legacy-layout/mozilla/worklets/test_paint_worklet_timeout.html.ini b/tests/wpt/mozilla/meta-legacy-layout/mozilla/worklets/test_paint_worklet_timeout.html.ini index bc2b728c300..d2b3d5537ff 100644 --- a/tests/wpt/mozilla/meta-legacy-layout/mozilla/worklets/test_paint_worklet_timeout.html.ini +++ b/tests/wpt/mozilla/meta-legacy-layout/mozilla/worklets/test_paint_worklet_timeout.html.ini @@ -1,4 +1,4 @@ [test_paint_worklet_timeout.html] type: testharness - prefs: [dom.worklet.timeout_ms:10] + prefs: [dom_worklet_timeout_ms:10] expected: PASS diff --git a/tests/wpt/mozilla/meta-legacy-layout/mozilla/worklets/test_worklet.html.ini b/tests/wpt/mozilla/meta-legacy-layout/mozilla/worklets/test_worklet.html.ini index 37762a513dd..45a182aece1 100644 --- a/tests/wpt/mozilla/meta-legacy-layout/mozilla/worklets/test_worklet.html.ini +++ b/tests/wpt/mozilla/meta-legacy-layout/mozilla/worklets/test_worklet.html.ini @@ -1,3 +1,3 @@ [test_worklet.html] type: testharness - prefs: [dom.worklet.testing.enabled:true] + prefs: [dom_worklet_testing_enabled:true] diff --git a/tests/wpt/mozilla/meta-legacy-layout/webxr/__dir__.ini b/tests/wpt/mozilla/meta-legacy-layout/webxr/__dir__.ini index fe96a649902..a36827bd1d6 100644 --- a/tests/wpt/mozilla/meta-legacy-layout/webxr/__dir__.ini +++ b/tests/wpt/mozilla/meta-legacy-layout/webxr/__dir__.ini @@ -1,2 +1,2 @@ -prefs: [dom.webxr.enabled:true, dom.webxr.test:true] +prefs: [dom_webxr_enabled:true, dom_webxr_test:true] diff --git a/tests/wpt/mozilla/meta-legacy-layout/webxr/layerevents.https.html.ini b/tests/wpt/mozilla/meta-legacy-layout/webxr/layerevents.https.html.ini index 72e1e4fc0b2..dde4edb26a1 100644 --- a/tests/wpt/mozilla/meta-legacy-layout/webxr/layerevents.https.html.ini +++ b/tests/wpt/mozilla/meta-legacy-layout/webxr/layerevents.https.html.ini @@ -1 +1 @@ -prefs: [dom.webxr.layers.enabled:true] +prefs: [dom_webxr_layers_enabled:true] diff --git a/tests/wpt/mozilla/meta-legacy-layout/webxr/layers.https.html.ini b/tests/wpt/mozilla/meta-legacy-layout/webxr/layers.https.html.ini index 86b374c7e4b..3ebe90ed370 100644 --- a/tests/wpt/mozilla/meta-legacy-layout/webxr/layers.https.html.ini +++ b/tests/wpt/mozilla/meta-legacy-layout/webxr/layers.https.html.ini @@ -1,4 +1,4 @@ -prefs: [dom.webxr.layers.enabled:true] +prefs: [dom_webxr_layers_enabled:true] [layers.https.html] [layers] expected: FAIL diff --git a/tests/wpt/mozilla/meta-legacy-layout/webxr/sessionavailable.https.html.ini b/tests/wpt/mozilla/meta-legacy-layout/webxr/sessionavailable.https.html.ini index 8bf6ba72fd8..53c832736b7 100644 --- a/tests/wpt/mozilla/meta-legacy-layout/webxr/sessionavailable.https.html.ini +++ b/tests/wpt/mozilla/meta-legacy-layout/webxr/sessionavailable.https.html.ini @@ -1,2 +1,2 @@ -prefs: [dom.webxr.sessionavailable:true] +prefs: [dom_webxr_sessionavailable:true] diff --git a/tests/wpt/mozilla/meta/css/animations/__dir__.ini b/tests/wpt/mozilla/meta/css/animations/__dir__.ini index 696581b4a4a..f66ed2ce1a5 100644 --- a/tests/wpt/mozilla/meta/css/animations/__dir__.ini +++ b/tests/wpt/mozilla/meta/css/animations/__dir__.ini @@ -1,2 +1,2 @@ -prefs: ["layout.animations.test.enabled:true", - "dom.testbinding.enabled:true"] +prefs: ["layout_animations_test_enabled:true", + "dom_testbinding_enabled:true"] diff --git a/tests/wpt/mozilla/meta/css/animations/animation-events.html.ini b/tests/wpt/mozilla/meta/css/animations/animation-events.html.ini index 33f08914f30..e0b3b5f6997 100644 --- a/tests/wpt/mozilla/meta/css/animations/animation-events.html.ini +++ b/tests/wpt/mozilla/meta/css/animations/animation-events.html.ini @@ -1,2 +1,2 @@ -prefs: ["layout.animations.test.enabled:false", - "dom.testbinding.enabled:false"] +prefs: ["layout_animations_test_enabled:false", + "dom_testbinding_enabled:false"] diff --git a/tests/wpt/mozilla/meta/css/animations/transition-events.html.ini b/tests/wpt/mozilla/meta/css/animations/transition-events.html.ini index f53fd6a5050..3e398039c00 100644 --- a/tests/wpt/mozilla/meta/css/animations/transition-events.html.ini +++ b/tests/wpt/mozilla/meta/css/animations/transition-events.html.ini @@ -1,3 +1,3 @@ -prefs: ["layout.animations.test.enabled:false", - "dom.testbinding.enabled:false"] +prefs: ["layout_animations_test_enabled:false", + "dom_testbinding_enabled:false"] diff --git a/tests/wpt/mozilla/meta/css/flex_align_content_stretch_subpixel.html.ini b/tests/wpt/mozilla/meta/css/flex_align_content_stretch_subpixel.html.ini index 9984b470f38..7a21695e3d5 100644 --- a/tests/wpt/mozilla/meta/css/flex_align_content_stretch_subpixel.html.ini +++ b/tests/wpt/mozilla/meta/css/flex_align_content_stretch_subpixel.html.ini @@ -1,2 +1,2 @@ [flex_align_content_stretch_subpixel.html] - prefs: ["layout.flexbox.enabled:true"] + prefs: ["layout_flexbox_enabled:true"] diff --git a/tests/wpt/mozilla/meta/mozilla/DOMParser-parseFromString.html.ini b/tests/wpt/mozilla/meta/mozilla/DOMParser-parseFromString.html.ini index 6fb710b0407..4ea07616469 100644 --- a/tests/wpt/mozilla/meta/mozilla/DOMParser-parseFromString.html.ini +++ b/tests/wpt/mozilla/meta/mozilla/DOMParser-parseFromString.html.ini @@ -1,2 +1,2 @@ [DOMParser-parseFromString.html] - prefs: ["dom.servoparser.async_html_tokenizer.enabled:true"] + prefs: ["dom_servoparser_async_html_tokenizer_enabled:true"] diff --git a/tests/wpt/mozilla/meta/mozilla/dictionary_to_jsval.html.ini b/tests/wpt/mozilla/meta/mozilla/dictionary_to_jsval.html.ini index 850a38abfbc..ff7a331d22b 100644 --- a/tests/wpt/mozilla/meta/mozilla/dictionary_to_jsval.html.ini +++ b/tests/wpt/mozilla/meta/mozilla/dictionary_to_jsval.html.ini @@ -1,2 +1,2 @@ [dictionary_to_jsval.html] - prefs: [dom.testbinding.enabled:true] + prefs: [dom_testbinding_enabled:true] diff --git a/tests/wpt/mozilla/meta/mozilla/exceptionToRejection.any.js.ini b/tests/wpt/mozilla/meta/mozilla/exceptionToRejection.any.js.ini index 7d7e4d9cdc7..ee2780a9a5a 100644 --- a/tests/wpt/mozilla/meta/mozilla/exceptionToRejection.any.js.ini +++ b/tests/wpt/mozilla/meta/mozilla/exceptionToRejection.any.js.ini @@ -1,7 +1,7 @@ [exceptionToRejection.any.html] type: testharness - prefs: [dom.testbinding.enabled:true] + prefs: [dom_testbinding_enabled:true] [exceptionToRejection.any.worker.html] type: testharness - prefs: [dom.testbinding.enabled:true] \ No newline at end of file + prefs: [dom_testbinding_enabled:true] \ No newline at end of file diff --git a/tests/wpt/mozilla/meta/mozilla/interfaces.https.html.ini b/tests/wpt/mozilla/meta/mozilla/interfaces.https.html.ini index 32a9f966eeb..605489ac6bc 100644 --- a/tests/wpt/mozilla/meta/mozilla/interfaces.https.html.ini +++ b/tests/wpt/mozilla/meta/mozilla/interfaces.https.html.ini @@ -1 +1 @@ -prefs: [dom.webxr.test: false] \ No newline at end of file +prefs: [dom_webxr_test: false] \ No newline at end of file diff --git a/tests/wpt/mozilla/meta/mozilla/like.any.js.ini b/tests/wpt/mozilla/meta/mozilla/like.any.js.ini index 626c7c904f2..a4040cad82c 100644 --- a/tests/wpt/mozilla/meta/mozilla/like.any.js.ini +++ b/tests/wpt/mozilla/meta/mozilla/like.any.js.ini @@ -1,6 +1,6 @@ [like.any.html] type: testharness - prefs: [dom.testbinding.enabled:true] + prefs: [dom_testbinding_enabled:true] [Test defaulting arguments on setlike to undefined] expected: FAIL @@ -12,7 +12,7 @@ [like.any.worker.html] type: testharness - prefs: [dom.testbinding.enabled:true] + prefs: [dom_testbinding_enabled:true] [Test defaulting arguments on setlike to undefined] expected: FAIL diff --git a/tests/wpt/mozilla/meta/mozilla/media_query_list_gc.html.ini b/tests/wpt/mozilla/meta/mozilla/media_query_list_gc.html.ini index e30744b586d..f4ee735be13 100644 --- a/tests/wpt/mozilla/meta/mozilla/media_query_list_gc.html.ini +++ b/tests/wpt/mozilla/meta/mozilla/media_query_list_gc.html.ini @@ -1 +1 @@ -prefs: ["dom.servo_helpers.enabled:true"] +prefs: ["dom_servo_helpers_enabled:true"] diff --git a/tests/wpt/mozilla/meta/mozilla/ns.any.js.ini b/tests/wpt/mozilla/meta/mozilla/ns.any.js.ini index 1028c1162dd..749cda0d24e 100644 --- a/tests/wpt/mozilla/meta/mozilla/ns.any.js.ini +++ b/tests/wpt/mozilla/meta/mozilla/ns.any.js.ini @@ -1,7 +1,7 @@ [ns.any.html] type: testharness - prefs: [dom.testbinding.enabled:true] + prefs: [dom_testbinding_enabled:true] [ns.any.worker.html] type: testharness - prefs: [dom.testbinding.enabled:true] + prefs: [dom_testbinding_enabled:true] diff --git a/tests/wpt/mozilla/meta/mozilla/overload_dict.html.ini b/tests/wpt/mozilla/meta/mozilla/overload_dict.html.ini index 646813bf83c..12d91fea367 100644 --- a/tests/wpt/mozilla/meta/mozilla/overload_dict.html.ini +++ b/tests/wpt/mozilla/meta/mozilla/overload_dict.html.ini @@ -1,3 +1,3 @@ [overload_dict.html] type: testharness - prefs: [dom.testbinding.enabled:true] + prefs: [dom_testbinding_enabled:true] diff --git a/tests/wpt/mozilla/meta/mozilla/prototypes.html.ini b/tests/wpt/mozilla/meta/mozilla/prototypes.html.ini index e30744b586d..f4ee735be13 100644 --- a/tests/wpt/mozilla/meta/mozilla/prototypes.html.ini +++ b/tests/wpt/mozilla/meta/mozilla/prototypes.html.ini @@ -1 +1 @@ -prefs: ["dom.servo_helpers.enabled:true"] +prefs: ["dom_servo_helpers_enabled:true"] diff --git a/tests/wpt/mozilla/meta/mozilla/sequence-hole.html.ini b/tests/wpt/mozilla/meta/mozilla/sequence-hole.html.ini index a7798c9c3c3..27e9f2f853f 100644 --- a/tests/wpt/mozilla/meta/mozilla/sequence-hole.html.ini +++ b/tests/wpt/mozilla/meta/mozilla/sequence-hole.html.ini @@ -1,2 +1,2 @@ [sequence-hole.html] - prefs: [dom.testbinding.enabled:true] + prefs: [dom_testbinding_enabled:true] diff --git a/tests/wpt/mozilla/meta/mozilla/trace_null.html.ini b/tests/wpt/mozilla/meta/mozilla/trace_null.html.ini index e30744b586d..f4ee735be13 100644 --- a/tests/wpt/mozilla/meta/mozilla/trace_null.html.ini +++ b/tests/wpt/mozilla/meta/mozilla/trace_null.html.ini @@ -1 +1 @@ -prefs: ["dom.servo_helpers.enabled:true"] +prefs: ["dom_servo_helpers_enabled:true"] diff --git a/tests/wpt/mozilla/meta/mozilla/transitionend_safety.html.ini b/tests/wpt/mozilla/meta/mozilla/transitionend_safety.html.ini index e30744b586d..f4ee735be13 100644 --- a/tests/wpt/mozilla/meta/mozilla/transitionend_safety.html.ini +++ b/tests/wpt/mozilla/meta/mozilla/transitionend_safety.html.ini @@ -1 +1 @@ -prefs: ["dom.servo_helpers.enabled:true"] +prefs: ["dom_servo_helpers_enabled:true"] diff --git a/tests/wpt/mozilla/meta/mozilla/weakref.html.ini b/tests/wpt/mozilla/meta/mozilla/weakref.html.ini index 8faf1a9b047..17ca8b55091 100644 --- a/tests/wpt/mozilla/meta/mozilla/weakref.html.ini +++ b/tests/wpt/mozilla/meta/mozilla/weakref.html.ini @@ -1,3 +1,3 @@ [weakref.html] type: testharness - prefs: ["dom.testbinding.enabled:true", "dom.servo_helpers.enabled:true"] + prefs: ["dom_testbinding_enabled:true", "dom_servo_helpers_enabled:true"] diff --git a/tests/wpt/webgl/meta-legacy-layout/conformance/__dir__.ini b/tests/wpt/webgl/meta-legacy-layout/conformance/__dir__.ini index 268ced65042..b1c646726d8 100644 --- a/tests/wpt/webgl/meta-legacy-layout/conformance/__dir__.ini +++ b/tests/wpt/webgl/meta-legacy-layout/conformance/__dir__.ini @@ -1 +1 @@ -prefs: ["dom.offscreen_canvas.enabled:true","dom.imagebitmap.enabled:true"] +prefs: ["dom_offscreen_canvas_enabled:true","dom_imagebitmap_enabled:true"] diff --git a/tests/wpt/webgl/meta-legacy-layout/conformance2/__dir__.ini b/tests/wpt/webgl/meta-legacy-layout/conformance2/__dir__.ini index 2540f857c82..148295a0104 100644 --- a/tests/wpt/webgl/meta-legacy-layout/conformance2/__dir__.ini +++ b/tests/wpt/webgl/meta-legacy-layout/conformance2/__dir__.ini @@ -1,2 +1,2 @@ -prefs: ["dom.webgl2.enabled:true","dom.offscreen_canvas.enabled:true","dom.imagebitmap.enabled:true"] +prefs: ["dom_webgl2_enabled:true","dom_offscreen_canvas_enabled:true","dom_imagebitmap_enabled:true"] diff --git a/tests/wpt/webgl/meta-legacy-layout/conformance2/offscreencanvas/__dir__.ini b/tests/wpt/webgl/meta-legacy-layout/conformance2/offscreencanvas/__dir__.ini index 03004f6efd7..e0b3c7bf146 100644 --- a/tests/wpt/webgl/meta-legacy-layout/conformance2/offscreencanvas/__dir__.ini +++ b/tests/wpt/webgl/meta-legacy-layout/conformance2/offscreencanvas/__dir__.ini @@ -1 +1 @@ -prefs: ["dom.offscreen_canvas.enabled:true"] +prefs: ["dom_offscreen_canvas_enabled:true"] diff --git a/tests/wpt/webgl/meta/__dir__.ini b/tests/wpt/webgl/meta/__dir__.ini index 8ff113eb2cb..f2f09393f27 100644 --- a/tests/wpt/webgl/meta/__dir__.ini +++ b/tests/wpt/webgl/meta/__dir__.ini @@ -1 +1 @@ -prefs: ["dom.offscreen_canvas.enabled:true", "dom.imagebitmap.enabled:true", "dom.webgl2.enabled:true"] +prefs: ["dom_offscreen_canvas_enabled:true", "dom_imagebitmap_enabled:true", "dom_webgl2_enabled:true"] diff --git a/tests/wpt/webgl/meta/conformance2/offscreencanvas/__dir__.ini b/tests/wpt/webgl/meta/conformance2/offscreencanvas/__dir__.ini index 03004f6efd7..e0b3c7bf146 100644 --- a/tests/wpt/webgl/meta/conformance2/offscreencanvas/__dir__.ini +++ b/tests/wpt/webgl/meta/conformance2/offscreencanvas/__dir__.ini @@ -1 +1 @@ -prefs: ["dom.offscreen_canvas.enabled:true"] +prefs: ["dom_offscreen_canvas_enabled:true"] diff --git a/tests/wpt/webgpu/meta/__dir__.ini b/tests/wpt/webgpu/meta/__dir__.ini index bb05019d943..7992a6f4879 100644 --- a/tests/wpt/webgpu/meta/__dir__.ini +++ b/tests/wpt/webgpu/meta/__dir__.ini @@ -1 +1 @@ -prefs: ["dom.webgpu.enabled:true"] +prefs: ["dom_webgpu_enabled:true"] -- cgit v1.2.3