blob: 98fddddfe2ac65ff65dc26649cb26ce0fe6f3b45 [file] [log] [blame]
<!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>