Add new Window globals as debuggees

Signed-off-by: Delan Azabani <dazabani@igalia.com>
Co-authored-by: atbrakhi <atbrakhi@igalia.com>
This commit is contained in:
Delan Azabani 2025-07-18 21:51:13 +08:00
parent c59ee57b5d
commit e2eabd41c9
7 changed files with 107 additions and 1 deletions

View file

@ -0,0 +1,64 @@
/* 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::default::Default;
use std::ptr::NonNull;
use dom_struct::dom_struct;
use js::jsapi::{JSObject, Value};
use script_bindings::conversions::SafeToJSValConvertible;
use script_bindings::reflector::DomObject;
use crate::dom::bindings::codegen::Bindings::DebuggerEventBinding::DebuggerEventMethods;
use crate::dom::bindings::codegen::Bindings::EventBinding::Event_Binding::EventMethods;
use crate::dom::bindings::reflector::reflect_dom_object;
use crate::dom::bindings::root::{DomRoot, MutNullableDom};
use crate::dom::event::Event;
use crate::dom::types::GlobalScope;
use crate::script_runtime::CanGc;
#[dom_struct]
/// Event for Rust → JS calls in [`crate::dom::DebuggerGlobalScope`].
pub(crate) struct DebuggerEvent {
event: Event,
global: MutNullableDom<GlobalScope>,
}
impl DebuggerEvent {
pub(crate) fn new(
debugger_global: &GlobalScope,
global: &GlobalScope,
can_gc: CanGc,
) -> DomRoot<Self> {
let result = Box::new(Self {
event: Event::new_inherited(),
global: Default::default(),
});
// TODO: make these fields not optional somehow?
result.global.set(Some(global));
result.event.init_event("addDebuggee".into(), false, false);
reflect_dom_object(result, debugger_global, can_gc)
}
}
impl DebuggerEventMethods<crate::DomTypeHolder> for DebuggerEvent {
// check-tidy: no specs after this line
fn Global(&self, r#cx: script_bindings::script_runtime::JSContext) -> NonNull<JSObject> {
// Convert the debuggee globals 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.
rooted!(in(*cx) let mut result: Value);
self.global
.get()
.expect("Guaranteed by new")
.reflector()
.safe_to_jsval(cx, result.handle_mut());
NonNull::new(result.to_object()).unwrap()
}
fn IsTrusted(&self) -> bool {
self.event.IsTrusted()
}
}