Skip to content

Commit ec54faa

Browse files
committed
Bug 1966702 - Implement debugger breakpoints for CloseWatcher events r=nchevobbe,devtools-reviewers
Differential Revision: https://phabricator.services.mozilla.com/D250307 UltraBlame original commit: 6ae35aa82e39fbeffcc7c51e39fe912876d2114f
1 parent 8152ca0 commit ec54faa

File tree

6 files changed

+62
-4
lines changed

6 files changed

+62
-4
lines changed

devtools/client/debugger/test/mochitest/browser_dbg-event-breakpoints.js

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
add_task(async function () {
88
await pushPref("dom.element.invokers.enabled", true);
99
await pushPref("dom.events.textevent.enabled", true);
10+
await pushPref("dom.closewatcher.enabled", true);
1011

1112
const dbg = await initDebugger(
1213
"doc-event-breakpoints.html",
@@ -81,6 +82,19 @@ add_task(async function () {
8182
await assertPausedAtSourceAndLine(dbg, eventBreakpointsSource.id, 77);
8283
await resume(dbg);
8384

85+
info("Enable closewatcher cancel and close events");
86+
await toggleEventBreakpoint(dbg, "CloseWatcher", "event.closewatcher.cancel");
87+
await toggleEventBreakpoint(dbg, "CloseWatcher", "event.closewatcher.close");
88+
invokeInTab("closeWatcherRequestClose");
89+
info("Wait for pause in cancel event listener");
90+
await waitForPaused(dbg);
91+
await assertPausedAtSourceAndLine(dbg, eventBreakpointsSource.id, 116);
92+
await resume(dbg);
93+
info("And wait for pause in close event listener after resuming");
94+
await waitForPaused(dbg);
95+
await assertPausedAtSourceAndLine(dbg, eventBreakpointsSource.id, 120);
96+
await resume(dbg);
97+
8498
info("Enable beforetoggle and toggle events");
8599
await toggleEventBreakpoint(dbg, "Control", "event.control.beforetoggle");
86100
await toggleEventBreakpoint(dbg, "Control", "event.control.toggle");

devtools/client/debugger/test/mochitest/examples/event-breakpoints.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,3 +106,16 @@ document.getElementById("pointer-target").addEventListener("pointerrawupdate", o
106106
function onPointerRawUpdate() {
107107
console.log("pointerrawupdate");
108108
}
109+
110+
const closewatcher = new CloseWatcher();
111+
function closeWatcherRequestClose() {
112+
closewatcher.requestClose();
113+
}
114+
closewatcher.addEventListener("cancel", onCancel);
115+
function onCancel(event) {
116+
console.log("cancel", event);
117+
}
118+
closewatcher.addEventListener("close", onClose);
119+
function onClose(event) {
120+
console.log("close", event);
121+
}

devtools/server/actors/utils/event-breakpoints.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,14 @@ function xhrEvent(groupID, eventType) {
5757
};
5858
}
5959

60+
function closeWatcherEvent(groupID, eventType) {
61+
return {
62+
...generalEvent(groupID, eventType),
63+
message: `CloseWatcher '${eventType}' event`,
64+
targetTypes: ["closewatcher"],
65+
};
66+
}
67+
6068
function webSocketEvent(groupID, eventType) {
6169
return {
6270
...generalEvent(groupID, eventType),
@@ -132,6 +140,17 @@ const AVAILABLE_BREAKPOINTS = [
132140
generalEvent("clipboard", "beforepaste"),
133141
],
134142
},
143+
{
144+
name: "CloseWatcher",
145+
items: [
146+
closeWatcherEvent("closewatcher", "cancel", () =>
147+
Services.prefs.getBoolPref("dom.closewatcher.enabled")
148+
),
149+
closeWatcherEvent("closewatcher", "close", () =>
150+
Services.prefs.getBoolPref("dom.closewatcher.enabled")
151+
),
152+
],
153+
},
135154
{
136155
name: "Control",
137156
items: [

dom/chrome-webidl/DebuggerNotification.webidl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ enum EventCallbackDebuggerNotificationType {
4848
"xhr",
4949
"worker",
5050
"websocket",
51+
"closewatcher",
5152
};
5253

5354
// A notification that about the engine calling a DOM event handler.

dom/closewatcher/CloseWatcher.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
#include "mozilla/DOMEventTargetHelper.h"
1111
#include "mozilla/dom/CloseWatcherBinding.h"
12+
#include "mozilla/dom/DebuggerNotificationBinding.h"
1213

1314
namespace mozilla::dom {
1415

@@ -18,6 +19,11 @@ class CloseWatcher : public DOMEventTargetHelper, public AbortFollower {
1819

1920
nsIGlobalObject* GetParentObject() const { return GetOwnerGlobal(); }
2021

22+
mozilla::Maybe<EventCallbackDebuggerNotificationType>
23+
GetDebuggerNotificationType() const override {
24+
return mozilla::Some(EventCallbackDebuggerNotificationType::Closewatcher);
25+
}
26+
2127
JSObject* WrapObject(JSContext* aCx,
2228
JS::Handle<JSObject*> aGivenProto) override;
2329

tools/@types/generated/lib.gecko.dom.d.ts

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3631,6 +3631,10 @@ interface SetHTMLOptions {
36313631
sanitizer?: Sanitizer | SanitizerConfig | SanitizerPresets;
36323632
}
36333633

3634+
interface SetHTMLUnsafeOptions {
3635+
sanitizer?: Sanitizer | SanitizerConfig | SanitizerPresets;
3636+
}
3637+
36343638
interface ShadowRootInit {
36353639
clonable?: boolean;
36363640
delegatesFocus?: boolean;
@@ -7533,7 +7537,7 @@ declare var Document: {
75337537
readonly KEYPRESS_EVENT_MODEL_CONFLATED: 2;
75347538
isInstance: IsInstance<Document>;
75357539
parseHTML(html: string, options?: SetHTMLOptions): Document;
7536-
parseHTMLUnsafe(html: TrustedHTML | string): Document;
7540+
parseHTMLUnsafe(html: TrustedHTML | string, options?: SetHTMLUnsafeOptions): Document;
75377541
};
75387542

75397543
interface DocumentFragment extends Node, NonElementParentNode, ParentNode {
@@ -7813,7 +7817,7 @@ interface Element extends Node, ARIAMixin, Animatable, ChildNode, GeometryUtils,
78137817
setCapture(retargetToElement?: boolean): void;
78147818
setCaptureAlways(retargetToElement?: boolean): void;
78157819
setHTML(aInnerHTML: string, options?: SetHTMLOptions): void;
7816-
setHTMLUnsafe(html: TrustedHTML | string): void;
7820+
setHTMLUnsafe(html: TrustedHTML | string, options?: SetHTMLUnsafeOptions): void;
78177821
setPointerCapture(pointerId: number): void;
78187822
toggleAttribute(name: string, force?: boolean): boolean;
78197823
webkitMatchesSelector(selector: string): boolean;
@@ -18844,7 +18848,8 @@ interface ShadowRoot extends DocumentFragment, DocumentOrShadowRoot {
1884418848
getHTML(options?: GetHTMLOptions): string;
1884518849
importNodeAndAppendChildAt(parentNode: Node, node: Node, deep?: boolean): Node;
1884618850
isUAWidget(): boolean;
18847-
setHTMLUnsafe(html: TrustedHTML | string): void;
18851+
setHTML(aInnerHTML: string, options?: SetHTMLOptions): void;
18852+
setHTMLUnsafe(html: TrustedHTML | string, options?: SetHTMLUnsafeOptions): void;
1884818853
setIsUAWidget(): void;
1884918854
addEventListener<K extends keyof ShadowRootEventMap>(type: K, listener: (this: ShadowRoot, ev: ShadowRootEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
1885018855
addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
@@ -25706,7 +25711,7 @@ type DistanceModelType = "exponential" | "inverse" | "linear";
2570625711
type EncodedAudioChunkType = "delta" | "key";
2570725712
type EncodedVideoChunkType = "delta" | "key";
2570825713
type EndingType = "native" | "transparent";
25709-
type EventCallbackDebuggerNotificationType = "global" | "node" | "websocket" | "worker" | "xhr";
25714+
type EventCallbackDebuggerNotificationType = "global" | "node" | "websocket" | "worker" | "xhr" | "closewatcher";
2571025715
type FetchState = "aborted" | "complete" | "errored" | "requesting" | "responding";
2571125716
type FileSystemHandleKind = "directory" | "file";
2571225717
type FileType = "directory" | "other" | "regular";

0 commit comments

Comments
 (0)