diff --git a/components/script/dom/debuggerglobalscope.rs b/components/script/dom/debuggerglobalscope.rs index 43fe469d18e..d1e3a102d20 100644 --- a/components/script/dom/debuggerglobalscope.rs +++ b/components/script/dom/debuggerglobalscope.rs @@ -16,8 +16,10 @@ use js::rust::Runtime; use js::rust::wrappers::JS_DefineDebuggerObject; use net_traits::ResourceThreads; use profile_traits::{mem, time}; +use script_bindings::conversions::SafeToJSValConvertible; use script_bindings::realms::InRealm; use script_bindings::reflector::DomObject; +use script_bindings::utils::set_dictionary_property; use servo_url::{ImmutableOrigin, MutableOrigin, ServoUrl}; use crate::dom::bindings::codegen::Bindings::DebuggerGlobalScopeBinding; @@ -116,4 +118,31 @@ impl DebuggerGlobalScope { warn!("Failed to execute debugger request"); } } + + #[allow(unsafe_code)] + pub(crate) fn execute_with_global(&self, can_gc: CanGc, global: &GlobalScope) { + let cx = Self::get_cx(); + rooted!(in(*cx) let mut property_value = UndefinedValue()); + + let _realm = enter_realm(self); + // Convert the debuggee global’s reflector to a Value, wrapping it from its originating realm (debuggee realm) + // into the active realm (debugger realm) so that it can be passed across compartments. + global + .reflector() + .safe_to_jsval(cx, property_value.handle_mut()); + + // TODO: what invariants do we need to uphold for the unsafe call? + if let Err(()) = unsafe { + set_dictionary_property( + *cx, + self.global_scope.reflector().get_jsobject(), + "debuggee", + property_value.handle(), + ) + } { + warn!("Failed to set debuggee"); + return; + } + self.execute(can_gc); + } } diff --git a/components/script/script_thread.rs b/components/script/script_thread.rs index 575c61b002d..f51ea3fc44a 100644 --- a/components/script/script_thread.rs +++ b/components/script/script_thread.rs @@ -3430,6 +3430,8 @@ impl ScriptThread { incomplete.load_data.inherited_secure_context, incomplete.theme, ); + self.debugger_global + .execute_with_global(can_gc, window.upcast()); let _realm = enter_realm(&*window); diff --git a/resources/debugger.js b/resources/debugger.js index 6d1e4b19bc8..bae8988006d 100644 --- a/resources/debugger.js +++ b/resources/debugger.js @@ -1,3 +1,21 @@ if (!("dbg" in this)) { dbg = new Debugger; + + dbg.onNewGlobalObject = function(global) { + console.log("[debugger] onNewGlobalObject"); + console.log(this, global); + }; + + dbg.onNewScript = function(script, global) { + console.log("[debugger] onNewScript"); + console.log(this, script, global); + }; +} + +console.log("[debugger] Executing"); + +if ("debuggee" in this) { + console.log("[debugger] Adding debuggee"); + dbg.addDebuggee(debuggee); + console.log("[debugger] getDebuggees().length =", dbg.getDebuggees().length); }