forked from
me.webbeef.org/browser.html
Rewild Your Web
1--- original
2+++ modified
3@@ -13,9 +13,10 @@
4 use profile_traits::mem::MemoryReportResult;
5 use script_bindings::conversions::SafeToJSValConvertible;
6 use script_bindings::error::{Error, Fallible};
7-use script_bindings::interfaces::ServoInternalsHelpers;
8+use script_bindings::interfaces::{EmbedderHelpers, ServoInternalsHelpers};
9 use script_bindings::script_runtime::JSContext;
10 use script_bindings::str::USVString;
11+use servo_config::embedder_prefs;
12 use servo_config::prefs::{self, PrefValue, Preferences};
13
14 use crate::dom::bindings::codegen::Bindings::ServoInternalsBinding::ServoInternalsMethods;
15@@ -22,6 +23,7 @@
16 use crate::dom::bindings::import::base::SafeJSContext;
17 use crate::dom::bindings::reflector::{DomGlobal, Reflector, reflect_dom_object};
18 use crate::dom::bindings::root::DomRoot;
19+use crate::dom::embedder::Embedder;
20 use crate::dom::globalscope::GlobalScope;
21 use crate::dom::promise::Promise;
22 use crate::realms::{AlreadyInRealm, InRealm};
23@@ -141,22 +143,38 @@
24
25 /// <https://servo.org/internal-no-spec>
26 fn GetBoolPreference(&self, name: USVString) -> Fallible<bool> {
27- if !Preferences::exists(&name) {
28- return Err(Error::NotFound(None));
29+ // Check if this is an embedder preference (contains a namespace separator)
30+ if name.contains('.') {
31+ // Look up in embedder preferences registry
32+ if let Some(PrefValue::Bool(b)) = prefs::get_embedder_pref(&name) {
33+ return Ok(b);
34+ }
35+ } else {
36+ if !Preferences::exists(&name) {
37+ return Err(Error::NotFound(None));
38+ }
39+ if let PrefValue::Bool(b) = prefs::get().get_value(&name) {
40+ return Ok(b);
41+ }
42 }
43- if let PrefValue::Bool(b) = prefs::get().get_value(&name) {
44- return Ok(b);
45- }
46 Err(Error::TypeMismatch(None))
47 }
48
49 /// <https://servo.org/internal-no-spec>
50 fn GetIntPreference(&self, name: USVString) -> Fallible<i64> {
51- if !Preferences::exists(&name) {
52- return Err(Error::NotFound(None));
53- }
54- if let PrefValue::Int(i) = prefs::get().get_value(&name) {
55- return Ok(i);
56+ // Check if this is an embedder preference (contains a namespace separator)
57+ if name.contains('.') {
58+ // Look up in embedder preferences registry
59+ if let Some(PrefValue::Int(i)) = prefs::get_embedder_pref(&name) {
60+ return Ok(i);
61+ }
62+ } else {
63+ if !Preferences::exists(&name) {
64+ return Err(Error::NotFound(None));
65+ }
66+ if let PrefValue::Int(i) = prefs::get().get_value(&name) {
67+ return Ok(i);
68+ }
69 }
70 Err(Error::TypeMismatch(None))
71 }
72@@ -163,11 +181,19 @@
73
74 /// <https://servo.org/internal-no-spec>
75 fn GetStringPreference(&self, name: USVString) -> Fallible<USVString> {
76- if !Preferences::exists(&name) {
77- return Err(Error::NotFound(None));
78- }
79- if let PrefValue::Str(s) = prefs::get().get_value(&name) {
80- return Ok(s.into());
81+ // Check if this is an embedder preference (contains a namespace separator)
82+ if name.contains('.') {
83+ // Look up in embedder preferences registry
84+ if let Some(PrefValue::Str(s)) = prefs::get_embedder_pref(&name) {
85+ return Ok(s.into());
86+ }
87+ } else {
88+ if !Preferences::exists(&name) {
89+ return Err(Error::NotFound(None));
90+ }
91+ if let PrefValue::Str(s) = prefs::get().get_value(&name) {
92+ return Ok(s.into());
93+ }
94 }
95 Err(Error::TypeMismatch(None))
96 }
97@@ -174,23 +200,59 @@
98
99 /// <https://servo.org/internal-no-spec>
100 fn SetBoolPreference(&self, name: USVString, value: bool) {
101- let mut current_prefs = prefs::get().clone();
102- current_prefs.set_value(&name, value.into());
103- prefs::set(current_prefs);
104+ let pref_value: PrefValue = value.into();
105+ // Check if this is an embedder preference (contains a namespace separator)
106+ if name.contains('.') {
107+ // Use the embedder prefs setter which invokes callbacks and notifies observers
108+ embedder_prefs::set_embedder_pref_from_script(&name, pref_value.clone());
109+ } else {
110+ // Core Servo preference
111+ let mut current_prefs = prefs::get().clone();
112+ current_prefs.set_value(&name, pref_value.clone());
113+ prefs::set(current_prefs);
114+ }
115+ // Broadcast preference change to all script threads via the Constellation
116+ let _ = self.global().script_to_constellation_chan().send(
117+ ScriptToConstellationMessage::BroadcastPreferenceChange(name.to_string(), pref_value),
118+ );
119 }
120
121 /// <https://servo.org/internal-no-spec>
122 fn SetIntPreference(&self, name: USVString, value: i64) {
123- let mut current_prefs = prefs::get().clone();
124- current_prefs.set_value(&name, value.into());
125- prefs::set(current_prefs);
126+ let pref_value: PrefValue = value.into();
127+ // Check if this is an embedder preference (contains a namespace separator)
128+ if name.contains('.') {
129+ // Use the embedder prefs setter which invokes callbacks and notifies observers
130+ embedder_prefs::set_embedder_pref_from_script(&name, pref_value.clone());
131+ } else {
132+ // Core Servo preference
133+ let mut current_prefs = prefs::get().clone();
134+ current_prefs.set_value(&name, pref_value.clone());
135+ prefs::set(current_prefs);
136+ }
137+ // Broadcast preference change to all script threads via the Constellation
138+ let _ = self.global().script_to_constellation_chan().send(
139+ ScriptToConstellationMessage::BroadcastPreferenceChange(name.to_string(), pref_value),
140+ );
141 }
142
143 /// <https://servo.org/internal-no-spec>
144 fn SetStringPreference(&self, name: USVString, value: USVString) {
145- let mut current_prefs = prefs::get().clone();
146- current_prefs.set_value(&name, value.0.into());
147- prefs::set(current_prefs);
148+ let pref_value: PrefValue = value.0.into();
149+ // Check if this is an embedder preference (contains a namespace separator)
150+ if name.contains('.') {
151+ // Use the embedder prefs setter which invokes callbacks and notifies observers
152+ embedder_prefs::set_embedder_pref_from_script(&name, pref_value.clone());
153+ } else {
154+ // Core Servo preference
155+ let mut current_prefs = prefs::get().clone();
156+ current_prefs.set_value(&name, pref_value.clone());
157+ prefs::set(current_prefs);
158+ }
159+ // Broadcast preference change to all script threads via the Constellation
160+ let _ = self.global().script_to_constellation_chan().send(
161+ ScriptToConstellationMessage::BroadcastPreferenceChange(name.to_string(), pref_value),
162+ );
163 }
164 }
165
166@@ -206,7 +268,10 @@
167 /// The navigator.servo api is exposed to about: pages except about:blank, as
168 /// well as any URLs provided by embedders that register new protocol handlers.
169 #[expect(unsafe_code)]
170- fn is_servo_internal(cx: JSContext, _global: HandleObject) -> bool {
171+ fn is_servo_internal(cx: JSContext, global: HandleObject) -> bool {
172+ if Embedder::is_allowed_to_embed(cx, global) {
173+ return true;
174+ }
175 unsafe {
176 let in_realm_proof = AlreadyInRealm::assert_for_cx(cx);
177 let global_scope = GlobalScope::from_context(*cx, InRealm::Already(&in_realm_proof));