| <!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> |