| <!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; |
| |
| function awaitGetClickEventListener(nodeId) { |
| return DOMAgent.getEventListenersForNode(nodeId) |
| .then(({listeners}) => listeners.find((eventListener) => eventListener.type === "click")); |
| } |
| |
| 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.EventListener, `Pause reason should be EventListener.`); |
| InspectorTest.expectEqual(targetData.pauseData.eventName, "click", `Pause data eventName should be "click".`); |
| |
| awaitGetClickEventListener(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()`); |
| }); |
| |
| awaitGetClickEventListener(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.EventListener, `Pause reason should be EventListener.`); |
| InspectorTest.assert(targetData.pauseData.eventName, "click", `Pause data eventName should be "click".`); |
| |
| awaitGetClickEventListener(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()`); |
| }); |
| |
| awaitGetClickEventListener(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.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([ |
| WI.domManager.querySelector(documentNode.id, "#button1"), |
| WI.domManager.querySelector(documentNode.id, "#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> |