416 lines
16 KiB
HTML
416 lines
16 KiB
HTML
<!doctype html>
|
|
<html>
|
|
<head>
|
|
<script src="../../http/tests/inspector/resources/inspector-test.js"></script>
|
|
<script>
|
|
function handleButton1Click(event) {
|
|
TestPage.dispatchEventToFrontend("TestPageButton1Click");
|
|
}
|
|
|
|
function handleButton2Click(event) {
|
|
TestPage.dispatchEventToFrontend("TestPageButton2Click");
|
|
}
|
|
|
|
function clickButton1() {
|
|
document.getElementById("button1").click();
|
|
}
|
|
|
|
function clickButton2() {
|
|
document.getElementById("button2").click();
|
|
}
|
|
|
|
function test() {
|
|
let button1Node = null;
|
|
let button2Node = null;
|
|
|
|
async function getClickEventListener(nodeId) {
|
|
let {listeners} = await DOMAgent.getEventListenersForNode(nodeId);
|
|
return listeners.find((eventListener) => eventListener.type === "click");
|
|
}
|
|
|
|
async function setBreakpointForClickEventListener(node) {
|
|
let clickEventListener = await getClickEventListener(node.id);
|
|
InspectorTest.assert(!clickEventListener.hasBreakpoint, "Click event listener for button1 should not have a breakpoint.");
|
|
|
|
return new Promise((resolve, reject) => {
|
|
WI.domDebuggerManager.singleFireEventListener(WI.DOMDebuggerManager.Event.EventBreakpointAdded, (event) => {
|
|
resolve(event.data.breakpoint);
|
|
});
|
|
|
|
WI.domManager.setBreakpointForEventListener(clickEventListener);
|
|
});
|
|
}
|
|
|
|
let suite = InspectorTest.createAsyncSuite("DOM.BreakpointForEventListener");
|
|
|
|
suite.addTestCase({
|
|
name: "DOM.setBreakpointForEventListener",
|
|
description: "Check that the debugger pauses for this event.",
|
|
test(resolve, reject) {
|
|
let paused = false;
|
|
let clickingButton1 = false;
|
|
|
|
let listener = WI.debuggerManager.singleFireEventListener(WI.DebuggerManager.Event.Paused, (event) => {
|
|
if (clickingButton1)
|
|
InspectorTest.pass("Should pause before button1 event handler is run.");
|
|
else
|
|
InspectorTest.fail("Should not pause before button2 event handler is run.");
|
|
|
|
paused = true;
|
|
|
|
let targetData = WI.debuggerManager.dataForTarget(WI.debuggerManager.activeCallFrame.target);
|
|
InspectorTest.expectEqual(targetData.pauseReason, WI.DebuggerManager.PauseReason.Listener, `Pause reason should be Listener.`);
|
|
InspectorTest.expectEqual(targetData.pauseData.eventName, "click", `Pause data eventName should be "click".`);
|
|
|
|
getClickEventListener(button1Node.id)
|
|
.then((clickEventListener) => {
|
|
InspectorTest.assert(targetData.pauseData.eventListenerId === clickEventListener.eventListenerId, `Pause data eventListenerId should be "${clickEventListener.eventListenerId}".`);
|
|
InspectorTest.assert(clickEventListener.hasBreakpoint, "Click event listener for button1 should have a breakpoint.");
|
|
|
|
WI.debuggerManager.resume();
|
|
});
|
|
});
|
|
|
|
InspectorTest.singleFireEventListener("TestPageButton1Click", (event) => {
|
|
if (!paused) {
|
|
WI.debuggerManager.removeEventListener(WI.DebuggerManager.Event.Paused, listener);
|
|
|
|
InspectorTest.fail("Should pause before button1 event handler is run.");
|
|
}
|
|
|
|
resolve();
|
|
});
|
|
|
|
InspectorTest.singleFireEventListener("TestPageButton2Click", (event) => {
|
|
if (!paused)
|
|
InspectorTest.pass("Should not pause before button2 event handler is run.");
|
|
|
|
InspectorTest.log("Clicking button1...");
|
|
clickingButton1 = true;
|
|
InspectorTest.evaluateInPage(`clickButton1()`);
|
|
});
|
|
|
|
getClickEventListener(button1Node.id)
|
|
.then((clickEventListener) => {
|
|
InspectorTest.assert(!clickEventListener.hasBreakpoint, "Click event listener for button1 should not have a breakpoint.");
|
|
|
|
InspectorTest.log("Adding breakpoint for event listener...");
|
|
return DOMAgent.setBreakpointForEventListener(clickEventListener.eventListenerId);
|
|
})
|
|
.then(() => {
|
|
InspectorTest.log("Clicking button2...");
|
|
return InspectorTest.evaluateInPage(`clickButton2()`);
|
|
})
|
|
.catch(reject);
|
|
}
|
|
});
|
|
|
|
suite.addTestCase({
|
|
name: "DOM.removeBreakpointForEventListener",
|
|
description: "Check that the debugger does the not pause for this event.",
|
|
test(resolve, reject) {
|
|
let paused = false;
|
|
let clickingButton1 = false;
|
|
|
|
let listener = WI.debuggerManager.singleFireEventListener(WI.DebuggerManager.Event.Paused, (event) => {
|
|
if (clickingButton1)
|
|
InspectorTest.fail("Should not pause before button1 event handler is run.");
|
|
else
|
|
InspectorTest.fail("Should not pause before button2 event handler is run.");
|
|
|
|
paused = true;
|
|
|
|
let targetData = WI.debuggerManager.dataForTarget(WI.debuggerManager.activeCallFrame.target);
|
|
InspectorTest.assert(targetData.pauseReason, WI.DebuggerManager.PauseReason.Listener, `Pause reason should be Listener.`);
|
|
InspectorTest.assert(targetData.pauseData.eventName, "click", `Pause data eventName should be "click".`);
|
|
|
|
getClickEventListener(button1Node.id)
|
|
.then((clickEventListener) => {
|
|
InspectorTest.assert(targetData.pauseData.eventListenerId === clickEventListener.eventListenerId, `Pause data eventListenerId should be "${clickEventListener.eventListenerId}".`);
|
|
InspectorTest.assert(clickEventListener.hasBreakpoint, "Click event listener for button1 should have a breakpoint.");
|
|
|
|
WI.debuggerManager.resume();
|
|
});
|
|
});
|
|
|
|
InspectorTest.singleFireEventListener("TestPageButton1Click", (event) => {
|
|
if (!paused) {
|
|
WI.debuggerManager.removeEventListener(WI.DebuggerManager.Event.Paused, listener);
|
|
|
|
InspectorTest.pass("Should not pause before button1 event handler is run.");
|
|
}
|
|
|
|
resolve();
|
|
});
|
|
|
|
InspectorTest.singleFireEventListener("TestPageButton2Click", (event) => {
|
|
if (!paused)
|
|
InspectorTest.pass("Should not pause before button2 event handler is run.");
|
|
|
|
InspectorTest.log("Clicking button1...");
|
|
clickingButton1 = true;
|
|
InspectorTest.evaluateInPage(`clickButton1()`);
|
|
});
|
|
|
|
getClickEventListener(button1Node.id)
|
|
.then((clickEventListener) => {
|
|
InspectorTest.assert(clickEventListener.hasBreakpoint, "Click event listener for button1 should have a breakpoint.");
|
|
|
|
InspectorTest.log("Removing breakpoint for event listener...");
|
|
return DOMAgent.removeBreakpointForEventListener(clickEventListener.eventListenerId);
|
|
})
|
|
.then(() => {
|
|
InspectorTest.log("Clicking button2...");
|
|
return InspectorTest.evaluateInPage(`clickButton2()`);
|
|
})
|
|
.catch(reject);
|
|
}
|
|
});
|
|
|
|
suite.addTestCase({
|
|
name: "DOM.setBreakpointForEventListener.Options.Condition",
|
|
description: "Check that the debugger will not pause unless the breakpoint has a truthy breakpoint condition.",
|
|
async test() {
|
|
let pauseCount = 0;
|
|
|
|
let listener = WI.debuggerManager.addEventListener(WI.DebuggerManager.Event.Paused, (event) => {
|
|
++pauseCount;
|
|
WI.debuggerManager.resume();
|
|
});
|
|
|
|
let breakpoint = await setBreakpointForClickEventListener(button1Node);
|
|
|
|
InspectorTest.newline();
|
|
|
|
InspectorTest.log("Setting condition to 'false'...");
|
|
breakpoint.condition = "false";
|
|
|
|
for (let i = 1; i <= 4; ++i) {
|
|
if (i === 3) {
|
|
InspectorTest.newline();
|
|
|
|
InspectorTest.log("Setting condition to 'true'...");
|
|
breakpoint.condition = "true";
|
|
}
|
|
|
|
InspectorTest.newline();
|
|
|
|
InspectorTest.log("Triggering breakpoint...");
|
|
await Promise.all([
|
|
InspectorTest.awaitEvent("TestPageButton1Click"),
|
|
InspectorTest.evaluateInPage(`clickButton1()`),
|
|
]);
|
|
|
|
if (i <= 2)
|
|
InspectorTest.expectEqual(pauseCount, 0, "Should not pause.");
|
|
else
|
|
InspectorTest.expectEqual(pauseCount, i - 2, "Should pause.");
|
|
}
|
|
|
|
breakpoint.remove();
|
|
WI.debuggerManager.removeEventListener(WI.DebuggerManager.Event.Paused, listener);
|
|
},
|
|
});
|
|
|
|
suite.addTestCase({
|
|
name: "DOM.setBreakpointForEventListener.Options.IgnoreCount",
|
|
description: "Check that the debugger will not pause unless the breakpoint is hit at least as many times as it's `ignoreCount`.",
|
|
async test() {
|
|
let pauseCount = 0;
|
|
|
|
let listener = WI.debuggerManager.addEventListener(WI.DebuggerManager.Event.Paused, (event) => {
|
|
++pauseCount;
|
|
WI.debuggerManager.resume();
|
|
});
|
|
|
|
let breakpoint = await setBreakpointForClickEventListener(button1Node);
|
|
|
|
InspectorTest.newline();
|
|
|
|
InspectorTest.log("Setting ignoreCount to '2'...");
|
|
breakpoint.ignoreCount = 2;
|
|
|
|
for (let i = 1; i <=4; ++i) {
|
|
InspectorTest.newline();
|
|
|
|
InspectorTest.log("Triggering breakpoint...");
|
|
await Promise.all([
|
|
InspectorTest.awaitEvent("TestPageButton1Click"),
|
|
InspectorTest.evaluateInPage(`clickButton1()`),
|
|
]);
|
|
|
|
if (i <= 2)
|
|
InspectorTest.expectEqual(pauseCount, 0, "Should not pause.");
|
|
else
|
|
InspectorTest.expectEqual(pauseCount, i - 2, "Should pause.");
|
|
}
|
|
|
|
breakpoint.remove();
|
|
WI.debuggerManager.removeEventListener(WI.DebuggerManager.Event.Paused, listener);
|
|
},
|
|
});
|
|
|
|
suite.addTestCase({
|
|
name: "DOM.setBreakpointForEventListener.Options.Action.Log",
|
|
description: "Check that log breakpoint actions execute when the breakpoint is hit.",
|
|
async test() {
|
|
let pauseCount = 0;
|
|
|
|
let listener = WI.debuggerManager.addEventListener(WI.DebuggerManager.Event.Paused, (event) => {
|
|
++pauseCount;
|
|
WI.debuggerManager.resume();
|
|
});
|
|
|
|
let breakpoint = await setBreakpointForClickEventListener(button1Node);
|
|
|
|
InspectorTest.newline();
|
|
|
|
InspectorTest.log("Adding log action...");
|
|
let action = new WI.BreakpointAction(WI.BreakpointAction.Type.Log, {data: "BREAKPOINT ACTION LOG 1"});
|
|
breakpoint.addAction(action);
|
|
|
|
for (let i = 1; i <= 4; ++i) {
|
|
if (i > 1) {
|
|
InspectorTest.newline();
|
|
|
|
InspectorTest.log("Editing log action...");
|
|
action.data = `BREAKPOINT ACTION LOG ${i}`;
|
|
|
|
if (i === 3) {
|
|
InspectorTest.log("Enabling auto-continue...");
|
|
breakpoint.autoContinue = true;
|
|
}
|
|
}
|
|
|
|
InspectorTest.newline();
|
|
|
|
InspectorTest.log("Triggering breakpoint...");
|
|
let [messageAddedEvent] = await Promise.all([
|
|
WI.consoleManager.awaitEvent(WI.ConsoleManager.Event.MessageAdded),
|
|
InspectorTest.awaitEvent("TestPageButton1Click"),
|
|
InspectorTest.evaluateInPage(`clickButton1()`),
|
|
]);
|
|
|
|
InspectorTest.expectEqual(messageAddedEvent.data.message.messageText, action.data, "Should execute breakpoint action.");
|
|
|
|
if (i <= 2)
|
|
InspectorTest.expectEqual(pauseCount, i, "Should pause.");
|
|
else
|
|
InspectorTest.expectEqual(pauseCount, 2, "Should not pause.");
|
|
}
|
|
|
|
breakpoint.remove();
|
|
WI.debuggerManager.removeEventListener(WI.DebuggerManager.Event.Paused, listener);
|
|
},
|
|
});
|
|
|
|
suite.addTestCase({
|
|
name: "DOM.setBreakpointForEventListener.Options.Actions.Evaluate",
|
|
description: "Check that evaluate breakpoint actions execute when the breakpoint is hit.",
|
|
async test() {
|
|
let pauseCount = 0;
|
|
|
|
let listener = WI.debuggerManager.addEventListener(WI.DebuggerManager.Event.Paused, (event) => {
|
|
++pauseCount;
|
|
WI.debuggerManager.resume();
|
|
});
|
|
|
|
let breakpoint = await setBreakpointForClickEventListener(button1Node);
|
|
|
|
InspectorTest.newline();
|
|
|
|
InspectorTest.log("Adding evaluate action...");
|
|
let action = new WI.BreakpointAction(WI.BreakpointAction.Type.Evaluate, {data: "window.BREAKPOINT_ACTION_EVALUATE = 1;"});
|
|
breakpoint.addAction(action);
|
|
|
|
for (let i = 1; i <= 4; ++i) {
|
|
if (i > 1) {
|
|
InspectorTest.newline();
|
|
|
|
InspectorTest.log("Editing evaluate action...");
|
|
action.data = `window.BREAKPOINT_ACTION_EVALUATE = ${i};`;
|
|
|
|
if (i === 3) {
|
|
InspectorTest.log("Enabling auto-continue...");
|
|
breakpoint.autoContinue = true;
|
|
}
|
|
}
|
|
|
|
InspectorTest.newline();
|
|
|
|
InspectorTest.log("Triggering breakpoint...");
|
|
await Promise.all([
|
|
InspectorTest.awaitEvent("TestPageButton1Click"),
|
|
InspectorTest.evaluateInPage(`clickButton1()`),
|
|
]);
|
|
|
|
let breakpointActionEvaluateResult = await InspectorTest.evaluateInPage(`window.BREAKPOINT_ACTION_EVALUATE`);
|
|
InspectorTest.expectEqual(breakpointActionEvaluateResult, i, "Should execute breakpoint action.");
|
|
|
|
if (i <= 2)
|
|
InspectorTest.expectEqual(pauseCount, i, "Should pause.");
|
|
else
|
|
InspectorTest.expectEqual(pauseCount, 2, "Should not pause.");
|
|
}
|
|
|
|
breakpoint.remove();
|
|
WI.debuggerManager.removeEventListener(WI.DebuggerManager.Event.Paused, listener);
|
|
},
|
|
});
|
|
|
|
suite.addTestCase({
|
|
name: "DOM.setBreakpointForEventListener.Invalid",
|
|
description: "Invalid event listener identifiers should cause an error.",
|
|
test(resolve, reject) {
|
|
const invalidEventListenerId = 9999999;
|
|
DOMAgent.setBreakpointForEventListener(invalidEventListenerId, (error) => {
|
|
InspectorTest.expectThat(error, "Should produce an error.");
|
|
InspectorTest.log("Error: " + error);
|
|
resolve();
|
|
});
|
|
}
|
|
});
|
|
|
|
suite.addTestCase({
|
|
name: "DOM.removeBreakpointForEventListener.Invalid",
|
|
description: "Invalid event listener identifiers should cause an error.",
|
|
test(resolve, reject) {
|
|
const invalidEventListenerId = 9999999;
|
|
DOMAgent.removeBreakpointForEventListener(invalidEventListenerId, (error) => {
|
|
InspectorTest.expectThat(error, "Should produce an error.");
|
|
InspectorTest.log("Error: " + error);
|
|
resolve();
|
|
});
|
|
}
|
|
});
|
|
|
|
WI.domManager.requestDocument((documentNode) => {
|
|
Promise.all([
|
|
documentNode.querySelector("#button1"),
|
|
documentNode.querySelector("#button2"),
|
|
])
|
|
.then(([button1Id, button2Id]) => {
|
|
button1Node = WI.domManager.nodeForId(button1Id);
|
|
button2Node = WI.domManager.nodeForId(button2Id);
|
|
|
|
suite.runTestCasesAndFinish();
|
|
})
|
|
.catch(() => {
|
|
InspectorTest.fail("Unable to retrieve nodes.");
|
|
InspectorTest.completeTest();
|
|
});
|
|
});
|
|
}
|
|
</script>
|
|
</head>
|
|
<body onload="runTest()">
|
|
<p>Testing DOMAgent.setBreakpointForEventListener and DOMAgent.removeBreakpointForEventListener.</p>
|
|
<button id="button1"></button>
|
|
<button id="button2"></button>
|
|
<script>
|
|
document.getElementById("button1").addEventListener("click", handleButton1Click);
|
|
document.getElementById("button2").addEventListener("click", handleButton2Click);
|
|
</script>
|
|
</body>
|
|
</html>
|