Bug 1966702 - Implement debugger breakpoints for CloseWatcher events r=nchevobbe,devtools-reviewers

Differential Revision: https://phabricator.services.mozilla.com/D250307
This commit is contained in:
Keith Cirkel
2025-05-22 08:19:31 +00:00
committed by mozilla@keithcirkel.co.uk
parent db75ef0ce8
commit 8515aaaac5
6 changed files with 54 additions and 1 deletions

View File

@@ -7,6 +7,7 @@
add_task(async function () { add_task(async function () {
await pushPref("dom.element.invokers.enabled", true); await pushPref("dom.element.invokers.enabled", true);
await pushPref("dom.events.textevent.enabled", true); await pushPref("dom.events.textevent.enabled", true);
await pushPref("dom.closewatcher.enabled", true);
const dbg = await initDebugger( const dbg = await initDebugger(
"doc-event-breakpoints.html", "doc-event-breakpoints.html",
@@ -81,6 +82,19 @@ add_task(async function () {
await assertPausedAtSourceAndLine(dbg, eventBreakpointsSource.id, 77); await assertPausedAtSourceAndLine(dbg, eventBreakpointsSource.id, 77);
await resume(dbg); await resume(dbg);
info("Enable closewatcher cancel and close events");
await toggleEventBreakpoint(dbg, "CloseWatcher", "event.closewatcher.cancel");
await toggleEventBreakpoint(dbg, "CloseWatcher", "event.closewatcher.close");
invokeInTab("closeWatcherRequestClose");
info("Wait for pause in cancel event listener");
await waitForPaused(dbg);
await assertPausedAtSourceAndLine(dbg, eventBreakpointsSource.id, 116);
await resume(dbg);
info("And wait for pause in close event listener after resuming");
await waitForPaused(dbg);
await assertPausedAtSourceAndLine(dbg, eventBreakpointsSource.id, 120);
await resume(dbg);
info("Enable beforetoggle and toggle events"); info("Enable beforetoggle and toggle events");
await toggleEventBreakpoint(dbg, "Control", "event.control.beforetoggle"); await toggleEventBreakpoint(dbg, "Control", "event.control.beforetoggle");
await toggleEventBreakpoint(dbg, "Control", "event.control.toggle"); await toggleEventBreakpoint(dbg, "Control", "event.control.toggle");

View File

@@ -106,3 +106,16 @@ document.getElementById("pointer-target").addEventListener("pointerrawupdate", o
function onPointerRawUpdate() { function onPointerRawUpdate() {
console.log("pointerrawupdate"); console.log("pointerrawupdate");
} }
const closewatcher = new CloseWatcher();
function closeWatcherRequestClose() {
closewatcher.requestClose();
}
closewatcher.addEventListener("cancel", onCancel);
function onCancel(event) {
console.log("cancel", event);
}
closewatcher.addEventListener("close", onClose);
function onClose(event) {
console.log("close", event);
}

View File

@@ -57,6 +57,14 @@ function xhrEvent(groupID, eventType) {
}; };
} }
function closeWatcherEvent(groupID, eventType) {
return {
...generalEvent(groupID, eventType),
message: `CloseWatcher '${eventType}' event`,
targetTypes: ["closewatcher"],
};
}
function webSocketEvent(groupID, eventType) { function webSocketEvent(groupID, eventType) {
return { return {
...generalEvent(groupID, eventType), ...generalEvent(groupID, eventType),
@@ -132,6 +140,17 @@ const AVAILABLE_BREAKPOINTS = [
generalEvent("clipboard", "beforepaste"), generalEvent("clipboard", "beforepaste"),
], ],
}, },
{
name: "CloseWatcher",
items: [
closeWatcherEvent("closewatcher", "cancel", () =>
Services.prefs.getBoolPref("dom.closewatcher.enabled")
),
closeWatcherEvent("closewatcher", "close", () =>
Services.prefs.getBoolPref("dom.closewatcher.enabled")
),
],
},
{ {
name: "Control", name: "Control",
items: [ items: [

View File

@@ -48,6 +48,7 @@ enum EventCallbackDebuggerNotificationType {
"xhr", "xhr",
"worker", "worker",
"websocket", "websocket",
"closewatcher",
}; };
// A notification that about the engine calling a DOM event handler. // A notification that about the engine calling a DOM event handler.

View File

@@ -9,6 +9,7 @@
#include "mozilla/DOMEventTargetHelper.h" #include "mozilla/DOMEventTargetHelper.h"
#include "mozilla/dom/CloseWatcherBinding.h" #include "mozilla/dom/CloseWatcherBinding.h"
#include "mozilla/dom/DebuggerNotificationBinding.h"
namespace mozilla::dom { namespace mozilla::dom {
@@ -18,6 +19,11 @@ class CloseWatcher : public DOMEventTargetHelper, public AbortFollower {
nsIGlobalObject* GetParentObject() const { return GetOwnerGlobal(); } nsIGlobalObject* GetParentObject() const { return GetOwnerGlobal(); }
mozilla::Maybe<EventCallbackDebuggerNotificationType>
GetDebuggerNotificationType() const override {
return mozilla::Some(EventCallbackDebuggerNotificationType::Closewatcher);
}
JSObject* WrapObject(JSContext* aCx, JSObject* WrapObject(JSContext* aCx,
JS::Handle<JSObject*> aGivenProto) override; JS::Handle<JSObject*> aGivenProto) override;

View File

@@ -25711,7 +25711,7 @@ type DistanceModelType = "exponential" | "inverse" | "linear";
type EncodedAudioChunkType = "delta" | "key"; type EncodedAudioChunkType = "delta" | "key";
type EncodedVideoChunkType = "delta" | "key"; type EncodedVideoChunkType = "delta" | "key";
type EndingType = "native" | "transparent"; type EndingType = "native" | "transparent";
type EventCallbackDebuggerNotificationType = "global" | "node" | "websocket" | "worker" | "xhr"; type EventCallbackDebuggerNotificationType = "global" | "node" | "websocket" | "worker" | "xhr" | "closewatcher";
type FetchState = "aborted" | "complete" | "errored" | "requesting" | "responding"; type FetchState = "aborted" | "complete" | "errored" | "requesting" | "responding";
type FileSystemHandleKind = "directory" | "file"; type FileSystemHandleKind = "directory" | "file";
type FileType = "directory" | "other" | "regular"; type FileType = "directory" | "other" | "regular";