Rewild Your Web
at main 177 lines 7.8 kB view raw
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));