GetPossibleBreakpointsEvent

Signed-off-by: Delan Azabani <dazabani@igalia.com>
This commit is contained in:
Delan Azabani 2025-08-09 20:18:30 +08:00
parent 95d70c0b20
commit 0b5a8fa693
8 changed files with 73 additions and 14 deletions

View file

@ -10,7 +10,7 @@ use script_bindings::conversions::SafeToJSValConvertible;
use script_bindings::reflector::DomObject; use script_bindings::reflector::DomObject;
use script_bindings::str::DOMString; use script_bindings::str::DOMString;
use crate::dom::bindings::codegen::Bindings::DebuggerEventBinding::DebuggerEventMethods; use crate::dom::bindings::codegen::Bindings::AddDebuggeeEventBinding::AddDebuggeeEventMethods;
use crate::dom::bindings::codegen::Bindings::EventBinding::Event_Binding::EventMethods; use crate::dom::bindings::codegen::Bindings::EventBinding::Event_Binding::EventMethods;
use crate::dom::bindings::reflector::reflect_dom_object; use crate::dom::bindings::reflector::reflect_dom_object;
use crate::dom::bindings::root::{Dom, DomRoot}; use crate::dom::bindings::root::{Dom, DomRoot};
@ -20,14 +20,14 @@ use crate::script_runtime::CanGc;
#[dom_struct] #[dom_struct]
/// Event for Rust → JS calls in [`crate::dom::DebuggerGlobalScope`]. /// Event for Rust → JS calls in [`crate::dom::DebuggerGlobalScope`].
pub(crate) struct DebuggerEvent { pub(crate) struct AddDebuggeeEvent {
event: Event, event: Event,
global: Dom<GlobalScope>, global: Dom<GlobalScope>,
pipeline_id: Dom<PipelineId>, pipeline_id: Dom<PipelineId>,
worker_id: Option<DOMString>, worker_id: Option<DOMString>,
} }
impl DebuggerEvent { impl AddDebuggeeEvent {
pub(crate) fn new( pub(crate) fn new(
debugger_global: &GlobalScope, debugger_global: &GlobalScope,
global: &GlobalScope, global: &GlobalScope,
@ -48,7 +48,7 @@ impl DebuggerEvent {
} }
} }
impl DebuggerEventMethods<crate::DomTypeHolder> for DebuggerEvent { impl AddDebuggeeEventMethods<crate::DomTypeHolder> for AddDebuggeeEvent {
// check-tidy: no specs after this line // check-tidy: no specs after this line
fn Global(&self, cx: script_bindings::script_runtime::JSContext) -> NonNull<JSObject> { fn Global(&self, cx: script_bindings::script_runtime::JSContext) -> NonNull<JSObject> {
// Convert the debuggee globals reflector to a Value, wrapping it from its originating realm (debuggee realm) // Convert the debuggee globals reflector to a Value, wrapping it from its originating realm (debuggee realm)

View file

@ -26,7 +26,7 @@ use crate::dom::bindings::inheritance::Castable;
use crate::dom::bindings::root::DomRoot; use crate::dom::bindings::root::DomRoot;
use crate::dom::bindings::utils::define_all_exposed_interfaces; use crate::dom::bindings::utils::define_all_exposed_interfaces;
use crate::dom::globalscope::GlobalScope; use crate::dom::globalscope::GlobalScope;
use crate::dom::types::{DebuggerEvent, Event}; use crate::dom::types::{AddDebuggeeEvent, Event};
#[cfg(feature = "testbinding")] #[cfg(feature = "testbinding")]
#[cfg(feature = "webgpu")] #[cfg(feature = "webgpu")]
use crate::dom::webgpu::identityhub::IdentityHub; use crate::dom::webgpu::identityhub::IdentityHub;
@ -139,7 +139,7 @@ impl DebuggerGlobalScope {
) { ) {
let debuggee_pipeline_id = let debuggee_pipeline_id =
crate::dom::pipelineid::PipelineId::new(self.upcast(), debuggee_pipeline_id, can_gc); crate::dom::pipelineid::PipelineId::new(self.upcast(), debuggee_pipeline_id, can_gc);
let event = DomRoot::upcast::<Event>(DebuggerEvent::new( let event = DomRoot::upcast::<Event>(AddDebuggeeEvent::new(
self.upcast(), self.upcast(),
debuggee_global, debuggee_global,
&debuggee_pipeline_id, &debuggee_pipeline_id,
@ -148,7 +148,7 @@ impl DebuggerGlobalScope {
)); ));
assert!( assert!(
DomRoot::upcast::<Event>(event).fire(self.upcast(), can_gc), DomRoot::upcast::<Event>(event).fire(self.upcast(), can_gc),
"Guaranteed by DebuggerEvent::new" "Guaranteed by AddDebuggeeEvent::new"
); );
} }
} }

View file

@ -0,0 +1,48 @@
/* 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 dom_struct::dom_struct;
use crate::dom::bindings::codegen::Bindings::GetPossibleBreakpointsEventBinding::GetPossibleBreakpointsEventMethods;
use crate::dom::bindings::codegen::Bindings::EventBinding::Event_Binding::EventMethods;
use crate::dom::bindings::reflector::reflect_dom_object;
use crate::dom::bindings::root::DomRoot;
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 GetPossibleBreakpointsEvent {
event: Event,
spidermonkey_id: u32,
}
impl GetPossibleBreakpointsEvent {
pub(crate) fn new(
debugger_global: &GlobalScope,
spidermonkey_id: u32,
can_gc: CanGc,
) -> DomRoot<Self> {
let result = Box::new(Self {
event: Event::new_inherited(),
spidermonkey_id,
});
let result = reflect_dom_object(result, debugger_global, can_gc);
result.event.init_event("getPossibleBreakpoints".into(), false, false);
result
}
}
impl GetPossibleBreakpointsEventMethods<crate::DomTypeHolder> for GetPossibleBreakpointsEvent {
// check-tidy: no specs after this line
fn SpidermonkeyId(&self) -> u32 {
self.spidermonkey_id
}
fn IsTrusted(&self) -> bool {
self.event.IsTrusted()
}
}

View file

@ -217,6 +217,7 @@ pub(crate) mod abstractrange;
pub(crate) mod abstractworker; pub(crate) mod abstractworker;
pub(crate) mod abstractworkerglobalscope; pub(crate) mod abstractworkerglobalscope;
pub(crate) mod activation; pub(crate) mod activation;
pub(crate) mod adddebuggeeevent;
pub(crate) mod analysernode; pub(crate) mod analysernode;
pub(crate) mod animationevent; pub(crate) mod animationevent;
pub(crate) mod attr; pub(crate) mod attr;
@ -289,7 +290,6 @@ pub(crate) mod customevent;
pub(crate) mod datatransfer; pub(crate) mod datatransfer;
pub(crate) mod datatransferitem; pub(crate) mod datatransferitem;
pub(crate) mod datatransferitemlist; pub(crate) mod datatransferitemlist;
pub(crate) mod debuggerevent;
pub(crate) mod debuggerglobalscope; pub(crate) mod debuggerglobalscope;
pub(crate) mod dedicatedworkerglobalscope; pub(crate) mod dedicatedworkerglobalscope;
pub(crate) mod defaultteereadrequest; pub(crate) mod defaultteereadrequest;
@ -341,6 +341,7 @@ pub(crate) mod gamepadbuttonlist;
pub(crate) mod gamepadevent; pub(crate) mod gamepadevent;
pub(crate) mod gamepadhapticactuator; pub(crate) mod gamepadhapticactuator;
pub(crate) mod gamepadpose; pub(crate) mod gamepadpose;
pub(crate) mod getpossiblebreakpointsevent;
#[allow(dead_code)] #[allow(dead_code)]
pub(crate) mod globalscope; pub(crate) mod globalscope;
pub(crate) mod hashchangeevent; pub(crate) mod hashchangeevent;

View file

@ -4,7 +4,7 @@
use dom_struct::dom_struct; use dom_struct::dom_struct;
use crate::dom::bindings::codegen::Bindings::DebuggerEventBinding::PipelineIdMethods; use crate::dom::bindings::codegen::Bindings::AddDebuggeeEventBinding::PipelineIdMethods;
use crate::dom::bindings::reflector::{Reflector, reflect_dom_object}; use crate::dom::bindings::reflector::{Reflector, reflect_dom_object};
use crate::dom::bindings::root::DomRoot; use crate::dom::bindings::root::DomRoot;
use crate::dom::globalscope::GlobalScope; use crate::dom::globalscope::GlobalScope;

View file

@ -5,7 +5,7 @@
// This interface is entirely internal to Servo, and should not be accessible to // This interface is entirely internal to Servo, and should not be accessible to
// web pages. // web pages.
[Exposed=DebuggerGlobalScope] [Exposed=DebuggerGlobalScope]
interface DebuggerEvent : Event { interface AddDebuggeeEvent : Event {
readonly attribute object global; readonly attribute object global;
readonly attribute PipelineId pipelineId; readonly attribute PipelineId pipelineId;
readonly attribute DOMString? workerId; readonly attribute DOMString? workerId;

View file

@ -0,0 +1,10 @@
/* 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/. */
// This interface is entirely internal to Servo, and should not be accessible to
// web pages.
[Exposed=DebuggerGlobalScope]
interface GetPossibleBreakpointsEvent : Event {
readonly attribute unsigned long spidermonkeyId;
};

View file

@ -5,6 +5,7 @@ if ("dbg" in this) {
const dbg = new Debugger; const dbg = new Debugger;
const debuggeesToPipelineIds = new Map; const debuggeesToPipelineIds = new Map;
const debuggeesToWorkerIds = new Map; const debuggeesToWorkerIds = new Map;
const sourceIdsToScripts = new Map;
dbg.uncaughtExceptionHook = function(error) { dbg.uncaughtExceptionHook = function(error) {
console.error(`[debugger] Uncaught exception at ${error.fileName}:${error.lineNumber}:${error.columnNumber}: ${error.name}: ${error.message}`); console.error(`[debugger] Uncaught exception at ${error.fileName}:${error.lineNumber}:${error.columnNumber}: ${error.name}: ${error.message}`);
@ -12,11 +13,10 @@ dbg.uncaughtExceptionHook = function(error) {
dbg.onNewScript = function(script, /* undefined; seems to be `script.global` now */ global) { dbg.onNewScript = function(script, /* undefined; seems to be `script.global` now */ global) {
console.log("[debugger] onNewScript url=", script.url, "source id=", script.source.id, "introductionType=", script.source.introductionType, "displayURL=", script.source.displayURL); console.log("[debugger] onNewScript url=", script.url, "source id=", script.source.id, "introductionType=", script.source.introductionType, "displayURL=", script.source.displayURL);
try { if (script.source.introductionType == "wasm") {
console.log("[debugger] source binary=", typeof script.source.binary); console.log("[debugger] source binary=", script.source.binary);
} catch (error) {
// Do nothing; the source is not wasm
} }
sourceIdsToScripts.set(script.source.id, script);
notifyNewSource({ notifyNewSource({
pipelineId: debuggeesToPipelineIds.get(script.global), pipelineId: debuggeesToPipelineIds.get(script.global),
workerId: debuggeesToWorkerIds.get(script.global), workerId: debuggeesToWorkerIds.get(script.global),