Changeset 248201 in webkit
- Timestamp:
- Aug 3, 2019 12:00:01 PM (5 years ago)
- Location:
- trunk
- Files:
-
- 5 added
- 2 deleted
- 28 edited
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r248197 r248201 1 2019-08-03 Devin Rousso <drousso@apple.com> 2 3 Web Inspector: DOM: add a special breakpoint for "All Events" 4 https://bugs.webkit.org/show_bug.cgi?id=200285 5 6 Reviewed by Joseph Pecoraro. 7 8 * inspector/dom/breakpoint-for-event-listener.html: 9 * inspector/dom/breakpoint-for-event-listener-expected.txt: 10 11 * inspector/dom-debugger/event-animation-frame-breakpoints.html: 12 * inspector/dom-debugger/event-animation-frame-breakpoints-expected.txt: 13 * inspector/dom-debugger/event-breakpoint-with-navigation.html: 14 * inspector/dom-debugger/event-breakpoint-with-navigation-expected.txt: 15 * inspector/dom-debugger/event-interval-breakpoints.html: Added. 16 * inspector/dom-debugger/event-interval-breakpoints-expected.txt: Added. 17 * inspector/dom-debugger/event-listener-breakpoints.html: 18 * inspector/dom-debugger/event-listener-breakpoints-expected.txt: 19 * inspector/dom-debugger/event-timeout-breakpoints.html: Added. 20 * inspector/dom-debugger/event-timeout-breakpoints-expected.txt: Added. 21 22 * inspector/dom-debugger/resources/event-breakpoint-utilities.js: 23 (TestPage.registerInitializer.InspectorTest.EventBreakpoint.teardown): 24 (TestPage.registerInitializer.InspectorTest.EventBreakpoint.failOnPause): 25 (TestPage.registerInitializer.InspectorTest.EventBreakpoint.createBreakpoint): Added. 26 (TestPage.registerInitializer.InspectorTest.EventBreakpoint.addBreakpoint): 27 (TestPage.registerInitializer.InspectorTest.EventBreakpoint.removeBreakpoint): 28 (TestPage.registerInitializer.InspectorTest.EventBreakpoint.disableBreakpoint): 29 30 * inspector/dom-debugger/event-timer-breakpoints.html: Removed. 31 * inspector/dom-debugger/event-timer-breakpoints-expected.txt: Removed. 32 1 33 2019-08-03 Devin Rousso <drousso@apple.com> 2 34 -
trunk/LayoutTests/inspector/dom-debugger/event-animation-frame-breakpoints-expected.txt
r235248 r248201 3 3 4 4 == Running test suite: DOMDebugger.Event.AnimationFrame 5 -- Running test case: DOMDebugger.Event.AnimationFrame.AddBreakpoint "requestAnimationFrame"6 Adding " requestAnimationFrame" Event Breakpoint...5 -- Running test case: DOMDebugger.Event.AnimationFrame.AddBreakpoint 6 Adding "animation-frame" Event Breakpoint... 7 7 Firing "requestAnimationFrame" on window... 8 8 PASS: Should pause before event handler is run. … … 15 15 -- Running test teardown. 16 16 17 -- Running test case: DOMDebugger.Event.AnimationFrame.AddDisabledBreakpoint "requestAnimationFrame"18 Adding " requestAnimationFrame" Event Breakpoint...19 Disabling " requestAnimationFrame" Event Breakpoint...17 -- Running test case: DOMDebugger.Event.AnimationFrame.AddDisabledBreakpoint 18 Adding "animation-frame" Event Breakpoint... 19 Disabling "animation-frame" Event Breakpoint... 20 20 Firing "requestAnimationFrame" on window... 21 21 PASS: Should not pause for disabled breakpoint. 22 22 -- Running test teardown. 23 23 24 -- Running test case: DOMDebugger.Event.AnimationFrame.RemoveBreakpoint "requestAnimationFrame"25 Adding " requestAnimationFrame" Event Breakpoint...26 Removing " requestAnimationFrame" Event Breakpoint...24 -- Running test case: DOMDebugger.Event.AnimationFrame.RemoveBreakpoint 25 Adding "animation-frame" Event Breakpoint... 26 Removing "animation-frame" Event Breakpoint... 27 27 Firing "requestAnimationFrame" on window... 28 28 PASS: Should not pause for removed breakpoint. 29 29 -- Running test teardown. 30 30 31 -- Running test case: DOMDebugger.Event.AnimationFrame.RemoveDisabledBreakpoint "requestAnimationFrame"32 Adding " requestAnimationFrame" Event Breakpoint...33 Disabling " requestAnimationFrame" Event Breakpoint...34 Removing " requestAnimationFrame" Event Breakpoint...31 -- Running test case: DOMDebugger.Event.AnimationFrame.RemoveDisabledBreakpoint 32 Adding "animation-frame" Event Breakpoint... 33 Disabling "animation-frame" Event Breakpoint... 34 Removing "animation-frame" Event Breakpoint... 35 35 Firing "requestAnimationFrame" on window... 36 36 PASS: Should not pause for removed disabled breakpoint. -
trunk/LayoutTests/inspector/dom-debugger/event-animation-frame-breakpoints.html
r235248 r248201 16 16 17 17 function test() { 18 const eventName = "requestAnimationFrame"; 19 18 20 let suite = InspectorTest.createAsyncSuite("DOMDebugger.Event.AnimationFrame"); 19 21 20 function addTestCasesForEventName(eventName) { 21 suite.addTestCase({ 22 name: `DOMDebugger.Event.AnimationFrame.AddBreakpoint "${eventName}"`, 23 description: "Check that the debugger pauses for enabled breakpoints.", 24 test(resolve, reject) { 25 let paused = false; 22 suite.addTestCase({ 23 name: `DOMDebugger.Event.AnimationFrame.AddBreakpoint`, 24 description: "Check that the debugger pauses for enabled breakpoints.", 25 test(resolve, reject) { 26 let paused = false; 26 27 27 28 28 let listener = WI.debuggerManager.singleFireEventListener(WI.DebuggerManager.Event.Paused, (event) => { 29 paused = true; 29 30 30 31 31 InspectorTest.pass("Should pause before event handler is run."); 32 logActiveStackTrace(); 32 33 33 34 35 34 WI.debuggerManager.resume() 35 .catch(reject); 36 }); 36 37 37 38 39 38 InspectorTest.singleFireEventListener(`TestPage-${eventName}`, (event) => { 39 if (!paused) { 40 WI.debuggerManager.removeEventListener(WI.DebuggerManager.Event.Paused, listener); 40 41 41 42 42 InspectorTest.fail("Should pause before event handler is run."); 43 } 43 44 44 45 45 resolve(); 46 }); 46 47 47 InspectorTest.EventBreakpoint.addBreakpoint(WI.EventBreakpoint.Type.AnimationFrame, eventName)48 49 50 51 52 48 InspectorTest.EventBreakpoint.addBreakpoint(WI.domDebuggerManager.allAnimationFramesBreakpoint) 49 .then(InspectorTest.EventBreakpoint.awaitEvent("window", eventName)) 50 .catch(reject); 51 }, 52 teardown: InspectorTest.EventBreakpoint.teardown, 53 }); 53 54 54 55 name: `DOMDebugger.Event.AnimationFrame.AddDisabledBreakpoint "${eventName}"`,56 57 58 55 suite.addTestCase({ 56 name: `DOMDebugger.Event.AnimationFrame.AddDisabledBreakpoint`, 57 description: "Check that debugger does not pause for disabled breakpoints.", 58 test(resolve, reject) { 59 InspectorTest.EventBreakpoint.failOnPause(resolve, reject, WI.DebuggerManager.PauseReason.AnimationFrame, eventName, "Should not pause for disabled breakpoint."); 59 60 60 InspectorTest.EventBreakpoint.addBreakpoint(WI.EventBreakpoint.Type.AnimationFrame, eventName)61 62 63 64 65 66 61 InspectorTest.EventBreakpoint.addBreakpoint(WI.domDebuggerManager.allAnimationFramesBreakpoint) 62 .then(InspectorTest.EventBreakpoint.disableBreakpoint) 63 .then(InspectorTest.EventBreakpoint.awaitEvent("window", eventName)) 64 .catch(reject); 65 }, 66 teardown: InspectorTest.EventBreakpoint.teardown, 67 }); 67 68 68 69 name: `DOMDebugger.Event.AnimationFrame.RemoveBreakpoint "${eventName}"`,70 71 72 69 suite.addTestCase({ 70 name: `DOMDebugger.Event.AnimationFrame.RemoveBreakpoint`, 71 description: "Check that debugger does not pause for removed breakpoint.", 72 test(resolve, reject) { 73 InspectorTest.EventBreakpoint.failOnPause(resolve, reject, WI.DebuggerManager.PauseReason.AnimationFrame, eventName, "Should not pause for removed breakpoint."); 73 74 74 InspectorTest.EventBreakpoint.addBreakpoint(WI.EventBreakpoint.Type.AnimationFrame, eventName)75 76 77 78 79 80 75 InspectorTest.EventBreakpoint.addBreakpoint(WI.domDebuggerManager.allAnimationFramesBreakpoint) 76 .then(InspectorTest.EventBreakpoint.removeBreakpoint) 77 .then(InspectorTest.EventBreakpoint.awaitEvent("window", eventName)) 78 .catch(reject); 79 }, 80 teardown: InspectorTest.EventBreakpoint.teardown, 81 }); 81 82 82 83 name: `DOMDebugger.Event.AnimationFrame.RemoveDisabledBreakpoint "${eventName}"`,84 85 86 83 suite.addTestCase({ 84 name: `DOMDebugger.Event.AnimationFrame.RemoveDisabledBreakpoint`, 85 description: "Check that a disabled breakpoint can be removed.", 86 test(resolve, reject) { 87 InspectorTest.EventBreakpoint.failOnPause(resolve, reject, WI.DebuggerManager.PauseReason.AnimationFrame, eventName, "Should not pause for removed disabled breakpoint."); 87 88 88 InspectorTest.EventBreakpoint.addBreakpoint(WI.EventBreakpoint.Type.AnimationFrame, eventName) 89 .then(InspectorTest.EventBreakpoint.disableBreakpoint) 90 .then(InspectorTest.EventBreakpoint.removeBreakpoint) 91 .then(InspectorTest.EventBreakpoint.awaitEvent("window", eventName)) 92 .catch(reject); 93 }, 94 teardown: InspectorTest.EventBreakpoint.teardown, 95 }); 96 } 97 98 addTestCasesForEventName("requestAnimationFrame"); 89 InspectorTest.EventBreakpoint.addBreakpoint(WI.domDebuggerManager.allAnimationFramesBreakpoint) 90 .then(InspectorTest.EventBreakpoint.disableBreakpoint) 91 .then(InspectorTest.EventBreakpoint.removeBreakpoint) 92 .then(InspectorTest.EventBreakpoint.awaitEvent("window", eventName)) 93 .catch(reject); 94 }, 95 teardown: InspectorTest.EventBreakpoint.teardown, 96 }); 99 97 100 98 suite.runTestCasesAndFinish(); -
trunk/LayoutTests/inspector/dom-debugger/event-breakpoint-with-navigation-expected.txt
r234974 r248201 6 6 Adding "load" Event Breakpoint... 7 7 Reloading WebInspector... 8 PASS: Pause reason should be EventListener.8 PASS: Pause reason should be Listener. 9 9 PASS: Pause data eventName should be "load". 10 10 -- Running test teardown. -
trunk/LayoutTests/inspector/dom-debugger/event-breakpoint-with-navigation.html
r235248 r248201 3 3 <head> 4 4 <script src="../../http/tests/inspector/resources/inspector-test.js"></script> 5 <script src="resources/event-breakpoint-utilities.js"></script> 5 6 <script> 6 7 function handleLoad(event) { … … 23 24 24 25 let targetData = WI.debuggerManager.dataForTarget(WI.debuggerManager.activeCallFrame.target); 25 InspectorTest.expectEqual(targetData.pauseReason, WI.DebuggerManager.PauseReason. EventListener, "Pause reason should be EventListener.");26 InspectorTest.expectEqual(targetData.pauseReason, WI.DebuggerManager.PauseReason.Listener, "Pause reason should be Listener."); 26 27 InspectorTest.expectEqual(targetData.pauseData.eventName, "load", "Pause data eventName should be \"load\"."); 27 28 … … 45 46 InspectorTest.log("Adding \"load\" Event Breakpoint..."); 46 47 47 let breakpoint = new WI.EventBreakpoint(WI.EventBreakpoint.Type.Listener, "load");48 let breakpoint = new WI.EventBreakpoint(WI.EventBreakpoint.Type.Listener, {eventName: "load"}); 48 49 49 50 WI.domDebuggerManager.awaitEvent(WI.DOMDebuggerManager.Event.EventBreakpointAdded) … … 59 60 WI.domDebuggerManager.addEventBreakpoint(breakpoint); 60 61 }, 61 teardown(resolve, reject) { 62 let breakpoints = WI.domDebuggerManager.eventBreakpoints; 63 for (let breakpoint of breakpoints) 64 WI.domDebuggerManager.removeEventBreakpoint(breakpoint); 65 66 resolve(); 67 }, 62 teardown: InspectorTest.EventBreakpoint.teardown, 68 63 }); 69 64 -
trunk/LayoutTests/inspector/dom-debugger/event-listener-breakpoints-expected.txt
r242588 r248201 4 4 == Running test suite: DOMDebugger.Event.Listener 5 5 -- Running test case: DOMDebugger.Event.Listener.AddBreakpoint "click" 6 Adding "click" Event Breakpoint... 6 Creating "click" Event Breakpoint... 7 Adding "listener:click" Event Breakpoint... 7 8 Firing "click" on body... 8 9 PASS: Should pause before event handler is run. … … 14 15 15 16 -- Running test case: DOMDebugger.Event.Listener.AddDisabledBreakpoint "click" 16 Adding "click" Event Breakpoint... 17 Disabling "click" Event Breakpoint... 17 Creating "click" Event Breakpoint... 18 Adding "listener:click" Event Breakpoint... 19 Disabling "listener:click" Event Breakpoint... 18 20 Firing "click" on body... 19 21 PASS: Should not pause for disabled breakpoint. … … 21 23 22 24 -- Running test case: DOMDebugger.Event.Listener.RemoveBreakpoint "click" 23 Adding "click" Event Breakpoint... 24 Removing "click" Event Breakpoint... 25 Creating "click" Event Breakpoint... 26 Adding "listener:click" Event Breakpoint... 27 Removing "listener:click" Event Breakpoint... 25 28 Firing "click" on body... 26 29 PASS: Should not pause for removed breakpoint. … … 28 31 29 32 -- Running test case: DOMDebugger.Event.Listener.RemoveDisabledBreakpoint "click" 30 Adding "click" Event Breakpoint... 31 Disabling "click" Event Breakpoint... 32 Removing "click" Event Breakpoint... 33 Creating "click" Event Breakpoint... 34 Adding "listener:click" Event Breakpoint... 35 Disabling "listener:click" Event Breakpoint... 36 Removing "listener:click" Event Breakpoint... 33 37 Firing "click" on body... 34 38 PASS: Should not pause for removed disabled breakpoint. … … 36 40 37 41 -- Running test case: DOMDebugger.Event.Listener.AddBreakpoint "custom" 38 Adding "custom" Event Breakpoint... 42 Creating "custom" Event Breakpoint... 43 Adding "listener:custom" Event Breakpoint... 39 44 Firing "custom" on body... 40 45 PASS: Should pause before event handler is run. … … 46 51 47 52 -- Running test case: DOMDebugger.Event.Listener.AddDisabledBreakpoint "custom" 48 Adding "custom" Event Breakpoint... 49 Disabling "custom" Event Breakpoint... 53 Creating "custom" Event Breakpoint... 54 Adding "listener:custom" Event Breakpoint... 55 Disabling "listener:custom" Event Breakpoint... 50 56 Firing "custom" on body... 51 57 PASS: Should not pause for disabled breakpoint. … … 53 59 54 60 -- Running test case: DOMDebugger.Event.Listener.RemoveBreakpoint "custom" 55 Adding "custom" Event Breakpoint... 56 Removing "custom" Event Breakpoint... 61 Creating "custom" Event Breakpoint... 62 Adding "listener:custom" Event Breakpoint... 63 Removing "listener:custom" Event Breakpoint... 57 64 Firing "custom" on body... 58 65 PASS: Should not pause for removed breakpoint. … … 60 67 61 68 -- Running test case: DOMDebugger.Event.Listener.RemoveDisabledBreakpoint "custom" 62 Adding "custom" Event Breakpoint... 63 Disabling "custom" Event Breakpoint... 64 Removing "custom" Event Breakpoint... 69 Creating "custom" Event Breakpoint... 70 Adding "listener:custom" Event Breakpoint... 71 Disabling "listener:custom" Event Breakpoint... 72 Removing "listener:custom" Event Breakpoint... 65 73 Firing "custom" on body... 66 74 PASS: Should not pause for removed disabled breakpoint. 67 75 -- Running test teardown. 68 76 77 -- Running test case: DOMDebugger.Event.Listener.AllEventsBreakpoint 78 Adding "listener" Event Breakpoint... 79 Firing "click" on body... 80 PASS: Should pause before event handler is run. 81 CALL STACK: 82 0: [F] handleBody_click 83 1: [F] trigger_click 84 2: [P] Global Code 85 Firing "custom" on body... 86 PASS: Should pause before event handler is run. 87 CALL STACK: 88 0: [F] handleBody_custom 89 1: [F] trigger_custom 90 2: [P] Global Code 91 PASS: Should have paused twice. 92 -- Running test teardown. 93 69 94 -- Running test case: DOMDebugger.Event.Listener.AddMultipleBreakpoints 70 Adding "click" Event Breakpoint... 95 Creating "click" Event Breakpoint... 96 Adding "listener:click" Event Breakpoint... 71 97 Firing "click" on div#x... 72 98 PASS: Should pause before event handler is run. … … 84 110 85 111 -- Running test case: DOMDebugger.Event.Listener.DisableBetweenDispatches 86 Adding "click" Event Breakpoint... 112 Creating "click" Event Breakpoint... 113 Adding "listener:click" Event Breakpoint... 87 114 Firing "click" on div#x... 88 115 PASS: Should pause before event handler is run. -
trunk/LayoutTests/inspector/dom-debugger/event-listener-breakpoints.html
r242588 r248201 59 59 }); 60 60 61 InspectorTest.EventBreakpoint. addBreakpoint(WI.EventBreakpoint.Type.Listener, eventName)61 InspectorTest.EventBreakpoint.createBreakpoint(WI.EventBreakpoint.Type.Listener, eventName) 62 62 .then(InspectorTest.EventBreakpoint.awaitEvent("body", eventName)) 63 63 .catch(reject); … … 70 70 description: "Check that debugger does not pause for disabled breakpoints.", 71 71 test(resolve, reject) { 72 InspectorTest.EventBreakpoint.failOnPause(resolve, reject, WI.DebuggerManager.PauseReason. EventListener, eventName, "Should not pause for disabled breakpoint.");73 74 InspectorTest.EventBreakpoint. addBreakpoint(WI.EventBreakpoint.Type.Listener, eventName)72 InspectorTest.EventBreakpoint.failOnPause(resolve, reject, WI.DebuggerManager.PauseReason.Listener, eventName, "Should not pause for disabled breakpoint."); 73 74 InspectorTest.EventBreakpoint.createBreakpoint(WI.EventBreakpoint.Type.Listener, eventName) 75 75 .then(InspectorTest.EventBreakpoint.disableBreakpoint) 76 76 .then(InspectorTest.EventBreakpoint.awaitEvent("body", eventName)) … … 84 84 description: "Check that debugger does not pause for removed breakpoint.", 85 85 test(resolve, reject) { 86 InspectorTest.EventBreakpoint.failOnPause(resolve, reject, WI.DebuggerManager.PauseReason. EventListener, eventName, "Should not pause for removed breakpoint.");87 88 InspectorTest.EventBreakpoint. addBreakpoint(WI.EventBreakpoint.Type.Listener, eventName)86 InspectorTest.EventBreakpoint.failOnPause(resolve, reject, WI.DebuggerManager.PauseReason.Listener, eventName, "Should not pause for removed breakpoint."); 87 88 InspectorTest.EventBreakpoint.createBreakpoint(WI.EventBreakpoint.Type.Listener, eventName) 89 89 .then(InspectorTest.EventBreakpoint.removeBreakpoint) 90 90 .then(InspectorTest.EventBreakpoint.awaitEvent("body", eventName)) … … 98 98 description: "Check that a disabled breakpoint can be removed.", 99 99 test(resolve, reject) { 100 InspectorTest.EventBreakpoint.failOnPause(resolve, reject, WI.DebuggerManager.PauseReason. EventListener, eventName, "Should not pause for removed disabled breakpoint.");101 102 InspectorTest.EventBreakpoint. addBreakpoint(WI.EventBreakpoint.Type.Listener, eventName)100 InspectorTest.EventBreakpoint.failOnPause(resolve, reject, WI.DebuggerManager.PauseReason.Listener, eventName, "Should not pause for removed disabled breakpoint."); 101 102 InspectorTest.EventBreakpoint.createBreakpoint(WI.EventBreakpoint.Type.Listener, eventName) 103 103 .then(InspectorTest.EventBreakpoint.disableBreakpoint) 104 104 .then(InspectorTest.EventBreakpoint.removeBreakpoint) … … 112 112 addTestCasesForEventName("click"); 113 113 addTestCasesForEventName("custom"); 114 115 suite.addTestCase({ 116 name: `DOMDebugger.Event.Listener.AllEventsBreakpoint`, 117 description: "Check that the all events breakpoint pauses for every event.", 118 test(resolve, reject) { 119 let pauseCount = 0; 120 121 let listener = WI.debuggerManager.addEventListener(WI.DebuggerManager.Event.Paused, (event) => { 122 ++pauseCount; 123 124 InspectorTest.pass("Should pause before event handler is run."); 125 logActiveStackTrace(); 126 127 WI.debuggerManager.resume() 128 .catch(reject); 129 }); 130 131 InspectorTest.EventBreakpoint.addBreakpoint(WI.domDebuggerManager.allListenersBreakpoint) 132 .then(() => { 133 InspectorTest.log("Firing \"click\" on body..."); 134 return InspectorTest.evaluateInPage(`trigger_click()`); 135 }) 136 .then(() => { 137 InspectorTest.log("Firing \"custom\" on body..."); 138 return InspectorTest.evaluateInPage(`trigger_custom()`); 139 }) 140 .then(() => { 141 InspectorTest.expectEqual(pauseCount, 2, "Should have paused twice."); 142 InspectorTest.assert(!WI.debuggerManager.paused, "Should not be paused."); 143 144 WI.debuggerManager.removeEventListener(WI.DebuggerManager.Event.Paused, listener); 145 }) 146 .then(resolve, reject); 147 }, 148 teardown: InspectorTest.EventBreakpoint.teardown, 149 }); 114 150 115 151 suite.addTestCase({ … … 138 174 }); 139 175 140 InspectorTest.EventBreakpoint. addBreakpoint(WI.EventBreakpoint.Type.Listener, "click")176 InspectorTest.EventBreakpoint.createBreakpoint(WI.EventBreakpoint.Type.Listener, "click") 141 177 .then(() => { 142 178 InspectorTest.log("Firing \"click\" on div#x..."); … … 176 212 }); 177 213 178 InspectorTest.EventBreakpoint. addBreakpoint(WI.EventBreakpoint.Type.Listener, "click")214 InspectorTest.EventBreakpoint.createBreakpoint(WI.EventBreakpoint.Type.Listener, "click") 179 215 .then(() => { 180 216 InspectorTest.log("Firing \"click\" on div#x..."); -
trunk/LayoutTests/inspector/dom-debugger/resources/event-breakpoint-utilities.js
r235248 r248201 3 3 4 4 InspectorTest.EventBreakpoint.teardown = function(resolve, reject) { 5 let breakpoints = WI.domDebuggerManager.eventBreakpoints; 6 for (let breakpoint of breakpoints) 5 WI.domDebuggerManager.removeEventBreakpoint(WI.domDebuggerManager.allAnimationFramesBreakpoint); 6 WI.domDebuggerManager.removeEventBreakpoint(WI.domDebuggerManager.allIntervalsBreakpoint); 7 WI.domDebuggerManager.removeEventBreakpoint(WI.domDebuggerManager.allListenersBreakpoint); 8 WI.domDebuggerManager.removeEventBreakpoint(WI.domDebuggerManager.allTimeoutsBreakpoint); 9 10 for (let breakpoint of WI.domDebuggerManager.listenerBreakpoints) 7 11 WI.domDebuggerManager.removeEventBreakpoint(breakpoint); 8 12 … … 18 22 let targetData = WI.debuggerManager.dataForTarget(WI.debuggerManager.activeCallFrame.target); 19 23 InspectorTest.assert(targetData.pauseReason === pauseReason, `Pause reason should be "${pauseReason}".`); 20 InspectorTest.assert(targetData.pauseData.eventName === eventName, `Pause data eventName should be "${eventName}".`); 24 if (targetData.pauseData.eventName) 25 InspectorTest.assert(targetData.pauseData.eventName === eventName, `Pause data eventName should be "${eventName}".`); 21 26 22 27 InspectorTest.fail(message); … … 38 43 }; 39 44 40 InspectorTest.EventBreakpoint.addBreakpoint = function(type, eventName) { 41 InspectorTest.log(`Adding "${eventName}" Event Breakpoint...`); 45 InspectorTest.EventBreakpoint.createBreakpoint = function(type, eventName) { 46 InspectorTest.log(`Creating "${eventName}" Event Breakpoint...`); 47 return InspectorTest.EventBreakpoint.addBreakpoint(new WI.EventBreakpoint(type, {eventName})); 48 }; 42 49 50 InspectorTest.EventBreakpoint.addBreakpoint = function(breakpoint) { 51 InspectorTest.log(`Adding "${breakpoint.type + (breakpoint.eventName ? ":" + breakpoint.eventName : "")}" Event Breakpoint...`); 52 53 breakpoint.disabled = false; 43 54 return new Promise((resolve, reject) => { 44 let breakpoint = new WI.EventBreakpoint(type, eventName);45 46 55 WI.domDebuggerManager.awaitEvent(WI.DOMDebuggerManager.Event.EventBreakpointAdded) 47 56 .then((event) => { 48 InspectorTest.assert(event.data.breakpoint.type === type, `Breakpoint should be for expected type "${type}".`); 49 InspectorTest.assert(event.data.breakpoint.eventName === eventName, `Breakpoint should be for expected event name "${eventName}".`); 57 InspectorTest.assert(event.data.breakpoint === breakpoint, "Added Breakpoint should be expected object."); 50 58 InspectorTest.assert(!event.data.breakpoint.disabled, "Breakpoint should not be disabled initially."); 51 59 resolve(breakpoint); … … 57 65 58 66 InspectorTest.EventBreakpoint.removeBreakpoint = function(breakpoint) { 59 InspectorTest.log(`Removing "${breakpoint. eventName}" Event Breakpoint...`);67 InspectorTest.log(`Removing "${breakpoint.type + (breakpoint.eventName ? ":" + breakpoint.eventName : "")}" Event Breakpoint...`); 60 68 61 69 return new Promise((resolve, reject) => { … … 63 71 .then((event) => { 64 72 InspectorTest.assert(event.data.breakpoint === breakpoint, "Removed Breakpoint should be expected object."); 65 InspectorTest.assert(!WI.domDebuggerManager. eventBreakpoints.includes(breakpoint), "Breakpoint should not be in the list of breakpoints.");73 InspectorTest.assert(!WI.domDebuggerManager.listenerBreakpoints.includes(breakpoint), "Breakpoint should not be in the list of breakpoints."); 66 74 resolve(breakpoint); 67 75 }); … … 72 80 73 81 InspectorTest.EventBreakpoint.disableBreakpoint = function(breakpoint) { 74 InspectorTest.log(`Disabling "${breakpoint. eventName}" Event Breakpoint...`);82 InspectorTest.log(`Disabling "${breakpoint.type + (breakpoint.eventName ? ":" + breakpoint.eventName : "")}" Event Breakpoint...`); 75 83 76 84 breakpoint.disabled = true; -
trunk/LayoutTests/inspector/dom/breakpoint-for-event-listener-expected.txt
r235103 r248201 10 10 Clicking button1... 11 11 PASS: Should pause before button1 event handler is run. 12 PASS: Pause reason should be EventListener.12 PASS: Pause reason should be Listener. 13 13 PASS: Pause data eventName should be "click". 14 14 -
trunk/LayoutTests/inspector/dom/breakpoint-for-event-listener.html
r236766 r248201 47 47 48 48 let targetData = WI.debuggerManager.dataForTarget(WI.debuggerManager.activeCallFrame.target); 49 InspectorTest.expectEqual(targetData.pauseReason, WI.DebuggerManager.PauseReason. EventListener, `Pause reason should be EventListener.`);49 InspectorTest.expectEqual(targetData.pauseReason, WI.DebuggerManager.PauseReason.Listener, `Pause reason should be Listener.`); 50 50 InspectorTest.expectEqual(targetData.pauseData.eventName, "click", `Pause data eventName should be "click".`); 51 51 … … 109 109 110 110 let targetData = WI.debuggerManager.dataForTarget(WI.debuggerManager.activeCallFrame.target); 111 InspectorTest.assert(targetData.pauseReason, WI.DebuggerManager.PauseReason. EventListener, `Pause reason should be EventListener.`);111 InspectorTest.assert(targetData.pauseReason, WI.DebuggerManager.PauseReason.Listener, `Pause reason should be Listener.`); 112 112 InspectorTest.assert(targetData.pauseData.eventName, "click", `Pause data eventName should be "click".`); 113 113 -
trunk/Source/JavaScriptCore/ChangeLog
r248195 r248201 1 2019-08-03 Devin Rousso <drousso@apple.com> 2 3 Web Inspector: DOM: add a special breakpoint for "All Events" 4 https://bugs.webkit.org/show_bug.cgi?id=200285 5 6 Reviewed by Joseph Pecoraro. 7 8 Similar to the existing "All Requests" breakpoint, there should be a way to set a breakpoint 9 that would pause for any DOM event, regardless of the event's name. This is useful for 10 situations where the event name isn't known, or where one simply wants to pause on the next 11 entry to the event loop. 12 13 Along these lines, make the "requestAnimationFrame", "setTimeout", and "setInterval" 14 event breakpoints into special breakpoints that can be added/removed via the create 15 breakpoint context menu. This simplifies the process for setting these breakpoints, and also 16 makes them more discoverable (most people wouldn't consider them to be "events"). 17 18 * inspector/protocol/Debugger.json: 19 - Rename the `EventListener` pause reason to `Listener`. 20 - Split the `Timer` pause reason into `Interval` and `Timeout`. 21 22 * inspector/protocol/DOMDebugger.json: 23 - Split the `timer` type into `interval` and `timeout`. 24 - Make `eventName` optional for `addEventBreakpoint`/`removeEventBreakpoint`. When omitted, 25 the corresponding breakpoint that is added/removed is treated as a global breakpoint that 26 applies to all events of that type (e.g. a global `listener` breakpoint would pause for 27 any event that is fired). 28 1 29 2019-08-02 Keith Miller <keith_miller@apple.com> 2 30 -
trunk/Source/JavaScriptCore/inspector/protocol/DOMDebugger.json
r239703 r248201 13 13 "id": "EventBreakpointType", 14 14 "type": "string", 15 "enum": ["animation-frame", " listener", "timer"],15 "enum": ["animation-frame", "interval", "listener", "timeout"], 16 16 "description": "Event breakpoint type." 17 17 } … … 39 39 "parameters": [ 40 40 { "name": "breakpointType", "$ref": "EventBreakpointType" }, 41 { "name": "eventName", "type": "string", " description": "The name of theevent to stop on." }41 { "name": "eventName", "type": "string", "optional": true, "description": "The name of the specific event to stop on." } 42 42 ] 43 43 }, … … 47 47 "parameters": [ 48 48 { "name": "breakpointType", "$ref": "EventBreakpointType" }, 49 { "name": "eventName", "type": "string", " description": "The name of theevent to stop on." }49 { "name": "eventName", "type": "string", "optional": true, "description": "The name of the specific event to stop on." } 50 50 ] 51 51 }, -
trunk/Source/JavaScriptCore/inspector/protocol/Debugger.json
r248097 r248201 335 335 "parameters": [ 336 336 { "name": "callFrames", "type": "array", "items": { "$ref": "CallFrame" }, "description": "Call stack the virtual machine stopped on." }, 337 { "name": "reason", "type": "string", "enum": ["XHR", "Fetch", "DOM", "AnimationFrame", " EventListener", "Timer", "exception", "assert", "CSPViolation", "DebuggerStatement", "Breakpoint", "PauseOnNextStatement", "other"], "description": "Pause reason." },337 { "name": "reason", "type": "string", "enum": ["XHR", "Fetch", "DOM", "AnimationFrame", "Interval", "Listener", "Timeout", "exception", "assert", "CSPViolation", "DebuggerStatement", "Breakpoint", "PauseOnNextStatement", "other"], "description": "Pause reason." }, 338 338 { "name": "data", "type": "object", "optional": true, "description": "Object containing break-specific auxiliary properties." }, 339 339 { "name": "asyncStackTrace", "$ref": "Console.StackTrace", "optional": true, "description": "Linked list of asynchronous StackTraces." } -
trunk/Source/WebCore/ChangeLog
r248200 r248201 1 2019-08-03 Devin Rousso <drousso@apple.com> 2 3 Web Inspector: DOM: add a special breakpoint for "All Events" 4 https://bugs.webkit.org/show_bug.cgi?id=200285 5 6 Reviewed by Joseph Pecoraro. 7 8 Similar to the existing "All Requests" breakpoint, there should be a way to set a breakpoint 9 that would pause for any DOM event, regardless of the event's name. This is useful for 10 situations where the event name isn't known, or where one simply want's to pause on the next 11 entry to the event loop. 12 13 Along these lines, make the "requestAnimationFrame", "setTimeout", and "setInterval" 14 event breakpoints into special breakpoints that can be added/removed via the create 15 breakpoint context menu. This simplifies the process for setting these breakpoints, and also 16 makes them more discoverable (most people wouldn't consider them to be "events"). 17 18 Tests: inspector/dom/breakpoint-for-event-listener.html 19 inspector/dom-debugger/event-animation-frame-breakpoints.html 20 inspector/dom-debugger/event-breakpoint-with-navigation.html 21 inspector/dom-debugger/event-interval-breakpoints.html 22 inspector/dom-debugger/event-listener-breakpoints.html 23 inspector/dom-debugger/event-timeout-breakpoints.html 24 25 * inspector/agents/InspectorDOMDebuggerAgent.h: 26 * inspector/agents/InspectorDOMDebuggerAgent.cpp: 27 (WebCore::InspectorDOMDebuggerAgent::disable): 28 (WebCore::InspectorDOMDebuggerAgent::frameDocumentUpdated): 29 (WebCore::InspectorDOMDebuggerAgent::setEventBreakpoint): 30 (WebCore::InspectorDOMDebuggerAgent::removeEventBreakpoint): 31 (WebCore::InspectorDOMDebuggerAgent::willHandleEvent): 32 (WebCore::InspectorDOMDebuggerAgent::willFireTimer): 33 (WebCore::InspectorDOMDebuggerAgent::willFireAnimationFrame): 34 (WebCore::InspectorDOMDebuggerAgent::discardBindings): Deleted. 35 Make `eventName` optional for `addEventBreakpoint`/`removeEventBreakpoint`. When omitted, 36 the corresponding breakpoint that is added/removed is treated as a global breakpoint that 37 applies to all events of that type (e.g. a global `listener` breakpoint would pause for any 38 event that is fired). 39 1 40 2019-08-03 Zalan Bujtas <zalan@apple.com> 2 41 -
trunk/Source/WebCore/inspector/agents/InspectorDOMDebuggerAgent.cpp
r244269 r248201 95 95 { 96 96 m_instrumentingAgents.setInspectorDOMDebuggerAgent(nullptr); 97 discardBindings();98 m_ eventBreakpoints.clear();97 m_domBreakpoints.clear(); 98 m_listenerBreakpoints.clear(); 99 99 m_urlBreakpoints.clear(); 100 m_pauseOnAllAnimationFramesEnabled = false; 101 m_pauseOnAllIntervalsEnabled = false; 102 m_pauseOnAllListenersEnabled = false; 103 m_pauseOnAllTimeoutsEnabled = false; 100 104 m_pauseOnAllURLsEnabled = false; 101 105 } … … 121 125 return; 122 126 123 discardBindings();124 }125 126 void InspectorDOMDebuggerAgent::discardBindings()127 {128 127 m_domBreakpoints.clear(); 129 128 } 130 129 131 void InspectorDOMDebuggerAgent::setEventBreakpoint(ErrorString& error , const String& breakpointTypeString, const String&eventName)130 void InspectorDOMDebuggerAgent::setEventBreakpoint(ErrorString& errorString, const String& breakpointTypeString, const String* eventName) 132 131 { 133 132 if (breakpointTypeString.isEmpty()) { 134 error = "Event breakpoint type is empty"_s;133 errorString = "Event breakpoint type is empty"_s; 135 134 return; 136 135 } … … 138 137 auto breakpointType = Inspector::Protocol::InspectorHelpers::parseEnumValueFromString<Inspector::Protocol::DOMDebugger::EventBreakpointType>(breakpointTypeString); 139 138 if (!breakpointType) { 140 error = makeString("Unknown event breakpoint type: "_s, breakpointTypeString); 141 return; 142 } 143 144 if (eventName.isEmpty()) { 145 error = "Event name is empty"_s; 146 return; 147 } 148 149 m_eventBreakpoints.add(std::make_pair(*breakpointType, eventName)); 150 } 151 152 void InspectorDOMDebuggerAgent::removeEventBreakpoint(ErrorString& error, const String& breakpointTypeString, const String& eventName) 139 errorString = makeString("Unknown event breakpoint type: "_s, breakpointTypeString); 140 return; 141 } 142 143 if (eventName && !eventName->isEmpty()) { 144 if (breakpointType.value() == Inspector::Protocol::DOMDebugger::EventBreakpointType::Listener) { 145 if (!m_listenerBreakpoints.add(*eventName)) 146 errorString = "Breakpoint with eventName already exists"_s; 147 return; 148 } 149 150 errorString = "Unexpected eventName argument"_s; 151 return; 152 } 153 154 switch (breakpointType.value()) { 155 case Inspector::Protocol::DOMDebugger::EventBreakpointType::AnimationFrame: 156 if (m_pauseOnAllAnimationFramesEnabled) 157 errorString = "Already have breakpoint for all animation frames"_s; 158 m_pauseOnAllAnimationFramesEnabled = true; 159 break; 160 161 case Inspector::Protocol::DOMDebugger::EventBreakpointType::Interval: 162 if (m_pauseOnAllIntervalsEnabled) 163 errorString = "Already have breakpoint for all intervals"_s; 164 m_pauseOnAllIntervalsEnabled = true; 165 break; 166 167 case Inspector::Protocol::DOMDebugger::EventBreakpointType::Listener: 168 if (m_pauseOnAllListenersEnabled) 169 errorString = "Already have breakpoint for all listeners"_s; 170 m_pauseOnAllListenersEnabled = true; 171 break; 172 173 case Inspector::Protocol::DOMDebugger::EventBreakpointType::Timeout: 174 if (m_pauseOnAllTimeoutsEnabled) 175 errorString = "Already have breakpoint for all timeouts"_s; 176 m_pauseOnAllTimeoutsEnabled = true; 177 break; 178 } 179 } 180 181 void InspectorDOMDebuggerAgent::removeEventBreakpoint(ErrorString& errorString, const String& breakpointTypeString, const String* eventName) 153 182 { 154 183 if (breakpointTypeString.isEmpty()) { 155 error = "Event breakpoint type is empty"_s;184 errorString = "Event breakpoint type is empty"_s; 156 185 return; 157 186 } … … 159 188 auto breakpointType = Inspector::Protocol::InspectorHelpers::parseEnumValueFromString<Inspector::Protocol::DOMDebugger::EventBreakpointType>(breakpointTypeString); 160 189 if (!breakpointType) { 161 error = makeString("Unknown event breakpoint type: "_s, breakpointTypeString); 162 return; 163 } 164 165 if (eventName.isEmpty()) { 166 error = "Event name is empty"_s; 167 return; 168 } 169 170 m_eventBreakpoints.remove(std::make_pair(*breakpointType, eventName)); 190 errorString = makeString("Unknown event breakpoint type: "_s, breakpointTypeString); 191 return; 192 } 193 194 if (eventName && !eventName->isEmpty()) { 195 if (breakpointType.value() == Inspector::Protocol::DOMDebugger::EventBreakpointType::Listener) { 196 if (!m_listenerBreakpoints.remove(*eventName)) 197 errorString = "Missing breakpoint for eventName"_s; 198 return; 199 } 200 201 errorString = "Unexpected eventName argument"_s; 202 return; 203 } 204 205 switch (breakpointType.value()) { 206 case Inspector::Protocol::DOMDebugger::EventBreakpointType::AnimationFrame: 207 if (!m_pauseOnAllAnimationFramesEnabled) 208 errorString = "Missing breakpoint for all animation frames"_s; 209 m_pauseOnAllAnimationFramesEnabled = false; 210 break; 211 212 case Inspector::Protocol::DOMDebugger::EventBreakpointType::Interval: 213 if (!m_pauseOnAllIntervalsEnabled) 214 errorString = "Missing breakpoint for all intervals"_s; 215 m_pauseOnAllIntervalsEnabled = false; 216 break; 217 218 case Inspector::Protocol::DOMDebugger::EventBreakpointType::Listener: 219 if (!m_pauseOnAllListenersEnabled) 220 errorString = "Missing breakpoint for all listeners"_s; 221 m_pauseOnAllListenersEnabled = false; 222 break; 223 224 case Inspector::Protocol::DOMDebugger::EventBreakpointType::Timeout: 225 if (!m_pauseOnAllTimeoutsEnabled) 226 errorString = "Missing breakpoint for all timeouts"_s; 227 m_pauseOnAllTimeoutsEnabled = false; 228 break; 229 } 171 230 } 172 231 … … 409 468 auto* domAgent = m_instrumentingAgents.inspectorDOMAgent(); 410 469 411 bool shouldPause = m_debuggerAgent->pauseOnNextStatementEnabled() || m_eventBreakpoints.contains(std::make_pair(Inspector::Protocol::DOMDebugger::EventBreakpointType::Listener, event.type())); 412 470 bool shouldPause = m_debuggerAgent->pauseOnNextStatementEnabled() || m_pauseOnAllListenersEnabled || m_listenerBreakpoints.contains(event.type()); 413 471 if (!shouldPause && domAgent) 414 472 shouldPause = domAgent->hasBreakpointForEventListener(*event.currentTarget(), event.type(), registeredEventListener.callback(), registeredEventListener.useCapture()); 415 416 473 if (!shouldPause) 417 474 return; … … 425 482 } 426 483 427 m_debuggerAgent->schedulePauseOnNextStatement(Inspector::DebuggerFrontendDispatcher::Reason:: EventListener, WTFMove(eventData));484 m_debuggerAgent->schedulePauseOnNextStatement(Inspector::DebuggerFrontendDispatcher::Reason::Listener, WTFMove(eventData)); 428 485 } 429 486 … … 438 495 return; 439 496 440 String eventName = oneShot ? "setTimeout"_s : "setInterval"_s; 441 bool shouldPause = m_debuggerAgent->pauseOnNextStatementEnabled() || m_eventBreakpoints.contains(std::make_pair(Inspector::Protocol::DOMDebugger::EventBreakpointType::Timer, eventName)); 497 bool shouldPause = m_debuggerAgent->pauseOnNextStatementEnabled() || (oneShot ? m_pauseOnAllTimeoutsEnabled : m_pauseOnAllIntervalsEnabled); 442 498 if (!shouldPause) 443 499 return; 444 500 445 Ref<JSON::Object> eventData = JSON::Object::create(); 446 eventData->setString("eventName"_s, eventName); 447 m_debuggerAgent->schedulePauseOnNextStatement(Inspector::DebuggerFrontendDispatcher::Reason::Timer, WTFMove(eventData)); 501 auto breakReason = oneShot ? Inspector::DebuggerFrontendDispatcher::Reason::Timeout : Inspector::DebuggerFrontendDispatcher::Reason::Interval; 502 m_debuggerAgent->schedulePauseOnNextStatement(breakReason, nullptr); 448 503 } 449 504 … … 453 508 return; 454 509 455 String eventName = "requestAnimationFrame"_s; 456 bool shouldPause = m_debuggerAgent->pauseOnNextStatementEnabled() || m_eventBreakpoints.contains(std::make_pair(Inspector::Protocol::DOMDebugger::EventBreakpointType::AnimationFrame, eventName)); 510 bool shouldPause = m_debuggerAgent->pauseOnNextStatementEnabled() || m_pauseOnAllAnimationFramesEnabled; 457 511 if (!shouldPause) 458 512 return; 459 513 460 Ref<JSON::Object> eventData = JSON::Object::create(); 461 eventData->setString("eventName"_s, eventName); 462 m_debuggerAgent->schedulePauseOnNextStatement(Inspector::DebuggerFrontendDispatcher::Reason::AnimationFrame, WTFMove(eventData)); 514 m_debuggerAgent->schedulePauseOnNextStatement(Inspector::DebuggerFrontendDispatcher::Reason::AnimationFrame, nullptr); 463 515 } 464 516 -
trunk/Source/WebCore/inspector/agents/InspectorDOMDebuggerAgent.h
r244269 r248201 63 63 void setURLBreakpoint(ErrorString&, const String& url, const bool* optionalIsRegex) final; 64 64 void removeURLBreakpoint(ErrorString&, const String& url) final; 65 void setEventBreakpoint(ErrorString&, const String& breakpointType, const String &eventName) final;66 void removeEventBreakpoint(ErrorString&, const String& breakpointType, const String &eventName) final;65 void setEventBreakpoint(ErrorString&, const String& breakpointType, const String* eventName) final; 66 void removeEventBreakpoint(ErrorString&, const String& breakpointType, const String* eventName) final; 67 67 void setDOMBreakpoint(ErrorString&, int nodeId, const String& type) final; 68 68 void removeDOMBreakpoint(ErrorString&, int nodeId, const String& type) final; … … 100 100 void updateSubtreeBreakpoints(Node*, uint32_t rootMask, bool set); 101 101 bool hasBreakpoint(Node*, int type); 102 void discardBindings();103 102 104 103 RefPtr<Inspector::DOMDebuggerBackendDispatcher> m_backendDispatcher; … … 108 107 109 108 HashMap<Node*, uint32_t> m_domBreakpoints; 110 111 using EventBreakpointType = Inspector::Protocol::DOMDebugger::EventBreakpointType; 112 HashSet<std::pair<EventBreakpointType, String>, 113 WTF::PairHash<EventBreakpointType, String>, 114 WTF::PairHashTraits<WTF::StrongEnumHashTraits<EventBreakpointType>, WTF::HashTraits<String>> 115 > m_eventBreakpoints; 109 HashSet<String> m_listenerBreakpoints; 116 110 117 111 enum class URLBreakpointType { RegularExpression, Text }; 118 112 HashMap<String, URLBreakpointType> m_urlBreakpoints; 113 114 bool m_pauseOnAllAnimationFramesEnabled { false }; 115 bool m_pauseOnAllIntervalsEnabled { false }; 116 bool m_pauseOnAllListenersEnabled { false }; 117 bool m_pauseOnAllTimeoutsEnabled { false }; 119 118 bool m_pauseOnAllURLsEnabled { false }; 120 119 }; -
trunk/Source/WebInspectorUI/ChangeLog
r248198 r248201 1 2019-08-03 Devin Rousso <drousso@apple.com> 2 3 Web Inspector: DOM: add a special breakpoint for "All Events" 4 https://bugs.webkit.org/show_bug.cgi?id=200285 5 6 Reviewed by Joseph Pecoraro. 7 8 Similar to the existing "All Requests" breakpoint, there should be a way to set a breakpoint 9 that would pause for any DOM event, regardless of the event's name. This is useful for 10 situations where the event name isn't known, or where one simply want's to pause on the next 11 entry to the event loop. 12 13 Along these lines, make the "requestAnimationFrame", "setTimeout", and "setInterval" 14 event breakpoints into special breakpoints that can be added/removed via the create 15 breakpoint context menu. This simplifies the process for setting these breakpoints, and also 16 makes them more discoverable (most people wouldn't consider them to be "events"). 17 18 * UserInterface/Models/EventBreakpoint.js: 19 (WI.EventBreakpoint): 20 (WI.EventBreakpoint.deserialize): 21 (WI.EventBreakpoint.prototype.saveIdentityToCookie): 22 (WI.EventBreakpoint.prototype.toJSON): 23 24 * UserInterface/Controllers/DebuggerManager.js: 25 (WI.DebuggerManager.prototype._pauseReasonFromPayload): 26 27 * UserInterface/Controllers/DOMDebuggerManager.js: 28 (WI.DOMDebuggerManager): 29 (WI.DOMDebuggerManager.prototype.initializeTarget): 30 (WI.DOMDebuggerManager.supportsDOMBreakpoints): Added. 31 (WI.DOMDebuggerManager.supportsEventBreakpoints): 32 (WI.DOMDebuggerManager.supportsEventListenerBreakpoints): Added. 33 (WI.DOMDebuggerManager.supportsURLBreakpoints): 34 (WI.DOMDebuggerManager.supportsXHRBreakpoints): Added. 35 (WI.DOMDebuggerManager.supportsAllListenersBreakpoint): Added. 36 (WI.DOMDebuggerManager.prototype.get allAnimationFramesBreakpoint): Added. 37 (WI.DOMDebuggerManager.prototype.get allIntervalsBreakpoint): Added. 38 (WI.DOMDebuggerManager.prototype.get allListenersBreakpoint): Added. 39 (WI.DOMDebuggerManager.prototype.get allTimeoutsBreakpoint): Added. 40 (WI.DOMDebuggerManager.prototype.get listenerBreakpoints): Added. 41 (WI.DOMDebuggerManager.prototype.isBreakpointSpecial): 42 (WI.DOMDebuggerManager.prototype.listenerBreakpointForEventName): Added. 43 (WI.DOMDebuggerManager.prototype.addEventBreakpoint): 44 (WI.DOMDebuggerManager.prototype.removeEventBreakpoint): 45 (WI.DOMDebuggerManager.prototype.addURLBreakpoint): 46 (WI.DOMDebuggerManager.prototype._resolveDOMBreakpoint): 47 (WI.DOMDebuggerManager.prototype._updateDOMBreakpoint): 48 (WI.DOMDebuggerManager.prototype._updateEventBreakpoint): 49 (WI.DOMDebuggerManager.prototype._updateURLBreakpoint): 50 (WI.DOMDebuggerManager.prototype._handleDOMBreakpointDisabledStateChanged): 51 (WI.DOMDebuggerManager.prototype._handleEventBreakpointDisabledStateChanged): 52 (WI.DOMDebuggerManager.prototype._handleURLBreakpointDisabledStateChanged): 53 (WI.DOMDebuggerManager.prototype.get eventBreakpoints): Deleted. 54 (WI.DOMDebuggerManager.prototype.eventBreakpointForTypeAndEventName): Deleted. 55 Add additional target compatibility checks. 56 57 * UserInterface/Views/EventBreakpointPopover.js: 58 (WI.EventBreakpointPopover.prototype.show): 59 (WI.EventBreakpointPopover.prototype.dismiss): 60 (WI.EventBreakpointPopover.prototype._handleTypeSelectChange): Deleted. 61 * UserInterface/Views/EventBreakpointPopover.css: 62 (.popover .event-breakpoint-content > input): Added. 63 (.popover .event-breakpoint-content > input::placeholder): Added. 64 (.popover .event-breakpoint-content > .event-type): Deleted. 65 (.popover .event-breakpoint-content > .event-type > input): Deleted. 66 (.popover .event-breakpoint-content > .event-type > input::placeholder): Deleted. 67 68 * UserInterface/Views/EventBreakpointTreeElement.css: 69 (.breakpoint.event.breakpoint-for-interval:not(.breakpoint-paused-icon) .icon): Added. 70 (.breakpoint.event.breakpoint-for-timeout:not(.breakpoint-paused-icon) .icon): Added. 71 (.breakpoint.event.breakpoint-for-timer:not(.breakpoint-paused-icon) .icon): Deleted. 72 73 * UserInterface/Views/DebuggerSidebarPanel.js: 74 (WI.DebuggerSidebarPanel): 75 (WI.DebuggerSidebarPanel.prototype.saveStateToCookie): 76 (WI.DebuggerSidebarPanel.prototype.restoreStateFromCookie): 77 (WI.DebuggerSidebarPanel.prototype._addBreakpoint): 78 (WI.DebuggerSidebarPanel.prototype._addTreeElement): 79 (WI.DebuggerSidebarPanel.prototype._updatePauseReasonSection): 80 (WI.DebuggerSidebarPanel.prototype._handleBreakpointElementAddedOrRemoved): 81 (WI.DebuggerSidebarPanel.prototype._populateCreateBreakpointContextMenu.addToggleForSpecialEventBreakpoint): Added. 82 (WI.DebuggerSidebarPanel.prototype._populateCreateBreakpointContextMenu): 83 * UserInterface/Views/SourcesNavigationSidebarPanel.js: 84 (WI.SourcesNavigationSidebarPanel): 85 (WI.SourcesNavigationSidebarPanel.prototype._insertDebuggerTreeElement): 86 (WI.SourcesNavigationSidebarPanel.prototype._addBreakpoint): 87 (WI.SourcesNavigationSidebarPanel.prototype._updatePauseReasonSection): 88 (WI.SourcesNavigationSidebarPanel.prototype._handleBreakpointElementAddedOrRemoved): 89 (WI.SourcesNavigationSidebarPanel.prototype._populateCreateBreakpointContextMenu.addToggleForSpecialEventBreakpoint): Added. 90 (WI.SourcesNavigationSidebarPanel.prototype._populateCreateBreakpointContextMenu): 91 Add create breakpoint context menu items (also sort the breakpoints in this order): 92 - "All Animation Frames" => [A] All Animation Frames 93 - "All Timeouts" => [T] All Timeouts 94 - "All Intervals" => [I] All Intervals 95 - "All Events" => [E] All Events 96 97 * UserInterface/Controllers/JavaScriptRuntimeCompletionProvider.js: 98 (WI.JavaScriptRuntimeCompletionProvider.completionControllerCompletionsNeeded.receivedPropertyNames): 99 100 * UserInterface/Base/Setting.js: 101 * UserInterface/Images/EventBreakpointInterval.svg: Added. 102 * UserInterface/Images/EventBreakpointTimeout.svg: Renamed from Source/WebInspectorUI/UserInterface/Images/EventBreakpointTimer.svg. 103 * Localizations/en.lproj/localizedStrings.js: 104 1 105 2019-08-03 Devin Rousso <drousso@apple.com> 2 106 -
trunk/Source/WebInspectorUI/Localizations/en.lproj/localizedStrings.js
r248052 r248201 98 98 localizedStrings["Address"] = "Address"; 99 99 localizedStrings["All"] = "All"; 100 localizedStrings["All Animation Frames"] = "All Animation Frames"; 100 101 localizedStrings["All Changes"] = "All Changes"; 102 localizedStrings["All Events"] = "All Events"; 101 103 /* Break (pause) on all exceptions */ 102 104 localizedStrings["All Exceptions"] = "All Exceptions"; 105 localizedStrings["All Intervals"] = "All Intervals"; 103 106 localizedStrings["All Layers"] = "All Layers"; 104 107 /* A submenu item of 'Break on' that breaks (pauses) before all network requests */ … … 106 109 localizedStrings["All Resources"] = "All Resources"; 107 110 localizedStrings["All Storage"] = "All Storage"; 111 localizedStrings["All Timeouts"] = "All Timeouts"; 108 112 localizedStrings["All items in \u0022%s\u0022 must be error objects"] = "All items in \u0022%s\u0022 must be error objects"; 109 113 localizedStrings["All items in \u0022%s\u0022 must be non-empty strings"] = "All items in \u0022%s\u0022 must be non-empty strings"; … … 302 306 localizedStrings["DOM"] = "DOM"; 303 307 localizedStrings["DOM Content Loaded \u2014 %s"] = "DOM Content Loaded \u2014 %s"; 304 localizedStrings["DOM Event"] = "DOM Event";305 308 localizedStrings["DOM Events"] = "DOM Events"; 306 309 localizedStrings["DOM Nodes:"] = "DOM Nodes:"; … … 1260 1263 localizedStrings["popup"] = "popup"; 1261 1264 localizedStrings["popup, toggle"] = "popup, toggle"; 1265 localizedStrings["requestAnimationFrame Fired"] = "requestAnimationFrame Fired"; 1266 localizedStrings["setInterval Fired"] = "setInterval Fired"; 1267 localizedStrings["setTimeout Fired"] = "setTimeout Fired"; 1262 1268 localizedStrings["space"] = "space"; 1263 1269 localizedStrings["spaces"] = "spaces"; -
trunk/Source/WebInspectorUI/UserInterface/Base/Setting.js
r246821 r248201 159 159 selectedNetworkDetailContentViewIdentifier: new WI.Setting("network-detail-content-view-identifier", "preview"), 160 160 sourceMapsEnabled: new WI.Setting("source-maps-enabled", true), 161 showAllAnimationFramesBreakpoint: new WI.Setting("show-all-animation-frames-breakpoint", false), 162 showAllIntervalsBreakpoint: new WI.Setting("show-all-inteverals-breakpoint", false), 163 showAllListenersBreakpoint: new WI.Setting("show-all-listeners-breakpoint", false), 161 164 showAllRequestsBreakpoint: new WI.Setting("show-all-requests-breakpoint", true), 165 showAllTimeoutsBreakpoint: new WI.Setting("show-all-timeouts-breakpoint", false), 162 166 showAssertionFailuresBreakpoint: new WI.Setting("show-assertion-failures-breakpoint", true), 163 167 showCanvasPath: new WI.Setting("show-canvas-path", false), -
trunk/Source/WebInspectorUI/UserInterface/Controllers/DOMDebuggerManager.js
r248176 r248201 33 33 this._domBreakpointFrameIdentifierMap = new Map; 34 34 35 this._eventBreakpoints = []; 36 35 this._listenerBreakpoints = []; 37 36 this._urlBreakpoints = []; 37 38 this._allAnimationFramesBreakpointEnabledSetting = new WI.Setting("break-on-all-animation-frames", false); 39 this._allAnimationFramesBreakpoint = new WI.EventBreakpoint(WI.EventBreakpoint.Type.AnimationFrame, { 40 disabled: !this._allAnimationFramesBreakpointEnabledSetting.value, 41 }); 42 43 this._allIntervalsBreakpointEnabledSetting = new WI.Setting("break-on-all-intervals", false); 44 this._allIntervalsBreakpoint = new WI.EventBreakpoint(WI.EventBreakpoint.Type.Interval, { 45 disabled: !this._allIntervalsBreakpointEnabledSetting.value, 46 }); 47 48 this._allListenersBreakpointEnabledSetting = new WI.Setting("break-on-all-listeners", false); 49 this._allListenersBreakpoint = new WI.EventBreakpoint(WI.EventBreakpoint.Type.Listener, { 50 disabled: !this._allListenersBreakpointEnabledSetting.value, 51 }); 52 53 this._allTimeoutsBreakpointEnabledSetting = new WI.Setting("break-on-all-timeouts", false); 54 this._allTimeoutsBreakpoint = new WI.EventBreakpoint(WI.EventBreakpoint.Type.Timeout, { 55 disabled: !this._allTimeoutsBreakpointEnabledSetting.value, 56 }); 57 38 58 this._allRequestsBreakpointEnabledSetting = new WI.Setting("break-on-all-requests", false); 39 40 59 this._allRequestsBreakpoint = new WI.URLBreakpoint(WI.URLBreakpoint.Type.Text, "", { 41 60 disabled: !this._allRequestsBreakpointEnabledSetting.value, … … 79 98 }; 80 99 81 if ( this.supported) {100 if (DOMDebuggerManager.supportsDOMBreakpoints()) { 82 101 loadBreakpoints(WI.DOMBreakpoint, WI.objectStores.domBreakpoints, ["dom-breakpoints"], (breakpoint) => { 83 102 this.addDOMBreakpoint(breakpoint); 84 103 }); 85 104 } 105 106 if (DOMDebuggerManager.supportsEventBreakpoints() || DOMDebuggerManager.supportsEventListenerBreakpoints()) { 86 107 loadBreakpoints(WI.EventBreakpoint, WI.objectStores.eventBreakpoints, ["event-breakpoints"], (breakpoint) => { 108 // Migrate `requestAnimationFrame`, `setTimeout`, and `setInterval` global breakpoints. 109 switch (breakpoint.type) { 110 case WI.EventBreakpoint.Type.AnimationFrame: 111 this._allAnimationFramesBreakpoint.disabled = breakpoint.disabled; 112 if (!WI.settings.showAllAnimationFramesBreakpoint.value) { 113 WI.settings.showAllAnimationFramesBreakpoint.value = true; 114 this.addEventBreakpoint(this._allAnimationFramesBreakpoint); 115 } 116 WI.objectStores.eventBreakpoints.deleteObject(breakpoint); 117 return; 118 119 case WI.EventBreakpoint.Type.Timer: 120 switch (breakpoint.eventName) { 121 case "setTimeout": 122 this._allTimeoutsBreakpoint.disabled = breakpoint.disabled; 123 if (!WI.settings.showAllTimeoutsBreakpoint.value) { 124 WI.settings.showAllTimeoutsBreakpoint.value = true; 125 this.addEventBreakpoint(this._allTimeoutsBreakpoint); 126 } 127 break; 128 129 case "setInterval": 130 this._allIntervalsBreakpoint.disabled = breakpoint.disabled; 131 if (!WI.settings.showAllIntervalsBreakpoint.value) { 132 WI.settings.showAllIntervalsBreakpoint.value = true; 133 this.addEventBreakpoint(this._allIntervalsBreakpoint); 134 } 135 break; 136 } 137 138 WI.objectStores.eventBreakpoints.deleteObject(breakpoint); 139 return; 140 } 141 87 142 this.addEventBreakpoint(breakpoint); 88 143 }); 89 144 } 145 146 if (DOMDebuggerManager.supportsURLBreakpoints() || DOMDebuggerManager.supportsXHRBreakpoints()) { 90 147 loadBreakpoints(WI.URLBreakpoint, WI.objectStores.urlBreakpoints, ["xhr-breakpoints", "url-breakpoints"], (breakpoint) => { 91 148 this.addURLBreakpoint(breakpoint); … … 102 159 this._speculativelyResolveDOMBreakpointsForURL(target.mainResource.url); 103 160 104 for (let breakpoint of this._eventBreakpoints) { 161 if (!this._allAnimationFramesBreakpoint.disabled) 162 this._updateEventBreakpoint(this._allAnimationFramesBreakpoint, target); 163 164 if (!this._allIntervalsBreakpoint.disabled) 165 this._updateEventBreakpoint(this._allIntervalsBreakpoint, target); 166 167 if (!this._allListenersBreakpoint.disabled) 168 this._updateEventBreakpoint(this._allListenersBreakpoint, target); 169 170 if (!this._allTimeoutsBreakpoint.disabled) 171 this._updateEventBreakpoint(this._allTimeoutsBreakpoint, target); 172 173 if (!this._allRequestsBreakpoint.disabled) 174 this._updateURLBreakpoint(this._allRequestsBreakpoint, target); 175 176 for (let breakpoint of this._listenerBreakpoints) { 105 177 if (!breakpoint.disabled) 106 178 this._updateEventBreakpoint(breakpoint, target); … … 111 183 this._updateURLBreakpoint(breakpoint, target); 112 184 } 113 114 if (!this._allRequestsBreakpoint.disabled)115 this._updateURLBreakpoint(this._allRequestsBreakpoint, target);116 185 } 117 186 } … … 119 188 // Static 120 189 190 static supportsDOMBreakpoints() 191 { 192 // COMPATIBILITY (iOS 10.3): DOMDebugger.setDOMBreakpoint and DOMDebugger.removeDOMBreakpoint did not exist yet. 193 return InspectorBackend.domains.DOMDebugger && InspectorBackend.domains.DOMDebugger.setDOMBreakpoint && InspectorBackend.domains.DOMDebugger.removeDOMBreakpoint; 194 } 195 121 196 static supportsEventBreakpoints() 122 197 { 123 return InspectorBackend.domains.DOMDebugger.setEventBreakpoint && InspectorBackend.domains.DOMDebugger.removeEventBreakpoint; 198 // COMPATIBILITY (iOS 13): DOMDebugger.setEventBreakpoint and DOMDebugger.removeEventBreakpoint did not exist yet. 199 return InspectorBackend.domains.DOMDebugger && InspectorBackend.domains.DOMDebugger.setEventBreakpoint && InspectorBackend.domains.DOMDebugger.removeEventBreakpoint; 200 } 201 202 static supportsEventListenerBreakpoints() 203 { 204 // COMPATIBILITY (iOS 12.2): Replaced by DOMDebugger.setEventBreakpoint and DOMDebugger.removeEventBreakpoint. 205 return InspectorBackend.domains.DOMDebugger && InspectorBackend.domains.DOMDebugger.setEventListenerBreakpoint && InspectorBackend.domains.DOMDebugger.removeEventListenerBreakpoint; 124 206 } 125 207 126 208 static supportsURLBreakpoints() 127 209 { 128 return InspectorBackend.domains.DOMDebugger.setURLBreakpoint && InspectorBackend.domains.DOMDebugger.removeURLBreakpoint; 210 // COMPATIBILITY (iOS 13): DOMDebugger.setURLBreakpoint and DOMDebugger.removeURLBreakpoint did not exist yet. 211 return InspectorBackend.domains.DOMDebugger && InspectorBackend.domains.DOMDebugger.setURLBreakpoint && InspectorBackend.domains.DOMDebugger.removeURLBreakpoint; 212 } 213 214 static supportsXHRBreakpoints() 215 { 216 // COMPATIBILITY (iOS 13): Replaced by DOMDebugger.setURLBreakpoint and DOMDebugger.removeURLBreakpoint. 217 return InspectorBackend.domains.DOMDebugger && InspectorBackend.domains.DOMDebugger.setXHRBreakpoint && InspectorBackend.domains.DOMDebugger.removeXHRBreakpoint; 218 } 219 220 static supportsAllListenersBreakpoint() 221 { 222 // COMPATIBILITY (iOS 13): DOMDebugger.EventBreakpointType.Interval and DOMDebugger.EventBreakpointType.Timeout did not exist yet. 223 return DOMDebuggerManager.supportsEventBreakpoints() && InspectorBackend.domains.DOMDebugger.EventBreakpointType.Interval && InspectorBackend.domains.DOMDebugger.EventBreakpointType.Timeout; 129 224 } 130 225 … … 136 231 } 137 232 233 get allAnimationFramesBreakpoint() { return this._allAnimationFramesBreakpoint; } 234 get allIntervalsBreakpoint() { return this._allIntervalsBreakpoint; } 235 get allListenersBreakpoint() { return this._allListenersBreakpoint; } 236 get allTimeoutsBreakpoint() { return this._allTimeoutsBreakpoint; } 138 237 get allRequestsBreakpoint() { return this._allRequestsBreakpoint; } 139 238 … … 158 257 } 159 258 160 get eventBreakpoints() { return this._eventBreakpoints; } 161 259 get listenerBreakpoints() { return this._listenerBreakpoints; } 162 260 get urlBreakpoints() { return this._urlBreakpoints; } 163 261 164 262 isBreakpointSpecial(breakpoint) 165 263 { 166 return breakpoint === this._allRequestsBreakpoint; 264 return breakpoint === this._allAnimationFramesBreakpoint 265 || breakpoint === this._allIntervalsBreakpoint 266 || breakpoint === this._allListenersBreakpoint 267 || breakpoint === this._allTimeoutsBreakpoint 268 || breakpoint === this._allRequestsBreakpoint; 167 269 } 168 270 … … 258 360 } 259 361 260 eventBreakpointForTypeAndEventName(type, eventName) 261 { 262 return this._eventBreakpoints.find((breakpoint) => breakpoint.type === type && breakpoint.eventName === eventName) || null; 362 listenerBreakpointForEventName(eventName) 363 { 364 if (DOMDebuggerManager.supportsAllListenersBreakpoint() && !this._allListenersBreakpoint.disabled) 365 return this._allListenersBreakpoint; 366 return this._listenerBreakpoints.find((breakpoint) => breakpoint.eventName === eventName) || null; 263 367 } 264 368 … … 274 378 } 275 379 276 if (this.eventBreakpointForTypeAndEventName(breakpoint.type, breakpoint.eventName)) 277 return; 278 279 this._eventBreakpoints.push(breakpoint); 380 console.assert(breakpoint.type === WI.EventBreakpoint.Type.Listener); 381 382 if (this.listenerBreakpointForEventName(breakpoint.eventName)) 383 return; 384 385 this._listenerBreakpoints.push(breakpoint); 280 386 281 387 this.dispatchEventToListeners(WI.DOMDebuggerManager.Event.EventBreakpointAdded, {breakpoint}); 282 388 283 389 if (!breakpoint.disabled) { 284 for (let target of WI.targets) { 285 if (target.DOMDebuggerAgent) 286 this._updateEventBreakpoint(breakpoint, target); 287 } 390 for (let target of WI.targets) 391 this._updateEventBreakpoint(breakpoint, target); 288 392 } 289 393 … … 304 408 } 305 409 306 if (!this._eventBreakpoints.includes(breakpoint)) 307 return; 308 309 this._eventBreakpoints.remove(breakpoint); 410 console.assert(breakpoint.type === WI.EventBreakpoint.Type.Listener); 411 412 if (!this._listenerBreakpoints.includes(breakpoint)) 413 return; 414 415 this._listenerBreakpoints.remove(breakpoint); 310 416 311 417 if (!this._restoringBreakpoints) … … 318 424 319 425 for (let target of WI.targets) { 320 if (target.DOMDebuggerAgent ) {426 if (target.DOMDebuggerAgent && (target.DOMDebuggerAgent.removeEventBreakpoint || target.DOMDebuggerAgent.removeEventListenerBreakpoint)) { 321 427 // Compatibility (iOS 12): DOMDebuggerAgent.removeEventBreakpoint did not exist. 322 428 if (!WI.DOMDebuggerManager.supportsEventBreakpoints()) { … … 359 465 360 466 if (!breakpoint.disabled) { 361 for (let target of WI.targets) { 362 if (target.DOMDebuggerAgent) 363 this._updateURLBreakpoint(breakpoint, target); 364 } 467 for (let target of WI.targets) 468 this._updateURLBreakpoint(breakpoint, target); 365 469 } 366 470 … … 485 589 // We should get the target associated with the nodeIdentifier of this breakpoint. 486 590 let target = WI.assumingMainTarget(); 487 if (target && target.DOMDebuggerAgent)591 if (target) 488 592 this._updateDOMBreakpoint(breakpoint, target); 489 593 } … … 492 596 _updateDOMBreakpoint(breakpoint, target) 493 597 { 494 console.assert(target.DOMDebuggerAgent); 598 if (!target.DOMDebuggerAgent || !target.DOMDebuggerAgent.setDOMBreakpoint || !target.DOMDebuggerAgent.removeDOMBreakpoint) 599 return; 495 600 496 601 if (!breakpoint.domNodeIdentifier) … … 509 614 _updateEventBreakpoint(breakpoint, target) 510 615 { 511 console.assert(target.DOMDebuggerAgent); 616 if (!target.DOMDebuggerAgent) 617 return; 512 618 513 619 // Compatibility (iOS 12): DOMDebuggerAgent.removeEventBreakpoint did not exist. 514 620 if (!WI.DOMDebuggerManager.supportsEventBreakpoints()) { 621 if (!target.DOMDebuggerAgent.setEventListenerBreakpoint || !target.DOMDebuggerAgent.removeEventListenerBreakpoint) 622 return; 623 515 624 console.assert(breakpoint.type === WI.EventBreakpoint.Type.Listener); 516 625 if (breakpoint.disabled) … … 525 634 } 526 635 636 if (!target.DOMDebuggerAgent.setEventBreakpoint || !target.DOMDebuggerAgent.removeEventBreakpoint) 637 return; 638 639 let commandArguments = {}; 640 641 switch (breakpoint) { 642 case this._allAnimationFramesBreakpoint: 643 commandArguments.breakpointType = WI.EventBreakpoint.Type.AnimationFrame; 644 if (!DOMDebuggerManager.supportsAllListenersBreakpoint()) 645 commandArguments.eventName = "requestAnimationFrame"; 646 break; 647 648 case this._allIntervalsBreakpoint: 649 if (DOMDebuggerManager.supportsAllListenersBreakpoint()) 650 commandArguments.breakpointType = WI.EventBreakpoint.Type.Interval; 651 else { 652 commandArguments.breakpointType = WI.EventBreakpoint.Type.Timer; 653 commandArguments.eventName = "setInterval"; 654 } 655 break; 656 657 case this._allListenersBreakpoint: 658 if (!DOMDebuggerManager.supportsAllListenersBreakpoint()) 659 return; 660 661 commandArguments.breakpointType = WI.EventBreakpoint.Type.Listener; 662 break; 663 664 case this._allTimeoutsBreakpoint: 665 if (DOMDebuggerManager.supportsAllListenersBreakpoint()) 666 commandArguments.breakpointType = WI.EventBreakpoint.Type.Timeout; 667 else { 668 commandArguments.breakpointType = WI.EventBreakpoint.Type.Timer; 669 commandArguments.eventName = "setTimeout"; 670 } 671 break; 672 673 default: 674 commandArguments.breakpointType = breakpoint.type; 675 commandArguments.eventName = breakpoint.eventName; 676 console.assert(commandArguments.eventName); 677 break; 678 } 679 527 680 if (breakpoint.disabled) 528 target.DOMDebuggerAgent.removeEventBreakpoint (breakpoint.type, breakpoint.eventName);681 target.DOMDebuggerAgent.removeEventBreakpoint.invoke(commandArguments); 529 682 else { 530 683 if (!this._restoringBreakpoints && !WI.debuggerManager.breakpointsDisabledTemporarily) 531 684 WI.debuggerManager.breakpointsEnabled = true; 532 685 533 target.DOMDebuggerAgent.setEventBreakpoint (breakpoint.type, breakpoint.eventName);686 target.DOMDebuggerAgent.setEventBreakpoint.invoke(commandArguments); 534 687 } 535 688 } … … 537 690 _updateURLBreakpoint(breakpoint, target) 538 691 { 539 console.assert(target.DOMDebuggerAgent); 692 if (!target.DOMDebuggerAgent) 693 return; 540 694 541 695 // Compatibility (iOS 12.1): DOMDebuggerAgent.removeURLBreakpoint did not exist. 542 696 if (!WI.DOMDebuggerManager.supportsURLBreakpoints()) { 697 if (!target.DOMDebuggerAgent.setXHRBreakpoint || !target.DOMDebuggerAgent.removeXHRBreakpoint) 698 return; 699 543 700 if (breakpoint.disabled) 544 701 target.DOMDebuggerAgent.removeXHRBreakpoint(breakpoint.url); … … 553 710 } 554 711 712 if (!target.DOMDebuggerAgent.setURLBreakpoint || !target.DOMDebuggerAgent.removeURLBreakpoint) 713 return; 714 555 715 if (breakpoint.disabled) 556 716 target.DOMDebuggerAgent.removeURLBreakpoint(breakpoint.url); … … 568 728 let breakpoint = event.target; 569 729 let target = WI.assumingMainTarget(); 570 if (target && target.DOMDebuggerAgent)730 if (target) 571 731 this._updateDOMBreakpoint(breakpoint, target); 572 732 … … 583 743 return; 584 744 585 for (let target of WI.targets) { 586 if (target.DOMDebuggerAgent) 587 this._updateEventBreakpoint(breakpoint, target); 745 for (let target of WI.targets) 746 this._updateEventBreakpoint(breakpoint, target); 747 748 switch (breakpoint) { 749 case this._allAnimationFramesBreakpoint: 750 this._allAnimationFramesBreakpointEnabledSetting.value = !breakpoint.disabled; 751 return; 752 753 case this._allIntervalsBreakpoint: 754 this._allIntervalsBreakpointEnabledSetting.value = !breakpoint.disabled; 755 return; 756 757 case this._allListenersBreakpoint: 758 this._allListenersBreakpointEnabledSetting.value = !breakpoint.disabled; 759 return; 760 761 case this._allTimeoutsBreakpoint: 762 this._allTimeoutsBreakpointEnabledSetting.value = !breakpoint.disabled; 763 return; 588 764 } 589 765 … … 596 772 let breakpoint = event.target; 597 773 598 if (breakpoint === this._allRequestsBreakpoint) 774 for (let target of WI.targets) 775 this._updateURLBreakpoint(breakpoint, target); 776 777 if (breakpoint === this._allRequestsBreakpoint) { 599 778 this._allRequestsBreakpointEnabledSetting.value = !breakpoint.disabled; 600 601 for (let target of WI.targets) { 602 if (target.DOMDebuggerAgent) 603 this._updateURLBreakpoint(breakpoint, target); 779 return; 604 780 } 605 781 -
trunk/Source/WebInspectorUI/UserInterface/Controllers/DebuggerManager.js
r248176 r248201 864 864 case DebuggerAgent.PausedReason.Fetch: 865 865 return WI.DebuggerManager.PauseReason.Fetch; 866 case DebuggerAgent.PausedReason.Interval: 867 return WI.DebuggerManager.PauseReason.Interval; 868 case DebuggerAgent.PausedReason.Listener: 869 return WI.DebuggerManager.PauseReason.Listener; 866 870 case DebuggerAgent.PausedReason.PauseOnNextStatement: 867 871 return WI.DebuggerManager.PauseReason.PauseOnNextStatement; 872 case DebuggerAgent.PausedReason.Timeout: 873 return WI.DebuggerManager.PauseReason.Timeout; 868 874 case DebuggerAgent.PausedReason.Timer: 869 875 return WI.DebuggerManager.PauseReason.Timer; … … 1384 1390 DebuggerStatement: "debugger-statement", 1385 1391 DOM: "DOM", 1386 EventListener: "event-listener",1387 1392 Exception: "exception", 1388 1393 Fetch: "fetch", 1394 Interval: "interval", 1395 Listener: "listener", 1389 1396 PauseOnNextStatement: "pause-on-next-statement", 1390 Time r: "timer",1397 Timeout: "timeout", 1391 1398 XHR: "xhr", 1392 1399 Other: "other", 1400 1401 // COMPATIBILITY (iOS 13): DOMDebugger.EventBreakpointType.Timer was replaced by DOMDebugger.EventBreakpointType.Interval and DOMDebugger.EventBreakpointType.Timeout. 1402 Timer: "timer", 1403 1404 // COMPATIBILITY (iOS 13): DOMDebugger.EventBreakpointType.EventListener was replaced by DOMDebugger.EventBreakpointType.Listener. 1405 EventListener: "event-listener", 1393 1406 }; -
trunk/Source/WebInspectorUI/UserInterface/Controllers/JavaScriptRuntimeCompletionProvider.js
r243161 r248201 222 222 if (WI.debuggerManager.paused) { 223 223 let targetData = WI.debuggerManager.dataForTarget(WI.runtimeManager.activeExecutionContext.target); 224 if (targetData.pauseReason === WI.DebuggerManager.PauseReason. EventListener)224 if (targetData.pauseReason === WI.DebuggerManager.PauseReason.Listener || targetData.pauseReason === WI.DebuggerManager.PauseReason.EventListener) 225 225 commandLineAPI.push("$event"); 226 226 else if (targetData.pauseReason === WI.DebuggerManager.PauseReason.Exception) -
trunk/Source/WebInspectorUI/UserInterface/Models/EventBreakpoint.js
r244279 r248201 26 26 WI.EventBreakpoint = class EventBreakpoint extends WI.Object 27 27 { 28 constructor(type, eventName, {eventListener, disabled} = {})28 constructor(type, {eventName, eventListener, disabled} = {}) 29 29 { 30 30 super(); 31 31 32 32 console.assert(Object.values(WI.EventBreakpoint.Type).includes(type), type); 33 console.assert(typeof eventName === "string", eventName);34 33 35 34 this._type = type; 36 this._eventName = eventName ;35 this._eventName = eventName || null; 37 36 this._eventListener = eventListener || null; 38 37 this._disabled = disabled || false; … … 43 42 static deserialize(serializedInfo) 44 43 { 45 return new WI.EventBreakpoint(serializedInfo.type, serializedInfo.eventName, { 44 return new WI.EventBreakpoint(serializedInfo.type, { 45 eventName: serializedInfo.eventName, 46 46 disabled: !!serializedInfo.disabled, 47 47 }); … … 72 72 { 73 73 cookie["event-breakpoint-type"] = this._type; 74 cookie["event-breakpoint-event-name"] = this._eventName; 74 if (this._eventName) 75 cookie["event-breakpoint-event-name"] = this._eventName; 76 if (this._eventListener) 77 cookie["event-breakpoint-event-listener"] = this._eventListener.eventListenerId; 78 if (this._disabled) 79 cookie["event-breakpoint-disabled"] = this._disabled; 75 80 } 76 81 … … 79 84 let json = { 80 85 type: this._type, 81 eventName: this._eventName,82 86 }; 87 if (this._eventName) 88 json.eventName = this._eventName; 83 89 if (this._disabled) 84 90 json.disabled = true; 85 91 if (key === WI.ObjectStore.toJSONSymbol) 86 json[WI.objectStores.eventBreakpoints.keyPath] = this._type + ":" + this._eventName;92 json[WI.objectStores.eventBreakpoints.keyPath] = this._type + (this._eventName ? ":" + this._eventName : ""); 87 93 return json; 88 94 } … … 91 97 WI.EventBreakpoint.Type = { 92 98 AnimationFrame: "animation-frame", 99 Interval: "interval", 93 100 Listener: "listener", 101 Timeout: "timeout", 102 103 // COMPATIBILITY (iOS 13): DOMDebugger.EventBreakpointTypes.Timer was removed. 94 104 Timer: "timer", 95 105 }; -
trunk/Source/WebInspectorUI/UserInterface/Views/DebuggerSidebarPanel.js
r248094 r248201 228 228 229 229 if (WI.domDebuggerManager.supported) { 230 if (WI.settings.showAllAnimationFramesBreakpoint.value) 231 WI.domDebuggerManager.addEventBreakpoint(WI.domDebuggerManager.allAnimationFramesBreakpoint); 232 233 if (WI.settings.showAllTimeoutsBreakpoint.value) 234 WI.domDebuggerManager.addEventBreakpoint(WI.domDebuggerManager.allTimeoutsBreakpoint); 235 236 if (WI.settings.showAllIntervalsBreakpoint.value) 237 WI.domDebuggerManager.addEventBreakpoint(WI.domDebuggerManager.allIntervalsBreakpoint); 238 239 if (WI.settings.showAllListenersBreakpoint.value) 240 WI.domDebuggerManager.addEventBreakpoint(WI.domDebuggerManager.allListenersBreakpoint); 241 242 for (let eventBreakpoint of WI.domDebuggerManager.listenerBreakpoints) 243 this._addBreakpoint(eventBreakpoint); 244 245 for (let eventListenerBreakpoint of WI.domManager.eventListenerBreakpoints) 246 this._addBreakpoint(eventListenerBreakpoint); 247 248 for (let domBreakpoint of WI.domDebuggerManager.domBreakpoints) 249 this._addBreakpoint(domBreakpoint); 250 230 251 if (WI.settings.showAllRequestsBreakpoint.value) 231 252 WI.domDebuggerManager.addURLBreakpoint(WI.domDebuggerManager.allRequestsBreakpoint); 232 233 for (let eventBreakpoint of WI.domDebuggerManager.eventBreakpoints)234 this._addBreakpoint(eventBreakpoint);235 236 for (let domBreakpoint of WI.domDebuggerManager.domBreakpoints)237 this._addBreakpoint(domBreakpoint);238 239 for (let eventListenerBreakpoint of WI.domManager.eventListenerBreakpoints)240 this._addBreakpoint(eventListenerBreakpoint);241 253 242 254 for (let urlBreakpoints of WI.domDebuggerManager.urlBreakpoints) … … 365 377 } 366 378 367 var representedObject = selectedTreeElement.representedObject; 368 369 if (representedObject === WI.debuggerManager.allExceptionsBreakpoint) { 370 cookie[WI.DebuggerSidebarPanel.SelectedAllExceptionsCookieKey] = true; 371 return; 372 } 373 374 if (representedObject === WI.debuggerManager.uncaughtExceptionsBreakpoint) { 375 cookie[WI.DebuggerSidebarPanel.SelectedUncaughtExceptionsCookieKey] = true; 376 return; 377 } 378 379 if (representedObject === WI.debuggerManager.assertionFailuresBreakpoint) { 380 cookie[WI.DebuggerSidebarPanel.SelectedAssertionFailuresCookieKey] = true; 381 return; 382 } 383 384 if (representedObject === WI.domDebuggerManager.allRequestsBreakpoint) { 385 cookie[WI.DebuggerSidebarPanel.SelectedAllRequestsCookieKey] = true; 379 switch (selectedTreeElement.representedObject) { 380 case WI.debuggerManager.allExceptionsBreakpoint: 381 cookie[DebuggerSidebarPanel.SelectedAllExceptionsCookieKey] = true; 382 return; 383 384 case WI.debuggerManager.uncaughtExceptionsBreakpoint: 385 cookie[DebuggerSidebarPanel.SelectedUncaughtExceptionsCookieKey] = true; 386 return; 387 388 case WI.debuggerManager.assertionFailuresBreakpoint: 389 cookie[DebuggerSidebarPanel.SelectedAssertionFailuresCookieKey] = true; 390 return; 391 392 case WI.domDebuggerManager.allAnimationFramesBreakpoint: 393 cookie[DebuggerSidebarPanel.SelectedAllAnimationFramesBreakpoint] = true; 394 return; 395 396 case WI.domDebuggerManager.allIntervalsBreakpoint: 397 cookie[DebuggerSidebarPanel.SelectedAllIntervalsBreakpoint] = true; 398 return; 399 400 case WI.domDebuggerManager.allListenersBreakpoint: 401 cookie[DebuggerSidebarPanel.SelectedAllListenersBreakpoint] = true; 402 return; 403 404 case WI.domDebuggerManager.allTimeoutsBreakpoint: 405 cookie[DebuggerSidebarPanel.SelectedAllTimeoutsBreakpoint] = true; 406 return; 407 408 case WI.domDebuggerManager.allRequestsBreakpoint: 409 cookie[DebuggerSidebarPanel.SelectedAllRequestsCookieKey] = true; 386 410 return; 387 411 } … … 403 427 404 428 // Eagerly resolve the special breakpoints; otherwise, use the default behavior. 405 if (cookie[ WI.DebuggerSidebarPanel.SelectedAllExceptionsCookieKey])429 if (cookie[DebuggerSidebarPanel.SelectedAllExceptionsCookieKey]) 406 430 revealAndSelect(this._breakpointsContentTreeOutline, WI.debuggerManager.allExceptionsBreakpoint); 407 else if (cookie[ WI.DebuggerSidebarPanel.SelectedUncaughtExceptionsCookieKey])431 else if (cookie[DebuggerSidebarPanel.SelectedUncaughtExceptionsCookieKey]) 408 432 revealAndSelect(this._breakpointsContentTreeOutline, WI.debuggerManager.uncaughtExceptionsBreakpoint); 409 else if (cookie[ WI.DebuggerSidebarPanel.SelectedAssertionFailuresCookieKey])433 else if (cookie[DebuggerSidebarPanel.SelectedAssertionFailuresCookieKey]) 410 434 revealAndSelect(this._breakpointsContentTreeOutline, WI.debuggerManager.assertionFailuresBreakpoint); 411 else if (cookie[WI.DebuggerSidebarPanel.SelectedAllRequestsCookieKey]) 435 else if (cookie[DebuggerSidebarPanel.SelectedAllAnimationFramesBreakpoint]) 436 revealAndSelect(this._breakpointsContentTreeOutline, WI.domDebuggerManager.allAnimationFramesBreakpoint); 437 else if (cookie[DebuggerSidebarPanel.SelectedAllIntervalsBreakpoint]) 438 revealAndSelect(this._breakpointsContentTreeOutline, WI.domDebuggerManager.allIntervalsBreakpoint); 439 else if (cookie[DebuggerSidebarPanel.SelectedAllListenersBreakpoint]) 440 revealAndSelect(this._breakpointsContentTreeOutline, WI.domDebuggerManager.allListenersBreakpoint); 441 else if (cookie[DebuggerSidebarPanel.SelectedAllRequestsCookieKey]) 412 442 revealAndSelect(this._breakpointsContentTreeOutline, WI.domDebuggerManager.allRequestsBreakpoint); 443 else if (cookie[DebuggerSidebarPanel.SelectedAllTimeoutsBreakpoint]) 444 revealAndSelect(this._breakpointsContentTreeOutline, WI.domDebuggerManager.allTimeoutsBreakpoint); 413 445 else 414 446 super.restoreStateFromCookie(cookie, relaxedMatchDelay); … … 513 545 constructor = WI.EventBreakpointTreeElement; 514 546 515 if (breakpoint.eventListener) { 547 if (breakpoint === WI.domDebuggerManager.allAnimationFramesBreakpoint) 548 options.title = WI.UIString("All Animation Frames"); 549 else if (breakpoint === WI.domDebuggerManager.allIntervalsBreakpoint) 550 options.title = WI.UIString("All Intervals"); 551 else if (breakpoint === WI.domDebuggerManager.allListenersBreakpoint) 552 options.title = WI.UIString("All Events"); 553 else if (breakpoint === WI.domDebuggerManager.allTimeoutsBreakpoint) 554 options.title = WI.UIString("All Timeouts"); 555 else if (breakpoint.eventListener) { 516 556 let eventTargetTreeElement = null; 517 557 if (breakpoint.eventListener.onWindow) { … … 1065 1105 (treeElement) => treeElement.representedObject === WI.debuggerManager.assertionFailuresBreakpoint, 1066 1106 (treeElement) => treeElement instanceof WI.BreakpointTreeElement || treeElement instanceof WI.ResourceTreeElement || treeElement instanceof WI.ScriptTreeElement, 1107 (treeElement) => treeElement.representedObject === WI.domDebuggerManager.allAnimationFramesBreakpoint, 1108 (treeElement) => treeElement.representedObject === WI.domDebuggerManager.allTimeoutsBreakpoint, 1109 (treeElement) => treeElement.representedObject === WI.domDebuggerManager.allIntervalsBreakpoint, 1110 (treeElement) => treeElement.representedObject === WI.domDebuggerManager.allListenersBreakpoint, 1067 1111 (treeElement) => treeElement instanceof WI.EventBreakpointTreeElement, 1068 1112 (treeElement) => treeElement instanceof WI.DOMNodeTreeElement, … … 1124 1168 switch (pauseReason) { 1125 1169 case WI.DebuggerManager.PauseReason.AnimationFrame: 1126 console.assert(pauseData, "Expected data with an animation frame, but found none.");1127 if (!pauseData)1128 return false;1129 1130 var eventBreakpoint = WI.domDebuggerManager.eventBreakpointForTypeAndEventName(WI.EventBreakpoint.Type.AnimationFrame, pauseData.eventName);1131 console.assert(eventBreakpoint, "Expected AnimationFrame breakpoint for event name.", pauseData.eventName);1132 if (!eventBreakpoint)1133 return false;1134 1135 1170 this._pauseReasonTreeOutline = this.createContentTreeOutline({suppressFiltering: true}); 1136 1171 1137 var eventBreakpointTreeElement = new WI.EventBreakpointTreeElement( eventBreakpoint, {1172 var eventBreakpointTreeElement = new WI.EventBreakpointTreeElement(WI.domDebuggerManager.allAnimationFramesBreakpoint, { 1138 1173 className: WI.DebuggerSidebarPanel.PausedBreakpointIconStyleClassName, 1139 title: WI.UIString(" %s Fired").format(pauseData.eventName),1174 title: WI.UIString("requestAnimationFrame Fired"), 1140 1175 }); 1141 1176 this._pauseReasonTreeOutline.appendChild(eventBreakpointTreeElement); … … 1254 1289 break; 1255 1290 1291 case WI.DebuggerManager.PauseReason.Listener: 1256 1292 case WI.DebuggerManager.PauseReason.EventListener: 1257 1293 console.assert(pauseData, "Expected data with an event listener, but found none."); … … 1263 1299 eventBreakpoint = WI.domManager.breakpointForEventListenerId(pauseData.eventListenerId); 1264 1300 if (!eventBreakpoint) 1265 eventBreakpoint = WI.domDebuggerManager. eventBreakpointForTypeAndEventName(WI.EventBreakpoint.Type.Listener,pauseData.eventName);1301 eventBreakpoint = WI.domDebuggerManager.listenerBreakpointForEventName(pauseData.eventName); 1266 1302 1267 1303 console.assert(eventBreakpoint, "Expected Event Listener breakpoint for event name.", pauseData.eventName); … … 1309 1345 break; 1310 1346 1347 case WI.DebuggerManager.PauseReason.Interval: 1348 this._pauseReasonTreeOutline = this.createContentTreeOutline({suppressFiltering: true}); 1349 1350 var eventBreakpointTreeElement = new WI.EventBreakpointTreeElement(WI.domDebuggerManager.allIntervalsBreakpoint, { 1351 className: WI.DebuggerSidebarPanel.PausedBreakpointIconStyleClassName, 1352 title: WI.UIString("setInterval Fired"), 1353 }); 1354 this._pauseReasonTreeOutline.appendChild(eventBreakpointTreeElement); 1355 1356 var eventBreakpointRow = new WI.DetailsSectionRow; 1357 eventBreakpointRow.element.appendChild(this._pauseReasonTreeOutline.element); 1358 1359 this._pauseReasonGroup.rows = [eventBreakpointRow]; 1360 return true; 1361 1311 1362 case WI.DebuggerManager.PauseReason.PauseOnNextStatement: 1312 1363 this._pauseReasonTextRow.text = WI.UIString("Immediate Pause Requested"); … … 1319 1370 return false; 1320 1371 1321 var eventBreakpoint = WI.domDebuggerManager.eventBreakpointForTypeAndEventName(WI.EventBreakpoint.Type.Timer, pauseData.eventName); 1372 var eventBreakpoint = null; 1373 switch (pauseData.eventName) { 1374 case "setTimeout": 1375 eventBreakpoint = WI.domDebuggerManager.allTimeoutsBreakpoint; 1376 break; 1377 1378 case "setInterval": 1379 eventBreakpoint = WI.domDebuggerManager.allIntervalsBreakpoint; 1380 break; 1381 } 1322 1382 console.assert(eventBreakpoint, "Expected Timer breakpoint for event name.", pauseData.eventName); 1323 1383 if (!eventBreakpoint) … … 1329 1389 className: WI.DebuggerSidebarPanel.PausedBreakpointIconStyleClassName, 1330 1390 title: WI.UIString("%s Fired").format(pauseData.eventName), 1391 }); 1392 this._pauseReasonTreeOutline.appendChild(eventBreakpointTreeElement); 1393 1394 var eventBreakpointRow = new WI.DetailsSectionRow; 1395 eventBreakpointRow.element.appendChild(this._pauseReasonTreeOutline.element); 1396 1397 this._pauseReasonGroup.rows = [eventBreakpointRow]; 1398 return true; 1399 1400 case WI.DebuggerManager.PauseReason.Timeout: 1401 this._pauseReasonTreeOutline = this.createContentTreeOutline({suppressFiltering: true}); 1402 1403 var eventBreakpointTreeElement = new WI.EventBreakpointTreeElement(WI.domDebuggerManager.allTimeoutsBreakpoint, { 1404 className: WI.DebuggerSidebarPanel.PausedBreakpointIconStyleClassName, 1405 title: WI.UIString("setTimeout Fired"), 1331 1406 }); 1332 1407 this._pauseReasonTreeOutline.appendChild(eventBreakpointTreeElement); … … 1457 1532 1458 1533 let setting = null; 1459 if (treeElement.breakpoint === WI.debuggerManager.assertionFailuresBreakpoint) 1534 switch (treeElement.representedObject) { 1535 case WI.debuggerManager.assertionFailuresBreakpoint: 1460 1536 setting = WI.settings.showAssertionFailuresBreakpoint; 1461 else if (treeElement.representedObject === WI.domDebuggerManager.allRequestsBreakpoint) 1537 break; 1538 1539 case WI.domDebuggerManager.allAnimationFramesBreakpoint: 1540 setting = WI.settings.showAllAnimationFramesBreakpoint; 1541 break; 1542 1543 case WI.domDebuggerManager.allIntervalsBreakpoint: 1544 setting = WI.settings.showAllIntervalsBreakpoint; 1545 break; 1546 1547 case WI.domDebuggerManager.allListenersBreakpoint: 1548 setting = WI.settings.showAllListenersBreakpoint; 1549 break; 1550 1551 case WI.domDebuggerManager.allRequestsBreakpoint: 1462 1552 setting = WI.settings.showAllRequestsBreakpoint; 1463 1553 break; 1554 1555 case WI.domDebuggerManager.allTimeoutsBreakpoint: 1556 setting = WI.settings.showAllTimeoutsBreakpoint; 1557 break; 1558 } 1464 1559 if (setting) 1465 1560 setting.value = !!treeElement.parent; … … 1482 1577 } 1483 1578 1484 if (WI.domDebuggerManager.supported) { 1579 if (WI.DOMDebuggerManager.supportsEventBreakpoints() || WI.DOMDebuggerManager.supportsEventListenerBreakpoints()) { 1580 function addToggleForSpecialEventBreakpoint(breakpoint, label, checked) { 1581 contextMenu.appendCheckboxItem(label, () => { 1582 if (checked) 1583 WI.domDebuggerManager.removeEventBreakpoint(breakpoint); 1584 else { 1585 breakpoint.disabled = false; 1586 WI.domDebuggerManager.addEventBreakpoint(breakpoint); 1587 } 1588 }, checked); 1589 } 1590 1485 1591 contextMenu.appendSeparator(); 1592 1593 addToggleForSpecialEventBreakpoint(WI.domDebuggerManager.allAnimationFramesBreakpoint, WI.UIString("All Animation Frames"), WI.settings.showAllAnimationFramesBreakpoint.value); 1594 addToggleForSpecialEventBreakpoint(WI.domDebuggerManager.allTimeoutsBreakpoint, WI.UIString("All Timeouts"), WI.settings.showAllTimeoutsBreakpoint.value); 1595 addToggleForSpecialEventBreakpoint(WI.domDebuggerManager.allIntervalsBreakpoint, WI.UIString("All Intervals"), WI.settings.showAllIntervalsBreakpoint.value); 1596 1597 contextMenu.appendSeparator(); 1598 1599 if (WI.DOMDebuggerManager.supportsAllListenersBreakpoint()) 1600 addToggleForSpecialEventBreakpoint(WI.domDebuggerManager.allListenersBreakpoint, WI.UIString("All Events"), WI.settings.showAllListenersBreakpoint.value); 1486 1601 1487 1602 contextMenu.appendItem(WI.UIString("Event Breakpoint\u2026"), () => { … … 1491 1606 1492 1607 contextMenu.appendSeparator(); 1493 1608 } 1609 1610 if (WI.DOMDebuggerManager.supportsURLBreakpoints() || WI.DOMDebuggerManager.supportsXHRBreakpoints()) { 1494 1611 let allRequestsBreakpointShown = WI.settings.showAllRequestsBreakpoint.value; 1495 1496 1612 contextMenu.appendCheckboxItem(WI.repeatedUIString.allRequests(), () => { 1497 1613 if (allRequestsBreakpointShown) … … 1519 1635 WI.DebuggerSidebarPanel.SelectedUncaughtExceptionsCookieKey = "debugger-sidebar-panel-uncaught-exceptions-breakpoint"; 1520 1636 WI.DebuggerSidebarPanel.SelectedAssertionFailuresCookieKey = "debugger-sidebar-panel-assertion-failures-breakpoint"; 1637 WI.DebuggerSidebarPanel.SelectedAllAnimationFramesBreakpoint = "debugger-sidebar-panel-all-animation-frames-breakpoint"; 1638 WI.DebuggerSidebarPanel.SelectedAllIntervalsBreakpoint = "debugger-sidebar-panel-all-intervals-breakpoint"; 1639 WI.DebuggerSidebarPanel.SelectedAllListenersBreakpoint = "debugger-sidebar-panel-all-listeners-breakpoint"; 1640 WI.DebuggerSidebarPanel.SelectedAllTimeoutsBreakpoint = "debugger-sidebar-panel-all-timeouts-breakpoint"; 1521 1641 WI.DebuggerSidebarPanel.SelectedAllRequestsCookieKey = "debugger-sidebar-panel-all-requests-breakpoint"; -
trunk/Source/WebInspectorUI/UserInterface/Views/EventBreakpointPopover.css
r239953 r248201 29 29 } 30 30 31 .popover .event-breakpoint-content > .event-type { 32 display: flex; 31 .popover .event-breakpoint-content > input { 33 32 margin-top: 4px; 34 }35 36 .popover .event-breakpoint-content > .event-type > input {37 33 font-family: Menlo, monospace; 38 34 text-align: left; 39 35 } 40 36 41 .popover .event-breakpoint-content > .event-type >input::placeholder {37 .popover .event-breakpoint-content > input::placeholder { 42 38 font-family: system-ui; 43 39 } -
trunk/Source/WebInspectorUI/UserInterface/Views/EventBreakpointPopover.js
r239955 r248201 57 57 label.textContent = WI.UIString("Break on events with name:"); 58 58 59 let typeContainer = contentElement.appendChild(document.createElement("div")); 60 typeContainer.classList.add("event-type"); 61 62 this._typeSelectElement = typeContainer.appendChild(document.createElement("select")); 63 this._typeSelectElement.addEventListener("change", this._handleTypeSelectChange.bind(this)); 64 this._typeSelectElement.addEventListener("keydown", (event) => { 65 if (isEnterKey(event)) 66 this.dismiss(); 67 }); 68 69 let createOption = (text, value) => { 70 let optionElement = this._typeSelectElement.appendChild(document.createElement("option")); 71 optionElement.value = value; 72 optionElement.textContent = text; 73 }; 74 75 createOption(WI.UIString("DOM Event"), WI.EventBreakpoint.Type.Listener); 76 77 if (WI.DOMDebuggerManager.supportsEventBreakpoints()) { 78 createOption(WI.unlocalizedString("requestAnimationFrame"), "requestAnimationFrame"); 79 createOption(WI.unlocalizedString("setTimeout"), "setTimeout"); 80 createOption(WI.unlocalizedString("setInterval"), "setInterval"); 81 } else 82 this._typeSelectElement.hidden = true; 83 84 this._domEventNameInputElement = typeContainer.appendChild(document.createElement("input")); 59 this._domEventNameInputElement = contentElement.appendChild(document.createElement("input")); 85 60 this._domEventNameInputElement.setAttribute("dir", "ltr"); 86 61 this._domEventNameInputElement.placeholder = WI.UIString("Example: \u201C%s\u201D").format("click"); … … 126 101 this._presentOverTargetElement(); 127 102 128 this._typeSelectElement.value = WI.EventBreakpoint.Type.Listener;129 103 this._domEventNameInputElement.select(); 130 104 } … … 132 106 dismiss() 133 107 { 134 let type = this._typeSelectElement.value; 135 let value = null; 136 137 if (type === WI.EventBreakpoint.Type.Listener) 138 value = this._domEventNameInputElement.value; 139 else { 140 value = type; 141 142 if (value === "requestAnimationFrame") 143 type = WI.EventBreakpoint.Type.AnimationFrame; 144 else if (value === "setTimeout" || value === "setInterval") 145 type = WI.EventBreakpoint.Type.Timer; 146 } 147 148 if (type && value) 149 this._breakpoint = new WI.EventBreakpoint(type, value); 108 this._breakpoint = new WI.EventBreakpoint(WI.EventBreakpoint.Type.Listener, {eventName: this._domEventNameInputElement.value}); 150 109 151 110 super.dismiss(); … … 174 133 } 175 134 176 _handleTypeSelectChange(event)177 {178 let listenerTypeSelected = this._typeSelectElement.value === WI.EventBreakpoint.Type.Listener;179 this._domEventNameInputElement.hidden = !listenerTypeSelected;180 181 this.update();182 183 if (listenerTypeSelected) {184 this._domEventNameInputElement.focus();185 186 if (this._domEventNameInputElement.value)187 this._showSuggestionsView();188 } else189 this._suggestionsView.hide();190 }191 192 135 _showSuggestionsView() 193 136 { -
trunk/Source/WebInspectorUI/UserInterface/Views/EventBreakpointTreeElement.css
r235248 r248201 28 28 } 29 29 30 .breakpoint.event.breakpoint-for-interval:not(.breakpoint-paused-icon) .icon { 31 content: url(../Images/EventBreakpointInterval.svg); 32 } 33 30 34 .breakpoint.event.breakpoint-for-listener:not(.breakpoint-paused-icon) .icon { 31 35 content: url(../Images/EventBreakpointListener.svg); 32 36 } 33 37 34 .breakpoint.event.breakpoint-for-time r:not(.breakpoint-paused-icon) .icon {35 content: url(../Images/EventBreakpointTime r.svg);38 .breakpoint.event.breakpoint-for-timeout:not(.breakpoint-paused-icon) .icon { 39 content: url(../Images/EventBreakpointTimeout.svg); 36 40 } -
trunk/Source/WebInspectorUI/UserInterface/Views/SourcesNavigationSidebarPanel.js
r248094 r248201 317 317 318 318 if (WI.domDebuggerManager.supported) { 319 if (WI.settings.showAllAnimationFramesBreakpoint.value) 320 WI.domDebuggerManager.addEventBreakpoint(WI.domDebuggerManager.allAnimationFramesBreakpoint); 321 322 if (WI.settings.showAllTimeoutsBreakpoint.value) 323 WI.domDebuggerManager.addEventBreakpoint(WI.domDebuggerManager.allTimeoutsBreakpoint); 324 325 if (WI.settings.showAllIntervalsBreakpoint.value) 326 WI.domDebuggerManager.addEventBreakpoint(WI.domDebuggerManager.allIntervalsBreakpoint); 327 328 if (WI.settings.showAllListenersBreakpoint.value) 329 WI.domDebuggerManager.addEventBreakpoint(WI.domDebuggerManager.allListenersBreakpoint); 330 331 for (let eventBreakpoint of WI.domDebuggerManager.listenerBreakpoints) 332 this._addBreakpoint(eventBreakpoint); 333 334 for (let eventListenerBreakpoint of WI.domManager.eventListenerBreakpoints) 335 this._addBreakpoint(eventListenerBreakpoint); 336 337 for (let domBreakpoint of WI.domDebuggerManager.domBreakpoints) 338 this._addBreakpoint(domBreakpoint); 339 319 340 if (WI.settings.showAllRequestsBreakpoint.value) 320 341 WI.domDebuggerManager.addURLBreakpoint(WI.domDebuggerManager.allRequestsBreakpoint); 321 322 for (let eventBreakpoint of WI.domDebuggerManager.eventBreakpoints)323 this._addBreakpoint(eventBreakpoint);324 325 for (let domBreakpoint of WI.domDebuggerManager.domBreakpoints)326 this._addBreakpoint(domBreakpoint);327 328 for (let eventListenerBreakpoint of WI.domManager.eventListenerBreakpoints)329 this._addBreakpoint(eventListenerBreakpoint);330 342 331 343 for (let urlBreakpoints of WI.domDebuggerManager.urlBreakpoints) … … 855 867 (treeElement) => treeElement.representedObject === WI.debuggerManager.assertionFailuresBreakpoint, 856 868 (treeElement) => treeElement instanceof WI.BreakpointTreeElement || treeElement instanceof WI.ResourceTreeElement || treeElement instanceof WI.ScriptTreeElement, 869 (treeElement) => treeElement.representedObject === WI.domDebuggerManager.allAnimationFramesBreakpoint, 870 (treeElement) => treeElement.representedObject === WI.domDebuggerManager.allTimeoutsBreakpoint, 871 (treeElement) => treeElement.representedObject === WI.domDebuggerManager.allIntervalsBreakpoint, 872 (treeElement) => treeElement.representedObject === WI.domDebuggerManager.allListenersBreakpoint, 857 873 (treeElement) => treeElement instanceof WI.EventBreakpointTreeElement, 858 874 (treeElement) => treeElement instanceof WI.DOMNodeTreeElement, … … 936 952 constructor = WI.EventBreakpointTreeElement; 937 953 938 if (breakpoint.eventListener) { 954 if (breakpoint === WI.domDebuggerManager.allAnimationFramesBreakpoint) 955 options.title = WI.UIString("All Animation Frames"); 956 else if (breakpoint === WI.domDebuggerManager.allIntervalsBreakpoint) 957 options.title = WI.UIString("All Intervals"); 958 else if (breakpoint === WI.domDebuggerManager.allListenersBreakpoint) 959 options.title = WI.UIString("All Events"); 960 else if (breakpoint === WI.domDebuggerManager.allTimeoutsBreakpoint) 961 options.title = WI.UIString("All Timeouts"); 962 else if (breakpoint.eventListener) { 939 963 let eventTargetTreeElement = null; 940 964 if (breakpoint.eventListener.onWindow) { … … 1137 1161 switch (pauseReason) { 1138 1162 case WI.DebuggerManager.PauseReason.AnimationFrame: { 1139 console.assert(pauseData, "Expected data with an animation frame, but found none.");1140 if (!pauseData)1141 break;1142 1143 let eventBreakpoint = WI.domDebuggerManager.eventBreakpointForTypeAndEventName(WI.EventBreakpoint.Type.AnimationFrame, pauseData.eventName);1144 console.assert(eventBreakpoint, "Expected AnimationFrame breakpoint for event name.", pauseData.eventName);1145 if (!eventBreakpoint)1146 break;1147 1148 1163 this._pauseReasonTreeOutline = this.createContentTreeOutline({suppressFiltering: true}); 1149 1164 1150 let eventBreakpointTreeElement = new WI.EventBreakpointTreeElement( eventBreakpoint, {1165 let eventBreakpointTreeElement = new WI.EventBreakpointTreeElement(WI.domDebuggerManager.allAnimationFramesBreakpoint, { 1151 1166 className: "breakpoint-paused-icon", 1152 title: WI.UIString(" %s Fired").format(pauseData.eventName),1167 title: WI.UIString("requestAnimationFrame Fired"), 1153 1168 }); 1154 1169 this._pauseReasonTreeOutline.appendChild(eventBreakpointTreeElement); … … 1269 1284 } 1270 1285 1286 case WI.DebuggerManager.PauseReason.Listener: 1271 1287 case WI.DebuggerManager.PauseReason.EventListener: { 1272 1288 console.assert(pauseData, "Expected data with an event listener, but found none."); … … 1278 1294 eventBreakpoint = WI.domManager.breakpointForEventListenerId(pauseData.eventListenerId); 1279 1295 if (!eventBreakpoint) 1280 eventBreakpoint = WI.domDebuggerManager. eventBreakpointForTypeAndEventName(WI.EventBreakpoint.Type.Listener,pauseData.eventName);1296 eventBreakpoint = WI.domDebuggerManager.listenerBreakpointForEventName(pauseData.eventName); 1281 1297 1282 1298 console.assert(eventBreakpoint, "Expected Event Listener breakpoint for event name.", pauseData.eventName); … … 1326 1342 } 1327 1343 1344 case WI.DebuggerManager.PauseReason.Interval: { 1345 this._pauseReasonTreeOutline = this.createContentTreeOutline({suppressFiltering: true}); 1346 1347 let eventBreakpointTreeElement = new WI.EventBreakpointTreeElement(WI.domDebuggerManager.allIntervalsBreakpoint, { 1348 className: "breakpoint-paused-icon", 1349 title: WI.UIString("setInterval Fired"), 1350 }); 1351 this._pauseReasonTreeOutline.appendChild(eventBreakpointTreeElement); 1352 1353 let eventBreakpointRow = new WI.DetailsSectionRow; 1354 eventBreakpointRow.element.appendChild(this._pauseReasonTreeOutline.element); 1355 1356 this._pauseReasonGroup.rows = [eventBreakpointRow]; 1357 return true; 1358 } 1359 1328 1360 case WI.DebuggerManager.PauseReason.PauseOnNextStatement: 1329 1361 this._pauseReasonTextRow.text = WI.UIString("Immediate Pause Requested"); … … 1336 1368 break; 1337 1369 1338 let eventBreakpoint = WI.domDebuggerManager.eventBreakpointForTypeAndEventName(WI.EventBreakpoint.Type.Timer, pauseData.eventName); 1370 let eventBreakpoint = null; 1371 switch (pauseData.eventName) { 1372 case "setTimeout": 1373 eventBreakpoint = WI.domDebuggerManager.allTimeoutsBreakpoint; 1374 break; 1375 1376 case "setInterval": 1377 eventBreakpoint = WI.domDebuggerManager.allIntervalsBreakpoint; 1378 break; 1379 } 1339 1380 console.assert(eventBreakpoint, "Expected Timer breakpoint for event name.", pauseData.eventName); 1340 1381 if (!eventBreakpoint) … … 1346 1387 className: "breakpoint-paused-icon", 1347 1388 title: WI.UIString("%s Fired").format(pauseData.eventName), 1389 }); 1390 this._pauseReasonTreeOutline.appendChild(eventBreakpointTreeElement); 1391 1392 let eventBreakpointRow = new WI.DetailsSectionRow; 1393 eventBreakpointRow.element.appendChild(this._pauseReasonTreeOutline.element); 1394 1395 this._pauseReasonGroup.rows = [eventBreakpointRow]; 1396 return true; 1397 } 1398 1399 case WI.DebuggerManager.PauseReason.Timeout: { 1400 this._pauseReasonTreeOutline = this.createContentTreeOutline({suppressFiltering: true}); 1401 1402 let eventBreakpointTreeElement = new WI.EventBreakpointTreeElement(WI.domDebuggerManager.allTimeoutsBreakpoint, { 1403 className: "breakpoint-paused-icon", 1404 title: WI.UIString("setTimeout Fired"), 1348 1405 }); 1349 1406 this._pauseReasonTreeOutline.appendChild(eventBreakpointTreeElement); … … 1494 1551 1495 1552 let setting = null; 1496 if (treeElement.breakpoint === WI.debuggerManager.assertionFailuresBreakpoint) 1553 switch (treeElement.representedObject) { 1554 case WI.debuggerManager.assertionFailuresBreakpoint: 1497 1555 setting = WI.settings.showAssertionFailuresBreakpoint; 1498 else if (treeElement.representedObject === WI.domDebuggerManager.allRequestsBreakpoint) 1556 break; 1557 1558 case WI.domDebuggerManager.allAnimationFramesBreakpoint: 1559 setting = WI.settings.showAllAnimationFramesBreakpoint; 1560 break; 1561 1562 case WI.domDebuggerManager.allIntervalsBreakpoint: 1563 setting = WI.settings.showAllIntervalsBreakpoint; 1564 break; 1565 1566 case WI.domDebuggerManager.allListenersBreakpoint: 1567 setting = WI.settings.showAllListenersBreakpoint; 1568 break; 1569 1570 case WI.domDebuggerManager.allRequestsBreakpoint: 1499 1571 setting = WI.settings.showAllRequestsBreakpoint; 1572 break; 1573 1574 case WI.domDebuggerManager.allTimeoutsBreakpoint: 1575 setting = WI.settings.showAllTimeoutsBreakpoint; 1576 break; 1577 } 1500 1578 1501 1579 if (setting) … … 1524 1602 } 1525 1603 1526 if (WI.domDebuggerManager.supported) { 1604 if (WI.DOMDebuggerManager.supportsEventBreakpoints() || WI.DOMDebuggerManager.supportsEventListenerBreakpoints()) { 1605 function addToggleForSpecialEventBreakpoint(breakpoint, label, checked) { 1606 contextMenu.appendCheckboxItem(label, () => { 1607 if (checked) 1608 WI.domDebuggerManager.removeEventBreakpoint(breakpoint); 1609 else { 1610 breakpoint.disabled = false; 1611 WI.domDebuggerManager.addEventBreakpoint(breakpoint); 1612 } 1613 }, checked); 1614 } 1615 1527 1616 contextMenu.appendSeparator(); 1617 1618 addToggleForSpecialEventBreakpoint(WI.domDebuggerManager.allAnimationFramesBreakpoint, WI.UIString("All Animation Frames"), WI.settings.showAllAnimationFramesBreakpoint.value); 1619 addToggleForSpecialEventBreakpoint(WI.domDebuggerManager.allTimeoutsBreakpoint, WI.UIString("All Timeouts"), WI.settings.showAllTimeoutsBreakpoint.value); 1620 addToggleForSpecialEventBreakpoint(WI.domDebuggerManager.allIntervalsBreakpoint, WI.UIString("All Intervals"), WI.settings.showAllIntervalsBreakpoint.value); 1621 1622 contextMenu.appendSeparator(); 1623 1624 if (WI.DOMDebuggerManager.supportsAllListenersBreakpoint()) 1625 addToggleForSpecialEventBreakpoint(WI.domDebuggerManager.allListenersBreakpoint, WI.UIString("All Events"), WI.settings.showAllListenersBreakpoint.value); 1528 1626 1529 1627 contextMenu.appendItem(WI.UIString("Event Breakpoint\u2026"), () => { … … 1533 1631 1534 1632 contextMenu.appendSeparator(); 1535 1633 } 1634 1635 if (WI.DOMDebuggerManager.supportsURLBreakpoints() || WI.DOMDebuggerManager.supportsXHRBreakpoints()) { 1536 1636 let allRequestsBreakpointShown = WI.settings.showAllRequestsBreakpoint.value; 1537 1538 1637 contextMenu.appendCheckboxItem(WI.repeatedUIString.allRequests(), () => { 1539 1638 if (allRequestsBreakpointShown) … … 1545 1644 }, allRequestsBreakpointShown); 1546 1645 1547 contextMenu.appendItem(WI. UIString("URLBreakpoint\u2026"), () => {1646 contextMenu.appendItem(WI.DOMDebuggerManager.supportsURLBreakpoints() ? WI.UIString("URL Breakpoint\u2026") : WI.UIString("XHR Breakpoint\u2026"), () => { 1548 1647 let popover = new WI.URLBreakpointPopover(this); 1549 1648 popover.show(this._createBreakpointButton.element, [WI.RectEdge.MAX_Y, WI.RectEdge.MIN_Y, WI.RectEdge.MAX_X]);
Note: See TracChangeset
for help on using the changeset viewer.