haikuwebkit/LayoutTests/inspector/dom-debugger/event-listener-breakpoints....

252 lines
9.9 KiB
HTML
Raw Permalink Normal View History

Web Inspector: support breakpoints for timers and animation-frame events https://bugs.webkit.org/show_bug.cgi?id=188778 Reviewed by Brian Burg. Source/JavaScriptCore: * inspector/protocol/Debugger.json: Add `AnimationFrame` and `Timer` types to the list of pause reasons. * inspector/protocol/DOMDebugger.json: Introduced `setEventBreakpoint` and `removeEventBreakpoint` to replace the more specific: - `setEventListenerBreakpoint` - `removeEventListenerBreakpoint` - `setInstrumentationBreakpoint` - `removeInstrumentationBreakpoint` Also created an `EventBreakpointType` to enumerate the available types of event breakpoints. * inspector/scripts/codegen/generate_cpp_protocol_types_header.py: (CppProtocolTypesHeaderGenerator.generate_output): (CppProtocolTypesHeaderGenerator._generate_forward_declarations_for_binding_traits): (CppProtocolTypesHeaderGenerator._generate_declarations_for_enum_conversion_methods): (CppProtocolTypesHeaderGenerator._generate_hash_declarations): Added. Generate `DefaultHash` for all `enum class` used by inspector protocols. * inspector/scripts/tests/generic/expected/commands-with-async-attribute.json-result: * inspector/scripts/tests/generic/expected/commands-with-optional-call-return-parameters.json-result: * inspector/scripts/tests/generic/expected/enum-values.json-result: * inspector/scripts/tests/generic/expected/type-declaration-array-type.json-result: * inspector/scripts/tests/generic/expected/type-declaration-enum-type.json-result: * inspector/scripts/tests/generic/expected/type-declaration-object-type.json-result: * inspector/scripts/tests/generic/expected/type-requiring-runtime-casts.json-result: Source/WebCore: The original implementation of "instrumentation" breakpoints relied upon the frontend sending somewhat arbitrary strings when enabling breakpoints for specific events. As an example, setting a breakpoint for `requestAnimationFrame` expects `"animationFrameFired"` as the string, which doesn't make much sense. This patch removes the usage of these strings and instead expects the agent to implement a method that matches what is happening. Tests: inspector/dom-debugger/event-animation-frame-breakpoints.html inspector/dom-debugger/event-listener-breakpoints.html inspector/dom-debugger/event-timer-breakpoints.html * inspector/InspectorInstrumentation.h: (WebCore::InspectorInstrumentation::willFireTimer): * inspector/InspectorInstrumentation.cpp: (WebCore::InspectorInstrumentation::didInstallTimerImpl): (WebCore::InspectorInstrumentation::didRemoveTimerImpl): (WebCore::InspectorInstrumentation::willFireTimerImpl): (WebCore::InspectorInstrumentation::didRequestAnimationFrameImpl): (WebCore::InspectorInstrumentation::didCancelAnimationFrameImpl): (WebCore::InspectorInstrumentation::willFireAnimationFrameImpl): (WebCore::InspectorInstrumentation::pauseOnNativeEventIfNeeded): Deleted. * inspector/agents/InspectorDOMDebuggerAgent.h: * inspector/agents/InspectorDOMDebuggerAgent.cpp: (WebCore::InspectorDOMDebuggerAgent::setEventBreakpoint): Added. (WebCore::InspectorDOMDebuggerAgent::removeEventBreakpoint): Added. (WebCore::InspectorDOMDebuggerAgent::willHandleEvent): (WebCore::InspectorDOMDebuggerAgent::willFireTimer): Added. (WebCore::InspectorDOMDebuggerAgent::willFireAnimationFrame): Added. (WebCore::InspectorDOMDebuggerAgent::setEventListenerBreakpoint): Deleted. (WebCore::InspectorDOMDebuggerAgent::setInstrumentationBreakpoint): Deleted. (WebCore::InspectorDOMDebuggerAgent::setBreakpoint): Deleted. (WebCore::InspectorDOMDebuggerAgent::removeEventListenerBreakpoint): Deleted. (WebCore::InspectorDOMDebuggerAgent::removeInstrumentationBreakpoint): Deleted. (WebCore::InspectorDOMDebuggerAgent::removeBreakpoint): Deleted. (WebCore::InspectorDOMDebuggerAgent::pauseOnNativeEventIfNeeded): Deleted. Unify the event listener and instrumentation breakpoint commands into a single method, `setEventBreakpoint`, that takes in both an `EventBreakpointType` and `eventName`. * page/DOMTimer.cpp: (WebCore::DOMTimer::fired): Source/WebInspectorUI: Add a `type` to `WI.EventBreakpoint` that matches `DOMDebugger.EventBreakpointType`: - `AnimationFrame` for `requestAnimationFrame` - `Listener` for any named DOM Event - `Timer` for `setTimeout` and `setInterval` Modified `WI.EventBreakpointPopover` to provide ways for selecting these other types, which is then passed to `WI.DOMDebuggerManager`, which now calls through to the newly added `DOMDebugger.removeEventBreakpoint` and `DOMDebugger.setEventBreakpoint` that sets breakpoints for all event types. * Localizations/en.lproj/localizedStrings.js: * UserInterface/Images/EventBreakpointAnimationFrame.svg: Added. * UserInterface/Images/EventBreakpointListener.svg: Renamed from Source/WebInspectorUI/UserInterface/Images/EventBreakpoint.svg. * UserInterface/Images/EventBreakpointTimer.svg: Added. * UserInterface/Controllers/DOMDebuggerManager.js: (WI.DOMDebuggerManager.supportsEventBreakpoints): Added. (WI.DOMDebuggerManager.prototype.eventBreakpointForTypeAndEventName): Added. (WI.DOMDebuggerManager.prototype.addEventBreakpoint): (WI.DOMDebuggerManager.prototype.removeEventBreakpoint.breakpointRemoved): Added. (WI.DOMDebuggerManager.prototype.removeEventBreakpoint): (WI.DOMDebuggerManager.prototype._updateEventBreakpoint): (WI.DOMDebuggerManager.prototype.eventBreakpointForEventName): Deleted. * UserInterface/Controllers/DOMTreeManager.js: (WI.DOMTreeManager.prototype.setBreakpointForEventListener): * UserInterface/Controllers/DebuggerManager.js: (WI.DebuggerManager.prototype._pauseReasonFromPayload): * UserInterface/Models/EventBreakpoint.js: (WI.EventBreakpoint): (WI.EventBreakpoint.fromPayload): (WI.EventBreakpoint.prototype.get type): Added. (WI.EventBreakpoint.prototype.get serializableInfo): (WI.EventBreakpoint.prototype.saveIdentityToCookie): * UserInterface/Views/DebuggerSidebarPanel.js: (WI.DebuggerSidebarPanel.prototype._updatePauseReasonSection): (WI.DebuggerSidebarPanel.prototype.willDismissPopover): * UserInterface/Views/EventBreakpointPopover.js: (WI.EventBreakpointPopover): (WI.EventBreakpointPopover.prototype.get breakpoint): Added. (WI.EventBreakpointPopover.prototype.show): (WI.EventBreakpointPopover.prototype.show.createOption): Added. (WI.EventBreakpointPopover.prototype.dismiss): Added. (WI.EventBreakpointPopover.prototype._presentOverTargetElement): (WI.EventBreakpointPopover.prototype._handleTypeSelectChange): Added. (WI.EventBreakpointPopover.prototype.get result): Deleted. (WI.EventBreakpointPopover.prototype.get value): Deleted. * UserInterface/Views/EventBreakpointPopover.css: (.popover .event-breakpoint-content > .event-type): Added. (.popover .event-breakpoint-content > input): Deleted. * UserInterface/Views/EventBreakpointTreeElement.js: (WI.EventBreakpointTreeElement): * UserInterface/Views/EventBreakpointTreeElement.css: (.breakpoint.event.animation-frame:not(.breakpoint-paused-icon) .icon): Added. (.breakpoint.event.listener:not(.breakpoint-paused-icon) .icon): Added. (.breakpoint.event.timer:not(.breakpoint-paused-icon) .icon): Added. (.breakpoint.event:not(.breakpoint-paused-icon) .icon): Deleted. LayoutTests: * inspector/dom-debugger/event-animation-frame-breakpoints-expected.txt: Added. * inspector/dom-debugger/event-animation-frame-breakpoints.html: Added. * inspector/dom-debugger/event-breakpoint-with-navigation.html: * inspector/dom-debugger/event-timer-breakpoints-expected.txt: Added. * inspector/dom-debugger/event-timer-breakpoints.html: Added. * inspector/dom-debugger/event-listener-breakpoints-expected.txt: Renamed from LayoutTests/inspector/dom-debugger/event-breakpoints-expected.txt. * inspector/dom-debugger/event-listener-breakpoints.html: Renamed from LayoutTests/inspector/dom-debugger/event-breakpoints.html. * inspector/dom-debugger/resources/event-breakpoint-utilities.js: Added. (TestPage.registerInitializer.window.teardown): (TestPage.registerInitializer.window.failOnPause): (TestPage.registerInitializer.window.addBreakpoint): (TestPage.registerInitializer.window.removeBreakpoint): (TestPage.registerInitializer.window.disableBreakpoint): (TestPage.registerInitializer.window.awaitEvent): Canonical link: https://commits.webkit.org/203952@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@235248 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2018-08-23 21:36:40 +00:00
<!doctype html>
<html>
<head>
<script src="../../http/tests/inspector/resources/inspector-test.js"></script>
Web Inspector: allow url breakpoints to be configured https://bugs.webkit.org/show_bug.cgi?id=215793 Reviewed by Brian Burg. Source/JavaScriptCore: * inspector/protocol/DOMDebugger.json: Add an `options` parameter to `DOMDebugger.setURLBreakpoint` to allow configuration. Add an `isRegex` parameter to `DOMDebugger.removeURLBreakpoint` so that we know what type of URL breakpoint is being removed. Source/WebCore: Tests: inspector/dom-debugger/url-breakpoints.html inspector/dom-debugger/url-breakpoints-all-requests.html inspector/dom-debugger/url-breakpoints-containing.html inspector/dom-debugger/url-breakpoints-matching.html * inspector/agents/InspectorDOMDebuggerAgent.h: * inspector/agents/InspectorDOMDebuggerAgent.cpp: (WebCore::InspectorDOMDebuggerAgent::disable): (WebCore::InspectorDOMDebuggerAgent::setURLBreakpoint): (WebCore::InspectorDOMDebuggerAgent::removeURLBreakpoint): (WebCore::InspectorDOMDebuggerAgent::breakOnURLIfNeeded): Source/WebInspectorUI: * UserInterface/Models/URLBreakpoint.js: (WI.URLBreakpoint.get editable): Added. (WI.URLBreakpoint.fromJSON): (WI.URLBreakpoint.prototype.get editable): * UserInterface/Controllers/DOMDebuggerManager.js: (WI.DOMDebuggerManager): (WI.DOMDebuggerManager.prototype.initializeTarget): (WI.DOMDebuggerManager.prototype.addURLBreakpoint): (WI.DOMDebuggerManager.prototype.removeURLBreakpoint): (WI.DOMDebuggerManager.prototype._setURLBreakpoint): Added. (WI.DOMDebuggerManager.prototype._removeURLBreakpoint): Added. (WI.DOMDebuggerManager.prototype._handleURLBreakpointDisabledStateChanged): (WI.DOMDebuggerManager.prototype._handleURLBreakpointEditablePropertyChanged): Added. (WI.DOMDebuggerManager.prototype._handleURLBreakpointActionsChanged): Added. (WI.DOMDebuggerManager.prototype._updateURLBreakpoint): Deleted. * UserInterface/Views/SourcesNavigationSidebarPanel.js: (WI.SourcesNavigationSidebarPanel): (WI.SourcesNavigationSidebarPanel.prototype._populateCreateBreakpointContextMenu): (WI.SourcesNavigationSidebarPanel.prototype._populateCreateBreakpointContextMenu.addToggleForSpecialBreakpoint): Added. (WI.SourcesNavigationSidebarPanel.prototype._populateCreateBreakpointContextMenu.addToggleForSpecialEventBreakpoint): Deleted. * UserInterface/Views/URLBreakpointPopover.js: (WI.URLBreakpointPopover.get editable): * UserInterface/Base/Setting.js: LayoutTests: * inspector/debugger/resources/breakpoint-options-utilities.js: (TestPage.registerInitializer.InspectorTest.BreakpointOptions.addTestCases): * inspector/dom-debugger/resources/url-breakpoint-utilities.js: Added. (TestPage.registerInitializer.InspectorTest.URLBreakpoint.teardown): (TestPage.registerInitializer.InspectorTest.URLBreakpoint.createBreakpoint): (TestPage.registerInitializer.InspectorTest.URLBreakpoint.addBreakpoint): (TestPage.registerInitializer.InspectorTest.URLBreakpoint.request): * inspector/dom-debugger/url-breakpoints.html: * inspector/dom-debugger/url-breakpoints-expected.txt: * inspector/dom-debugger/url-breakpoints-all-requests.html: Added. * inspector/dom-debugger/url-breakpoints-all-requests-expected.txt: Added. * inspector/dom-debugger/url-breakpoints-containing.html: Added. * inspector/dom-debugger/url-breakpoints-containing-expected.txt: Added. * inspector/dom-debugger/url-breakpoints-matching.html: Added. * inspector/dom-debugger/url-breakpoints-matching-expected.txt: Added. Split the one URL breakpoint test into four so they run quicker. * inspector/dom-debugger/resources/event-breakpoint-utilities.js: (TestPage.registerInitializer.InspectorTest.EventBreakpoint.addBreakpointOptionsTestCases): Deleted. * inspector/dom-debugger/event-animation-frame-breakpoints.html: * inspector/dom-debugger/event-animation-frame-breakpoints-expected.txt: * inspector/dom-debugger/event-interval-breakpoints.html: * inspector/dom-debugger/event-interval-breakpoints-expected.txt: * inspector/dom-debugger/event-listener-breakpoints.html: * inspector/dom-debugger/event-listener-breakpoints-expected.txt: * inspector/dom-debugger/event-timeout-breakpoints.html: * inspector/dom-debugger/event-timeout-breakpoints-expected.txt: Use `InspectorTest.BreakpointOptions.addTestCases` instead of duplicating the logic. Canonical link: https://commits.webkit.org/228940@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@266538 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2020-09-03 20:07:39 +00:00
<script src="../debugger/resources/breakpoint-options-utilities.js"></script>
Web Inspector: support breakpoints for timers and animation-frame events https://bugs.webkit.org/show_bug.cgi?id=188778 Reviewed by Brian Burg. Source/JavaScriptCore: * inspector/protocol/Debugger.json: Add `AnimationFrame` and `Timer` types to the list of pause reasons. * inspector/protocol/DOMDebugger.json: Introduced `setEventBreakpoint` and `removeEventBreakpoint` to replace the more specific: - `setEventListenerBreakpoint` - `removeEventListenerBreakpoint` - `setInstrumentationBreakpoint` - `removeInstrumentationBreakpoint` Also created an `EventBreakpointType` to enumerate the available types of event breakpoints. * inspector/scripts/codegen/generate_cpp_protocol_types_header.py: (CppProtocolTypesHeaderGenerator.generate_output): (CppProtocolTypesHeaderGenerator._generate_forward_declarations_for_binding_traits): (CppProtocolTypesHeaderGenerator._generate_declarations_for_enum_conversion_methods): (CppProtocolTypesHeaderGenerator._generate_hash_declarations): Added. Generate `DefaultHash` for all `enum class` used by inspector protocols. * inspector/scripts/tests/generic/expected/commands-with-async-attribute.json-result: * inspector/scripts/tests/generic/expected/commands-with-optional-call-return-parameters.json-result: * inspector/scripts/tests/generic/expected/enum-values.json-result: * inspector/scripts/tests/generic/expected/type-declaration-array-type.json-result: * inspector/scripts/tests/generic/expected/type-declaration-enum-type.json-result: * inspector/scripts/tests/generic/expected/type-declaration-object-type.json-result: * inspector/scripts/tests/generic/expected/type-requiring-runtime-casts.json-result: Source/WebCore: The original implementation of "instrumentation" breakpoints relied upon the frontend sending somewhat arbitrary strings when enabling breakpoints for specific events. As an example, setting a breakpoint for `requestAnimationFrame` expects `"animationFrameFired"` as the string, which doesn't make much sense. This patch removes the usage of these strings and instead expects the agent to implement a method that matches what is happening. Tests: inspector/dom-debugger/event-animation-frame-breakpoints.html inspector/dom-debugger/event-listener-breakpoints.html inspector/dom-debugger/event-timer-breakpoints.html * inspector/InspectorInstrumentation.h: (WebCore::InspectorInstrumentation::willFireTimer): * inspector/InspectorInstrumentation.cpp: (WebCore::InspectorInstrumentation::didInstallTimerImpl): (WebCore::InspectorInstrumentation::didRemoveTimerImpl): (WebCore::InspectorInstrumentation::willFireTimerImpl): (WebCore::InspectorInstrumentation::didRequestAnimationFrameImpl): (WebCore::InspectorInstrumentation::didCancelAnimationFrameImpl): (WebCore::InspectorInstrumentation::willFireAnimationFrameImpl): (WebCore::InspectorInstrumentation::pauseOnNativeEventIfNeeded): Deleted. * inspector/agents/InspectorDOMDebuggerAgent.h: * inspector/agents/InspectorDOMDebuggerAgent.cpp: (WebCore::InspectorDOMDebuggerAgent::setEventBreakpoint): Added. (WebCore::InspectorDOMDebuggerAgent::removeEventBreakpoint): Added. (WebCore::InspectorDOMDebuggerAgent::willHandleEvent): (WebCore::InspectorDOMDebuggerAgent::willFireTimer): Added. (WebCore::InspectorDOMDebuggerAgent::willFireAnimationFrame): Added. (WebCore::InspectorDOMDebuggerAgent::setEventListenerBreakpoint): Deleted. (WebCore::InspectorDOMDebuggerAgent::setInstrumentationBreakpoint): Deleted. (WebCore::InspectorDOMDebuggerAgent::setBreakpoint): Deleted. (WebCore::InspectorDOMDebuggerAgent::removeEventListenerBreakpoint): Deleted. (WebCore::InspectorDOMDebuggerAgent::removeInstrumentationBreakpoint): Deleted. (WebCore::InspectorDOMDebuggerAgent::removeBreakpoint): Deleted. (WebCore::InspectorDOMDebuggerAgent::pauseOnNativeEventIfNeeded): Deleted. Unify the event listener and instrumentation breakpoint commands into a single method, `setEventBreakpoint`, that takes in both an `EventBreakpointType` and `eventName`. * page/DOMTimer.cpp: (WebCore::DOMTimer::fired): Source/WebInspectorUI: Add a `type` to `WI.EventBreakpoint` that matches `DOMDebugger.EventBreakpointType`: - `AnimationFrame` for `requestAnimationFrame` - `Listener` for any named DOM Event - `Timer` for `setTimeout` and `setInterval` Modified `WI.EventBreakpointPopover` to provide ways for selecting these other types, which is then passed to `WI.DOMDebuggerManager`, which now calls through to the newly added `DOMDebugger.removeEventBreakpoint` and `DOMDebugger.setEventBreakpoint` that sets breakpoints for all event types. * Localizations/en.lproj/localizedStrings.js: * UserInterface/Images/EventBreakpointAnimationFrame.svg: Added. * UserInterface/Images/EventBreakpointListener.svg: Renamed from Source/WebInspectorUI/UserInterface/Images/EventBreakpoint.svg. * UserInterface/Images/EventBreakpointTimer.svg: Added. * UserInterface/Controllers/DOMDebuggerManager.js: (WI.DOMDebuggerManager.supportsEventBreakpoints): Added. (WI.DOMDebuggerManager.prototype.eventBreakpointForTypeAndEventName): Added. (WI.DOMDebuggerManager.prototype.addEventBreakpoint): (WI.DOMDebuggerManager.prototype.removeEventBreakpoint.breakpointRemoved): Added. (WI.DOMDebuggerManager.prototype.removeEventBreakpoint): (WI.DOMDebuggerManager.prototype._updateEventBreakpoint): (WI.DOMDebuggerManager.prototype.eventBreakpointForEventName): Deleted. * UserInterface/Controllers/DOMTreeManager.js: (WI.DOMTreeManager.prototype.setBreakpointForEventListener): * UserInterface/Controllers/DebuggerManager.js: (WI.DebuggerManager.prototype._pauseReasonFromPayload): * UserInterface/Models/EventBreakpoint.js: (WI.EventBreakpoint): (WI.EventBreakpoint.fromPayload): (WI.EventBreakpoint.prototype.get type): Added. (WI.EventBreakpoint.prototype.get serializableInfo): (WI.EventBreakpoint.prototype.saveIdentityToCookie): * UserInterface/Views/DebuggerSidebarPanel.js: (WI.DebuggerSidebarPanel.prototype._updatePauseReasonSection): (WI.DebuggerSidebarPanel.prototype.willDismissPopover): * UserInterface/Views/EventBreakpointPopover.js: (WI.EventBreakpointPopover): (WI.EventBreakpointPopover.prototype.get breakpoint): Added. (WI.EventBreakpointPopover.prototype.show): (WI.EventBreakpointPopover.prototype.show.createOption): Added. (WI.EventBreakpointPopover.prototype.dismiss): Added. (WI.EventBreakpointPopover.prototype._presentOverTargetElement): (WI.EventBreakpointPopover.prototype._handleTypeSelectChange): Added. (WI.EventBreakpointPopover.prototype.get result): Deleted. (WI.EventBreakpointPopover.prototype.get value): Deleted. * UserInterface/Views/EventBreakpointPopover.css: (.popover .event-breakpoint-content > .event-type): Added. (.popover .event-breakpoint-content > input): Deleted. * UserInterface/Views/EventBreakpointTreeElement.js: (WI.EventBreakpointTreeElement): * UserInterface/Views/EventBreakpointTreeElement.css: (.breakpoint.event.animation-frame:not(.breakpoint-paused-icon) .icon): Added. (.breakpoint.event.listener:not(.breakpoint-paused-icon) .icon): Added. (.breakpoint.event.timer:not(.breakpoint-paused-icon) .icon): Added. (.breakpoint.event:not(.breakpoint-paused-icon) .icon): Deleted. LayoutTests: * inspector/dom-debugger/event-animation-frame-breakpoints-expected.txt: Added. * inspector/dom-debugger/event-animation-frame-breakpoints.html: Added. * inspector/dom-debugger/event-breakpoint-with-navigation.html: * inspector/dom-debugger/event-timer-breakpoints-expected.txt: Added. * inspector/dom-debugger/event-timer-breakpoints.html: Added. * inspector/dom-debugger/event-listener-breakpoints-expected.txt: Renamed from LayoutTests/inspector/dom-debugger/event-breakpoints-expected.txt. * inspector/dom-debugger/event-listener-breakpoints.html: Renamed from LayoutTests/inspector/dom-debugger/event-breakpoints.html. * inspector/dom-debugger/resources/event-breakpoint-utilities.js: Added. (TestPage.registerInitializer.window.teardown): (TestPage.registerInitializer.window.failOnPause): (TestPage.registerInitializer.window.addBreakpoint): (TestPage.registerInitializer.window.removeBreakpoint): (TestPage.registerInitializer.window.disableBreakpoint): (TestPage.registerInitializer.window.awaitEvent): Canonical link: https://commits.webkit.org/203952@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@235248 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2018-08-23 21:36:40 +00:00
<script src="../debugger/resources/log-active-stack-trace.js"></script>
<script src="resources/event-breakpoint-utilities.js"></script>
<script>
function handleBody_click(event) {
TestPage.dispatchEventToFrontend("TestPage-click");
}
function handleBody_custom(event) {
TestPage.dispatchEventToFrontend("TestPage-custom");
}
function handleX_click(event) {
}
function trigger_click() {
document.body.click();
}
function trigger_custom() {
document.body.dispatchEvent(new Event("custom"));
}
function clickX() {
document.getElementById("x").click();
}
function test() {
let suite = InspectorTest.createAsyncSuite("DOMDebugger.Event.Listener");
function addTestCasesForEventName(eventName) {
suite.addTestCase({
name: `DOMDebugger.Event.Listener.AddBreakpoint "${eventName}"`,
description: "Check that the debugger pauses for enabled breakpoints.",
test(resolve, reject) {
let paused = false;
let listener = WI.debuggerManager.singleFireEventListener(WI.DebuggerManager.Event.Paused, (event) => {
paused = true;
InspectorTest.pass("Should pause before event handler is run.");
logActiveStackTrace();
WI.debuggerManager.resume()
.catch(reject);
});
InspectorTest.singleFireEventListener(`TestPage-${eventName}`, (event) => {
if (!paused) {
WI.debuggerManager.removeEventListener(WI.DebuggerManager.Event.Paused, listener);
InspectorTest.fail("Should pause before event handler is run.");
}
resolve();
});
Web Inspector: allow event breakpoints to be configured https://bugs.webkit.org/show_bug.cgi?id=215362 <rdar://problem/66932921> Reviewed by Brian Burg. Source/JavaScriptCore: This allows developers to do things like: - only pause when `window.event.type` is a certain value - ignore the first N pauses - evaluate JavaScript whenever an event listener is invoked without pausing * inspector/protocol/DOM.json: Add an `options` paramater to `DOM.setBreakpointForEventListener` to allow configuration. * inspector/protocol/DOMDebugger.json: Add an `options` paramater to `DOMDebugger.setEventBreakpoint` to allow configuration. * debugger/Breakpoint.h: (JSC::Breakpoint::id const): Added. (JSC::Breakpoint::sourceID const): Added. (JSC::Breakpoint::lineNumber const): Added. (JSC::Breakpoint::columnNumber const): Added. (JSC::Breakpoint::condition const): Added. (JSC::Breakpoint::actions const): Added. (JSC::Breakpoint::isAutoContinue const): Added. (JSC::Breakpoint::resetHitCount): Added. (JSC::Breakpoint::isLinked const): Added. (JSC::Breakpoint::isResolved const): Added. (JSC::BreakpointsList::~BreakpointsList): Deleted. * debugger/Breakpoint.cpp: Added. (JSC::Breakpoint::Action::Action): Added. (JSC::Breakpoint::create): Added. (JSC::Breakpoint::Breakpoint): Added. (JSC::Breakpoint::link): Added. (JSC::Breakpoint::resolve): Added. (JSC::Breakpoint::shouldPause): Added. Unify `JSC::Breakpoint` and `Inspector::ScriptBreakpoint`. * debugger/DebuggerPrimitives.h: * debugger/Debugger.h: * debugger/Debugger.cpp: (JSC::Debugger::Debugger): (JSC::Debugger::addObserver): Added. (JSC::Debugger::removeObserver): Added. (JSC::Debugger::canDispatchFunctionToObservers const): Added. (JSC::Debugger::dispatchFunctionToObservers): Added. (JSC::Debugger::sourceParsed): Added. (JSC::Debugger::toggleBreakpoint): (JSC::Debugger::applyBreakpoints): (JSC::Debugger::resolveBreakpoint): (JSC::Debugger::setBreakpoint): (JSC::Debugger::removeBreakpoint): (JSC::Debugger::didHitBreakpoint): Added. (JSC::Debugger::clearBreakpoints): (JSC::Debugger::evaluateBreakpointCondition): Added. (JSC::Debugger::evaluateBreakpointActions): Added. (JSC::Debugger::schedulePauseAtNextOpportunity): Added. (JSC::Debugger::cancelPauseAtNextOpportunity): Added. (JSC::Debugger::schedulePauseForSpecialBreakpoint): Added. (JSC::Debugger::cancelPauseForSpecialBreakpoint): Added. (JSC::Debugger::continueProgram): (JSC::Debugger::stepNextExpression): (JSC::Debugger::stepIntoStatement): (JSC::Debugger::stepOverStatement): (JSC::Debugger::stepOutOfFunction): (JSC::Debugger::pauseIfNeeded): (JSC::Debugger::handlePause): Added. (JSC::Debugger::exceptionOrCaughtValue): Added. (JSC::Debugger::atExpression): (JSC::Debugger::clearNextPauseState): (JSC::Debugger::willRunMicrotask): Added. (JSC::Debugger::didRunMicrotask): Added. (JSC::Debugger::hasBreakpoint): Deleted. (JSC::Debugger::setPauseOnNextStatement): Deleted. Unify `JSC::Debugger` and `Inspector::ScriptDebugServer` to simplify breakpoint logic. Introduce the concept of a "special breakpoint", which is essentially a `JSC::Breakpoint` that is expected to pause at the next opportunity but isn't tied to a particular location. As an example, whenever an event breakpoint is hit, instead of just pausing at the next opportunity, the newly managed `JSC::Breakpoint` is used as a "special breakpoint", allowing for it's configuration (ie.g. condition, ignore count, actions, auto-continue) to be used. * inspector/agents/InspectorDebuggerAgent.h: * inspector/agents/InspectorDebuggerAgent.cpp: (Inspector::objectGroupForBreakpointAction): (Inspector::breakpointActionTypeForString): Added. (Inspector::parseBreakpointOptions): Added. (Inspector::InspectorDebuggerAgent::ProtocolBreakpoint::fromPayload): Added. (Inspector::InspectorDebuggerAgent::ProtocolBreakpoint::ProtocolBreakpoint): Added. (Inspector::InspectorDebuggerAgent::ProtocolBreakpoint::createDebuggerBreakpoint const): Added. (Inspector::InspectorDebuggerAgent::ProtocolBreakpoint::matchesScriptURL const): Added. (Inspector::InspectorDebuggerAgent::debuggerBreakpointFromPayload): Added. (Inspector::InspectorDebuggerAgent::enable): (Inspector::InspectorDebuggerAgent::disable): (Inspector::InspectorDebuggerAgent::buildBreakpointPauseReason): (Inspector::InspectorDebuggerAgent::handleConsoleAssert): (Inspector::InspectorDebuggerAgent::didScheduleAsyncCall): (Inspector::buildDebuggerLocation): (Inspector::InspectorDebuggerAgent::setBreakpointByUrl): (Inspector::InspectorDebuggerAgent::setBreakpoint): (Inspector::InspectorDebuggerAgent::didSetBreakpoint): (Inspector::InspectorDebuggerAgent::resolveBreakpoint): (Inspector::InspectorDebuggerAgent::removeBreakpoint): (Inspector::InspectorDebuggerAgent::continueToLocation): (Inspector::InspectorDebuggerAgent::schedulePauseAtNextOpportunity): Added. (Inspector::InspectorDebuggerAgent::cancelPauseAtNextOpportunity): Added. (Inspector::InspectorDebuggerAgent::schedulePauseForSpecialBreakpoint): Added. (Inspector::InspectorDebuggerAgent::cancelPauseForSpecialBreakpoint): Added. (Inspector::InspectorDebuggerAgent::pause): (Inspector::InspectorDebuggerAgent::resume): (Inspector::InspectorDebuggerAgent::didBecomeIdle): (Inspector::InspectorDebuggerAgent::sourceMapURLForScript): (Inspector::InspectorDebuggerAgent::didParseSource): (Inspector::InspectorDebuggerAgent::willRunMicrotask): (Inspector::InspectorDebuggerAgent::didRunMicrotask): (Inspector::InspectorDebuggerAgent::didPause): (Inspector::InspectorDebuggerAgent::breakpointActionSound): (Inspector::InspectorDebuggerAgent::breakpointActionProbe): (Inspector::InspectorDebuggerAgent::clearInspectorBreakpointState): (Inspector::InspectorDebuggerAgent::clearDebuggerBreakpointState): (Inspector::matches): Deleted. (Inspector::buildObjectForBreakpointCookie): Deleted. (Inspector::InspectorDebuggerAgent::breakpointActionsFromProtocol): Deleted. (Inspector::InspectorDebuggerAgent::schedulePauseOnNextStatement): Deleted. (Inspector::InspectorDebuggerAgent::cancelPauseOnNextStatement): Deleted. Create a private `ProtocolBreakpoint` class that holds the data sent by the frontend. This is necessary because breakpoints in the frontend have a potentially one-to-many relationship with breakpoints in the backend, as the same script can be loaded many times on a page. Each of those scripts is independent, however, and can execute differently, meaning that the same breakpoint for each script also needs a different state (e.g. ignore count). As such, the `ProtocolBreakpoint` is effectively a template that is actualized whenever a new script is parsed that matches the URL of the `ProtocolBreakpoint` to create a `JSC::Breakpoint` that is used by the `JSC::Debugger`. `ProtocolBreakpoint` also parses breakpoint configurations. * inspector/InspectorEnvironment.h: * inspector/JSGlobalObjectScriptDebugServer.h: * inspector/JSGlobalObjectScriptDebugServer.cpp: (Inspector::JSGlobalObjectScriptDebugServer::JSGlobalObjectScriptDebugServer): (Inspector::JSGlobalObjectScriptDebugServer::attachDebugger): (Inspector::JSGlobalObjectScriptDebugServer::detachDebugger): (Inspector::JSGlobalObjectScriptDebugServer::runEventLoopWhilePaused): * inspector/agents/InspectorAuditAgent.h: * inspector/agents/InspectorAuditAgent.cpp: (Inspector::InspectorAuditAgent::run): * inspector/agents/InspectorRuntimeAgent.h: * inspector/agents/InspectorRuntimeAgent.cpp: (Inspector::setPauseOnExceptionsState): (Inspector::InspectorRuntimeAgent::evaluate): (Inspector::InspectorRuntimeAgent::callFunctionOn): (Inspector::InspectorRuntimeAgent::getPreview): (Inspector::InspectorRuntimeAgent::getProperties): (Inspector::InspectorRuntimeAgent::getDisplayableProperties): * inspector/agents/InspectorScriptProfilerAgent.cpp: * inspector/agents/JSGlobalObjectDebuggerAgent.h: Replace `Inspector::ScriptDebugServer` with `JSC::Debugger`. * runtime/JSMicrotask.cpp: (JSC::JSMicrotask::run): Drive-by: r248894 mistakenly omitted the call to notify the debugger that the microtask ran. * inspector/ScriptBreakpoint.h: Removed. * inspector/ScriptDebugListener.h: Removed. * inspector/ScriptDebugServer.h: Removed. * inspector/ScriptDebugServer.cpp: Removed. * CMakeLists.txt: * JavaScriptCore.xcodeproj/project.pbxproj: * Sources.txt: Source/WebCore: This allows developers to do things like: - only pause when `window.event.type` is a certain value - ignore the first N pauses - evaluate JavaScript whenever an event listener is invoked without pausing Tests: inspector/dom/breakpoint-for-event-listener.html inspector/dom-debugger/event-animation-frame-breakpoints.html inspector/dom-debugger/event-interval-breakpoints.html inspector/dom-debugger/event-listener-breakpoints.html inspector/dom-debugger/event-timeout-breakpoints.html * inspector/agents/InspectorDOMAgent.h: * inspector/agents/InspectorDOMAgent.cpp: (WebCore::InspectorDOMAgent::getEventListenersForNode): (WebCore::InspectorDOMAgent::setBreakpointForEventListener): (WebCore::InspectorDOMAgent::removeBreakpointForEventListener): (WebCore::InspectorDOMAgent::buildObjectForEventListener): (WebCore::InspectorDOMAgent::breakpointForEventListener): (WebCore::InspectorDOMAgent::hasBreakpointForEventListener): Deleted. * inspector/agents/InspectorDOMDebuggerAgent.h: * inspector/agents/InspectorDOMDebuggerAgent.cpp: (WebCore::InspectorDOMDebuggerAgent::disable): (WebCore::InspectorDOMDebuggerAgent::mainFrameNavigated): (WebCore::InspectorDOMDebuggerAgent::setEventBreakpoint): (WebCore::InspectorDOMDebuggerAgent::removeEventBreakpoint): (WebCore::InspectorDOMDebuggerAgent::willHandleEvent): (WebCore::InspectorDOMDebuggerAgent::didHandleEvent): (WebCore::InspectorDOMDebuggerAgent::willFireTimer): (WebCore::InspectorDOMDebuggerAgent::didFireTimer): * inspector/agents/page/PageDOMDebuggerAgent.h: * inspector/agents/page/PageDOMDebuggerAgent.cpp: (WebCore::PageDOMDebuggerAgent::disable): (WebCore::PageDOMDebuggerAgent::mainFrameNavigated): (WebCore::PageDOMDebuggerAgent::willFireAnimationFrame): (WebCore::PageDOMDebuggerAgent::didFireAnimationFrame): (WebCore::PageDOMDebuggerAgent::setAnimationFrameBreakpoint): * inspector/agents/worker/WorkerDOMDebuggerAgent.h: * inspector/agents/worker/WorkerDOMDebuggerAgent.cpp: (WebCore::WorkerDOMDebuggerAgent::setAnimationFrameBreakpoint): Keep a `JSC::Breakpoint` for each event breakpoint instead of a simple `bool`, allowing for configuration when the breakpoint is first set. When any of these breakpoints are hit, pass it to the `JSC::Debugger` as a "special breakpoint", which behaves the same as "pause ASAP" but also supports a condition, an ignore count, actions, and auto-continue. Reset the hit count for any of these "special breakpoints" that persist across Web Inspector sessions when the main frame navigates. * inspector/PageScriptDebugServer.h: * inspector/PageScriptDebugServer.cpp: (WebCore::PageScriptDebugServer::PageScriptDebugServer): (WebCore::PageScriptDebugServer::attachDebugger): (WebCore::PageScriptDebugServer::detachDebugger): (WebCore::PageScriptDebugServer::didPause): (WebCore::PageScriptDebugServer::didContinue): (WebCore::PageScriptDebugServer::runEventLoopWhilePaused): (WebCore::PageScriptDebugServer::runEventLoopWhilePausedInternal): (WebCore::PageScriptDebugServer::isContentScript const): (WebCore::PageScriptDebugServer::reportException const): * inspector/WorkerScriptDebugServer.h: * inspector/WorkerScriptDebugServer.cpp: (WebCore::WorkerScriptDebugServer::WorkerScriptDebugServer): (WebCore::WorkerScriptDebugServer::attachDebugger): (WebCore::WorkerScriptDebugServer::detachDebugger): (WebCore::WorkerScriptDebugServer::runEventLoopWhilePaused): (WebCore::WorkerScriptDebugServer::reportException const): * inspector/agents/page/PageDebuggerAgent.h: * inspector/agents/page/PageDebuggerAgent.cpp: (WebCore::PageDebuggerAgent::sourceMapURLForScript): Replace `Inspector::ScriptDebugServer` with `JSC::Debugger`. * inspector/TimelineRecordFactory.h: * inspector/TimelineRecordFactory.cpp: (WebCore::TimelineRecordFactory::createProbeSampleData): * inspector/agents/InspectorTimelineAgent.h: * inspector/agents/InspectorTimelineAgent.cpp: (WebCore::InspectorTimelineAgent::internalStart): (WebCore::InspectorTimelineAgent::internalStop): (WebCore::InspectorTimelineAgent::breakpointActionProbe): Replace `Inspector::ScriptBreakpoint` with `JSC::Breakpoint`. * inspector/InspectorInstrumentation.h: (WebCore::InspectorInstrumentation::didHandleEvent): (WebCore::InspectorInstrumentation::didFireTimer): * inspector/InspectorInstrumentation.cpp: (WebCore::InspectorInstrumentation::didHandleEventImpl): (WebCore::InspectorInstrumentation::didFireTimerImpl): (WebCore::InspectorInstrumentation::didCommitLoadImpl): (WebCore::InspectorInstrumentation::didFireAnimationFrameImpl): * dom/EventTarget.cpp: (WebCore::EventTarget::innerInvokeEventListeners): * page/DOMTimer.cpp: (WebCore::DOMTimer::fired): When notifying Web Inspector that activity did occur, include all information previously included when notifying Web Inspector that that activity was about to occur so that Web Inspector can know whether a pause for the "special breakpoint" for that activity is still scheduled and if so cancel it. Source/WebInspectorUI: This allows developers to do things like: - only pause when `window.event.type` is a certain value - ignore the first N pauses - evaluate JavaScript whenever an event listener is invoked without pausing * UserInterface/Models/Breakpoint.js: (WI.Breakpoint): (WI.Breakpoint.prototype.toJSON): (WI.Breakpoint.prototype.get special): Added. (WI.Breakpoint.prototype.get removable): Added. (WI.Breakpoint.prototype.get editable): Added. (WI.Breakpoint.prototype.set condition): (WI.Breakpoint.prototype.get ignoreCount): (WI.Breakpoint.prototype.set ignoreCount): (WI.Breakpoint.prototype.get autoContinue): (WI.Breakpoint.prototype.set autoContinue): (WI.Breakpoint.prototype.get actions): (WI.Breakpoint.prototype.get probeActions): (WI.Breakpoint.prototype.cycleToNextMode): (WI.Breakpoint.prototype.createAction): (WI.Breakpoint.prototype.recreateAction): (WI.Breakpoint.prototype.removeAction): (WI.Breakpoint.prototype.clearActions): (WI.Breakpoint.prototype.remove): Added. (WI.Breakpoint.prototype.optionsToProtocol): Added. (WI.Breakpoint.prototype.breakpointActionDidChange): (WI.Breakpoint.fromJSON): Deleted. (WI.Breakpoint.prototype.get sourceCodeLocation): Deleted. (WI.Breakpoint.prototype.get contentIdentifier): Deleted. (WI.Breakpoint.prototype.get scriptIdentifier): Deleted. (WI.Breakpoint.prototype.get target): Deleted. (WI.Breakpoint.prototype.get identifier): Deleted. (WI.Breakpoint.prototype.set identifier): Deleted. (WI.Breakpoint.prototype.get resolved): Deleted. (WI.Breakpoint.prototype.set resolved): Deleted. (WI.Breakpoint.prototype.saveIdentityToCookie): Deleted. (WI.Breakpoint.prototype._isSpecial): Deleted. (WI.Breakpoint.prototype._sourceCodeLocationLocationChanged): Deleted. (WI.Breakpoint.prototype._sourceCodeLocationDisplayLocationChanged): Deleted. * UserInterface/Models/DOMBreakpoint.js: (WI.DOMBreakpoint): (WI.DOMBreakpoint.fromJSON): Added. (WI.DOMBreakpoint.prototype.remove): Added. (WI.DOMBreakpoint.prototype.toJSON): (WI.DOMBreakpoint.deserialize): Deleted. (WI.DOMBreakpoint.prototype.get disabled): Deleted. (WI.DOMBreakpoint.prototype.set disabled): Deleted. * UserInterface/Models/EventBreakpoint.js: (WI.EventBreakpoint): (WI.EventBreakpoint.fromJSON): Added. (WI.EventBreakpoint.prototype.get special): Added. (WI.EventBreakpoint.prototype.get editable): Added. (WI.EventBreakpoint.prototype.remove): Added. (WI.EventBreakpoint.prototype.saveIdentityToCookie): (WI.EventBreakpoint.prototype.toJSON): (WI.EventBreakpoint.deserialize): Deleted. (WI.EventBreakpoint.prototype.get disabled): Deleted. (WI.EventBreakpoint.prototype.set disabled): Deleted. * UserInterface/Models/JavaScriptBreakpoint.js: Copied from UserInterface/Models/Breakpoint.js. (WI.JavaScriptBreakpoint): (WI.JavaScriptBreakpoint.fromJSON): (WI.JavaScriptBreakpoint.prototype.toJSON): (WI.JavaScriptBreakpoint.prototype.get sourceCodeLocation): (WI.JavaScriptBreakpoint.prototype.get contentIdentifier): (WI.JavaScriptBreakpoint.prototype.get scriptIdentifier): (WI.JavaScriptBreakpoint.prototype.get target): (WI.JavaScriptBreakpoint.prototype.get special): Added. (WI.JavaScriptBreakpoint.prototype.get removable): Added. (WI.JavaScriptBreakpoint.prototype.get editable): Added. (WI.JavaScriptBreakpoint.prototype.get identifier): (WI.JavaScriptBreakpoint.prototype.set identifier): (WI.JavaScriptBreakpoint.prototype.get resolved): (WI.JavaScriptBreakpoint.prototype.set resolved): (WI.JavaScriptBreakpoint.prototype.remove): Added. (WI.JavaScriptBreakpoint.prototype.saveIdentityToCookie): (WI.JavaScriptBreakpoint.prototype._isSpecial): (WI.JavaScriptBreakpoint.prototype._sourceCodeLocationLocationChanged): (WI.JavaScriptBreakpoint.prototype._sourceCodeLocationDisplayLocationChanged): * UserInterface/Models/URLBreakpoint.js: (WI.URLBreakpoint): (WI.URLBreakpoint.fromJSON): Added. (WI.URLBreakpoint.prototype.get special): Added. (WI.URLBreakpoint.prototype.remove): Added. (WI.URLBreakpoint.prototype.toJSON): (WI.URLBreakpoint.deserialize): Deleted. (WI.URLBreakpoint.prototype.get disabled): Deleted. (WI.URLBreakpoint.prototype.set disabled): Deleted. Rename `WI.Breakpoint` to `WI.JavaScriptBreakpoint` and use `WI.Breakpoint` as a new common base class for all breakpoint types, allowing more logic to be shared (e.g. disabled state). Additionally, breakpoints are now able to - determine whether or not they're - special - removable - editable (i.e. configurable) - remove themselves without the caller needing to know what manager to consult with. * UserInterface/Controllers/DOMManager.js: (WI.DOMManager): (WI.DOMManager.supportsEventListenerBreakpointConfiguration): Added. (WI.DOMManager.prototype.setBreakpointForEventListener): (WI.DOMManager.prototype.removeBreakpointForEventListener): (WI.DOMManager.prototype._setEventBreakpoint): Added. (WI.DOMManager.prototype._removeEventBreakpoint): Added. (WI.DOMManager.prototype._handleEventBreakpointEditablePropertyChanged): Added. (WI.DOMManager.prototype._handleEventBreakpointActionsChanged): Added. (WI.DOMManager.prototype._updateEventBreakpoint): Deleted. Keep track of configuration changes for specific listener breakpoints. * UserInterface/Controllers/DOMDebuggerManager.js: (WI.DOMDebuggerManager): (WI.DOMDebuggerManager.prototype.initializeTarget): (WI.DOMDebuggerManager.prototype.addDOMBreakpoint): (WI.DOMDebuggerManager.prototype.removeDOMBreakpoint): (WI.DOMDebuggerManager.prototype.addEventBreakpoint): (WI.DOMDebuggerManager.prototype.removeEventBreakpoint): (WI.DOMDebuggerManager.prototype.addURLBreakpoint): (WI.DOMDebuggerManager.prototype.removeURLBreakpoint): (WI.DOMDebuggerManager.prototype._commandArgumentsForEventBreakpoint): Added. (WI.DOMDebuggerManager.prototype._setEventBreakpoint): Added. (WI.DOMDebuggerManager.prototype._removeEventBreakpoint): Added. (WI.DOMDebuggerManager.prototype._handleEventBreakpointDisabledStateChanged): Added. (WI.DOMDebuggerManager.prototype._handleEventBreakpointEditablePropertyChanged): Added. (WI.DOMDebuggerManager.prototype._handleEventBreakpointActionsChanged): Added. (WI.DOMDebuggerManager.prototype.isBreakpointSpecial): Deleted. (WI.DOMDebuggerManager.prototype._updateEventBreakpoint): Deleted. Keep track of configuration changes for special event breakpoints. Store special event breakpoints inside `WI.objectStores.eventBreakpoints`. * UserInterface/Controllers/DebuggerManager.js: (WI.DebuggerManager): (WI.DebuggerManager.prototype.addBreakpoint): (WI.DebuggerManager.prototype.removeBreakpoint): (WI.DebuggerManager.prototype.addProbesForBreakpoint): Added. (WI.DebuggerManager.prototype.removeProbesForBreakpoint): Added. (WI.DebuggerManager.prototype.updateProbesForBreakpoint): Added. (WI.DebuggerManager.prototype._setBreakpoint): (WI.DebuggerManager.prototype._breakpointEditablePropertyDidChange): (WI.DebuggerManager.prototype._handleBreakpointActionsDidChange): (WI.DebuggerManager.prototype.isBreakpointRemovable): Deleted. (WI.DebuggerManager.prototype.isBreakpointSpecial): Deleted. (WI.DebuggerManager.prototype.isBreakpointEditable): Deleted. (WI.DebuggerManager.prototype._debuggerBreakpointActionType): Deleted. (WI.DebuggerManager.prototype._debuggerBreakpointOptions): Deleted. (WI.DebuggerManager.prototype._addProbesForBreakpoint): Deleted. (WI.DebuggerManager.prototype._removeProbesForBreakpoint): Deleted. (WI.DebuggerManager.prototype._updateProbesForBreakpoint): Deleted. Replace `WI.Breakpoint` with `WI.JavaScriptBreakpoint`. Probes now support `WI.EventBreakpoint` in addition to `WI.JavaScriptBreakpoint`. * UserInterface/Controllers/BreakpointPopoverController.js: (WI.BreakpointPopoverController.prototype.appendContextMenuItems): (WI.BreakpointPopoverController.prototype._createPopoverContent): Allow any breakpoint instead of only `WI.JavaScriptBreakpoint`. Drive-by: the existing `ignoreCount` value wasn't being used to populate the `<input>`. * UserInterface/Views/BreakpointTreeElement.js: (WI.BreakpointTreeElement.prototype.ondelete): (WI.BreakpointTreeElement.prototype.get listenerSet): Added. (WI.BreakpointTreeElement.prototype.updateStatus): Added. (WI.BreakpointTreeElement.prototype.updateTitles): Added. (WI.BreakpointTreeElement.prototype.get breakpoint): Deleted. (WI.BreakpointTreeElement.prototype.get filterableData): Deleted. (WI.BreakpointTreeElement.prototype._updateTitles): Deleted. (WI.BreakpointTreeElement.prototype._updateStatus): Deleted. (WI.BreakpointTreeElement.prototype._breakpointLocationDidChange): Deleted. * UserInterface/Views/BreakpointTreeElement.css: (.item.breakpoint .status > .status-image): (.item.breakpoint.paused .icon): Added. (@media (prefers-color-scheme: dark) .item.breakpoint.paused .icon): Added. (.item.breakpoint .status > .status-image.resolved): Deleted. (body:not(.window-inactive, .window-docked-inactive) .tree-outline:focus-within .item.breakpoint.selected .status > .status-image.resolved): Deleted. (.item.breakpoint .subtitle.formatted-location): Deleted. (.breakpoint-debugger-statement-icon .icon): Deleted. (.breakpoint-exception-icon .icon): Deleted. (.breakpoint-assertion-icon .icon): Deleted. (.breakpoint-microtask-icon .icon): Deleted. (.breakpoint-paused-icon .icon): Deleted. (.breakpoint-generic-line-icon .icon): Deleted. (.breakpoint-generic-line-icon .icon > span): Deleted. (.data-updated.breakpoint-generic-line-icon .icon > span): Deleted. (@media (prefers-color-scheme: dark) .breakpoint-debugger-statement-icon .icon): Deleted. (@media (prefers-color-scheme: dark) .breakpoint-exception-icon .icon): Deleted. (@media (prefers-color-scheme: dark) .breakpoint-assertion-icon .icon): Deleted. (@media (prefers-color-scheme: dark) .breakpoint-microtask-icon .icon): Deleted. (@media (prefers-color-scheme: dark) .breakpoint-paused-icon .icon): Deleted. (@media (prefers-color-scheme: dark) .breakpoint-generic-line-icon .icon): Deleted. * UserInterface/Views/DOMBreakpointTreeElement.js: (WI.DOMBreakpointTreeElement): (WI.DOMBreakpointTreeElement.prototype.onattach): Deleted. (WI.DOMBreakpointTreeElement.prototype.ondetach): Deleted. (WI.DOMBreakpointTreeElement.prototype.ondelete): Deleted. (WI.DOMBreakpointTreeElement.prototype.onenter): Deleted. (WI.DOMBreakpointTreeElement.prototype.onspace): Deleted. (WI.DOMBreakpointTreeElement.prototype.populateContextMenu): Deleted. (WI.DOMBreakpointTreeElement.prototype._statusImageElementClicked): Deleted. (WI.DOMBreakpointTreeElement.prototype._statusImageElementFocused): Deleted. (WI.DOMBreakpointTreeElement.prototype._statusImageElementMouseDown): Deleted. (WI.DOMBreakpointTreeElement.prototype._toggleBreakpoint): Deleted. (WI.DOMBreakpointTreeElement.prototype._updateStatus): Deleted. * UserInterface/Views/DOMBreakpointTreeElement.css: (.item.breakpoint.dom.subtree-modified:not(.paused) .icon): Added. (.item.breakpoint.dom.attribute-modified:not(.paused) .icon): Added. (.item.breakpoint.dom.node-removed:not(.paused) .icon): Added. (@media (prefers-color-scheme: dark) .item.breakpoint.dom.subtree-modified:not(.paused) .icon): Added. (@media (prefers-color-scheme: dark) .item.breakpoint.dom.attribute-modified:not(.paused) .icon): Added. (@media (prefers-color-scheme: dark) .item.breakpoint.dom.node-removed:not(.paused) .icon): Added. (.breakpoint.dom.breakpoint-for-subtree-modified:not(.breakpoint-paused-icon) .icon): Deleted. (.breakpoint.dom.breakpoint-for-attribute-modified:not(.breakpoint-paused-icon) .icon): Deleted. (.breakpoint.dom.breakpoint-for-node-removed:not(.breakpoint-paused-icon) .icon): Deleted. (@media (prefers-color-scheme: dark) .breakpoint.dom.breakpoint-for-subtree-modified:not(.breakpoint-paused-icon) .icon): Deleted. (@media (prefers-color-scheme: dark) .breakpoint.dom.breakpoint-for-attribute-modified:not(.breakpoint-paused-icon) .icon): Deleted. (@media (prefers-color-scheme: dark) .breakpoint.dom.breakpoint-for-node-removed:not(.breakpoint-paused-icon) .icon): Deleted. * UserInterface/Views/EventBreakpointTreeElement.js: (WI.EventBreakpointTreeElement): (WI.EventBreakpointTreeElement.prototype.onattach): Deleted. (WI.EventBreakpointTreeElement.prototype.ondetach): Deleted. (WI.EventBreakpointTreeElement.prototype.ondelete): Deleted. (WI.EventBreakpointTreeElement.prototype.onenter): Deleted. (WI.EventBreakpointTreeElement.prototype.onspace): Deleted. (WI.EventBreakpointTreeElement.prototype.populateContextMenu): Deleted. (WI.EventBreakpointTreeElement.prototype._statusImageElementClicked): Deleted. (WI.EventBreakpointTreeElement.prototype._statusImageElementFocused): Deleted. (WI.EventBreakpointTreeElement.prototype._statusImageElementMouseDown): Deleted. (WI.EventBreakpointTreeElement.prototype._toggleBreakpoint): Deleted. (WI.EventBreakpointTreeElement.prototype._updateStatus): Deleted. * UserInterface/Views/EventBreakpointTreeElement.css: (.item.breakpoint.event.animation-frame:not(.paused) .icon): Added. (.item.breakpoint.event.interval:not(.paused) .icon): Added. (.item.breakpoint.event.listener:not(.paused) .icon): Added. (.item.breakpoint.event.timeout:not(.paused) .icon): Added. (@media(prefers-color-scheme: dark) .item.breakpoint.event.animation-frame:not(.paused) .icon): Added. (@media(prefers-color-scheme: dark) .item.breakpoint.event.interval:not(.paused) .icon): Added. (@media(prefers-color-scheme: dark) .item.breakpoint.event.listener:not(.paused) .icon): Added. (@media(prefers-color-scheme: dark) .item.breakpoint.event.timeout:not(.paused) .icon): Added. (.breakpoint.event.breakpoint-for-animation-frame:not(.breakpoint-paused-icon) .icon): Deleted. (.breakpoint.event.breakpoint-for-interval:not(.breakpoint-paused-icon) .icon): Deleted. (.breakpoint.event.breakpoint-for-listener:not(.breakpoint-paused-icon) .icon): Deleted. (.breakpoint.event.breakpoint-for-timeout:not(.breakpoint-paused-icon) .icon): Deleted. (@media(prefers-color-scheme: dark) .breakpoint.event.breakpoint-for-animation-frame:not(.breakpoint-paused-icon) .icon): Deleted. (@media(prefers-color-scheme: dark) .breakpoint.event.breakpoint-for-interval:not(.breakpoint-paused-icon) .icon): Deleted. (@media(prefers-color-scheme: dark) .breakpoint.event.breakpoint-for-listener:not(.breakpoint-paused-icon) .icon): Deleted. (@media(prefers-color-scheme: dark) .breakpoint.event.breakpoint-for-timeout:not(.breakpoint-paused-icon) .icon): Deleted. * UserInterface/Views/JavaScriptBreakpointTreeElement.js: Copied from Source/WebInspectorUI/UserInterface/Views/BreakpointTreeElement.js. (WI.JavaScriptBreakpointTreeElement): (WI.JavaScriptBreakpointTreeElement.prototype.get filterableData): (WI.JavaScriptBreakpointTreeElement.prototype.updateStatus): Added. (WI.JavaScriptBreakpointTreeElement.prototype.updateTitles): Added. (WI.JavaScriptBreakpointTreeElement.prototype._breakpointLocationDidChange): * UserInterface/Views/JavaScriptBreakpointTreeElement.css: Copied from Source/WebInspectorUI/UserInterface/Views/BreakpointTreeElement.css. (.item.breakpoint.javascript .status > .status-image): Added. (.item.breakpoint.javascript .status > .status-image.resolved): Added. (body:not(.window-inactive, .window-docked-inactive) .tree-outline:focus-within .item.breakpoint.javascript.selected .status > .status-image.resolved): Added. (.item.breakpoint.javascript .subtitle.formatted-location): Added. (.item.breakpoint.javascript.line .icon): Added. (.item.breakpoint.javascript.line .icon > span): Added. (.data-updated.item.breakpoint.javascript.line .icon > span): Added. (.item.breakpoint.javascript.debugger-statement .icon): Added. (.item.breakpoint.javascript.exception .icon): Added. (.item.breakpoint.javascript.assertion .icon): Added. (.item.breakpoint.javascript.microtask .icon): Added. (@media (prefers-color-scheme: dark) .item.breakpoint.javascript.line .icon): Added. (@media (prefers-color-scheme: dark) .item.breakpoint.javascript.debugger-statement .icon): Added. (@media (prefers-color-scheme: dark) .item.breakpoint.javascript.exception .icon): Added. (@media (prefers-color-scheme: dark) .item.breakpoint.javascript.assertion .icon): Added. (@media (prefers-color-scheme: dark) .item.breakpoint.javascript.microtask .icon): Added. * UserInterface/Views/URLBreakpointTreeElement.js: (WI.URLBreakpointTreeElement): (WI.URLBreakpointTreeElement.prototype.onattach): Deleted. (WI.URLBreakpointTreeElement.prototype.ondetach): Deleted. (WI.URLBreakpointTreeElement.prototype.ondelete): Deleted. (WI.URLBreakpointTreeElement.prototype.onenter): Deleted. (WI.URLBreakpointTreeElement.prototype.onspace): Deleted. (WI.URLBreakpointTreeElement.prototype.populateContextMenu): Deleted. (WI.URLBreakpointTreeElement.prototype._statusImageElementClicked): Deleted. (WI.URLBreakpointTreeElement.prototype._statusImageElementFocused): Deleted. (WI.URLBreakpointTreeElement.prototype._statusImageElementMouseDown): Deleted. (WI.URLBreakpointTreeElement.prototype._toggleBreakpoint): Deleted. (WI.URLBreakpointTreeElement.prototype._updateStatus): Deleted. * UserInterface/Views/URLBreakpointTreeElement.css: (.item.breakpoint.url .subtitle): Added. (.item.breakpoint.url:not(.paused) .icon): Added. (@media (prefers-color-scheme: dark) .item.breakpoint.url:not(.paused) .icon): Added. (.breakpoint.url .subtitle): Deleted. (.breakpoint.url:not(.breakpoint-paused-icon) .icon): Deleted. (@media (prefers-color-scheme: dark) .breakpoint.url:not(.breakpoint-paused-icon) .icon): Deleted. Rename `WI.BreakpointTreeElement` to `WI.JavaScriptBreakpointTreeElement` and use `WI.BreakpointTreeElement` as a new common base class for all breakpoint tree elements, allowing more logic and styles to be shared (e.g. disabled state). * UserInterface/Views/SourcesNavigationSidebarPanel.js: (WI.SourcesNavigationSidebarPanel): (WI.SourcesNavigationSidebarPanel.prototype.closed): (WI.SourcesNavigationSidebarPanel.prototype._insertDebuggerTreeElement): (WI.SourcesNavigationSidebarPanel.prototype._compareJavaScriptBreakpointTreeElements): Added. (WI.SourcesNavigationSidebarPanel.prototype._addBreakpoint): (WI.SourcesNavigationSidebarPanel.prototype._removeAllBreakpoints): (WI.SourcesNavigationSidebarPanel.prototype._breakpointsBeneathTreeElement): (WI.SourcesNavigationSidebarPanel.prototype._addIssue): (WI.SourcesNavigationSidebarPanel.prototype._updatePauseReasonSection): (WI.SourcesNavigationSidebarPanel.prototype._handleTreeSelectionDidChange): (WI.SourcesNavigationSidebarPanel.prototype._handleBreakpointElementAddedOrRemoved): (WI.SourcesNavigationSidebarPanel.prototype._populateCreateBreakpointContextMenu.addToggleForSpecialEventBreakpoint): (WI.SourcesNavigationSidebarPanel.prototype._populateCreateBreakpointContextMenu): (WI.SourcesNavigationSidebarPanel.prototype._handleDebuggerObjectDisplayLocationDidChange): (WI.SourcesNavigationSidebarPanel.prototype._compareBreakpointTreeElements): Deleted. * UserInterface/Models/ProbeSet.js: (WI.ProbeSet): (WI.ProbeSet.prototype.createProbe): (WI.ProbeSet.prototype.willRemove): * UserInterface/Controllers/TimelineManager.js: (WI.TimelineManager.prototype._processRecord): * UserInterface/Views/ProbeSetDetailsSection.js: (WI.ProbeSetDetailsSection): * UserInterface/Views/ProbeDetailsSidebarPanel.js: (WI.ProbeDetailsSidebarPanel.prototype.inspect): * UserInterface/Views/SourceCodeTextEditor.js: (WI.SourceCodeTextEditor): (WI.SourceCodeTextEditor.prototype.close): (WI.SourceCodeTextEditor.prototype.textEditorBreakpointAdded): * UserInterface/Views/TextResourceContentView.js: (WI.TextResourceContentView.prototype.get supplementalRepresentedObjects): (WI.TextResourceContentView.prototype._probeSetsChanged): Probes now support `WI.EventBreakpoint` in addition to `WI.JavaScriptBreakpoint`. * UserInterface/Views/ContentView.js: (WI.ContentView.createFromRepresentedObject): (WI.ContentView.resolvedRepresentedObjectForRepresentedObject): (WI.ContentView.isViewable): * UserInterface/Views/ContextMenuUtilities.js: (WI.appendContextMenuItemsForSourceCode): Replace `WI.Breakpoint` with `WI.JavaScriptBreakpoint`. * UserInterface/Views/DOMTreeContentView.js: (WI.DOMTreeContentView): Replace `WI.DOMBreakpoint` with `WI.Breakpoint`. * UserInterface/Views/EventListenerSectionGroup.js: (WI.EventListenerSectionGroup): * UserInterface/Views/EventListenerSectionGroup.css: (.event-listener-section > .content input[type="checkbox"] + .go-to-arrow): Added. (.event-listener-section > .content input[type="checkbox"]:not(:checked) + .go-to-arrow): Added. Add a go-to arrow next to the Breakpoint checkbox that reveals the `WI.EventBreakpoint` in the Sources Tab. * UserInterface/Views/BreakpointActionView.js: (WI.BreakpointActionView.prototype._appendActionButtonClicked): Drive-by: minor code cleanup. * UserInterface/Views/CallFrameTreeElement.js: (WI.CallFrameTreeElement.prototype.populateContextMenu): Drive-by: include source code location context menu items. * UserInterface/Base/Setting.js: * UserInterface/Main.html: * UserInterface/Test.html: LayoutTests: * inspector/dom-debugger/resources/event-breakpoint-utilities.js: (TestPage.registerInitializer.InspectorTest.EventBreakpoint.addBreakpointOptionsTestCases): Added. (TestPage.registerInitializer.InspectorTest.EventBreakpoint.async teardown): (TestPage.registerInitializer.InspectorTest.EventBreakpoint.createBreakpoint): (TestPage.registerInitializer.InspectorTest.EventBreakpoint.removeBreakpoint): * inspector/dom/breakpoint-for-event-listener.html: * inspector/dom/breakpoint-for-event-listener-expected.txt: * inspector/dom-debugger/event-animation-frame-breakpoints.html: * inspector/dom-debugger/event-animation-frame-breakpoints-expected.txt: * inspector/dom-debugger/event-interval-breakpoints.html: * inspector/dom-debugger/event-interval-breakpoints-expected.txt: * inspector/dom-debugger/event-listener-breakpoints.html: * inspector/dom-debugger/event-listener-breakpoints-expected.txt: * inspector/dom-debugger/event-timeout-breakpoints.html: * inspector/dom-debugger/event-timeout-breakpoints-expected.txt: Add tests for new event breakpoint configuration options. * http/tests/inspector/debugger/debugger-test.js: (TestPage.registerInitializer.InspectorTest.startTracingBreakpoints): * http/tests/inspector/resources/probe-test.js: (TestPage.registerInitializer.ProtocolTest.Probe.installTracingListeners): * inspector/debugger/breakpoint-action-eval.html: * inspector/debugger/breakpoint-action-log.html: * inspector/debugger/breakpoint-columns.html: * inspector/debugger/breakpoint-scope.html: * inspector/debugger/debugger-stack-overflow.html: * inspector/debugger/pause-reason.html: * inspector/debugger/probe-manager-add-remove-actions.html: * inspector/debugger/stepping/stepping-through-autoContinue-breakpoint.html: * inspector/debugger/tail-deleted-frames-this-value.html: * inspector/debugger/tail-recursion.html: * inspector/worker/debugger-pause.html: * inspector/worker/debugger-shared-breakpoint.html: Update existing breakpoint tests to use new model objects. Canonical link: https://commits.webkit.org/228551@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@266074 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2020-08-24 17:34:12 +00:00
InspectorTest.EventBreakpoint.createBreakpoint(WI.EventBreakpoint.Type.Listener, {eventName})
Web Inspector: support breakpoints for timers and animation-frame events https://bugs.webkit.org/show_bug.cgi?id=188778 Reviewed by Brian Burg. Source/JavaScriptCore: * inspector/protocol/Debugger.json: Add `AnimationFrame` and `Timer` types to the list of pause reasons. * inspector/protocol/DOMDebugger.json: Introduced `setEventBreakpoint` and `removeEventBreakpoint` to replace the more specific: - `setEventListenerBreakpoint` - `removeEventListenerBreakpoint` - `setInstrumentationBreakpoint` - `removeInstrumentationBreakpoint` Also created an `EventBreakpointType` to enumerate the available types of event breakpoints. * inspector/scripts/codegen/generate_cpp_protocol_types_header.py: (CppProtocolTypesHeaderGenerator.generate_output): (CppProtocolTypesHeaderGenerator._generate_forward_declarations_for_binding_traits): (CppProtocolTypesHeaderGenerator._generate_declarations_for_enum_conversion_methods): (CppProtocolTypesHeaderGenerator._generate_hash_declarations): Added. Generate `DefaultHash` for all `enum class` used by inspector protocols. * inspector/scripts/tests/generic/expected/commands-with-async-attribute.json-result: * inspector/scripts/tests/generic/expected/commands-with-optional-call-return-parameters.json-result: * inspector/scripts/tests/generic/expected/enum-values.json-result: * inspector/scripts/tests/generic/expected/type-declaration-array-type.json-result: * inspector/scripts/tests/generic/expected/type-declaration-enum-type.json-result: * inspector/scripts/tests/generic/expected/type-declaration-object-type.json-result: * inspector/scripts/tests/generic/expected/type-requiring-runtime-casts.json-result: Source/WebCore: The original implementation of "instrumentation" breakpoints relied upon the frontend sending somewhat arbitrary strings when enabling breakpoints for specific events. As an example, setting a breakpoint for `requestAnimationFrame` expects `"animationFrameFired"` as the string, which doesn't make much sense. This patch removes the usage of these strings and instead expects the agent to implement a method that matches what is happening. Tests: inspector/dom-debugger/event-animation-frame-breakpoints.html inspector/dom-debugger/event-listener-breakpoints.html inspector/dom-debugger/event-timer-breakpoints.html * inspector/InspectorInstrumentation.h: (WebCore::InspectorInstrumentation::willFireTimer): * inspector/InspectorInstrumentation.cpp: (WebCore::InspectorInstrumentation::didInstallTimerImpl): (WebCore::InspectorInstrumentation::didRemoveTimerImpl): (WebCore::InspectorInstrumentation::willFireTimerImpl): (WebCore::InspectorInstrumentation::didRequestAnimationFrameImpl): (WebCore::InspectorInstrumentation::didCancelAnimationFrameImpl): (WebCore::InspectorInstrumentation::willFireAnimationFrameImpl): (WebCore::InspectorInstrumentation::pauseOnNativeEventIfNeeded): Deleted. * inspector/agents/InspectorDOMDebuggerAgent.h: * inspector/agents/InspectorDOMDebuggerAgent.cpp: (WebCore::InspectorDOMDebuggerAgent::setEventBreakpoint): Added. (WebCore::InspectorDOMDebuggerAgent::removeEventBreakpoint): Added. (WebCore::InspectorDOMDebuggerAgent::willHandleEvent): (WebCore::InspectorDOMDebuggerAgent::willFireTimer): Added. (WebCore::InspectorDOMDebuggerAgent::willFireAnimationFrame): Added. (WebCore::InspectorDOMDebuggerAgent::setEventListenerBreakpoint): Deleted. (WebCore::InspectorDOMDebuggerAgent::setInstrumentationBreakpoint): Deleted. (WebCore::InspectorDOMDebuggerAgent::setBreakpoint): Deleted. (WebCore::InspectorDOMDebuggerAgent::removeEventListenerBreakpoint): Deleted. (WebCore::InspectorDOMDebuggerAgent::removeInstrumentationBreakpoint): Deleted. (WebCore::InspectorDOMDebuggerAgent::removeBreakpoint): Deleted. (WebCore::InspectorDOMDebuggerAgent::pauseOnNativeEventIfNeeded): Deleted. Unify the event listener and instrumentation breakpoint commands into a single method, `setEventBreakpoint`, that takes in both an `EventBreakpointType` and `eventName`. * page/DOMTimer.cpp: (WebCore::DOMTimer::fired): Source/WebInspectorUI: Add a `type` to `WI.EventBreakpoint` that matches `DOMDebugger.EventBreakpointType`: - `AnimationFrame` for `requestAnimationFrame` - `Listener` for any named DOM Event - `Timer` for `setTimeout` and `setInterval` Modified `WI.EventBreakpointPopover` to provide ways for selecting these other types, which is then passed to `WI.DOMDebuggerManager`, which now calls through to the newly added `DOMDebugger.removeEventBreakpoint` and `DOMDebugger.setEventBreakpoint` that sets breakpoints for all event types. * Localizations/en.lproj/localizedStrings.js: * UserInterface/Images/EventBreakpointAnimationFrame.svg: Added. * UserInterface/Images/EventBreakpointListener.svg: Renamed from Source/WebInspectorUI/UserInterface/Images/EventBreakpoint.svg. * UserInterface/Images/EventBreakpointTimer.svg: Added. * UserInterface/Controllers/DOMDebuggerManager.js: (WI.DOMDebuggerManager.supportsEventBreakpoints): Added. (WI.DOMDebuggerManager.prototype.eventBreakpointForTypeAndEventName): Added. (WI.DOMDebuggerManager.prototype.addEventBreakpoint): (WI.DOMDebuggerManager.prototype.removeEventBreakpoint.breakpointRemoved): Added. (WI.DOMDebuggerManager.prototype.removeEventBreakpoint): (WI.DOMDebuggerManager.prototype._updateEventBreakpoint): (WI.DOMDebuggerManager.prototype.eventBreakpointForEventName): Deleted. * UserInterface/Controllers/DOMTreeManager.js: (WI.DOMTreeManager.prototype.setBreakpointForEventListener): * UserInterface/Controllers/DebuggerManager.js: (WI.DebuggerManager.prototype._pauseReasonFromPayload): * UserInterface/Models/EventBreakpoint.js: (WI.EventBreakpoint): (WI.EventBreakpoint.fromPayload): (WI.EventBreakpoint.prototype.get type): Added. (WI.EventBreakpoint.prototype.get serializableInfo): (WI.EventBreakpoint.prototype.saveIdentityToCookie): * UserInterface/Views/DebuggerSidebarPanel.js: (WI.DebuggerSidebarPanel.prototype._updatePauseReasonSection): (WI.DebuggerSidebarPanel.prototype.willDismissPopover): * UserInterface/Views/EventBreakpointPopover.js: (WI.EventBreakpointPopover): (WI.EventBreakpointPopover.prototype.get breakpoint): Added. (WI.EventBreakpointPopover.prototype.show): (WI.EventBreakpointPopover.prototype.show.createOption): Added. (WI.EventBreakpointPopover.prototype.dismiss): Added. (WI.EventBreakpointPopover.prototype._presentOverTargetElement): (WI.EventBreakpointPopover.prototype._handleTypeSelectChange): Added. (WI.EventBreakpointPopover.prototype.get result): Deleted. (WI.EventBreakpointPopover.prototype.get value): Deleted. * UserInterface/Views/EventBreakpointPopover.css: (.popover .event-breakpoint-content > .event-type): Added. (.popover .event-breakpoint-content > input): Deleted. * UserInterface/Views/EventBreakpointTreeElement.js: (WI.EventBreakpointTreeElement): * UserInterface/Views/EventBreakpointTreeElement.css: (.breakpoint.event.animation-frame:not(.breakpoint-paused-icon) .icon): Added. (.breakpoint.event.listener:not(.breakpoint-paused-icon) .icon): Added. (.breakpoint.event.timer:not(.breakpoint-paused-icon) .icon): Added. (.breakpoint.event:not(.breakpoint-paused-icon) .icon): Deleted. LayoutTests: * inspector/dom-debugger/event-animation-frame-breakpoints-expected.txt: Added. * inspector/dom-debugger/event-animation-frame-breakpoints.html: Added. * inspector/dom-debugger/event-breakpoint-with-navigation.html: * inspector/dom-debugger/event-timer-breakpoints-expected.txt: Added. * inspector/dom-debugger/event-timer-breakpoints.html: Added. * inspector/dom-debugger/event-listener-breakpoints-expected.txt: Renamed from LayoutTests/inspector/dom-debugger/event-breakpoints-expected.txt. * inspector/dom-debugger/event-listener-breakpoints.html: Renamed from LayoutTests/inspector/dom-debugger/event-breakpoints.html. * inspector/dom-debugger/resources/event-breakpoint-utilities.js: Added. (TestPage.registerInitializer.window.teardown): (TestPage.registerInitializer.window.failOnPause): (TestPage.registerInitializer.window.addBreakpoint): (TestPage.registerInitializer.window.removeBreakpoint): (TestPage.registerInitializer.window.disableBreakpoint): (TestPage.registerInitializer.window.awaitEvent): Canonical link: https://commits.webkit.org/203952@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@235248 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2018-08-23 21:36:40 +00:00
.then(InspectorTest.EventBreakpoint.awaitEvent("body", eventName))
.catch(reject);
},
teardown: InspectorTest.EventBreakpoint.teardown,
});
suite.addTestCase({
name: `DOMDebugger.Event.Listener.AddDisabledBreakpoint "${eventName}"`,
description: "Check that debugger does not pause for disabled breakpoints.",
test(resolve, reject) {
Web Inspector: DOM: add a special breakpoint for "All Events" https://bugs.webkit.org/show_bug.cgi?id=200285 Reviewed by Joseph Pecoraro. Source/JavaScriptCore: Similar to the existing "All Requests" breakpoint, there should be a way to set a breakpoint that would pause for any DOM event, regardless of the event's name. This is useful for situations where the event name isn't known, or where one simply wants to pause on the next entry to the event loop. Along these lines, make the "requestAnimationFrame", "setTimeout", and "setInterval" event breakpoints into special breakpoints that can be added/removed via the create breakpoint context menu. This simplifies the process for setting these breakpoints, and also makes them more discoverable (most people wouldn't consider them to be "events"). * inspector/protocol/Debugger.json: - Rename the `EventListener` pause reason to `Listener`. - Split the `Timer` pause reason into `Interval` and `Timeout`. * inspector/protocol/DOMDebugger.json: - Split the `timer` type into `interval` and `timeout`. - Make `eventName` optional for `addEventBreakpoint`/`removeEventBreakpoint`. When omitted, the corresponding breakpoint that is added/removed is treated as a global breakpoint that applies to all events of that type (e.g. a global `listener` breakpoint would pause for any event that is fired). Source/WebCore: Similar to the existing "All Requests" breakpoint, there should be a way to set a breakpoint that would pause for any DOM event, regardless of the event's name. This is useful for situations where the event name isn't known, or where one simply want's to pause on the next entry to the event loop. Along these lines, make the "requestAnimationFrame", "setTimeout", and "setInterval" event breakpoints into special breakpoints that can be added/removed via the create breakpoint context menu. This simplifies the process for setting these breakpoints, and also makes them more discoverable (most people wouldn't consider them to be "events"). Tests: inspector/dom/breakpoint-for-event-listener.html inspector/dom-debugger/event-animation-frame-breakpoints.html inspector/dom-debugger/event-breakpoint-with-navigation.html inspector/dom-debugger/event-interval-breakpoints.html inspector/dom-debugger/event-listener-breakpoints.html inspector/dom-debugger/event-timeout-breakpoints.html * inspector/agents/InspectorDOMDebuggerAgent.h: * inspector/agents/InspectorDOMDebuggerAgent.cpp: (WebCore::InspectorDOMDebuggerAgent::disable): (WebCore::InspectorDOMDebuggerAgent::frameDocumentUpdated): (WebCore::InspectorDOMDebuggerAgent::setEventBreakpoint): (WebCore::InspectorDOMDebuggerAgent::removeEventBreakpoint): (WebCore::InspectorDOMDebuggerAgent::willHandleEvent): (WebCore::InspectorDOMDebuggerAgent::willFireTimer): (WebCore::InspectorDOMDebuggerAgent::willFireAnimationFrame): (WebCore::InspectorDOMDebuggerAgent::discardBindings): Deleted. Make `eventName` optional for `addEventBreakpoint`/`removeEventBreakpoint`. When omitted, the corresponding breakpoint that is added/removed is treated as a global breakpoint that applies to all events of that type (e.g. a global `listener` breakpoint would pause for any event that is fired). Source/WebInspectorUI: Similar to the existing "All Requests" breakpoint, there should be a way to set a breakpoint that would pause for any DOM event, regardless of the event's name. This is useful for situations where the event name isn't known, or where one simply want's to pause on the next entry to the event loop. Along these lines, make the "requestAnimationFrame", "setTimeout", and "setInterval" event breakpoints into special breakpoints that can be added/removed via the create breakpoint context menu. This simplifies the process for setting these breakpoints, and also makes them more discoverable (most people wouldn't consider them to be "events"). * UserInterface/Models/EventBreakpoint.js: (WI.EventBreakpoint): (WI.EventBreakpoint.deserialize): (WI.EventBreakpoint.prototype.saveIdentityToCookie): (WI.EventBreakpoint.prototype.toJSON): * UserInterface/Controllers/DebuggerManager.js: (WI.DebuggerManager.prototype._pauseReasonFromPayload): * UserInterface/Controllers/DOMDebuggerManager.js: (WI.DOMDebuggerManager): (WI.DOMDebuggerManager.prototype.initializeTarget): (WI.DOMDebuggerManager.supportsDOMBreakpoints): Added. (WI.DOMDebuggerManager.supportsEventBreakpoints): (WI.DOMDebuggerManager.supportsEventListenerBreakpoints): Added. (WI.DOMDebuggerManager.supportsURLBreakpoints): (WI.DOMDebuggerManager.supportsXHRBreakpoints): Added. (WI.DOMDebuggerManager.supportsAllListenersBreakpoint): Added. (WI.DOMDebuggerManager.prototype.get allAnimationFramesBreakpoint): Added. (WI.DOMDebuggerManager.prototype.get allIntervalsBreakpoint): Added. (WI.DOMDebuggerManager.prototype.get allListenersBreakpoint): Added. (WI.DOMDebuggerManager.prototype.get allTimeoutsBreakpoint): Added. (WI.DOMDebuggerManager.prototype.get listenerBreakpoints): Added. (WI.DOMDebuggerManager.prototype.isBreakpointSpecial): (WI.DOMDebuggerManager.prototype.listenerBreakpointForEventName): Added. (WI.DOMDebuggerManager.prototype.addEventBreakpoint): (WI.DOMDebuggerManager.prototype.removeEventBreakpoint): (WI.DOMDebuggerManager.prototype.addURLBreakpoint): (WI.DOMDebuggerManager.prototype._resolveDOMBreakpoint): (WI.DOMDebuggerManager.prototype._updateDOMBreakpoint): (WI.DOMDebuggerManager.prototype._updateEventBreakpoint): (WI.DOMDebuggerManager.prototype._updateURLBreakpoint): (WI.DOMDebuggerManager.prototype._handleDOMBreakpointDisabledStateChanged): (WI.DOMDebuggerManager.prototype._handleEventBreakpointDisabledStateChanged): (WI.DOMDebuggerManager.prototype._handleURLBreakpointDisabledStateChanged): (WI.DOMDebuggerManager.prototype.get eventBreakpoints): Deleted. (WI.DOMDebuggerManager.prototype.eventBreakpointForTypeAndEventName): Deleted. Add additional target compatibility checks. * UserInterface/Views/EventBreakpointPopover.js: (WI.EventBreakpointPopover.prototype.show): (WI.EventBreakpointPopover.prototype.dismiss): (WI.EventBreakpointPopover.prototype._handleTypeSelectChange): Deleted. * UserInterface/Views/EventBreakpointPopover.css: (.popover .event-breakpoint-content > input): Added. (.popover .event-breakpoint-content > input::placeholder): Added. (.popover .event-breakpoint-content > .event-type): Deleted. (.popover .event-breakpoint-content > .event-type > input): Deleted. (.popover .event-breakpoint-content > .event-type > input::placeholder): Deleted. * UserInterface/Views/EventBreakpointTreeElement.css: (.breakpoint.event.breakpoint-for-interval:not(.breakpoint-paused-icon) .icon): Added. (.breakpoint.event.breakpoint-for-timeout:not(.breakpoint-paused-icon) .icon): Added. (.breakpoint.event.breakpoint-for-timer:not(.breakpoint-paused-icon) .icon): Deleted. * UserInterface/Views/DebuggerSidebarPanel.js: (WI.DebuggerSidebarPanel): (WI.DebuggerSidebarPanel.prototype.saveStateToCookie): (WI.DebuggerSidebarPanel.prototype.restoreStateFromCookie): (WI.DebuggerSidebarPanel.prototype._addBreakpoint): (WI.DebuggerSidebarPanel.prototype._addTreeElement): (WI.DebuggerSidebarPanel.prototype._updatePauseReasonSection): (WI.DebuggerSidebarPanel.prototype._handleBreakpointElementAddedOrRemoved): (WI.DebuggerSidebarPanel.prototype._populateCreateBreakpointContextMenu.addToggleForSpecialEventBreakpoint): Added. (WI.DebuggerSidebarPanel.prototype._populateCreateBreakpointContextMenu): * UserInterface/Views/SourcesNavigationSidebarPanel.js: (WI.SourcesNavigationSidebarPanel): (WI.SourcesNavigationSidebarPanel.prototype._insertDebuggerTreeElement): (WI.SourcesNavigationSidebarPanel.prototype._addBreakpoint): (WI.SourcesNavigationSidebarPanel.prototype._updatePauseReasonSection): (WI.SourcesNavigationSidebarPanel.prototype._handleBreakpointElementAddedOrRemoved): (WI.SourcesNavigationSidebarPanel.prototype._populateCreateBreakpointContextMenu.addToggleForSpecialEventBreakpoint): Added. (WI.SourcesNavigationSidebarPanel.prototype._populateCreateBreakpointContextMenu): Add create breakpoint context menu items (also sort the breakpoints in this order): - "All Animation Frames" => [A] All Animation Frames - "All Timeouts" => [T] All Timeouts - "All Intervals" => [I] All Intervals - "All Events" => [E] All Events * UserInterface/Controllers/JavaScriptRuntimeCompletionProvider.js: (WI.JavaScriptRuntimeCompletionProvider.completionControllerCompletionsNeeded.receivedPropertyNames): * UserInterface/Base/Setting.js: * UserInterface/Images/EventBreakpointInterval.svg: Added. * UserInterface/Images/EventBreakpointTimeout.svg: Renamed from Source/WebInspectorUI/UserInterface/Images/EventBreakpointTimer.svg. * Localizations/en.lproj/localizedStrings.js: LayoutTests: * inspector/dom/breakpoint-for-event-listener.html: * inspector/dom/breakpoint-for-event-listener-expected.txt: * inspector/dom-debugger/event-animation-frame-breakpoints.html: * inspector/dom-debugger/event-animation-frame-breakpoints-expected.txt: * inspector/dom-debugger/event-breakpoint-with-navigation.html: * inspector/dom-debugger/event-breakpoint-with-navigation-expected.txt: * inspector/dom-debugger/event-interval-breakpoints.html: Added. * inspector/dom-debugger/event-interval-breakpoints-expected.txt: Added. * inspector/dom-debugger/event-listener-breakpoints.html: * inspector/dom-debugger/event-listener-breakpoints-expected.txt: * inspector/dom-debugger/event-timeout-breakpoints.html: Added. * inspector/dom-debugger/event-timeout-breakpoints-expected.txt: Added. * inspector/dom-debugger/resources/event-breakpoint-utilities.js: (TestPage.registerInitializer.InspectorTest.EventBreakpoint.teardown): (TestPage.registerInitializer.InspectorTest.EventBreakpoint.failOnPause): (TestPage.registerInitializer.InspectorTest.EventBreakpoint.createBreakpoint): Added. (TestPage.registerInitializer.InspectorTest.EventBreakpoint.addBreakpoint): (TestPage.registerInitializer.InspectorTest.EventBreakpoint.removeBreakpoint): (TestPage.registerInitializer.InspectorTest.EventBreakpoint.disableBreakpoint): * inspector/dom-debugger/event-timer-breakpoints.html: Removed. * inspector/dom-debugger/event-timer-breakpoints-expected.txt: Removed. Canonical link: https://commits.webkit.org/214196@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@248201 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2019-08-03 19:00:01 +00:00
InspectorTest.EventBreakpoint.failOnPause(resolve, reject, WI.DebuggerManager.PauseReason.Listener, eventName, "Should not pause for disabled breakpoint.");
Web Inspector: support breakpoints for timers and animation-frame events https://bugs.webkit.org/show_bug.cgi?id=188778 Reviewed by Brian Burg. Source/JavaScriptCore: * inspector/protocol/Debugger.json: Add `AnimationFrame` and `Timer` types to the list of pause reasons. * inspector/protocol/DOMDebugger.json: Introduced `setEventBreakpoint` and `removeEventBreakpoint` to replace the more specific: - `setEventListenerBreakpoint` - `removeEventListenerBreakpoint` - `setInstrumentationBreakpoint` - `removeInstrumentationBreakpoint` Also created an `EventBreakpointType` to enumerate the available types of event breakpoints. * inspector/scripts/codegen/generate_cpp_protocol_types_header.py: (CppProtocolTypesHeaderGenerator.generate_output): (CppProtocolTypesHeaderGenerator._generate_forward_declarations_for_binding_traits): (CppProtocolTypesHeaderGenerator._generate_declarations_for_enum_conversion_methods): (CppProtocolTypesHeaderGenerator._generate_hash_declarations): Added. Generate `DefaultHash` for all `enum class` used by inspector protocols. * inspector/scripts/tests/generic/expected/commands-with-async-attribute.json-result: * inspector/scripts/tests/generic/expected/commands-with-optional-call-return-parameters.json-result: * inspector/scripts/tests/generic/expected/enum-values.json-result: * inspector/scripts/tests/generic/expected/type-declaration-array-type.json-result: * inspector/scripts/tests/generic/expected/type-declaration-enum-type.json-result: * inspector/scripts/tests/generic/expected/type-declaration-object-type.json-result: * inspector/scripts/tests/generic/expected/type-requiring-runtime-casts.json-result: Source/WebCore: The original implementation of "instrumentation" breakpoints relied upon the frontend sending somewhat arbitrary strings when enabling breakpoints for specific events. As an example, setting a breakpoint for `requestAnimationFrame` expects `"animationFrameFired"` as the string, which doesn't make much sense. This patch removes the usage of these strings and instead expects the agent to implement a method that matches what is happening. Tests: inspector/dom-debugger/event-animation-frame-breakpoints.html inspector/dom-debugger/event-listener-breakpoints.html inspector/dom-debugger/event-timer-breakpoints.html * inspector/InspectorInstrumentation.h: (WebCore::InspectorInstrumentation::willFireTimer): * inspector/InspectorInstrumentation.cpp: (WebCore::InspectorInstrumentation::didInstallTimerImpl): (WebCore::InspectorInstrumentation::didRemoveTimerImpl): (WebCore::InspectorInstrumentation::willFireTimerImpl): (WebCore::InspectorInstrumentation::didRequestAnimationFrameImpl): (WebCore::InspectorInstrumentation::didCancelAnimationFrameImpl): (WebCore::InspectorInstrumentation::willFireAnimationFrameImpl): (WebCore::InspectorInstrumentation::pauseOnNativeEventIfNeeded): Deleted. * inspector/agents/InspectorDOMDebuggerAgent.h: * inspector/agents/InspectorDOMDebuggerAgent.cpp: (WebCore::InspectorDOMDebuggerAgent::setEventBreakpoint): Added. (WebCore::InspectorDOMDebuggerAgent::removeEventBreakpoint): Added. (WebCore::InspectorDOMDebuggerAgent::willHandleEvent): (WebCore::InspectorDOMDebuggerAgent::willFireTimer): Added. (WebCore::InspectorDOMDebuggerAgent::willFireAnimationFrame): Added. (WebCore::InspectorDOMDebuggerAgent::setEventListenerBreakpoint): Deleted. (WebCore::InspectorDOMDebuggerAgent::setInstrumentationBreakpoint): Deleted. (WebCore::InspectorDOMDebuggerAgent::setBreakpoint): Deleted. (WebCore::InspectorDOMDebuggerAgent::removeEventListenerBreakpoint): Deleted. (WebCore::InspectorDOMDebuggerAgent::removeInstrumentationBreakpoint): Deleted. (WebCore::InspectorDOMDebuggerAgent::removeBreakpoint): Deleted. (WebCore::InspectorDOMDebuggerAgent::pauseOnNativeEventIfNeeded): Deleted. Unify the event listener and instrumentation breakpoint commands into a single method, `setEventBreakpoint`, that takes in both an `EventBreakpointType` and `eventName`. * page/DOMTimer.cpp: (WebCore::DOMTimer::fired): Source/WebInspectorUI: Add a `type` to `WI.EventBreakpoint` that matches `DOMDebugger.EventBreakpointType`: - `AnimationFrame` for `requestAnimationFrame` - `Listener` for any named DOM Event - `Timer` for `setTimeout` and `setInterval` Modified `WI.EventBreakpointPopover` to provide ways for selecting these other types, which is then passed to `WI.DOMDebuggerManager`, which now calls through to the newly added `DOMDebugger.removeEventBreakpoint` and `DOMDebugger.setEventBreakpoint` that sets breakpoints for all event types. * Localizations/en.lproj/localizedStrings.js: * UserInterface/Images/EventBreakpointAnimationFrame.svg: Added. * UserInterface/Images/EventBreakpointListener.svg: Renamed from Source/WebInspectorUI/UserInterface/Images/EventBreakpoint.svg. * UserInterface/Images/EventBreakpointTimer.svg: Added. * UserInterface/Controllers/DOMDebuggerManager.js: (WI.DOMDebuggerManager.supportsEventBreakpoints): Added. (WI.DOMDebuggerManager.prototype.eventBreakpointForTypeAndEventName): Added. (WI.DOMDebuggerManager.prototype.addEventBreakpoint): (WI.DOMDebuggerManager.prototype.removeEventBreakpoint.breakpointRemoved): Added. (WI.DOMDebuggerManager.prototype.removeEventBreakpoint): (WI.DOMDebuggerManager.prototype._updateEventBreakpoint): (WI.DOMDebuggerManager.prototype.eventBreakpointForEventName): Deleted. * UserInterface/Controllers/DOMTreeManager.js: (WI.DOMTreeManager.prototype.setBreakpointForEventListener): * UserInterface/Controllers/DebuggerManager.js: (WI.DebuggerManager.prototype._pauseReasonFromPayload): * UserInterface/Models/EventBreakpoint.js: (WI.EventBreakpoint): (WI.EventBreakpoint.fromPayload): (WI.EventBreakpoint.prototype.get type): Added. (WI.EventBreakpoint.prototype.get serializableInfo): (WI.EventBreakpoint.prototype.saveIdentityToCookie): * UserInterface/Views/DebuggerSidebarPanel.js: (WI.DebuggerSidebarPanel.prototype._updatePauseReasonSection): (WI.DebuggerSidebarPanel.prototype.willDismissPopover): * UserInterface/Views/EventBreakpointPopover.js: (WI.EventBreakpointPopover): (WI.EventBreakpointPopover.prototype.get breakpoint): Added. (WI.EventBreakpointPopover.prototype.show): (WI.EventBreakpointPopover.prototype.show.createOption): Added. (WI.EventBreakpointPopover.prototype.dismiss): Added. (WI.EventBreakpointPopover.prototype._presentOverTargetElement): (WI.EventBreakpointPopover.prototype._handleTypeSelectChange): Added. (WI.EventBreakpointPopover.prototype.get result): Deleted. (WI.EventBreakpointPopover.prototype.get value): Deleted. * UserInterface/Views/EventBreakpointPopover.css: (.popover .event-breakpoint-content > .event-type): Added. (.popover .event-breakpoint-content > input): Deleted. * UserInterface/Views/EventBreakpointTreeElement.js: (WI.EventBreakpointTreeElement): * UserInterface/Views/EventBreakpointTreeElement.css: (.breakpoint.event.animation-frame:not(.breakpoint-paused-icon) .icon): Added. (.breakpoint.event.listener:not(.breakpoint-paused-icon) .icon): Added. (.breakpoint.event.timer:not(.breakpoint-paused-icon) .icon): Added. (.breakpoint.event:not(.breakpoint-paused-icon) .icon): Deleted. LayoutTests: * inspector/dom-debugger/event-animation-frame-breakpoints-expected.txt: Added. * inspector/dom-debugger/event-animation-frame-breakpoints.html: Added. * inspector/dom-debugger/event-breakpoint-with-navigation.html: * inspector/dom-debugger/event-timer-breakpoints-expected.txt: Added. * inspector/dom-debugger/event-timer-breakpoints.html: Added. * inspector/dom-debugger/event-listener-breakpoints-expected.txt: Renamed from LayoutTests/inspector/dom-debugger/event-breakpoints-expected.txt. * inspector/dom-debugger/event-listener-breakpoints.html: Renamed from LayoutTests/inspector/dom-debugger/event-breakpoints.html. * inspector/dom-debugger/resources/event-breakpoint-utilities.js: Added. (TestPage.registerInitializer.window.teardown): (TestPage.registerInitializer.window.failOnPause): (TestPage.registerInitializer.window.addBreakpoint): (TestPage.registerInitializer.window.removeBreakpoint): (TestPage.registerInitializer.window.disableBreakpoint): (TestPage.registerInitializer.window.awaitEvent): Canonical link: https://commits.webkit.org/203952@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@235248 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2018-08-23 21:36:40 +00:00
Web Inspector: allow event breakpoints to be configured https://bugs.webkit.org/show_bug.cgi?id=215362 <rdar://problem/66932921> Reviewed by Brian Burg. Source/JavaScriptCore: This allows developers to do things like: - only pause when `window.event.type` is a certain value - ignore the first N pauses - evaluate JavaScript whenever an event listener is invoked without pausing * inspector/protocol/DOM.json: Add an `options` paramater to `DOM.setBreakpointForEventListener` to allow configuration. * inspector/protocol/DOMDebugger.json: Add an `options` paramater to `DOMDebugger.setEventBreakpoint` to allow configuration. * debugger/Breakpoint.h: (JSC::Breakpoint::id const): Added. (JSC::Breakpoint::sourceID const): Added. (JSC::Breakpoint::lineNumber const): Added. (JSC::Breakpoint::columnNumber const): Added. (JSC::Breakpoint::condition const): Added. (JSC::Breakpoint::actions const): Added. (JSC::Breakpoint::isAutoContinue const): Added. (JSC::Breakpoint::resetHitCount): Added. (JSC::Breakpoint::isLinked const): Added. (JSC::Breakpoint::isResolved const): Added. (JSC::BreakpointsList::~BreakpointsList): Deleted. * debugger/Breakpoint.cpp: Added. (JSC::Breakpoint::Action::Action): Added. (JSC::Breakpoint::create): Added. (JSC::Breakpoint::Breakpoint): Added. (JSC::Breakpoint::link): Added. (JSC::Breakpoint::resolve): Added. (JSC::Breakpoint::shouldPause): Added. Unify `JSC::Breakpoint` and `Inspector::ScriptBreakpoint`. * debugger/DebuggerPrimitives.h: * debugger/Debugger.h: * debugger/Debugger.cpp: (JSC::Debugger::Debugger): (JSC::Debugger::addObserver): Added. (JSC::Debugger::removeObserver): Added. (JSC::Debugger::canDispatchFunctionToObservers const): Added. (JSC::Debugger::dispatchFunctionToObservers): Added. (JSC::Debugger::sourceParsed): Added. (JSC::Debugger::toggleBreakpoint): (JSC::Debugger::applyBreakpoints): (JSC::Debugger::resolveBreakpoint): (JSC::Debugger::setBreakpoint): (JSC::Debugger::removeBreakpoint): (JSC::Debugger::didHitBreakpoint): Added. (JSC::Debugger::clearBreakpoints): (JSC::Debugger::evaluateBreakpointCondition): Added. (JSC::Debugger::evaluateBreakpointActions): Added. (JSC::Debugger::schedulePauseAtNextOpportunity): Added. (JSC::Debugger::cancelPauseAtNextOpportunity): Added. (JSC::Debugger::schedulePauseForSpecialBreakpoint): Added. (JSC::Debugger::cancelPauseForSpecialBreakpoint): Added. (JSC::Debugger::continueProgram): (JSC::Debugger::stepNextExpression): (JSC::Debugger::stepIntoStatement): (JSC::Debugger::stepOverStatement): (JSC::Debugger::stepOutOfFunction): (JSC::Debugger::pauseIfNeeded): (JSC::Debugger::handlePause): Added. (JSC::Debugger::exceptionOrCaughtValue): Added. (JSC::Debugger::atExpression): (JSC::Debugger::clearNextPauseState): (JSC::Debugger::willRunMicrotask): Added. (JSC::Debugger::didRunMicrotask): Added. (JSC::Debugger::hasBreakpoint): Deleted. (JSC::Debugger::setPauseOnNextStatement): Deleted. Unify `JSC::Debugger` and `Inspector::ScriptDebugServer` to simplify breakpoint logic. Introduce the concept of a "special breakpoint", which is essentially a `JSC::Breakpoint` that is expected to pause at the next opportunity but isn't tied to a particular location. As an example, whenever an event breakpoint is hit, instead of just pausing at the next opportunity, the newly managed `JSC::Breakpoint` is used as a "special breakpoint", allowing for it's configuration (ie.g. condition, ignore count, actions, auto-continue) to be used. * inspector/agents/InspectorDebuggerAgent.h: * inspector/agents/InspectorDebuggerAgent.cpp: (Inspector::objectGroupForBreakpointAction): (Inspector::breakpointActionTypeForString): Added. (Inspector::parseBreakpointOptions): Added. (Inspector::InspectorDebuggerAgent::ProtocolBreakpoint::fromPayload): Added. (Inspector::InspectorDebuggerAgent::ProtocolBreakpoint::ProtocolBreakpoint): Added. (Inspector::InspectorDebuggerAgent::ProtocolBreakpoint::createDebuggerBreakpoint const): Added. (Inspector::InspectorDebuggerAgent::ProtocolBreakpoint::matchesScriptURL const): Added. (Inspector::InspectorDebuggerAgent::debuggerBreakpointFromPayload): Added. (Inspector::InspectorDebuggerAgent::enable): (Inspector::InspectorDebuggerAgent::disable): (Inspector::InspectorDebuggerAgent::buildBreakpointPauseReason): (Inspector::InspectorDebuggerAgent::handleConsoleAssert): (Inspector::InspectorDebuggerAgent::didScheduleAsyncCall): (Inspector::buildDebuggerLocation): (Inspector::InspectorDebuggerAgent::setBreakpointByUrl): (Inspector::InspectorDebuggerAgent::setBreakpoint): (Inspector::InspectorDebuggerAgent::didSetBreakpoint): (Inspector::InspectorDebuggerAgent::resolveBreakpoint): (Inspector::InspectorDebuggerAgent::removeBreakpoint): (Inspector::InspectorDebuggerAgent::continueToLocation): (Inspector::InspectorDebuggerAgent::schedulePauseAtNextOpportunity): Added. (Inspector::InspectorDebuggerAgent::cancelPauseAtNextOpportunity): Added. (Inspector::InspectorDebuggerAgent::schedulePauseForSpecialBreakpoint): Added. (Inspector::InspectorDebuggerAgent::cancelPauseForSpecialBreakpoint): Added. (Inspector::InspectorDebuggerAgent::pause): (Inspector::InspectorDebuggerAgent::resume): (Inspector::InspectorDebuggerAgent::didBecomeIdle): (Inspector::InspectorDebuggerAgent::sourceMapURLForScript): (Inspector::InspectorDebuggerAgent::didParseSource): (Inspector::InspectorDebuggerAgent::willRunMicrotask): (Inspector::InspectorDebuggerAgent::didRunMicrotask): (Inspector::InspectorDebuggerAgent::didPause): (Inspector::InspectorDebuggerAgent::breakpointActionSound): (Inspector::InspectorDebuggerAgent::breakpointActionProbe): (Inspector::InspectorDebuggerAgent::clearInspectorBreakpointState): (Inspector::InspectorDebuggerAgent::clearDebuggerBreakpointState): (Inspector::matches): Deleted. (Inspector::buildObjectForBreakpointCookie): Deleted. (Inspector::InspectorDebuggerAgent::breakpointActionsFromProtocol): Deleted. (Inspector::InspectorDebuggerAgent::schedulePauseOnNextStatement): Deleted. (Inspector::InspectorDebuggerAgent::cancelPauseOnNextStatement): Deleted. Create a private `ProtocolBreakpoint` class that holds the data sent by the frontend. This is necessary because breakpoints in the frontend have a potentially one-to-many relationship with breakpoints in the backend, as the same script can be loaded many times on a page. Each of those scripts is independent, however, and can execute differently, meaning that the same breakpoint for each script also needs a different state (e.g. ignore count). As such, the `ProtocolBreakpoint` is effectively a template that is actualized whenever a new script is parsed that matches the URL of the `ProtocolBreakpoint` to create a `JSC::Breakpoint` that is used by the `JSC::Debugger`. `ProtocolBreakpoint` also parses breakpoint configurations. * inspector/InspectorEnvironment.h: * inspector/JSGlobalObjectScriptDebugServer.h: * inspector/JSGlobalObjectScriptDebugServer.cpp: (Inspector::JSGlobalObjectScriptDebugServer::JSGlobalObjectScriptDebugServer): (Inspector::JSGlobalObjectScriptDebugServer::attachDebugger): (Inspector::JSGlobalObjectScriptDebugServer::detachDebugger): (Inspector::JSGlobalObjectScriptDebugServer::runEventLoopWhilePaused): * inspector/agents/InspectorAuditAgent.h: * inspector/agents/InspectorAuditAgent.cpp: (Inspector::InspectorAuditAgent::run): * inspector/agents/InspectorRuntimeAgent.h: * inspector/agents/InspectorRuntimeAgent.cpp: (Inspector::setPauseOnExceptionsState): (Inspector::InspectorRuntimeAgent::evaluate): (Inspector::InspectorRuntimeAgent::callFunctionOn): (Inspector::InspectorRuntimeAgent::getPreview): (Inspector::InspectorRuntimeAgent::getProperties): (Inspector::InspectorRuntimeAgent::getDisplayableProperties): * inspector/agents/InspectorScriptProfilerAgent.cpp: * inspector/agents/JSGlobalObjectDebuggerAgent.h: Replace `Inspector::ScriptDebugServer` with `JSC::Debugger`. * runtime/JSMicrotask.cpp: (JSC::JSMicrotask::run): Drive-by: r248894 mistakenly omitted the call to notify the debugger that the microtask ran. * inspector/ScriptBreakpoint.h: Removed. * inspector/ScriptDebugListener.h: Removed. * inspector/ScriptDebugServer.h: Removed. * inspector/ScriptDebugServer.cpp: Removed. * CMakeLists.txt: * JavaScriptCore.xcodeproj/project.pbxproj: * Sources.txt: Source/WebCore: This allows developers to do things like: - only pause when `window.event.type` is a certain value - ignore the first N pauses - evaluate JavaScript whenever an event listener is invoked without pausing Tests: inspector/dom/breakpoint-for-event-listener.html inspector/dom-debugger/event-animation-frame-breakpoints.html inspector/dom-debugger/event-interval-breakpoints.html inspector/dom-debugger/event-listener-breakpoints.html inspector/dom-debugger/event-timeout-breakpoints.html * inspector/agents/InspectorDOMAgent.h: * inspector/agents/InspectorDOMAgent.cpp: (WebCore::InspectorDOMAgent::getEventListenersForNode): (WebCore::InspectorDOMAgent::setBreakpointForEventListener): (WebCore::InspectorDOMAgent::removeBreakpointForEventListener): (WebCore::InspectorDOMAgent::buildObjectForEventListener): (WebCore::InspectorDOMAgent::breakpointForEventListener): (WebCore::InspectorDOMAgent::hasBreakpointForEventListener): Deleted. * inspector/agents/InspectorDOMDebuggerAgent.h: * inspector/agents/InspectorDOMDebuggerAgent.cpp: (WebCore::InspectorDOMDebuggerAgent::disable): (WebCore::InspectorDOMDebuggerAgent::mainFrameNavigated): (WebCore::InspectorDOMDebuggerAgent::setEventBreakpoint): (WebCore::InspectorDOMDebuggerAgent::removeEventBreakpoint): (WebCore::InspectorDOMDebuggerAgent::willHandleEvent): (WebCore::InspectorDOMDebuggerAgent::didHandleEvent): (WebCore::InspectorDOMDebuggerAgent::willFireTimer): (WebCore::InspectorDOMDebuggerAgent::didFireTimer): * inspector/agents/page/PageDOMDebuggerAgent.h: * inspector/agents/page/PageDOMDebuggerAgent.cpp: (WebCore::PageDOMDebuggerAgent::disable): (WebCore::PageDOMDebuggerAgent::mainFrameNavigated): (WebCore::PageDOMDebuggerAgent::willFireAnimationFrame): (WebCore::PageDOMDebuggerAgent::didFireAnimationFrame): (WebCore::PageDOMDebuggerAgent::setAnimationFrameBreakpoint): * inspector/agents/worker/WorkerDOMDebuggerAgent.h: * inspector/agents/worker/WorkerDOMDebuggerAgent.cpp: (WebCore::WorkerDOMDebuggerAgent::setAnimationFrameBreakpoint): Keep a `JSC::Breakpoint` for each event breakpoint instead of a simple `bool`, allowing for configuration when the breakpoint is first set. When any of these breakpoints are hit, pass it to the `JSC::Debugger` as a "special breakpoint", which behaves the same as "pause ASAP" but also supports a condition, an ignore count, actions, and auto-continue. Reset the hit count for any of these "special breakpoints" that persist across Web Inspector sessions when the main frame navigates. * inspector/PageScriptDebugServer.h: * inspector/PageScriptDebugServer.cpp: (WebCore::PageScriptDebugServer::PageScriptDebugServer): (WebCore::PageScriptDebugServer::attachDebugger): (WebCore::PageScriptDebugServer::detachDebugger): (WebCore::PageScriptDebugServer::didPause): (WebCore::PageScriptDebugServer::didContinue): (WebCore::PageScriptDebugServer::runEventLoopWhilePaused): (WebCore::PageScriptDebugServer::runEventLoopWhilePausedInternal): (WebCore::PageScriptDebugServer::isContentScript const): (WebCore::PageScriptDebugServer::reportException const): * inspector/WorkerScriptDebugServer.h: * inspector/WorkerScriptDebugServer.cpp: (WebCore::WorkerScriptDebugServer::WorkerScriptDebugServer): (WebCore::WorkerScriptDebugServer::attachDebugger): (WebCore::WorkerScriptDebugServer::detachDebugger): (WebCore::WorkerScriptDebugServer::runEventLoopWhilePaused): (WebCore::WorkerScriptDebugServer::reportException const): * inspector/agents/page/PageDebuggerAgent.h: * inspector/agents/page/PageDebuggerAgent.cpp: (WebCore::PageDebuggerAgent::sourceMapURLForScript): Replace `Inspector::ScriptDebugServer` with `JSC::Debugger`. * inspector/TimelineRecordFactory.h: * inspector/TimelineRecordFactory.cpp: (WebCore::TimelineRecordFactory::createProbeSampleData): * inspector/agents/InspectorTimelineAgent.h: * inspector/agents/InspectorTimelineAgent.cpp: (WebCore::InspectorTimelineAgent::internalStart): (WebCore::InspectorTimelineAgent::internalStop): (WebCore::InspectorTimelineAgent::breakpointActionProbe): Replace `Inspector::ScriptBreakpoint` with `JSC::Breakpoint`. * inspector/InspectorInstrumentation.h: (WebCore::InspectorInstrumentation::didHandleEvent): (WebCore::InspectorInstrumentation::didFireTimer): * inspector/InspectorInstrumentation.cpp: (WebCore::InspectorInstrumentation::didHandleEventImpl): (WebCore::InspectorInstrumentation::didFireTimerImpl): (WebCore::InspectorInstrumentation::didCommitLoadImpl): (WebCore::InspectorInstrumentation::didFireAnimationFrameImpl): * dom/EventTarget.cpp: (WebCore::EventTarget::innerInvokeEventListeners): * page/DOMTimer.cpp: (WebCore::DOMTimer::fired): When notifying Web Inspector that activity did occur, include all information previously included when notifying Web Inspector that that activity was about to occur so that Web Inspector can know whether a pause for the "special breakpoint" for that activity is still scheduled and if so cancel it. Source/WebInspectorUI: This allows developers to do things like: - only pause when `window.event.type` is a certain value - ignore the first N pauses - evaluate JavaScript whenever an event listener is invoked without pausing * UserInterface/Models/Breakpoint.js: (WI.Breakpoint): (WI.Breakpoint.prototype.toJSON): (WI.Breakpoint.prototype.get special): Added. (WI.Breakpoint.prototype.get removable): Added. (WI.Breakpoint.prototype.get editable): Added. (WI.Breakpoint.prototype.set condition): (WI.Breakpoint.prototype.get ignoreCount): (WI.Breakpoint.prototype.set ignoreCount): (WI.Breakpoint.prototype.get autoContinue): (WI.Breakpoint.prototype.set autoContinue): (WI.Breakpoint.prototype.get actions): (WI.Breakpoint.prototype.get probeActions): (WI.Breakpoint.prototype.cycleToNextMode): (WI.Breakpoint.prototype.createAction): (WI.Breakpoint.prototype.recreateAction): (WI.Breakpoint.prototype.removeAction): (WI.Breakpoint.prototype.clearActions): (WI.Breakpoint.prototype.remove): Added. (WI.Breakpoint.prototype.optionsToProtocol): Added. (WI.Breakpoint.prototype.breakpointActionDidChange): (WI.Breakpoint.fromJSON): Deleted. (WI.Breakpoint.prototype.get sourceCodeLocation): Deleted. (WI.Breakpoint.prototype.get contentIdentifier): Deleted. (WI.Breakpoint.prototype.get scriptIdentifier): Deleted. (WI.Breakpoint.prototype.get target): Deleted. (WI.Breakpoint.prototype.get identifier): Deleted. (WI.Breakpoint.prototype.set identifier): Deleted. (WI.Breakpoint.prototype.get resolved): Deleted. (WI.Breakpoint.prototype.set resolved): Deleted. (WI.Breakpoint.prototype.saveIdentityToCookie): Deleted. (WI.Breakpoint.prototype._isSpecial): Deleted. (WI.Breakpoint.prototype._sourceCodeLocationLocationChanged): Deleted. (WI.Breakpoint.prototype._sourceCodeLocationDisplayLocationChanged): Deleted. * UserInterface/Models/DOMBreakpoint.js: (WI.DOMBreakpoint): (WI.DOMBreakpoint.fromJSON): Added. (WI.DOMBreakpoint.prototype.remove): Added. (WI.DOMBreakpoint.prototype.toJSON): (WI.DOMBreakpoint.deserialize): Deleted. (WI.DOMBreakpoint.prototype.get disabled): Deleted. (WI.DOMBreakpoint.prototype.set disabled): Deleted. * UserInterface/Models/EventBreakpoint.js: (WI.EventBreakpoint): (WI.EventBreakpoint.fromJSON): Added. (WI.EventBreakpoint.prototype.get special): Added. (WI.EventBreakpoint.prototype.get editable): Added. (WI.EventBreakpoint.prototype.remove): Added. (WI.EventBreakpoint.prototype.saveIdentityToCookie): (WI.EventBreakpoint.prototype.toJSON): (WI.EventBreakpoint.deserialize): Deleted. (WI.EventBreakpoint.prototype.get disabled): Deleted. (WI.EventBreakpoint.prototype.set disabled): Deleted. * UserInterface/Models/JavaScriptBreakpoint.js: Copied from UserInterface/Models/Breakpoint.js. (WI.JavaScriptBreakpoint): (WI.JavaScriptBreakpoint.fromJSON): (WI.JavaScriptBreakpoint.prototype.toJSON): (WI.JavaScriptBreakpoint.prototype.get sourceCodeLocation): (WI.JavaScriptBreakpoint.prototype.get contentIdentifier): (WI.JavaScriptBreakpoint.prototype.get scriptIdentifier): (WI.JavaScriptBreakpoint.prototype.get target): (WI.JavaScriptBreakpoint.prototype.get special): Added. (WI.JavaScriptBreakpoint.prototype.get removable): Added. (WI.JavaScriptBreakpoint.prototype.get editable): Added. (WI.JavaScriptBreakpoint.prototype.get identifier): (WI.JavaScriptBreakpoint.prototype.set identifier): (WI.JavaScriptBreakpoint.prototype.get resolved): (WI.JavaScriptBreakpoint.prototype.set resolved): (WI.JavaScriptBreakpoint.prototype.remove): Added. (WI.JavaScriptBreakpoint.prototype.saveIdentityToCookie): (WI.JavaScriptBreakpoint.prototype._isSpecial): (WI.JavaScriptBreakpoint.prototype._sourceCodeLocationLocationChanged): (WI.JavaScriptBreakpoint.prototype._sourceCodeLocationDisplayLocationChanged): * UserInterface/Models/URLBreakpoint.js: (WI.URLBreakpoint): (WI.URLBreakpoint.fromJSON): Added. (WI.URLBreakpoint.prototype.get special): Added. (WI.URLBreakpoint.prototype.remove): Added. (WI.URLBreakpoint.prototype.toJSON): (WI.URLBreakpoint.deserialize): Deleted. (WI.URLBreakpoint.prototype.get disabled): Deleted. (WI.URLBreakpoint.prototype.set disabled): Deleted. Rename `WI.Breakpoint` to `WI.JavaScriptBreakpoint` and use `WI.Breakpoint` as a new common base class for all breakpoint types, allowing more logic to be shared (e.g. disabled state). Additionally, breakpoints are now able to - determine whether or not they're - special - removable - editable (i.e. configurable) - remove themselves without the caller needing to know what manager to consult with. * UserInterface/Controllers/DOMManager.js: (WI.DOMManager): (WI.DOMManager.supportsEventListenerBreakpointConfiguration): Added. (WI.DOMManager.prototype.setBreakpointForEventListener): (WI.DOMManager.prototype.removeBreakpointForEventListener): (WI.DOMManager.prototype._setEventBreakpoint): Added. (WI.DOMManager.prototype._removeEventBreakpoint): Added. (WI.DOMManager.prototype._handleEventBreakpointEditablePropertyChanged): Added. (WI.DOMManager.prototype._handleEventBreakpointActionsChanged): Added. (WI.DOMManager.prototype._updateEventBreakpoint): Deleted. Keep track of configuration changes for specific listener breakpoints. * UserInterface/Controllers/DOMDebuggerManager.js: (WI.DOMDebuggerManager): (WI.DOMDebuggerManager.prototype.initializeTarget): (WI.DOMDebuggerManager.prototype.addDOMBreakpoint): (WI.DOMDebuggerManager.prototype.removeDOMBreakpoint): (WI.DOMDebuggerManager.prototype.addEventBreakpoint): (WI.DOMDebuggerManager.prototype.removeEventBreakpoint): (WI.DOMDebuggerManager.prototype.addURLBreakpoint): (WI.DOMDebuggerManager.prototype.removeURLBreakpoint): (WI.DOMDebuggerManager.prototype._commandArgumentsForEventBreakpoint): Added. (WI.DOMDebuggerManager.prototype._setEventBreakpoint): Added. (WI.DOMDebuggerManager.prototype._removeEventBreakpoint): Added. (WI.DOMDebuggerManager.prototype._handleEventBreakpointDisabledStateChanged): Added. (WI.DOMDebuggerManager.prototype._handleEventBreakpointEditablePropertyChanged): Added. (WI.DOMDebuggerManager.prototype._handleEventBreakpointActionsChanged): Added. (WI.DOMDebuggerManager.prototype.isBreakpointSpecial): Deleted. (WI.DOMDebuggerManager.prototype._updateEventBreakpoint): Deleted. Keep track of configuration changes for special event breakpoints. Store special event breakpoints inside `WI.objectStores.eventBreakpoints`. * UserInterface/Controllers/DebuggerManager.js: (WI.DebuggerManager): (WI.DebuggerManager.prototype.addBreakpoint): (WI.DebuggerManager.prototype.removeBreakpoint): (WI.DebuggerManager.prototype.addProbesForBreakpoint): Added. (WI.DebuggerManager.prototype.removeProbesForBreakpoint): Added. (WI.DebuggerManager.prototype.updateProbesForBreakpoint): Added. (WI.DebuggerManager.prototype._setBreakpoint): (WI.DebuggerManager.prototype._breakpointEditablePropertyDidChange): (WI.DebuggerManager.prototype._handleBreakpointActionsDidChange): (WI.DebuggerManager.prototype.isBreakpointRemovable): Deleted. (WI.DebuggerManager.prototype.isBreakpointSpecial): Deleted. (WI.DebuggerManager.prototype.isBreakpointEditable): Deleted. (WI.DebuggerManager.prototype._debuggerBreakpointActionType): Deleted. (WI.DebuggerManager.prototype._debuggerBreakpointOptions): Deleted. (WI.DebuggerManager.prototype._addProbesForBreakpoint): Deleted. (WI.DebuggerManager.prototype._removeProbesForBreakpoint): Deleted. (WI.DebuggerManager.prototype._updateProbesForBreakpoint): Deleted. Replace `WI.Breakpoint` with `WI.JavaScriptBreakpoint`. Probes now support `WI.EventBreakpoint` in addition to `WI.JavaScriptBreakpoint`. * UserInterface/Controllers/BreakpointPopoverController.js: (WI.BreakpointPopoverController.prototype.appendContextMenuItems): (WI.BreakpointPopoverController.prototype._createPopoverContent): Allow any breakpoint instead of only `WI.JavaScriptBreakpoint`. Drive-by: the existing `ignoreCount` value wasn't being used to populate the `<input>`. * UserInterface/Views/BreakpointTreeElement.js: (WI.BreakpointTreeElement.prototype.ondelete): (WI.BreakpointTreeElement.prototype.get listenerSet): Added. (WI.BreakpointTreeElement.prototype.updateStatus): Added. (WI.BreakpointTreeElement.prototype.updateTitles): Added. (WI.BreakpointTreeElement.prototype.get breakpoint): Deleted. (WI.BreakpointTreeElement.prototype.get filterableData): Deleted. (WI.BreakpointTreeElement.prototype._updateTitles): Deleted. (WI.BreakpointTreeElement.prototype._updateStatus): Deleted. (WI.BreakpointTreeElement.prototype._breakpointLocationDidChange): Deleted. * UserInterface/Views/BreakpointTreeElement.css: (.item.breakpoint .status > .status-image): (.item.breakpoint.paused .icon): Added. (@media (prefers-color-scheme: dark) .item.breakpoint.paused .icon): Added. (.item.breakpoint .status > .status-image.resolved): Deleted. (body:not(.window-inactive, .window-docked-inactive) .tree-outline:focus-within .item.breakpoint.selected .status > .status-image.resolved): Deleted. (.item.breakpoint .subtitle.formatted-location): Deleted. (.breakpoint-debugger-statement-icon .icon): Deleted. (.breakpoint-exception-icon .icon): Deleted. (.breakpoint-assertion-icon .icon): Deleted. (.breakpoint-microtask-icon .icon): Deleted. (.breakpoint-paused-icon .icon): Deleted. (.breakpoint-generic-line-icon .icon): Deleted. (.breakpoint-generic-line-icon .icon > span): Deleted. (.data-updated.breakpoint-generic-line-icon .icon > span): Deleted. (@media (prefers-color-scheme: dark) .breakpoint-debugger-statement-icon .icon): Deleted. (@media (prefers-color-scheme: dark) .breakpoint-exception-icon .icon): Deleted. (@media (prefers-color-scheme: dark) .breakpoint-assertion-icon .icon): Deleted. (@media (prefers-color-scheme: dark) .breakpoint-microtask-icon .icon): Deleted. (@media (prefers-color-scheme: dark) .breakpoint-paused-icon .icon): Deleted. (@media (prefers-color-scheme: dark) .breakpoint-generic-line-icon .icon): Deleted. * UserInterface/Views/DOMBreakpointTreeElement.js: (WI.DOMBreakpointTreeElement): (WI.DOMBreakpointTreeElement.prototype.onattach): Deleted. (WI.DOMBreakpointTreeElement.prototype.ondetach): Deleted. (WI.DOMBreakpointTreeElement.prototype.ondelete): Deleted. (WI.DOMBreakpointTreeElement.prototype.onenter): Deleted. (WI.DOMBreakpointTreeElement.prototype.onspace): Deleted. (WI.DOMBreakpointTreeElement.prototype.populateContextMenu): Deleted. (WI.DOMBreakpointTreeElement.prototype._statusImageElementClicked): Deleted. (WI.DOMBreakpointTreeElement.prototype._statusImageElementFocused): Deleted. (WI.DOMBreakpointTreeElement.prototype._statusImageElementMouseDown): Deleted. (WI.DOMBreakpointTreeElement.prototype._toggleBreakpoint): Deleted. (WI.DOMBreakpointTreeElement.prototype._updateStatus): Deleted. * UserInterface/Views/DOMBreakpointTreeElement.css: (.item.breakpoint.dom.subtree-modified:not(.paused) .icon): Added. (.item.breakpoint.dom.attribute-modified:not(.paused) .icon): Added. (.item.breakpoint.dom.node-removed:not(.paused) .icon): Added. (@media (prefers-color-scheme: dark) .item.breakpoint.dom.subtree-modified:not(.paused) .icon): Added. (@media (prefers-color-scheme: dark) .item.breakpoint.dom.attribute-modified:not(.paused) .icon): Added. (@media (prefers-color-scheme: dark) .item.breakpoint.dom.node-removed:not(.paused) .icon): Added. (.breakpoint.dom.breakpoint-for-subtree-modified:not(.breakpoint-paused-icon) .icon): Deleted. (.breakpoint.dom.breakpoint-for-attribute-modified:not(.breakpoint-paused-icon) .icon): Deleted. (.breakpoint.dom.breakpoint-for-node-removed:not(.breakpoint-paused-icon) .icon): Deleted. (@media (prefers-color-scheme: dark) .breakpoint.dom.breakpoint-for-subtree-modified:not(.breakpoint-paused-icon) .icon): Deleted. (@media (prefers-color-scheme: dark) .breakpoint.dom.breakpoint-for-attribute-modified:not(.breakpoint-paused-icon) .icon): Deleted. (@media (prefers-color-scheme: dark) .breakpoint.dom.breakpoint-for-node-removed:not(.breakpoint-paused-icon) .icon): Deleted. * UserInterface/Views/EventBreakpointTreeElement.js: (WI.EventBreakpointTreeElement): (WI.EventBreakpointTreeElement.prototype.onattach): Deleted. (WI.EventBreakpointTreeElement.prototype.ondetach): Deleted. (WI.EventBreakpointTreeElement.prototype.ondelete): Deleted. (WI.EventBreakpointTreeElement.prototype.onenter): Deleted. (WI.EventBreakpointTreeElement.prototype.onspace): Deleted. (WI.EventBreakpointTreeElement.prototype.populateContextMenu): Deleted. (WI.EventBreakpointTreeElement.prototype._statusImageElementClicked): Deleted. (WI.EventBreakpointTreeElement.prototype._statusImageElementFocused): Deleted. (WI.EventBreakpointTreeElement.prototype._statusImageElementMouseDown): Deleted. (WI.EventBreakpointTreeElement.prototype._toggleBreakpoint): Deleted. (WI.EventBreakpointTreeElement.prototype._updateStatus): Deleted. * UserInterface/Views/EventBreakpointTreeElement.css: (.item.breakpoint.event.animation-frame:not(.paused) .icon): Added. (.item.breakpoint.event.interval:not(.paused) .icon): Added. (.item.breakpoint.event.listener:not(.paused) .icon): Added. (.item.breakpoint.event.timeout:not(.paused) .icon): Added. (@media(prefers-color-scheme: dark) .item.breakpoint.event.animation-frame:not(.paused) .icon): Added. (@media(prefers-color-scheme: dark) .item.breakpoint.event.interval:not(.paused) .icon): Added. (@media(prefers-color-scheme: dark) .item.breakpoint.event.listener:not(.paused) .icon): Added. (@media(prefers-color-scheme: dark) .item.breakpoint.event.timeout:not(.paused) .icon): Added. (.breakpoint.event.breakpoint-for-animation-frame:not(.breakpoint-paused-icon) .icon): Deleted. (.breakpoint.event.breakpoint-for-interval:not(.breakpoint-paused-icon) .icon): Deleted. (.breakpoint.event.breakpoint-for-listener:not(.breakpoint-paused-icon) .icon): Deleted. (.breakpoint.event.breakpoint-for-timeout:not(.breakpoint-paused-icon) .icon): Deleted. (@media(prefers-color-scheme: dark) .breakpoint.event.breakpoint-for-animation-frame:not(.breakpoint-paused-icon) .icon): Deleted. (@media(prefers-color-scheme: dark) .breakpoint.event.breakpoint-for-interval:not(.breakpoint-paused-icon) .icon): Deleted. (@media(prefers-color-scheme: dark) .breakpoint.event.breakpoint-for-listener:not(.breakpoint-paused-icon) .icon): Deleted. (@media(prefers-color-scheme: dark) .breakpoint.event.breakpoint-for-timeout:not(.breakpoint-paused-icon) .icon): Deleted. * UserInterface/Views/JavaScriptBreakpointTreeElement.js: Copied from Source/WebInspectorUI/UserInterface/Views/BreakpointTreeElement.js. (WI.JavaScriptBreakpointTreeElement): (WI.JavaScriptBreakpointTreeElement.prototype.get filterableData): (WI.JavaScriptBreakpointTreeElement.prototype.updateStatus): Added. (WI.JavaScriptBreakpointTreeElement.prototype.updateTitles): Added. (WI.JavaScriptBreakpointTreeElement.prototype._breakpointLocationDidChange): * UserInterface/Views/JavaScriptBreakpointTreeElement.css: Copied from Source/WebInspectorUI/UserInterface/Views/BreakpointTreeElement.css. (.item.breakpoint.javascript .status > .status-image): Added. (.item.breakpoint.javascript .status > .status-image.resolved): Added. (body:not(.window-inactive, .window-docked-inactive) .tree-outline:focus-within .item.breakpoint.javascript.selected .status > .status-image.resolved): Added. (.item.breakpoint.javascript .subtitle.formatted-location): Added. (.item.breakpoint.javascript.line .icon): Added. (.item.breakpoint.javascript.line .icon > span): Added. (.data-updated.item.breakpoint.javascript.line .icon > span): Added. (.item.breakpoint.javascript.debugger-statement .icon): Added. (.item.breakpoint.javascript.exception .icon): Added. (.item.breakpoint.javascript.assertion .icon): Added. (.item.breakpoint.javascript.microtask .icon): Added. (@media (prefers-color-scheme: dark) .item.breakpoint.javascript.line .icon): Added. (@media (prefers-color-scheme: dark) .item.breakpoint.javascript.debugger-statement .icon): Added. (@media (prefers-color-scheme: dark) .item.breakpoint.javascript.exception .icon): Added. (@media (prefers-color-scheme: dark) .item.breakpoint.javascript.assertion .icon): Added. (@media (prefers-color-scheme: dark) .item.breakpoint.javascript.microtask .icon): Added. * UserInterface/Views/URLBreakpointTreeElement.js: (WI.URLBreakpointTreeElement): (WI.URLBreakpointTreeElement.prototype.onattach): Deleted. (WI.URLBreakpointTreeElement.prototype.ondetach): Deleted. (WI.URLBreakpointTreeElement.prototype.ondelete): Deleted. (WI.URLBreakpointTreeElement.prototype.onenter): Deleted. (WI.URLBreakpointTreeElement.prototype.onspace): Deleted. (WI.URLBreakpointTreeElement.prototype.populateContextMenu): Deleted. (WI.URLBreakpointTreeElement.prototype._statusImageElementClicked): Deleted. (WI.URLBreakpointTreeElement.prototype._statusImageElementFocused): Deleted. (WI.URLBreakpointTreeElement.prototype._statusImageElementMouseDown): Deleted. (WI.URLBreakpointTreeElement.prototype._toggleBreakpoint): Deleted. (WI.URLBreakpointTreeElement.prototype._updateStatus): Deleted. * UserInterface/Views/URLBreakpointTreeElement.css: (.item.breakpoint.url .subtitle): Added. (.item.breakpoint.url:not(.paused) .icon): Added. (@media (prefers-color-scheme: dark) .item.breakpoint.url:not(.paused) .icon): Added. (.breakpoint.url .subtitle): Deleted. (.breakpoint.url:not(.breakpoint-paused-icon) .icon): Deleted. (@media (prefers-color-scheme: dark) .breakpoint.url:not(.breakpoint-paused-icon) .icon): Deleted. Rename `WI.BreakpointTreeElement` to `WI.JavaScriptBreakpointTreeElement` and use `WI.BreakpointTreeElement` as a new common base class for all breakpoint tree elements, allowing more logic and styles to be shared (e.g. disabled state). * UserInterface/Views/SourcesNavigationSidebarPanel.js: (WI.SourcesNavigationSidebarPanel): (WI.SourcesNavigationSidebarPanel.prototype.closed): (WI.SourcesNavigationSidebarPanel.prototype._insertDebuggerTreeElement): (WI.SourcesNavigationSidebarPanel.prototype._compareJavaScriptBreakpointTreeElements): Added. (WI.SourcesNavigationSidebarPanel.prototype._addBreakpoint): (WI.SourcesNavigationSidebarPanel.prototype._removeAllBreakpoints): (WI.SourcesNavigationSidebarPanel.prototype._breakpointsBeneathTreeElement): (WI.SourcesNavigationSidebarPanel.prototype._addIssue): (WI.SourcesNavigationSidebarPanel.prototype._updatePauseReasonSection): (WI.SourcesNavigationSidebarPanel.prototype._handleTreeSelectionDidChange): (WI.SourcesNavigationSidebarPanel.prototype._handleBreakpointElementAddedOrRemoved): (WI.SourcesNavigationSidebarPanel.prototype._populateCreateBreakpointContextMenu.addToggleForSpecialEventBreakpoint): (WI.SourcesNavigationSidebarPanel.prototype._populateCreateBreakpointContextMenu): (WI.SourcesNavigationSidebarPanel.prototype._handleDebuggerObjectDisplayLocationDidChange): (WI.SourcesNavigationSidebarPanel.prototype._compareBreakpointTreeElements): Deleted. * UserInterface/Models/ProbeSet.js: (WI.ProbeSet): (WI.ProbeSet.prototype.createProbe): (WI.ProbeSet.prototype.willRemove): * UserInterface/Controllers/TimelineManager.js: (WI.TimelineManager.prototype._processRecord): * UserInterface/Views/ProbeSetDetailsSection.js: (WI.ProbeSetDetailsSection): * UserInterface/Views/ProbeDetailsSidebarPanel.js: (WI.ProbeDetailsSidebarPanel.prototype.inspect): * UserInterface/Views/SourceCodeTextEditor.js: (WI.SourceCodeTextEditor): (WI.SourceCodeTextEditor.prototype.close): (WI.SourceCodeTextEditor.prototype.textEditorBreakpointAdded): * UserInterface/Views/TextResourceContentView.js: (WI.TextResourceContentView.prototype.get supplementalRepresentedObjects): (WI.TextResourceContentView.prototype._probeSetsChanged): Probes now support `WI.EventBreakpoint` in addition to `WI.JavaScriptBreakpoint`. * UserInterface/Views/ContentView.js: (WI.ContentView.createFromRepresentedObject): (WI.ContentView.resolvedRepresentedObjectForRepresentedObject): (WI.ContentView.isViewable): * UserInterface/Views/ContextMenuUtilities.js: (WI.appendContextMenuItemsForSourceCode): Replace `WI.Breakpoint` with `WI.JavaScriptBreakpoint`. * UserInterface/Views/DOMTreeContentView.js: (WI.DOMTreeContentView): Replace `WI.DOMBreakpoint` with `WI.Breakpoint`. * UserInterface/Views/EventListenerSectionGroup.js: (WI.EventListenerSectionGroup): * UserInterface/Views/EventListenerSectionGroup.css: (.event-listener-section > .content input[type="checkbox"] + .go-to-arrow): Added. (.event-listener-section > .content input[type="checkbox"]:not(:checked) + .go-to-arrow): Added. Add a go-to arrow next to the Breakpoint checkbox that reveals the `WI.EventBreakpoint` in the Sources Tab. * UserInterface/Views/BreakpointActionView.js: (WI.BreakpointActionView.prototype._appendActionButtonClicked): Drive-by: minor code cleanup. * UserInterface/Views/CallFrameTreeElement.js: (WI.CallFrameTreeElement.prototype.populateContextMenu): Drive-by: include source code location context menu items. * UserInterface/Base/Setting.js: * UserInterface/Main.html: * UserInterface/Test.html: LayoutTests: * inspector/dom-debugger/resources/event-breakpoint-utilities.js: (TestPage.registerInitializer.InspectorTest.EventBreakpoint.addBreakpointOptionsTestCases): Added. (TestPage.registerInitializer.InspectorTest.EventBreakpoint.async teardown): (TestPage.registerInitializer.InspectorTest.EventBreakpoint.createBreakpoint): (TestPage.registerInitializer.InspectorTest.EventBreakpoint.removeBreakpoint): * inspector/dom/breakpoint-for-event-listener.html: * inspector/dom/breakpoint-for-event-listener-expected.txt: * inspector/dom-debugger/event-animation-frame-breakpoints.html: * inspector/dom-debugger/event-animation-frame-breakpoints-expected.txt: * inspector/dom-debugger/event-interval-breakpoints.html: * inspector/dom-debugger/event-interval-breakpoints-expected.txt: * inspector/dom-debugger/event-listener-breakpoints.html: * inspector/dom-debugger/event-listener-breakpoints-expected.txt: * inspector/dom-debugger/event-timeout-breakpoints.html: * inspector/dom-debugger/event-timeout-breakpoints-expected.txt: Add tests for new event breakpoint configuration options. * http/tests/inspector/debugger/debugger-test.js: (TestPage.registerInitializer.InspectorTest.startTracingBreakpoints): * http/tests/inspector/resources/probe-test.js: (TestPage.registerInitializer.ProtocolTest.Probe.installTracingListeners): * inspector/debugger/breakpoint-action-eval.html: * inspector/debugger/breakpoint-action-log.html: * inspector/debugger/breakpoint-columns.html: * inspector/debugger/breakpoint-scope.html: * inspector/debugger/debugger-stack-overflow.html: * inspector/debugger/pause-reason.html: * inspector/debugger/probe-manager-add-remove-actions.html: * inspector/debugger/stepping/stepping-through-autoContinue-breakpoint.html: * inspector/debugger/tail-deleted-frames-this-value.html: * inspector/debugger/tail-recursion.html: * inspector/worker/debugger-pause.html: * inspector/worker/debugger-shared-breakpoint.html: Update existing breakpoint tests to use new model objects. Canonical link: https://commits.webkit.org/228551@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@266074 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2020-08-24 17:34:12 +00:00
InspectorTest.EventBreakpoint.createBreakpoint(WI.EventBreakpoint.Type.Listener, {eventName})
Web Inspector: support breakpoints for timers and animation-frame events https://bugs.webkit.org/show_bug.cgi?id=188778 Reviewed by Brian Burg. Source/JavaScriptCore: * inspector/protocol/Debugger.json: Add `AnimationFrame` and `Timer` types to the list of pause reasons. * inspector/protocol/DOMDebugger.json: Introduced `setEventBreakpoint` and `removeEventBreakpoint` to replace the more specific: - `setEventListenerBreakpoint` - `removeEventListenerBreakpoint` - `setInstrumentationBreakpoint` - `removeInstrumentationBreakpoint` Also created an `EventBreakpointType` to enumerate the available types of event breakpoints. * inspector/scripts/codegen/generate_cpp_protocol_types_header.py: (CppProtocolTypesHeaderGenerator.generate_output): (CppProtocolTypesHeaderGenerator._generate_forward_declarations_for_binding_traits): (CppProtocolTypesHeaderGenerator._generate_declarations_for_enum_conversion_methods): (CppProtocolTypesHeaderGenerator._generate_hash_declarations): Added. Generate `DefaultHash` for all `enum class` used by inspector protocols. * inspector/scripts/tests/generic/expected/commands-with-async-attribute.json-result: * inspector/scripts/tests/generic/expected/commands-with-optional-call-return-parameters.json-result: * inspector/scripts/tests/generic/expected/enum-values.json-result: * inspector/scripts/tests/generic/expected/type-declaration-array-type.json-result: * inspector/scripts/tests/generic/expected/type-declaration-enum-type.json-result: * inspector/scripts/tests/generic/expected/type-declaration-object-type.json-result: * inspector/scripts/tests/generic/expected/type-requiring-runtime-casts.json-result: Source/WebCore: The original implementation of "instrumentation" breakpoints relied upon the frontend sending somewhat arbitrary strings when enabling breakpoints for specific events. As an example, setting a breakpoint for `requestAnimationFrame` expects `"animationFrameFired"` as the string, which doesn't make much sense. This patch removes the usage of these strings and instead expects the agent to implement a method that matches what is happening. Tests: inspector/dom-debugger/event-animation-frame-breakpoints.html inspector/dom-debugger/event-listener-breakpoints.html inspector/dom-debugger/event-timer-breakpoints.html * inspector/InspectorInstrumentation.h: (WebCore::InspectorInstrumentation::willFireTimer): * inspector/InspectorInstrumentation.cpp: (WebCore::InspectorInstrumentation::didInstallTimerImpl): (WebCore::InspectorInstrumentation::didRemoveTimerImpl): (WebCore::InspectorInstrumentation::willFireTimerImpl): (WebCore::InspectorInstrumentation::didRequestAnimationFrameImpl): (WebCore::InspectorInstrumentation::didCancelAnimationFrameImpl): (WebCore::InspectorInstrumentation::willFireAnimationFrameImpl): (WebCore::InspectorInstrumentation::pauseOnNativeEventIfNeeded): Deleted. * inspector/agents/InspectorDOMDebuggerAgent.h: * inspector/agents/InspectorDOMDebuggerAgent.cpp: (WebCore::InspectorDOMDebuggerAgent::setEventBreakpoint): Added. (WebCore::InspectorDOMDebuggerAgent::removeEventBreakpoint): Added. (WebCore::InspectorDOMDebuggerAgent::willHandleEvent): (WebCore::InspectorDOMDebuggerAgent::willFireTimer): Added. (WebCore::InspectorDOMDebuggerAgent::willFireAnimationFrame): Added. (WebCore::InspectorDOMDebuggerAgent::setEventListenerBreakpoint): Deleted. (WebCore::InspectorDOMDebuggerAgent::setInstrumentationBreakpoint): Deleted. (WebCore::InspectorDOMDebuggerAgent::setBreakpoint): Deleted. (WebCore::InspectorDOMDebuggerAgent::removeEventListenerBreakpoint): Deleted. (WebCore::InspectorDOMDebuggerAgent::removeInstrumentationBreakpoint): Deleted. (WebCore::InspectorDOMDebuggerAgent::removeBreakpoint): Deleted. (WebCore::InspectorDOMDebuggerAgent::pauseOnNativeEventIfNeeded): Deleted. Unify the event listener and instrumentation breakpoint commands into a single method, `setEventBreakpoint`, that takes in both an `EventBreakpointType` and `eventName`. * page/DOMTimer.cpp: (WebCore::DOMTimer::fired): Source/WebInspectorUI: Add a `type` to `WI.EventBreakpoint` that matches `DOMDebugger.EventBreakpointType`: - `AnimationFrame` for `requestAnimationFrame` - `Listener` for any named DOM Event - `Timer` for `setTimeout` and `setInterval` Modified `WI.EventBreakpointPopover` to provide ways for selecting these other types, which is then passed to `WI.DOMDebuggerManager`, which now calls through to the newly added `DOMDebugger.removeEventBreakpoint` and `DOMDebugger.setEventBreakpoint` that sets breakpoints for all event types. * Localizations/en.lproj/localizedStrings.js: * UserInterface/Images/EventBreakpointAnimationFrame.svg: Added. * UserInterface/Images/EventBreakpointListener.svg: Renamed from Source/WebInspectorUI/UserInterface/Images/EventBreakpoint.svg. * UserInterface/Images/EventBreakpointTimer.svg: Added. * UserInterface/Controllers/DOMDebuggerManager.js: (WI.DOMDebuggerManager.supportsEventBreakpoints): Added. (WI.DOMDebuggerManager.prototype.eventBreakpointForTypeAndEventName): Added. (WI.DOMDebuggerManager.prototype.addEventBreakpoint): (WI.DOMDebuggerManager.prototype.removeEventBreakpoint.breakpointRemoved): Added. (WI.DOMDebuggerManager.prototype.removeEventBreakpoint): (WI.DOMDebuggerManager.prototype._updateEventBreakpoint): (WI.DOMDebuggerManager.prototype.eventBreakpointForEventName): Deleted. * UserInterface/Controllers/DOMTreeManager.js: (WI.DOMTreeManager.prototype.setBreakpointForEventListener): * UserInterface/Controllers/DebuggerManager.js: (WI.DebuggerManager.prototype._pauseReasonFromPayload): * UserInterface/Models/EventBreakpoint.js: (WI.EventBreakpoint): (WI.EventBreakpoint.fromPayload): (WI.EventBreakpoint.prototype.get type): Added. (WI.EventBreakpoint.prototype.get serializableInfo): (WI.EventBreakpoint.prototype.saveIdentityToCookie): * UserInterface/Views/DebuggerSidebarPanel.js: (WI.DebuggerSidebarPanel.prototype._updatePauseReasonSection): (WI.DebuggerSidebarPanel.prototype.willDismissPopover): * UserInterface/Views/EventBreakpointPopover.js: (WI.EventBreakpointPopover): (WI.EventBreakpointPopover.prototype.get breakpoint): Added. (WI.EventBreakpointPopover.prototype.show): (WI.EventBreakpointPopover.prototype.show.createOption): Added. (WI.EventBreakpointPopover.prototype.dismiss): Added. (WI.EventBreakpointPopover.prototype._presentOverTargetElement): (WI.EventBreakpointPopover.prototype._handleTypeSelectChange): Added. (WI.EventBreakpointPopover.prototype.get result): Deleted. (WI.EventBreakpointPopover.prototype.get value): Deleted. * UserInterface/Views/EventBreakpointPopover.css: (.popover .event-breakpoint-content > .event-type): Added. (.popover .event-breakpoint-content > input): Deleted. * UserInterface/Views/EventBreakpointTreeElement.js: (WI.EventBreakpointTreeElement): * UserInterface/Views/EventBreakpointTreeElement.css: (.breakpoint.event.animation-frame:not(.breakpoint-paused-icon) .icon): Added. (.breakpoint.event.listener:not(.breakpoint-paused-icon) .icon): Added. (.breakpoint.event.timer:not(.breakpoint-paused-icon) .icon): Added. (.breakpoint.event:not(.breakpoint-paused-icon) .icon): Deleted. LayoutTests: * inspector/dom-debugger/event-animation-frame-breakpoints-expected.txt: Added. * inspector/dom-debugger/event-animation-frame-breakpoints.html: Added. * inspector/dom-debugger/event-breakpoint-with-navigation.html: * inspector/dom-debugger/event-timer-breakpoints-expected.txt: Added. * inspector/dom-debugger/event-timer-breakpoints.html: Added. * inspector/dom-debugger/event-listener-breakpoints-expected.txt: Renamed from LayoutTests/inspector/dom-debugger/event-breakpoints-expected.txt. * inspector/dom-debugger/event-listener-breakpoints.html: Renamed from LayoutTests/inspector/dom-debugger/event-breakpoints.html. * inspector/dom-debugger/resources/event-breakpoint-utilities.js: Added. (TestPage.registerInitializer.window.teardown): (TestPage.registerInitializer.window.failOnPause): (TestPage.registerInitializer.window.addBreakpoint): (TestPage.registerInitializer.window.removeBreakpoint): (TestPage.registerInitializer.window.disableBreakpoint): (TestPage.registerInitializer.window.awaitEvent): Canonical link: https://commits.webkit.org/203952@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@235248 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2018-08-23 21:36:40 +00:00
.then(InspectorTest.EventBreakpoint.disableBreakpoint)
.then(InspectorTest.EventBreakpoint.awaitEvent("body", eventName))
.catch(reject);
},
teardown: InspectorTest.EventBreakpoint.teardown,
});
suite.addTestCase({
name: `DOMDebugger.Event.Listener.RemoveBreakpoint "${eventName}"`,
description: "Check that debugger does not pause for removed breakpoint.",
test(resolve, reject) {
Web Inspector: DOM: add a special breakpoint for "All Events" https://bugs.webkit.org/show_bug.cgi?id=200285 Reviewed by Joseph Pecoraro. Source/JavaScriptCore: Similar to the existing "All Requests" breakpoint, there should be a way to set a breakpoint that would pause for any DOM event, regardless of the event's name. This is useful for situations where the event name isn't known, or where one simply wants to pause on the next entry to the event loop. Along these lines, make the "requestAnimationFrame", "setTimeout", and "setInterval" event breakpoints into special breakpoints that can be added/removed via the create breakpoint context menu. This simplifies the process for setting these breakpoints, and also makes them more discoverable (most people wouldn't consider them to be "events"). * inspector/protocol/Debugger.json: - Rename the `EventListener` pause reason to `Listener`. - Split the `Timer` pause reason into `Interval` and `Timeout`. * inspector/protocol/DOMDebugger.json: - Split the `timer` type into `interval` and `timeout`. - Make `eventName` optional for `addEventBreakpoint`/`removeEventBreakpoint`. When omitted, the corresponding breakpoint that is added/removed is treated as a global breakpoint that applies to all events of that type (e.g. a global `listener` breakpoint would pause for any event that is fired). Source/WebCore: Similar to the existing "All Requests" breakpoint, there should be a way to set a breakpoint that would pause for any DOM event, regardless of the event's name. This is useful for situations where the event name isn't known, or where one simply want's to pause on the next entry to the event loop. Along these lines, make the "requestAnimationFrame", "setTimeout", and "setInterval" event breakpoints into special breakpoints that can be added/removed via the create breakpoint context menu. This simplifies the process for setting these breakpoints, and also makes them more discoverable (most people wouldn't consider them to be "events"). Tests: inspector/dom/breakpoint-for-event-listener.html inspector/dom-debugger/event-animation-frame-breakpoints.html inspector/dom-debugger/event-breakpoint-with-navigation.html inspector/dom-debugger/event-interval-breakpoints.html inspector/dom-debugger/event-listener-breakpoints.html inspector/dom-debugger/event-timeout-breakpoints.html * inspector/agents/InspectorDOMDebuggerAgent.h: * inspector/agents/InspectorDOMDebuggerAgent.cpp: (WebCore::InspectorDOMDebuggerAgent::disable): (WebCore::InspectorDOMDebuggerAgent::frameDocumentUpdated): (WebCore::InspectorDOMDebuggerAgent::setEventBreakpoint): (WebCore::InspectorDOMDebuggerAgent::removeEventBreakpoint): (WebCore::InspectorDOMDebuggerAgent::willHandleEvent): (WebCore::InspectorDOMDebuggerAgent::willFireTimer): (WebCore::InspectorDOMDebuggerAgent::willFireAnimationFrame): (WebCore::InspectorDOMDebuggerAgent::discardBindings): Deleted. Make `eventName` optional for `addEventBreakpoint`/`removeEventBreakpoint`. When omitted, the corresponding breakpoint that is added/removed is treated as a global breakpoint that applies to all events of that type (e.g. a global `listener` breakpoint would pause for any event that is fired). Source/WebInspectorUI: Similar to the existing "All Requests" breakpoint, there should be a way to set a breakpoint that would pause for any DOM event, regardless of the event's name. This is useful for situations where the event name isn't known, or where one simply want's to pause on the next entry to the event loop. Along these lines, make the "requestAnimationFrame", "setTimeout", and "setInterval" event breakpoints into special breakpoints that can be added/removed via the create breakpoint context menu. This simplifies the process for setting these breakpoints, and also makes them more discoverable (most people wouldn't consider them to be "events"). * UserInterface/Models/EventBreakpoint.js: (WI.EventBreakpoint): (WI.EventBreakpoint.deserialize): (WI.EventBreakpoint.prototype.saveIdentityToCookie): (WI.EventBreakpoint.prototype.toJSON): * UserInterface/Controllers/DebuggerManager.js: (WI.DebuggerManager.prototype._pauseReasonFromPayload): * UserInterface/Controllers/DOMDebuggerManager.js: (WI.DOMDebuggerManager): (WI.DOMDebuggerManager.prototype.initializeTarget): (WI.DOMDebuggerManager.supportsDOMBreakpoints): Added. (WI.DOMDebuggerManager.supportsEventBreakpoints): (WI.DOMDebuggerManager.supportsEventListenerBreakpoints): Added. (WI.DOMDebuggerManager.supportsURLBreakpoints): (WI.DOMDebuggerManager.supportsXHRBreakpoints): Added. (WI.DOMDebuggerManager.supportsAllListenersBreakpoint): Added. (WI.DOMDebuggerManager.prototype.get allAnimationFramesBreakpoint): Added. (WI.DOMDebuggerManager.prototype.get allIntervalsBreakpoint): Added. (WI.DOMDebuggerManager.prototype.get allListenersBreakpoint): Added. (WI.DOMDebuggerManager.prototype.get allTimeoutsBreakpoint): Added. (WI.DOMDebuggerManager.prototype.get listenerBreakpoints): Added. (WI.DOMDebuggerManager.prototype.isBreakpointSpecial): (WI.DOMDebuggerManager.prototype.listenerBreakpointForEventName): Added. (WI.DOMDebuggerManager.prototype.addEventBreakpoint): (WI.DOMDebuggerManager.prototype.removeEventBreakpoint): (WI.DOMDebuggerManager.prototype.addURLBreakpoint): (WI.DOMDebuggerManager.prototype._resolveDOMBreakpoint): (WI.DOMDebuggerManager.prototype._updateDOMBreakpoint): (WI.DOMDebuggerManager.prototype._updateEventBreakpoint): (WI.DOMDebuggerManager.prototype._updateURLBreakpoint): (WI.DOMDebuggerManager.prototype._handleDOMBreakpointDisabledStateChanged): (WI.DOMDebuggerManager.prototype._handleEventBreakpointDisabledStateChanged): (WI.DOMDebuggerManager.prototype._handleURLBreakpointDisabledStateChanged): (WI.DOMDebuggerManager.prototype.get eventBreakpoints): Deleted. (WI.DOMDebuggerManager.prototype.eventBreakpointForTypeAndEventName): Deleted. Add additional target compatibility checks. * UserInterface/Views/EventBreakpointPopover.js: (WI.EventBreakpointPopover.prototype.show): (WI.EventBreakpointPopover.prototype.dismiss): (WI.EventBreakpointPopover.prototype._handleTypeSelectChange): Deleted. * UserInterface/Views/EventBreakpointPopover.css: (.popover .event-breakpoint-content > input): Added. (.popover .event-breakpoint-content > input::placeholder): Added. (.popover .event-breakpoint-content > .event-type): Deleted. (.popover .event-breakpoint-content > .event-type > input): Deleted. (.popover .event-breakpoint-content > .event-type > input::placeholder): Deleted. * UserInterface/Views/EventBreakpointTreeElement.css: (.breakpoint.event.breakpoint-for-interval:not(.breakpoint-paused-icon) .icon): Added. (.breakpoint.event.breakpoint-for-timeout:not(.breakpoint-paused-icon) .icon): Added. (.breakpoint.event.breakpoint-for-timer:not(.breakpoint-paused-icon) .icon): Deleted. * UserInterface/Views/DebuggerSidebarPanel.js: (WI.DebuggerSidebarPanel): (WI.DebuggerSidebarPanel.prototype.saveStateToCookie): (WI.DebuggerSidebarPanel.prototype.restoreStateFromCookie): (WI.DebuggerSidebarPanel.prototype._addBreakpoint): (WI.DebuggerSidebarPanel.prototype._addTreeElement): (WI.DebuggerSidebarPanel.prototype._updatePauseReasonSection): (WI.DebuggerSidebarPanel.prototype._handleBreakpointElementAddedOrRemoved): (WI.DebuggerSidebarPanel.prototype._populateCreateBreakpointContextMenu.addToggleForSpecialEventBreakpoint): Added. (WI.DebuggerSidebarPanel.prototype._populateCreateBreakpointContextMenu): * UserInterface/Views/SourcesNavigationSidebarPanel.js: (WI.SourcesNavigationSidebarPanel): (WI.SourcesNavigationSidebarPanel.prototype._insertDebuggerTreeElement): (WI.SourcesNavigationSidebarPanel.prototype._addBreakpoint): (WI.SourcesNavigationSidebarPanel.prototype._updatePauseReasonSection): (WI.SourcesNavigationSidebarPanel.prototype._handleBreakpointElementAddedOrRemoved): (WI.SourcesNavigationSidebarPanel.prototype._populateCreateBreakpointContextMenu.addToggleForSpecialEventBreakpoint): Added. (WI.SourcesNavigationSidebarPanel.prototype._populateCreateBreakpointContextMenu): Add create breakpoint context menu items (also sort the breakpoints in this order): - "All Animation Frames" => [A] All Animation Frames - "All Timeouts" => [T] All Timeouts - "All Intervals" => [I] All Intervals - "All Events" => [E] All Events * UserInterface/Controllers/JavaScriptRuntimeCompletionProvider.js: (WI.JavaScriptRuntimeCompletionProvider.completionControllerCompletionsNeeded.receivedPropertyNames): * UserInterface/Base/Setting.js: * UserInterface/Images/EventBreakpointInterval.svg: Added. * UserInterface/Images/EventBreakpointTimeout.svg: Renamed from Source/WebInspectorUI/UserInterface/Images/EventBreakpointTimer.svg. * Localizations/en.lproj/localizedStrings.js: LayoutTests: * inspector/dom/breakpoint-for-event-listener.html: * inspector/dom/breakpoint-for-event-listener-expected.txt: * inspector/dom-debugger/event-animation-frame-breakpoints.html: * inspector/dom-debugger/event-animation-frame-breakpoints-expected.txt: * inspector/dom-debugger/event-breakpoint-with-navigation.html: * inspector/dom-debugger/event-breakpoint-with-navigation-expected.txt: * inspector/dom-debugger/event-interval-breakpoints.html: Added. * inspector/dom-debugger/event-interval-breakpoints-expected.txt: Added. * inspector/dom-debugger/event-listener-breakpoints.html: * inspector/dom-debugger/event-listener-breakpoints-expected.txt: * inspector/dom-debugger/event-timeout-breakpoints.html: Added. * inspector/dom-debugger/event-timeout-breakpoints-expected.txt: Added. * inspector/dom-debugger/resources/event-breakpoint-utilities.js: (TestPage.registerInitializer.InspectorTest.EventBreakpoint.teardown): (TestPage.registerInitializer.InspectorTest.EventBreakpoint.failOnPause): (TestPage.registerInitializer.InspectorTest.EventBreakpoint.createBreakpoint): Added. (TestPage.registerInitializer.InspectorTest.EventBreakpoint.addBreakpoint): (TestPage.registerInitializer.InspectorTest.EventBreakpoint.removeBreakpoint): (TestPage.registerInitializer.InspectorTest.EventBreakpoint.disableBreakpoint): * inspector/dom-debugger/event-timer-breakpoints.html: Removed. * inspector/dom-debugger/event-timer-breakpoints-expected.txt: Removed. Canonical link: https://commits.webkit.org/214196@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@248201 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2019-08-03 19:00:01 +00:00
InspectorTest.EventBreakpoint.failOnPause(resolve, reject, WI.DebuggerManager.PauseReason.Listener, eventName, "Should not pause for removed breakpoint.");
Web Inspector: support breakpoints for timers and animation-frame events https://bugs.webkit.org/show_bug.cgi?id=188778 Reviewed by Brian Burg. Source/JavaScriptCore: * inspector/protocol/Debugger.json: Add `AnimationFrame` and `Timer` types to the list of pause reasons. * inspector/protocol/DOMDebugger.json: Introduced `setEventBreakpoint` and `removeEventBreakpoint` to replace the more specific: - `setEventListenerBreakpoint` - `removeEventListenerBreakpoint` - `setInstrumentationBreakpoint` - `removeInstrumentationBreakpoint` Also created an `EventBreakpointType` to enumerate the available types of event breakpoints. * inspector/scripts/codegen/generate_cpp_protocol_types_header.py: (CppProtocolTypesHeaderGenerator.generate_output): (CppProtocolTypesHeaderGenerator._generate_forward_declarations_for_binding_traits): (CppProtocolTypesHeaderGenerator._generate_declarations_for_enum_conversion_methods): (CppProtocolTypesHeaderGenerator._generate_hash_declarations): Added. Generate `DefaultHash` for all `enum class` used by inspector protocols. * inspector/scripts/tests/generic/expected/commands-with-async-attribute.json-result: * inspector/scripts/tests/generic/expected/commands-with-optional-call-return-parameters.json-result: * inspector/scripts/tests/generic/expected/enum-values.json-result: * inspector/scripts/tests/generic/expected/type-declaration-array-type.json-result: * inspector/scripts/tests/generic/expected/type-declaration-enum-type.json-result: * inspector/scripts/tests/generic/expected/type-declaration-object-type.json-result: * inspector/scripts/tests/generic/expected/type-requiring-runtime-casts.json-result: Source/WebCore: The original implementation of "instrumentation" breakpoints relied upon the frontend sending somewhat arbitrary strings when enabling breakpoints for specific events. As an example, setting a breakpoint for `requestAnimationFrame` expects `"animationFrameFired"` as the string, which doesn't make much sense. This patch removes the usage of these strings and instead expects the agent to implement a method that matches what is happening. Tests: inspector/dom-debugger/event-animation-frame-breakpoints.html inspector/dom-debugger/event-listener-breakpoints.html inspector/dom-debugger/event-timer-breakpoints.html * inspector/InspectorInstrumentation.h: (WebCore::InspectorInstrumentation::willFireTimer): * inspector/InspectorInstrumentation.cpp: (WebCore::InspectorInstrumentation::didInstallTimerImpl): (WebCore::InspectorInstrumentation::didRemoveTimerImpl): (WebCore::InspectorInstrumentation::willFireTimerImpl): (WebCore::InspectorInstrumentation::didRequestAnimationFrameImpl): (WebCore::InspectorInstrumentation::didCancelAnimationFrameImpl): (WebCore::InspectorInstrumentation::willFireAnimationFrameImpl): (WebCore::InspectorInstrumentation::pauseOnNativeEventIfNeeded): Deleted. * inspector/agents/InspectorDOMDebuggerAgent.h: * inspector/agents/InspectorDOMDebuggerAgent.cpp: (WebCore::InspectorDOMDebuggerAgent::setEventBreakpoint): Added. (WebCore::InspectorDOMDebuggerAgent::removeEventBreakpoint): Added. (WebCore::InspectorDOMDebuggerAgent::willHandleEvent): (WebCore::InspectorDOMDebuggerAgent::willFireTimer): Added. (WebCore::InspectorDOMDebuggerAgent::willFireAnimationFrame): Added. (WebCore::InspectorDOMDebuggerAgent::setEventListenerBreakpoint): Deleted. (WebCore::InspectorDOMDebuggerAgent::setInstrumentationBreakpoint): Deleted. (WebCore::InspectorDOMDebuggerAgent::setBreakpoint): Deleted. (WebCore::InspectorDOMDebuggerAgent::removeEventListenerBreakpoint): Deleted. (WebCore::InspectorDOMDebuggerAgent::removeInstrumentationBreakpoint): Deleted. (WebCore::InspectorDOMDebuggerAgent::removeBreakpoint): Deleted. (WebCore::InspectorDOMDebuggerAgent::pauseOnNativeEventIfNeeded): Deleted. Unify the event listener and instrumentation breakpoint commands into a single method, `setEventBreakpoint`, that takes in both an `EventBreakpointType` and `eventName`. * page/DOMTimer.cpp: (WebCore::DOMTimer::fired): Source/WebInspectorUI: Add a `type` to `WI.EventBreakpoint` that matches `DOMDebugger.EventBreakpointType`: - `AnimationFrame` for `requestAnimationFrame` - `Listener` for any named DOM Event - `Timer` for `setTimeout` and `setInterval` Modified `WI.EventBreakpointPopover` to provide ways for selecting these other types, which is then passed to `WI.DOMDebuggerManager`, which now calls through to the newly added `DOMDebugger.removeEventBreakpoint` and `DOMDebugger.setEventBreakpoint` that sets breakpoints for all event types. * Localizations/en.lproj/localizedStrings.js: * UserInterface/Images/EventBreakpointAnimationFrame.svg: Added. * UserInterface/Images/EventBreakpointListener.svg: Renamed from Source/WebInspectorUI/UserInterface/Images/EventBreakpoint.svg. * UserInterface/Images/EventBreakpointTimer.svg: Added. * UserInterface/Controllers/DOMDebuggerManager.js: (WI.DOMDebuggerManager.supportsEventBreakpoints): Added. (WI.DOMDebuggerManager.prototype.eventBreakpointForTypeAndEventName): Added. (WI.DOMDebuggerManager.prototype.addEventBreakpoint): (WI.DOMDebuggerManager.prototype.removeEventBreakpoint.breakpointRemoved): Added. (WI.DOMDebuggerManager.prototype.removeEventBreakpoint): (WI.DOMDebuggerManager.prototype._updateEventBreakpoint): (WI.DOMDebuggerManager.prototype.eventBreakpointForEventName): Deleted. * UserInterface/Controllers/DOMTreeManager.js: (WI.DOMTreeManager.prototype.setBreakpointForEventListener): * UserInterface/Controllers/DebuggerManager.js: (WI.DebuggerManager.prototype._pauseReasonFromPayload): * UserInterface/Models/EventBreakpoint.js: (WI.EventBreakpoint): (WI.EventBreakpoint.fromPayload): (WI.EventBreakpoint.prototype.get type): Added. (WI.EventBreakpoint.prototype.get serializableInfo): (WI.EventBreakpoint.prototype.saveIdentityToCookie): * UserInterface/Views/DebuggerSidebarPanel.js: (WI.DebuggerSidebarPanel.prototype._updatePauseReasonSection): (WI.DebuggerSidebarPanel.prototype.willDismissPopover): * UserInterface/Views/EventBreakpointPopover.js: (WI.EventBreakpointPopover): (WI.EventBreakpointPopover.prototype.get breakpoint): Added. (WI.EventBreakpointPopover.prototype.show): (WI.EventBreakpointPopover.prototype.show.createOption): Added. (WI.EventBreakpointPopover.prototype.dismiss): Added. (WI.EventBreakpointPopover.prototype._presentOverTargetElement): (WI.EventBreakpointPopover.prototype._handleTypeSelectChange): Added. (WI.EventBreakpointPopover.prototype.get result): Deleted. (WI.EventBreakpointPopover.prototype.get value): Deleted. * UserInterface/Views/EventBreakpointPopover.css: (.popover .event-breakpoint-content > .event-type): Added. (.popover .event-breakpoint-content > input): Deleted. * UserInterface/Views/EventBreakpointTreeElement.js: (WI.EventBreakpointTreeElement): * UserInterface/Views/EventBreakpointTreeElement.css: (.breakpoint.event.animation-frame:not(.breakpoint-paused-icon) .icon): Added. (.breakpoint.event.listener:not(.breakpoint-paused-icon) .icon): Added. (.breakpoint.event.timer:not(.breakpoint-paused-icon) .icon): Added. (.breakpoint.event:not(.breakpoint-paused-icon) .icon): Deleted. LayoutTests: * inspector/dom-debugger/event-animation-frame-breakpoints-expected.txt: Added. * inspector/dom-debugger/event-animation-frame-breakpoints.html: Added. * inspector/dom-debugger/event-breakpoint-with-navigation.html: * inspector/dom-debugger/event-timer-breakpoints-expected.txt: Added. * inspector/dom-debugger/event-timer-breakpoints.html: Added. * inspector/dom-debugger/event-listener-breakpoints-expected.txt: Renamed from LayoutTests/inspector/dom-debugger/event-breakpoints-expected.txt. * inspector/dom-debugger/event-listener-breakpoints.html: Renamed from LayoutTests/inspector/dom-debugger/event-breakpoints.html. * inspector/dom-debugger/resources/event-breakpoint-utilities.js: Added. (TestPage.registerInitializer.window.teardown): (TestPage.registerInitializer.window.failOnPause): (TestPage.registerInitializer.window.addBreakpoint): (TestPage.registerInitializer.window.removeBreakpoint): (TestPage.registerInitializer.window.disableBreakpoint): (TestPage.registerInitializer.window.awaitEvent): Canonical link: https://commits.webkit.org/203952@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@235248 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2018-08-23 21:36:40 +00:00
Web Inspector: allow event breakpoints to be configured https://bugs.webkit.org/show_bug.cgi?id=215362 <rdar://problem/66932921> Reviewed by Brian Burg. Source/JavaScriptCore: This allows developers to do things like: - only pause when `window.event.type` is a certain value - ignore the first N pauses - evaluate JavaScript whenever an event listener is invoked without pausing * inspector/protocol/DOM.json: Add an `options` paramater to `DOM.setBreakpointForEventListener` to allow configuration. * inspector/protocol/DOMDebugger.json: Add an `options` paramater to `DOMDebugger.setEventBreakpoint` to allow configuration. * debugger/Breakpoint.h: (JSC::Breakpoint::id const): Added. (JSC::Breakpoint::sourceID const): Added. (JSC::Breakpoint::lineNumber const): Added. (JSC::Breakpoint::columnNumber const): Added. (JSC::Breakpoint::condition const): Added. (JSC::Breakpoint::actions const): Added. (JSC::Breakpoint::isAutoContinue const): Added. (JSC::Breakpoint::resetHitCount): Added. (JSC::Breakpoint::isLinked const): Added. (JSC::Breakpoint::isResolved const): Added. (JSC::BreakpointsList::~BreakpointsList): Deleted. * debugger/Breakpoint.cpp: Added. (JSC::Breakpoint::Action::Action): Added. (JSC::Breakpoint::create): Added. (JSC::Breakpoint::Breakpoint): Added. (JSC::Breakpoint::link): Added. (JSC::Breakpoint::resolve): Added. (JSC::Breakpoint::shouldPause): Added. Unify `JSC::Breakpoint` and `Inspector::ScriptBreakpoint`. * debugger/DebuggerPrimitives.h: * debugger/Debugger.h: * debugger/Debugger.cpp: (JSC::Debugger::Debugger): (JSC::Debugger::addObserver): Added. (JSC::Debugger::removeObserver): Added. (JSC::Debugger::canDispatchFunctionToObservers const): Added. (JSC::Debugger::dispatchFunctionToObservers): Added. (JSC::Debugger::sourceParsed): Added. (JSC::Debugger::toggleBreakpoint): (JSC::Debugger::applyBreakpoints): (JSC::Debugger::resolveBreakpoint): (JSC::Debugger::setBreakpoint): (JSC::Debugger::removeBreakpoint): (JSC::Debugger::didHitBreakpoint): Added. (JSC::Debugger::clearBreakpoints): (JSC::Debugger::evaluateBreakpointCondition): Added. (JSC::Debugger::evaluateBreakpointActions): Added. (JSC::Debugger::schedulePauseAtNextOpportunity): Added. (JSC::Debugger::cancelPauseAtNextOpportunity): Added. (JSC::Debugger::schedulePauseForSpecialBreakpoint): Added. (JSC::Debugger::cancelPauseForSpecialBreakpoint): Added. (JSC::Debugger::continueProgram): (JSC::Debugger::stepNextExpression): (JSC::Debugger::stepIntoStatement): (JSC::Debugger::stepOverStatement): (JSC::Debugger::stepOutOfFunction): (JSC::Debugger::pauseIfNeeded): (JSC::Debugger::handlePause): Added. (JSC::Debugger::exceptionOrCaughtValue): Added. (JSC::Debugger::atExpression): (JSC::Debugger::clearNextPauseState): (JSC::Debugger::willRunMicrotask): Added. (JSC::Debugger::didRunMicrotask): Added. (JSC::Debugger::hasBreakpoint): Deleted. (JSC::Debugger::setPauseOnNextStatement): Deleted. Unify `JSC::Debugger` and `Inspector::ScriptDebugServer` to simplify breakpoint logic. Introduce the concept of a "special breakpoint", which is essentially a `JSC::Breakpoint` that is expected to pause at the next opportunity but isn't tied to a particular location. As an example, whenever an event breakpoint is hit, instead of just pausing at the next opportunity, the newly managed `JSC::Breakpoint` is used as a "special breakpoint", allowing for it's configuration (ie.g. condition, ignore count, actions, auto-continue) to be used. * inspector/agents/InspectorDebuggerAgent.h: * inspector/agents/InspectorDebuggerAgent.cpp: (Inspector::objectGroupForBreakpointAction): (Inspector::breakpointActionTypeForString): Added. (Inspector::parseBreakpointOptions): Added. (Inspector::InspectorDebuggerAgent::ProtocolBreakpoint::fromPayload): Added. (Inspector::InspectorDebuggerAgent::ProtocolBreakpoint::ProtocolBreakpoint): Added. (Inspector::InspectorDebuggerAgent::ProtocolBreakpoint::createDebuggerBreakpoint const): Added. (Inspector::InspectorDebuggerAgent::ProtocolBreakpoint::matchesScriptURL const): Added. (Inspector::InspectorDebuggerAgent::debuggerBreakpointFromPayload): Added. (Inspector::InspectorDebuggerAgent::enable): (Inspector::InspectorDebuggerAgent::disable): (Inspector::InspectorDebuggerAgent::buildBreakpointPauseReason): (Inspector::InspectorDebuggerAgent::handleConsoleAssert): (Inspector::InspectorDebuggerAgent::didScheduleAsyncCall): (Inspector::buildDebuggerLocation): (Inspector::InspectorDebuggerAgent::setBreakpointByUrl): (Inspector::InspectorDebuggerAgent::setBreakpoint): (Inspector::InspectorDebuggerAgent::didSetBreakpoint): (Inspector::InspectorDebuggerAgent::resolveBreakpoint): (Inspector::InspectorDebuggerAgent::removeBreakpoint): (Inspector::InspectorDebuggerAgent::continueToLocation): (Inspector::InspectorDebuggerAgent::schedulePauseAtNextOpportunity): Added. (Inspector::InspectorDebuggerAgent::cancelPauseAtNextOpportunity): Added. (Inspector::InspectorDebuggerAgent::schedulePauseForSpecialBreakpoint): Added. (Inspector::InspectorDebuggerAgent::cancelPauseForSpecialBreakpoint): Added. (Inspector::InspectorDebuggerAgent::pause): (Inspector::InspectorDebuggerAgent::resume): (Inspector::InspectorDebuggerAgent::didBecomeIdle): (Inspector::InspectorDebuggerAgent::sourceMapURLForScript): (Inspector::InspectorDebuggerAgent::didParseSource): (Inspector::InspectorDebuggerAgent::willRunMicrotask): (Inspector::InspectorDebuggerAgent::didRunMicrotask): (Inspector::InspectorDebuggerAgent::didPause): (Inspector::InspectorDebuggerAgent::breakpointActionSound): (Inspector::InspectorDebuggerAgent::breakpointActionProbe): (Inspector::InspectorDebuggerAgent::clearInspectorBreakpointState): (Inspector::InspectorDebuggerAgent::clearDebuggerBreakpointState): (Inspector::matches): Deleted. (Inspector::buildObjectForBreakpointCookie): Deleted. (Inspector::InspectorDebuggerAgent::breakpointActionsFromProtocol): Deleted. (Inspector::InspectorDebuggerAgent::schedulePauseOnNextStatement): Deleted. (Inspector::InspectorDebuggerAgent::cancelPauseOnNextStatement): Deleted. Create a private `ProtocolBreakpoint` class that holds the data sent by the frontend. This is necessary because breakpoints in the frontend have a potentially one-to-many relationship with breakpoints in the backend, as the same script can be loaded many times on a page. Each of those scripts is independent, however, and can execute differently, meaning that the same breakpoint for each script also needs a different state (e.g. ignore count). As such, the `ProtocolBreakpoint` is effectively a template that is actualized whenever a new script is parsed that matches the URL of the `ProtocolBreakpoint` to create a `JSC::Breakpoint` that is used by the `JSC::Debugger`. `ProtocolBreakpoint` also parses breakpoint configurations. * inspector/InspectorEnvironment.h: * inspector/JSGlobalObjectScriptDebugServer.h: * inspector/JSGlobalObjectScriptDebugServer.cpp: (Inspector::JSGlobalObjectScriptDebugServer::JSGlobalObjectScriptDebugServer): (Inspector::JSGlobalObjectScriptDebugServer::attachDebugger): (Inspector::JSGlobalObjectScriptDebugServer::detachDebugger): (Inspector::JSGlobalObjectScriptDebugServer::runEventLoopWhilePaused): * inspector/agents/InspectorAuditAgent.h: * inspector/agents/InspectorAuditAgent.cpp: (Inspector::InspectorAuditAgent::run): * inspector/agents/InspectorRuntimeAgent.h: * inspector/agents/InspectorRuntimeAgent.cpp: (Inspector::setPauseOnExceptionsState): (Inspector::InspectorRuntimeAgent::evaluate): (Inspector::InspectorRuntimeAgent::callFunctionOn): (Inspector::InspectorRuntimeAgent::getPreview): (Inspector::InspectorRuntimeAgent::getProperties): (Inspector::InspectorRuntimeAgent::getDisplayableProperties): * inspector/agents/InspectorScriptProfilerAgent.cpp: * inspector/agents/JSGlobalObjectDebuggerAgent.h: Replace `Inspector::ScriptDebugServer` with `JSC::Debugger`. * runtime/JSMicrotask.cpp: (JSC::JSMicrotask::run): Drive-by: r248894 mistakenly omitted the call to notify the debugger that the microtask ran. * inspector/ScriptBreakpoint.h: Removed. * inspector/ScriptDebugListener.h: Removed. * inspector/ScriptDebugServer.h: Removed. * inspector/ScriptDebugServer.cpp: Removed. * CMakeLists.txt: * JavaScriptCore.xcodeproj/project.pbxproj: * Sources.txt: Source/WebCore: This allows developers to do things like: - only pause when `window.event.type` is a certain value - ignore the first N pauses - evaluate JavaScript whenever an event listener is invoked without pausing Tests: inspector/dom/breakpoint-for-event-listener.html inspector/dom-debugger/event-animation-frame-breakpoints.html inspector/dom-debugger/event-interval-breakpoints.html inspector/dom-debugger/event-listener-breakpoints.html inspector/dom-debugger/event-timeout-breakpoints.html * inspector/agents/InspectorDOMAgent.h: * inspector/agents/InspectorDOMAgent.cpp: (WebCore::InspectorDOMAgent::getEventListenersForNode): (WebCore::InspectorDOMAgent::setBreakpointForEventListener): (WebCore::InspectorDOMAgent::removeBreakpointForEventListener): (WebCore::InspectorDOMAgent::buildObjectForEventListener): (WebCore::InspectorDOMAgent::breakpointForEventListener): (WebCore::InspectorDOMAgent::hasBreakpointForEventListener): Deleted. * inspector/agents/InspectorDOMDebuggerAgent.h: * inspector/agents/InspectorDOMDebuggerAgent.cpp: (WebCore::InspectorDOMDebuggerAgent::disable): (WebCore::InspectorDOMDebuggerAgent::mainFrameNavigated): (WebCore::InspectorDOMDebuggerAgent::setEventBreakpoint): (WebCore::InspectorDOMDebuggerAgent::removeEventBreakpoint): (WebCore::InspectorDOMDebuggerAgent::willHandleEvent): (WebCore::InspectorDOMDebuggerAgent::didHandleEvent): (WebCore::InspectorDOMDebuggerAgent::willFireTimer): (WebCore::InspectorDOMDebuggerAgent::didFireTimer): * inspector/agents/page/PageDOMDebuggerAgent.h: * inspector/agents/page/PageDOMDebuggerAgent.cpp: (WebCore::PageDOMDebuggerAgent::disable): (WebCore::PageDOMDebuggerAgent::mainFrameNavigated): (WebCore::PageDOMDebuggerAgent::willFireAnimationFrame): (WebCore::PageDOMDebuggerAgent::didFireAnimationFrame): (WebCore::PageDOMDebuggerAgent::setAnimationFrameBreakpoint): * inspector/agents/worker/WorkerDOMDebuggerAgent.h: * inspector/agents/worker/WorkerDOMDebuggerAgent.cpp: (WebCore::WorkerDOMDebuggerAgent::setAnimationFrameBreakpoint): Keep a `JSC::Breakpoint` for each event breakpoint instead of a simple `bool`, allowing for configuration when the breakpoint is first set. When any of these breakpoints are hit, pass it to the `JSC::Debugger` as a "special breakpoint", which behaves the same as "pause ASAP" but also supports a condition, an ignore count, actions, and auto-continue. Reset the hit count for any of these "special breakpoints" that persist across Web Inspector sessions when the main frame navigates. * inspector/PageScriptDebugServer.h: * inspector/PageScriptDebugServer.cpp: (WebCore::PageScriptDebugServer::PageScriptDebugServer): (WebCore::PageScriptDebugServer::attachDebugger): (WebCore::PageScriptDebugServer::detachDebugger): (WebCore::PageScriptDebugServer::didPause): (WebCore::PageScriptDebugServer::didContinue): (WebCore::PageScriptDebugServer::runEventLoopWhilePaused): (WebCore::PageScriptDebugServer::runEventLoopWhilePausedInternal): (WebCore::PageScriptDebugServer::isContentScript const): (WebCore::PageScriptDebugServer::reportException const): * inspector/WorkerScriptDebugServer.h: * inspector/WorkerScriptDebugServer.cpp: (WebCore::WorkerScriptDebugServer::WorkerScriptDebugServer): (WebCore::WorkerScriptDebugServer::attachDebugger): (WebCore::WorkerScriptDebugServer::detachDebugger): (WebCore::WorkerScriptDebugServer::runEventLoopWhilePaused): (WebCore::WorkerScriptDebugServer::reportException const): * inspector/agents/page/PageDebuggerAgent.h: * inspector/agents/page/PageDebuggerAgent.cpp: (WebCore::PageDebuggerAgent::sourceMapURLForScript): Replace `Inspector::ScriptDebugServer` with `JSC::Debugger`. * inspector/TimelineRecordFactory.h: * inspector/TimelineRecordFactory.cpp: (WebCore::TimelineRecordFactory::createProbeSampleData): * inspector/agents/InspectorTimelineAgent.h: * inspector/agents/InspectorTimelineAgent.cpp: (WebCore::InspectorTimelineAgent::internalStart): (WebCore::InspectorTimelineAgent::internalStop): (WebCore::InspectorTimelineAgent::breakpointActionProbe): Replace `Inspector::ScriptBreakpoint` with `JSC::Breakpoint`. * inspector/InspectorInstrumentation.h: (WebCore::InspectorInstrumentation::didHandleEvent): (WebCore::InspectorInstrumentation::didFireTimer): * inspector/InspectorInstrumentation.cpp: (WebCore::InspectorInstrumentation::didHandleEventImpl): (WebCore::InspectorInstrumentation::didFireTimerImpl): (WebCore::InspectorInstrumentation::didCommitLoadImpl): (WebCore::InspectorInstrumentation::didFireAnimationFrameImpl): * dom/EventTarget.cpp: (WebCore::EventTarget::innerInvokeEventListeners): * page/DOMTimer.cpp: (WebCore::DOMTimer::fired): When notifying Web Inspector that activity did occur, include all information previously included when notifying Web Inspector that that activity was about to occur so that Web Inspector can know whether a pause for the "special breakpoint" for that activity is still scheduled and if so cancel it. Source/WebInspectorUI: This allows developers to do things like: - only pause when `window.event.type` is a certain value - ignore the first N pauses - evaluate JavaScript whenever an event listener is invoked without pausing * UserInterface/Models/Breakpoint.js: (WI.Breakpoint): (WI.Breakpoint.prototype.toJSON): (WI.Breakpoint.prototype.get special): Added. (WI.Breakpoint.prototype.get removable): Added. (WI.Breakpoint.prototype.get editable): Added. (WI.Breakpoint.prototype.set condition): (WI.Breakpoint.prototype.get ignoreCount): (WI.Breakpoint.prototype.set ignoreCount): (WI.Breakpoint.prototype.get autoContinue): (WI.Breakpoint.prototype.set autoContinue): (WI.Breakpoint.prototype.get actions): (WI.Breakpoint.prototype.get probeActions): (WI.Breakpoint.prototype.cycleToNextMode): (WI.Breakpoint.prototype.createAction): (WI.Breakpoint.prototype.recreateAction): (WI.Breakpoint.prototype.removeAction): (WI.Breakpoint.prototype.clearActions): (WI.Breakpoint.prototype.remove): Added. (WI.Breakpoint.prototype.optionsToProtocol): Added. (WI.Breakpoint.prototype.breakpointActionDidChange): (WI.Breakpoint.fromJSON): Deleted. (WI.Breakpoint.prototype.get sourceCodeLocation): Deleted. (WI.Breakpoint.prototype.get contentIdentifier): Deleted. (WI.Breakpoint.prototype.get scriptIdentifier): Deleted. (WI.Breakpoint.prototype.get target): Deleted. (WI.Breakpoint.prototype.get identifier): Deleted. (WI.Breakpoint.prototype.set identifier): Deleted. (WI.Breakpoint.prototype.get resolved): Deleted. (WI.Breakpoint.prototype.set resolved): Deleted. (WI.Breakpoint.prototype.saveIdentityToCookie): Deleted. (WI.Breakpoint.prototype._isSpecial): Deleted. (WI.Breakpoint.prototype._sourceCodeLocationLocationChanged): Deleted. (WI.Breakpoint.prototype._sourceCodeLocationDisplayLocationChanged): Deleted. * UserInterface/Models/DOMBreakpoint.js: (WI.DOMBreakpoint): (WI.DOMBreakpoint.fromJSON): Added. (WI.DOMBreakpoint.prototype.remove): Added. (WI.DOMBreakpoint.prototype.toJSON): (WI.DOMBreakpoint.deserialize): Deleted. (WI.DOMBreakpoint.prototype.get disabled): Deleted. (WI.DOMBreakpoint.prototype.set disabled): Deleted. * UserInterface/Models/EventBreakpoint.js: (WI.EventBreakpoint): (WI.EventBreakpoint.fromJSON): Added. (WI.EventBreakpoint.prototype.get special): Added. (WI.EventBreakpoint.prototype.get editable): Added. (WI.EventBreakpoint.prototype.remove): Added. (WI.EventBreakpoint.prototype.saveIdentityToCookie): (WI.EventBreakpoint.prototype.toJSON): (WI.EventBreakpoint.deserialize): Deleted. (WI.EventBreakpoint.prototype.get disabled): Deleted. (WI.EventBreakpoint.prototype.set disabled): Deleted. * UserInterface/Models/JavaScriptBreakpoint.js: Copied from UserInterface/Models/Breakpoint.js. (WI.JavaScriptBreakpoint): (WI.JavaScriptBreakpoint.fromJSON): (WI.JavaScriptBreakpoint.prototype.toJSON): (WI.JavaScriptBreakpoint.prototype.get sourceCodeLocation): (WI.JavaScriptBreakpoint.prototype.get contentIdentifier): (WI.JavaScriptBreakpoint.prototype.get scriptIdentifier): (WI.JavaScriptBreakpoint.prototype.get target): (WI.JavaScriptBreakpoint.prototype.get special): Added. (WI.JavaScriptBreakpoint.prototype.get removable): Added. (WI.JavaScriptBreakpoint.prototype.get editable): Added. (WI.JavaScriptBreakpoint.prototype.get identifier): (WI.JavaScriptBreakpoint.prototype.set identifier): (WI.JavaScriptBreakpoint.prototype.get resolved): (WI.JavaScriptBreakpoint.prototype.set resolved): (WI.JavaScriptBreakpoint.prototype.remove): Added. (WI.JavaScriptBreakpoint.prototype.saveIdentityToCookie): (WI.JavaScriptBreakpoint.prototype._isSpecial): (WI.JavaScriptBreakpoint.prototype._sourceCodeLocationLocationChanged): (WI.JavaScriptBreakpoint.prototype._sourceCodeLocationDisplayLocationChanged): * UserInterface/Models/URLBreakpoint.js: (WI.URLBreakpoint): (WI.URLBreakpoint.fromJSON): Added. (WI.URLBreakpoint.prototype.get special): Added. (WI.URLBreakpoint.prototype.remove): Added. (WI.URLBreakpoint.prototype.toJSON): (WI.URLBreakpoint.deserialize): Deleted. (WI.URLBreakpoint.prototype.get disabled): Deleted. (WI.URLBreakpoint.prototype.set disabled): Deleted. Rename `WI.Breakpoint` to `WI.JavaScriptBreakpoint` and use `WI.Breakpoint` as a new common base class for all breakpoint types, allowing more logic to be shared (e.g. disabled state). Additionally, breakpoints are now able to - determine whether or not they're - special - removable - editable (i.e. configurable) - remove themselves without the caller needing to know what manager to consult with. * UserInterface/Controllers/DOMManager.js: (WI.DOMManager): (WI.DOMManager.supportsEventListenerBreakpointConfiguration): Added. (WI.DOMManager.prototype.setBreakpointForEventListener): (WI.DOMManager.prototype.removeBreakpointForEventListener): (WI.DOMManager.prototype._setEventBreakpoint): Added. (WI.DOMManager.prototype._removeEventBreakpoint): Added. (WI.DOMManager.prototype._handleEventBreakpointEditablePropertyChanged): Added. (WI.DOMManager.prototype._handleEventBreakpointActionsChanged): Added. (WI.DOMManager.prototype._updateEventBreakpoint): Deleted. Keep track of configuration changes for specific listener breakpoints. * UserInterface/Controllers/DOMDebuggerManager.js: (WI.DOMDebuggerManager): (WI.DOMDebuggerManager.prototype.initializeTarget): (WI.DOMDebuggerManager.prototype.addDOMBreakpoint): (WI.DOMDebuggerManager.prototype.removeDOMBreakpoint): (WI.DOMDebuggerManager.prototype.addEventBreakpoint): (WI.DOMDebuggerManager.prototype.removeEventBreakpoint): (WI.DOMDebuggerManager.prototype.addURLBreakpoint): (WI.DOMDebuggerManager.prototype.removeURLBreakpoint): (WI.DOMDebuggerManager.prototype._commandArgumentsForEventBreakpoint): Added. (WI.DOMDebuggerManager.prototype._setEventBreakpoint): Added. (WI.DOMDebuggerManager.prototype._removeEventBreakpoint): Added. (WI.DOMDebuggerManager.prototype._handleEventBreakpointDisabledStateChanged): Added. (WI.DOMDebuggerManager.prototype._handleEventBreakpointEditablePropertyChanged): Added. (WI.DOMDebuggerManager.prototype._handleEventBreakpointActionsChanged): Added. (WI.DOMDebuggerManager.prototype.isBreakpointSpecial): Deleted. (WI.DOMDebuggerManager.prototype._updateEventBreakpoint): Deleted. Keep track of configuration changes for special event breakpoints. Store special event breakpoints inside `WI.objectStores.eventBreakpoints`. * UserInterface/Controllers/DebuggerManager.js: (WI.DebuggerManager): (WI.DebuggerManager.prototype.addBreakpoint): (WI.DebuggerManager.prototype.removeBreakpoint): (WI.DebuggerManager.prototype.addProbesForBreakpoint): Added. (WI.DebuggerManager.prototype.removeProbesForBreakpoint): Added. (WI.DebuggerManager.prototype.updateProbesForBreakpoint): Added. (WI.DebuggerManager.prototype._setBreakpoint): (WI.DebuggerManager.prototype._breakpointEditablePropertyDidChange): (WI.DebuggerManager.prototype._handleBreakpointActionsDidChange): (WI.DebuggerManager.prototype.isBreakpointRemovable): Deleted. (WI.DebuggerManager.prototype.isBreakpointSpecial): Deleted. (WI.DebuggerManager.prototype.isBreakpointEditable): Deleted. (WI.DebuggerManager.prototype._debuggerBreakpointActionType): Deleted. (WI.DebuggerManager.prototype._debuggerBreakpointOptions): Deleted. (WI.DebuggerManager.prototype._addProbesForBreakpoint): Deleted. (WI.DebuggerManager.prototype._removeProbesForBreakpoint): Deleted. (WI.DebuggerManager.prototype._updateProbesForBreakpoint): Deleted. Replace `WI.Breakpoint` with `WI.JavaScriptBreakpoint`. Probes now support `WI.EventBreakpoint` in addition to `WI.JavaScriptBreakpoint`. * UserInterface/Controllers/BreakpointPopoverController.js: (WI.BreakpointPopoverController.prototype.appendContextMenuItems): (WI.BreakpointPopoverController.prototype._createPopoverContent): Allow any breakpoint instead of only `WI.JavaScriptBreakpoint`. Drive-by: the existing `ignoreCount` value wasn't being used to populate the `<input>`. * UserInterface/Views/BreakpointTreeElement.js: (WI.BreakpointTreeElement.prototype.ondelete): (WI.BreakpointTreeElement.prototype.get listenerSet): Added. (WI.BreakpointTreeElement.prototype.updateStatus): Added. (WI.BreakpointTreeElement.prototype.updateTitles): Added. (WI.BreakpointTreeElement.prototype.get breakpoint): Deleted. (WI.BreakpointTreeElement.prototype.get filterableData): Deleted. (WI.BreakpointTreeElement.prototype._updateTitles): Deleted. (WI.BreakpointTreeElement.prototype._updateStatus): Deleted. (WI.BreakpointTreeElement.prototype._breakpointLocationDidChange): Deleted. * UserInterface/Views/BreakpointTreeElement.css: (.item.breakpoint .status > .status-image): (.item.breakpoint.paused .icon): Added. (@media (prefers-color-scheme: dark) .item.breakpoint.paused .icon): Added. (.item.breakpoint .status > .status-image.resolved): Deleted. (body:not(.window-inactive, .window-docked-inactive) .tree-outline:focus-within .item.breakpoint.selected .status > .status-image.resolved): Deleted. (.item.breakpoint .subtitle.formatted-location): Deleted. (.breakpoint-debugger-statement-icon .icon): Deleted. (.breakpoint-exception-icon .icon): Deleted. (.breakpoint-assertion-icon .icon): Deleted. (.breakpoint-microtask-icon .icon): Deleted. (.breakpoint-paused-icon .icon): Deleted. (.breakpoint-generic-line-icon .icon): Deleted. (.breakpoint-generic-line-icon .icon > span): Deleted. (.data-updated.breakpoint-generic-line-icon .icon > span): Deleted. (@media (prefers-color-scheme: dark) .breakpoint-debugger-statement-icon .icon): Deleted. (@media (prefers-color-scheme: dark) .breakpoint-exception-icon .icon): Deleted. (@media (prefers-color-scheme: dark) .breakpoint-assertion-icon .icon): Deleted. (@media (prefers-color-scheme: dark) .breakpoint-microtask-icon .icon): Deleted. (@media (prefers-color-scheme: dark) .breakpoint-paused-icon .icon): Deleted. (@media (prefers-color-scheme: dark) .breakpoint-generic-line-icon .icon): Deleted. * UserInterface/Views/DOMBreakpointTreeElement.js: (WI.DOMBreakpointTreeElement): (WI.DOMBreakpointTreeElement.prototype.onattach): Deleted. (WI.DOMBreakpointTreeElement.prototype.ondetach): Deleted. (WI.DOMBreakpointTreeElement.prototype.ondelete): Deleted. (WI.DOMBreakpointTreeElement.prototype.onenter): Deleted. (WI.DOMBreakpointTreeElement.prototype.onspace): Deleted. (WI.DOMBreakpointTreeElement.prototype.populateContextMenu): Deleted. (WI.DOMBreakpointTreeElement.prototype._statusImageElementClicked): Deleted. (WI.DOMBreakpointTreeElement.prototype._statusImageElementFocused): Deleted. (WI.DOMBreakpointTreeElement.prototype._statusImageElementMouseDown): Deleted. (WI.DOMBreakpointTreeElement.prototype._toggleBreakpoint): Deleted. (WI.DOMBreakpointTreeElement.prototype._updateStatus): Deleted. * UserInterface/Views/DOMBreakpointTreeElement.css: (.item.breakpoint.dom.subtree-modified:not(.paused) .icon): Added. (.item.breakpoint.dom.attribute-modified:not(.paused) .icon): Added. (.item.breakpoint.dom.node-removed:not(.paused) .icon): Added. (@media (prefers-color-scheme: dark) .item.breakpoint.dom.subtree-modified:not(.paused) .icon): Added. (@media (prefers-color-scheme: dark) .item.breakpoint.dom.attribute-modified:not(.paused) .icon): Added. (@media (prefers-color-scheme: dark) .item.breakpoint.dom.node-removed:not(.paused) .icon): Added. (.breakpoint.dom.breakpoint-for-subtree-modified:not(.breakpoint-paused-icon) .icon): Deleted. (.breakpoint.dom.breakpoint-for-attribute-modified:not(.breakpoint-paused-icon) .icon): Deleted. (.breakpoint.dom.breakpoint-for-node-removed:not(.breakpoint-paused-icon) .icon): Deleted. (@media (prefers-color-scheme: dark) .breakpoint.dom.breakpoint-for-subtree-modified:not(.breakpoint-paused-icon) .icon): Deleted. (@media (prefers-color-scheme: dark) .breakpoint.dom.breakpoint-for-attribute-modified:not(.breakpoint-paused-icon) .icon): Deleted. (@media (prefers-color-scheme: dark) .breakpoint.dom.breakpoint-for-node-removed:not(.breakpoint-paused-icon) .icon): Deleted. * UserInterface/Views/EventBreakpointTreeElement.js: (WI.EventBreakpointTreeElement): (WI.EventBreakpointTreeElement.prototype.onattach): Deleted. (WI.EventBreakpointTreeElement.prototype.ondetach): Deleted. (WI.EventBreakpointTreeElement.prototype.ondelete): Deleted. (WI.EventBreakpointTreeElement.prototype.onenter): Deleted. (WI.EventBreakpointTreeElement.prototype.onspace): Deleted. (WI.EventBreakpointTreeElement.prototype.populateContextMenu): Deleted. (WI.EventBreakpointTreeElement.prototype._statusImageElementClicked): Deleted. (WI.EventBreakpointTreeElement.prototype._statusImageElementFocused): Deleted. (WI.EventBreakpointTreeElement.prototype._statusImageElementMouseDown): Deleted. (WI.EventBreakpointTreeElement.prototype._toggleBreakpoint): Deleted. (WI.EventBreakpointTreeElement.prototype._updateStatus): Deleted. * UserInterface/Views/EventBreakpointTreeElement.css: (.item.breakpoint.event.animation-frame:not(.paused) .icon): Added. (.item.breakpoint.event.interval:not(.paused) .icon): Added. (.item.breakpoint.event.listener:not(.paused) .icon): Added. (.item.breakpoint.event.timeout:not(.paused) .icon): Added. (@media(prefers-color-scheme: dark) .item.breakpoint.event.animation-frame:not(.paused) .icon): Added. (@media(prefers-color-scheme: dark) .item.breakpoint.event.interval:not(.paused) .icon): Added. (@media(prefers-color-scheme: dark) .item.breakpoint.event.listener:not(.paused) .icon): Added. (@media(prefers-color-scheme: dark) .item.breakpoint.event.timeout:not(.paused) .icon): Added. (.breakpoint.event.breakpoint-for-animation-frame:not(.breakpoint-paused-icon) .icon): Deleted. (.breakpoint.event.breakpoint-for-interval:not(.breakpoint-paused-icon) .icon): Deleted. (.breakpoint.event.breakpoint-for-listener:not(.breakpoint-paused-icon) .icon): Deleted. (.breakpoint.event.breakpoint-for-timeout:not(.breakpoint-paused-icon) .icon): Deleted. (@media(prefers-color-scheme: dark) .breakpoint.event.breakpoint-for-animation-frame:not(.breakpoint-paused-icon) .icon): Deleted. (@media(prefers-color-scheme: dark) .breakpoint.event.breakpoint-for-interval:not(.breakpoint-paused-icon) .icon): Deleted. (@media(prefers-color-scheme: dark) .breakpoint.event.breakpoint-for-listener:not(.breakpoint-paused-icon) .icon): Deleted. (@media(prefers-color-scheme: dark) .breakpoint.event.breakpoint-for-timeout:not(.breakpoint-paused-icon) .icon): Deleted. * UserInterface/Views/JavaScriptBreakpointTreeElement.js: Copied from Source/WebInspectorUI/UserInterface/Views/BreakpointTreeElement.js. (WI.JavaScriptBreakpointTreeElement): (WI.JavaScriptBreakpointTreeElement.prototype.get filterableData): (WI.JavaScriptBreakpointTreeElement.prototype.updateStatus): Added. (WI.JavaScriptBreakpointTreeElement.prototype.updateTitles): Added. (WI.JavaScriptBreakpointTreeElement.prototype._breakpointLocationDidChange): * UserInterface/Views/JavaScriptBreakpointTreeElement.css: Copied from Source/WebInspectorUI/UserInterface/Views/BreakpointTreeElement.css. (.item.breakpoint.javascript .status > .status-image): Added. (.item.breakpoint.javascript .status > .status-image.resolved): Added. (body:not(.window-inactive, .window-docked-inactive) .tree-outline:focus-within .item.breakpoint.javascript.selected .status > .status-image.resolved): Added. (.item.breakpoint.javascript .subtitle.formatted-location): Added. (.item.breakpoint.javascript.line .icon): Added. (.item.breakpoint.javascript.line .icon > span): Added. (.data-updated.item.breakpoint.javascript.line .icon > span): Added. (.item.breakpoint.javascript.debugger-statement .icon): Added. (.item.breakpoint.javascript.exception .icon): Added. (.item.breakpoint.javascript.assertion .icon): Added. (.item.breakpoint.javascript.microtask .icon): Added. (@media (prefers-color-scheme: dark) .item.breakpoint.javascript.line .icon): Added. (@media (prefers-color-scheme: dark) .item.breakpoint.javascript.debugger-statement .icon): Added. (@media (prefers-color-scheme: dark) .item.breakpoint.javascript.exception .icon): Added. (@media (prefers-color-scheme: dark) .item.breakpoint.javascript.assertion .icon): Added. (@media (prefers-color-scheme: dark) .item.breakpoint.javascript.microtask .icon): Added. * UserInterface/Views/URLBreakpointTreeElement.js: (WI.URLBreakpointTreeElement): (WI.URLBreakpointTreeElement.prototype.onattach): Deleted. (WI.URLBreakpointTreeElement.prototype.ondetach): Deleted. (WI.URLBreakpointTreeElement.prototype.ondelete): Deleted. (WI.URLBreakpointTreeElement.prototype.onenter): Deleted. (WI.URLBreakpointTreeElement.prototype.onspace): Deleted. (WI.URLBreakpointTreeElement.prototype.populateContextMenu): Deleted. (WI.URLBreakpointTreeElement.prototype._statusImageElementClicked): Deleted. (WI.URLBreakpointTreeElement.prototype._statusImageElementFocused): Deleted. (WI.URLBreakpointTreeElement.prototype._statusImageElementMouseDown): Deleted. (WI.URLBreakpointTreeElement.prototype._toggleBreakpoint): Deleted. (WI.URLBreakpointTreeElement.prototype._updateStatus): Deleted. * UserInterface/Views/URLBreakpointTreeElement.css: (.item.breakpoint.url .subtitle): Added. (.item.breakpoint.url:not(.paused) .icon): Added. (@media (prefers-color-scheme: dark) .item.breakpoint.url:not(.paused) .icon): Added. (.breakpoint.url .subtitle): Deleted. (.breakpoint.url:not(.breakpoint-paused-icon) .icon): Deleted. (@media (prefers-color-scheme: dark) .breakpoint.url:not(.breakpoint-paused-icon) .icon): Deleted. Rename `WI.BreakpointTreeElement` to `WI.JavaScriptBreakpointTreeElement` and use `WI.BreakpointTreeElement` as a new common base class for all breakpoint tree elements, allowing more logic and styles to be shared (e.g. disabled state). * UserInterface/Views/SourcesNavigationSidebarPanel.js: (WI.SourcesNavigationSidebarPanel): (WI.SourcesNavigationSidebarPanel.prototype.closed): (WI.SourcesNavigationSidebarPanel.prototype._insertDebuggerTreeElement): (WI.SourcesNavigationSidebarPanel.prototype._compareJavaScriptBreakpointTreeElements): Added. (WI.SourcesNavigationSidebarPanel.prototype._addBreakpoint): (WI.SourcesNavigationSidebarPanel.prototype._removeAllBreakpoints): (WI.SourcesNavigationSidebarPanel.prototype._breakpointsBeneathTreeElement): (WI.SourcesNavigationSidebarPanel.prototype._addIssue): (WI.SourcesNavigationSidebarPanel.prototype._updatePauseReasonSection): (WI.SourcesNavigationSidebarPanel.prototype._handleTreeSelectionDidChange): (WI.SourcesNavigationSidebarPanel.prototype._handleBreakpointElementAddedOrRemoved): (WI.SourcesNavigationSidebarPanel.prototype._populateCreateBreakpointContextMenu.addToggleForSpecialEventBreakpoint): (WI.SourcesNavigationSidebarPanel.prototype._populateCreateBreakpointContextMenu): (WI.SourcesNavigationSidebarPanel.prototype._handleDebuggerObjectDisplayLocationDidChange): (WI.SourcesNavigationSidebarPanel.prototype._compareBreakpointTreeElements): Deleted. * UserInterface/Models/ProbeSet.js: (WI.ProbeSet): (WI.ProbeSet.prototype.createProbe): (WI.ProbeSet.prototype.willRemove): * UserInterface/Controllers/TimelineManager.js: (WI.TimelineManager.prototype._processRecord): * UserInterface/Views/ProbeSetDetailsSection.js: (WI.ProbeSetDetailsSection): * UserInterface/Views/ProbeDetailsSidebarPanel.js: (WI.ProbeDetailsSidebarPanel.prototype.inspect): * UserInterface/Views/SourceCodeTextEditor.js: (WI.SourceCodeTextEditor): (WI.SourceCodeTextEditor.prototype.close): (WI.SourceCodeTextEditor.prototype.textEditorBreakpointAdded): * UserInterface/Views/TextResourceContentView.js: (WI.TextResourceContentView.prototype.get supplementalRepresentedObjects): (WI.TextResourceContentView.prototype._probeSetsChanged): Probes now support `WI.EventBreakpoint` in addition to `WI.JavaScriptBreakpoint`. * UserInterface/Views/ContentView.js: (WI.ContentView.createFromRepresentedObject): (WI.ContentView.resolvedRepresentedObjectForRepresentedObject): (WI.ContentView.isViewable): * UserInterface/Views/ContextMenuUtilities.js: (WI.appendContextMenuItemsForSourceCode): Replace `WI.Breakpoint` with `WI.JavaScriptBreakpoint`. * UserInterface/Views/DOMTreeContentView.js: (WI.DOMTreeContentView): Replace `WI.DOMBreakpoint` with `WI.Breakpoint`. * UserInterface/Views/EventListenerSectionGroup.js: (WI.EventListenerSectionGroup): * UserInterface/Views/EventListenerSectionGroup.css: (.event-listener-section > .content input[type="checkbox"] + .go-to-arrow): Added. (.event-listener-section > .content input[type="checkbox"]:not(:checked) + .go-to-arrow): Added. Add a go-to arrow next to the Breakpoint checkbox that reveals the `WI.EventBreakpoint` in the Sources Tab. * UserInterface/Views/BreakpointActionView.js: (WI.BreakpointActionView.prototype._appendActionButtonClicked): Drive-by: minor code cleanup. * UserInterface/Views/CallFrameTreeElement.js: (WI.CallFrameTreeElement.prototype.populateContextMenu): Drive-by: include source code location context menu items. * UserInterface/Base/Setting.js: * UserInterface/Main.html: * UserInterface/Test.html: LayoutTests: * inspector/dom-debugger/resources/event-breakpoint-utilities.js: (TestPage.registerInitializer.InspectorTest.EventBreakpoint.addBreakpointOptionsTestCases): Added. (TestPage.registerInitializer.InspectorTest.EventBreakpoint.async teardown): (TestPage.registerInitializer.InspectorTest.EventBreakpoint.createBreakpoint): (TestPage.registerInitializer.InspectorTest.EventBreakpoint.removeBreakpoint): * inspector/dom/breakpoint-for-event-listener.html: * inspector/dom/breakpoint-for-event-listener-expected.txt: * inspector/dom-debugger/event-animation-frame-breakpoints.html: * inspector/dom-debugger/event-animation-frame-breakpoints-expected.txt: * inspector/dom-debugger/event-interval-breakpoints.html: * inspector/dom-debugger/event-interval-breakpoints-expected.txt: * inspector/dom-debugger/event-listener-breakpoints.html: * inspector/dom-debugger/event-listener-breakpoints-expected.txt: * inspector/dom-debugger/event-timeout-breakpoints.html: * inspector/dom-debugger/event-timeout-breakpoints-expected.txt: Add tests for new event breakpoint configuration options. * http/tests/inspector/debugger/debugger-test.js: (TestPage.registerInitializer.InspectorTest.startTracingBreakpoints): * http/tests/inspector/resources/probe-test.js: (TestPage.registerInitializer.ProtocolTest.Probe.installTracingListeners): * inspector/debugger/breakpoint-action-eval.html: * inspector/debugger/breakpoint-action-log.html: * inspector/debugger/breakpoint-columns.html: * inspector/debugger/breakpoint-scope.html: * inspector/debugger/debugger-stack-overflow.html: * inspector/debugger/pause-reason.html: * inspector/debugger/probe-manager-add-remove-actions.html: * inspector/debugger/stepping/stepping-through-autoContinue-breakpoint.html: * inspector/debugger/tail-deleted-frames-this-value.html: * inspector/debugger/tail-recursion.html: * inspector/worker/debugger-pause.html: * inspector/worker/debugger-shared-breakpoint.html: Update existing breakpoint tests to use new model objects. Canonical link: https://commits.webkit.org/228551@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@266074 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2020-08-24 17:34:12 +00:00
InspectorTest.EventBreakpoint.createBreakpoint(WI.EventBreakpoint.Type.Listener, {eventName})
Web Inspector: support breakpoints for timers and animation-frame events https://bugs.webkit.org/show_bug.cgi?id=188778 Reviewed by Brian Burg. Source/JavaScriptCore: * inspector/protocol/Debugger.json: Add `AnimationFrame` and `Timer` types to the list of pause reasons. * inspector/protocol/DOMDebugger.json: Introduced `setEventBreakpoint` and `removeEventBreakpoint` to replace the more specific: - `setEventListenerBreakpoint` - `removeEventListenerBreakpoint` - `setInstrumentationBreakpoint` - `removeInstrumentationBreakpoint` Also created an `EventBreakpointType` to enumerate the available types of event breakpoints. * inspector/scripts/codegen/generate_cpp_protocol_types_header.py: (CppProtocolTypesHeaderGenerator.generate_output): (CppProtocolTypesHeaderGenerator._generate_forward_declarations_for_binding_traits): (CppProtocolTypesHeaderGenerator._generate_declarations_for_enum_conversion_methods): (CppProtocolTypesHeaderGenerator._generate_hash_declarations): Added. Generate `DefaultHash` for all `enum class` used by inspector protocols. * inspector/scripts/tests/generic/expected/commands-with-async-attribute.json-result: * inspector/scripts/tests/generic/expected/commands-with-optional-call-return-parameters.json-result: * inspector/scripts/tests/generic/expected/enum-values.json-result: * inspector/scripts/tests/generic/expected/type-declaration-array-type.json-result: * inspector/scripts/tests/generic/expected/type-declaration-enum-type.json-result: * inspector/scripts/tests/generic/expected/type-declaration-object-type.json-result: * inspector/scripts/tests/generic/expected/type-requiring-runtime-casts.json-result: Source/WebCore: The original implementation of "instrumentation" breakpoints relied upon the frontend sending somewhat arbitrary strings when enabling breakpoints for specific events. As an example, setting a breakpoint for `requestAnimationFrame` expects `"animationFrameFired"` as the string, which doesn't make much sense. This patch removes the usage of these strings and instead expects the agent to implement a method that matches what is happening. Tests: inspector/dom-debugger/event-animation-frame-breakpoints.html inspector/dom-debugger/event-listener-breakpoints.html inspector/dom-debugger/event-timer-breakpoints.html * inspector/InspectorInstrumentation.h: (WebCore::InspectorInstrumentation::willFireTimer): * inspector/InspectorInstrumentation.cpp: (WebCore::InspectorInstrumentation::didInstallTimerImpl): (WebCore::InspectorInstrumentation::didRemoveTimerImpl): (WebCore::InspectorInstrumentation::willFireTimerImpl): (WebCore::InspectorInstrumentation::didRequestAnimationFrameImpl): (WebCore::InspectorInstrumentation::didCancelAnimationFrameImpl): (WebCore::InspectorInstrumentation::willFireAnimationFrameImpl): (WebCore::InspectorInstrumentation::pauseOnNativeEventIfNeeded): Deleted. * inspector/agents/InspectorDOMDebuggerAgent.h: * inspector/agents/InspectorDOMDebuggerAgent.cpp: (WebCore::InspectorDOMDebuggerAgent::setEventBreakpoint): Added. (WebCore::InspectorDOMDebuggerAgent::removeEventBreakpoint): Added. (WebCore::InspectorDOMDebuggerAgent::willHandleEvent): (WebCore::InspectorDOMDebuggerAgent::willFireTimer): Added. (WebCore::InspectorDOMDebuggerAgent::willFireAnimationFrame): Added. (WebCore::InspectorDOMDebuggerAgent::setEventListenerBreakpoint): Deleted. (WebCore::InspectorDOMDebuggerAgent::setInstrumentationBreakpoint): Deleted. (WebCore::InspectorDOMDebuggerAgent::setBreakpoint): Deleted. (WebCore::InspectorDOMDebuggerAgent::removeEventListenerBreakpoint): Deleted. (WebCore::InspectorDOMDebuggerAgent::removeInstrumentationBreakpoint): Deleted. (WebCore::InspectorDOMDebuggerAgent::removeBreakpoint): Deleted. (WebCore::InspectorDOMDebuggerAgent::pauseOnNativeEventIfNeeded): Deleted. Unify the event listener and instrumentation breakpoint commands into a single method, `setEventBreakpoint`, that takes in both an `EventBreakpointType` and `eventName`. * page/DOMTimer.cpp: (WebCore::DOMTimer::fired): Source/WebInspectorUI: Add a `type` to `WI.EventBreakpoint` that matches `DOMDebugger.EventBreakpointType`: - `AnimationFrame` for `requestAnimationFrame` - `Listener` for any named DOM Event - `Timer` for `setTimeout` and `setInterval` Modified `WI.EventBreakpointPopover` to provide ways for selecting these other types, which is then passed to `WI.DOMDebuggerManager`, which now calls through to the newly added `DOMDebugger.removeEventBreakpoint` and `DOMDebugger.setEventBreakpoint` that sets breakpoints for all event types. * Localizations/en.lproj/localizedStrings.js: * UserInterface/Images/EventBreakpointAnimationFrame.svg: Added. * UserInterface/Images/EventBreakpointListener.svg: Renamed from Source/WebInspectorUI/UserInterface/Images/EventBreakpoint.svg. * UserInterface/Images/EventBreakpointTimer.svg: Added. * UserInterface/Controllers/DOMDebuggerManager.js: (WI.DOMDebuggerManager.supportsEventBreakpoints): Added. (WI.DOMDebuggerManager.prototype.eventBreakpointForTypeAndEventName): Added. (WI.DOMDebuggerManager.prototype.addEventBreakpoint): (WI.DOMDebuggerManager.prototype.removeEventBreakpoint.breakpointRemoved): Added. (WI.DOMDebuggerManager.prototype.removeEventBreakpoint): (WI.DOMDebuggerManager.prototype._updateEventBreakpoint): (WI.DOMDebuggerManager.prototype.eventBreakpointForEventName): Deleted. * UserInterface/Controllers/DOMTreeManager.js: (WI.DOMTreeManager.prototype.setBreakpointForEventListener): * UserInterface/Controllers/DebuggerManager.js: (WI.DebuggerManager.prototype._pauseReasonFromPayload): * UserInterface/Models/EventBreakpoint.js: (WI.EventBreakpoint): (WI.EventBreakpoint.fromPayload): (WI.EventBreakpoint.prototype.get type): Added. (WI.EventBreakpoint.prototype.get serializableInfo): (WI.EventBreakpoint.prototype.saveIdentityToCookie): * UserInterface/Views/DebuggerSidebarPanel.js: (WI.DebuggerSidebarPanel.prototype._updatePauseReasonSection): (WI.DebuggerSidebarPanel.prototype.willDismissPopover): * UserInterface/Views/EventBreakpointPopover.js: (WI.EventBreakpointPopover): (WI.EventBreakpointPopover.prototype.get breakpoint): Added. (WI.EventBreakpointPopover.prototype.show): (WI.EventBreakpointPopover.prototype.show.createOption): Added. (WI.EventBreakpointPopover.prototype.dismiss): Added. (WI.EventBreakpointPopover.prototype._presentOverTargetElement): (WI.EventBreakpointPopover.prototype._handleTypeSelectChange): Added. (WI.EventBreakpointPopover.prototype.get result): Deleted. (WI.EventBreakpointPopover.prototype.get value): Deleted. * UserInterface/Views/EventBreakpointPopover.css: (.popover .event-breakpoint-content > .event-type): Added. (.popover .event-breakpoint-content > input): Deleted. * UserInterface/Views/EventBreakpointTreeElement.js: (WI.EventBreakpointTreeElement): * UserInterface/Views/EventBreakpointTreeElement.css: (.breakpoint.event.animation-frame:not(.breakpoint-paused-icon) .icon): Added. (.breakpoint.event.listener:not(.breakpoint-paused-icon) .icon): Added. (.breakpoint.event.timer:not(.breakpoint-paused-icon) .icon): Added. (.breakpoint.event:not(.breakpoint-paused-icon) .icon): Deleted. LayoutTests: * inspector/dom-debugger/event-animation-frame-breakpoints-expected.txt: Added. * inspector/dom-debugger/event-animation-frame-breakpoints.html: Added. * inspector/dom-debugger/event-breakpoint-with-navigation.html: * inspector/dom-debugger/event-timer-breakpoints-expected.txt: Added. * inspector/dom-debugger/event-timer-breakpoints.html: Added. * inspector/dom-debugger/event-listener-breakpoints-expected.txt: Renamed from LayoutTests/inspector/dom-debugger/event-breakpoints-expected.txt. * inspector/dom-debugger/event-listener-breakpoints.html: Renamed from LayoutTests/inspector/dom-debugger/event-breakpoints.html. * inspector/dom-debugger/resources/event-breakpoint-utilities.js: Added. (TestPage.registerInitializer.window.teardown): (TestPage.registerInitializer.window.failOnPause): (TestPage.registerInitializer.window.addBreakpoint): (TestPage.registerInitializer.window.removeBreakpoint): (TestPage.registerInitializer.window.disableBreakpoint): (TestPage.registerInitializer.window.awaitEvent): Canonical link: https://commits.webkit.org/203952@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@235248 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2018-08-23 21:36:40 +00:00
.then(InspectorTest.EventBreakpoint.removeBreakpoint)
.then(InspectorTest.EventBreakpoint.awaitEvent("body", eventName))
.catch(reject);
},
teardown: InspectorTest.EventBreakpoint.teardown,
});
suite.addTestCase({
name: `DOMDebugger.Event.Listener.RemoveDisabledBreakpoint "${eventName}"`,
description: "Check that a disabled breakpoint can be removed.",
test(resolve, reject) {
Web Inspector: DOM: add a special breakpoint for "All Events" https://bugs.webkit.org/show_bug.cgi?id=200285 Reviewed by Joseph Pecoraro. Source/JavaScriptCore: Similar to the existing "All Requests" breakpoint, there should be a way to set a breakpoint that would pause for any DOM event, regardless of the event's name. This is useful for situations where the event name isn't known, or where one simply wants to pause on the next entry to the event loop. Along these lines, make the "requestAnimationFrame", "setTimeout", and "setInterval" event breakpoints into special breakpoints that can be added/removed via the create breakpoint context menu. This simplifies the process for setting these breakpoints, and also makes them more discoverable (most people wouldn't consider them to be "events"). * inspector/protocol/Debugger.json: - Rename the `EventListener` pause reason to `Listener`. - Split the `Timer` pause reason into `Interval` and `Timeout`. * inspector/protocol/DOMDebugger.json: - Split the `timer` type into `interval` and `timeout`. - Make `eventName` optional for `addEventBreakpoint`/`removeEventBreakpoint`. When omitted, the corresponding breakpoint that is added/removed is treated as a global breakpoint that applies to all events of that type (e.g. a global `listener` breakpoint would pause for any event that is fired). Source/WebCore: Similar to the existing "All Requests" breakpoint, there should be a way to set a breakpoint that would pause for any DOM event, regardless of the event's name. This is useful for situations where the event name isn't known, or where one simply want's to pause on the next entry to the event loop. Along these lines, make the "requestAnimationFrame", "setTimeout", and "setInterval" event breakpoints into special breakpoints that can be added/removed via the create breakpoint context menu. This simplifies the process for setting these breakpoints, and also makes them more discoverable (most people wouldn't consider them to be "events"). Tests: inspector/dom/breakpoint-for-event-listener.html inspector/dom-debugger/event-animation-frame-breakpoints.html inspector/dom-debugger/event-breakpoint-with-navigation.html inspector/dom-debugger/event-interval-breakpoints.html inspector/dom-debugger/event-listener-breakpoints.html inspector/dom-debugger/event-timeout-breakpoints.html * inspector/agents/InspectorDOMDebuggerAgent.h: * inspector/agents/InspectorDOMDebuggerAgent.cpp: (WebCore::InspectorDOMDebuggerAgent::disable): (WebCore::InspectorDOMDebuggerAgent::frameDocumentUpdated): (WebCore::InspectorDOMDebuggerAgent::setEventBreakpoint): (WebCore::InspectorDOMDebuggerAgent::removeEventBreakpoint): (WebCore::InspectorDOMDebuggerAgent::willHandleEvent): (WebCore::InspectorDOMDebuggerAgent::willFireTimer): (WebCore::InspectorDOMDebuggerAgent::willFireAnimationFrame): (WebCore::InspectorDOMDebuggerAgent::discardBindings): Deleted. Make `eventName` optional for `addEventBreakpoint`/`removeEventBreakpoint`. When omitted, the corresponding breakpoint that is added/removed is treated as a global breakpoint that applies to all events of that type (e.g. a global `listener` breakpoint would pause for any event that is fired). Source/WebInspectorUI: Similar to the existing "All Requests" breakpoint, there should be a way to set a breakpoint that would pause for any DOM event, regardless of the event's name. This is useful for situations where the event name isn't known, or where one simply want's to pause on the next entry to the event loop. Along these lines, make the "requestAnimationFrame", "setTimeout", and "setInterval" event breakpoints into special breakpoints that can be added/removed via the create breakpoint context menu. This simplifies the process for setting these breakpoints, and also makes them more discoverable (most people wouldn't consider them to be "events"). * UserInterface/Models/EventBreakpoint.js: (WI.EventBreakpoint): (WI.EventBreakpoint.deserialize): (WI.EventBreakpoint.prototype.saveIdentityToCookie): (WI.EventBreakpoint.prototype.toJSON): * UserInterface/Controllers/DebuggerManager.js: (WI.DebuggerManager.prototype._pauseReasonFromPayload): * UserInterface/Controllers/DOMDebuggerManager.js: (WI.DOMDebuggerManager): (WI.DOMDebuggerManager.prototype.initializeTarget): (WI.DOMDebuggerManager.supportsDOMBreakpoints): Added. (WI.DOMDebuggerManager.supportsEventBreakpoints): (WI.DOMDebuggerManager.supportsEventListenerBreakpoints): Added. (WI.DOMDebuggerManager.supportsURLBreakpoints): (WI.DOMDebuggerManager.supportsXHRBreakpoints): Added. (WI.DOMDebuggerManager.supportsAllListenersBreakpoint): Added. (WI.DOMDebuggerManager.prototype.get allAnimationFramesBreakpoint): Added. (WI.DOMDebuggerManager.prototype.get allIntervalsBreakpoint): Added. (WI.DOMDebuggerManager.prototype.get allListenersBreakpoint): Added. (WI.DOMDebuggerManager.prototype.get allTimeoutsBreakpoint): Added. (WI.DOMDebuggerManager.prototype.get listenerBreakpoints): Added. (WI.DOMDebuggerManager.prototype.isBreakpointSpecial): (WI.DOMDebuggerManager.prototype.listenerBreakpointForEventName): Added. (WI.DOMDebuggerManager.prototype.addEventBreakpoint): (WI.DOMDebuggerManager.prototype.removeEventBreakpoint): (WI.DOMDebuggerManager.prototype.addURLBreakpoint): (WI.DOMDebuggerManager.prototype._resolveDOMBreakpoint): (WI.DOMDebuggerManager.prototype._updateDOMBreakpoint): (WI.DOMDebuggerManager.prototype._updateEventBreakpoint): (WI.DOMDebuggerManager.prototype._updateURLBreakpoint): (WI.DOMDebuggerManager.prototype._handleDOMBreakpointDisabledStateChanged): (WI.DOMDebuggerManager.prototype._handleEventBreakpointDisabledStateChanged): (WI.DOMDebuggerManager.prototype._handleURLBreakpointDisabledStateChanged): (WI.DOMDebuggerManager.prototype.get eventBreakpoints): Deleted. (WI.DOMDebuggerManager.prototype.eventBreakpointForTypeAndEventName): Deleted. Add additional target compatibility checks. * UserInterface/Views/EventBreakpointPopover.js: (WI.EventBreakpointPopover.prototype.show): (WI.EventBreakpointPopover.prototype.dismiss): (WI.EventBreakpointPopover.prototype._handleTypeSelectChange): Deleted. * UserInterface/Views/EventBreakpointPopover.css: (.popover .event-breakpoint-content > input): Added. (.popover .event-breakpoint-content > input::placeholder): Added. (.popover .event-breakpoint-content > .event-type): Deleted. (.popover .event-breakpoint-content > .event-type > input): Deleted. (.popover .event-breakpoint-content > .event-type > input::placeholder): Deleted. * UserInterface/Views/EventBreakpointTreeElement.css: (.breakpoint.event.breakpoint-for-interval:not(.breakpoint-paused-icon) .icon): Added. (.breakpoint.event.breakpoint-for-timeout:not(.breakpoint-paused-icon) .icon): Added. (.breakpoint.event.breakpoint-for-timer:not(.breakpoint-paused-icon) .icon): Deleted. * UserInterface/Views/DebuggerSidebarPanel.js: (WI.DebuggerSidebarPanel): (WI.DebuggerSidebarPanel.prototype.saveStateToCookie): (WI.DebuggerSidebarPanel.prototype.restoreStateFromCookie): (WI.DebuggerSidebarPanel.prototype._addBreakpoint): (WI.DebuggerSidebarPanel.prototype._addTreeElement): (WI.DebuggerSidebarPanel.prototype._updatePauseReasonSection): (WI.DebuggerSidebarPanel.prototype._handleBreakpointElementAddedOrRemoved): (WI.DebuggerSidebarPanel.prototype._populateCreateBreakpointContextMenu.addToggleForSpecialEventBreakpoint): Added. (WI.DebuggerSidebarPanel.prototype._populateCreateBreakpointContextMenu): * UserInterface/Views/SourcesNavigationSidebarPanel.js: (WI.SourcesNavigationSidebarPanel): (WI.SourcesNavigationSidebarPanel.prototype._insertDebuggerTreeElement): (WI.SourcesNavigationSidebarPanel.prototype._addBreakpoint): (WI.SourcesNavigationSidebarPanel.prototype._updatePauseReasonSection): (WI.SourcesNavigationSidebarPanel.prototype._handleBreakpointElementAddedOrRemoved): (WI.SourcesNavigationSidebarPanel.prototype._populateCreateBreakpointContextMenu.addToggleForSpecialEventBreakpoint): Added. (WI.SourcesNavigationSidebarPanel.prototype._populateCreateBreakpointContextMenu): Add create breakpoint context menu items (also sort the breakpoints in this order): - "All Animation Frames" => [A] All Animation Frames - "All Timeouts" => [T] All Timeouts - "All Intervals" => [I] All Intervals - "All Events" => [E] All Events * UserInterface/Controllers/JavaScriptRuntimeCompletionProvider.js: (WI.JavaScriptRuntimeCompletionProvider.completionControllerCompletionsNeeded.receivedPropertyNames): * UserInterface/Base/Setting.js: * UserInterface/Images/EventBreakpointInterval.svg: Added. * UserInterface/Images/EventBreakpointTimeout.svg: Renamed from Source/WebInspectorUI/UserInterface/Images/EventBreakpointTimer.svg. * Localizations/en.lproj/localizedStrings.js: LayoutTests: * inspector/dom/breakpoint-for-event-listener.html: * inspector/dom/breakpoint-for-event-listener-expected.txt: * inspector/dom-debugger/event-animation-frame-breakpoints.html: * inspector/dom-debugger/event-animation-frame-breakpoints-expected.txt: * inspector/dom-debugger/event-breakpoint-with-navigation.html: * inspector/dom-debugger/event-breakpoint-with-navigation-expected.txt: * inspector/dom-debugger/event-interval-breakpoints.html: Added. * inspector/dom-debugger/event-interval-breakpoints-expected.txt: Added. * inspector/dom-debugger/event-listener-breakpoints.html: * inspector/dom-debugger/event-listener-breakpoints-expected.txt: * inspector/dom-debugger/event-timeout-breakpoints.html: Added. * inspector/dom-debugger/event-timeout-breakpoints-expected.txt: Added. * inspector/dom-debugger/resources/event-breakpoint-utilities.js: (TestPage.registerInitializer.InspectorTest.EventBreakpoint.teardown): (TestPage.registerInitializer.InspectorTest.EventBreakpoint.failOnPause): (TestPage.registerInitializer.InspectorTest.EventBreakpoint.createBreakpoint): Added. (TestPage.registerInitializer.InspectorTest.EventBreakpoint.addBreakpoint): (TestPage.registerInitializer.InspectorTest.EventBreakpoint.removeBreakpoint): (TestPage.registerInitializer.InspectorTest.EventBreakpoint.disableBreakpoint): * inspector/dom-debugger/event-timer-breakpoints.html: Removed. * inspector/dom-debugger/event-timer-breakpoints-expected.txt: Removed. Canonical link: https://commits.webkit.org/214196@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@248201 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2019-08-03 19:00:01 +00:00
InspectorTest.EventBreakpoint.failOnPause(resolve, reject, WI.DebuggerManager.PauseReason.Listener, eventName, "Should not pause for removed disabled breakpoint.");
Web Inspector: support breakpoints for timers and animation-frame events https://bugs.webkit.org/show_bug.cgi?id=188778 Reviewed by Brian Burg. Source/JavaScriptCore: * inspector/protocol/Debugger.json: Add `AnimationFrame` and `Timer` types to the list of pause reasons. * inspector/protocol/DOMDebugger.json: Introduced `setEventBreakpoint` and `removeEventBreakpoint` to replace the more specific: - `setEventListenerBreakpoint` - `removeEventListenerBreakpoint` - `setInstrumentationBreakpoint` - `removeInstrumentationBreakpoint` Also created an `EventBreakpointType` to enumerate the available types of event breakpoints. * inspector/scripts/codegen/generate_cpp_protocol_types_header.py: (CppProtocolTypesHeaderGenerator.generate_output): (CppProtocolTypesHeaderGenerator._generate_forward_declarations_for_binding_traits): (CppProtocolTypesHeaderGenerator._generate_declarations_for_enum_conversion_methods): (CppProtocolTypesHeaderGenerator._generate_hash_declarations): Added. Generate `DefaultHash` for all `enum class` used by inspector protocols. * inspector/scripts/tests/generic/expected/commands-with-async-attribute.json-result: * inspector/scripts/tests/generic/expected/commands-with-optional-call-return-parameters.json-result: * inspector/scripts/tests/generic/expected/enum-values.json-result: * inspector/scripts/tests/generic/expected/type-declaration-array-type.json-result: * inspector/scripts/tests/generic/expected/type-declaration-enum-type.json-result: * inspector/scripts/tests/generic/expected/type-declaration-object-type.json-result: * inspector/scripts/tests/generic/expected/type-requiring-runtime-casts.json-result: Source/WebCore: The original implementation of "instrumentation" breakpoints relied upon the frontend sending somewhat arbitrary strings when enabling breakpoints for specific events. As an example, setting a breakpoint for `requestAnimationFrame` expects `"animationFrameFired"` as the string, which doesn't make much sense. This patch removes the usage of these strings and instead expects the agent to implement a method that matches what is happening. Tests: inspector/dom-debugger/event-animation-frame-breakpoints.html inspector/dom-debugger/event-listener-breakpoints.html inspector/dom-debugger/event-timer-breakpoints.html * inspector/InspectorInstrumentation.h: (WebCore::InspectorInstrumentation::willFireTimer): * inspector/InspectorInstrumentation.cpp: (WebCore::InspectorInstrumentation::didInstallTimerImpl): (WebCore::InspectorInstrumentation::didRemoveTimerImpl): (WebCore::InspectorInstrumentation::willFireTimerImpl): (WebCore::InspectorInstrumentation::didRequestAnimationFrameImpl): (WebCore::InspectorInstrumentation::didCancelAnimationFrameImpl): (WebCore::InspectorInstrumentation::willFireAnimationFrameImpl): (WebCore::InspectorInstrumentation::pauseOnNativeEventIfNeeded): Deleted. * inspector/agents/InspectorDOMDebuggerAgent.h: * inspector/agents/InspectorDOMDebuggerAgent.cpp: (WebCore::InspectorDOMDebuggerAgent::setEventBreakpoint): Added. (WebCore::InspectorDOMDebuggerAgent::removeEventBreakpoint): Added. (WebCore::InspectorDOMDebuggerAgent::willHandleEvent): (WebCore::InspectorDOMDebuggerAgent::willFireTimer): Added. (WebCore::InspectorDOMDebuggerAgent::willFireAnimationFrame): Added. (WebCore::InspectorDOMDebuggerAgent::setEventListenerBreakpoint): Deleted. (WebCore::InspectorDOMDebuggerAgent::setInstrumentationBreakpoint): Deleted. (WebCore::InspectorDOMDebuggerAgent::setBreakpoint): Deleted. (WebCore::InspectorDOMDebuggerAgent::removeEventListenerBreakpoint): Deleted. (WebCore::InspectorDOMDebuggerAgent::removeInstrumentationBreakpoint): Deleted. (WebCore::InspectorDOMDebuggerAgent::removeBreakpoint): Deleted. (WebCore::InspectorDOMDebuggerAgent::pauseOnNativeEventIfNeeded): Deleted. Unify the event listener and instrumentation breakpoint commands into a single method, `setEventBreakpoint`, that takes in both an `EventBreakpointType` and `eventName`. * page/DOMTimer.cpp: (WebCore::DOMTimer::fired): Source/WebInspectorUI: Add a `type` to `WI.EventBreakpoint` that matches `DOMDebugger.EventBreakpointType`: - `AnimationFrame` for `requestAnimationFrame` - `Listener` for any named DOM Event - `Timer` for `setTimeout` and `setInterval` Modified `WI.EventBreakpointPopover` to provide ways for selecting these other types, which is then passed to `WI.DOMDebuggerManager`, which now calls through to the newly added `DOMDebugger.removeEventBreakpoint` and `DOMDebugger.setEventBreakpoint` that sets breakpoints for all event types. * Localizations/en.lproj/localizedStrings.js: * UserInterface/Images/EventBreakpointAnimationFrame.svg: Added. * UserInterface/Images/EventBreakpointListener.svg: Renamed from Source/WebInspectorUI/UserInterface/Images/EventBreakpoint.svg. * UserInterface/Images/EventBreakpointTimer.svg: Added. * UserInterface/Controllers/DOMDebuggerManager.js: (WI.DOMDebuggerManager.supportsEventBreakpoints): Added. (WI.DOMDebuggerManager.prototype.eventBreakpointForTypeAndEventName): Added. (WI.DOMDebuggerManager.prototype.addEventBreakpoint): (WI.DOMDebuggerManager.prototype.removeEventBreakpoint.breakpointRemoved): Added. (WI.DOMDebuggerManager.prototype.removeEventBreakpoint): (WI.DOMDebuggerManager.prototype._updateEventBreakpoint): (WI.DOMDebuggerManager.prototype.eventBreakpointForEventName): Deleted. * UserInterface/Controllers/DOMTreeManager.js: (WI.DOMTreeManager.prototype.setBreakpointForEventListener): * UserInterface/Controllers/DebuggerManager.js: (WI.DebuggerManager.prototype._pauseReasonFromPayload): * UserInterface/Models/EventBreakpoint.js: (WI.EventBreakpoint): (WI.EventBreakpoint.fromPayload): (WI.EventBreakpoint.prototype.get type): Added. (WI.EventBreakpoint.prototype.get serializableInfo): (WI.EventBreakpoint.prototype.saveIdentityToCookie): * UserInterface/Views/DebuggerSidebarPanel.js: (WI.DebuggerSidebarPanel.prototype._updatePauseReasonSection): (WI.DebuggerSidebarPanel.prototype.willDismissPopover): * UserInterface/Views/EventBreakpointPopover.js: (WI.EventBreakpointPopover): (WI.EventBreakpointPopover.prototype.get breakpoint): Added. (WI.EventBreakpointPopover.prototype.show): (WI.EventBreakpointPopover.prototype.show.createOption): Added. (WI.EventBreakpointPopover.prototype.dismiss): Added. (WI.EventBreakpointPopover.prototype._presentOverTargetElement): (WI.EventBreakpointPopover.prototype._handleTypeSelectChange): Added. (WI.EventBreakpointPopover.prototype.get result): Deleted. (WI.EventBreakpointPopover.prototype.get value): Deleted. * UserInterface/Views/EventBreakpointPopover.css: (.popover .event-breakpoint-content > .event-type): Added. (.popover .event-breakpoint-content > input): Deleted. * UserInterface/Views/EventBreakpointTreeElement.js: (WI.EventBreakpointTreeElement): * UserInterface/Views/EventBreakpointTreeElement.css: (.breakpoint.event.animation-frame:not(.breakpoint-paused-icon) .icon): Added. (.breakpoint.event.listener:not(.breakpoint-paused-icon) .icon): Added. (.breakpoint.event.timer:not(.breakpoint-paused-icon) .icon): Added. (.breakpoint.event:not(.breakpoint-paused-icon) .icon): Deleted. LayoutTests: * inspector/dom-debugger/event-animation-frame-breakpoints-expected.txt: Added. * inspector/dom-debugger/event-animation-frame-breakpoints.html: Added. * inspector/dom-debugger/event-breakpoint-with-navigation.html: * inspector/dom-debugger/event-timer-breakpoints-expected.txt: Added. * inspector/dom-debugger/event-timer-breakpoints.html: Added. * inspector/dom-debugger/event-listener-breakpoints-expected.txt: Renamed from LayoutTests/inspector/dom-debugger/event-breakpoints-expected.txt. * inspector/dom-debugger/event-listener-breakpoints.html: Renamed from LayoutTests/inspector/dom-debugger/event-breakpoints.html. * inspector/dom-debugger/resources/event-breakpoint-utilities.js: Added. (TestPage.registerInitializer.window.teardown): (TestPage.registerInitializer.window.failOnPause): (TestPage.registerInitializer.window.addBreakpoint): (TestPage.registerInitializer.window.removeBreakpoint): (TestPage.registerInitializer.window.disableBreakpoint): (TestPage.registerInitializer.window.awaitEvent): Canonical link: https://commits.webkit.org/203952@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@235248 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2018-08-23 21:36:40 +00:00
Web Inspector: allow event breakpoints to be configured https://bugs.webkit.org/show_bug.cgi?id=215362 <rdar://problem/66932921> Reviewed by Brian Burg. Source/JavaScriptCore: This allows developers to do things like: - only pause when `window.event.type` is a certain value - ignore the first N pauses - evaluate JavaScript whenever an event listener is invoked without pausing * inspector/protocol/DOM.json: Add an `options` paramater to `DOM.setBreakpointForEventListener` to allow configuration. * inspector/protocol/DOMDebugger.json: Add an `options` paramater to `DOMDebugger.setEventBreakpoint` to allow configuration. * debugger/Breakpoint.h: (JSC::Breakpoint::id const): Added. (JSC::Breakpoint::sourceID const): Added. (JSC::Breakpoint::lineNumber const): Added. (JSC::Breakpoint::columnNumber const): Added. (JSC::Breakpoint::condition const): Added. (JSC::Breakpoint::actions const): Added. (JSC::Breakpoint::isAutoContinue const): Added. (JSC::Breakpoint::resetHitCount): Added. (JSC::Breakpoint::isLinked const): Added. (JSC::Breakpoint::isResolved const): Added. (JSC::BreakpointsList::~BreakpointsList): Deleted. * debugger/Breakpoint.cpp: Added. (JSC::Breakpoint::Action::Action): Added. (JSC::Breakpoint::create): Added. (JSC::Breakpoint::Breakpoint): Added. (JSC::Breakpoint::link): Added. (JSC::Breakpoint::resolve): Added. (JSC::Breakpoint::shouldPause): Added. Unify `JSC::Breakpoint` and `Inspector::ScriptBreakpoint`. * debugger/DebuggerPrimitives.h: * debugger/Debugger.h: * debugger/Debugger.cpp: (JSC::Debugger::Debugger): (JSC::Debugger::addObserver): Added. (JSC::Debugger::removeObserver): Added. (JSC::Debugger::canDispatchFunctionToObservers const): Added. (JSC::Debugger::dispatchFunctionToObservers): Added. (JSC::Debugger::sourceParsed): Added. (JSC::Debugger::toggleBreakpoint): (JSC::Debugger::applyBreakpoints): (JSC::Debugger::resolveBreakpoint): (JSC::Debugger::setBreakpoint): (JSC::Debugger::removeBreakpoint): (JSC::Debugger::didHitBreakpoint): Added. (JSC::Debugger::clearBreakpoints): (JSC::Debugger::evaluateBreakpointCondition): Added. (JSC::Debugger::evaluateBreakpointActions): Added. (JSC::Debugger::schedulePauseAtNextOpportunity): Added. (JSC::Debugger::cancelPauseAtNextOpportunity): Added. (JSC::Debugger::schedulePauseForSpecialBreakpoint): Added. (JSC::Debugger::cancelPauseForSpecialBreakpoint): Added. (JSC::Debugger::continueProgram): (JSC::Debugger::stepNextExpression): (JSC::Debugger::stepIntoStatement): (JSC::Debugger::stepOverStatement): (JSC::Debugger::stepOutOfFunction): (JSC::Debugger::pauseIfNeeded): (JSC::Debugger::handlePause): Added. (JSC::Debugger::exceptionOrCaughtValue): Added. (JSC::Debugger::atExpression): (JSC::Debugger::clearNextPauseState): (JSC::Debugger::willRunMicrotask): Added. (JSC::Debugger::didRunMicrotask): Added. (JSC::Debugger::hasBreakpoint): Deleted. (JSC::Debugger::setPauseOnNextStatement): Deleted. Unify `JSC::Debugger` and `Inspector::ScriptDebugServer` to simplify breakpoint logic. Introduce the concept of a "special breakpoint", which is essentially a `JSC::Breakpoint` that is expected to pause at the next opportunity but isn't tied to a particular location. As an example, whenever an event breakpoint is hit, instead of just pausing at the next opportunity, the newly managed `JSC::Breakpoint` is used as a "special breakpoint", allowing for it's configuration (ie.g. condition, ignore count, actions, auto-continue) to be used. * inspector/agents/InspectorDebuggerAgent.h: * inspector/agents/InspectorDebuggerAgent.cpp: (Inspector::objectGroupForBreakpointAction): (Inspector::breakpointActionTypeForString): Added. (Inspector::parseBreakpointOptions): Added. (Inspector::InspectorDebuggerAgent::ProtocolBreakpoint::fromPayload): Added. (Inspector::InspectorDebuggerAgent::ProtocolBreakpoint::ProtocolBreakpoint): Added. (Inspector::InspectorDebuggerAgent::ProtocolBreakpoint::createDebuggerBreakpoint const): Added. (Inspector::InspectorDebuggerAgent::ProtocolBreakpoint::matchesScriptURL const): Added. (Inspector::InspectorDebuggerAgent::debuggerBreakpointFromPayload): Added. (Inspector::InspectorDebuggerAgent::enable): (Inspector::InspectorDebuggerAgent::disable): (Inspector::InspectorDebuggerAgent::buildBreakpointPauseReason): (Inspector::InspectorDebuggerAgent::handleConsoleAssert): (Inspector::InspectorDebuggerAgent::didScheduleAsyncCall): (Inspector::buildDebuggerLocation): (Inspector::InspectorDebuggerAgent::setBreakpointByUrl): (Inspector::InspectorDebuggerAgent::setBreakpoint): (Inspector::InspectorDebuggerAgent::didSetBreakpoint): (Inspector::InspectorDebuggerAgent::resolveBreakpoint): (Inspector::InspectorDebuggerAgent::removeBreakpoint): (Inspector::InspectorDebuggerAgent::continueToLocation): (Inspector::InspectorDebuggerAgent::schedulePauseAtNextOpportunity): Added. (Inspector::InspectorDebuggerAgent::cancelPauseAtNextOpportunity): Added. (Inspector::InspectorDebuggerAgent::schedulePauseForSpecialBreakpoint): Added. (Inspector::InspectorDebuggerAgent::cancelPauseForSpecialBreakpoint): Added. (Inspector::InspectorDebuggerAgent::pause): (Inspector::InspectorDebuggerAgent::resume): (Inspector::InspectorDebuggerAgent::didBecomeIdle): (Inspector::InspectorDebuggerAgent::sourceMapURLForScript): (Inspector::InspectorDebuggerAgent::didParseSource): (Inspector::InspectorDebuggerAgent::willRunMicrotask): (Inspector::InspectorDebuggerAgent::didRunMicrotask): (Inspector::InspectorDebuggerAgent::didPause): (Inspector::InspectorDebuggerAgent::breakpointActionSound): (Inspector::InspectorDebuggerAgent::breakpointActionProbe): (Inspector::InspectorDebuggerAgent::clearInspectorBreakpointState): (Inspector::InspectorDebuggerAgent::clearDebuggerBreakpointState): (Inspector::matches): Deleted. (Inspector::buildObjectForBreakpointCookie): Deleted. (Inspector::InspectorDebuggerAgent::breakpointActionsFromProtocol): Deleted. (Inspector::InspectorDebuggerAgent::schedulePauseOnNextStatement): Deleted. (Inspector::InspectorDebuggerAgent::cancelPauseOnNextStatement): Deleted. Create a private `ProtocolBreakpoint` class that holds the data sent by the frontend. This is necessary because breakpoints in the frontend have a potentially one-to-many relationship with breakpoints in the backend, as the same script can be loaded many times on a page. Each of those scripts is independent, however, and can execute differently, meaning that the same breakpoint for each script also needs a different state (e.g. ignore count). As such, the `ProtocolBreakpoint` is effectively a template that is actualized whenever a new script is parsed that matches the URL of the `ProtocolBreakpoint` to create a `JSC::Breakpoint` that is used by the `JSC::Debugger`. `ProtocolBreakpoint` also parses breakpoint configurations. * inspector/InspectorEnvironment.h: * inspector/JSGlobalObjectScriptDebugServer.h: * inspector/JSGlobalObjectScriptDebugServer.cpp: (Inspector::JSGlobalObjectScriptDebugServer::JSGlobalObjectScriptDebugServer): (Inspector::JSGlobalObjectScriptDebugServer::attachDebugger): (Inspector::JSGlobalObjectScriptDebugServer::detachDebugger): (Inspector::JSGlobalObjectScriptDebugServer::runEventLoopWhilePaused): * inspector/agents/InspectorAuditAgent.h: * inspector/agents/InspectorAuditAgent.cpp: (Inspector::InspectorAuditAgent::run): * inspector/agents/InspectorRuntimeAgent.h: * inspector/agents/InspectorRuntimeAgent.cpp: (Inspector::setPauseOnExceptionsState): (Inspector::InspectorRuntimeAgent::evaluate): (Inspector::InspectorRuntimeAgent::callFunctionOn): (Inspector::InspectorRuntimeAgent::getPreview): (Inspector::InspectorRuntimeAgent::getProperties): (Inspector::InspectorRuntimeAgent::getDisplayableProperties): * inspector/agents/InspectorScriptProfilerAgent.cpp: * inspector/agents/JSGlobalObjectDebuggerAgent.h: Replace `Inspector::ScriptDebugServer` with `JSC::Debugger`. * runtime/JSMicrotask.cpp: (JSC::JSMicrotask::run): Drive-by: r248894 mistakenly omitted the call to notify the debugger that the microtask ran. * inspector/ScriptBreakpoint.h: Removed. * inspector/ScriptDebugListener.h: Removed. * inspector/ScriptDebugServer.h: Removed. * inspector/ScriptDebugServer.cpp: Removed. * CMakeLists.txt: * JavaScriptCore.xcodeproj/project.pbxproj: * Sources.txt: Source/WebCore: This allows developers to do things like: - only pause when `window.event.type` is a certain value - ignore the first N pauses - evaluate JavaScript whenever an event listener is invoked without pausing Tests: inspector/dom/breakpoint-for-event-listener.html inspector/dom-debugger/event-animation-frame-breakpoints.html inspector/dom-debugger/event-interval-breakpoints.html inspector/dom-debugger/event-listener-breakpoints.html inspector/dom-debugger/event-timeout-breakpoints.html * inspector/agents/InspectorDOMAgent.h: * inspector/agents/InspectorDOMAgent.cpp: (WebCore::InspectorDOMAgent::getEventListenersForNode): (WebCore::InspectorDOMAgent::setBreakpointForEventListener): (WebCore::InspectorDOMAgent::removeBreakpointForEventListener): (WebCore::InspectorDOMAgent::buildObjectForEventListener): (WebCore::InspectorDOMAgent::breakpointForEventListener): (WebCore::InspectorDOMAgent::hasBreakpointForEventListener): Deleted. * inspector/agents/InspectorDOMDebuggerAgent.h: * inspector/agents/InspectorDOMDebuggerAgent.cpp: (WebCore::InspectorDOMDebuggerAgent::disable): (WebCore::InspectorDOMDebuggerAgent::mainFrameNavigated): (WebCore::InspectorDOMDebuggerAgent::setEventBreakpoint): (WebCore::InspectorDOMDebuggerAgent::removeEventBreakpoint): (WebCore::InspectorDOMDebuggerAgent::willHandleEvent): (WebCore::InspectorDOMDebuggerAgent::didHandleEvent): (WebCore::InspectorDOMDebuggerAgent::willFireTimer): (WebCore::InspectorDOMDebuggerAgent::didFireTimer): * inspector/agents/page/PageDOMDebuggerAgent.h: * inspector/agents/page/PageDOMDebuggerAgent.cpp: (WebCore::PageDOMDebuggerAgent::disable): (WebCore::PageDOMDebuggerAgent::mainFrameNavigated): (WebCore::PageDOMDebuggerAgent::willFireAnimationFrame): (WebCore::PageDOMDebuggerAgent::didFireAnimationFrame): (WebCore::PageDOMDebuggerAgent::setAnimationFrameBreakpoint): * inspector/agents/worker/WorkerDOMDebuggerAgent.h: * inspector/agents/worker/WorkerDOMDebuggerAgent.cpp: (WebCore::WorkerDOMDebuggerAgent::setAnimationFrameBreakpoint): Keep a `JSC::Breakpoint` for each event breakpoint instead of a simple `bool`, allowing for configuration when the breakpoint is first set. When any of these breakpoints are hit, pass it to the `JSC::Debugger` as a "special breakpoint", which behaves the same as "pause ASAP" but also supports a condition, an ignore count, actions, and auto-continue. Reset the hit count for any of these "special breakpoints" that persist across Web Inspector sessions when the main frame navigates. * inspector/PageScriptDebugServer.h: * inspector/PageScriptDebugServer.cpp: (WebCore::PageScriptDebugServer::PageScriptDebugServer): (WebCore::PageScriptDebugServer::attachDebugger): (WebCore::PageScriptDebugServer::detachDebugger): (WebCore::PageScriptDebugServer::didPause): (WebCore::PageScriptDebugServer::didContinue): (WebCore::PageScriptDebugServer::runEventLoopWhilePaused): (WebCore::PageScriptDebugServer::runEventLoopWhilePausedInternal): (WebCore::PageScriptDebugServer::isContentScript const): (WebCore::PageScriptDebugServer::reportException const): * inspector/WorkerScriptDebugServer.h: * inspector/WorkerScriptDebugServer.cpp: (WebCore::WorkerScriptDebugServer::WorkerScriptDebugServer): (WebCore::WorkerScriptDebugServer::attachDebugger): (WebCore::WorkerScriptDebugServer::detachDebugger): (WebCore::WorkerScriptDebugServer::runEventLoopWhilePaused): (WebCore::WorkerScriptDebugServer::reportException const): * inspector/agents/page/PageDebuggerAgent.h: * inspector/agents/page/PageDebuggerAgent.cpp: (WebCore::PageDebuggerAgent::sourceMapURLForScript): Replace `Inspector::ScriptDebugServer` with `JSC::Debugger`. * inspector/TimelineRecordFactory.h: * inspector/TimelineRecordFactory.cpp: (WebCore::TimelineRecordFactory::createProbeSampleData): * inspector/agents/InspectorTimelineAgent.h: * inspector/agents/InspectorTimelineAgent.cpp: (WebCore::InspectorTimelineAgent::internalStart): (WebCore::InspectorTimelineAgent::internalStop): (WebCore::InspectorTimelineAgent::breakpointActionProbe): Replace `Inspector::ScriptBreakpoint` with `JSC::Breakpoint`. * inspector/InspectorInstrumentation.h: (WebCore::InspectorInstrumentation::didHandleEvent): (WebCore::InspectorInstrumentation::didFireTimer): * inspector/InspectorInstrumentation.cpp: (WebCore::InspectorInstrumentation::didHandleEventImpl): (WebCore::InspectorInstrumentation::didFireTimerImpl): (WebCore::InspectorInstrumentation::didCommitLoadImpl): (WebCore::InspectorInstrumentation::didFireAnimationFrameImpl): * dom/EventTarget.cpp: (WebCore::EventTarget::innerInvokeEventListeners): * page/DOMTimer.cpp: (WebCore::DOMTimer::fired): When notifying Web Inspector that activity did occur, include all information previously included when notifying Web Inspector that that activity was about to occur so that Web Inspector can know whether a pause for the "special breakpoint" for that activity is still scheduled and if so cancel it. Source/WebInspectorUI: This allows developers to do things like: - only pause when `window.event.type` is a certain value - ignore the first N pauses - evaluate JavaScript whenever an event listener is invoked without pausing * UserInterface/Models/Breakpoint.js: (WI.Breakpoint): (WI.Breakpoint.prototype.toJSON): (WI.Breakpoint.prototype.get special): Added. (WI.Breakpoint.prototype.get removable): Added. (WI.Breakpoint.prototype.get editable): Added. (WI.Breakpoint.prototype.set condition): (WI.Breakpoint.prototype.get ignoreCount): (WI.Breakpoint.prototype.set ignoreCount): (WI.Breakpoint.prototype.get autoContinue): (WI.Breakpoint.prototype.set autoContinue): (WI.Breakpoint.prototype.get actions): (WI.Breakpoint.prototype.get probeActions): (WI.Breakpoint.prototype.cycleToNextMode): (WI.Breakpoint.prototype.createAction): (WI.Breakpoint.prototype.recreateAction): (WI.Breakpoint.prototype.removeAction): (WI.Breakpoint.prototype.clearActions): (WI.Breakpoint.prototype.remove): Added. (WI.Breakpoint.prototype.optionsToProtocol): Added. (WI.Breakpoint.prototype.breakpointActionDidChange): (WI.Breakpoint.fromJSON): Deleted. (WI.Breakpoint.prototype.get sourceCodeLocation): Deleted. (WI.Breakpoint.prototype.get contentIdentifier): Deleted. (WI.Breakpoint.prototype.get scriptIdentifier): Deleted. (WI.Breakpoint.prototype.get target): Deleted. (WI.Breakpoint.prototype.get identifier): Deleted. (WI.Breakpoint.prototype.set identifier): Deleted. (WI.Breakpoint.prototype.get resolved): Deleted. (WI.Breakpoint.prototype.set resolved): Deleted. (WI.Breakpoint.prototype.saveIdentityToCookie): Deleted. (WI.Breakpoint.prototype._isSpecial): Deleted. (WI.Breakpoint.prototype._sourceCodeLocationLocationChanged): Deleted. (WI.Breakpoint.prototype._sourceCodeLocationDisplayLocationChanged): Deleted. * UserInterface/Models/DOMBreakpoint.js: (WI.DOMBreakpoint): (WI.DOMBreakpoint.fromJSON): Added. (WI.DOMBreakpoint.prototype.remove): Added. (WI.DOMBreakpoint.prototype.toJSON): (WI.DOMBreakpoint.deserialize): Deleted. (WI.DOMBreakpoint.prototype.get disabled): Deleted. (WI.DOMBreakpoint.prototype.set disabled): Deleted. * UserInterface/Models/EventBreakpoint.js: (WI.EventBreakpoint): (WI.EventBreakpoint.fromJSON): Added. (WI.EventBreakpoint.prototype.get special): Added. (WI.EventBreakpoint.prototype.get editable): Added. (WI.EventBreakpoint.prototype.remove): Added. (WI.EventBreakpoint.prototype.saveIdentityToCookie): (WI.EventBreakpoint.prototype.toJSON): (WI.EventBreakpoint.deserialize): Deleted. (WI.EventBreakpoint.prototype.get disabled): Deleted. (WI.EventBreakpoint.prototype.set disabled): Deleted. * UserInterface/Models/JavaScriptBreakpoint.js: Copied from UserInterface/Models/Breakpoint.js. (WI.JavaScriptBreakpoint): (WI.JavaScriptBreakpoint.fromJSON): (WI.JavaScriptBreakpoint.prototype.toJSON): (WI.JavaScriptBreakpoint.prototype.get sourceCodeLocation): (WI.JavaScriptBreakpoint.prototype.get contentIdentifier): (WI.JavaScriptBreakpoint.prototype.get scriptIdentifier): (WI.JavaScriptBreakpoint.prototype.get target): (WI.JavaScriptBreakpoint.prototype.get special): Added. (WI.JavaScriptBreakpoint.prototype.get removable): Added. (WI.JavaScriptBreakpoint.prototype.get editable): Added. (WI.JavaScriptBreakpoint.prototype.get identifier): (WI.JavaScriptBreakpoint.prototype.set identifier): (WI.JavaScriptBreakpoint.prototype.get resolved): (WI.JavaScriptBreakpoint.prototype.set resolved): (WI.JavaScriptBreakpoint.prototype.remove): Added. (WI.JavaScriptBreakpoint.prototype.saveIdentityToCookie): (WI.JavaScriptBreakpoint.prototype._isSpecial): (WI.JavaScriptBreakpoint.prototype._sourceCodeLocationLocationChanged): (WI.JavaScriptBreakpoint.prototype._sourceCodeLocationDisplayLocationChanged): * UserInterface/Models/URLBreakpoint.js: (WI.URLBreakpoint): (WI.URLBreakpoint.fromJSON): Added. (WI.URLBreakpoint.prototype.get special): Added. (WI.URLBreakpoint.prototype.remove): Added. (WI.URLBreakpoint.prototype.toJSON): (WI.URLBreakpoint.deserialize): Deleted. (WI.URLBreakpoint.prototype.get disabled): Deleted. (WI.URLBreakpoint.prototype.set disabled): Deleted. Rename `WI.Breakpoint` to `WI.JavaScriptBreakpoint` and use `WI.Breakpoint` as a new common base class for all breakpoint types, allowing more logic to be shared (e.g. disabled state). Additionally, breakpoints are now able to - determine whether or not they're - special - removable - editable (i.e. configurable) - remove themselves without the caller needing to know what manager to consult with. * UserInterface/Controllers/DOMManager.js: (WI.DOMManager): (WI.DOMManager.supportsEventListenerBreakpointConfiguration): Added. (WI.DOMManager.prototype.setBreakpointForEventListener): (WI.DOMManager.prototype.removeBreakpointForEventListener): (WI.DOMManager.prototype._setEventBreakpoint): Added. (WI.DOMManager.prototype._removeEventBreakpoint): Added. (WI.DOMManager.prototype._handleEventBreakpointEditablePropertyChanged): Added. (WI.DOMManager.prototype._handleEventBreakpointActionsChanged): Added. (WI.DOMManager.prototype._updateEventBreakpoint): Deleted. Keep track of configuration changes for specific listener breakpoints. * UserInterface/Controllers/DOMDebuggerManager.js: (WI.DOMDebuggerManager): (WI.DOMDebuggerManager.prototype.initializeTarget): (WI.DOMDebuggerManager.prototype.addDOMBreakpoint): (WI.DOMDebuggerManager.prototype.removeDOMBreakpoint): (WI.DOMDebuggerManager.prototype.addEventBreakpoint): (WI.DOMDebuggerManager.prototype.removeEventBreakpoint): (WI.DOMDebuggerManager.prototype.addURLBreakpoint): (WI.DOMDebuggerManager.prototype.removeURLBreakpoint): (WI.DOMDebuggerManager.prototype._commandArgumentsForEventBreakpoint): Added. (WI.DOMDebuggerManager.prototype._setEventBreakpoint): Added. (WI.DOMDebuggerManager.prototype._removeEventBreakpoint): Added. (WI.DOMDebuggerManager.prototype._handleEventBreakpointDisabledStateChanged): Added. (WI.DOMDebuggerManager.prototype._handleEventBreakpointEditablePropertyChanged): Added. (WI.DOMDebuggerManager.prototype._handleEventBreakpointActionsChanged): Added. (WI.DOMDebuggerManager.prototype.isBreakpointSpecial): Deleted. (WI.DOMDebuggerManager.prototype._updateEventBreakpoint): Deleted. Keep track of configuration changes for special event breakpoints. Store special event breakpoints inside `WI.objectStores.eventBreakpoints`. * UserInterface/Controllers/DebuggerManager.js: (WI.DebuggerManager): (WI.DebuggerManager.prototype.addBreakpoint): (WI.DebuggerManager.prototype.removeBreakpoint): (WI.DebuggerManager.prototype.addProbesForBreakpoint): Added. (WI.DebuggerManager.prototype.removeProbesForBreakpoint): Added. (WI.DebuggerManager.prototype.updateProbesForBreakpoint): Added. (WI.DebuggerManager.prototype._setBreakpoint): (WI.DebuggerManager.prototype._breakpointEditablePropertyDidChange): (WI.DebuggerManager.prototype._handleBreakpointActionsDidChange): (WI.DebuggerManager.prototype.isBreakpointRemovable): Deleted. (WI.DebuggerManager.prototype.isBreakpointSpecial): Deleted. (WI.DebuggerManager.prototype.isBreakpointEditable): Deleted. (WI.DebuggerManager.prototype._debuggerBreakpointActionType): Deleted. (WI.DebuggerManager.prototype._debuggerBreakpointOptions): Deleted. (WI.DebuggerManager.prototype._addProbesForBreakpoint): Deleted. (WI.DebuggerManager.prototype._removeProbesForBreakpoint): Deleted. (WI.DebuggerManager.prototype._updateProbesForBreakpoint): Deleted. Replace `WI.Breakpoint` with `WI.JavaScriptBreakpoint`. Probes now support `WI.EventBreakpoint` in addition to `WI.JavaScriptBreakpoint`. * UserInterface/Controllers/BreakpointPopoverController.js: (WI.BreakpointPopoverController.prototype.appendContextMenuItems): (WI.BreakpointPopoverController.prototype._createPopoverContent): Allow any breakpoint instead of only `WI.JavaScriptBreakpoint`. Drive-by: the existing `ignoreCount` value wasn't being used to populate the `<input>`. * UserInterface/Views/BreakpointTreeElement.js: (WI.BreakpointTreeElement.prototype.ondelete): (WI.BreakpointTreeElement.prototype.get listenerSet): Added. (WI.BreakpointTreeElement.prototype.updateStatus): Added. (WI.BreakpointTreeElement.prototype.updateTitles): Added. (WI.BreakpointTreeElement.prototype.get breakpoint): Deleted. (WI.BreakpointTreeElement.prototype.get filterableData): Deleted. (WI.BreakpointTreeElement.prototype._updateTitles): Deleted. (WI.BreakpointTreeElement.prototype._updateStatus): Deleted. (WI.BreakpointTreeElement.prototype._breakpointLocationDidChange): Deleted. * UserInterface/Views/BreakpointTreeElement.css: (.item.breakpoint .status > .status-image): (.item.breakpoint.paused .icon): Added. (@media (prefers-color-scheme: dark) .item.breakpoint.paused .icon): Added. (.item.breakpoint .status > .status-image.resolved): Deleted. (body:not(.window-inactive, .window-docked-inactive) .tree-outline:focus-within .item.breakpoint.selected .status > .status-image.resolved): Deleted. (.item.breakpoint .subtitle.formatted-location): Deleted. (.breakpoint-debugger-statement-icon .icon): Deleted. (.breakpoint-exception-icon .icon): Deleted. (.breakpoint-assertion-icon .icon): Deleted. (.breakpoint-microtask-icon .icon): Deleted. (.breakpoint-paused-icon .icon): Deleted. (.breakpoint-generic-line-icon .icon): Deleted. (.breakpoint-generic-line-icon .icon > span): Deleted. (.data-updated.breakpoint-generic-line-icon .icon > span): Deleted. (@media (prefers-color-scheme: dark) .breakpoint-debugger-statement-icon .icon): Deleted. (@media (prefers-color-scheme: dark) .breakpoint-exception-icon .icon): Deleted. (@media (prefers-color-scheme: dark) .breakpoint-assertion-icon .icon): Deleted. (@media (prefers-color-scheme: dark) .breakpoint-microtask-icon .icon): Deleted. (@media (prefers-color-scheme: dark) .breakpoint-paused-icon .icon): Deleted. (@media (prefers-color-scheme: dark) .breakpoint-generic-line-icon .icon): Deleted. * UserInterface/Views/DOMBreakpointTreeElement.js: (WI.DOMBreakpointTreeElement): (WI.DOMBreakpointTreeElement.prototype.onattach): Deleted. (WI.DOMBreakpointTreeElement.prototype.ondetach): Deleted. (WI.DOMBreakpointTreeElement.prototype.ondelete): Deleted. (WI.DOMBreakpointTreeElement.prototype.onenter): Deleted. (WI.DOMBreakpointTreeElement.prototype.onspace): Deleted. (WI.DOMBreakpointTreeElement.prototype.populateContextMenu): Deleted. (WI.DOMBreakpointTreeElement.prototype._statusImageElementClicked): Deleted. (WI.DOMBreakpointTreeElement.prototype._statusImageElementFocused): Deleted. (WI.DOMBreakpointTreeElement.prototype._statusImageElementMouseDown): Deleted. (WI.DOMBreakpointTreeElement.prototype._toggleBreakpoint): Deleted. (WI.DOMBreakpointTreeElement.prototype._updateStatus): Deleted. * UserInterface/Views/DOMBreakpointTreeElement.css: (.item.breakpoint.dom.subtree-modified:not(.paused) .icon): Added. (.item.breakpoint.dom.attribute-modified:not(.paused) .icon): Added. (.item.breakpoint.dom.node-removed:not(.paused) .icon): Added. (@media (prefers-color-scheme: dark) .item.breakpoint.dom.subtree-modified:not(.paused) .icon): Added. (@media (prefers-color-scheme: dark) .item.breakpoint.dom.attribute-modified:not(.paused) .icon): Added. (@media (prefers-color-scheme: dark) .item.breakpoint.dom.node-removed:not(.paused) .icon): Added. (.breakpoint.dom.breakpoint-for-subtree-modified:not(.breakpoint-paused-icon) .icon): Deleted. (.breakpoint.dom.breakpoint-for-attribute-modified:not(.breakpoint-paused-icon) .icon): Deleted. (.breakpoint.dom.breakpoint-for-node-removed:not(.breakpoint-paused-icon) .icon): Deleted. (@media (prefers-color-scheme: dark) .breakpoint.dom.breakpoint-for-subtree-modified:not(.breakpoint-paused-icon) .icon): Deleted. (@media (prefers-color-scheme: dark) .breakpoint.dom.breakpoint-for-attribute-modified:not(.breakpoint-paused-icon) .icon): Deleted. (@media (prefers-color-scheme: dark) .breakpoint.dom.breakpoint-for-node-removed:not(.breakpoint-paused-icon) .icon): Deleted. * UserInterface/Views/EventBreakpointTreeElement.js: (WI.EventBreakpointTreeElement): (WI.EventBreakpointTreeElement.prototype.onattach): Deleted. (WI.EventBreakpointTreeElement.prototype.ondetach): Deleted. (WI.EventBreakpointTreeElement.prototype.ondelete): Deleted. (WI.EventBreakpointTreeElement.prototype.onenter): Deleted. (WI.EventBreakpointTreeElement.prototype.onspace): Deleted. (WI.EventBreakpointTreeElement.prototype.populateContextMenu): Deleted. (WI.EventBreakpointTreeElement.prototype._statusImageElementClicked): Deleted. (WI.EventBreakpointTreeElement.prototype._statusImageElementFocused): Deleted. (WI.EventBreakpointTreeElement.prototype._statusImageElementMouseDown): Deleted. (WI.EventBreakpointTreeElement.prototype._toggleBreakpoint): Deleted. (WI.EventBreakpointTreeElement.prototype._updateStatus): Deleted. * UserInterface/Views/EventBreakpointTreeElement.css: (.item.breakpoint.event.animation-frame:not(.paused) .icon): Added. (.item.breakpoint.event.interval:not(.paused) .icon): Added. (.item.breakpoint.event.listener:not(.paused) .icon): Added. (.item.breakpoint.event.timeout:not(.paused) .icon): Added. (@media(prefers-color-scheme: dark) .item.breakpoint.event.animation-frame:not(.paused) .icon): Added. (@media(prefers-color-scheme: dark) .item.breakpoint.event.interval:not(.paused) .icon): Added. (@media(prefers-color-scheme: dark) .item.breakpoint.event.listener:not(.paused) .icon): Added. (@media(prefers-color-scheme: dark) .item.breakpoint.event.timeout:not(.paused) .icon): Added. (.breakpoint.event.breakpoint-for-animation-frame:not(.breakpoint-paused-icon) .icon): Deleted. (.breakpoint.event.breakpoint-for-interval:not(.breakpoint-paused-icon) .icon): Deleted. (.breakpoint.event.breakpoint-for-listener:not(.breakpoint-paused-icon) .icon): Deleted. (.breakpoint.event.breakpoint-for-timeout:not(.breakpoint-paused-icon) .icon): Deleted. (@media(prefers-color-scheme: dark) .breakpoint.event.breakpoint-for-animation-frame:not(.breakpoint-paused-icon) .icon): Deleted. (@media(prefers-color-scheme: dark) .breakpoint.event.breakpoint-for-interval:not(.breakpoint-paused-icon) .icon): Deleted. (@media(prefers-color-scheme: dark) .breakpoint.event.breakpoint-for-listener:not(.breakpoint-paused-icon) .icon): Deleted. (@media(prefers-color-scheme: dark) .breakpoint.event.breakpoint-for-timeout:not(.breakpoint-paused-icon) .icon): Deleted. * UserInterface/Views/JavaScriptBreakpointTreeElement.js: Copied from Source/WebInspectorUI/UserInterface/Views/BreakpointTreeElement.js. (WI.JavaScriptBreakpointTreeElement): (WI.JavaScriptBreakpointTreeElement.prototype.get filterableData): (WI.JavaScriptBreakpointTreeElement.prototype.updateStatus): Added. (WI.JavaScriptBreakpointTreeElement.prototype.updateTitles): Added. (WI.JavaScriptBreakpointTreeElement.prototype._breakpointLocationDidChange): * UserInterface/Views/JavaScriptBreakpointTreeElement.css: Copied from Source/WebInspectorUI/UserInterface/Views/BreakpointTreeElement.css. (.item.breakpoint.javascript .status > .status-image): Added. (.item.breakpoint.javascript .status > .status-image.resolved): Added. (body:not(.window-inactive, .window-docked-inactive) .tree-outline:focus-within .item.breakpoint.javascript.selected .status > .status-image.resolved): Added. (.item.breakpoint.javascript .subtitle.formatted-location): Added. (.item.breakpoint.javascript.line .icon): Added. (.item.breakpoint.javascript.line .icon > span): Added. (.data-updated.item.breakpoint.javascript.line .icon > span): Added. (.item.breakpoint.javascript.debugger-statement .icon): Added. (.item.breakpoint.javascript.exception .icon): Added. (.item.breakpoint.javascript.assertion .icon): Added. (.item.breakpoint.javascript.microtask .icon): Added. (@media (prefers-color-scheme: dark) .item.breakpoint.javascript.line .icon): Added. (@media (prefers-color-scheme: dark) .item.breakpoint.javascript.debugger-statement .icon): Added. (@media (prefers-color-scheme: dark) .item.breakpoint.javascript.exception .icon): Added. (@media (prefers-color-scheme: dark) .item.breakpoint.javascript.assertion .icon): Added. (@media (prefers-color-scheme: dark) .item.breakpoint.javascript.microtask .icon): Added. * UserInterface/Views/URLBreakpointTreeElement.js: (WI.URLBreakpointTreeElement): (WI.URLBreakpointTreeElement.prototype.onattach): Deleted. (WI.URLBreakpointTreeElement.prototype.ondetach): Deleted. (WI.URLBreakpointTreeElement.prototype.ondelete): Deleted. (WI.URLBreakpointTreeElement.prototype.onenter): Deleted. (WI.URLBreakpointTreeElement.prototype.onspace): Deleted. (WI.URLBreakpointTreeElement.prototype.populateContextMenu): Deleted. (WI.URLBreakpointTreeElement.prototype._statusImageElementClicked): Deleted. (WI.URLBreakpointTreeElement.prototype._statusImageElementFocused): Deleted. (WI.URLBreakpointTreeElement.prototype._statusImageElementMouseDown): Deleted. (WI.URLBreakpointTreeElement.prototype._toggleBreakpoint): Deleted. (WI.URLBreakpointTreeElement.prototype._updateStatus): Deleted. * UserInterface/Views/URLBreakpointTreeElement.css: (.item.breakpoint.url .subtitle): Added. (.item.breakpoint.url:not(.paused) .icon): Added. (@media (prefers-color-scheme: dark) .item.breakpoint.url:not(.paused) .icon): Added. (.breakpoint.url .subtitle): Deleted. (.breakpoint.url:not(.breakpoint-paused-icon) .icon): Deleted. (@media (prefers-color-scheme: dark) .breakpoint.url:not(.breakpoint-paused-icon) .icon): Deleted. Rename `WI.BreakpointTreeElement` to `WI.JavaScriptBreakpointTreeElement` and use `WI.BreakpointTreeElement` as a new common base class for all breakpoint tree elements, allowing more logic and styles to be shared (e.g. disabled state). * UserInterface/Views/SourcesNavigationSidebarPanel.js: (WI.SourcesNavigationSidebarPanel): (WI.SourcesNavigationSidebarPanel.prototype.closed): (WI.SourcesNavigationSidebarPanel.prototype._insertDebuggerTreeElement): (WI.SourcesNavigationSidebarPanel.prototype._compareJavaScriptBreakpointTreeElements): Added. (WI.SourcesNavigationSidebarPanel.prototype._addBreakpoint): (WI.SourcesNavigationSidebarPanel.prototype._removeAllBreakpoints): (WI.SourcesNavigationSidebarPanel.prototype._breakpointsBeneathTreeElement): (WI.SourcesNavigationSidebarPanel.prototype._addIssue): (WI.SourcesNavigationSidebarPanel.prototype._updatePauseReasonSection): (WI.SourcesNavigationSidebarPanel.prototype._handleTreeSelectionDidChange): (WI.SourcesNavigationSidebarPanel.prototype._handleBreakpointElementAddedOrRemoved): (WI.SourcesNavigationSidebarPanel.prototype._populateCreateBreakpointContextMenu.addToggleForSpecialEventBreakpoint): (WI.SourcesNavigationSidebarPanel.prototype._populateCreateBreakpointContextMenu): (WI.SourcesNavigationSidebarPanel.prototype._handleDebuggerObjectDisplayLocationDidChange): (WI.SourcesNavigationSidebarPanel.prototype._compareBreakpointTreeElements): Deleted. * UserInterface/Models/ProbeSet.js: (WI.ProbeSet): (WI.ProbeSet.prototype.createProbe): (WI.ProbeSet.prototype.willRemove): * UserInterface/Controllers/TimelineManager.js: (WI.TimelineManager.prototype._processRecord): * UserInterface/Views/ProbeSetDetailsSection.js: (WI.ProbeSetDetailsSection): * UserInterface/Views/ProbeDetailsSidebarPanel.js: (WI.ProbeDetailsSidebarPanel.prototype.inspect): * UserInterface/Views/SourceCodeTextEditor.js: (WI.SourceCodeTextEditor): (WI.SourceCodeTextEditor.prototype.close): (WI.SourceCodeTextEditor.prototype.textEditorBreakpointAdded): * UserInterface/Views/TextResourceContentView.js: (WI.TextResourceContentView.prototype.get supplementalRepresentedObjects): (WI.TextResourceContentView.prototype._probeSetsChanged): Probes now support `WI.EventBreakpoint` in addition to `WI.JavaScriptBreakpoint`. * UserInterface/Views/ContentView.js: (WI.ContentView.createFromRepresentedObject): (WI.ContentView.resolvedRepresentedObjectForRepresentedObject): (WI.ContentView.isViewable): * UserInterface/Views/ContextMenuUtilities.js: (WI.appendContextMenuItemsForSourceCode): Replace `WI.Breakpoint` with `WI.JavaScriptBreakpoint`. * UserInterface/Views/DOMTreeContentView.js: (WI.DOMTreeContentView): Replace `WI.DOMBreakpoint` with `WI.Breakpoint`. * UserInterface/Views/EventListenerSectionGroup.js: (WI.EventListenerSectionGroup): * UserInterface/Views/EventListenerSectionGroup.css: (.event-listener-section > .content input[type="checkbox"] + .go-to-arrow): Added. (.event-listener-section > .content input[type="checkbox"]:not(:checked) + .go-to-arrow): Added. Add a go-to arrow next to the Breakpoint checkbox that reveals the `WI.EventBreakpoint` in the Sources Tab. * UserInterface/Views/BreakpointActionView.js: (WI.BreakpointActionView.prototype._appendActionButtonClicked): Drive-by: minor code cleanup. * UserInterface/Views/CallFrameTreeElement.js: (WI.CallFrameTreeElement.prototype.populateContextMenu): Drive-by: include source code location context menu items. * UserInterface/Base/Setting.js: * UserInterface/Main.html: * UserInterface/Test.html: LayoutTests: * inspector/dom-debugger/resources/event-breakpoint-utilities.js: (TestPage.registerInitializer.InspectorTest.EventBreakpoint.addBreakpointOptionsTestCases): Added. (TestPage.registerInitializer.InspectorTest.EventBreakpoint.async teardown): (TestPage.registerInitializer.InspectorTest.EventBreakpoint.createBreakpoint): (TestPage.registerInitializer.InspectorTest.EventBreakpoint.removeBreakpoint): * inspector/dom/breakpoint-for-event-listener.html: * inspector/dom/breakpoint-for-event-listener-expected.txt: * inspector/dom-debugger/event-animation-frame-breakpoints.html: * inspector/dom-debugger/event-animation-frame-breakpoints-expected.txt: * inspector/dom-debugger/event-interval-breakpoints.html: * inspector/dom-debugger/event-interval-breakpoints-expected.txt: * inspector/dom-debugger/event-listener-breakpoints.html: * inspector/dom-debugger/event-listener-breakpoints-expected.txt: * inspector/dom-debugger/event-timeout-breakpoints.html: * inspector/dom-debugger/event-timeout-breakpoints-expected.txt: Add tests for new event breakpoint configuration options. * http/tests/inspector/debugger/debugger-test.js: (TestPage.registerInitializer.InspectorTest.startTracingBreakpoints): * http/tests/inspector/resources/probe-test.js: (TestPage.registerInitializer.ProtocolTest.Probe.installTracingListeners): * inspector/debugger/breakpoint-action-eval.html: * inspector/debugger/breakpoint-action-log.html: * inspector/debugger/breakpoint-columns.html: * inspector/debugger/breakpoint-scope.html: * inspector/debugger/debugger-stack-overflow.html: * inspector/debugger/pause-reason.html: * inspector/debugger/probe-manager-add-remove-actions.html: * inspector/debugger/stepping/stepping-through-autoContinue-breakpoint.html: * inspector/debugger/tail-deleted-frames-this-value.html: * inspector/debugger/tail-recursion.html: * inspector/worker/debugger-pause.html: * inspector/worker/debugger-shared-breakpoint.html: Update existing breakpoint tests to use new model objects. Canonical link: https://commits.webkit.org/228551@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@266074 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2020-08-24 17:34:12 +00:00
InspectorTest.EventBreakpoint.createBreakpoint(WI.EventBreakpoint.Type.Listener, {eventName})
Web Inspector: support breakpoints for timers and animation-frame events https://bugs.webkit.org/show_bug.cgi?id=188778 Reviewed by Brian Burg. Source/JavaScriptCore: * inspector/protocol/Debugger.json: Add `AnimationFrame` and `Timer` types to the list of pause reasons. * inspector/protocol/DOMDebugger.json: Introduced `setEventBreakpoint` and `removeEventBreakpoint` to replace the more specific: - `setEventListenerBreakpoint` - `removeEventListenerBreakpoint` - `setInstrumentationBreakpoint` - `removeInstrumentationBreakpoint` Also created an `EventBreakpointType` to enumerate the available types of event breakpoints. * inspector/scripts/codegen/generate_cpp_protocol_types_header.py: (CppProtocolTypesHeaderGenerator.generate_output): (CppProtocolTypesHeaderGenerator._generate_forward_declarations_for_binding_traits): (CppProtocolTypesHeaderGenerator._generate_declarations_for_enum_conversion_methods): (CppProtocolTypesHeaderGenerator._generate_hash_declarations): Added. Generate `DefaultHash` for all `enum class` used by inspector protocols. * inspector/scripts/tests/generic/expected/commands-with-async-attribute.json-result: * inspector/scripts/tests/generic/expected/commands-with-optional-call-return-parameters.json-result: * inspector/scripts/tests/generic/expected/enum-values.json-result: * inspector/scripts/tests/generic/expected/type-declaration-array-type.json-result: * inspector/scripts/tests/generic/expected/type-declaration-enum-type.json-result: * inspector/scripts/tests/generic/expected/type-declaration-object-type.json-result: * inspector/scripts/tests/generic/expected/type-requiring-runtime-casts.json-result: Source/WebCore: The original implementation of "instrumentation" breakpoints relied upon the frontend sending somewhat arbitrary strings when enabling breakpoints for specific events. As an example, setting a breakpoint for `requestAnimationFrame` expects `"animationFrameFired"` as the string, which doesn't make much sense. This patch removes the usage of these strings and instead expects the agent to implement a method that matches what is happening. Tests: inspector/dom-debugger/event-animation-frame-breakpoints.html inspector/dom-debugger/event-listener-breakpoints.html inspector/dom-debugger/event-timer-breakpoints.html * inspector/InspectorInstrumentation.h: (WebCore::InspectorInstrumentation::willFireTimer): * inspector/InspectorInstrumentation.cpp: (WebCore::InspectorInstrumentation::didInstallTimerImpl): (WebCore::InspectorInstrumentation::didRemoveTimerImpl): (WebCore::InspectorInstrumentation::willFireTimerImpl): (WebCore::InspectorInstrumentation::didRequestAnimationFrameImpl): (WebCore::InspectorInstrumentation::didCancelAnimationFrameImpl): (WebCore::InspectorInstrumentation::willFireAnimationFrameImpl): (WebCore::InspectorInstrumentation::pauseOnNativeEventIfNeeded): Deleted. * inspector/agents/InspectorDOMDebuggerAgent.h: * inspector/agents/InspectorDOMDebuggerAgent.cpp: (WebCore::InspectorDOMDebuggerAgent::setEventBreakpoint): Added. (WebCore::InspectorDOMDebuggerAgent::removeEventBreakpoint): Added. (WebCore::InspectorDOMDebuggerAgent::willHandleEvent): (WebCore::InspectorDOMDebuggerAgent::willFireTimer): Added. (WebCore::InspectorDOMDebuggerAgent::willFireAnimationFrame): Added. (WebCore::InspectorDOMDebuggerAgent::setEventListenerBreakpoint): Deleted. (WebCore::InspectorDOMDebuggerAgent::setInstrumentationBreakpoint): Deleted. (WebCore::InspectorDOMDebuggerAgent::setBreakpoint): Deleted. (WebCore::InspectorDOMDebuggerAgent::removeEventListenerBreakpoint): Deleted. (WebCore::InspectorDOMDebuggerAgent::removeInstrumentationBreakpoint): Deleted. (WebCore::InspectorDOMDebuggerAgent::removeBreakpoint): Deleted. (WebCore::InspectorDOMDebuggerAgent::pauseOnNativeEventIfNeeded): Deleted. Unify the event listener and instrumentation breakpoint commands into a single method, `setEventBreakpoint`, that takes in both an `EventBreakpointType` and `eventName`. * page/DOMTimer.cpp: (WebCore::DOMTimer::fired): Source/WebInspectorUI: Add a `type` to `WI.EventBreakpoint` that matches `DOMDebugger.EventBreakpointType`: - `AnimationFrame` for `requestAnimationFrame` - `Listener` for any named DOM Event - `Timer` for `setTimeout` and `setInterval` Modified `WI.EventBreakpointPopover` to provide ways for selecting these other types, which is then passed to `WI.DOMDebuggerManager`, which now calls through to the newly added `DOMDebugger.removeEventBreakpoint` and `DOMDebugger.setEventBreakpoint` that sets breakpoints for all event types. * Localizations/en.lproj/localizedStrings.js: * UserInterface/Images/EventBreakpointAnimationFrame.svg: Added. * UserInterface/Images/EventBreakpointListener.svg: Renamed from Source/WebInspectorUI/UserInterface/Images/EventBreakpoint.svg. * UserInterface/Images/EventBreakpointTimer.svg: Added. * UserInterface/Controllers/DOMDebuggerManager.js: (WI.DOMDebuggerManager.supportsEventBreakpoints): Added. (WI.DOMDebuggerManager.prototype.eventBreakpointForTypeAndEventName): Added. (WI.DOMDebuggerManager.prototype.addEventBreakpoint): (WI.DOMDebuggerManager.prototype.removeEventBreakpoint.breakpointRemoved): Added. (WI.DOMDebuggerManager.prototype.removeEventBreakpoint): (WI.DOMDebuggerManager.prototype._updateEventBreakpoint): (WI.DOMDebuggerManager.prototype.eventBreakpointForEventName): Deleted. * UserInterface/Controllers/DOMTreeManager.js: (WI.DOMTreeManager.prototype.setBreakpointForEventListener): * UserInterface/Controllers/DebuggerManager.js: (WI.DebuggerManager.prototype._pauseReasonFromPayload): * UserInterface/Models/EventBreakpoint.js: (WI.EventBreakpoint): (WI.EventBreakpoint.fromPayload): (WI.EventBreakpoint.prototype.get type): Added. (WI.EventBreakpoint.prototype.get serializableInfo): (WI.EventBreakpoint.prototype.saveIdentityToCookie): * UserInterface/Views/DebuggerSidebarPanel.js: (WI.DebuggerSidebarPanel.prototype._updatePauseReasonSection): (WI.DebuggerSidebarPanel.prototype.willDismissPopover): * UserInterface/Views/EventBreakpointPopover.js: (WI.EventBreakpointPopover): (WI.EventBreakpointPopover.prototype.get breakpoint): Added. (WI.EventBreakpointPopover.prototype.show): (WI.EventBreakpointPopover.prototype.show.createOption): Added. (WI.EventBreakpointPopover.prototype.dismiss): Added. (WI.EventBreakpointPopover.prototype._presentOverTargetElement): (WI.EventBreakpointPopover.prototype._handleTypeSelectChange): Added. (WI.EventBreakpointPopover.prototype.get result): Deleted. (WI.EventBreakpointPopover.prototype.get value): Deleted. * UserInterface/Views/EventBreakpointPopover.css: (.popover .event-breakpoint-content > .event-type): Added. (.popover .event-breakpoint-content > input): Deleted. * UserInterface/Views/EventBreakpointTreeElement.js: (WI.EventBreakpointTreeElement): * UserInterface/Views/EventBreakpointTreeElement.css: (.breakpoint.event.animation-frame:not(.breakpoint-paused-icon) .icon): Added. (.breakpoint.event.listener:not(.breakpoint-paused-icon) .icon): Added. (.breakpoint.event.timer:not(.breakpoint-paused-icon) .icon): Added. (.breakpoint.event:not(.breakpoint-paused-icon) .icon): Deleted. LayoutTests: * inspector/dom-debugger/event-animation-frame-breakpoints-expected.txt: Added. * inspector/dom-debugger/event-animation-frame-breakpoints.html: Added. * inspector/dom-debugger/event-breakpoint-with-navigation.html: * inspector/dom-debugger/event-timer-breakpoints-expected.txt: Added. * inspector/dom-debugger/event-timer-breakpoints.html: Added. * inspector/dom-debugger/event-listener-breakpoints-expected.txt: Renamed from LayoutTests/inspector/dom-debugger/event-breakpoints-expected.txt. * inspector/dom-debugger/event-listener-breakpoints.html: Renamed from LayoutTests/inspector/dom-debugger/event-breakpoints.html. * inspector/dom-debugger/resources/event-breakpoint-utilities.js: Added. (TestPage.registerInitializer.window.teardown): (TestPage.registerInitializer.window.failOnPause): (TestPage.registerInitializer.window.addBreakpoint): (TestPage.registerInitializer.window.removeBreakpoint): (TestPage.registerInitializer.window.disableBreakpoint): (TestPage.registerInitializer.window.awaitEvent): Canonical link: https://commits.webkit.org/203952@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@235248 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2018-08-23 21:36:40 +00:00
.then(InspectorTest.EventBreakpoint.disableBreakpoint)
.then(InspectorTest.EventBreakpoint.removeBreakpoint)
.then(InspectorTest.EventBreakpoint.awaitEvent("body", eventName))
.catch(reject);
},
teardown: InspectorTest.EventBreakpoint.teardown,
});
}
addTestCasesForEventName("click");
addTestCasesForEventName("custom");
Web Inspector: DOM: add a special breakpoint for "All Events" https://bugs.webkit.org/show_bug.cgi?id=200285 Reviewed by Joseph Pecoraro. Source/JavaScriptCore: Similar to the existing "All Requests" breakpoint, there should be a way to set a breakpoint that would pause for any DOM event, regardless of the event's name. This is useful for situations where the event name isn't known, or where one simply wants to pause on the next entry to the event loop. Along these lines, make the "requestAnimationFrame", "setTimeout", and "setInterval" event breakpoints into special breakpoints that can be added/removed via the create breakpoint context menu. This simplifies the process for setting these breakpoints, and also makes them more discoverable (most people wouldn't consider them to be "events"). * inspector/protocol/Debugger.json: - Rename the `EventListener` pause reason to `Listener`. - Split the `Timer` pause reason into `Interval` and `Timeout`. * inspector/protocol/DOMDebugger.json: - Split the `timer` type into `interval` and `timeout`. - Make `eventName` optional for `addEventBreakpoint`/`removeEventBreakpoint`. When omitted, the corresponding breakpoint that is added/removed is treated as a global breakpoint that applies to all events of that type (e.g. a global `listener` breakpoint would pause for any event that is fired). Source/WebCore: Similar to the existing "All Requests" breakpoint, there should be a way to set a breakpoint that would pause for any DOM event, regardless of the event's name. This is useful for situations where the event name isn't known, or where one simply want's to pause on the next entry to the event loop. Along these lines, make the "requestAnimationFrame", "setTimeout", and "setInterval" event breakpoints into special breakpoints that can be added/removed via the create breakpoint context menu. This simplifies the process for setting these breakpoints, and also makes them more discoverable (most people wouldn't consider them to be "events"). Tests: inspector/dom/breakpoint-for-event-listener.html inspector/dom-debugger/event-animation-frame-breakpoints.html inspector/dom-debugger/event-breakpoint-with-navigation.html inspector/dom-debugger/event-interval-breakpoints.html inspector/dom-debugger/event-listener-breakpoints.html inspector/dom-debugger/event-timeout-breakpoints.html * inspector/agents/InspectorDOMDebuggerAgent.h: * inspector/agents/InspectorDOMDebuggerAgent.cpp: (WebCore::InspectorDOMDebuggerAgent::disable): (WebCore::InspectorDOMDebuggerAgent::frameDocumentUpdated): (WebCore::InspectorDOMDebuggerAgent::setEventBreakpoint): (WebCore::InspectorDOMDebuggerAgent::removeEventBreakpoint): (WebCore::InspectorDOMDebuggerAgent::willHandleEvent): (WebCore::InspectorDOMDebuggerAgent::willFireTimer): (WebCore::InspectorDOMDebuggerAgent::willFireAnimationFrame): (WebCore::InspectorDOMDebuggerAgent::discardBindings): Deleted. Make `eventName` optional for `addEventBreakpoint`/`removeEventBreakpoint`. When omitted, the corresponding breakpoint that is added/removed is treated as a global breakpoint that applies to all events of that type (e.g. a global `listener` breakpoint would pause for any event that is fired). Source/WebInspectorUI: Similar to the existing "All Requests" breakpoint, there should be a way to set a breakpoint that would pause for any DOM event, regardless of the event's name. This is useful for situations where the event name isn't known, or where one simply want's to pause on the next entry to the event loop. Along these lines, make the "requestAnimationFrame", "setTimeout", and "setInterval" event breakpoints into special breakpoints that can be added/removed via the create breakpoint context menu. This simplifies the process for setting these breakpoints, and also makes them more discoverable (most people wouldn't consider them to be "events"). * UserInterface/Models/EventBreakpoint.js: (WI.EventBreakpoint): (WI.EventBreakpoint.deserialize): (WI.EventBreakpoint.prototype.saveIdentityToCookie): (WI.EventBreakpoint.prototype.toJSON): * UserInterface/Controllers/DebuggerManager.js: (WI.DebuggerManager.prototype._pauseReasonFromPayload): * UserInterface/Controllers/DOMDebuggerManager.js: (WI.DOMDebuggerManager): (WI.DOMDebuggerManager.prototype.initializeTarget): (WI.DOMDebuggerManager.supportsDOMBreakpoints): Added. (WI.DOMDebuggerManager.supportsEventBreakpoints): (WI.DOMDebuggerManager.supportsEventListenerBreakpoints): Added. (WI.DOMDebuggerManager.supportsURLBreakpoints): (WI.DOMDebuggerManager.supportsXHRBreakpoints): Added. (WI.DOMDebuggerManager.supportsAllListenersBreakpoint): Added. (WI.DOMDebuggerManager.prototype.get allAnimationFramesBreakpoint): Added. (WI.DOMDebuggerManager.prototype.get allIntervalsBreakpoint): Added. (WI.DOMDebuggerManager.prototype.get allListenersBreakpoint): Added. (WI.DOMDebuggerManager.prototype.get allTimeoutsBreakpoint): Added. (WI.DOMDebuggerManager.prototype.get listenerBreakpoints): Added. (WI.DOMDebuggerManager.prototype.isBreakpointSpecial): (WI.DOMDebuggerManager.prototype.listenerBreakpointForEventName): Added. (WI.DOMDebuggerManager.prototype.addEventBreakpoint): (WI.DOMDebuggerManager.prototype.removeEventBreakpoint): (WI.DOMDebuggerManager.prototype.addURLBreakpoint): (WI.DOMDebuggerManager.prototype._resolveDOMBreakpoint): (WI.DOMDebuggerManager.prototype._updateDOMBreakpoint): (WI.DOMDebuggerManager.prototype._updateEventBreakpoint): (WI.DOMDebuggerManager.prototype._updateURLBreakpoint): (WI.DOMDebuggerManager.prototype._handleDOMBreakpointDisabledStateChanged): (WI.DOMDebuggerManager.prototype._handleEventBreakpointDisabledStateChanged): (WI.DOMDebuggerManager.prototype._handleURLBreakpointDisabledStateChanged): (WI.DOMDebuggerManager.prototype.get eventBreakpoints): Deleted. (WI.DOMDebuggerManager.prototype.eventBreakpointForTypeAndEventName): Deleted. Add additional target compatibility checks. * UserInterface/Views/EventBreakpointPopover.js: (WI.EventBreakpointPopover.prototype.show): (WI.EventBreakpointPopover.prototype.dismiss): (WI.EventBreakpointPopover.prototype._handleTypeSelectChange): Deleted. * UserInterface/Views/EventBreakpointPopover.css: (.popover .event-breakpoint-content > input): Added. (.popover .event-breakpoint-content > input::placeholder): Added. (.popover .event-breakpoint-content > .event-type): Deleted. (.popover .event-breakpoint-content > .event-type > input): Deleted. (.popover .event-breakpoint-content > .event-type > input::placeholder): Deleted. * UserInterface/Views/EventBreakpointTreeElement.css: (.breakpoint.event.breakpoint-for-interval:not(.breakpoint-paused-icon) .icon): Added. (.breakpoint.event.breakpoint-for-timeout:not(.breakpoint-paused-icon) .icon): Added. (.breakpoint.event.breakpoint-for-timer:not(.breakpoint-paused-icon) .icon): Deleted. * UserInterface/Views/DebuggerSidebarPanel.js: (WI.DebuggerSidebarPanel): (WI.DebuggerSidebarPanel.prototype.saveStateToCookie): (WI.DebuggerSidebarPanel.prototype.restoreStateFromCookie): (WI.DebuggerSidebarPanel.prototype._addBreakpoint): (WI.DebuggerSidebarPanel.prototype._addTreeElement): (WI.DebuggerSidebarPanel.prototype._updatePauseReasonSection): (WI.DebuggerSidebarPanel.prototype._handleBreakpointElementAddedOrRemoved): (WI.DebuggerSidebarPanel.prototype._populateCreateBreakpointContextMenu.addToggleForSpecialEventBreakpoint): Added. (WI.DebuggerSidebarPanel.prototype._populateCreateBreakpointContextMenu): * UserInterface/Views/SourcesNavigationSidebarPanel.js: (WI.SourcesNavigationSidebarPanel): (WI.SourcesNavigationSidebarPanel.prototype._insertDebuggerTreeElement): (WI.SourcesNavigationSidebarPanel.prototype._addBreakpoint): (WI.SourcesNavigationSidebarPanel.prototype._updatePauseReasonSection): (WI.SourcesNavigationSidebarPanel.prototype._handleBreakpointElementAddedOrRemoved): (WI.SourcesNavigationSidebarPanel.prototype._populateCreateBreakpointContextMenu.addToggleForSpecialEventBreakpoint): Added. (WI.SourcesNavigationSidebarPanel.prototype._populateCreateBreakpointContextMenu): Add create breakpoint context menu items (also sort the breakpoints in this order): - "All Animation Frames" => [A] All Animation Frames - "All Timeouts" => [T] All Timeouts - "All Intervals" => [I] All Intervals - "All Events" => [E] All Events * UserInterface/Controllers/JavaScriptRuntimeCompletionProvider.js: (WI.JavaScriptRuntimeCompletionProvider.completionControllerCompletionsNeeded.receivedPropertyNames): * UserInterface/Base/Setting.js: * UserInterface/Images/EventBreakpointInterval.svg: Added. * UserInterface/Images/EventBreakpointTimeout.svg: Renamed from Source/WebInspectorUI/UserInterface/Images/EventBreakpointTimer.svg. * Localizations/en.lproj/localizedStrings.js: LayoutTests: * inspector/dom/breakpoint-for-event-listener.html: * inspector/dom/breakpoint-for-event-listener-expected.txt: * inspector/dom-debugger/event-animation-frame-breakpoints.html: * inspector/dom-debugger/event-animation-frame-breakpoints-expected.txt: * inspector/dom-debugger/event-breakpoint-with-navigation.html: * inspector/dom-debugger/event-breakpoint-with-navigation-expected.txt: * inspector/dom-debugger/event-interval-breakpoints.html: Added. * inspector/dom-debugger/event-interval-breakpoints-expected.txt: Added. * inspector/dom-debugger/event-listener-breakpoints.html: * inspector/dom-debugger/event-listener-breakpoints-expected.txt: * inspector/dom-debugger/event-timeout-breakpoints.html: Added. * inspector/dom-debugger/event-timeout-breakpoints-expected.txt: Added. * inspector/dom-debugger/resources/event-breakpoint-utilities.js: (TestPage.registerInitializer.InspectorTest.EventBreakpoint.teardown): (TestPage.registerInitializer.InspectorTest.EventBreakpoint.failOnPause): (TestPage.registerInitializer.InspectorTest.EventBreakpoint.createBreakpoint): Added. (TestPage.registerInitializer.InspectorTest.EventBreakpoint.addBreakpoint): (TestPage.registerInitializer.InspectorTest.EventBreakpoint.removeBreakpoint): (TestPage.registerInitializer.InspectorTest.EventBreakpoint.disableBreakpoint): * inspector/dom-debugger/event-timer-breakpoints.html: Removed. * inspector/dom-debugger/event-timer-breakpoints-expected.txt: Removed. Canonical link: https://commits.webkit.org/214196@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@248201 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2019-08-03 19:00:01 +00:00
suite.addTestCase({
name: `DOMDebugger.Event.Listener.AllEventsBreakpoint`,
description: "Check that the all events breakpoint pauses for every event.",
test(resolve, reject) {
let pauseCount = 0;
let listener = WI.debuggerManager.addEventListener(WI.DebuggerManager.Event.Paused, (event) => {
++pauseCount;
InspectorTest.pass("Should pause before event handler is run.");
logActiveStackTrace();
WI.debuggerManager.resume()
.catch(reject);
});
Web Inspector: allow event breakpoints to be configured https://bugs.webkit.org/show_bug.cgi?id=215362 <rdar://problem/66932921> Reviewed by Brian Burg. Source/JavaScriptCore: This allows developers to do things like: - only pause when `window.event.type` is a certain value - ignore the first N pauses - evaluate JavaScript whenever an event listener is invoked without pausing * inspector/protocol/DOM.json: Add an `options` paramater to `DOM.setBreakpointForEventListener` to allow configuration. * inspector/protocol/DOMDebugger.json: Add an `options` paramater to `DOMDebugger.setEventBreakpoint` to allow configuration. * debugger/Breakpoint.h: (JSC::Breakpoint::id const): Added. (JSC::Breakpoint::sourceID const): Added. (JSC::Breakpoint::lineNumber const): Added. (JSC::Breakpoint::columnNumber const): Added. (JSC::Breakpoint::condition const): Added. (JSC::Breakpoint::actions const): Added. (JSC::Breakpoint::isAutoContinue const): Added. (JSC::Breakpoint::resetHitCount): Added. (JSC::Breakpoint::isLinked const): Added. (JSC::Breakpoint::isResolved const): Added. (JSC::BreakpointsList::~BreakpointsList): Deleted. * debugger/Breakpoint.cpp: Added. (JSC::Breakpoint::Action::Action): Added. (JSC::Breakpoint::create): Added. (JSC::Breakpoint::Breakpoint): Added. (JSC::Breakpoint::link): Added. (JSC::Breakpoint::resolve): Added. (JSC::Breakpoint::shouldPause): Added. Unify `JSC::Breakpoint` and `Inspector::ScriptBreakpoint`. * debugger/DebuggerPrimitives.h: * debugger/Debugger.h: * debugger/Debugger.cpp: (JSC::Debugger::Debugger): (JSC::Debugger::addObserver): Added. (JSC::Debugger::removeObserver): Added. (JSC::Debugger::canDispatchFunctionToObservers const): Added. (JSC::Debugger::dispatchFunctionToObservers): Added. (JSC::Debugger::sourceParsed): Added. (JSC::Debugger::toggleBreakpoint): (JSC::Debugger::applyBreakpoints): (JSC::Debugger::resolveBreakpoint): (JSC::Debugger::setBreakpoint): (JSC::Debugger::removeBreakpoint): (JSC::Debugger::didHitBreakpoint): Added. (JSC::Debugger::clearBreakpoints): (JSC::Debugger::evaluateBreakpointCondition): Added. (JSC::Debugger::evaluateBreakpointActions): Added. (JSC::Debugger::schedulePauseAtNextOpportunity): Added. (JSC::Debugger::cancelPauseAtNextOpportunity): Added. (JSC::Debugger::schedulePauseForSpecialBreakpoint): Added. (JSC::Debugger::cancelPauseForSpecialBreakpoint): Added. (JSC::Debugger::continueProgram): (JSC::Debugger::stepNextExpression): (JSC::Debugger::stepIntoStatement): (JSC::Debugger::stepOverStatement): (JSC::Debugger::stepOutOfFunction): (JSC::Debugger::pauseIfNeeded): (JSC::Debugger::handlePause): Added. (JSC::Debugger::exceptionOrCaughtValue): Added. (JSC::Debugger::atExpression): (JSC::Debugger::clearNextPauseState): (JSC::Debugger::willRunMicrotask): Added. (JSC::Debugger::didRunMicrotask): Added. (JSC::Debugger::hasBreakpoint): Deleted. (JSC::Debugger::setPauseOnNextStatement): Deleted. Unify `JSC::Debugger` and `Inspector::ScriptDebugServer` to simplify breakpoint logic. Introduce the concept of a "special breakpoint", which is essentially a `JSC::Breakpoint` that is expected to pause at the next opportunity but isn't tied to a particular location. As an example, whenever an event breakpoint is hit, instead of just pausing at the next opportunity, the newly managed `JSC::Breakpoint` is used as a "special breakpoint", allowing for it's configuration (ie.g. condition, ignore count, actions, auto-continue) to be used. * inspector/agents/InspectorDebuggerAgent.h: * inspector/agents/InspectorDebuggerAgent.cpp: (Inspector::objectGroupForBreakpointAction): (Inspector::breakpointActionTypeForString): Added. (Inspector::parseBreakpointOptions): Added. (Inspector::InspectorDebuggerAgent::ProtocolBreakpoint::fromPayload): Added. (Inspector::InspectorDebuggerAgent::ProtocolBreakpoint::ProtocolBreakpoint): Added. (Inspector::InspectorDebuggerAgent::ProtocolBreakpoint::createDebuggerBreakpoint const): Added. (Inspector::InspectorDebuggerAgent::ProtocolBreakpoint::matchesScriptURL const): Added. (Inspector::InspectorDebuggerAgent::debuggerBreakpointFromPayload): Added. (Inspector::InspectorDebuggerAgent::enable): (Inspector::InspectorDebuggerAgent::disable): (Inspector::InspectorDebuggerAgent::buildBreakpointPauseReason): (Inspector::InspectorDebuggerAgent::handleConsoleAssert): (Inspector::InspectorDebuggerAgent::didScheduleAsyncCall): (Inspector::buildDebuggerLocation): (Inspector::InspectorDebuggerAgent::setBreakpointByUrl): (Inspector::InspectorDebuggerAgent::setBreakpoint): (Inspector::InspectorDebuggerAgent::didSetBreakpoint): (Inspector::InspectorDebuggerAgent::resolveBreakpoint): (Inspector::InspectorDebuggerAgent::removeBreakpoint): (Inspector::InspectorDebuggerAgent::continueToLocation): (Inspector::InspectorDebuggerAgent::schedulePauseAtNextOpportunity): Added. (Inspector::InspectorDebuggerAgent::cancelPauseAtNextOpportunity): Added. (Inspector::InspectorDebuggerAgent::schedulePauseForSpecialBreakpoint): Added. (Inspector::InspectorDebuggerAgent::cancelPauseForSpecialBreakpoint): Added. (Inspector::InspectorDebuggerAgent::pause): (Inspector::InspectorDebuggerAgent::resume): (Inspector::InspectorDebuggerAgent::didBecomeIdle): (Inspector::InspectorDebuggerAgent::sourceMapURLForScript): (Inspector::InspectorDebuggerAgent::didParseSource): (Inspector::InspectorDebuggerAgent::willRunMicrotask): (Inspector::InspectorDebuggerAgent::didRunMicrotask): (Inspector::InspectorDebuggerAgent::didPause): (Inspector::InspectorDebuggerAgent::breakpointActionSound): (Inspector::InspectorDebuggerAgent::breakpointActionProbe): (Inspector::InspectorDebuggerAgent::clearInspectorBreakpointState): (Inspector::InspectorDebuggerAgent::clearDebuggerBreakpointState): (Inspector::matches): Deleted. (Inspector::buildObjectForBreakpointCookie): Deleted. (Inspector::InspectorDebuggerAgent::breakpointActionsFromProtocol): Deleted. (Inspector::InspectorDebuggerAgent::schedulePauseOnNextStatement): Deleted. (Inspector::InspectorDebuggerAgent::cancelPauseOnNextStatement): Deleted. Create a private `ProtocolBreakpoint` class that holds the data sent by the frontend. This is necessary because breakpoints in the frontend have a potentially one-to-many relationship with breakpoints in the backend, as the same script can be loaded many times on a page. Each of those scripts is independent, however, and can execute differently, meaning that the same breakpoint for each script also needs a different state (e.g. ignore count). As such, the `ProtocolBreakpoint` is effectively a template that is actualized whenever a new script is parsed that matches the URL of the `ProtocolBreakpoint` to create a `JSC::Breakpoint` that is used by the `JSC::Debugger`. `ProtocolBreakpoint` also parses breakpoint configurations. * inspector/InspectorEnvironment.h: * inspector/JSGlobalObjectScriptDebugServer.h: * inspector/JSGlobalObjectScriptDebugServer.cpp: (Inspector::JSGlobalObjectScriptDebugServer::JSGlobalObjectScriptDebugServer): (Inspector::JSGlobalObjectScriptDebugServer::attachDebugger): (Inspector::JSGlobalObjectScriptDebugServer::detachDebugger): (Inspector::JSGlobalObjectScriptDebugServer::runEventLoopWhilePaused): * inspector/agents/InspectorAuditAgent.h: * inspector/agents/InspectorAuditAgent.cpp: (Inspector::InspectorAuditAgent::run): * inspector/agents/InspectorRuntimeAgent.h: * inspector/agents/InspectorRuntimeAgent.cpp: (Inspector::setPauseOnExceptionsState): (Inspector::InspectorRuntimeAgent::evaluate): (Inspector::InspectorRuntimeAgent::callFunctionOn): (Inspector::InspectorRuntimeAgent::getPreview): (Inspector::InspectorRuntimeAgent::getProperties): (Inspector::InspectorRuntimeAgent::getDisplayableProperties): * inspector/agents/InspectorScriptProfilerAgent.cpp: * inspector/agents/JSGlobalObjectDebuggerAgent.h: Replace `Inspector::ScriptDebugServer` with `JSC::Debugger`. * runtime/JSMicrotask.cpp: (JSC::JSMicrotask::run): Drive-by: r248894 mistakenly omitted the call to notify the debugger that the microtask ran. * inspector/ScriptBreakpoint.h: Removed. * inspector/ScriptDebugListener.h: Removed. * inspector/ScriptDebugServer.h: Removed. * inspector/ScriptDebugServer.cpp: Removed. * CMakeLists.txt: * JavaScriptCore.xcodeproj/project.pbxproj: * Sources.txt: Source/WebCore: This allows developers to do things like: - only pause when `window.event.type` is a certain value - ignore the first N pauses - evaluate JavaScript whenever an event listener is invoked without pausing Tests: inspector/dom/breakpoint-for-event-listener.html inspector/dom-debugger/event-animation-frame-breakpoints.html inspector/dom-debugger/event-interval-breakpoints.html inspector/dom-debugger/event-listener-breakpoints.html inspector/dom-debugger/event-timeout-breakpoints.html * inspector/agents/InspectorDOMAgent.h: * inspector/agents/InspectorDOMAgent.cpp: (WebCore::InspectorDOMAgent::getEventListenersForNode): (WebCore::InspectorDOMAgent::setBreakpointForEventListener): (WebCore::InspectorDOMAgent::removeBreakpointForEventListener): (WebCore::InspectorDOMAgent::buildObjectForEventListener): (WebCore::InspectorDOMAgent::breakpointForEventListener): (WebCore::InspectorDOMAgent::hasBreakpointForEventListener): Deleted. * inspector/agents/InspectorDOMDebuggerAgent.h: * inspector/agents/InspectorDOMDebuggerAgent.cpp: (WebCore::InspectorDOMDebuggerAgent::disable): (WebCore::InspectorDOMDebuggerAgent::mainFrameNavigated): (WebCore::InspectorDOMDebuggerAgent::setEventBreakpoint): (WebCore::InspectorDOMDebuggerAgent::removeEventBreakpoint): (WebCore::InspectorDOMDebuggerAgent::willHandleEvent): (WebCore::InspectorDOMDebuggerAgent::didHandleEvent): (WebCore::InspectorDOMDebuggerAgent::willFireTimer): (WebCore::InspectorDOMDebuggerAgent::didFireTimer): * inspector/agents/page/PageDOMDebuggerAgent.h: * inspector/agents/page/PageDOMDebuggerAgent.cpp: (WebCore::PageDOMDebuggerAgent::disable): (WebCore::PageDOMDebuggerAgent::mainFrameNavigated): (WebCore::PageDOMDebuggerAgent::willFireAnimationFrame): (WebCore::PageDOMDebuggerAgent::didFireAnimationFrame): (WebCore::PageDOMDebuggerAgent::setAnimationFrameBreakpoint): * inspector/agents/worker/WorkerDOMDebuggerAgent.h: * inspector/agents/worker/WorkerDOMDebuggerAgent.cpp: (WebCore::WorkerDOMDebuggerAgent::setAnimationFrameBreakpoint): Keep a `JSC::Breakpoint` for each event breakpoint instead of a simple `bool`, allowing for configuration when the breakpoint is first set. When any of these breakpoints are hit, pass it to the `JSC::Debugger` as a "special breakpoint", which behaves the same as "pause ASAP" but also supports a condition, an ignore count, actions, and auto-continue. Reset the hit count for any of these "special breakpoints" that persist across Web Inspector sessions when the main frame navigates. * inspector/PageScriptDebugServer.h: * inspector/PageScriptDebugServer.cpp: (WebCore::PageScriptDebugServer::PageScriptDebugServer): (WebCore::PageScriptDebugServer::attachDebugger): (WebCore::PageScriptDebugServer::detachDebugger): (WebCore::PageScriptDebugServer::didPause): (WebCore::PageScriptDebugServer::didContinue): (WebCore::PageScriptDebugServer::runEventLoopWhilePaused): (WebCore::PageScriptDebugServer::runEventLoopWhilePausedInternal): (WebCore::PageScriptDebugServer::isContentScript const): (WebCore::PageScriptDebugServer::reportException const): * inspector/WorkerScriptDebugServer.h: * inspector/WorkerScriptDebugServer.cpp: (WebCore::WorkerScriptDebugServer::WorkerScriptDebugServer): (WebCore::WorkerScriptDebugServer::attachDebugger): (WebCore::WorkerScriptDebugServer::detachDebugger): (WebCore::WorkerScriptDebugServer::runEventLoopWhilePaused): (WebCore::WorkerScriptDebugServer::reportException const): * inspector/agents/page/PageDebuggerAgent.h: * inspector/agents/page/PageDebuggerAgent.cpp: (WebCore::PageDebuggerAgent::sourceMapURLForScript): Replace `Inspector::ScriptDebugServer` with `JSC::Debugger`. * inspector/TimelineRecordFactory.h: * inspector/TimelineRecordFactory.cpp: (WebCore::TimelineRecordFactory::createProbeSampleData): * inspector/agents/InspectorTimelineAgent.h: * inspector/agents/InspectorTimelineAgent.cpp: (WebCore::InspectorTimelineAgent::internalStart): (WebCore::InspectorTimelineAgent::internalStop): (WebCore::InspectorTimelineAgent::breakpointActionProbe): Replace `Inspector::ScriptBreakpoint` with `JSC::Breakpoint`. * inspector/InspectorInstrumentation.h: (WebCore::InspectorInstrumentation::didHandleEvent): (WebCore::InspectorInstrumentation::didFireTimer): * inspector/InspectorInstrumentation.cpp: (WebCore::InspectorInstrumentation::didHandleEventImpl): (WebCore::InspectorInstrumentation::didFireTimerImpl): (WebCore::InspectorInstrumentation::didCommitLoadImpl): (WebCore::InspectorInstrumentation::didFireAnimationFrameImpl): * dom/EventTarget.cpp: (WebCore::EventTarget::innerInvokeEventListeners): * page/DOMTimer.cpp: (WebCore::DOMTimer::fired): When notifying Web Inspector that activity did occur, include all information previously included when notifying Web Inspector that that activity was about to occur so that Web Inspector can know whether a pause for the "special breakpoint" for that activity is still scheduled and if so cancel it. Source/WebInspectorUI: This allows developers to do things like: - only pause when `window.event.type` is a certain value - ignore the first N pauses - evaluate JavaScript whenever an event listener is invoked without pausing * UserInterface/Models/Breakpoint.js: (WI.Breakpoint): (WI.Breakpoint.prototype.toJSON): (WI.Breakpoint.prototype.get special): Added. (WI.Breakpoint.prototype.get removable): Added. (WI.Breakpoint.prototype.get editable): Added. (WI.Breakpoint.prototype.set condition): (WI.Breakpoint.prototype.get ignoreCount): (WI.Breakpoint.prototype.set ignoreCount): (WI.Breakpoint.prototype.get autoContinue): (WI.Breakpoint.prototype.set autoContinue): (WI.Breakpoint.prototype.get actions): (WI.Breakpoint.prototype.get probeActions): (WI.Breakpoint.prototype.cycleToNextMode): (WI.Breakpoint.prototype.createAction): (WI.Breakpoint.prototype.recreateAction): (WI.Breakpoint.prototype.removeAction): (WI.Breakpoint.prototype.clearActions): (WI.Breakpoint.prototype.remove): Added. (WI.Breakpoint.prototype.optionsToProtocol): Added. (WI.Breakpoint.prototype.breakpointActionDidChange): (WI.Breakpoint.fromJSON): Deleted. (WI.Breakpoint.prototype.get sourceCodeLocation): Deleted. (WI.Breakpoint.prototype.get contentIdentifier): Deleted. (WI.Breakpoint.prototype.get scriptIdentifier): Deleted. (WI.Breakpoint.prototype.get target): Deleted. (WI.Breakpoint.prototype.get identifier): Deleted. (WI.Breakpoint.prototype.set identifier): Deleted. (WI.Breakpoint.prototype.get resolved): Deleted. (WI.Breakpoint.prototype.set resolved): Deleted. (WI.Breakpoint.prototype.saveIdentityToCookie): Deleted. (WI.Breakpoint.prototype._isSpecial): Deleted. (WI.Breakpoint.prototype._sourceCodeLocationLocationChanged): Deleted. (WI.Breakpoint.prototype._sourceCodeLocationDisplayLocationChanged): Deleted. * UserInterface/Models/DOMBreakpoint.js: (WI.DOMBreakpoint): (WI.DOMBreakpoint.fromJSON): Added. (WI.DOMBreakpoint.prototype.remove): Added. (WI.DOMBreakpoint.prototype.toJSON): (WI.DOMBreakpoint.deserialize): Deleted. (WI.DOMBreakpoint.prototype.get disabled): Deleted. (WI.DOMBreakpoint.prototype.set disabled): Deleted. * UserInterface/Models/EventBreakpoint.js: (WI.EventBreakpoint): (WI.EventBreakpoint.fromJSON): Added. (WI.EventBreakpoint.prototype.get special): Added. (WI.EventBreakpoint.prototype.get editable): Added. (WI.EventBreakpoint.prototype.remove): Added. (WI.EventBreakpoint.prototype.saveIdentityToCookie): (WI.EventBreakpoint.prototype.toJSON): (WI.EventBreakpoint.deserialize): Deleted. (WI.EventBreakpoint.prototype.get disabled): Deleted. (WI.EventBreakpoint.prototype.set disabled): Deleted. * UserInterface/Models/JavaScriptBreakpoint.js: Copied from UserInterface/Models/Breakpoint.js. (WI.JavaScriptBreakpoint): (WI.JavaScriptBreakpoint.fromJSON): (WI.JavaScriptBreakpoint.prototype.toJSON): (WI.JavaScriptBreakpoint.prototype.get sourceCodeLocation): (WI.JavaScriptBreakpoint.prototype.get contentIdentifier): (WI.JavaScriptBreakpoint.prototype.get scriptIdentifier): (WI.JavaScriptBreakpoint.prototype.get target): (WI.JavaScriptBreakpoint.prototype.get special): Added. (WI.JavaScriptBreakpoint.prototype.get removable): Added. (WI.JavaScriptBreakpoint.prototype.get editable): Added. (WI.JavaScriptBreakpoint.prototype.get identifier): (WI.JavaScriptBreakpoint.prototype.set identifier): (WI.JavaScriptBreakpoint.prototype.get resolved): (WI.JavaScriptBreakpoint.prototype.set resolved): (WI.JavaScriptBreakpoint.prototype.remove): Added. (WI.JavaScriptBreakpoint.prototype.saveIdentityToCookie): (WI.JavaScriptBreakpoint.prototype._isSpecial): (WI.JavaScriptBreakpoint.prototype._sourceCodeLocationLocationChanged): (WI.JavaScriptBreakpoint.prototype._sourceCodeLocationDisplayLocationChanged): * UserInterface/Models/URLBreakpoint.js: (WI.URLBreakpoint): (WI.URLBreakpoint.fromJSON): Added. (WI.URLBreakpoint.prototype.get special): Added. (WI.URLBreakpoint.prototype.remove): Added. (WI.URLBreakpoint.prototype.toJSON): (WI.URLBreakpoint.deserialize): Deleted. (WI.URLBreakpoint.prototype.get disabled): Deleted. (WI.URLBreakpoint.prototype.set disabled): Deleted. Rename `WI.Breakpoint` to `WI.JavaScriptBreakpoint` and use `WI.Breakpoint` as a new common base class for all breakpoint types, allowing more logic to be shared (e.g. disabled state). Additionally, breakpoints are now able to - determine whether or not they're - special - removable - editable (i.e. configurable) - remove themselves without the caller needing to know what manager to consult with. * UserInterface/Controllers/DOMManager.js: (WI.DOMManager): (WI.DOMManager.supportsEventListenerBreakpointConfiguration): Added. (WI.DOMManager.prototype.setBreakpointForEventListener): (WI.DOMManager.prototype.removeBreakpointForEventListener): (WI.DOMManager.prototype._setEventBreakpoint): Added. (WI.DOMManager.prototype._removeEventBreakpoint): Added. (WI.DOMManager.prototype._handleEventBreakpointEditablePropertyChanged): Added. (WI.DOMManager.prototype._handleEventBreakpointActionsChanged): Added. (WI.DOMManager.prototype._updateEventBreakpoint): Deleted. Keep track of configuration changes for specific listener breakpoints. * UserInterface/Controllers/DOMDebuggerManager.js: (WI.DOMDebuggerManager): (WI.DOMDebuggerManager.prototype.initializeTarget): (WI.DOMDebuggerManager.prototype.addDOMBreakpoint): (WI.DOMDebuggerManager.prototype.removeDOMBreakpoint): (WI.DOMDebuggerManager.prototype.addEventBreakpoint): (WI.DOMDebuggerManager.prototype.removeEventBreakpoint): (WI.DOMDebuggerManager.prototype.addURLBreakpoint): (WI.DOMDebuggerManager.prototype.removeURLBreakpoint): (WI.DOMDebuggerManager.prototype._commandArgumentsForEventBreakpoint): Added. (WI.DOMDebuggerManager.prototype._setEventBreakpoint): Added. (WI.DOMDebuggerManager.prototype._removeEventBreakpoint): Added. (WI.DOMDebuggerManager.prototype._handleEventBreakpointDisabledStateChanged): Added. (WI.DOMDebuggerManager.prototype._handleEventBreakpointEditablePropertyChanged): Added. (WI.DOMDebuggerManager.prototype._handleEventBreakpointActionsChanged): Added. (WI.DOMDebuggerManager.prototype.isBreakpointSpecial): Deleted. (WI.DOMDebuggerManager.prototype._updateEventBreakpoint): Deleted. Keep track of configuration changes for special event breakpoints. Store special event breakpoints inside `WI.objectStores.eventBreakpoints`. * UserInterface/Controllers/DebuggerManager.js: (WI.DebuggerManager): (WI.DebuggerManager.prototype.addBreakpoint): (WI.DebuggerManager.prototype.removeBreakpoint): (WI.DebuggerManager.prototype.addProbesForBreakpoint): Added. (WI.DebuggerManager.prototype.removeProbesForBreakpoint): Added. (WI.DebuggerManager.prototype.updateProbesForBreakpoint): Added. (WI.DebuggerManager.prototype._setBreakpoint): (WI.DebuggerManager.prototype._breakpointEditablePropertyDidChange): (WI.DebuggerManager.prototype._handleBreakpointActionsDidChange): (WI.DebuggerManager.prototype.isBreakpointRemovable): Deleted. (WI.DebuggerManager.prototype.isBreakpointSpecial): Deleted. (WI.DebuggerManager.prototype.isBreakpointEditable): Deleted. (WI.DebuggerManager.prototype._debuggerBreakpointActionType): Deleted. (WI.DebuggerManager.prototype._debuggerBreakpointOptions): Deleted. (WI.DebuggerManager.prototype._addProbesForBreakpoint): Deleted. (WI.DebuggerManager.prototype._removeProbesForBreakpoint): Deleted. (WI.DebuggerManager.prototype._updateProbesForBreakpoint): Deleted. Replace `WI.Breakpoint` with `WI.JavaScriptBreakpoint`. Probes now support `WI.EventBreakpoint` in addition to `WI.JavaScriptBreakpoint`. * UserInterface/Controllers/BreakpointPopoverController.js: (WI.BreakpointPopoverController.prototype.appendContextMenuItems): (WI.BreakpointPopoverController.prototype._createPopoverContent): Allow any breakpoint instead of only `WI.JavaScriptBreakpoint`. Drive-by: the existing `ignoreCount` value wasn't being used to populate the `<input>`. * UserInterface/Views/BreakpointTreeElement.js: (WI.BreakpointTreeElement.prototype.ondelete): (WI.BreakpointTreeElement.prototype.get listenerSet): Added. (WI.BreakpointTreeElement.prototype.updateStatus): Added. (WI.BreakpointTreeElement.prototype.updateTitles): Added. (WI.BreakpointTreeElement.prototype.get breakpoint): Deleted. (WI.BreakpointTreeElement.prototype.get filterableData): Deleted. (WI.BreakpointTreeElement.prototype._updateTitles): Deleted. (WI.BreakpointTreeElement.prototype._updateStatus): Deleted. (WI.BreakpointTreeElement.prototype._breakpointLocationDidChange): Deleted. * UserInterface/Views/BreakpointTreeElement.css: (.item.breakpoint .status > .status-image): (.item.breakpoint.paused .icon): Added. (@media (prefers-color-scheme: dark) .item.breakpoint.paused .icon): Added. (.item.breakpoint .status > .status-image.resolved): Deleted. (body:not(.window-inactive, .window-docked-inactive) .tree-outline:focus-within .item.breakpoint.selected .status > .status-image.resolved): Deleted. (.item.breakpoint .subtitle.formatted-location): Deleted. (.breakpoint-debugger-statement-icon .icon): Deleted. (.breakpoint-exception-icon .icon): Deleted. (.breakpoint-assertion-icon .icon): Deleted. (.breakpoint-microtask-icon .icon): Deleted. (.breakpoint-paused-icon .icon): Deleted. (.breakpoint-generic-line-icon .icon): Deleted. (.breakpoint-generic-line-icon .icon > span): Deleted. (.data-updated.breakpoint-generic-line-icon .icon > span): Deleted. (@media (prefers-color-scheme: dark) .breakpoint-debugger-statement-icon .icon): Deleted. (@media (prefers-color-scheme: dark) .breakpoint-exception-icon .icon): Deleted. (@media (prefers-color-scheme: dark) .breakpoint-assertion-icon .icon): Deleted. (@media (prefers-color-scheme: dark) .breakpoint-microtask-icon .icon): Deleted. (@media (prefers-color-scheme: dark) .breakpoint-paused-icon .icon): Deleted. (@media (prefers-color-scheme: dark) .breakpoint-generic-line-icon .icon): Deleted. * UserInterface/Views/DOMBreakpointTreeElement.js: (WI.DOMBreakpointTreeElement): (WI.DOMBreakpointTreeElement.prototype.onattach): Deleted. (WI.DOMBreakpointTreeElement.prototype.ondetach): Deleted. (WI.DOMBreakpointTreeElement.prototype.ondelete): Deleted. (WI.DOMBreakpointTreeElement.prototype.onenter): Deleted. (WI.DOMBreakpointTreeElement.prototype.onspace): Deleted. (WI.DOMBreakpointTreeElement.prototype.populateContextMenu): Deleted. (WI.DOMBreakpointTreeElement.prototype._statusImageElementClicked): Deleted. (WI.DOMBreakpointTreeElement.prototype._statusImageElementFocused): Deleted. (WI.DOMBreakpointTreeElement.prototype._statusImageElementMouseDown): Deleted. (WI.DOMBreakpointTreeElement.prototype._toggleBreakpoint): Deleted. (WI.DOMBreakpointTreeElement.prototype._updateStatus): Deleted. * UserInterface/Views/DOMBreakpointTreeElement.css: (.item.breakpoint.dom.subtree-modified:not(.paused) .icon): Added. (.item.breakpoint.dom.attribute-modified:not(.paused) .icon): Added. (.item.breakpoint.dom.node-removed:not(.paused) .icon): Added. (@media (prefers-color-scheme: dark) .item.breakpoint.dom.subtree-modified:not(.paused) .icon): Added. (@media (prefers-color-scheme: dark) .item.breakpoint.dom.attribute-modified:not(.paused) .icon): Added. (@media (prefers-color-scheme: dark) .item.breakpoint.dom.node-removed:not(.paused) .icon): Added. (.breakpoint.dom.breakpoint-for-subtree-modified:not(.breakpoint-paused-icon) .icon): Deleted. (.breakpoint.dom.breakpoint-for-attribute-modified:not(.breakpoint-paused-icon) .icon): Deleted. (.breakpoint.dom.breakpoint-for-node-removed:not(.breakpoint-paused-icon) .icon): Deleted. (@media (prefers-color-scheme: dark) .breakpoint.dom.breakpoint-for-subtree-modified:not(.breakpoint-paused-icon) .icon): Deleted. (@media (prefers-color-scheme: dark) .breakpoint.dom.breakpoint-for-attribute-modified:not(.breakpoint-paused-icon) .icon): Deleted. (@media (prefers-color-scheme: dark) .breakpoint.dom.breakpoint-for-node-removed:not(.breakpoint-paused-icon) .icon): Deleted. * UserInterface/Views/EventBreakpointTreeElement.js: (WI.EventBreakpointTreeElement): (WI.EventBreakpointTreeElement.prototype.onattach): Deleted. (WI.EventBreakpointTreeElement.prototype.ondetach): Deleted. (WI.EventBreakpointTreeElement.prototype.ondelete): Deleted. (WI.EventBreakpointTreeElement.prototype.onenter): Deleted. (WI.EventBreakpointTreeElement.prototype.onspace): Deleted. (WI.EventBreakpointTreeElement.prototype.populateContextMenu): Deleted. (WI.EventBreakpointTreeElement.prototype._statusImageElementClicked): Deleted. (WI.EventBreakpointTreeElement.prototype._statusImageElementFocused): Deleted. (WI.EventBreakpointTreeElement.prototype._statusImageElementMouseDown): Deleted. (WI.EventBreakpointTreeElement.prototype._toggleBreakpoint): Deleted. (WI.EventBreakpointTreeElement.prototype._updateStatus): Deleted. * UserInterface/Views/EventBreakpointTreeElement.css: (.item.breakpoint.event.animation-frame:not(.paused) .icon): Added. (.item.breakpoint.event.interval:not(.paused) .icon): Added. (.item.breakpoint.event.listener:not(.paused) .icon): Added. (.item.breakpoint.event.timeout:not(.paused) .icon): Added. (@media(prefers-color-scheme: dark) .item.breakpoint.event.animation-frame:not(.paused) .icon): Added. (@media(prefers-color-scheme: dark) .item.breakpoint.event.interval:not(.paused) .icon): Added. (@media(prefers-color-scheme: dark) .item.breakpoint.event.listener:not(.paused) .icon): Added. (@media(prefers-color-scheme: dark) .item.breakpoint.event.timeout:not(.paused) .icon): Added. (.breakpoint.event.breakpoint-for-animation-frame:not(.breakpoint-paused-icon) .icon): Deleted. (.breakpoint.event.breakpoint-for-interval:not(.breakpoint-paused-icon) .icon): Deleted. (.breakpoint.event.breakpoint-for-listener:not(.breakpoint-paused-icon) .icon): Deleted. (.breakpoint.event.breakpoint-for-timeout:not(.breakpoint-paused-icon) .icon): Deleted. (@media(prefers-color-scheme: dark) .breakpoint.event.breakpoint-for-animation-frame:not(.breakpoint-paused-icon) .icon): Deleted. (@media(prefers-color-scheme: dark) .breakpoint.event.breakpoint-for-interval:not(.breakpoint-paused-icon) .icon): Deleted. (@media(prefers-color-scheme: dark) .breakpoint.event.breakpoint-for-listener:not(.breakpoint-paused-icon) .icon): Deleted. (@media(prefers-color-scheme: dark) .breakpoint.event.breakpoint-for-timeout:not(.breakpoint-paused-icon) .icon): Deleted. * UserInterface/Views/JavaScriptBreakpointTreeElement.js: Copied from Source/WebInspectorUI/UserInterface/Views/BreakpointTreeElement.js. (WI.JavaScriptBreakpointTreeElement): (WI.JavaScriptBreakpointTreeElement.prototype.get filterableData): (WI.JavaScriptBreakpointTreeElement.prototype.updateStatus): Added. (WI.JavaScriptBreakpointTreeElement.prototype.updateTitles): Added. (WI.JavaScriptBreakpointTreeElement.prototype._breakpointLocationDidChange): * UserInterface/Views/JavaScriptBreakpointTreeElement.css: Copied from Source/WebInspectorUI/UserInterface/Views/BreakpointTreeElement.css. (.item.breakpoint.javascript .status > .status-image): Added. (.item.breakpoint.javascript .status > .status-image.resolved): Added. (body:not(.window-inactive, .window-docked-inactive) .tree-outline:focus-within .item.breakpoint.javascript.selected .status > .status-image.resolved): Added. (.item.breakpoint.javascript .subtitle.formatted-location): Added. (.item.breakpoint.javascript.line .icon): Added. (.item.breakpoint.javascript.line .icon > span): Added. (.data-updated.item.breakpoint.javascript.line .icon > span): Added. (.item.breakpoint.javascript.debugger-statement .icon): Added. (.item.breakpoint.javascript.exception .icon): Added. (.item.breakpoint.javascript.assertion .icon): Added. (.item.breakpoint.javascript.microtask .icon): Added. (@media (prefers-color-scheme: dark) .item.breakpoint.javascript.line .icon): Added. (@media (prefers-color-scheme: dark) .item.breakpoint.javascript.debugger-statement .icon): Added. (@media (prefers-color-scheme: dark) .item.breakpoint.javascript.exception .icon): Added. (@media (prefers-color-scheme: dark) .item.breakpoint.javascript.assertion .icon): Added. (@media (prefers-color-scheme: dark) .item.breakpoint.javascript.microtask .icon): Added. * UserInterface/Views/URLBreakpointTreeElement.js: (WI.URLBreakpointTreeElement): (WI.URLBreakpointTreeElement.prototype.onattach): Deleted. (WI.URLBreakpointTreeElement.prototype.ondetach): Deleted. (WI.URLBreakpointTreeElement.prototype.ondelete): Deleted. (WI.URLBreakpointTreeElement.prototype.onenter): Deleted. (WI.URLBreakpointTreeElement.prototype.onspace): Deleted. (WI.URLBreakpointTreeElement.prototype.populateContextMenu): Deleted. (WI.URLBreakpointTreeElement.prototype._statusImageElementClicked): Deleted. (WI.URLBreakpointTreeElement.prototype._statusImageElementFocused): Deleted. (WI.URLBreakpointTreeElement.prototype._statusImageElementMouseDown): Deleted. (WI.URLBreakpointTreeElement.prototype._toggleBreakpoint): Deleted. (WI.URLBreakpointTreeElement.prototype._updateStatus): Deleted. * UserInterface/Views/URLBreakpointTreeElement.css: (.item.breakpoint.url .subtitle): Added. (.item.breakpoint.url:not(.paused) .icon): Added. (@media (prefers-color-scheme: dark) .item.breakpoint.url:not(.paused) .icon): Added. (.breakpoint.url .subtitle): Deleted. (.breakpoint.url:not(.breakpoint-paused-icon) .icon): Deleted. (@media (prefers-color-scheme: dark) .breakpoint.url:not(.breakpoint-paused-icon) .icon): Deleted. Rename `WI.BreakpointTreeElement` to `WI.JavaScriptBreakpointTreeElement` and use `WI.BreakpointTreeElement` as a new common base class for all breakpoint tree elements, allowing more logic and styles to be shared (e.g. disabled state). * UserInterface/Views/SourcesNavigationSidebarPanel.js: (WI.SourcesNavigationSidebarPanel): (WI.SourcesNavigationSidebarPanel.prototype.closed): (WI.SourcesNavigationSidebarPanel.prototype._insertDebuggerTreeElement): (WI.SourcesNavigationSidebarPanel.prototype._compareJavaScriptBreakpointTreeElements): Added. (WI.SourcesNavigationSidebarPanel.prototype._addBreakpoint): (WI.SourcesNavigationSidebarPanel.prototype._removeAllBreakpoints): (WI.SourcesNavigationSidebarPanel.prototype._breakpointsBeneathTreeElement): (WI.SourcesNavigationSidebarPanel.prototype._addIssue): (WI.SourcesNavigationSidebarPanel.prototype._updatePauseReasonSection): (WI.SourcesNavigationSidebarPanel.prototype._handleTreeSelectionDidChange): (WI.SourcesNavigationSidebarPanel.prototype._handleBreakpointElementAddedOrRemoved): (WI.SourcesNavigationSidebarPanel.prototype._populateCreateBreakpointContextMenu.addToggleForSpecialEventBreakpoint): (WI.SourcesNavigationSidebarPanel.prototype._populateCreateBreakpointContextMenu): (WI.SourcesNavigationSidebarPanel.prototype._handleDebuggerObjectDisplayLocationDidChange): (WI.SourcesNavigationSidebarPanel.prototype._compareBreakpointTreeElements): Deleted. * UserInterface/Models/ProbeSet.js: (WI.ProbeSet): (WI.ProbeSet.prototype.createProbe): (WI.ProbeSet.prototype.willRemove): * UserInterface/Controllers/TimelineManager.js: (WI.TimelineManager.prototype._processRecord): * UserInterface/Views/ProbeSetDetailsSection.js: (WI.ProbeSetDetailsSection): * UserInterface/Views/ProbeDetailsSidebarPanel.js: (WI.ProbeDetailsSidebarPanel.prototype.inspect): * UserInterface/Views/SourceCodeTextEditor.js: (WI.SourceCodeTextEditor): (WI.SourceCodeTextEditor.prototype.close): (WI.SourceCodeTextEditor.prototype.textEditorBreakpointAdded): * UserInterface/Views/TextResourceContentView.js: (WI.TextResourceContentView.prototype.get supplementalRepresentedObjects): (WI.TextResourceContentView.prototype._probeSetsChanged): Probes now support `WI.EventBreakpoint` in addition to `WI.JavaScriptBreakpoint`. * UserInterface/Views/ContentView.js: (WI.ContentView.createFromRepresentedObject): (WI.ContentView.resolvedRepresentedObjectForRepresentedObject): (WI.ContentView.isViewable): * UserInterface/Views/ContextMenuUtilities.js: (WI.appendContextMenuItemsForSourceCode): Replace `WI.Breakpoint` with `WI.JavaScriptBreakpoint`. * UserInterface/Views/DOMTreeContentView.js: (WI.DOMTreeContentView): Replace `WI.DOMBreakpoint` with `WI.Breakpoint`. * UserInterface/Views/EventListenerSectionGroup.js: (WI.EventListenerSectionGroup): * UserInterface/Views/EventListenerSectionGroup.css: (.event-listener-section > .content input[type="checkbox"] + .go-to-arrow): Added. (.event-listener-section > .content input[type="checkbox"]:not(:checked) + .go-to-arrow): Added. Add a go-to arrow next to the Breakpoint checkbox that reveals the `WI.EventBreakpoint` in the Sources Tab. * UserInterface/Views/BreakpointActionView.js: (WI.BreakpointActionView.prototype._appendActionButtonClicked): Drive-by: minor code cleanup. * UserInterface/Views/CallFrameTreeElement.js: (WI.CallFrameTreeElement.prototype.populateContextMenu): Drive-by: include source code location context menu items. * UserInterface/Base/Setting.js: * UserInterface/Main.html: * UserInterface/Test.html: LayoutTests: * inspector/dom-debugger/resources/event-breakpoint-utilities.js: (TestPage.registerInitializer.InspectorTest.EventBreakpoint.addBreakpointOptionsTestCases): Added. (TestPage.registerInitializer.InspectorTest.EventBreakpoint.async teardown): (TestPage.registerInitializer.InspectorTest.EventBreakpoint.createBreakpoint): (TestPage.registerInitializer.InspectorTest.EventBreakpoint.removeBreakpoint): * inspector/dom/breakpoint-for-event-listener.html: * inspector/dom/breakpoint-for-event-listener-expected.txt: * inspector/dom-debugger/event-animation-frame-breakpoints.html: * inspector/dom-debugger/event-animation-frame-breakpoints-expected.txt: * inspector/dom-debugger/event-interval-breakpoints.html: * inspector/dom-debugger/event-interval-breakpoints-expected.txt: * inspector/dom-debugger/event-listener-breakpoints.html: * inspector/dom-debugger/event-listener-breakpoints-expected.txt: * inspector/dom-debugger/event-timeout-breakpoints.html: * inspector/dom-debugger/event-timeout-breakpoints-expected.txt: Add tests for new event breakpoint configuration options. * http/tests/inspector/debugger/debugger-test.js: (TestPage.registerInitializer.InspectorTest.startTracingBreakpoints): * http/tests/inspector/resources/probe-test.js: (TestPage.registerInitializer.ProtocolTest.Probe.installTracingListeners): * inspector/debugger/breakpoint-action-eval.html: * inspector/debugger/breakpoint-action-log.html: * inspector/debugger/breakpoint-columns.html: * inspector/debugger/breakpoint-scope.html: * inspector/debugger/debugger-stack-overflow.html: * inspector/debugger/pause-reason.html: * inspector/debugger/probe-manager-add-remove-actions.html: * inspector/debugger/stepping/stepping-through-autoContinue-breakpoint.html: * inspector/debugger/tail-deleted-frames-this-value.html: * inspector/debugger/tail-recursion.html: * inspector/worker/debugger-pause.html: * inspector/worker/debugger-shared-breakpoint.html: Update existing breakpoint tests to use new model objects. Canonical link: https://commits.webkit.org/228551@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@266074 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2020-08-24 17:34:12 +00:00
InspectorTest.EventBreakpoint.createBreakpoint(WI.EventBreakpoint.Type.Listener)
Web Inspector: DOM: add a special breakpoint for "All Events" https://bugs.webkit.org/show_bug.cgi?id=200285 Reviewed by Joseph Pecoraro. Source/JavaScriptCore: Similar to the existing "All Requests" breakpoint, there should be a way to set a breakpoint that would pause for any DOM event, regardless of the event's name. This is useful for situations where the event name isn't known, or where one simply wants to pause on the next entry to the event loop. Along these lines, make the "requestAnimationFrame", "setTimeout", and "setInterval" event breakpoints into special breakpoints that can be added/removed via the create breakpoint context menu. This simplifies the process for setting these breakpoints, and also makes them more discoverable (most people wouldn't consider them to be "events"). * inspector/protocol/Debugger.json: - Rename the `EventListener` pause reason to `Listener`. - Split the `Timer` pause reason into `Interval` and `Timeout`. * inspector/protocol/DOMDebugger.json: - Split the `timer` type into `interval` and `timeout`. - Make `eventName` optional for `addEventBreakpoint`/`removeEventBreakpoint`. When omitted, the corresponding breakpoint that is added/removed is treated as a global breakpoint that applies to all events of that type (e.g. a global `listener` breakpoint would pause for any event that is fired). Source/WebCore: Similar to the existing "All Requests" breakpoint, there should be a way to set a breakpoint that would pause for any DOM event, regardless of the event's name. This is useful for situations where the event name isn't known, or where one simply want's to pause on the next entry to the event loop. Along these lines, make the "requestAnimationFrame", "setTimeout", and "setInterval" event breakpoints into special breakpoints that can be added/removed via the create breakpoint context menu. This simplifies the process for setting these breakpoints, and also makes them more discoverable (most people wouldn't consider them to be "events"). Tests: inspector/dom/breakpoint-for-event-listener.html inspector/dom-debugger/event-animation-frame-breakpoints.html inspector/dom-debugger/event-breakpoint-with-navigation.html inspector/dom-debugger/event-interval-breakpoints.html inspector/dom-debugger/event-listener-breakpoints.html inspector/dom-debugger/event-timeout-breakpoints.html * inspector/agents/InspectorDOMDebuggerAgent.h: * inspector/agents/InspectorDOMDebuggerAgent.cpp: (WebCore::InspectorDOMDebuggerAgent::disable): (WebCore::InspectorDOMDebuggerAgent::frameDocumentUpdated): (WebCore::InspectorDOMDebuggerAgent::setEventBreakpoint): (WebCore::InspectorDOMDebuggerAgent::removeEventBreakpoint): (WebCore::InspectorDOMDebuggerAgent::willHandleEvent): (WebCore::InspectorDOMDebuggerAgent::willFireTimer): (WebCore::InspectorDOMDebuggerAgent::willFireAnimationFrame): (WebCore::InspectorDOMDebuggerAgent::discardBindings): Deleted. Make `eventName` optional for `addEventBreakpoint`/`removeEventBreakpoint`. When omitted, the corresponding breakpoint that is added/removed is treated as a global breakpoint that applies to all events of that type (e.g. a global `listener` breakpoint would pause for any event that is fired). Source/WebInspectorUI: Similar to the existing "All Requests" breakpoint, there should be a way to set a breakpoint that would pause for any DOM event, regardless of the event's name. This is useful for situations where the event name isn't known, or where one simply want's to pause on the next entry to the event loop. Along these lines, make the "requestAnimationFrame", "setTimeout", and "setInterval" event breakpoints into special breakpoints that can be added/removed via the create breakpoint context menu. This simplifies the process for setting these breakpoints, and also makes them more discoverable (most people wouldn't consider them to be "events"). * UserInterface/Models/EventBreakpoint.js: (WI.EventBreakpoint): (WI.EventBreakpoint.deserialize): (WI.EventBreakpoint.prototype.saveIdentityToCookie): (WI.EventBreakpoint.prototype.toJSON): * UserInterface/Controllers/DebuggerManager.js: (WI.DebuggerManager.prototype._pauseReasonFromPayload): * UserInterface/Controllers/DOMDebuggerManager.js: (WI.DOMDebuggerManager): (WI.DOMDebuggerManager.prototype.initializeTarget): (WI.DOMDebuggerManager.supportsDOMBreakpoints): Added. (WI.DOMDebuggerManager.supportsEventBreakpoints): (WI.DOMDebuggerManager.supportsEventListenerBreakpoints): Added. (WI.DOMDebuggerManager.supportsURLBreakpoints): (WI.DOMDebuggerManager.supportsXHRBreakpoints): Added. (WI.DOMDebuggerManager.supportsAllListenersBreakpoint): Added. (WI.DOMDebuggerManager.prototype.get allAnimationFramesBreakpoint): Added. (WI.DOMDebuggerManager.prototype.get allIntervalsBreakpoint): Added. (WI.DOMDebuggerManager.prototype.get allListenersBreakpoint): Added. (WI.DOMDebuggerManager.prototype.get allTimeoutsBreakpoint): Added. (WI.DOMDebuggerManager.prototype.get listenerBreakpoints): Added. (WI.DOMDebuggerManager.prototype.isBreakpointSpecial): (WI.DOMDebuggerManager.prototype.listenerBreakpointForEventName): Added. (WI.DOMDebuggerManager.prototype.addEventBreakpoint): (WI.DOMDebuggerManager.prototype.removeEventBreakpoint): (WI.DOMDebuggerManager.prototype.addURLBreakpoint): (WI.DOMDebuggerManager.prototype._resolveDOMBreakpoint): (WI.DOMDebuggerManager.prototype._updateDOMBreakpoint): (WI.DOMDebuggerManager.prototype._updateEventBreakpoint): (WI.DOMDebuggerManager.prototype._updateURLBreakpoint): (WI.DOMDebuggerManager.prototype._handleDOMBreakpointDisabledStateChanged): (WI.DOMDebuggerManager.prototype._handleEventBreakpointDisabledStateChanged): (WI.DOMDebuggerManager.prototype._handleURLBreakpointDisabledStateChanged): (WI.DOMDebuggerManager.prototype.get eventBreakpoints): Deleted. (WI.DOMDebuggerManager.prototype.eventBreakpointForTypeAndEventName): Deleted. Add additional target compatibility checks. * UserInterface/Views/EventBreakpointPopover.js: (WI.EventBreakpointPopover.prototype.show): (WI.EventBreakpointPopover.prototype.dismiss): (WI.EventBreakpointPopover.prototype._handleTypeSelectChange): Deleted. * UserInterface/Views/EventBreakpointPopover.css: (.popover .event-breakpoint-content > input): Added. (.popover .event-breakpoint-content > input::placeholder): Added. (.popover .event-breakpoint-content > .event-type): Deleted. (.popover .event-breakpoint-content > .event-type > input): Deleted. (.popover .event-breakpoint-content > .event-type > input::placeholder): Deleted. * UserInterface/Views/EventBreakpointTreeElement.css: (.breakpoint.event.breakpoint-for-interval:not(.breakpoint-paused-icon) .icon): Added. (.breakpoint.event.breakpoint-for-timeout:not(.breakpoint-paused-icon) .icon): Added. (.breakpoint.event.breakpoint-for-timer:not(.breakpoint-paused-icon) .icon): Deleted. * UserInterface/Views/DebuggerSidebarPanel.js: (WI.DebuggerSidebarPanel): (WI.DebuggerSidebarPanel.prototype.saveStateToCookie): (WI.DebuggerSidebarPanel.prototype.restoreStateFromCookie): (WI.DebuggerSidebarPanel.prototype._addBreakpoint): (WI.DebuggerSidebarPanel.prototype._addTreeElement): (WI.DebuggerSidebarPanel.prototype._updatePauseReasonSection): (WI.DebuggerSidebarPanel.prototype._handleBreakpointElementAddedOrRemoved): (WI.DebuggerSidebarPanel.prototype._populateCreateBreakpointContextMenu.addToggleForSpecialEventBreakpoint): Added. (WI.DebuggerSidebarPanel.prototype._populateCreateBreakpointContextMenu): * UserInterface/Views/SourcesNavigationSidebarPanel.js: (WI.SourcesNavigationSidebarPanel): (WI.SourcesNavigationSidebarPanel.prototype._insertDebuggerTreeElement): (WI.SourcesNavigationSidebarPanel.prototype._addBreakpoint): (WI.SourcesNavigationSidebarPanel.prototype._updatePauseReasonSection): (WI.SourcesNavigationSidebarPanel.prototype._handleBreakpointElementAddedOrRemoved): (WI.SourcesNavigationSidebarPanel.prototype._populateCreateBreakpointContextMenu.addToggleForSpecialEventBreakpoint): Added. (WI.SourcesNavigationSidebarPanel.prototype._populateCreateBreakpointContextMenu): Add create breakpoint context menu items (also sort the breakpoints in this order): - "All Animation Frames" => [A] All Animation Frames - "All Timeouts" => [T] All Timeouts - "All Intervals" => [I] All Intervals - "All Events" => [E] All Events * UserInterface/Controllers/JavaScriptRuntimeCompletionProvider.js: (WI.JavaScriptRuntimeCompletionProvider.completionControllerCompletionsNeeded.receivedPropertyNames): * UserInterface/Base/Setting.js: * UserInterface/Images/EventBreakpointInterval.svg: Added. * UserInterface/Images/EventBreakpointTimeout.svg: Renamed from Source/WebInspectorUI/UserInterface/Images/EventBreakpointTimer.svg. * Localizations/en.lproj/localizedStrings.js: LayoutTests: * inspector/dom/breakpoint-for-event-listener.html: * inspector/dom/breakpoint-for-event-listener-expected.txt: * inspector/dom-debugger/event-animation-frame-breakpoints.html: * inspector/dom-debugger/event-animation-frame-breakpoints-expected.txt: * inspector/dom-debugger/event-breakpoint-with-navigation.html: * inspector/dom-debugger/event-breakpoint-with-navigation-expected.txt: * inspector/dom-debugger/event-interval-breakpoints.html: Added. * inspector/dom-debugger/event-interval-breakpoints-expected.txt: Added. * inspector/dom-debugger/event-listener-breakpoints.html: * inspector/dom-debugger/event-listener-breakpoints-expected.txt: * inspector/dom-debugger/event-timeout-breakpoints.html: Added. * inspector/dom-debugger/event-timeout-breakpoints-expected.txt: Added. * inspector/dom-debugger/resources/event-breakpoint-utilities.js: (TestPage.registerInitializer.InspectorTest.EventBreakpoint.teardown): (TestPage.registerInitializer.InspectorTest.EventBreakpoint.failOnPause): (TestPage.registerInitializer.InspectorTest.EventBreakpoint.createBreakpoint): Added. (TestPage.registerInitializer.InspectorTest.EventBreakpoint.addBreakpoint): (TestPage.registerInitializer.InspectorTest.EventBreakpoint.removeBreakpoint): (TestPage.registerInitializer.InspectorTest.EventBreakpoint.disableBreakpoint): * inspector/dom-debugger/event-timer-breakpoints.html: Removed. * inspector/dom-debugger/event-timer-breakpoints-expected.txt: Removed. Canonical link: https://commits.webkit.org/214196@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@248201 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2019-08-03 19:00:01 +00:00
.then(() => {
InspectorTest.log("Firing \"click\" on body...");
return InspectorTest.evaluateInPage(`trigger_click()`);
})
.then(() => {
InspectorTest.log("Firing \"custom\" on body...");
return InspectorTest.evaluateInPage(`trigger_custom()`);
})
.then(() => {
InspectorTest.expectEqual(pauseCount, 2, "Should have paused twice.");
InspectorTest.assert(!WI.debuggerManager.paused, "Should not be paused.");
WI.debuggerManager.removeEventListener(WI.DebuggerManager.Event.Paused, listener);
})
.then(resolve, reject);
},
teardown: InspectorTest.EventBreakpoint.teardown,
});
Web Inspector: support breakpoints for timers and animation-frame events https://bugs.webkit.org/show_bug.cgi?id=188778 Reviewed by Brian Burg. Source/JavaScriptCore: * inspector/protocol/Debugger.json: Add `AnimationFrame` and `Timer` types to the list of pause reasons. * inspector/protocol/DOMDebugger.json: Introduced `setEventBreakpoint` and `removeEventBreakpoint` to replace the more specific: - `setEventListenerBreakpoint` - `removeEventListenerBreakpoint` - `setInstrumentationBreakpoint` - `removeInstrumentationBreakpoint` Also created an `EventBreakpointType` to enumerate the available types of event breakpoints. * inspector/scripts/codegen/generate_cpp_protocol_types_header.py: (CppProtocolTypesHeaderGenerator.generate_output): (CppProtocolTypesHeaderGenerator._generate_forward_declarations_for_binding_traits): (CppProtocolTypesHeaderGenerator._generate_declarations_for_enum_conversion_methods): (CppProtocolTypesHeaderGenerator._generate_hash_declarations): Added. Generate `DefaultHash` for all `enum class` used by inspector protocols. * inspector/scripts/tests/generic/expected/commands-with-async-attribute.json-result: * inspector/scripts/tests/generic/expected/commands-with-optional-call-return-parameters.json-result: * inspector/scripts/tests/generic/expected/enum-values.json-result: * inspector/scripts/tests/generic/expected/type-declaration-array-type.json-result: * inspector/scripts/tests/generic/expected/type-declaration-enum-type.json-result: * inspector/scripts/tests/generic/expected/type-declaration-object-type.json-result: * inspector/scripts/tests/generic/expected/type-requiring-runtime-casts.json-result: Source/WebCore: The original implementation of "instrumentation" breakpoints relied upon the frontend sending somewhat arbitrary strings when enabling breakpoints for specific events. As an example, setting a breakpoint for `requestAnimationFrame` expects `"animationFrameFired"` as the string, which doesn't make much sense. This patch removes the usage of these strings and instead expects the agent to implement a method that matches what is happening. Tests: inspector/dom-debugger/event-animation-frame-breakpoints.html inspector/dom-debugger/event-listener-breakpoints.html inspector/dom-debugger/event-timer-breakpoints.html * inspector/InspectorInstrumentation.h: (WebCore::InspectorInstrumentation::willFireTimer): * inspector/InspectorInstrumentation.cpp: (WebCore::InspectorInstrumentation::didInstallTimerImpl): (WebCore::InspectorInstrumentation::didRemoveTimerImpl): (WebCore::InspectorInstrumentation::willFireTimerImpl): (WebCore::InspectorInstrumentation::didRequestAnimationFrameImpl): (WebCore::InspectorInstrumentation::didCancelAnimationFrameImpl): (WebCore::InspectorInstrumentation::willFireAnimationFrameImpl): (WebCore::InspectorInstrumentation::pauseOnNativeEventIfNeeded): Deleted. * inspector/agents/InspectorDOMDebuggerAgent.h: * inspector/agents/InspectorDOMDebuggerAgent.cpp: (WebCore::InspectorDOMDebuggerAgent::setEventBreakpoint): Added. (WebCore::InspectorDOMDebuggerAgent::removeEventBreakpoint): Added. (WebCore::InspectorDOMDebuggerAgent::willHandleEvent): (WebCore::InspectorDOMDebuggerAgent::willFireTimer): Added. (WebCore::InspectorDOMDebuggerAgent::willFireAnimationFrame): Added. (WebCore::InspectorDOMDebuggerAgent::setEventListenerBreakpoint): Deleted. (WebCore::InspectorDOMDebuggerAgent::setInstrumentationBreakpoint): Deleted. (WebCore::InspectorDOMDebuggerAgent::setBreakpoint): Deleted. (WebCore::InspectorDOMDebuggerAgent::removeEventListenerBreakpoint): Deleted. (WebCore::InspectorDOMDebuggerAgent::removeInstrumentationBreakpoint): Deleted. (WebCore::InspectorDOMDebuggerAgent::removeBreakpoint): Deleted. (WebCore::InspectorDOMDebuggerAgent::pauseOnNativeEventIfNeeded): Deleted. Unify the event listener and instrumentation breakpoint commands into a single method, `setEventBreakpoint`, that takes in both an `EventBreakpointType` and `eventName`. * page/DOMTimer.cpp: (WebCore::DOMTimer::fired): Source/WebInspectorUI: Add a `type` to `WI.EventBreakpoint` that matches `DOMDebugger.EventBreakpointType`: - `AnimationFrame` for `requestAnimationFrame` - `Listener` for any named DOM Event - `Timer` for `setTimeout` and `setInterval` Modified `WI.EventBreakpointPopover` to provide ways for selecting these other types, which is then passed to `WI.DOMDebuggerManager`, which now calls through to the newly added `DOMDebugger.removeEventBreakpoint` and `DOMDebugger.setEventBreakpoint` that sets breakpoints for all event types. * Localizations/en.lproj/localizedStrings.js: * UserInterface/Images/EventBreakpointAnimationFrame.svg: Added. * UserInterface/Images/EventBreakpointListener.svg: Renamed from Source/WebInspectorUI/UserInterface/Images/EventBreakpoint.svg. * UserInterface/Images/EventBreakpointTimer.svg: Added. * UserInterface/Controllers/DOMDebuggerManager.js: (WI.DOMDebuggerManager.supportsEventBreakpoints): Added. (WI.DOMDebuggerManager.prototype.eventBreakpointForTypeAndEventName): Added. (WI.DOMDebuggerManager.prototype.addEventBreakpoint): (WI.DOMDebuggerManager.prototype.removeEventBreakpoint.breakpointRemoved): Added. (WI.DOMDebuggerManager.prototype.removeEventBreakpoint): (WI.DOMDebuggerManager.prototype._updateEventBreakpoint): (WI.DOMDebuggerManager.prototype.eventBreakpointForEventName): Deleted. * UserInterface/Controllers/DOMTreeManager.js: (WI.DOMTreeManager.prototype.setBreakpointForEventListener): * UserInterface/Controllers/DebuggerManager.js: (WI.DebuggerManager.prototype._pauseReasonFromPayload): * UserInterface/Models/EventBreakpoint.js: (WI.EventBreakpoint): (WI.EventBreakpoint.fromPayload): (WI.EventBreakpoint.prototype.get type): Added. (WI.EventBreakpoint.prototype.get serializableInfo): (WI.EventBreakpoint.prototype.saveIdentityToCookie): * UserInterface/Views/DebuggerSidebarPanel.js: (WI.DebuggerSidebarPanel.prototype._updatePauseReasonSection): (WI.DebuggerSidebarPanel.prototype.willDismissPopover): * UserInterface/Views/EventBreakpointPopover.js: (WI.EventBreakpointPopover): (WI.EventBreakpointPopover.prototype.get breakpoint): Added. (WI.EventBreakpointPopover.prototype.show): (WI.EventBreakpointPopover.prototype.show.createOption): Added. (WI.EventBreakpointPopover.prototype.dismiss): Added. (WI.EventBreakpointPopover.prototype._presentOverTargetElement): (WI.EventBreakpointPopover.prototype._handleTypeSelectChange): Added. (WI.EventBreakpointPopover.prototype.get result): Deleted. (WI.EventBreakpointPopover.prototype.get value): Deleted. * UserInterface/Views/EventBreakpointPopover.css: (.popover .event-breakpoint-content > .event-type): Added. (.popover .event-breakpoint-content > input): Deleted. * UserInterface/Views/EventBreakpointTreeElement.js: (WI.EventBreakpointTreeElement): * UserInterface/Views/EventBreakpointTreeElement.css: (.breakpoint.event.animation-frame:not(.breakpoint-paused-icon) .icon): Added. (.breakpoint.event.listener:not(.breakpoint-paused-icon) .icon): Added. (.breakpoint.event.timer:not(.breakpoint-paused-icon) .icon): Added. (.breakpoint.event:not(.breakpoint-paused-icon) .icon): Deleted. LayoutTests: * inspector/dom-debugger/event-animation-frame-breakpoints-expected.txt: Added. * inspector/dom-debugger/event-animation-frame-breakpoints.html: Added. * inspector/dom-debugger/event-breakpoint-with-navigation.html: * inspector/dom-debugger/event-timer-breakpoints-expected.txt: Added. * inspector/dom-debugger/event-timer-breakpoints.html: Added. * inspector/dom-debugger/event-listener-breakpoints-expected.txt: Renamed from LayoutTests/inspector/dom-debugger/event-breakpoints-expected.txt. * inspector/dom-debugger/event-listener-breakpoints.html: Renamed from LayoutTests/inspector/dom-debugger/event-breakpoints.html. * inspector/dom-debugger/resources/event-breakpoint-utilities.js: Added. (TestPage.registerInitializer.window.teardown): (TestPage.registerInitializer.window.failOnPause): (TestPage.registerInitializer.window.addBreakpoint): (TestPage.registerInitializer.window.removeBreakpoint): (TestPage.registerInitializer.window.disableBreakpoint): (TestPage.registerInitializer.window.awaitEvent): Canonical link: https://commits.webkit.org/203952@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@235248 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2018-08-23 21:36:40 +00:00
suite.addTestCase({
name: `DOMDebugger.Event.Listener.AddMultipleBreakpoints`,
description: "Check that a single breakpoint pauses for every event of that type.",
test(resolve, reject) {
let pauseCount = 0;
let listener = WI.debuggerManager.addEventListener(WI.DebuggerManager.Event.Paused, (event) => {
++pauseCount;
InspectorTest.pass("Should pause before event handler is run.");
logActiveStackTrace();
WI.debuggerManager.resume()
.catch(reject);
});
Web Inspector: support breakpoints for timers and animation-frame events https://bugs.webkit.org/show_bug.cgi?id=188778 Reviewed by Brian Burg. Source/JavaScriptCore: * inspector/protocol/Debugger.json: Add `AnimationFrame` and `Timer` types to the list of pause reasons. * inspector/protocol/DOMDebugger.json: Introduced `setEventBreakpoint` and `removeEventBreakpoint` to replace the more specific: - `setEventListenerBreakpoint` - `removeEventListenerBreakpoint` - `setInstrumentationBreakpoint` - `removeInstrumentationBreakpoint` Also created an `EventBreakpointType` to enumerate the available types of event breakpoints. * inspector/scripts/codegen/generate_cpp_protocol_types_header.py: (CppProtocolTypesHeaderGenerator.generate_output): (CppProtocolTypesHeaderGenerator._generate_forward_declarations_for_binding_traits): (CppProtocolTypesHeaderGenerator._generate_declarations_for_enum_conversion_methods): (CppProtocolTypesHeaderGenerator._generate_hash_declarations): Added. Generate `DefaultHash` for all `enum class` used by inspector protocols. * inspector/scripts/tests/generic/expected/commands-with-async-attribute.json-result: * inspector/scripts/tests/generic/expected/commands-with-optional-call-return-parameters.json-result: * inspector/scripts/tests/generic/expected/enum-values.json-result: * inspector/scripts/tests/generic/expected/type-declaration-array-type.json-result: * inspector/scripts/tests/generic/expected/type-declaration-enum-type.json-result: * inspector/scripts/tests/generic/expected/type-declaration-object-type.json-result: * inspector/scripts/tests/generic/expected/type-requiring-runtime-casts.json-result: Source/WebCore: The original implementation of "instrumentation" breakpoints relied upon the frontend sending somewhat arbitrary strings when enabling breakpoints for specific events. As an example, setting a breakpoint for `requestAnimationFrame` expects `"animationFrameFired"` as the string, which doesn't make much sense. This patch removes the usage of these strings and instead expects the agent to implement a method that matches what is happening. Tests: inspector/dom-debugger/event-animation-frame-breakpoints.html inspector/dom-debugger/event-listener-breakpoints.html inspector/dom-debugger/event-timer-breakpoints.html * inspector/InspectorInstrumentation.h: (WebCore::InspectorInstrumentation::willFireTimer): * inspector/InspectorInstrumentation.cpp: (WebCore::InspectorInstrumentation::didInstallTimerImpl): (WebCore::InspectorInstrumentation::didRemoveTimerImpl): (WebCore::InspectorInstrumentation::willFireTimerImpl): (WebCore::InspectorInstrumentation::didRequestAnimationFrameImpl): (WebCore::InspectorInstrumentation::didCancelAnimationFrameImpl): (WebCore::InspectorInstrumentation::willFireAnimationFrameImpl): (WebCore::InspectorInstrumentation::pauseOnNativeEventIfNeeded): Deleted. * inspector/agents/InspectorDOMDebuggerAgent.h: * inspector/agents/InspectorDOMDebuggerAgent.cpp: (WebCore::InspectorDOMDebuggerAgent::setEventBreakpoint): Added. (WebCore::InspectorDOMDebuggerAgent::removeEventBreakpoint): Added. (WebCore::InspectorDOMDebuggerAgent::willHandleEvent): (WebCore::InspectorDOMDebuggerAgent::willFireTimer): Added. (WebCore::InspectorDOMDebuggerAgent::willFireAnimationFrame): Added. (WebCore::InspectorDOMDebuggerAgent::setEventListenerBreakpoint): Deleted. (WebCore::InspectorDOMDebuggerAgent::setInstrumentationBreakpoint): Deleted. (WebCore::InspectorDOMDebuggerAgent::setBreakpoint): Deleted. (WebCore::InspectorDOMDebuggerAgent::removeEventListenerBreakpoint): Deleted. (WebCore::InspectorDOMDebuggerAgent::removeInstrumentationBreakpoint): Deleted. (WebCore::InspectorDOMDebuggerAgent::removeBreakpoint): Deleted. (WebCore::InspectorDOMDebuggerAgent::pauseOnNativeEventIfNeeded): Deleted. Unify the event listener and instrumentation breakpoint commands into a single method, `setEventBreakpoint`, that takes in both an `EventBreakpointType` and `eventName`. * page/DOMTimer.cpp: (WebCore::DOMTimer::fired): Source/WebInspectorUI: Add a `type` to `WI.EventBreakpoint` that matches `DOMDebugger.EventBreakpointType`: - `AnimationFrame` for `requestAnimationFrame` - `Listener` for any named DOM Event - `Timer` for `setTimeout` and `setInterval` Modified `WI.EventBreakpointPopover` to provide ways for selecting these other types, which is then passed to `WI.DOMDebuggerManager`, which now calls through to the newly added `DOMDebugger.removeEventBreakpoint` and `DOMDebugger.setEventBreakpoint` that sets breakpoints for all event types. * Localizations/en.lproj/localizedStrings.js: * UserInterface/Images/EventBreakpointAnimationFrame.svg: Added. * UserInterface/Images/EventBreakpointListener.svg: Renamed from Source/WebInspectorUI/UserInterface/Images/EventBreakpoint.svg. * UserInterface/Images/EventBreakpointTimer.svg: Added. * UserInterface/Controllers/DOMDebuggerManager.js: (WI.DOMDebuggerManager.supportsEventBreakpoints): Added. (WI.DOMDebuggerManager.prototype.eventBreakpointForTypeAndEventName): Added. (WI.DOMDebuggerManager.prototype.addEventBreakpoint): (WI.DOMDebuggerManager.prototype.removeEventBreakpoint.breakpointRemoved): Added. (WI.DOMDebuggerManager.prototype.removeEventBreakpoint): (WI.DOMDebuggerManager.prototype._updateEventBreakpoint): (WI.DOMDebuggerManager.prototype.eventBreakpointForEventName): Deleted. * UserInterface/Controllers/DOMTreeManager.js: (WI.DOMTreeManager.prototype.setBreakpointForEventListener): * UserInterface/Controllers/DebuggerManager.js: (WI.DebuggerManager.prototype._pauseReasonFromPayload): * UserInterface/Models/EventBreakpoint.js: (WI.EventBreakpoint): (WI.EventBreakpoint.fromPayload): (WI.EventBreakpoint.prototype.get type): Added. (WI.EventBreakpoint.prototype.get serializableInfo): (WI.EventBreakpoint.prototype.saveIdentityToCookie): * UserInterface/Views/DebuggerSidebarPanel.js: (WI.DebuggerSidebarPanel.prototype._updatePauseReasonSection): (WI.DebuggerSidebarPanel.prototype.willDismissPopover): * UserInterface/Views/EventBreakpointPopover.js: (WI.EventBreakpointPopover): (WI.EventBreakpointPopover.prototype.get breakpoint): Added. (WI.EventBreakpointPopover.prototype.show): (WI.EventBreakpointPopover.prototype.show.createOption): Added. (WI.EventBreakpointPopover.prototype.dismiss): Added. (WI.EventBreakpointPopover.prototype._presentOverTargetElement): (WI.EventBreakpointPopover.prototype._handleTypeSelectChange): Added. (WI.EventBreakpointPopover.prototype.get result): Deleted. (WI.EventBreakpointPopover.prototype.get value): Deleted. * UserInterface/Views/EventBreakpointPopover.css: (.popover .event-breakpoint-content > .event-type): Added. (.popover .event-breakpoint-content > input): Deleted. * UserInterface/Views/EventBreakpointTreeElement.js: (WI.EventBreakpointTreeElement): * UserInterface/Views/EventBreakpointTreeElement.css: (.breakpoint.event.animation-frame:not(.breakpoint-paused-icon) .icon): Added. (.breakpoint.event.listener:not(.breakpoint-paused-icon) .icon): Added. (.breakpoint.event.timer:not(.breakpoint-paused-icon) .icon): Added. (.breakpoint.event:not(.breakpoint-paused-icon) .icon): Deleted. LayoutTests: * inspector/dom-debugger/event-animation-frame-breakpoints-expected.txt: Added. * inspector/dom-debugger/event-animation-frame-breakpoints.html: Added. * inspector/dom-debugger/event-breakpoint-with-navigation.html: * inspector/dom-debugger/event-timer-breakpoints-expected.txt: Added. * inspector/dom-debugger/event-timer-breakpoints.html: Added. * inspector/dom-debugger/event-listener-breakpoints-expected.txt: Renamed from LayoutTests/inspector/dom-debugger/event-breakpoints-expected.txt. * inspector/dom-debugger/event-listener-breakpoints.html: Renamed from LayoutTests/inspector/dom-debugger/event-breakpoints.html. * inspector/dom-debugger/resources/event-breakpoint-utilities.js: Added. (TestPage.registerInitializer.window.teardown): (TestPage.registerInitializer.window.failOnPause): (TestPage.registerInitializer.window.addBreakpoint): (TestPage.registerInitializer.window.removeBreakpoint): (TestPage.registerInitializer.window.disableBreakpoint): (TestPage.registerInitializer.window.awaitEvent): Canonical link: https://commits.webkit.org/203952@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@235248 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2018-08-23 21:36:40 +00:00
InspectorTest.singleFireEventListener(`TestPage-click`, (event) => {
InspectorTest.expectEqual(pauseCount, 2, "Should have paused twice.");
InspectorTest.assert(!WI.debuggerManager.paused, "Should not be paused.");
Web Inspector: support breakpoints for timers and animation-frame events https://bugs.webkit.org/show_bug.cgi?id=188778 Reviewed by Brian Burg. Source/JavaScriptCore: * inspector/protocol/Debugger.json: Add `AnimationFrame` and `Timer` types to the list of pause reasons. * inspector/protocol/DOMDebugger.json: Introduced `setEventBreakpoint` and `removeEventBreakpoint` to replace the more specific: - `setEventListenerBreakpoint` - `removeEventListenerBreakpoint` - `setInstrumentationBreakpoint` - `removeInstrumentationBreakpoint` Also created an `EventBreakpointType` to enumerate the available types of event breakpoints. * inspector/scripts/codegen/generate_cpp_protocol_types_header.py: (CppProtocolTypesHeaderGenerator.generate_output): (CppProtocolTypesHeaderGenerator._generate_forward_declarations_for_binding_traits): (CppProtocolTypesHeaderGenerator._generate_declarations_for_enum_conversion_methods): (CppProtocolTypesHeaderGenerator._generate_hash_declarations): Added. Generate `DefaultHash` for all `enum class` used by inspector protocols. * inspector/scripts/tests/generic/expected/commands-with-async-attribute.json-result: * inspector/scripts/tests/generic/expected/commands-with-optional-call-return-parameters.json-result: * inspector/scripts/tests/generic/expected/enum-values.json-result: * inspector/scripts/tests/generic/expected/type-declaration-array-type.json-result: * inspector/scripts/tests/generic/expected/type-declaration-enum-type.json-result: * inspector/scripts/tests/generic/expected/type-declaration-object-type.json-result: * inspector/scripts/tests/generic/expected/type-requiring-runtime-casts.json-result: Source/WebCore: The original implementation of "instrumentation" breakpoints relied upon the frontend sending somewhat arbitrary strings when enabling breakpoints for specific events. As an example, setting a breakpoint for `requestAnimationFrame` expects `"animationFrameFired"` as the string, which doesn't make much sense. This patch removes the usage of these strings and instead expects the agent to implement a method that matches what is happening. Tests: inspector/dom-debugger/event-animation-frame-breakpoints.html inspector/dom-debugger/event-listener-breakpoints.html inspector/dom-debugger/event-timer-breakpoints.html * inspector/InspectorInstrumentation.h: (WebCore::InspectorInstrumentation::willFireTimer): * inspector/InspectorInstrumentation.cpp: (WebCore::InspectorInstrumentation::didInstallTimerImpl): (WebCore::InspectorInstrumentation::didRemoveTimerImpl): (WebCore::InspectorInstrumentation::willFireTimerImpl): (WebCore::InspectorInstrumentation::didRequestAnimationFrameImpl): (WebCore::InspectorInstrumentation::didCancelAnimationFrameImpl): (WebCore::InspectorInstrumentation::willFireAnimationFrameImpl): (WebCore::InspectorInstrumentation::pauseOnNativeEventIfNeeded): Deleted. * inspector/agents/InspectorDOMDebuggerAgent.h: * inspector/agents/InspectorDOMDebuggerAgent.cpp: (WebCore::InspectorDOMDebuggerAgent::setEventBreakpoint): Added. (WebCore::InspectorDOMDebuggerAgent::removeEventBreakpoint): Added. (WebCore::InspectorDOMDebuggerAgent::willHandleEvent): (WebCore::InspectorDOMDebuggerAgent::willFireTimer): Added. (WebCore::InspectorDOMDebuggerAgent::willFireAnimationFrame): Added. (WebCore::InspectorDOMDebuggerAgent::setEventListenerBreakpoint): Deleted. (WebCore::InspectorDOMDebuggerAgent::setInstrumentationBreakpoint): Deleted. (WebCore::InspectorDOMDebuggerAgent::setBreakpoint): Deleted. (WebCore::InspectorDOMDebuggerAgent::removeEventListenerBreakpoint): Deleted. (WebCore::InspectorDOMDebuggerAgent::removeInstrumentationBreakpoint): Deleted. (WebCore::InspectorDOMDebuggerAgent::removeBreakpoint): Deleted. (WebCore::InspectorDOMDebuggerAgent::pauseOnNativeEventIfNeeded): Deleted. Unify the event listener and instrumentation breakpoint commands into a single method, `setEventBreakpoint`, that takes in both an `EventBreakpointType` and `eventName`. * page/DOMTimer.cpp: (WebCore::DOMTimer::fired): Source/WebInspectorUI: Add a `type` to `WI.EventBreakpoint` that matches `DOMDebugger.EventBreakpointType`: - `AnimationFrame` for `requestAnimationFrame` - `Listener` for any named DOM Event - `Timer` for `setTimeout` and `setInterval` Modified `WI.EventBreakpointPopover` to provide ways for selecting these other types, which is then passed to `WI.DOMDebuggerManager`, which now calls through to the newly added `DOMDebugger.removeEventBreakpoint` and `DOMDebugger.setEventBreakpoint` that sets breakpoints for all event types. * Localizations/en.lproj/localizedStrings.js: * UserInterface/Images/EventBreakpointAnimationFrame.svg: Added. * UserInterface/Images/EventBreakpointListener.svg: Renamed from Source/WebInspectorUI/UserInterface/Images/EventBreakpoint.svg. * UserInterface/Images/EventBreakpointTimer.svg: Added. * UserInterface/Controllers/DOMDebuggerManager.js: (WI.DOMDebuggerManager.supportsEventBreakpoints): Added. (WI.DOMDebuggerManager.prototype.eventBreakpointForTypeAndEventName): Added. (WI.DOMDebuggerManager.prototype.addEventBreakpoint): (WI.DOMDebuggerManager.prototype.removeEventBreakpoint.breakpointRemoved): Added. (WI.DOMDebuggerManager.prototype.removeEventBreakpoint): (WI.DOMDebuggerManager.prototype._updateEventBreakpoint): (WI.DOMDebuggerManager.prototype.eventBreakpointForEventName): Deleted. * UserInterface/Controllers/DOMTreeManager.js: (WI.DOMTreeManager.prototype.setBreakpointForEventListener): * UserInterface/Controllers/DebuggerManager.js: (WI.DebuggerManager.prototype._pauseReasonFromPayload): * UserInterface/Models/EventBreakpoint.js: (WI.EventBreakpoint): (WI.EventBreakpoint.fromPayload): (WI.EventBreakpoint.prototype.get type): Added. (WI.EventBreakpoint.prototype.get serializableInfo): (WI.EventBreakpoint.prototype.saveIdentityToCookie): * UserInterface/Views/DebuggerSidebarPanel.js: (WI.DebuggerSidebarPanel.prototype._updatePauseReasonSection): (WI.DebuggerSidebarPanel.prototype.willDismissPopover): * UserInterface/Views/EventBreakpointPopover.js: (WI.EventBreakpointPopover): (WI.EventBreakpointPopover.prototype.get breakpoint): Added. (WI.EventBreakpointPopover.prototype.show): (WI.EventBreakpointPopover.prototype.show.createOption): Added. (WI.EventBreakpointPopover.prototype.dismiss): Added. (WI.EventBreakpointPopover.prototype._presentOverTargetElement): (WI.EventBreakpointPopover.prototype._handleTypeSelectChange): Added. (WI.EventBreakpointPopover.prototype.get result): Deleted. (WI.EventBreakpointPopover.prototype.get value): Deleted. * UserInterface/Views/EventBreakpointPopover.css: (.popover .event-breakpoint-content > .event-type): Added. (.popover .event-breakpoint-content > input): Deleted. * UserInterface/Views/EventBreakpointTreeElement.js: (WI.EventBreakpointTreeElement): * UserInterface/Views/EventBreakpointTreeElement.css: (.breakpoint.event.animation-frame:not(.breakpoint-paused-icon) .icon): Added. (.breakpoint.event.listener:not(.breakpoint-paused-icon) .icon): Added. (.breakpoint.event.timer:not(.breakpoint-paused-icon) .icon): Added. (.breakpoint.event:not(.breakpoint-paused-icon) .icon): Deleted. LayoutTests: * inspector/dom-debugger/event-animation-frame-breakpoints-expected.txt: Added. * inspector/dom-debugger/event-animation-frame-breakpoints.html: Added. * inspector/dom-debugger/event-breakpoint-with-navigation.html: * inspector/dom-debugger/event-timer-breakpoints-expected.txt: Added. * inspector/dom-debugger/event-timer-breakpoints.html: Added. * inspector/dom-debugger/event-listener-breakpoints-expected.txt: Renamed from LayoutTests/inspector/dom-debugger/event-breakpoints-expected.txt. * inspector/dom-debugger/event-listener-breakpoints.html: Renamed from LayoutTests/inspector/dom-debugger/event-breakpoints.html. * inspector/dom-debugger/resources/event-breakpoint-utilities.js: Added. (TestPage.registerInitializer.window.teardown): (TestPage.registerInitializer.window.failOnPause): (TestPage.registerInitializer.window.addBreakpoint): (TestPage.registerInitializer.window.removeBreakpoint): (TestPage.registerInitializer.window.disableBreakpoint): (TestPage.registerInitializer.window.awaitEvent): Canonical link: https://commits.webkit.org/203952@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@235248 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2018-08-23 21:36:40 +00:00
WI.debuggerManager.removeEventListener(WI.DebuggerManager.Event.Paused, listener);
resolve();
});
Web Inspector: allow event breakpoints to be configured https://bugs.webkit.org/show_bug.cgi?id=215362 <rdar://problem/66932921> Reviewed by Brian Burg. Source/JavaScriptCore: This allows developers to do things like: - only pause when `window.event.type` is a certain value - ignore the first N pauses - evaluate JavaScript whenever an event listener is invoked without pausing * inspector/protocol/DOM.json: Add an `options` paramater to `DOM.setBreakpointForEventListener` to allow configuration. * inspector/protocol/DOMDebugger.json: Add an `options` paramater to `DOMDebugger.setEventBreakpoint` to allow configuration. * debugger/Breakpoint.h: (JSC::Breakpoint::id const): Added. (JSC::Breakpoint::sourceID const): Added. (JSC::Breakpoint::lineNumber const): Added. (JSC::Breakpoint::columnNumber const): Added. (JSC::Breakpoint::condition const): Added. (JSC::Breakpoint::actions const): Added. (JSC::Breakpoint::isAutoContinue const): Added. (JSC::Breakpoint::resetHitCount): Added. (JSC::Breakpoint::isLinked const): Added. (JSC::Breakpoint::isResolved const): Added. (JSC::BreakpointsList::~BreakpointsList): Deleted. * debugger/Breakpoint.cpp: Added. (JSC::Breakpoint::Action::Action): Added. (JSC::Breakpoint::create): Added. (JSC::Breakpoint::Breakpoint): Added. (JSC::Breakpoint::link): Added. (JSC::Breakpoint::resolve): Added. (JSC::Breakpoint::shouldPause): Added. Unify `JSC::Breakpoint` and `Inspector::ScriptBreakpoint`. * debugger/DebuggerPrimitives.h: * debugger/Debugger.h: * debugger/Debugger.cpp: (JSC::Debugger::Debugger): (JSC::Debugger::addObserver): Added. (JSC::Debugger::removeObserver): Added. (JSC::Debugger::canDispatchFunctionToObservers const): Added. (JSC::Debugger::dispatchFunctionToObservers): Added. (JSC::Debugger::sourceParsed): Added. (JSC::Debugger::toggleBreakpoint): (JSC::Debugger::applyBreakpoints): (JSC::Debugger::resolveBreakpoint): (JSC::Debugger::setBreakpoint): (JSC::Debugger::removeBreakpoint): (JSC::Debugger::didHitBreakpoint): Added. (JSC::Debugger::clearBreakpoints): (JSC::Debugger::evaluateBreakpointCondition): Added. (JSC::Debugger::evaluateBreakpointActions): Added. (JSC::Debugger::schedulePauseAtNextOpportunity): Added. (JSC::Debugger::cancelPauseAtNextOpportunity): Added. (JSC::Debugger::schedulePauseForSpecialBreakpoint): Added. (JSC::Debugger::cancelPauseForSpecialBreakpoint): Added. (JSC::Debugger::continueProgram): (JSC::Debugger::stepNextExpression): (JSC::Debugger::stepIntoStatement): (JSC::Debugger::stepOverStatement): (JSC::Debugger::stepOutOfFunction): (JSC::Debugger::pauseIfNeeded): (JSC::Debugger::handlePause): Added. (JSC::Debugger::exceptionOrCaughtValue): Added. (JSC::Debugger::atExpression): (JSC::Debugger::clearNextPauseState): (JSC::Debugger::willRunMicrotask): Added. (JSC::Debugger::didRunMicrotask): Added. (JSC::Debugger::hasBreakpoint): Deleted. (JSC::Debugger::setPauseOnNextStatement): Deleted. Unify `JSC::Debugger` and `Inspector::ScriptDebugServer` to simplify breakpoint logic. Introduce the concept of a "special breakpoint", which is essentially a `JSC::Breakpoint` that is expected to pause at the next opportunity but isn't tied to a particular location. As an example, whenever an event breakpoint is hit, instead of just pausing at the next opportunity, the newly managed `JSC::Breakpoint` is used as a "special breakpoint", allowing for it's configuration (ie.g. condition, ignore count, actions, auto-continue) to be used. * inspector/agents/InspectorDebuggerAgent.h: * inspector/agents/InspectorDebuggerAgent.cpp: (Inspector::objectGroupForBreakpointAction): (Inspector::breakpointActionTypeForString): Added. (Inspector::parseBreakpointOptions): Added. (Inspector::InspectorDebuggerAgent::ProtocolBreakpoint::fromPayload): Added. (Inspector::InspectorDebuggerAgent::ProtocolBreakpoint::ProtocolBreakpoint): Added. (Inspector::InspectorDebuggerAgent::ProtocolBreakpoint::createDebuggerBreakpoint const): Added. (Inspector::InspectorDebuggerAgent::ProtocolBreakpoint::matchesScriptURL const): Added. (Inspector::InspectorDebuggerAgent::debuggerBreakpointFromPayload): Added. (Inspector::InspectorDebuggerAgent::enable): (Inspector::InspectorDebuggerAgent::disable): (Inspector::InspectorDebuggerAgent::buildBreakpointPauseReason): (Inspector::InspectorDebuggerAgent::handleConsoleAssert): (Inspector::InspectorDebuggerAgent::didScheduleAsyncCall): (Inspector::buildDebuggerLocation): (Inspector::InspectorDebuggerAgent::setBreakpointByUrl): (Inspector::InspectorDebuggerAgent::setBreakpoint): (Inspector::InspectorDebuggerAgent::didSetBreakpoint): (Inspector::InspectorDebuggerAgent::resolveBreakpoint): (Inspector::InspectorDebuggerAgent::removeBreakpoint): (Inspector::InspectorDebuggerAgent::continueToLocation): (Inspector::InspectorDebuggerAgent::schedulePauseAtNextOpportunity): Added. (Inspector::InspectorDebuggerAgent::cancelPauseAtNextOpportunity): Added. (Inspector::InspectorDebuggerAgent::schedulePauseForSpecialBreakpoint): Added. (Inspector::InspectorDebuggerAgent::cancelPauseForSpecialBreakpoint): Added. (Inspector::InspectorDebuggerAgent::pause): (Inspector::InspectorDebuggerAgent::resume): (Inspector::InspectorDebuggerAgent::didBecomeIdle): (Inspector::InspectorDebuggerAgent::sourceMapURLForScript): (Inspector::InspectorDebuggerAgent::didParseSource): (Inspector::InspectorDebuggerAgent::willRunMicrotask): (Inspector::InspectorDebuggerAgent::didRunMicrotask): (Inspector::InspectorDebuggerAgent::didPause): (Inspector::InspectorDebuggerAgent::breakpointActionSound): (Inspector::InspectorDebuggerAgent::breakpointActionProbe): (Inspector::InspectorDebuggerAgent::clearInspectorBreakpointState): (Inspector::InspectorDebuggerAgent::clearDebuggerBreakpointState): (Inspector::matches): Deleted. (Inspector::buildObjectForBreakpointCookie): Deleted. (Inspector::InspectorDebuggerAgent::breakpointActionsFromProtocol): Deleted. (Inspector::InspectorDebuggerAgent::schedulePauseOnNextStatement): Deleted. (Inspector::InspectorDebuggerAgent::cancelPauseOnNextStatement): Deleted. Create a private `ProtocolBreakpoint` class that holds the data sent by the frontend. This is necessary because breakpoints in the frontend have a potentially one-to-many relationship with breakpoints in the backend, as the same script can be loaded many times on a page. Each of those scripts is independent, however, and can execute differently, meaning that the same breakpoint for each script also needs a different state (e.g. ignore count). As such, the `ProtocolBreakpoint` is effectively a template that is actualized whenever a new script is parsed that matches the URL of the `ProtocolBreakpoint` to create a `JSC::Breakpoint` that is used by the `JSC::Debugger`. `ProtocolBreakpoint` also parses breakpoint configurations. * inspector/InspectorEnvironment.h: * inspector/JSGlobalObjectScriptDebugServer.h: * inspector/JSGlobalObjectScriptDebugServer.cpp: (Inspector::JSGlobalObjectScriptDebugServer::JSGlobalObjectScriptDebugServer): (Inspector::JSGlobalObjectScriptDebugServer::attachDebugger): (Inspector::JSGlobalObjectScriptDebugServer::detachDebugger): (Inspector::JSGlobalObjectScriptDebugServer::runEventLoopWhilePaused): * inspector/agents/InspectorAuditAgent.h: * inspector/agents/InspectorAuditAgent.cpp: (Inspector::InspectorAuditAgent::run): * inspector/agents/InspectorRuntimeAgent.h: * inspector/agents/InspectorRuntimeAgent.cpp: (Inspector::setPauseOnExceptionsState): (Inspector::InspectorRuntimeAgent::evaluate): (Inspector::InspectorRuntimeAgent::callFunctionOn): (Inspector::InspectorRuntimeAgent::getPreview): (Inspector::InspectorRuntimeAgent::getProperties): (Inspector::InspectorRuntimeAgent::getDisplayableProperties): * inspector/agents/InspectorScriptProfilerAgent.cpp: * inspector/agents/JSGlobalObjectDebuggerAgent.h: Replace `Inspector::ScriptDebugServer` with `JSC::Debugger`. * runtime/JSMicrotask.cpp: (JSC::JSMicrotask::run): Drive-by: r248894 mistakenly omitted the call to notify the debugger that the microtask ran. * inspector/ScriptBreakpoint.h: Removed. * inspector/ScriptDebugListener.h: Removed. * inspector/ScriptDebugServer.h: Removed. * inspector/ScriptDebugServer.cpp: Removed. * CMakeLists.txt: * JavaScriptCore.xcodeproj/project.pbxproj: * Sources.txt: Source/WebCore: This allows developers to do things like: - only pause when `window.event.type` is a certain value - ignore the first N pauses - evaluate JavaScript whenever an event listener is invoked without pausing Tests: inspector/dom/breakpoint-for-event-listener.html inspector/dom-debugger/event-animation-frame-breakpoints.html inspector/dom-debugger/event-interval-breakpoints.html inspector/dom-debugger/event-listener-breakpoints.html inspector/dom-debugger/event-timeout-breakpoints.html * inspector/agents/InspectorDOMAgent.h: * inspector/agents/InspectorDOMAgent.cpp: (WebCore::InspectorDOMAgent::getEventListenersForNode): (WebCore::InspectorDOMAgent::setBreakpointForEventListener): (WebCore::InspectorDOMAgent::removeBreakpointForEventListener): (WebCore::InspectorDOMAgent::buildObjectForEventListener): (WebCore::InspectorDOMAgent::breakpointForEventListener): (WebCore::InspectorDOMAgent::hasBreakpointForEventListener): Deleted. * inspector/agents/InspectorDOMDebuggerAgent.h: * inspector/agents/InspectorDOMDebuggerAgent.cpp: (WebCore::InspectorDOMDebuggerAgent::disable): (WebCore::InspectorDOMDebuggerAgent::mainFrameNavigated): (WebCore::InspectorDOMDebuggerAgent::setEventBreakpoint): (WebCore::InspectorDOMDebuggerAgent::removeEventBreakpoint): (WebCore::InspectorDOMDebuggerAgent::willHandleEvent): (WebCore::InspectorDOMDebuggerAgent::didHandleEvent): (WebCore::InspectorDOMDebuggerAgent::willFireTimer): (WebCore::InspectorDOMDebuggerAgent::didFireTimer): * inspector/agents/page/PageDOMDebuggerAgent.h: * inspector/agents/page/PageDOMDebuggerAgent.cpp: (WebCore::PageDOMDebuggerAgent::disable): (WebCore::PageDOMDebuggerAgent::mainFrameNavigated): (WebCore::PageDOMDebuggerAgent::willFireAnimationFrame): (WebCore::PageDOMDebuggerAgent::didFireAnimationFrame): (WebCore::PageDOMDebuggerAgent::setAnimationFrameBreakpoint): * inspector/agents/worker/WorkerDOMDebuggerAgent.h: * inspector/agents/worker/WorkerDOMDebuggerAgent.cpp: (WebCore::WorkerDOMDebuggerAgent::setAnimationFrameBreakpoint): Keep a `JSC::Breakpoint` for each event breakpoint instead of a simple `bool`, allowing for configuration when the breakpoint is first set. When any of these breakpoints are hit, pass it to the `JSC::Debugger` as a "special breakpoint", which behaves the same as "pause ASAP" but also supports a condition, an ignore count, actions, and auto-continue. Reset the hit count for any of these "special breakpoints" that persist across Web Inspector sessions when the main frame navigates. * inspector/PageScriptDebugServer.h: * inspector/PageScriptDebugServer.cpp: (WebCore::PageScriptDebugServer::PageScriptDebugServer): (WebCore::PageScriptDebugServer::attachDebugger): (WebCore::PageScriptDebugServer::detachDebugger): (WebCore::PageScriptDebugServer::didPause): (WebCore::PageScriptDebugServer::didContinue): (WebCore::PageScriptDebugServer::runEventLoopWhilePaused): (WebCore::PageScriptDebugServer::runEventLoopWhilePausedInternal): (WebCore::PageScriptDebugServer::isContentScript const): (WebCore::PageScriptDebugServer::reportException const): * inspector/WorkerScriptDebugServer.h: * inspector/WorkerScriptDebugServer.cpp: (WebCore::WorkerScriptDebugServer::WorkerScriptDebugServer): (WebCore::WorkerScriptDebugServer::attachDebugger): (WebCore::WorkerScriptDebugServer::detachDebugger): (WebCore::WorkerScriptDebugServer::runEventLoopWhilePaused): (WebCore::WorkerScriptDebugServer::reportException const): * inspector/agents/page/PageDebuggerAgent.h: * inspector/agents/page/PageDebuggerAgent.cpp: (WebCore::PageDebuggerAgent::sourceMapURLForScript): Replace `Inspector::ScriptDebugServer` with `JSC::Debugger`. * inspector/TimelineRecordFactory.h: * inspector/TimelineRecordFactory.cpp: (WebCore::TimelineRecordFactory::createProbeSampleData): * inspector/agents/InspectorTimelineAgent.h: * inspector/agents/InspectorTimelineAgent.cpp: (WebCore::InspectorTimelineAgent::internalStart): (WebCore::InspectorTimelineAgent::internalStop): (WebCore::InspectorTimelineAgent::breakpointActionProbe): Replace `Inspector::ScriptBreakpoint` with `JSC::Breakpoint`. * inspector/InspectorInstrumentation.h: (WebCore::InspectorInstrumentation::didHandleEvent): (WebCore::InspectorInstrumentation::didFireTimer): * inspector/InspectorInstrumentation.cpp: (WebCore::InspectorInstrumentation::didHandleEventImpl): (WebCore::InspectorInstrumentation::didFireTimerImpl): (WebCore::InspectorInstrumentation::didCommitLoadImpl): (WebCore::InspectorInstrumentation::didFireAnimationFrameImpl): * dom/EventTarget.cpp: (WebCore::EventTarget::innerInvokeEventListeners): * page/DOMTimer.cpp: (WebCore::DOMTimer::fired): When notifying Web Inspector that activity did occur, include all information previously included when notifying Web Inspector that that activity was about to occur so that Web Inspector can know whether a pause for the "special breakpoint" for that activity is still scheduled and if so cancel it. Source/WebInspectorUI: This allows developers to do things like: - only pause when `window.event.type` is a certain value - ignore the first N pauses - evaluate JavaScript whenever an event listener is invoked without pausing * UserInterface/Models/Breakpoint.js: (WI.Breakpoint): (WI.Breakpoint.prototype.toJSON): (WI.Breakpoint.prototype.get special): Added. (WI.Breakpoint.prototype.get removable): Added. (WI.Breakpoint.prototype.get editable): Added. (WI.Breakpoint.prototype.set condition): (WI.Breakpoint.prototype.get ignoreCount): (WI.Breakpoint.prototype.set ignoreCount): (WI.Breakpoint.prototype.get autoContinue): (WI.Breakpoint.prototype.set autoContinue): (WI.Breakpoint.prototype.get actions): (WI.Breakpoint.prototype.get probeActions): (WI.Breakpoint.prototype.cycleToNextMode): (WI.Breakpoint.prototype.createAction): (WI.Breakpoint.prototype.recreateAction): (WI.Breakpoint.prototype.removeAction): (WI.Breakpoint.prototype.clearActions): (WI.Breakpoint.prototype.remove): Added. (WI.Breakpoint.prototype.optionsToProtocol): Added. (WI.Breakpoint.prototype.breakpointActionDidChange): (WI.Breakpoint.fromJSON): Deleted. (WI.Breakpoint.prototype.get sourceCodeLocation): Deleted. (WI.Breakpoint.prototype.get contentIdentifier): Deleted. (WI.Breakpoint.prototype.get scriptIdentifier): Deleted. (WI.Breakpoint.prototype.get target): Deleted. (WI.Breakpoint.prototype.get identifier): Deleted. (WI.Breakpoint.prototype.set identifier): Deleted. (WI.Breakpoint.prototype.get resolved): Deleted. (WI.Breakpoint.prototype.set resolved): Deleted. (WI.Breakpoint.prototype.saveIdentityToCookie): Deleted. (WI.Breakpoint.prototype._isSpecial): Deleted. (WI.Breakpoint.prototype._sourceCodeLocationLocationChanged): Deleted. (WI.Breakpoint.prototype._sourceCodeLocationDisplayLocationChanged): Deleted. * UserInterface/Models/DOMBreakpoint.js: (WI.DOMBreakpoint): (WI.DOMBreakpoint.fromJSON): Added. (WI.DOMBreakpoint.prototype.remove): Added. (WI.DOMBreakpoint.prototype.toJSON): (WI.DOMBreakpoint.deserialize): Deleted. (WI.DOMBreakpoint.prototype.get disabled): Deleted. (WI.DOMBreakpoint.prototype.set disabled): Deleted. * UserInterface/Models/EventBreakpoint.js: (WI.EventBreakpoint): (WI.EventBreakpoint.fromJSON): Added. (WI.EventBreakpoint.prototype.get special): Added. (WI.EventBreakpoint.prototype.get editable): Added. (WI.EventBreakpoint.prototype.remove): Added. (WI.EventBreakpoint.prototype.saveIdentityToCookie): (WI.EventBreakpoint.prototype.toJSON): (WI.EventBreakpoint.deserialize): Deleted. (WI.EventBreakpoint.prototype.get disabled): Deleted. (WI.EventBreakpoint.prototype.set disabled): Deleted. * UserInterface/Models/JavaScriptBreakpoint.js: Copied from UserInterface/Models/Breakpoint.js. (WI.JavaScriptBreakpoint): (WI.JavaScriptBreakpoint.fromJSON): (WI.JavaScriptBreakpoint.prototype.toJSON): (WI.JavaScriptBreakpoint.prototype.get sourceCodeLocation): (WI.JavaScriptBreakpoint.prototype.get contentIdentifier): (WI.JavaScriptBreakpoint.prototype.get scriptIdentifier): (WI.JavaScriptBreakpoint.prototype.get target): (WI.JavaScriptBreakpoint.prototype.get special): Added. (WI.JavaScriptBreakpoint.prototype.get removable): Added. (WI.JavaScriptBreakpoint.prototype.get editable): Added. (WI.JavaScriptBreakpoint.prototype.get identifier): (WI.JavaScriptBreakpoint.prototype.set identifier): (WI.JavaScriptBreakpoint.prototype.get resolved): (WI.JavaScriptBreakpoint.prototype.set resolved): (WI.JavaScriptBreakpoint.prototype.remove): Added. (WI.JavaScriptBreakpoint.prototype.saveIdentityToCookie): (WI.JavaScriptBreakpoint.prototype._isSpecial): (WI.JavaScriptBreakpoint.prototype._sourceCodeLocationLocationChanged): (WI.JavaScriptBreakpoint.prototype._sourceCodeLocationDisplayLocationChanged): * UserInterface/Models/URLBreakpoint.js: (WI.URLBreakpoint): (WI.URLBreakpoint.fromJSON): Added. (WI.URLBreakpoint.prototype.get special): Added. (WI.URLBreakpoint.prototype.remove): Added. (WI.URLBreakpoint.prototype.toJSON): (WI.URLBreakpoint.deserialize): Deleted. (WI.URLBreakpoint.prototype.get disabled): Deleted. (WI.URLBreakpoint.prototype.set disabled): Deleted. Rename `WI.Breakpoint` to `WI.JavaScriptBreakpoint` and use `WI.Breakpoint` as a new common base class for all breakpoint types, allowing more logic to be shared (e.g. disabled state). Additionally, breakpoints are now able to - determine whether or not they're - special - removable - editable (i.e. configurable) - remove themselves without the caller needing to know what manager to consult with. * UserInterface/Controllers/DOMManager.js: (WI.DOMManager): (WI.DOMManager.supportsEventListenerBreakpointConfiguration): Added. (WI.DOMManager.prototype.setBreakpointForEventListener): (WI.DOMManager.prototype.removeBreakpointForEventListener): (WI.DOMManager.prototype._setEventBreakpoint): Added. (WI.DOMManager.prototype._removeEventBreakpoint): Added. (WI.DOMManager.prototype._handleEventBreakpointEditablePropertyChanged): Added. (WI.DOMManager.prototype._handleEventBreakpointActionsChanged): Added. (WI.DOMManager.prototype._updateEventBreakpoint): Deleted. Keep track of configuration changes for specific listener breakpoints. * UserInterface/Controllers/DOMDebuggerManager.js: (WI.DOMDebuggerManager): (WI.DOMDebuggerManager.prototype.initializeTarget): (WI.DOMDebuggerManager.prototype.addDOMBreakpoint): (WI.DOMDebuggerManager.prototype.removeDOMBreakpoint): (WI.DOMDebuggerManager.prototype.addEventBreakpoint): (WI.DOMDebuggerManager.prototype.removeEventBreakpoint): (WI.DOMDebuggerManager.prototype.addURLBreakpoint): (WI.DOMDebuggerManager.prototype.removeURLBreakpoint): (WI.DOMDebuggerManager.prototype._commandArgumentsForEventBreakpoint): Added. (WI.DOMDebuggerManager.prototype._setEventBreakpoint): Added. (WI.DOMDebuggerManager.prototype._removeEventBreakpoint): Added. (WI.DOMDebuggerManager.prototype._handleEventBreakpointDisabledStateChanged): Added. (WI.DOMDebuggerManager.prototype._handleEventBreakpointEditablePropertyChanged): Added. (WI.DOMDebuggerManager.prototype._handleEventBreakpointActionsChanged): Added. (WI.DOMDebuggerManager.prototype.isBreakpointSpecial): Deleted. (WI.DOMDebuggerManager.prototype._updateEventBreakpoint): Deleted. Keep track of configuration changes for special event breakpoints. Store special event breakpoints inside `WI.objectStores.eventBreakpoints`. * UserInterface/Controllers/DebuggerManager.js: (WI.DebuggerManager): (WI.DebuggerManager.prototype.addBreakpoint): (WI.DebuggerManager.prototype.removeBreakpoint): (WI.DebuggerManager.prototype.addProbesForBreakpoint): Added. (WI.DebuggerManager.prototype.removeProbesForBreakpoint): Added. (WI.DebuggerManager.prototype.updateProbesForBreakpoint): Added. (WI.DebuggerManager.prototype._setBreakpoint): (WI.DebuggerManager.prototype._breakpointEditablePropertyDidChange): (WI.DebuggerManager.prototype._handleBreakpointActionsDidChange): (WI.DebuggerManager.prototype.isBreakpointRemovable): Deleted. (WI.DebuggerManager.prototype.isBreakpointSpecial): Deleted. (WI.DebuggerManager.prototype.isBreakpointEditable): Deleted. (WI.DebuggerManager.prototype._debuggerBreakpointActionType): Deleted. (WI.DebuggerManager.prototype._debuggerBreakpointOptions): Deleted. (WI.DebuggerManager.prototype._addProbesForBreakpoint): Deleted. (WI.DebuggerManager.prototype._removeProbesForBreakpoint): Deleted. (WI.DebuggerManager.prototype._updateProbesForBreakpoint): Deleted. Replace `WI.Breakpoint` with `WI.JavaScriptBreakpoint`. Probes now support `WI.EventBreakpoint` in addition to `WI.JavaScriptBreakpoint`. * UserInterface/Controllers/BreakpointPopoverController.js: (WI.BreakpointPopoverController.prototype.appendContextMenuItems): (WI.BreakpointPopoverController.prototype._createPopoverContent): Allow any breakpoint instead of only `WI.JavaScriptBreakpoint`. Drive-by: the existing `ignoreCount` value wasn't being used to populate the `<input>`. * UserInterface/Views/BreakpointTreeElement.js: (WI.BreakpointTreeElement.prototype.ondelete): (WI.BreakpointTreeElement.prototype.get listenerSet): Added. (WI.BreakpointTreeElement.prototype.updateStatus): Added. (WI.BreakpointTreeElement.prototype.updateTitles): Added. (WI.BreakpointTreeElement.prototype.get breakpoint): Deleted. (WI.BreakpointTreeElement.prototype.get filterableData): Deleted. (WI.BreakpointTreeElement.prototype._updateTitles): Deleted. (WI.BreakpointTreeElement.prototype._updateStatus): Deleted. (WI.BreakpointTreeElement.prototype._breakpointLocationDidChange): Deleted. * UserInterface/Views/BreakpointTreeElement.css: (.item.breakpoint .status > .status-image): (.item.breakpoint.paused .icon): Added. (@media (prefers-color-scheme: dark) .item.breakpoint.paused .icon): Added. (.item.breakpoint .status > .status-image.resolved): Deleted. (body:not(.window-inactive, .window-docked-inactive) .tree-outline:focus-within .item.breakpoint.selected .status > .status-image.resolved): Deleted. (.item.breakpoint .subtitle.formatted-location): Deleted. (.breakpoint-debugger-statement-icon .icon): Deleted. (.breakpoint-exception-icon .icon): Deleted. (.breakpoint-assertion-icon .icon): Deleted. (.breakpoint-microtask-icon .icon): Deleted. (.breakpoint-paused-icon .icon): Deleted. (.breakpoint-generic-line-icon .icon): Deleted. (.breakpoint-generic-line-icon .icon > span): Deleted. (.data-updated.breakpoint-generic-line-icon .icon > span): Deleted. (@media (prefers-color-scheme: dark) .breakpoint-debugger-statement-icon .icon): Deleted. (@media (prefers-color-scheme: dark) .breakpoint-exception-icon .icon): Deleted. (@media (prefers-color-scheme: dark) .breakpoint-assertion-icon .icon): Deleted. (@media (prefers-color-scheme: dark) .breakpoint-microtask-icon .icon): Deleted. (@media (prefers-color-scheme: dark) .breakpoint-paused-icon .icon): Deleted. (@media (prefers-color-scheme: dark) .breakpoint-generic-line-icon .icon): Deleted. * UserInterface/Views/DOMBreakpointTreeElement.js: (WI.DOMBreakpointTreeElement): (WI.DOMBreakpointTreeElement.prototype.onattach): Deleted. (WI.DOMBreakpointTreeElement.prototype.ondetach): Deleted. (WI.DOMBreakpointTreeElement.prototype.ondelete): Deleted. (WI.DOMBreakpointTreeElement.prototype.onenter): Deleted. (WI.DOMBreakpointTreeElement.prototype.onspace): Deleted. (WI.DOMBreakpointTreeElement.prototype.populateContextMenu): Deleted. (WI.DOMBreakpointTreeElement.prototype._statusImageElementClicked): Deleted. (WI.DOMBreakpointTreeElement.prototype._statusImageElementFocused): Deleted. (WI.DOMBreakpointTreeElement.prototype._statusImageElementMouseDown): Deleted. (WI.DOMBreakpointTreeElement.prototype._toggleBreakpoint): Deleted. (WI.DOMBreakpointTreeElement.prototype._updateStatus): Deleted. * UserInterface/Views/DOMBreakpointTreeElement.css: (.item.breakpoint.dom.subtree-modified:not(.paused) .icon): Added. (.item.breakpoint.dom.attribute-modified:not(.paused) .icon): Added. (.item.breakpoint.dom.node-removed:not(.paused) .icon): Added. (@media (prefers-color-scheme: dark) .item.breakpoint.dom.subtree-modified:not(.paused) .icon): Added. (@media (prefers-color-scheme: dark) .item.breakpoint.dom.attribute-modified:not(.paused) .icon): Added. (@media (prefers-color-scheme: dark) .item.breakpoint.dom.node-removed:not(.paused) .icon): Added. (.breakpoint.dom.breakpoint-for-subtree-modified:not(.breakpoint-paused-icon) .icon): Deleted. (.breakpoint.dom.breakpoint-for-attribute-modified:not(.breakpoint-paused-icon) .icon): Deleted. (.breakpoint.dom.breakpoint-for-node-removed:not(.breakpoint-paused-icon) .icon): Deleted. (@media (prefers-color-scheme: dark) .breakpoint.dom.breakpoint-for-subtree-modified:not(.breakpoint-paused-icon) .icon): Deleted. (@media (prefers-color-scheme: dark) .breakpoint.dom.breakpoint-for-attribute-modified:not(.breakpoint-paused-icon) .icon): Deleted. (@media (prefers-color-scheme: dark) .breakpoint.dom.breakpoint-for-node-removed:not(.breakpoint-paused-icon) .icon): Deleted. * UserInterface/Views/EventBreakpointTreeElement.js: (WI.EventBreakpointTreeElement): (WI.EventBreakpointTreeElement.prototype.onattach): Deleted. (WI.EventBreakpointTreeElement.prototype.ondetach): Deleted. (WI.EventBreakpointTreeElement.prototype.ondelete): Deleted. (WI.EventBreakpointTreeElement.prototype.onenter): Deleted. (WI.EventBreakpointTreeElement.prototype.onspace): Deleted. (WI.EventBreakpointTreeElement.prototype.populateContextMenu): Deleted. (WI.EventBreakpointTreeElement.prototype._statusImageElementClicked): Deleted. (WI.EventBreakpointTreeElement.prototype._statusImageElementFocused): Deleted. (WI.EventBreakpointTreeElement.prototype._statusImageElementMouseDown): Deleted. (WI.EventBreakpointTreeElement.prototype._toggleBreakpoint): Deleted. (WI.EventBreakpointTreeElement.prototype._updateStatus): Deleted. * UserInterface/Views/EventBreakpointTreeElement.css: (.item.breakpoint.event.animation-frame:not(.paused) .icon): Added. (.item.breakpoint.event.interval:not(.paused) .icon): Added. (.item.breakpoint.event.listener:not(.paused) .icon): Added. (.item.breakpoint.event.timeout:not(.paused) .icon): Added. (@media(prefers-color-scheme: dark) .item.breakpoint.event.animation-frame:not(.paused) .icon): Added. (@media(prefers-color-scheme: dark) .item.breakpoint.event.interval:not(.paused) .icon): Added. (@media(prefers-color-scheme: dark) .item.breakpoint.event.listener:not(.paused) .icon): Added. (@media(prefers-color-scheme: dark) .item.breakpoint.event.timeout:not(.paused) .icon): Added. (.breakpoint.event.breakpoint-for-animation-frame:not(.breakpoint-paused-icon) .icon): Deleted. (.breakpoint.event.breakpoint-for-interval:not(.breakpoint-paused-icon) .icon): Deleted. (.breakpoint.event.breakpoint-for-listener:not(.breakpoint-paused-icon) .icon): Deleted. (.breakpoint.event.breakpoint-for-timeout:not(.breakpoint-paused-icon) .icon): Deleted. (@media(prefers-color-scheme: dark) .breakpoint.event.breakpoint-for-animation-frame:not(.breakpoint-paused-icon) .icon): Deleted. (@media(prefers-color-scheme: dark) .breakpoint.event.breakpoint-for-interval:not(.breakpoint-paused-icon) .icon): Deleted. (@media(prefers-color-scheme: dark) .breakpoint.event.breakpoint-for-listener:not(.breakpoint-paused-icon) .icon): Deleted. (@media(prefers-color-scheme: dark) .breakpoint.event.breakpoint-for-timeout:not(.breakpoint-paused-icon) .icon): Deleted. * UserInterface/Views/JavaScriptBreakpointTreeElement.js: Copied from Source/WebInspectorUI/UserInterface/Views/BreakpointTreeElement.js. (WI.JavaScriptBreakpointTreeElement): (WI.JavaScriptBreakpointTreeElement.prototype.get filterableData): (WI.JavaScriptBreakpointTreeElement.prototype.updateStatus): Added. (WI.JavaScriptBreakpointTreeElement.prototype.updateTitles): Added. (WI.JavaScriptBreakpointTreeElement.prototype._breakpointLocationDidChange): * UserInterface/Views/JavaScriptBreakpointTreeElement.css: Copied from Source/WebInspectorUI/UserInterface/Views/BreakpointTreeElement.css. (.item.breakpoint.javascript .status > .status-image): Added. (.item.breakpoint.javascript .status > .status-image.resolved): Added. (body:not(.window-inactive, .window-docked-inactive) .tree-outline:focus-within .item.breakpoint.javascript.selected .status > .status-image.resolved): Added. (.item.breakpoint.javascript .subtitle.formatted-location): Added. (.item.breakpoint.javascript.line .icon): Added. (.item.breakpoint.javascript.line .icon > span): Added. (.data-updated.item.breakpoint.javascript.line .icon > span): Added. (.item.breakpoint.javascript.debugger-statement .icon): Added. (.item.breakpoint.javascript.exception .icon): Added. (.item.breakpoint.javascript.assertion .icon): Added. (.item.breakpoint.javascript.microtask .icon): Added. (@media (prefers-color-scheme: dark) .item.breakpoint.javascript.line .icon): Added. (@media (prefers-color-scheme: dark) .item.breakpoint.javascript.debugger-statement .icon): Added. (@media (prefers-color-scheme: dark) .item.breakpoint.javascript.exception .icon): Added. (@media (prefers-color-scheme: dark) .item.breakpoint.javascript.assertion .icon): Added. (@media (prefers-color-scheme: dark) .item.breakpoint.javascript.microtask .icon): Added. * UserInterface/Views/URLBreakpointTreeElement.js: (WI.URLBreakpointTreeElement): (WI.URLBreakpointTreeElement.prototype.onattach): Deleted. (WI.URLBreakpointTreeElement.prototype.ondetach): Deleted. (WI.URLBreakpointTreeElement.prototype.ondelete): Deleted. (WI.URLBreakpointTreeElement.prototype.onenter): Deleted. (WI.URLBreakpointTreeElement.prototype.onspace): Deleted. (WI.URLBreakpointTreeElement.prototype.populateContextMenu): Deleted. (WI.URLBreakpointTreeElement.prototype._statusImageElementClicked): Deleted. (WI.URLBreakpointTreeElement.prototype._statusImageElementFocused): Deleted. (WI.URLBreakpointTreeElement.prototype._statusImageElementMouseDown): Deleted. (WI.URLBreakpointTreeElement.prototype._toggleBreakpoint): Deleted. (WI.URLBreakpointTreeElement.prototype._updateStatus): Deleted. * UserInterface/Views/URLBreakpointTreeElement.css: (.item.breakpoint.url .subtitle): Added. (.item.breakpoint.url:not(.paused) .icon): Added. (@media (prefers-color-scheme: dark) .item.breakpoint.url:not(.paused) .icon): Added. (.breakpoint.url .subtitle): Deleted. (.breakpoint.url:not(.breakpoint-paused-icon) .icon): Deleted. (@media (prefers-color-scheme: dark) .breakpoint.url:not(.breakpoint-paused-icon) .icon): Deleted. Rename `WI.BreakpointTreeElement` to `WI.JavaScriptBreakpointTreeElement` and use `WI.BreakpointTreeElement` as a new common base class for all breakpoint tree elements, allowing more logic and styles to be shared (e.g. disabled state). * UserInterface/Views/SourcesNavigationSidebarPanel.js: (WI.SourcesNavigationSidebarPanel): (WI.SourcesNavigationSidebarPanel.prototype.closed): (WI.SourcesNavigationSidebarPanel.prototype._insertDebuggerTreeElement): (WI.SourcesNavigationSidebarPanel.prototype._compareJavaScriptBreakpointTreeElements): Added. (WI.SourcesNavigationSidebarPanel.prototype._addBreakpoint): (WI.SourcesNavigationSidebarPanel.prototype._removeAllBreakpoints): (WI.SourcesNavigationSidebarPanel.prototype._breakpointsBeneathTreeElement): (WI.SourcesNavigationSidebarPanel.prototype._addIssue): (WI.SourcesNavigationSidebarPanel.prototype._updatePauseReasonSection): (WI.SourcesNavigationSidebarPanel.prototype._handleTreeSelectionDidChange): (WI.SourcesNavigationSidebarPanel.prototype._handleBreakpointElementAddedOrRemoved): (WI.SourcesNavigationSidebarPanel.prototype._populateCreateBreakpointContextMenu.addToggleForSpecialEventBreakpoint): (WI.SourcesNavigationSidebarPanel.prototype._populateCreateBreakpointContextMenu): (WI.SourcesNavigationSidebarPanel.prototype._handleDebuggerObjectDisplayLocationDidChange): (WI.SourcesNavigationSidebarPanel.prototype._compareBreakpointTreeElements): Deleted. * UserInterface/Models/ProbeSet.js: (WI.ProbeSet): (WI.ProbeSet.prototype.createProbe): (WI.ProbeSet.prototype.willRemove): * UserInterface/Controllers/TimelineManager.js: (WI.TimelineManager.prototype._processRecord): * UserInterface/Views/ProbeSetDetailsSection.js: (WI.ProbeSetDetailsSection): * UserInterface/Views/ProbeDetailsSidebarPanel.js: (WI.ProbeDetailsSidebarPanel.prototype.inspect): * UserInterface/Views/SourceCodeTextEditor.js: (WI.SourceCodeTextEditor): (WI.SourceCodeTextEditor.prototype.close): (WI.SourceCodeTextEditor.prototype.textEditorBreakpointAdded): * UserInterface/Views/TextResourceContentView.js: (WI.TextResourceContentView.prototype.get supplementalRepresentedObjects): (WI.TextResourceContentView.prototype._probeSetsChanged): Probes now support `WI.EventBreakpoint` in addition to `WI.JavaScriptBreakpoint`. * UserInterface/Views/ContentView.js: (WI.ContentView.createFromRepresentedObject): (WI.ContentView.resolvedRepresentedObjectForRepresentedObject): (WI.ContentView.isViewable): * UserInterface/Views/ContextMenuUtilities.js: (WI.appendContextMenuItemsForSourceCode): Replace `WI.Breakpoint` with `WI.JavaScriptBreakpoint`. * UserInterface/Views/DOMTreeContentView.js: (WI.DOMTreeContentView): Replace `WI.DOMBreakpoint` with `WI.Breakpoint`. * UserInterface/Views/EventListenerSectionGroup.js: (WI.EventListenerSectionGroup): * UserInterface/Views/EventListenerSectionGroup.css: (.event-listener-section > .content input[type="checkbox"] + .go-to-arrow): Added. (.event-listener-section > .content input[type="checkbox"]:not(:checked) + .go-to-arrow): Added. Add a go-to arrow next to the Breakpoint checkbox that reveals the `WI.EventBreakpoint` in the Sources Tab. * UserInterface/Views/BreakpointActionView.js: (WI.BreakpointActionView.prototype._appendActionButtonClicked): Drive-by: minor code cleanup. * UserInterface/Views/CallFrameTreeElement.js: (WI.CallFrameTreeElement.prototype.populateContextMenu): Drive-by: include source code location context menu items. * UserInterface/Base/Setting.js: * UserInterface/Main.html: * UserInterface/Test.html: LayoutTests: * inspector/dom-debugger/resources/event-breakpoint-utilities.js: (TestPage.registerInitializer.InspectorTest.EventBreakpoint.addBreakpointOptionsTestCases): Added. (TestPage.registerInitializer.InspectorTest.EventBreakpoint.async teardown): (TestPage.registerInitializer.InspectorTest.EventBreakpoint.createBreakpoint): (TestPage.registerInitializer.InspectorTest.EventBreakpoint.removeBreakpoint): * inspector/dom/breakpoint-for-event-listener.html: * inspector/dom/breakpoint-for-event-listener-expected.txt: * inspector/dom-debugger/event-animation-frame-breakpoints.html: * inspector/dom-debugger/event-animation-frame-breakpoints-expected.txt: * inspector/dom-debugger/event-interval-breakpoints.html: * inspector/dom-debugger/event-interval-breakpoints-expected.txt: * inspector/dom-debugger/event-listener-breakpoints.html: * inspector/dom-debugger/event-listener-breakpoints-expected.txt: * inspector/dom-debugger/event-timeout-breakpoints.html: * inspector/dom-debugger/event-timeout-breakpoints-expected.txt: Add tests for new event breakpoint configuration options. * http/tests/inspector/debugger/debugger-test.js: (TestPage.registerInitializer.InspectorTest.startTracingBreakpoints): * http/tests/inspector/resources/probe-test.js: (TestPage.registerInitializer.ProtocolTest.Probe.installTracingListeners): * inspector/debugger/breakpoint-action-eval.html: * inspector/debugger/breakpoint-action-log.html: * inspector/debugger/breakpoint-columns.html: * inspector/debugger/breakpoint-scope.html: * inspector/debugger/debugger-stack-overflow.html: * inspector/debugger/pause-reason.html: * inspector/debugger/probe-manager-add-remove-actions.html: * inspector/debugger/stepping/stepping-through-autoContinue-breakpoint.html: * inspector/debugger/tail-deleted-frames-this-value.html: * inspector/debugger/tail-recursion.html: * inspector/worker/debugger-pause.html: * inspector/worker/debugger-shared-breakpoint.html: Update existing breakpoint tests to use new model objects. Canonical link: https://commits.webkit.org/228551@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@266074 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2020-08-24 17:34:12 +00:00
InspectorTest.EventBreakpoint.createBreakpoint(WI.EventBreakpoint.Type.Listener, {eventName: "click"})
.then(() => {
InspectorTest.log("Firing \"click\" on div#x...");
return InspectorTest.evaluateInPage(`clickX()`);
})
.catch(reject);
},
teardown: InspectorTest.EventBreakpoint.teardown,
});
suite.addTestCase({
name: `DOMDebugger.Event.Listener.DisableBetweenDispatches`,
description: "Check that event listener breakpoints only pause when breakpoints are enabled.",
test(resolve, reject) {
let pauseCount = 0;
let listener = WI.debuggerManager.addEventListener(WI.DebuggerManager.Event.Paused, (event) => {
++pauseCount;
InspectorTest.pass("Should pause before event handler is run.");
logActiveStackTrace();
InspectorTest.log("Disabling breakpoints...");
DebuggerAgent.setBreakpointsActive(false)
.then(() => WI.debuggerManager.resume())
.catch(reject);
});
InspectorTest.singleFireEventListener(`TestPage-click`, (event) => {
InspectorTest.expectEqual(pauseCount, 1, "Should have paused once.");
InspectorTest.assert(!WI.debuggerManager.paused, "Should not be paused.");
WI.debuggerManager.removeEventListener(WI.DebuggerManager.Event.Paused, listener);
DebuggerAgent.setBreakpointsActive(true)
.then(resolve, reject);
Web Inspector: support breakpoints for timers and animation-frame events https://bugs.webkit.org/show_bug.cgi?id=188778 Reviewed by Brian Burg. Source/JavaScriptCore: * inspector/protocol/Debugger.json: Add `AnimationFrame` and `Timer` types to the list of pause reasons. * inspector/protocol/DOMDebugger.json: Introduced `setEventBreakpoint` and `removeEventBreakpoint` to replace the more specific: - `setEventListenerBreakpoint` - `removeEventListenerBreakpoint` - `setInstrumentationBreakpoint` - `removeInstrumentationBreakpoint` Also created an `EventBreakpointType` to enumerate the available types of event breakpoints. * inspector/scripts/codegen/generate_cpp_protocol_types_header.py: (CppProtocolTypesHeaderGenerator.generate_output): (CppProtocolTypesHeaderGenerator._generate_forward_declarations_for_binding_traits): (CppProtocolTypesHeaderGenerator._generate_declarations_for_enum_conversion_methods): (CppProtocolTypesHeaderGenerator._generate_hash_declarations): Added. Generate `DefaultHash` for all `enum class` used by inspector protocols. * inspector/scripts/tests/generic/expected/commands-with-async-attribute.json-result: * inspector/scripts/tests/generic/expected/commands-with-optional-call-return-parameters.json-result: * inspector/scripts/tests/generic/expected/enum-values.json-result: * inspector/scripts/tests/generic/expected/type-declaration-array-type.json-result: * inspector/scripts/tests/generic/expected/type-declaration-enum-type.json-result: * inspector/scripts/tests/generic/expected/type-declaration-object-type.json-result: * inspector/scripts/tests/generic/expected/type-requiring-runtime-casts.json-result: Source/WebCore: The original implementation of "instrumentation" breakpoints relied upon the frontend sending somewhat arbitrary strings when enabling breakpoints for specific events. As an example, setting a breakpoint for `requestAnimationFrame` expects `"animationFrameFired"` as the string, which doesn't make much sense. This patch removes the usage of these strings and instead expects the agent to implement a method that matches what is happening. Tests: inspector/dom-debugger/event-animation-frame-breakpoints.html inspector/dom-debugger/event-listener-breakpoints.html inspector/dom-debugger/event-timer-breakpoints.html * inspector/InspectorInstrumentation.h: (WebCore::InspectorInstrumentation::willFireTimer): * inspector/InspectorInstrumentation.cpp: (WebCore::InspectorInstrumentation::didInstallTimerImpl): (WebCore::InspectorInstrumentation::didRemoveTimerImpl): (WebCore::InspectorInstrumentation::willFireTimerImpl): (WebCore::InspectorInstrumentation::didRequestAnimationFrameImpl): (WebCore::InspectorInstrumentation::didCancelAnimationFrameImpl): (WebCore::InspectorInstrumentation::willFireAnimationFrameImpl): (WebCore::InspectorInstrumentation::pauseOnNativeEventIfNeeded): Deleted. * inspector/agents/InspectorDOMDebuggerAgent.h: * inspector/agents/InspectorDOMDebuggerAgent.cpp: (WebCore::InspectorDOMDebuggerAgent::setEventBreakpoint): Added. (WebCore::InspectorDOMDebuggerAgent::removeEventBreakpoint): Added. (WebCore::InspectorDOMDebuggerAgent::willHandleEvent): (WebCore::InspectorDOMDebuggerAgent::willFireTimer): Added. (WebCore::InspectorDOMDebuggerAgent::willFireAnimationFrame): Added. (WebCore::InspectorDOMDebuggerAgent::setEventListenerBreakpoint): Deleted. (WebCore::InspectorDOMDebuggerAgent::setInstrumentationBreakpoint): Deleted. (WebCore::InspectorDOMDebuggerAgent::setBreakpoint): Deleted. (WebCore::InspectorDOMDebuggerAgent::removeEventListenerBreakpoint): Deleted. (WebCore::InspectorDOMDebuggerAgent::removeInstrumentationBreakpoint): Deleted. (WebCore::InspectorDOMDebuggerAgent::removeBreakpoint): Deleted. (WebCore::InspectorDOMDebuggerAgent::pauseOnNativeEventIfNeeded): Deleted. Unify the event listener and instrumentation breakpoint commands into a single method, `setEventBreakpoint`, that takes in both an `EventBreakpointType` and `eventName`. * page/DOMTimer.cpp: (WebCore::DOMTimer::fired): Source/WebInspectorUI: Add a `type` to `WI.EventBreakpoint` that matches `DOMDebugger.EventBreakpointType`: - `AnimationFrame` for `requestAnimationFrame` - `Listener` for any named DOM Event - `Timer` for `setTimeout` and `setInterval` Modified `WI.EventBreakpointPopover` to provide ways for selecting these other types, which is then passed to `WI.DOMDebuggerManager`, which now calls through to the newly added `DOMDebugger.removeEventBreakpoint` and `DOMDebugger.setEventBreakpoint` that sets breakpoints for all event types. * Localizations/en.lproj/localizedStrings.js: * UserInterface/Images/EventBreakpointAnimationFrame.svg: Added. * UserInterface/Images/EventBreakpointListener.svg: Renamed from Source/WebInspectorUI/UserInterface/Images/EventBreakpoint.svg. * UserInterface/Images/EventBreakpointTimer.svg: Added. * UserInterface/Controllers/DOMDebuggerManager.js: (WI.DOMDebuggerManager.supportsEventBreakpoints): Added. (WI.DOMDebuggerManager.prototype.eventBreakpointForTypeAndEventName): Added. (WI.DOMDebuggerManager.prototype.addEventBreakpoint): (WI.DOMDebuggerManager.prototype.removeEventBreakpoint.breakpointRemoved): Added. (WI.DOMDebuggerManager.prototype.removeEventBreakpoint): (WI.DOMDebuggerManager.prototype._updateEventBreakpoint): (WI.DOMDebuggerManager.prototype.eventBreakpointForEventName): Deleted. * UserInterface/Controllers/DOMTreeManager.js: (WI.DOMTreeManager.prototype.setBreakpointForEventListener): * UserInterface/Controllers/DebuggerManager.js: (WI.DebuggerManager.prototype._pauseReasonFromPayload): * UserInterface/Models/EventBreakpoint.js: (WI.EventBreakpoint): (WI.EventBreakpoint.fromPayload): (WI.EventBreakpoint.prototype.get type): Added. (WI.EventBreakpoint.prototype.get serializableInfo): (WI.EventBreakpoint.prototype.saveIdentityToCookie): * UserInterface/Views/DebuggerSidebarPanel.js: (WI.DebuggerSidebarPanel.prototype._updatePauseReasonSection): (WI.DebuggerSidebarPanel.prototype.willDismissPopover): * UserInterface/Views/EventBreakpointPopover.js: (WI.EventBreakpointPopover): (WI.EventBreakpointPopover.prototype.get breakpoint): Added. (WI.EventBreakpointPopover.prototype.show): (WI.EventBreakpointPopover.prototype.show.createOption): Added. (WI.EventBreakpointPopover.prototype.dismiss): Added. (WI.EventBreakpointPopover.prototype._presentOverTargetElement): (WI.EventBreakpointPopover.prototype._handleTypeSelectChange): Added. (WI.EventBreakpointPopover.prototype.get result): Deleted. (WI.EventBreakpointPopover.prototype.get value): Deleted. * UserInterface/Views/EventBreakpointPopover.css: (.popover .event-breakpoint-content > .event-type): Added. (.popover .event-breakpoint-content > input): Deleted. * UserInterface/Views/EventBreakpointTreeElement.js: (WI.EventBreakpointTreeElement): * UserInterface/Views/EventBreakpointTreeElement.css: (.breakpoint.event.animation-frame:not(.breakpoint-paused-icon) .icon): Added. (.breakpoint.event.listener:not(.breakpoint-paused-icon) .icon): Added. (.breakpoint.event.timer:not(.breakpoint-paused-icon) .icon): Added. (.breakpoint.event:not(.breakpoint-paused-icon) .icon): Deleted. LayoutTests: * inspector/dom-debugger/event-animation-frame-breakpoints-expected.txt: Added. * inspector/dom-debugger/event-animation-frame-breakpoints.html: Added. * inspector/dom-debugger/event-breakpoint-with-navigation.html: * inspector/dom-debugger/event-timer-breakpoints-expected.txt: Added. * inspector/dom-debugger/event-timer-breakpoints.html: Added. * inspector/dom-debugger/event-listener-breakpoints-expected.txt: Renamed from LayoutTests/inspector/dom-debugger/event-breakpoints-expected.txt. * inspector/dom-debugger/event-listener-breakpoints.html: Renamed from LayoutTests/inspector/dom-debugger/event-breakpoints.html. * inspector/dom-debugger/resources/event-breakpoint-utilities.js: Added. (TestPage.registerInitializer.window.teardown): (TestPage.registerInitializer.window.failOnPause): (TestPage.registerInitializer.window.addBreakpoint): (TestPage.registerInitializer.window.removeBreakpoint): (TestPage.registerInitializer.window.disableBreakpoint): (TestPage.registerInitializer.window.awaitEvent): Canonical link: https://commits.webkit.org/203952@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@235248 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2018-08-23 21:36:40 +00:00
});
Web Inspector: allow event breakpoints to be configured https://bugs.webkit.org/show_bug.cgi?id=215362 <rdar://problem/66932921> Reviewed by Brian Burg. Source/JavaScriptCore: This allows developers to do things like: - only pause when `window.event.type` is a certain value - ignore the first N pauses - evaluate JavaScript whenever an event listener is invoked without pausing * inspector/protocol/DOM.json: Add an `options` paramater to `DOM.setBreakpointForEventListener` to allow configuration. * inspector/protocol/DOMDebugger.json: Add an `options` paramater to `DOMDebugger.setEventBreakpoint` to allow configuration. * debugger/Breakpoint.h: (JSC::Breakpoint::id const): Added. (JSC::Breakpoint::sourceID const): Added. (JSC::Breakpoint::lineNumber const): Added. (JSC::Breakpoint::columnNumber const): Added. (JSC::Breakpoint::condition const): Added. (JSC::Breakpoint::actions const): Added. (JSC::Breakpoint::isAutoContinue const): Added. (JSC::Breakpoint::resetHitCount): Added. (JSC::Breakpoint::isLinked const): Added. (JSC::Breakpoint::isResolved const): Added. (JSC::BreakpointsList::~BreakpointsList): Deleted. * debugger/Breakpoint.cpp: Added. (JSC::Breakpoint::Action::Action): Added. (JSC::Breakpoint::create): Added. (JSC::Breakpoint::Breakpoint): Added. (JSC::Breakpoint::link): Added. (JSC::Breakpoint::resolve): Added. (JSC::Breakpoint::shouldPause): Added. Unify `JSC::Breakpoint` and `Inspector::ScriptBreakpoint`. * debugger/DebuggerPrimitives.h: * debugger/Debugger.h: * debugger/Debugger.cpp: (JSC::Debugger::Debugger): (JSC::Debugger::addObserver): Added. (JSC::Debugger::removeObserver): Added. (JSC::Debugger::canDispatchFunctionToObservers const): Added. (JSC::Debugger::dispatchFunctionToObservers): Added. (JSC::Debugger::sourceParsed): Added. (JSC::Debugger::toggleBreakpoint): (JSC::Debugger::applyBreakpoints): (JSC::Debugger::resolveBreakpoint): (JSC::Debugger::setBreakpoint): (JSC::Debugger::removeBreakpoint): (JSC::Debugger::didHitBreakpoint): Added. (JSC::Debugger::clearBreakpoints): (JSC::Debugger::evaluateBreakpointCondition): Added. (JSC::Debugger::evaluateBreakpointActions): Added. (JSC::Debugger::schedulePauseAtNextOpportunity): Added. (JSC::Debugger::cancelPauseAtNextOpportunity): Added. (JSC::Debugger::schedulePauseForSpecialBreakpoint): Added. (JSC::Debugger::cancelPauseForSpecialBreakpoint): Added. (JSC::Debugger::continueProgram): (JSC::Debugger::stepNextExpression): (JSC::Debugger::stepIntoStatement): (JSC::Debugger::stepOverStatement): (JSC::Debugger::stepOutOfFunction): (JSC::Debugger::pauseIfNeeded): (JSC::Debugger::handlePause): Added. (JSC::Debugger::exceptionOrCaughtValue): Added. (JSC::Debugger::atExpression): (JSC::Debugger::clearNextPauseState): (JSC::Debugger::willRunMicrotask): Added. (JSC::Debugger::didRunMicrotask): Added. (JSC::Debugger::hasBreakpoint): Deleted. (JSC::Debugger::setPauseOnNextStatement): Deleted. Unify `JSC::Debugger` and `Inspector::ScriptDebugServer` to simplify breakpoint logic. Introduce the concept of a "special breakpoint", which is essentially a `JSC::Breakpoint` that is expected to pause at the next opportunity but isn't tied to a particular location. As an example, whenever an event breakpoint is hit, instead of just pausing at the next opportunity, the newly managed `JSC::Breakpoint` is used as a "special breakpoint", allowing for it's configuration (ie.g. condition, ignore count, actions, auto-continue) to be used. * inspector/agents/InspectorDebuggerAgent.h: * inspector/agents/InspectorDebuggerAgent.cpp: (Inspector::objectGroupForBreakpointAction): (Inspector::breakpointActionTypeForString): Added. (Inspector::parseBreakpointOptions): Added. (Inspector::InspectorDebuggerAgent::ProtocolBreakpoint::fromPayload): Added. (Inspector::InspectorDebuggerAgent::ProtocolBreakpoint::ProtocolBreakpoint): Added. (Inspector::InspectorDebuggerAgent::ProtocolBreakpoint::createDebuggerBreakpoint const): Added. (Inspector::InspectorDebuggerAgent::ProtocolBreakpoint::matchesScriptURL const): Added. (Inspector::InspectorDebuggerAgent::debuggerBreakpointFromPayload): Added. (Inspector::InspectorDebuggerAgent::enable): (Inspector::InspectorDebuggerAgent::disable): (Inspector::InspectorDebuggerAgent::buildBreakpointPauseReason): (Inspector::InspectorDebuggerAgent::handleConsoleAssert): (Inspector::InspectorDebuggerAgent::didScheduleAsyncCall): (Inspector::buildDebuggerLocation): (Inspector::InspectorDebuggerAgent::setBreakpointByUrl): (Inspector::InspectorDebuggerAgent::setBreakpoint): (Inspector::InspectorDebuggerAgent::didSetBreakpoint): (Inspector::InspectorDebuggerAgent::resolveBreakpoint): (Inspector::InspectorDebuggerAgent::removeBreakpoint): (Inspector::InspectorDebuggerAgent::continueToLocation): (Inspector::InspectorDebuggerAgent::schedulePauseAtNextOpportunity): Added. (Inspector::InspectorDebuggerAgent::cancelPauseAtNextOpportunity): Added. (Inspector::InspectorDebuggerAgent::schedulePauseForSpecialBreakpoint): Added. (Inspector::InspectorDebuggerAgent::cancelPauseForSpecialBreakpoint): Added. (Inspector::InspectorDebuggerAgent::pause): (Inspector::InspectorDebuggerAgent::resume): (Inspector::InspectorDebuggerAgent::didBecomeIdle): (Inspector::InspectorDebuggerAgent::sourceMapURLForScript): (Inspector::InspectorDebuggerAgent::didParseSource): (Inspector::InspectorDebuggerAgent::willRunMicrotask): (Inspector::InspectorDebuggerAgent::didRunMicrotask): (Inspector::InspectorDebuggerAgent::didPause): (Inspector::InspectorDebuggerAgent::breakpointActionSound): (Inspector::InspectorDebuggerAgent::breakpointActionProbe): (Inspector::InspectorDebuggerAgent::clearInspectorBreakpointState): (Inspector::InspectorDebuggerAgent::clearDebuggerBreakpointState): (Inspector::matches): Deleted. (Inspector::buildObjectForBreakpointCookie): Deleted. (Inspector::InspectorDebuggerAgent::breakpointActionsFromProtocol): Deleted. (Inspector::InspectorDebuggerAgent::schedulePauseOnNextStatement): Deleted. (Inspector::InspectorDebuggerAgent::cancelPauseOnNextStatement): Deleted. Create a private `ProtocolBreakpoint` class that holds the data sent by the frontend. This is necessary because breakpoints in the frontend have a potentially one-to-many relationship with breakpoints in the backend, as the same script can be loaded many times on a page. Each of those scripts is independent, however, and can execute differently, meaning that the same breakpoint for each script also needs a different state (e.g. ignore count). As such, the `ProtocolBreakpoint` is effectively a template that is actualized whenever a new script is parsed that matches the URL of the `ProtocolBreakpoint` to create a `JSC::Breakpoint` that is used by the `JSC::Debugger`. `ProtocolBreakpoint` also parses breakpoint configurations. * inspector/InspectorEnvironment.h: * inspector/JSGlobalObjectScriptDebugServer.h: * inspector/JSGlobalObjectScriptDebugServer.cpp: (Inspector::JSGlobalObjectScriptDebugServer::JSGlobalObjectScriptDebugServer): (Inspector::JSGlobalObjectScriptDebugServer::attachDebugger): (Inspector::JSGlobalObjectScriptDebugServer::detachDebugger): (Inspector::JSGlobalObjectScriptDebugServer::runEventLoopWhilePaused): * inspector/agents/InspectorAuditAgent.h: * inspector/agents/InspectorAuditAgent.cpp: (Inspector::InspectorAuditAgent::run): * inspector/agents/InspectorRuntimeAgent.h: * inspector/agents/InspectorRuntimeAgent.cpp: (Inspector::setPauseOnExceptionsState): (Inspector::InspectorRuntimeAgent::evaluate): (Inspector::InspectorRuntimeAgent::callFunctionOn): (Inspector::InspectorRuntimeAgent::getPreview): (Inspector::InspectorRuntimeAgent::getProperties): (Inspector::InspectorRuntimeAgent::getDisplayableProperties): * inspector/agents/InspectorScriptProfilerAgent.cpp: * inspector/agents/JSGlobalObjectDebuggerAgent.h: Replace `Inspector::ScriptDebugServer` with `JSC::Debugger`. * runtime/JSMicrotask.cpp: (JSC::JSMicrotask::run): Drive-by: r248894 mistakenly omitted the call to notify the debugger that the microtask ran. * inspector/ScriptBreakpoint.h: Removed. * inspector/ScriptDebugListener.h: Removed. * inspector/ScriptDebugServer.h: Removed. * inspector/ScriptDebugServer.cpp: Removed. * CMakeLists.txt: * JavaScriptCore.xcodeproj/project.pbxproj: * Sources.txt: Source/WebCore: This allows developers to do things like: - only pause when `window.event.type` is a certain value - ignore the first N pauses - evaluate JavaScript whenever an event listener is invoked without pausing Tests: inspector/dom/breakpoint-for-event-listener.html inspector/dom-debugger/event-animation-frame-breakpoints.html inspector/dom-debugger/event-interval-breakpoints.html inspector/dom-debugger/event-listener-breakpoints.html inspector/dom-debugger/event-timeout-breakpoints.html * inspector/agents/InspectorDOMAgent.h: * inspector/agents/InspectorDOMAgent.cpp: (WebCore::InspectorDOMAgent::getEventListenersForNode): (WebCore::InspectorDOMAgent::setBreakpointForEventListener): (WebCore::InspectorDOMAgent::removeBreakpointForEventListener): (WebCore::InspectorDOMAgent::buildObjectForEventListener): (WebCore::InspectorDOMAgent::breakpointForEventListener): (WebCore::InspectorDOMAgent::hasBreakpointForEventListener): Deleted. * inspector/agents/InspectorDOMDebuggerAgent.h: * inspector/agents/InspectorDOMDebuggerAgent.cpp: (WebCore::InspectorDOMDebuggerAgent::disable): (WebCore::InspectorDOMDebuggerAgent::mainFrameNavigated): (WebCore::InspectorDOMDebuggerAgent::setEventBreakpoint): (WebCore::InspectorDOMDebuggerAgent::removeEventBreakpoint): (WebCore::InspectorDOMDebuggerAgent::willHandleEvent): (WebCore::InspectorDOMDebuggerAgent::didHandleEvent): (WebCore::InspectorDOMDebuggerAgent::willFireTimer): (WebCore::InspectorDOMDebuggerAgent::didFireTimer): * inspector/agents/page/PageDOMDebuggerAgent.h: * inspector/agents/page/PageDOMDebuggerAgent.cpp: (WebCore::PageDOMDebuggerAgent::disable): (WebCore::PageDOMDebuggerAgent::mainFrameNavigated): (WebCore::PageDOMDebuggerAgent::willFireAnimationFrame): (WebCore::PageDOMDebuggerAgent::didFireAnimationFrame): (WebCore::PageDOMDebuggerAgent::setAnimationFrameBreakpoint): * inspector/agents/worker/WorkerDOMDebuggerAgent.h: * inspector/agents/worker/WorkerDOMDebuggerAgent.cpp: (WebCore::WorkerDOMDebuggerAgent::setAnimationFrameBreakpoint): Keep a `JSC::Breakpoint` for each event breakpoint instead of a simple `bool`, allowing for configuration when the breakpoint is first set. When any of these breakpoints are hit, pass it to the `JSC::Debugger` as a "special breakpoint", which behaves the same as "pause ASAP" but also supports a condition, an ignore count, actions, and auto-continue. Reset the hit count for any of these "special breakpoints" that persist across Web Inspector sessions when the main frame navigates. * inspector/PageScriptDebugServer.h: * inspector/PageScriptDebugServer.cpp: (WebCore::PageScriptDebugServer::PageScriptDebugServer): (WebCore::PageScriptDebugServer::attachDebugger): (WebCore::PageScriptDebugServer::detachDebugger): (WebCore::PageScriptDebugServer::didPause): (WebCore::PageScriptDebugServer::didContinue): (WebCore::PageScriptDebugServer::runEventLoopWhilePaused): (WebCore::PageScriptDebugServer::runEventLoopWhilePausedInternal): (WebCore::PageScriptDebugServer::isContentScript const): (WebCore::PageScriptDebugServer::reportException const): * inspector/WorkerScriptDebugServer.h: * inspector/WorkerScriptDebugServer.cpp: (WebCore::WorkerScriptDebugServer::WorkerScriptDebugServer): (WebCore::WorkerScriptDebugServer::attachDebugger): (WebCore::WorkerScriptDebugServer::detachDebugger): (WebCore::WorkerScriptDebugServer::runEventLoopWhilePaused): (WebCore::WorkerScriptDebugServer::reportException const): * inspector/agents/page/PageDebuggerAgent.h: * inspector/agents/page/PageDebuggerAgent.cpp: (WebCore::PageDebuggerAgent::sourceMapURLForScript): Replace `Inspector::ScriptDebugServer` with `JSC::Debugger`. * inspector/TimelineRecordFactory.h: * inspector/TimelineRecordFactory.cpp: (WebCore::TimelineRecordFactory::createProbeSampleData): * inspector/agents/InspectorTimelineAgent.h: * inspector/agents/InspectorTimelineAgent.cpp: (WebCore::InspectorTimelineAgent::internalStart): (WebCore::InspectorTimelineAgent::internalStop): (WebCore::InspectorTimelineAgent::breakpointActionProbe): Replace `Inspector::ScriptBreakpoint` with `JSC::Breakpoint`. * inspector/InspectorInstrumentation.h: (WebCore::InspectorInstrumentation::didHandleEvent): (WebCore::InspectorInstrumentation::didFireTimer): * inspector/InspectorInstrumentation.cpp: (WebCore::InspectorInstrumentation::didHandleEventImpl): (WebCore::InspectorInstrumentation::didFireTimerImpl): (WebCore::InspectorInstrumentation::didCommitLoadImpl): (WebCore::InspectorInstrumentation::didFireAnimationFrameImpl): * dom/EventTarget.cpp: (WebCore::EventTarget::innerInvokeEventListeners): * page/DOMTimer.cpp: (WebCore::DOMTimer::fired): When notifying Web Inspector that activity did occur, include all information previously included when notifying Web Inspector that that activity was about to occur so that Web Inspector can know whether a pause for the "special breakpoint" for that activity is still scheduled and if so cancel it. Source/WebInspectorUI: This allows developers to do things like: - only pause when `window.event.type` is a certain value - ignore the first N pauses - evaluate JavaScript whenever an event listener is invoked without pausing * UserInterface/Models/Breakpoint.js: (WI.Breakpoint): (WI.Breakpoint.prototype.toJSON): (WI.Breakpoint.prototype.get special): Added. (WI.Breakpoint.prototype.get removable): Added. (WI.Breakpoint.prototype.get editable): Added. (WI.Breakpoint.prototype.set condition): (WI.Breakpoint.prototype.get ignoreCount): (WI.Breakpoint.prototype.set ignoreCount): (WI.Breakpoint.prototype.get autoContinue): (WI.Breakpoint.prototype.set autoContinue): (WI.Breakpoint.prototype.get actions): (WI.Breakpoint.prototype.get probeActions): (WI.Breakpoint.prototype.cycleToNextMode): (WI.Breakpoint.prototype.createAction): (WI.Breakpoint.prototype.recreateAction): (WI.Breakpoint.prototype.removeAction): (WI.Breakpoint.prototype.clearActions): (WI.Breakpoint.prototype.remove): Added. (WI.Breakpoint.prototype.optionsToProtocol): Added. (WI.Breakpoint.prototype.breakpointActionDidChange): (WI.Breakpoint.fromJSON): Deleted. (WI.Breakpoint.prototype.get sourceCodeLocation): Deleted. (WI.Breakpoint.prototype.get contentIdentifier): Deleted. (WI.Breakpoint.prototype.get scriptIdentifier): Deleted. (WI.Breakpoint.prototype.get target): Deleted. (WI.Breakpoint.prototype.get identifier): Deleted. (WI.Breakpoint.prototype.set identifier): Deleted. (WI.Breakpoint.prototype.get resolved): Deleted. (WI.Breakpoint.prototype.set resolved): Deleted. (WI.Breakpoint.prototype.saveIdentityToCookie): Deleted. (WI.Breakpoint.prototype._isSpecial): Deleted. (WI.Breakpoint.prototype._sourceCodeLocationLocationChanged): Deleted. (WI.Breakpoint.prototype._sourceCodeLocationDisplayLocationChanged): Deleted. * UserInterface/Models/DOMBreakpoint.js: (WI.DOMBreakpoint): (WI.DOMBreakpoint.fromJSON): Added. (WI.DOMBreakpoint.prototype.remove): Added. (WI.DOMBreakpoint.prototype.toJSON): (WI.DOMBreakpoint.deserialize): Deleted. (WI.DOMBreakpoint.prototype.get disabled): Deleted. (WI.DOMBreakpoint.prototype.set disabled): Deleted. * UserInterface/Models/EventBreakpoint.js: (WI.EventBreakpoint): (WI.EventBreakpoint.fromJSON): Added. (WI.EventBreakpoint.prototype.get special): Added. (WI.EventBreakpoint.prototype.get editable): Added. (WI.EventBreakpoint.prototype.remove): Added. (WI.EventBreakpoint.prototype.saveIdentityToCookie): (WI.EventBreakpoint.prototype.toJSON): (WI.EventBreakpoint.deserialize): Deleted. (WI.EventBreakpoint.prototype.get disabled): Deleted. (WI.EventBreakpoint.prototype.set disabled): Deleted. * UserInterface/Models/JavaScriptBreakpoint.js: Copied from UserInterface/Models/Breakpoint.js. (WI.JavaScriptBreakpoint): (WI.JavaScriptBreakpoint.fromJSON): (WI.JavaScriptBreakpoint.prototype.toJSON): (WI.JavaScriptBreakpoint.prototype.get sourceCodeLocation): (WI.JavaScriptBreakpoint.prototype.get contentIdentifier): (WI.JavaScriptBreakpoint.prototype.get scriptIdentifier): (WI.JavaScriptBreakpoint.prototype.get target): (WI.JavaScriptBreakpoint.prototype.get special): Added. (WI.JavaScriptBreakpoint.prototype.get removable): Added. (WI.JavaScriptBreakpoint.prototype.get editable): Added. (WI.JavaScriptBreakpoint.prototype.get identifier): (WI.JavaScriptBreakpoint.prototype.set identifier): (WI.JavaScriptBreakpoint.prototype.get resolved): (WI.JavaScriptBreakpoint.prototype.set resolved): (WI.JavaScriptBreakpoint.prototype.remove): Added. (WI.JavaScriptBreakpoint.prototype.saveIdentityToCookie): (WI.JavaScriptBreakpoint.prototype._isSpecial): (WI.JavaScriptBreakpoint.prototype._sourceCodeLocationLocationChanged): (WI.JavaScriptBreakpoint.prototype._sourceCodeLocationDisplayLocationChanged): * UserInterface/Models/URLBreakpoint.js: (WI.URLBreakpoint): (WI.URLBreakpoint.fromJSON): Added. (WI.URLBreakpoint.prototype.get special): Added. (WI.URLBreakpoint.prototype.remove): Added. (WI.URLBreakpoint.prototype.toJSON): (WI.URLBreakpoint.deserialize): Deleted. (WI.URLBreakpoint.prototype.get disabled): Deleted. (WI.URLBreakpoint.prototype.set disabled): Deleted. Rename `WI.Breakpoint` to `WI.JavaScriptBreakpoint` and use `WI.Breakpoint` as a new common base class for all breakpoint types, allowing more logic to be shared (e.g. disabled state). Additionally, breakpoints are now able to - determine whether or not they're - special - removable - editable (i.e. configurable) - remove themselves without the caller needing to know what manager to consult with. * UserInterface/Controllers/DOMManager.js: (WI.DOMManager): (WI.DOMManager.supportsEventListenerBreakpointConfiguration): Added. (WI.DOMManager.prototype.setBreakpointForEventListener): (WI.DOMManager.prototype.removeBreakpointForEventListener): (WI.DOMManager.prototype._setEventBreakpoint): Added. (WI.DOMManager.prototype._removeEventBreakpoint): Added. (WI.DOMManager.prototype._handleEventBreakpointEditablePropertyChanged): Added. (WI.DOMManager.prototype._handleEventBreakpointActionsChanged): Added. (WI.DOMManager.prototype._updateEventBreakpoint): Deleted. Keep track of configuration changes for specific listener breakpoints. * UserInterface/Controllers/DOMDebuggerManager.js: (WI.DOMDebuggerManager): (WI.DOMDebuggerManager.prototype.initializeTarget): (WI.DOMDebuggerManager.prototype.addDOMBreakpoint): (WI.DOMDebuggerManager.prototype.removeDOMBreakpoint): (WI.DOMDebuggerManager.prototype.addEventBreakpoint): (WI.DOMDebuggerManager.prototype.removeEventBreakpoint): (WI.DOMDebuggerManager.prototype.addURLBreakpoint): (WI.DOMDebuggerManager.prototype.removeURLBreakpoint): (WI.DOMDebuggerManager.prototype._commandArgumentsForEventBreakpoint): Added. (WI.DOMDebuggerManager.prototype._setEventBreakpoint): Added. (WI.DOMDebuggerManager.prototype._removeEventBreakpoint): Added. (WI.DOMDebuggerManager.prototype._handleEventBreakpointDisabledStateChanged): Added. (WI.DOMDebuggerManager.prototype._handleEventBreakpointEditablePropertyChanged): Added. (WI.DOMDebuggerManager.prototype._handleEventBreakpointActionsChanged): Added. (WI.DOMDebuggerManager.prototype.isBreakpointSpecial): Deleted. (WI.DOMDebuggerManager.prototype._updateEventBreakpoint): Deleted. Keep track of configuration changes for special event breakpoints. Store special event breakpoints inside `WI.objectStores.eventBreakpoints`. * UserInterface/Controllers/DebuggerManager.js: (WI.DebuggerManager): (WI.DebuggerManager.prototype.addBreakpoint): (WI.DebuggerManager.prototype.removeBreakpoint): (WI.DebuggerManager.prototype.addProbesForBreakpoint): Added. (WI.DebuggerManager.prototype.removeProbesForBreakpoint): Added. (WI.DebuggerManager.prototype.updateProbesForBreakpoint): Added. (WI.DebuggerManager.prototype._setBreakpoint): (WI.DebuggerManager.prototype._breakpointEditablePropertyDidChange): (WI.DebuggerManager.prototype._handleBreakpointActionsDidChange): (WI.DebuggerManager.prototype.isBreakpointRemovable): Deleted. (WI.DebuggerManager.prototype.isBreakpointSpecial): Deleted. (WI.DebuggerManager.prototype.isBreakpointEditable): Deleted. (WI.DebuggerManager.prototype._debuggerBreakpointActionType): Deleted. (WI.DebuggerManager.prototype._debuggerBreakpointOptions): Deleted. (WI.DebuggerManager.prototype._addProbesForBreakpoint): Deleted. (WI.DebuggerManager.prototype._removeProbesForBreakpoint): Deleted. (WI.DebuggerManager.prototype._updateProbesForBreakpoint): Deleted. Replace `WI.Breakpoint` with `WI.JavaScriptBreakpoint`. Probes now support `WI.EventBreakpoint` in addition to `WI.JavaScriptBreakpoint`. * UserInterface/Controllers/BreakpointPopoverController.js: (WI.BreakpointPopoverController.prototype.appendContextMenuItems): (WI.BreakpointPopoverController.prototype._createPopoverContent): Allow any breakpoint instead of only `WI.JavaScriptBreakpoint`. Drive-by: the existing `ignoreCount` value wasn't being used to populate the `<input>`. * UserInterface/Views/BreakpointTreeElement.js: (WI.BreakpointTreeElement.prototype.ondelete): (WI.BreakpointTreeElement.prototype.get listenerSet): Added. (WI.BreakpointTreeElement.prototype.updateStatus): Added. (WI.BreakpointTreeElement.prototype.updateTitles): Added. (WI.BreakpointTreeElement.prototype.get breakpoint): Deleted. (WI.BreakpointTreeElement.prototype.get filterableData): Deleted. (WI.BreakpointTreeElement.prototype._updateTitles): Deleted. (WI.BreakpointTreeElement.prototype._updateStatus): Deleted. (WI.BreakpointTreeElement.prototype._breakpointLocationDidChange): Deleted. * UserInterface/Views/BreakpointTreeElement.css: (.item.breakpoint .status > .status-image): (.item.breakpoint.paused .icon): Added. (@media (prefers-color-scheme: dark) .item.breakpoint.paused .icon): Added. (.item.breakpoint .status > .status-image.resolved): Deleted. (body:not(.window-inactive, .window-docked-inactive) .tree-outline:focus-within .item.breakpoint.selected .status > .status-image.resolved): Deleted. (.item.breakpoint .subtitle.formatted-location): Deleted. (.breakpoint-debugger-statement-icon .icon): Deleted. (.breakpoint-exception-icon .icon): Deleted. (.breakpoint-assertion-icon .icon): Deleted. (.breakpoint-microtask-icon .icon): Deleted. (.breakpoint-paused-icon .icon): Deleted. (.breakpoint-generic-line-icon .icon): Deleted. (.breakpoint-generic-line-icon .icon > span): Deleted. (.data-updated.breakpoint-generic-line-icon .icon > span): Deleted. (@media (prefers-color-scheme: dark) .breakpoint-debugger-statement-icon .icon): Deleted. (@media (prefers-color-scheme: dark) .breakpoint-exception-icon .icon): Deleted. (@media (prefers-color-scheme: dark) .breakpoint-assertion-icon .icon): Deleted. (@media (prefers-color-scheme: dark) .breakpoint-microtask-icon .icon): Deleted. (@media (prefers-color-scheme: dark) .breakpoint-paused-icon .icon): Deleted. (@media (prefers-color-scheme: dark) .breakpoint-generic-line-icon .icon): Deleted. * UserInterface/Views/DOMBreakpointTreeElement.js: (WI.DOMBreakpointTreeElement): (WI.DOMBreakpointTreeElement.prototype.onattach): Deleted. (WI.DOMBreakpointTreeElement.prototype.ondetach): Deleted. (WI.DOMBreakpointTreeElement.prototype.ondelete): Deleted. (WI.DOMBreakpointTreeElement.prototype.onenter): Deleted. (WI.DOMBreakpointTreeElement.prototype.onspace): Deleted. (WI.DOMBreakpointTreeElement.prototype.populateContextMenu): Deleted. (WI.DOMBreakpointTreeElement.prototype._statusImageElementClicked): Deleted. (WI.DOMBreakpointTreeElement.prototype._statusImageElementFocused): Deleted. (WI.DOMBreakpointTreeElement.prototype._statusImageElementMouseDown): Deleted. (WI.DOMBreakpointTreeElement.prototype._toggleBreakpoint): Deleted. (WI.DOMBreakpointTreeElement.prototype._updateStatus): Deleted. * UserInterface/Views/DOMBreakpointTreeElement.css: (.item.breakpoint.dom.subtree-modified:not(.paused) .icon): Added. (.item.breakpoint.dom.attribute-modified:not(.paused) .icon): Added. (.item.breakpoint.dom.node-removed:not(.paused) .icon): Added. (@media (prefers-color-scheme: dark) .item.breakpoint.dom.subtree-modified:not(.paused) .icon): Added. (@media (prefers-color-scheme: dark) .item.breakpoint.dom.attribute-modified:not(.paused) .icon): Added. (@media (prefers-color-scheme: dark) .item.breakpoint.dom.node-removed:not(.paused) .icon): Added. (.breakpoint.dom.breakpoint-for-subtree-modified:not(.breakpoint-paused-icon) .icon): Deleted. (.breakpoint.dom.breakpoint-for-attribute-modified:not(.breakpoint-paused-icon) .icon): Deleted. (.breakpoint.dom.breakpoint-for-node-removed:not(.breakpoint-paused-icon) .icon): Deleted. (@media (prefers-color-scheme: dark) .breakpoint.dom.breakpoint-for-subtree-modified:not(.breakpoint-paused-icon) .icon): Deleted. (@media (prefers-color-scheme: dark) .breakpoint.dom.breakpoint-for-attribute-modified:not(.breakpoint-paused-icon) .icon): Deleted. (@media (prefers-color-scheme: dark) .breakpoint.dom.breakpoint-for-node-removed:not(.breakpoint-paused-icon) .icon): Deleted. * UserInterface/Views/EventBreakpointTreeElement.js: (WI.EventBreakpointTreeElement): (WI.EventBreakpointTreeElement.prototype.onattach): Deleted. (WI.EventBreakpointTreeElement.prototype.ondetach): Deleted. (WI.EventBreakpointTreeElement.prototype.ondelete): Deleted. (WI.EventBreakpointTreeElement.prototype.onenter): Deleted. (WI.EventBreakpointTreeElement.prototype.onspace): Deleted. (WI.EventBreakpointTreeElement.prototype.populateContextMenu): Deleted. (WI.EventBreakpointTreeElement.prototype._statusImageElementClicked): Deleted. (WI.EventBreakpointTreeElement.prototype._statusImageElementFocused): Deleted. (WI.EventBreakpointTreeElement.prototype._statusImageElementMouseDown): Deleted. (WI.EventBreakpointTreeElement.prototype._toggleBreakpoint): Deleted. (WI.EventBreakpointTreeElement.prototype._updateStatus): Deleted. * UserInterface/Views/EventBreakpointTreeElement.css: (.item.breakpoint.event.animation-frame:not(.paused) .icon): Added. (.item.breakpoint.event.interval:not(.paused) .icon): Added. (.item.breakpoint.event.listener:not(.paused) .icon): Added. (.item.breakpoint.event.timeout:not(.paused) .icon): Added. (@media(prefers-color-scheme: dark) .item.breakpoint.event.animation-frame:not(.paused) .icon): Added. (@media(prefers-color-scheme: dark) .item.breakpoint.event.interval:not(.paused) .icon): Added. (@media(prefers-color-scheme: dark) .item.breakpoint.event.listener:not(.paused) .icon): Added. (@media(prefers-color-scheme: dark) .item.breakpoint.event.timeout:not(.paused) .icon): Added. (.breakpoint.event.breakpoint-for-animation-frame:not(.breakpoint-paused-icon) .icon): Deleted. (.breakpoint.event.breakpoint-for-interval:not(.breakpoint-paused-icon) .icon): Deleted. (.breakpoint.event.breakpoint-for-listener:not(.breakpoint-paused-icon) .icon): Deleted. (.breakpoint.event.breakpoint-for-timeout:not(.breakpoint-paused-icon) .icon): Deleted. (@media(prefers-color-scheme: dark) .breakpoint.event.breakpoint-for-animation-frame:not(.breakpoint-paused-icon) .icon): Deleted. (@media(prefers-color-scheme: dark) .breakpoint.event.breakpoint-for-interval:not(.breakpoint-paused-icon) .icon): Deleted. (@media(prefers-color-scheme: dark) .breakpoint.event.breakpoint-for-listener:not(.breakpoint-paused-icon) .icon): Deleted. (@media(prefers-color-scheme: dark) .breakpoint.event.breakpoint-for-timeout:not(.breakpoint-paused-icon) .icon): Deleted. * UserInterface/Views/JavaScriptBreakpointTreeElement.js: Copied from Source/WebInspectorUI/UserInterface/Views/BreakpointTreeElement.js. (WI.JavaScriptBreakpointTreeElement): (WI.JavaScriptBreakpointTreeElement.prototype.get filterableData): (WI.JavaScriptBreakpointTreeElement.prototype.updateStatus): Added. (WI.JavaScriptBreakpointTreeElement.prototype.updateTitles): Added. (WI.JavaScriptBreakpointTreeElement.prototype._breakpointLocationDidChange): * UserInterface/Views/JavaScriptBreakpointTreeElement.css: Copied from Source/WebInspectorUI/UserInterface/Views/BreakpointTreeElement.css. (.item.breakpoint.javascript .status > .status-image): Added. (.item.breakpoint.javascript .status > .status-image.resolved): Added. (body:not(.window-inactive, .window-docked-inactive) .tree-outline:focus-within .item.breakpoint.javascript.selected .status > .status-image.resolved): Added. (.item.breakpoint.javascript .subtitle.formatted-location): Added. (.item.breakpoint.javascript.line .icon): Added. (.item.breakpoint.javascript.line .icon > span): Added. (.data-updated.item.breakpoint.javascript.line .icon > span): Added. (.item.breakpoint.javascript.debugger-statement .icon): Added. (.item.breakpoint.javascript.exception .icon): Added. (.item.breakpoint.javascript.assertion .icon): Added. (.item.breakpoint.javascript.microtask .icon): Added. (@media (prefers-color-scheme: dark) .item.breakpoint.javascript.line .icon): Added. (@media (prefers-color-scheme: dark) .item.breakpoint.javascript.debugger-statement .icon): Added. (@media (prefers-color-scheme: dark) .item.breakpoint.javascript.exception .icon): Added. (@media (prefers-color-scheme: dark) .item.breakpoint.javascript.assertion .icon): Added. (@media (prefers-color-scheme: dark) .item.breakpoint.javascript.microtask .icon): Added. * UserInterface/Views/URLBreakpointTreeElement.js: (WI.URLBreakpointTreeElement): (WI.URLBreakpointTreeElement.prototype.onattach): Deleted. (WI.URLBreakpointTreeElement.prototype.ondetach): Deleted. (WI.URLBreakpointTreeElement.prototype.ondelete): Deleted. (WI.URLBreakpointTreeElement.prototype.onenter): Deleted. (WI.URLBreakpointTreeElement.prototype.onspace): Deleted. (WI.URLBreakpointTreeElement.prototype.populateContextMenu): Deleted. (WI.URLBreakpointTreeElement.prototype._statusImageElementClicked): Deleted. (WI.URLBreakpointTreeElement.prototype._statusImageElementFocused): Deleted. (WI.URLBreakpointTreeElement.prototype._statusImageElementMouseDown): Deleted. (WI.URLBreakpointTreeElement.prototype._toggleBreakpoint): Deleted. (WI.URLBreakpointTreeElement.prototype._updateStatus): Deleted. * UserInterface/Views/URLBreakpointTreeElement.css: (.item.breakpoint.url .subtitle): Added. (.item.breakpoint.url:not(.paused) .icon): Added. (@media (prefers-color-scheme: dark) .item.breakpoint.url:not(.paused) .icon): Added. (.breakpoint.url .subtitle): Deleted. (.breakpoint.url:not(.breakpoint-paused-icon) .icon): Deleted. (@media (prefers-color-scheme: dark) .breakpoint.url:not(.breakpoint-paused-icon) .icon): Deleted. Rename `WI.BreakpointTreeElement` to `WI.JavaScriptBreakpointTreeElement` and use `WI.BreakpointTreeElement` as a new common base class for all breakpoint tree elements, allowing more logic and styles to be shared (e.g. disabled state). * UserInterface/Views/SourcesNavigationSidebarPanel.js: (WI.SourcesNavigationSidebarPanel): (WI.SourcesNavigationSidebarPanel.prototype.closed): (WI.SourcesNavigationSidebarPanel.prototype._insertDebuggerTreeElement): (WI.SourcesNavigationSidebarPanel.prototype._compareJavaScriptBreakpointTreeElements): Added. (WI.SourcesNavigationSidebarPanel.prototype._addBreakpoint): (WI.SourcesNavigationSidebarPanel.prototype._removeAllBreakpoints): (WI.SourcesNavigationSidebarPanel.prototype._breakpointsBeneathTreeElement): (WI.SourcesNavigationSidebarPanel.prototype._addIssue): (WI.SourcesNavigationSidebarPanel.prototype._updatePauseReasonSection): (WI.SourcesNavigationSidebarPanel.prototype._handleTreeSelectionDidChange): (WI.SourcesNavigationSidebarPanel.prototype._handleBreakpointElementAddedOrRemoved): (WI.SourcesNavigationSidebarPanel.prototype._populateCreateBreakpointContextMenu.addToggleForSpecialEventBreakpoint): (WI.SourcesNavigationSidebarPanel.prototype._populateCreateBreakpointContextMenu): (WI.SourcesNavigationSidebarPanel.prototype._handleDebuggerObjectDisplayLocationDidChange): (WI.SourcesNavigationSidebarPanel.prototype._compareBreakpointTreeElements): Deleted. * UserInterface/Models/ProbeSet.js: (WI.ProbeSet): (WI.ProbeSet.prototype.createProbe): (WI.ProbeSet.prototype.willRemove): * UserInterface/Controllers/TimelineManager.js: (WI.TimelineManager.prototype._processRecord): * UserInterface/Views/ProbeSetDetailsSection.js: (WI.ProbeSetDetailsSection): * UserInterface/Views/ProbeDetailsSidebarPanel.js: (WI.ProbeDetailsSidebarPanel.prototype.inspect): * UserInterface/Views/SourceCodeTextEditor.js: (WI.SourceCodeTextEditor): (WI.SourceCodeTextEditor.prototype.close): (WI.SourceCodeTextEditor.prototype.textEditorBreakpointAdded): * UserInterface/Views/TextResourceContentView.js: (WI.TextResourceContentView.prototype.get supplementalRepresentedObjects): (WI.TextResourceContentView.prototype._probeSetsChanged): Probes now support `WI.EventBreakpoint` in addition to `WI.JavaScriptBreakpoint`. * UserInterface/Views/ContentView.js: (WI.ContentView.createFromRepresentedObject): (WI.ContentView.resolvedRepresentedObjectForRepresentedObject): (WI.ContentView.isViewable): * UserInterface/Views/ContextMenuUtilities.js: (WI.appendContextMenuItemsForSourceCode): Replace `WI.Breakpoint` with `WI.JavaScriptBreakpoint`. * UserInterface/Views/DOMTreeContentView.js: (WI.DOMTreeContentView): Replace `WI.DOMBreakpoint` with `WI.Breakpoint`. * UserInterface/Views/EventListenerSectionGroup.js: (WI.EventListenerSectionGroup): * UserInterface/Views/EventListenerSectionGroup.css: (.event-listener-section > .content input[type="checkbox"] + .go-to-arrow): Added. (.event-listener-section > .content input[type="checkbox"]:not(:checked) + .go-to-arrow): Added. Add a go-to arrow next to the Breakpoint checkbox that reveals the `WI.EventBreakpoint` in the Sources Tab. * UserInterface/Views/BreakpointActionView.js: (WI.BreakpointActionView.prototype._appendActionButtonClicked): Drive-by: minor code cleanup. * UserInterface/Views/CallFrameTreeElement.js: (WI.CallFrameTreeElement.prototype.populateContextMenu): Drive-by: include source code location context menu items. * UserInterface/Base/Setting.js: * UserInterface/Main.html: * UserInterface/Test.html: LayoutTests: * inspector/dom-debugger/resources/event-breakpoint-utilities.js: (TestPage.registerInitializer.InspectorTest.EventBreakpoint.addBreakpointOptionsTestCases): Added. (TestPage.registerInitializer.InspectorTest.EventBreakpoint.async teardown): (TestPage.registerInitializer.InspectorTest.EventBreakpoint.createBreakpoint): (TestPage.registerInitializer.InspectorTest.EventBreakpoint.removeBreakpoint): * inspector/dom/breakpoint-for-event-listener.html: * inspector/dom/breakpoint-for-event-listener-expected.txt: * inspector/dom-debugger/event-animation-frame-breakpoints.html: * inspector/dom-debugger/event-animation-frame-breakpoints-expected.txt: * inspector/dom-debugger/event-interval-breakpoints.html: * inspector/dom-debugger/event-interval-breakpoints-expected.txt: * inspector/dom-debugger/event-listener-breakpoints.html: * inspector/dom-debugger/event-listener-breakpoints-expected.txt: * inspector/dom-debugger/event-timeout-breakpoints.html: * inspector/dom-debugger/event-timeout-breakpoints-expected.txt: Add tests for new event breakpoint configuration options. * http/tests/inspector/debugger/debugger-test.js: (TestPage.registerInitializer.InspectorTest.startTracingBreakpoints): * http/tests/inspector/resources/probe-test.js: (TestPage.registerInitializer.ProtocolTest.Probe.installTracingListeners): * inspector/debugger/breakpoint-action-eval.html: * inspector/debugger/breakpoint-action-log.html: * inspector/debugger/breakpoint-columns.html: * inspector/debugger/breakpoint-scope.html: * inspector/debugger/debugger-stack-overflow.html: * inspector/debugger/pause-reason.html: * inspector/debugger/probe-manager-add-remove-actions.html: * inspector/debugger/stepping/stepping-through-autoContinue-breakpoint.html: * inspector/debugger/tail-deleted-frames-this-value.html: * inspector/debugger/tail-recursion.html: * inspector/worker/debugger-pause.html: * inspector/worker/debugger-shared-breakpoint.html: Update existing breakpoint tests to use new model objects. Canonical link: https://commits.webkit.org/228551@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@266074 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2020-08-24 17:34:12 +00:00
InspectorTest.EventBreakpoint.createBreakpoint(WI.EventBreakpoint.Type.Listener, {eventName: "click"})
Web Inspector: support breakpoints for timers and animation-frame events https://bugs.webkit.org/show_bug.cgi?id=188778 Reviewed by Brian Burg. Source/JavaScriptCore: * inspector/protocol/Debugger.json: Add `AnimationFrame` and `Timer` types to the list of pause reasons. * inspector/protocol/DOMDebugger.json: Introduced `setEventBreakpoint` and `removeEventBreakpoint` to replace the more specific: - `setEventListenerBreakpoint` - `removeEventListenerBreakpoint` - `setInstrumentationBreakpoint` - `removeInstrumentationBreakpoint` Also created an `EventBreakpointType` to enumerate the available types of event breakpoints. * inspector/scripts/codegen/generate_cpp_protocol_types_header.py: (CppProtocolTypesHeaderGenerator.generate_output): (CppProtocolTypesHeaderGenerator._generate_forward_declarations_for_binding_traits): (CppProtocolTypesHeaderGenerator._generate_declarations_for_enum_conversion_methods): (CppProtocolTypesHeaderGenerator._generate_hash_declarations): Added. Generate `DefaultHash` for all `enum class` used by inspector protocols. * inspector/scripts/tests/generic/expected/commands-with-async-attribute.json-result: * inspector/scripts/tests/generic/expected/commands-with-optional-call-return-parameters.json-result: * inspector/scripts/tests/generic/expected/enum-values.json-result: * inspector/scripts/tests/generic/expected/type-declaration-array-type.json-result: * inspector/scripts/tests/generic/expected/type-declaration-enum-type.json-result: * inspector/scripts/tests/generic/expected/type-declaration-object-type.json-result: * inspector/scripts/tests/generic/expected/type-requiring-runtime-casts.json-result: Source/WebCore: The original implementation of "instrumentation" breakpoints relied upon the frontend sending somewhat arbitrary strings when enabling breakpoints for specific events. As an example, setting a breakpoint for `requestAnimationFrame` expects `"animationFrameFired"` as the string, which doesn't make much sense. This patch removes the usage of these strings and instead expects the agent to implement a method that matches what is happening. Tests: inspector/dom-debugger/event-animation-frame-breakpoints.html inspector/dom-debugger/event-listener-breakpoints.html inspector/dom-debugger/event-timer-breakpoints.html * inspector/InspectorInstrumentation.h: (WebCore::InspectorInstrumentation::willFireTimer): * inspector/InspectorInstrumentation.cpp: (WebCore::InspectorInstrumentation::didInstallTimerImpl): (WebCore::InspectorInstrumentation::didRemoveTimerImpl): (WebCore::InspectorInstrumentation::willFireTimerImpl): (WebCore::InspectorInstrumentation::didRequestAnimationFrameImpl): (WebCore::InspectorInstrumentation::didCancelAnimationFrameImpl): (WebCore::InspectorInstrumentation::willFireAnimationFrameImpl): (WebCore::InspectorInstrumentation::pauseOnNativeEventIfNeeded): Deleted. * inspector/agents/InspectorDOMDebuggerAgent.h: * inspector/agents/InspectorDOMDebuggerAgent.cpp: (WebCore::InspectorDOMDebuggerAgent::setEventBreakpoint): Added. (WebCore::InspectorDOMDebuggerAgent::removeEventBreakpoint): Added. (WebCore::InspectorDOMDebuggerAgent::willHandleEvent): (WebCore::InspectorDOMDebuggerAgent::willFireTimer): Added. (WebCore::InspectorDOMDebuggerAgent::willFireAnimationFrame): Added. (WebCore::InspectorDOMDebuggerAgent::setEventListenerBreakpoint): Deleted. (WebCore::InspectorDOMDebuggerAgent::setInstrumentationBreakpoint): Deleted. (WebCore::InspectorDOMDebuggerAgent::setBreakpoint): Deleted. (WebCore::InspectorDOMDebuggerAgent::removeEventListenerBreakpoint): Deleted. (WebCore::InspectorDOMDebuggerAgent::removeInstrumentationBreakpoint): Deleted. (WebCore::InspectorDOMDebuggerAgent::removeBreakpoint): Deleted. (WebCore::InspectorDOMDebuggerAgent::pauseOnNativeEventIfNeeded): Deleted. Unify the event listener and instrumentation breakpoint commands into a single method, `setEventBreakpoint`, that takes in both an `EventBreakpointType` and `eventName`. * page/DOMTimer.cpp: (WebCore::DOMTimer::fired): Source/WebInspectorUI: Add a `type` to `WI.EventBreakpoint` that matches `DOMDebugger.EventBreakpointType`: - `AnimationFrame` for `requestAnimationFrame` - `Listener` for any named DOM Event - `Timer` for `setTimeout` and `setInterval` Modified `WI.EventBreakpointPopover` to provide ways for selecting these other types, which is then passed to `WI.DOMDebuggerManager`, which now calls through to the newly added `DOMDebugger.removeEventBreakpoint` and `DOMDebugger.setEventBreakpoint` that sets breakpoints for all event types. * Localizations/en.lproj/localizedStrings.js: * UserInterface/Images/EventBreakpointAnimationFrame.svg: Added. * UserInterface/Images/EventBreakpointListener.svg: Renamed from Source/WebInspectorUI/UserInterface/Images/EventBreakpoint.svg. * UserInterface/Images/EventBreakpointTimer.svg: Added. * UserInterface/Controllers/DOMDebuggerManager.js: (WI.DOMDebuggerManager.supportsEventBreakpoints): Added. (WI.DOMDebuggerManager.prototype.eventBreakpointForTypeAndEventName): Added. (WI.DOMDebuggerManager.prototype.addEventBreakpoint): (WI.DOMDebuggerManager.prototype.removeEventBreakpoint.breakpointRemoved): Added. (WI.DOMDebuggerManager.prototype.removeEventBreakpoint): (WI.DOMDebuggerManager.prototype._updateEventBreakpoint): (WI.DOMDebuggerManager.prototype.eventBreakpointForEventName): Deleted. * UserInterface/Controllers/DOMTreeManager.js: (WI.DOMTreeManager.prototype.setBreakpointForEventListener): * UserInterface/Controllers/DebuggerManager.js: (WI.DebuggerManager.prototype._pauseReasonFromPayload): * UserInterface/Models/EventBreakpoint.js: (WI.EventBreakpoint): (WI.EventBreakpoint.fromPayload): (WI.EventBreakpoint.prototype.get type): Added. (WI.EventBreakpoint.prototype.get serializableInfo): (WI.EventBreakpoint.prototype.saveIdentityToCookie): * UserInterface/Views/DebuggerSidebarPanel.js: (WI.DebuggerSidebarPanel.prototype._updatePauseReasonSection): (WI.DebuggerSidebarPanel.prototype.willDismissPopover): * UserInterface/Views/EventBreakpointPopover.js: (WI.EventBreakpointPopover): (WI.EventBreakpointPopover.prototype.get breakpoint): Added. (WI.EventBreakpointPopover.prototype.show): (WI.EventBreakpointPopover.prototype.show.createOption): Added. (WI.EventBreakpointPopover.prototype.dismiss): Added. (WI.EventBreakpointPopover.prototype._presentOverTargetElement): (WI.EventBreakpointPopover.prototype._handleTypeSelectChange): Added. (WI.EventBreakpointPopover.prototype.get result): Deleted. (WI.EventBreakpointPopover.prototype.get value): Deleted. * UserInterface/Views/EventBreakpointPopover.css: (.popover .event-breakpoint-content > .event-type): Added. (.popover .event-breakpoint-content > input): Deleted. * UserInterface/Views/EventBreakpointTreeElement.js: (WI.EventBreakpointTreeElement): * UserInterface/Views/EventBreakpointTreeElement.css: (.breakpoint.event.animation-frame:not(.breakpoint-paused-icon) .icon): Added. (.breakpoint.event.listener:not(.breakpoint-paused-icon) .icon): Added. (.breakpoint.event.timer:not(.breakpoint-paused-icon) .icon): Added. (.breakpoint.event:not(.breakpoint-paused-icon) .icon): Deleted. LayoutTests: * inspector/dom-debugger/event-animation-frame-breakpoints-expected.txt: Added. * inspector/dom-debugger/event-animation-frame-breakpoints.html: Added. * inspector/dom-debugger/event-breakpoint-with-navigation.html: * inspector/dom-debugger/event-timer-breakpoints-expected.txt: Added. * inspector/dom-debugger/event-timer-breakpoints.html: Added. * inspector/dom-debugger/event-listener-breakpoints-expected.txt: Renamed from LayoutTests/inspector/dom-debugger/event-breakpoints-expected.txt. * inspector/dom-debugger/event-listener-breakpoints.html: Renamed from LayoutTests/inspector/dom-debugger/event-breakpoints.html. * inspector/dom-debugger/resources/event-breakpoint-utilities.js: Added. (TestPage.registerInitializer.window.teardown): (TestPage.registerInitializer.window.failOnPause): (TestPage.registerInitializer.window.addBreakpoint): (TestPage.registerInitializer.window.removeBreakpoint): (TestPage.registerInitializer.window.disableBreakpoint): (TestPage.registerInitializer.window.awaitEvent): Canonical link: https://commits.webkit.org/203952@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@235248 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2018-08-23 21:36:40 +00:00
.then(() => {
InspectorTest.log("Firing \"click\" on div#x...");
return InspectorTest.evaluateInPage(`clickX()`);
})
.catch(reject);
},
teardown: InspectorTest.EventBreakpoint.teardown,
});
Web Inspector: allow url breakpoints to be configured https://bugs.webkit.org/show_bug.cgi?id=215793 Reviewed by Brian Burg. Source/JavaScriptCore: * inspector/protocol/DOMDebugger.json: Add an `options` parameter to `DOMDebugger.setURLBreakpoint` to allow configuration. Add an `isRegex` parameter to `DOMDebugger.removeURLBreakpoint` so that we know what type of URL breakpoint is being removed. Source/WebCore: Tests: inspector/dom-debugger/url-breakpoints.html inspector/dom-debugger/url-breakpoints-all-requests.html inspector/dom-debugger/url-breakpoints-containing.html inspector/dom-debugger/url-breakpoints-matching.html * inspector/agents/InspectorDOMDebuggerAgent.h: * inspector/agents/InspectorDOMDebuggerAgent.cpp: (WebCore::InspectorDOMDebuggerAgent::disable): (WebCore::InspectorDOMDebuggerAgent::setURLBreakpoint): (WebCore::InspectorDOMDebuggerAgent::removeURLBreakpoint): (WebCore::InspectorDOMDebuggerAgent::breakOnURLIfNeeded): Source/WebInspectorUI: * UserInterface/Models/URLBreakpoint.js: (WI.URLBreakpoint.get editable): Added. (WI.URLBreakpoint.fromJSON): (WI.URLBreakpoint.prototype.get editable): * UserInterface/Controllers/DOMDebuggerManager.js: (WI.DOMDebuggerManager): (WI.DOMDebuggerManager.prototype.initializeTarget): (WI.DOMDebuggerManager.prototype.addURLBreakpoint): (WI.DOMDebuggerManager.prototype.removeURLBreakpoint): (WI.DOMDebuggerManager.prototype._setURLBreakpoint): Added. (WI.DOMDebuggerManager.prototype._removeURLBreakpoint): Added. (WI.DOMDebuggerManager.prototype._handleURLBreakpointDisabledStateChanged): (WI.DOMDebuggerManager.prototype._handleURLBreakpointEditablePropertyChanged): Added. (WI.DOMDebuggerManager.prototype._handleURLBreakpointActionsChanged): Added. (WI.DOMDebuggerManager.prototype._updateURLBreakpoint): Deleted. * UserInterface/Views/SourcesNavigationSidebarPanel.js: (WI.SourcesNavigationSidebarPanel): (WI.SourcesNavigationSidebarPanel.prototype._populateCreateBreakpointContextMenu): (WI.SourcesNavigationSidebarPanel.prototype._populateCreateBreakpointContextMenu.addToggleForSpecialBreakpoint): Added. (WI.SourcesNavigationSidebarPanel.prototype._populateCreateBreakpointContextMenu.addToggleForSpecialEventBreakpoint): Deleted. * UserInterface/Views/URLBreakpointPopover.js: (WI.URLBreakpointPopover.get editable): * UserInterface/Base/Setting.js: LayoutTests: * inspector/debugger/resources/breakpoint-options-utilities.js: (TestPage.registerInitializer.InspectorTest.BreakpointOptions.addTestCases): * inspector/dom-debugger/resources/url-breakpoint-utilities.js: Added. (TestPage.registerInitializer.InspectorTest.URLBreakpoint.teardown): (TestPage.registerInitializer.InspectorTest.URLBreakpoint.createBreakpoint): (TestPage.registerInitializer.InspectorTest.URLBreakpoint.addBreakpoint): (TestPage.registerInitializer.InspectorTest.URLBreakpoint.request): * inspector/dom-debugger/url-breakpoints.html: * inspector/dom-debugger/url-breakpoints-expected.txt: * inspector/dom-debugger/url-breakpoints-all-requests.html: Added. * inspector/dom-debugger/url-breakpoints-all-requests-expected.txt: Added. * inspector/dom-debugger/url-breakpoints-containing.html: Added. * inspector/dom-debugger/url-breakpoints-containing-expected.txt: Added. * inspector/dom-debugger/url-breakpoints-matching.html: Added. * inspector/dom-debugger/url-breakpoints-matching-expected.txt: Added. Split the one URL breakpoint test into four so they run quicker. * inspector/dom-debugger/resources/event-breakpoint-utilities.js: (TestPage.registerInitializer.InspectorTest.EventBreakpoint.addBreakpointOptionsTestCases): Deleted. * inspector/dom-debugger/event-animation-frame-breakpoints.html: * inspector/dom-debugger/event-animation-frame-breakpoints-expected.txt: * inspector/dom-debugger/event-interval-breakpoints.html: * inspector/dom-debugger/event-interval-breakpoints-expected.txt: * inspector/dom-debugger/event-listener-breakpoints.html: * inspector/dom-debugger/event-listener-breakpoints-expected.txt: * inspector/dom-debugger/event-timeout-breakpoints.html: * inspector/dom-debugger/event-timeout-breakpoints-expected.txt: Use `InspectorTest.BreakpointOptions.addTestCases` instead of duplicating the logic. Canonical link: https://commits.webkit.org/228940@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@266538 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2020-09-03 20:07:39 +00:00
InspectorTest.BreakpointOptions.addTestCases(suite, {
createBreakpoint() {
return InspectorTest.EventBreakpoint.createBreakpoint(WI.EventBreakpoint.Type.Listener, {eventName: "click"});
},
triggerBreakpoint() {
return Promise.all([
InspectorTest.awaitEvent("TestPage-click"),
InspectorTest.evaluateInPage(`trigger_click()`),
]);
},
});
Web Inspector: allow event breakpoints to be configured https://bugs.webkit.org/show_bug.cgi?id=215362 <rdar://problem/66932921> Reviewed by Brian Burg. Source/JavaScriptCore: This allows developers to do things like: - only pause when `window.event.type` is a certain value - ignore the first N pauses - evaluate JavaScript whenever an event listener is invoked without pausing * inspector/protocol/DOM.json: Add an `options` paramater to `DOM.setBreakpointForEventListener` to allow configuration. * inspector/protocol/DOMDebugger.json: Add an `options` paramater to `DOMDebugger.setEventBreakpoint` to allow configuration. * debugger/Breakpoint.h: (JSC::Breakpoint::id const): Added. (JSC::Breakpoint::sourceID const): Added. (JSC::Breakpoint::lineNumber const): Added. (JSC::Breakpoint::columnNumber const): Added. (JSC::Breakpoint::condition const): Added. (JSC::Breakpoint::actions const): Added. (JSC::Breakpoint::isAutoContinue const): Added. (JSC::Breakpoint::resetHitCount): Added. (JSC::Breakpoint::isLinked const): Added. (JSC::Breakpoint::isResolved const): Added. (JSC::BreakpointsList::~BreakpointsList): Deleted. * debugger/Breakpoint.cpp: Added. (JSC::Breakpoint::Action::Action): Added. (JSC::Breakpoint::create): Added. (JSC::Breakpoint::Breakpoint): Added. (JSC::Breakpoint::link): Added. (JSC::Breakpoint::resolve): Added. (JSC::Breakpoint::shouldPause): Added. Unify `JSC::Breakpoint` and `Inspector::ScriptBreakpoint`. * debugger/DebuggerPrimitives.h: * debugger/Debugger.h: * debugger/Debugger.cpp: (JSC::Debugger::Debugger): (JSC::Debugger::addObserver): Added. (JSC::Debugger::removeObserver): Added. (JSC::Debugger::canDispatchFunctionToObservers const): Added. (JSC::Debugger::dispatchFunctionToObservers): Added. (JSC::Debugger::sourceParsed): Added. (JSC::Debugger::toggleBreakpoint): (JSC::Debugger::applyBreakpoints): (JSC::Debugger::resolveBreakpoint): (JSC::Debugger::setBreakpoint): (JSC::Debugger::removeBreakpoint): (JSC::Debugger::didHitBreakpoint): Added. (JSC::Debugger::clearBreakpoints): (JSC::Debugger::evaluateBreakpointCondition): Added. (JSC::Debugger::evaluateBreakpointActions): Added. (JSC::Debugger::schedulePauseAtNextOpportunity): Added. (JSC::Debugger::cancelPauseAtNextOpportunity): Added. (JSC::Debugger::schedulePauseForSpecialBreakpoint): Added. (JSC::Debugger::cancelPauseForSpecialBreakpoint): Added. (JSC::Debugger::continueProgram): (JSC::Debugger::stepNextExpression): (JSC::Debugger::stepIntoStatement): (JSC::Debugger::stepOverStatement): (JSC::Debugger::stepOutOfFunction): (JSC::Debugger::pauseIfNeeded): (JSC::Debugger::handlePause): Added. (JSC::Debugger::exceptionOrCaughtValue): Added. (JSC::Debugger::atExpression): (JSC::Debugger::clearNextPauseState): (JSC::Debugger::willRunMicrotask): Added. (JSC::Debugger::didRunMicrotask): Added. (JSC::Debugger::hasBreakpoint): Deleted. (JSC::Debugger::setPauseOnNextStatement): Deleted. Unify `JSC::Debugger` and `Inspector::ScriptDebugServer` to simplify breakpoint logic. Introduce the concept of a "special breakpoint", which is essentially a `JSC::Breakpoint` that is expected to pause at the next opportunity but isn't tied to a particular location. As an example, whenever an event breakpoint is hit, instead of just pausing at the next opportunity, the newly managed `JSC::Breakpoint` is used as a "special breakpoint", allowing for it's configuration (ie.g. condition, ignore count, actions, auto-continue) to be used. * inspector/agents/InspectorDebuggerAgent.h: * inspector/agents/InspectorDebuggerAgent.cpp: (Inspector::objectGroupForBreakpointAction): (Inspector::breakpointActionTypeForString): Added. (Inspector::parseBreakpointOptions): Added. (Inspector::InspectorDebuggerAgent::ProtocolBreakpoint::fromPayload): Added. (Inspector::InspectorDebuggerAgent::ProtocolBreakpoint::ProtocolBreakpoint): Added. (Inspector::InspectorDebuggerAgent::ProtocolBreakpoint::createDebuggerBreakpoint const): Added. (Inspector::InspectorDebuggerAgent::ProtocolBreakpoint::matchesScriptURL const): Added. (Inspector::InspectorDebuggerAgent::debuggerBreakpointFromPayload): Added. (Inspector::InspectorDebuggerAgent::enable): (Inspector::InspectorDebuggerAgent::disable): (Inspector::InspectorDebuggerAgent::buildBreakpointPauseReason): (Inspector::InspectorDebuggerAgent::handleConsoleAssert): (Inspector::InspectorDebuggerAgent::didScheduleAsyncCall): (Inspector::buildDebuggerLocation): (Inspector::InspectorDebuggerAgent::setBreakpointByUrl): (Inspector::InspectorDebuggerAgent::setBreakpoint): (Inspector::InspectorDebuggerAgent::didSetBreakpoint): (Inspector::InspectorDebuggerAgent::resolveBreakpoint): (Inspector::InspectorDebuggerAgent::removeBreakpoint): (Inspector::InspectorDebuggerAgent::continueToLocation): (Inspector::InspectorDebuggerAgent::schedulePauseAtNextOpportunity): Added. (Inspector::InspectorDebuggerAgent::cancelPauseAtNextOpportunity): Added. (Inspector::InspectorDebuggerAgent::schedulePauseForSpecialBreakpoint): Added. (Inspector::InspectorDebuggerAgent::cancelPauseForSpecialBreakpoint): Added. (Inspector::InspectorDebuggerAgent::pause): (Inspector::InspectorDebuggerAgent::resume): (Inspector::InspectorDebuggerAgent::didBecomeIdle): (Inspector::InspectorDebuggerAgent::sourceMapURLForScript): (Inspector::InspectorDebuggerAgent::didParseSource): (Inspector::InspectorDebuggerAgent::willRunMicrotask): (Inspector::InspectorDebuggerAgent::didRunMicrotask): (Inspector::InspectorDebuggerAgent::didPause): (Inspector::InspectorDebuggerAgent::breakpointActionSound): (Inspector::InspectorDebuggerAgent::breakpointActionProbe): (Inspector::InspectorDebuggerAgent::clearInspectorBreakpointState): (Inspector::InspectorDebuggerAgent::clearDebuggerBreakpointState): (Inspector::matches): Deleted. (Inspector::buildObjectForBreakpointCookie): Deleted. (Inspector::InspectorDebuggerAgent::breakpointActionsFromProtocol): Deleted. (Inspector::InspectorDebuggerAgent::schedulePauseOnNextStatement): Deleted. (Inspector::InspectorDebuggerAgent::cancelPauseOnNextStatement): Deleted. Create a private `ProtocolBreakpoint` class that holds the data sent by the frontend. This is necessary because breakpoints in the frontend have a potentially one-to-many relationship with breakpoints in the backend, as the same script can be loaded many times on a page. Each of those scripts is independent, however, and can execute differently, meaning that the same breakpoint for each script also needs a different state (e.g. ignore count). As such, the `ProtocolBreakpoint` is effectively a template that is actualized whenever a new script is parsed that matches the URL of the `ProtocolBreakpoint` to create a `JSC::Breakpoint` that is used by the `JSC::Debugger`. `ProtocolBreakpoint` also parses breakpoint configurations. * inspector/InspectorEnvironment.h: * inspector/JSGlobalObjectScriptDebugServer.h: * inspector/JSGlobalObjectScriptDebugServer.cpp: (Inspector::JSGlobalObjectScriptDebugServer::JSGlobalObjectScriptDebugServer): (Inspector::JSGlobalObjectScriptDebugServer::attachDebugger): (Inspector::JSGlobalObjectScriptDebugServer::detachDebugger): (Inspector::JSGlobalObjectScriptDebugServer::runEventLoopWhilePaused): * inspector/agents/InspectorAuditAgent.h: * inspector/agents/InspectorAuditAgent.cpp: (Inspector::InspectorAuditAgent::run): * inspector/agents/InspectorRuntimeAgent.h: * inspector/agents/InspectorRuntimeAgent.cpp: (Inspector::setPauseOnExceptionsState): (Inspector::InspectorRuntimeAgent::evaluate): (Inspector::InspectorRuntimeAgent::callFunctionOn): (Inspector::InspectorRuntimeAgent::getPreview): (Inspector::InspectorRuntimeAgent::getProperties): (Inspector::InspectorRuntimeAgent::getDisplayableProperties): * inspector/agents/InspectorScriptProfilerAgent.cpp: * inspector/agents/JSGlobalObjectDebuggerAgent.h: Replace `Inspector::ScriptDebugServer` with `JSC::Debugger`. * runtime/JSMicrotask.cpp: (JSC::JSMicrotask::run): Drive-by: r248894 mistakenly omitted the call to notify the debugger that the microtask ran. * inspector/ScriptBreakpoint.h: Removed. * inspector/ScriptDebugListener.h: Removed. * inspector/ScriptDebugServer.h: Removed. * inspector/ScriptDebugServer.cpp: Removed. * CMakeLists.txt: * JavaScriptCore.xcodeproj/project.pbxproj: * Sources.txt: Source/WebCore: This allows developers to do things like: - only pause when `window.event.type` is a certain value - ignore the first N pauses - evaluate JavaScript whenever an event listener is invoked without pausing Tests: inspector/dom/breakpoint-for-event-listener.html inspector/dom-debugger/event-animation-frame-breakpoints.html inspector/dom-debugger/event-interval-breakpoints.html inspector/dom-debugger/event-listener-breakpoints.html inspector/dom-debugger/event-timeout-breakpoints.html * inspector/agents/InspectorDOMAgent.h: * inspector/agents/InspectorDOMAgent.cpp: (WebCore::InspectorDOMAgent::getEventListenersForNode): (WebCore::InspectorDOMAgent::setBreakpointForEventListener): (WebCore::InspectorDOMAgent::removeBreakpointForEventListener): (WebCore::InspectorDOMAgent::buildObjectForEventListener): (WebCore::InspectorDOMAgent::breakpointForEventListener): (WebCore::InspectorDOMAgent::hasBreakpointForEventListener): Deleted. * inspector/agents/InspectorDOMDebuggerAgent.h: * inspector/agents/InspectorDOMDebuggerAgent.cpp: (WebCore::InspectorDOMDebuggerAgent::disable): (WebCore::InspectorDOMDebuggerAgent::mainFrameNavigated): (WebCore::InspectorDOMDebuggerAgent::setEventBreakpoint): (WebCore::InspectorDOMDebuggerAgent::removeEventBreakpoint): (WebCore::InspectorDOMDebuggerAgent::willHandleEvent): (WebCore::InspectorDOMDebuggerAgent::didHandleEvent): (WebCore::InspectorDOMDebuggerAgent::willFireTimer): (WebCore::InspectorDOMDebuggerAgent::didFireTimer): * inspector/agents/page/PageDOMDebuggerAgent.h: * inspector/agents/page/PageDOMDebuggerAgent.cpp: (WebCore::PageDOMDebuggerAgent::disable): (WebCore::PageDOMDebuggerAgent::mainFrameNavigated): (WebCore::PageDOMDebuggerAgent::willFireAnimationFrame): (WebCore::PageDOMDebuggerAgent::didFireAnimationFrame): (WebCore::PageDOMDebuggerAgent::setAnimationFrameBreakpoint): * inspector/agents/worker/WorkerDOMDebuggerAgent.h: * inspector/agents/worker/WorkerDOMDebuggerAgent.cpp: (WebCore::WorkerDOMDebuggerAgent::setAnimationFrameBreakpoint): Keep a `JSC::Breakpoint` for each event breakpoint instead of a simple `bool`, allowing for configuration when the breakpoint is first set. When any of these breakpoints are hit, pass it to the `JSC::Debugger` as a "special breakpoint", which behaves the same as "pause ASAP" but also supports a condition, an ignore count, actions, and auto-continue. Reset the hit count for any of these "special breakpoints" that persist across Web Inspector sessions when the main frame navigates. * inspector/PageScriptDebugServer.h: * inspector/PageScriptDebugServer.cpp: (WebCore::PageScriptDebugServer::PageScriptDebugServer): (WebCore::PageScriptDebugServer::attachDebugger): (WebCore::PageScriptDebugServer::detachDebugger): (WebCore::PageScriptDebugServer::didPause): (WebCore::PageScriptDebugServer::didContinue): (WebCore::PageScriptDebugServer::runEventLoopWhilePaused): (WebCore::PageScriptDebugServer::runEventLoopWhilePausedInternal): (WebCore::PageScriptDebugServer::isContentScript const): (WebCore::PageScriptDebugServer::reportException const): * inspector/WorkerScriptDebugServer.h: * inspector/WorkerScriptDebugServer.cpp: (WebCore::WorkerScriptDebugServer::WorkerScriptDebugServer): (WebCore::WorkerScriptDebugServer::attachDebugger): (WebCore::WorkerScriptDebugServer::detachDebugger): (WebCore::WorkerScriptDebugServer::runEventLoopWhilePaused): (WebCore::WorkerScriptDebugServer::reportException const): * inspector/agents/page/PageDebuggerAgent.h: * inspector/agents/page/PageDebuggerAgent.cpp: (WebCore::PageDebuggerAgent::sourceMapURLForScript): Replace `Inspector::ScriptDebugServer` with `JSC::Debugger`. * inspector/TimelineRecordFactory.h: * inspector/TimelineRecordFactory.cpp: (WebCore::TimelineRecordFactory::createProbeSampleData): * inspector/agents/InspectorTimelineAgent.h: * inspector/agents/InspectorTimelineAgent.cpp: (WebCore::InspectorTimelineAgent::internalStart): (WebCore::InspectorTimelineAgent::internalStop): (WebCore::InspectorTimelineAgent::breakpointActionProbe): Replace `Inspector::ScriptBreakpoint` with `JSC::Breakpoint`. * inspector/InspectorInstrumentation.h: (WebCore::InspectorInstrumentation::didHandleEvent): (WebCore::InspectorInstrumentation::didFireTimer): * inspector/InspectorInstrumentation.cpp: (WebCore::InspectorInstrumentation::didHandleEventImpl): (WebCore::InspectorInstrumentation::didFireTimerImpl): (WebCore::InspectorInstrumentation::didCommitLoadImpl): (WebCore::InspectorInstrumentation::didFireAnimationFrameImpl): * dom/EventTarget.cpp: (WebCore::EventTarget::innerInvokeEventListeners): * page/DOMTimer.cpp: (WebCore::DOMTimer::fired): When notifying Web Inspector that activity did occur, include all information previously included when notifying Web Inspector that that activity was about to occur so that Web Inspector can know whether a pause for the "special breakpoint" for that activity is still scheduled and if so cancel it. Source/WebInspectorUI: This allows developers to do things like: - only pause when `window.event.type` is a certain value - ignore the first N pauses - evaluate JavaScript whenever an event listener is invoked without pausing * UserInterface/Models/Breakpoint.js: (WI.Breakpoint): (WI.Breakpoint.prototype.toJSON): (WI.Breakpoint.prototype.get special): Added. (WI.Breakpoint.prototype.get removable): Added. (WI.Breakpoint.prototype.get editable): Added. (WI.Breakpoint.prototype.set condition): (WI.Breakpoint.prototype.get ignoreCount): (WI.Breakpoint.prototype.set ignoreCount): (WI.Breakpoint.prototype.get autoContinue): (WI.Breakpoint.prototype.set autoContinue): (WI.Breakpoint.prototype.get actions): (WI.Breakpoint.prototype.get probeActions): (WI.Breakpoint.prototype.cycleToNextMode): (WI.Breakpoint.prototype.createAction): (WI.Breakpoint.prototype.recreateAction): (WI.Breakpoint.prototype.removeAction): (WI.Breakpoint.prototype.clearActions): (WI.Breakpoint.prototype.remove): Added. (WI.Breakpoint.prototype.optionsToProtocol): Added. (WI.Breakpoint.prototype.breakpointActionDidChange): (WI.Breakpoint.fromJSON): Deleted. (WI.Breakpoint.prototype.get sourceCodeLocation): Deleted. (WI.Breakpoint.prototype.get contentIdentifier): Deleted. (WI.Breakpoint.prototype.get scriptIdentifier): Deleted. (WI.Breakpoint.prototype.get target): Deleted. (WI.Breakpoint.prototype.get identifier): Deleted. (WI.Breakpoint.prototype.set identifier): Deleted. (WI.Breakpoint.prototype.get resolved): Deleted. (WI.Breakpoint.prototype.set resolved): Deleted. (WI.Breakpoint.prototype.saveIdentityToCookie): Deleted. (WI.Breakpoint.prototype._isSpecial): Deleted. (WI.Breakpoint.prototype._sourceCodeLocationLocationChanged): Deleted. (WI.Breakpoint.prototype._sourceCodeLocationDisplayLocationChanged): Deleted. * UserInterface/Models/DOMBreakpoint.js: (WI.DOMBreakpoint): (WI.DOMBreakpoint.fromJSON): Added. (WI.DOMBreakpoint.prototype.remove): Added. (WI.DOMBreakpoint.prototype.toJSON): (WI.DOMBreakpoint.deserialize): Deleted. (WI.DOMBreakpoint.prototype.get disabled): Deleted. (WI.DOMBreakpoint.prototype.set disabled): Deleted. * UserInterface/Models/EventBreakpoint.js: (WI.EventBreakpoint): (WI.EventBreakpoint.fromJSON): Added. (WI.EventBreakpoint.prototype.get special): Added. (WI.EventBreakpoint.prototype.get editable): Added. (WI.EventBreakpoint.prototype.remove): Added. (WI.EventBreakpoint.prototype.saveIdentityToCookie): (WI.EventBreakpoint.prototype.toJSON): (WI.EventBreakpoint.deserialize): Deleted. (WI.EventBreakpoint.prototype.get disabled): Deleted. (WI.EventBreakpoint.prototype.set disabled): Deleted. * UserInterface/Models/JavaScriptBreakpoint.js: Copied from UserInterface/Models/Breakpoint.js. (WI.JavaScriptBreakpoint): (WI.JavaScriptBreakpoint.fromJSON): (WI.JavaScriptBreakpoint.prototype.toJSON): (WI.JavaScriptBreakpoint.prototype.get sourceCodeLocation): (WI.JavaScriptBreakpoint.prototype.get contentIdentifier): (WI.JavaScriptBreakpoint.prototype.get scriptIdentifier): (WI.JavaScriptBreakpoint.prototype.get target): (WI.JavaScriptBreakpoint.prototype.get special): Added. (WI.JavaScriptBreakpoint.prototype.get removable): Added. (WI.JavaScriptBreakpoint.prototype.get editable): Added. (WI.JavaScriptBreakpoint.prototype.get identifier): (WI.JavaScriptBreakpoint.prototype.set identifier): (WI.JavaScriptBreakpoint.prototype.get resolved): (WI.JavaScriptBreakpoint.prototype.set resolved): (WI.JavaScriptBreakpoint.prototype.remove): Added. (WI.JavaScriptBreakpoint.prototype.saveIdentityToCookie): (WI.JavaScriptBreakpoint.prototype._isSpecial): (WI.JavaScriptBreakpoint.prototype._sourceCodeLocationLocationChanged): (WI.JavaScriptBreakpoint.prototype._sourceCodeLocationDisplayLocationChanged): * UserInterface/Models/URLBreakpoint.js: (WI.URLBreakpoint): (WI.URLBreakpoint.fromJSON): Added. (WI.URLBreakpoint.prototype.get special): Added. (WI.URLBreakpoint.prototype.remove): Added. (WI.URLBreakpoint.prototype.toJSON): (WI.URLBreakpoint.deserialize): Deleted. (WI.URLBreakpoint.prototype.get disabled): Deleted. (WI.URLBreakpoint.prototype.set disabled): Deleted. Rename `WI.Breakpoint` to `WI.JavaScriptBreakpoint` and use `WI.Breakpoint` as a new common base class for all breakpoint types, allowing more logic to be shared (e.g. disabled state). Additionally, breakpoints are now able to - determine whether or not they're - special - removable - editable (i.e. configurable) - remove themselves without the caller needing to know what manager to consult with. * UserInterface/Controllers/DOMManager.js: (WI.DOMManager): (WI.DOMManager.supportsEventListenerBreakpointConfiguration): Added. (WI.DOMManager.prototype.setBreakpointForEventListener): (WI.DOMManager.prototype.removeBreakpointForEventListener): (WI.DOMManager.prototype._setEventBreakpoint): Added. (WI.DOMManager.prototype._removeEventBreakpoint): Added. (WI.DOMManager.prototype._handleEventBreakpointEditablePropertyChanged): Added. (WI.DOMManager.prototype._handleEventBreakpointActionsChanged): Added. (WI.DOMManager.prototype._updateEventBreakpoint): Deleted. Keep track of configuration changes for specific listener breakpoints. * UserInterface/Controllers/DOMDebuggerManager.js: (WI.DOMDebuggerManager): (WI.DOMDebuggerManager.prototype.initializeTarget): (WI.DOMDebuggerManager.prototype.addDOMBreakpoint): (WI.DOMDebuggerManager.prototype.removeDOMBreakpoint): (WI.DOMDebuggerManager.prototype.addEventBreakpoint): (WI.DOMDebuggerManager.prototype.removeEventBreakpoint): (WI.DOMDebuggerManager.prototype.addURLBreakpoint): (WI.DOMDebuggerManager.prototype.removeURLBreakpoint): (WI.DOMDebuggerManager.prototype._commandArgumentsForEventBreakpoint): Added. (WI.DOMDebuggerManager.prototype._setEventBreakpoint): Added. (WI.DOMDebuggerManager.prototype._removeEventBreakpoint): Added. (WI.DOMDebuggerManager.prototype._handleEventBreakpointDisabledStateChanged): Added. (WI.DOMDebuggerManager.prototype._handleEventBreakpointEditablePropertyChanged): Added. (WI.DOMDebuggerManager.prototype._handleEventBreakpointActionsChanged): Added. (WI.DOMDebuggerManager.prototype.isBreakpointSpecial): Deleted. (WI.DOMDebuggerManager.prototype._updateEventBreakpoint): Deleted. Keep track of configuration changes for special event breakpoints. Store special event breakpoints inside `WI.objectStores.eventBreakpoints`. * UserInterface/Controllers/DebuggerManager.js: (WI.DebuggerManager): (WI.DebuggerManager.prototype.addBreakpoint): (WI.DebuggerManager.prototype.removeBreakpoint): (WI.DebuggerManager.prototype.addProbesForBreakpoint): Added. (WI.DebuggerManager.prototype.removeProbesForBreakpoint): Added. (WI.DebuggerManager.prototype.updateProbesForBreakpoint): Added. (WI.DebuggerManager.prototype._setBreakpoint): (WI.DebuggerManager.prototype._breakpointEditablePropertyDidChange): (WI.DebuggerManager.prototype._handleBreakpointActionsDidChange): (WI.DebuggerManager.prototype.isBreakpointRemovable): Deleted. (WI.DebuggerManager.prototype.isBreakpointSpecial): Deleted. (WI.DebuggerManager.prototype.isBreakpointEditable): Deleted. (WI.DebuggerManager.prototype._debuggerBreakpointActionType): Deleted. (WI.DebuggerManager.prototype._debuggerBreakpointOptions): Deleted. (WI.DebuggerManager.prototype._addProbesForBreakpoint): Deleted. (WI.DebuggerManager.prototype._removeProbesForBreakpoint): Deleted. (WI.DebuggerManager.prototype._updateProbesForBreakpoint): Deleted. Replace `WI.Breakpoint` with `WI.JavaScriptBreakpoint`. Probes now support `WI.EventBreakpoint` in addition to `WI.JavaScriptBreakpoint`. * UserInterface/Controllers/BreakpointPopoverController.js: (WI.BreakpointPopoverController.prototype.appendContextMenuItems): (WI.BreakpointPopoverController.prototype._createPopoverContent): Allow any breakpoint instead of only `WI.JavaScriptBreakpoint`. Drive-by: the existing `ignoreCount` value wasn't being used to populate the `<input>`. * UserInterface/Views/BreakpointTreeElement.js: (WI.BreakpointTreeElement.prototype.ondelete): (WI.BreakpointTreeElement.prototype.get listenerSet): Added. (WI.BreakpointTreeElement.prototype.updateStatus): Added. (WI.BreakpointTreeElement.prototype.updateTitles): Added. (WI.BreakpointTreeElement.prototype.get breakpoint): Deleted. (WI.BreakpointTreeElement.prototype.get filterableData): Deleted. (WI.BreakpointTreeElement.prototype._updateTitles): Deleted. (WI.BreakpointTreeElement.prototype._updateStatus): Deleted. (WI.BreakpointTreeElement.prototype._breakpointLocationDidChange): Deleted. * UserInterface/Views/BreakpointTreeElement.css: (.item.breakpoint .status > .status-image): (.item.breakpoint.paused .icon): Added. (@media (prefers-color-scheme: dark) .item.breakpoint.paused .icon): Added. (.item.breakpoint .status > .status-image.resolved): Deleted. (body:not(.window-inactive, .window-docked-inactive) .tree-outline:focus-within .item.breakpoint.selected .status > .status-image.resolved): Deleted. (.item.breakpoint .subtitle.formatted-location): Deleted. (.breakpoint-debugger-statement-icon .icon): Deleted. (.breakpoint-exception-icon .icon): Deleted. (.breakpoint-assertion-icon .icon): Deleted. (.breakpoint-microtask-icon .icon): Deleted. (.breakpoint-paused-icon .icon): Deleted. (.breakpoint-generic-line-icon .icon): Deleted. (.breakpoint-generic-line-icon .icon > span): Deleted. (.data-updated.breakpoint-generic-line-icon .icon > span): Deleted. (@media (prefers-color-scheme: dark) .breakpoint-debugger-statement-icon .icon): Deleted. (@media (prefers-color-scheme: dark) .breakpoint-exception-icon .icon): Deleted. (@media (prefers-color-scheme: dark) .breakpoint-assertion-icon .icon): Deleted. (@media (prefers-color-scheme: dark) .breakpoint-microtask-icon .icon): Deleted. (@media (prefers-color-scheme: dark) .breakpoint-paused-icon .icon): Deleted. (@media (prefers-color-scheme: dark) .breakpoint-generic-line-icon .icon): Deleted. * UserInterface/Views/DOMBreakpointTreeElement.js: (WI.DOMBreakpointTreeElement): (WI.DOMBreakpointTreeElement.prototype.onattach): Deleted. (WI.DOMBreakpointTreeElement.prototype.ondetach): Deleted. (WI.DOMBreakpointTreeElement.prototype.ondelete): Deleted. (WI.DOMBreakpointTreeElement.prototype.onenter): Deleted. (WI.DOMBreakpointTreeElement.prototype.onspace): Deleted. (WI.DOMBreakpointTreeElement.prototype.populateContextMenu): Deleted. (WI.DOMBreakpointTreeElement.prototype._statusImageElementClicked): Deleted. (WI.DOMBreakpointTreeElement.prototype._statusImageElementFocused): Deleted. (WI.DOMBreakpointTreeElement.prototype._statusImageElementMouseDown): Deleted. (WI.DOMBreakpointTreeElement.prototype._toggleBreakpoint): Deleted. (WI.DOMBreakpointTreeElement.prototype._updateStatus): Deleted. * UserInterface/Views/DOMBreakpointTreeElement.css: (.item.breakpoint.dom.subtree-modified:not(.paused) .icon): Added. (.item.breakpoint.dom.attribute-modified:not(.paused) .icon): Added. (.item.breakpoint.dom.node-removed:not(.paused) .icon): Added. (@media (prefers-color-scheme: dark) .item.breakpoint.dom.subtree-modified:not(.paused) .icon): Added. (@media (prefers-color-scheme: dark) .item.breakpoint.dom.attribute-modified:not(.paused) .icon): Added. (@media (prefers-color-scheme: dark) .item.breakpoint.dom.node-removed:not(.paused) .icon): Added. (.breakpoint.dom.breakpoint-for-subtree-modified:not(.breakpoint-paused-icon) .icon): Deleted. (.breakpoint.dom.breakpoint-for-attribute-modified:not(.breakpoint-paused-icon) .icon): Deleted. (.breakpoint.dom.breakpoint-for-node-removed:not(.breakpoint-paused-icon) .icon): Deleted. (@media (prefers-color-scheme: dark) .breakpoint.dom.breakpoint-for-subtree-modified:not(.breakpoint-paused-icon) .icon): Deleted. (@media (prefers-color-scheme: dark) .breakpoint.dom.breakpoint-for-attribute-modified:not(.breakpoint-paused-icon) .icon): Deleted. (@media (prefers-color-scheme: dark) .breakpoint.dom.breakpoint-for-node-removed:not(.breakpoint-paused-icon) .icon): Deleted. * UserInterface/Views/EventBreakpointTreeElement.js: (WI.EventBreakpointTreeElement): (WI.EventBreakpointTreeElement.prototype.onattach): Deleted. (WI.EventBreakpointTreeElement.prototype.ondetach): Deleted. (WI.EventBreakpointTreeElement.prototype.ondelete): Deleted. (WI.EventBreakpointTreeElement.prototype.onenter): Deleted. (WI.EventBreakpointTreeElement.prototype.onspace): Deleted. (WI.EventBreakpointTreeElement.prototype.populateContextMenu): Deleted. (WI.EventBreakpointTreeElement.prototype._statusImageElementClicked): Deleted. (WI.EventBreakpointTreeElement.prototype._statusImageElementFocused): Deleted. (WI.EventBreakpointTreeElement.prototype._statusImageElementMouseDown): Deleted. (WI.EventBreakpointTreeElement.prototype._toggleBreakpoint): Deleted. (WI.EventBreakpointTreeElement.prototype._updateStatus): Deleted. * UserInterface/Views/EventBreakpointTreeElement.css: (.item.breakpoint.event.animation-frame:not(.paused) .icon): Added. (.item.breakpoint.event.interval:not(.paused) .icon): Added. (.item.breakpoint.event.listener:not(.paused) .icon): Added. (.item.breakpoint.event.timeout:not(.paused) .icon): Added. (@media(prefers-color-scheme: dark) .item.breakpoint.event.animation-frame:not(.paused) .icon): Added. (@media(prefers-color-scheme: dark) .item.breakpoint.event.interval:not(.paused) .icon): Added. (@media(prefers-color-scheme: dark) .item.breakpoint.event.listener:not(.paused) .icon): Added. (@media(prefers-color-scheme: dark) .item.breakpoint.event.timeout:not(.paused) .icon): Added. (.breakpoint.event.breakpoint-for-animation-frame:not(.breakpoint-paused-icon) .icon): Deleted. (.breakpoint.event.breakpoint-for-interval:not(.breakpoint-paused-icon) .icon): Deleted. (.breakpoint.event.breakpoint-for-listener:not(.breakpoint-paused-icon) .icon): Deleted. (.breakpoint.event.breakpoint-for-timeout:not(.breakpoint-paused-icon) .icon): Deleted. (@media(prefers-color-scheme: dark) .breakpoint.event.breakpoint-for-animation-frame:not(.breakpoint-paused-icon) .icon): Deleted. (@media(prefers-color-scheme: dark) .breakpoint.event.breakpoint-for-interval:not(.breakpoint-paused-icon) .icon): Deleted. (@media(prefers-color-scheme: dark) .breakpoint.event.breakpoint-for-listener:not(.breakpoint-paused-icon) .icon): Deleted. (@media(prefers-color-scheme: dark) .breakpoint.event.breakpoint-for-timeout:not(.breakpoint-paused-icon) .icon): Deleted. * UserInterface/Views/JavaScriptBreakpointTreeElement.js: Copied from Source/WebInspectorUI/UserInterface/Views/BreakpointTreeElement.js. (WI.JavaScriptBreakpointTreeElement): (WI.JavaScriptBreakpointTreeElement.prototype.get filterableData): (WI.JavaScriptBreakpointTreeElement.prototype.updateStatus): Added. (WI.JavaScriptBreakpointTreeElement.prototype.updateTitles): Added. (WI.JavaScriptBreakpointTreeElement.prototype._breakpointLocationDidChange): * UserInterface/Views/JavaScriptBreakpointTreeElement.css: Copied from Source/WebInspectorUI/UserInterface/Views/BreakpointTreeElement.css. (.item.breakpoint.javascript .status > .status-image): Added. (.item.breakpoint.javascript .status > .status-image.resolved): Added. (body:not(.window-inactive, .window-docked-inactive) .tree-outline:focus-within .item.breakpoint.javascript.selected .status > .status-image.resolved): Added. (.item.breakpoint.javascript .subtitle.formatted-location): Added. (.item.breakpoint.javascript.line .icon): Added. (.item.breakpoint.javascript.line .icon > span): Added. (.data-updated.item.breakpoint.javascript.line .icon > span): Added. (.item.breakpoint.javascript.debugger-statement .icon): Added. (.item.breakpoint.javascript.exception .icon): Added. (.item.breakpoint.javascript.assertion .icon): Added. (.item.breakpoint.javascript.microtask .icon): Added. (@media (prefers-color-scheme: dark) .item.breakpoint.javascript.line .icon): Added. (@media (prefers-color-scheme: dark) .item.breakpoint.javascript.debugger-statement .icon): Added. (@media (prefers-color-scheme: dark) .item.breakpoint.javascript.exception .icon): Added. (@media (prefers-color-scheme: dark) .item.breakpoint.javascript.assertion .icon): Added. (@media (prefers-color-scheme: dark) .item.breakpoint.javascript.microtask .icon): Added. * UserInterface/Views/URLBreakpointTreeElement.js: (WI.URLBreakpointTreeElement): (WI.URLBreakpointTreeElement.prototype.onattach): Deleted. (WI.URLBreakpointTreeElement.prototype.ondetach): Deleted. (WI.URLBreakpointTreeElement.prototype.ondelete): Deleted. (WI.URLBreakpointTreeElement.prototype.onenter): Deleted. (WI.URLBreakpointTreeElement.prototype.onspace): Deleted. (WI.URLBreakpointTreeElement.prototype.populateContextMenu): Deleted. (WI.URLBreakpointTreeElement.prototype._statusImageElementClicked): Deleted. (WI.URLBreakpointTreeElement.prototype._statusImageElementFocused): Deleted. (WI.URLBreakpointTreeElement.prototype._statusImageElementMouseDown): Deleted. (WI.URLBreakpointTreeElement.prototype._toggleBreakpoint): Deleted. (WI.URLBreakpointTreeElement.prototype._updateStatus): Deleted. * UserInterface/Views/URLBreakpointTreeElement.css: (.item.breakpoint.url .subtitle): Added. (.item.breakpoint.url:not(.paused) .icon): Added. (@media (prefers-color-scheme: dark) .item.breakpoint.url:not(.paused) .icon): Added. (.breakpoint.url .subtitle): Deleted. (.breakpoint.url:not(.breakpoint-paused-icon) .icon): Deleted. (@media (prefers-color-scheme: dark) .breakpoint.url:not(.breakpoint-paused-icon) .icon): Deleted. Rename `WI.BreakpointTreeElement` to `WI.JavaScriptBreakpointTreeElement` and use `WI.BreakpointTreeElement` as a new common base class for all breakpoint tree elements, allowing more logic and styles to be shared (e.g. disabled state). * UserInterface/Views/SourcesNavigationSidebarPanel.js: (WI.SourcesNavigationSidebarPanel): (WI.SourcesNavigationSidebarPanel.prototype.closed): (WI.SourcesNavigationSidebarPanel.prototype._insertDebuggerTreeElement): (WI.SourcesNavigationSidebarPanel.prototype._compareJavaScriptBreakpointTreeElements): Added. (WI.SourcesNavigationSidebarPanel.prototype._addBreakpoint): (WI.SourcesNavigationSidebarPanel.prototype._removeAllBreakpoints): (WI.SourcesNavigationSidebarPanel.prototype._breakpointsBeneathTreeElement): (WI.SourcesNavigationSidebarPanel.prototype._addIssue): (WI.SourcesNavigationSidebarPanel.prototype._updatePauseReasonSection): (WI.SourcesNavigationSidebarPanel.prototype._handleTreeSelectionDidChange): (WI.SourcesNavigationSidebarPanel.prototype._handleBreakpointElementAddedOrRemoved): (WI.SourcesNavigationSidebarPanel.prototype._populateCreateBreakpointContextMenu.addToggleForSpecialEventBreakpoint): (WI.SourcesNavigationSidebarPanel.prototype._populateCreateBreakpointContextMenu): (WI.SourcesNavigationSidebarPanel.prototype._handleDebuggerObjectDisplayLocationDidChange): (WI.SourcesNavigationSidebarPanel.prototype._compareBreakpointTreeElements): Deleted. * UserInterface/Models/ProbeSet.js: (WI.ProbeSet): (WI.ProbeSet.prototype.createProbe): (WI.ProbeSet.prototype.willRemove): * UserInterface/Controllers/TimelineManager.js: (WI.TimelineManager.prototype._processRecord): * UserInterface/Views/ProbeSetDetailsSection.js: (WI.ProbeSetDetailsSection): * UserInterface/Views/ProbeDetailsSidebarPanel.js: (WI.ProbeDetailsSidebarPanel.prototype.inspect): * UserInterface/Views/SourceCodeTextEditor.js: (WI.SourceCodeTextEditor): (WI.SourceCodeTextEditor.prototype.close): (WI.SourceCodeTextEditor.prototype.textEditorBreakpointAdded): * UserInterface/Views/TextResourceContentView.js: (WI.TextResourceContentView.prototype.get supplementalRepresentedObjects): (WI.TextResourceContentView.prototype._probeSetsChanged): Probes now support `WI.EventBreakpoint` in addition to `WI.JavaScriptBreakpoint`. * UserInterface/Views/ContentView.js: (WI.ContentView.createFromRepresentedObject): (WI.ContentView.resolvedRepresentedObjectForRepresentedObject): (WI.ContentView.isViewable): * UserInterface/Views/ContextMenuUtilities.js: (WI.appendContextMenuItemsForSourceCode): Replace `WI.Breakpoint` with `WI.JavaScriptBreakpoint`. * UserInterface/Views/DOMTreeContentView.js: (WI.DOMTreeContentView): Replace `WI.DOMBreakpoint` with `WI.Breakpoint`. * UserInterface/Views/EventListenerSectionGroup.js: (WI.EventListenerSectionGroup): * UserInterface/Views/EventListenerSectionGroup.css: (.event-listener-section > .content input[type="checkbox"] + .go-to-arrow): Added. (.event-listener-section > .content input[type="checkbox"]:not(:checked) + .go-to-arrow): Added. Add a go-to arrow next to the Breakpoint checkbox that reveals the `WI.EventBreakpoint` in the Sources Tab. * UserInterface/Views/BreakpointActionView.js: (WI.BreakpointActionView.prototype._appendActionButtonClicked): Drive-by: minor code cleanup. * UserInterface/Views/CallFrameTreeElement.js: (WI.CallFrameTreeElement.prototype.populateContextMenu): Drive-by: include source code location context menu items. * UserInterface/Base/Setting.js: * UserInterface/Main.html: * UserInterface/Test.html: LayoutTests: * inspector/dom-debugger/resources/event-breakpoint-utilities.js: (TestPage.registerInitializer.InspectorTest.EventBreakpoint.addBreakpointOptionsTestCases): Added. (TestPage.registerInitializer.InspectorTest.EventBreakpoint.async teardown): (TestPage.registerInitializer.InspectorTest.EventBreakpoint.createBreakpoint): (TestPage.registerInitializer.InspectorTest.EventBreakpoint.removeBreakpoint): * inspector/dom/breakpoint-for-event-listener.html: * inspector/dom/breakpoint-for-event-listener-expected.txt: * inspector/dom-debugger/event-animation-frame-breakpoints.html: * inspector/dom-debugger/event-animation-frame-breakpoints-expected.txt: * inspector/dom-debugger/event-interval-breakpoints.html: * inspector/dom-debugger/event-interval-breakpoints-expected.txt: * inspector/dom-debugger/event-listener-breakpoints.html: * inspector/dom-debugger/event-listener-breakpoints-expected.txt: * inspector/dom-debugger/event-timeout-breakpoints.html: * inspector/dom-debugger/event-timeout-breakpoints-expected.txt: Add tests for new event breakpoint configuration options. * http/tests/inspector/debugger/debugger-test.js: (TestPage.registerInitializer.InspectorTest.startTracingBreakpoints): * http/tests/inspector/resources/probe-test.js: (TestPage.registerInitializer.ProtocolTest.Probe.installTracingListeners): * inspector/debugger/breakpoint-action-eval.html: * inspector/debugger/breakpoint-action-log.html: * inspector/debugger/breakpoint-columns.html: * inspector/debugger/breakpoint-scope.html: * inspector/debugger/debugger-stack-overflow.html: * inspector/debugger/pause-reason.html: * inspector/debugger/probe-manager-add-remove-actions.html: * inspector/debugger/stepping/stepping-through-autoContinue-breakpoint.html: * inspector/debugger/tail-deleted-frames-this-value.html: * inspector/debugger/tail-recursion.html: * inspector/worker/debugger-pause.html: * inspector/worker/debugger-shared-breakpoint.html: Update existing breakpoint tests to use new model objects. Canonical link: https://commits.webkit.org/228551@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@266074 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2020-08-24 17:34:12 +00:00
Web Inspector: support breakpoints for timers and animation-frame events https://bugs.webkit.org/show_bug.cgi?id=188778 Reviewed by Brian Burg. Source/JavaScriptCore: * inspector/protocol/Debugger.json: Add `AnimationFrame` and `Timer` types to the list of pause reasons. * inspector/protocol/DOMDebugger.json: Introduced `setEventBreakpoint` and `removeEventBreakpoint` to replace the more specific: - `setEventListenerBreakpoint` - `removeEventListenerBreakpoint` - `setInstrumentationBreakpoint` - `removeInstrumentationBreakpoint` Also created an `EventBreakpointType` to enumerate the available types of event breakpoints. * inspector/scripts/codegen/generate_cpp_protocol_types_header.py: (CppProtocolTypesHeaderGenerator.generate_output): (CppProtocolTypesHeaderGenerator._generate_forward_declarations_for_binding_traits): (CppProtocolTypesHeaderGenerator._generate_declarations_for_enum_conversion_methods): (CppProtocolTypesHeaderGenerator._generate_hash_declarations): Added. Generate `DefaultHash` for all `enum class` used by inspector protocols. * inspector/scripts/tests/generic/expected/commands-with-async-attribute.json-result: * inspector/scripts/tests/generic/expected/commands-with-optional-call-return-parameters.json-result: * inspector/scripts/tests/generic/expected/enum-values.json-result: * inspector/scripts/tests/generic/expected/type-declaration-array-type.json-result: * inspector/scripts/tests/generic/expected/type-declaration-enum-type.json-result: * inspector/scripts/tests/generic/expected/type-declaration-object-type.json-result: * inspector/scripts/tests/generic/expected/type-requiring-runtime-casts.json-result: Source/WebCore: The original implementation of "instrumentation" breakpoints relied upon the frontend sending somewhat arbitrary strings when enabling breakpoints for specific events. As an example, setting a breakpoint for `requestAnimationFrame` expects `"animationFrameFired"` as the string, which doesn't make much sense. This patch removes the usage of these strings and instead expects the agent to implement a method that matches what is happening. Tests: inspector/dom-debugger/event-animation-frame-breakpoints.html inspector/dom-debugger/event-listener-breakpoints.html inspector/dom-debugger/event-timer-breakpoints.html * inspector/InspectorInstrumentation.h: (WebCore::InspectorInstrumentation::willFireTimer): * inspector/InspectorInstrumentation.cpp: (WebCore::InspectorInstrumentation::didInstallTimerImpl): (WebCore::InspectorInstrumentation::didRemoveTimerImpl): (WebCore::InspectorInstrumentation::willFireTimerImpl): (WebCore::InspectorInstrumentation::didRequestAnimationFrameImpl): (WebCore::InspectorInstrumentation::didCancelAnimationFrameImpl): (WebCore::InspectorInstrumentation::willFireAnimationFrameImpl): (WebCore::InspectorInstrumentation::pauseOnNativeEventIfNeeded): Deleted. * inspector/agents/InspectorDOMDebuggerAgent.h: * inspector/agents/InspectorDOMDebuggerAgent.cpp: (WebCore::InspectorDOMDebuggerAgent::setEventBreakpoint): Added. (WebCore::InspectorDOMDebuggerAgent::removeEventBreakpoint): Added. (WebCore::InspectorDOMDebuggerAgent::willHandleEvent): (WebCore::InspectorDOMDebuggerAgent::willFireTimer): Added. (WebCore::InspectorDOMDebuggerAgent::willFireAnimationFrame): Added. (WebCore::InspectorDOMDebuggerAgent::setEventListenerBreakpoint): Deleted. (WebCore::InspectorDOMDebuggerAgent::setInstrumentationBreakpoint): Deleted. (WebCore::InspectorDOMDebuggerAgent::setBreakpoint): Deleted. (WebCore::InspectorDOMDebuggerAgent::removeEventListenerBreakpoint): Deleted. (WebCore::InspectorDOMDebuggerAgent::removeInstrumentationBreakpoint): Deleted. (WebCore::InspectorDOMDebuggerAgent::removeBreakpoint): Deleted. (WebCore::InspectorDOMDebuggerAgent::pauseOnNativeEventIfNeeded): Deleted. Unify the event listener and instrumentation breakpoint commands into a single method, `setEventBreakpoint`, that takes in both an `EventBreakpointType` and `eventName`. * page/DOMTimer.cpp: (WebCore::DOMTimer::fired): Source/WebInspectorUI: Add a `type` to `WI.EventBreakpoint` that matches `DOMDebugger.EventBreakpointType`: - `AnimationFrame` for `requestAnimationFrame` - `Listener` for any named DOM Event - `Timer` for `setTimeout` and `setInterval` Modified `WI.EventBreakpointPopover` to provide ways for selecting these other types, which is then passed to `WI.DOMDebuggerManager`, which now calls through to the newly added `DOMDebugger.removeEventBreakpoint` and `DOMDebugger.setEventBreakpoint` that sets breakpoints for all event types. * Localizations/en.lproj/localizedStrings.js: * UserInterface/Images/EventBreakpointAnimationFrame.svg: Added. * UserInterface/Images/EventBreakpointListener.svg: Renamed from Source/WebInspectorUI/UserInterface/Images/EventBreakpoint.svg. * UserInterface/Images/EventBreakpointTimer.svg: Added. * UserInterface/Controllers/DOMDebuggerManager.js: (WI.DOMDebuggerManager.supportsEventBreakpoints): Added. (WI.DOMDebuggerManager.prototype.eventBreakpointForTypeAndEventName): Added. (WI.DOMDebuggerManager.prototype.addEventBreakpoint): (WI.DOMDebuggerManager.prototype.removeEventBreakpoint.breakpointRemoved): Added. (WI.DOMDebuggerManager.prototype.removeEventBreakpoint): (WI.DOMDebuggerManager.prototype._updateEventBreakpoint): (WI.DOMDebuggerManager.prototype.eventBreakpointForEventName): Deleted. * UserInterface/Controllers/DOMTreeManager.js: (WI.DOMTreeManager.prototype.setBreakpointForEventListener): * UserInterface/Controllers/DebuggerManager.js: (WI.DebuggerManager.prototype._pauseReasonFromPayload): * UserInterface/Models/EventBreakpoint.js: (WI.EventBreakpoint): (WI.EventBreakpoint.fromPayload): (WI.EventBreakpoint.prototype.get type): Added. (WI.EventBreakpoint.prototype.get serializableInfo): (WI.EventBreakpoint.prototype.saveIdentityToCookie): * UserInterface/Views/DebuggerSidebarPanel.js: (WI.DebuggerSidebarPanel.prototype._updatePauseReasonSection): (WI.DebuggerSidebarPanel.prototype.willDismissPopover): * UserInterface/Views/EventBreakpointPopover.js: (WI.EventBreakpointPopover): (WI.EventBreakpointPopover.prototype.get breakpoint): Added. (WI.EventBreakpointPopover.prototype.show): (WI.EventBreakpointPopover.prototype.show.createOption): Added. (WI.EventBreakpointPopover.prototype.dismiss): Added. (WI.EventBreakpointPopover.prototype._presentOverTargetElement): (WI.EventBreakpointPopover.prototype._handleTypeSelectChange): Added. (WI.EventBreakpointPopover.prototype.get result): Deleted. (WI.EventBreakpointPopover.prototype.get value): Deleted. * UserInterface/Views/EventBreakpointPopover.css: (.popover .event-breakpoint-content > .event-type): Added. (.popover .event-breakpoint-content > input): Deleted. * UserInterface/Views/EventBreakpointTreeElement.js: (WI.EventBreakpointTreeElement): * UserInterface/Views/EventBreakpointTreeElement.css: (.breakpoint.event.animation-frame:not(.breakpoint-paused-icon) .icon): Added. (.breakpoint.event.listener:not(.breakpoint-paused-icon) .icon): Added. (.breakpoint.event.timer:not(.breakpoint-paused-icon) .icon): Added. (.breakpoint.event:not(.breakpoint-paused-icon) .icon): Deleted. LayoutTests: * inspector/dom-debugger/event-animation-frame-breakpoints-expected.txt: Added. * inspector/dom-debugger/event-animation-frame-breakpoints.html: Added. * inspector/dom-debugger/event-breakpoint-with-navigation.html: * inspector/dom-debugger/event-timer-breakpoints-expected.txt: Added. * inspector/dom-debugger/event-timer-breakpoints.html: Added. * inspector/dom-debugger/event-listener-breakpoints-expected.txt: Renamed from LayoutTests/inspector/dom-debugger/event-breakpoints-expected.txt. * inspector/dom-debugger/event-listener-breakpoints.html: Renamed from LayoutTests/inspector/dom-debugger/event-breakpoints.html. * inspector/dom-debugger/resources/event-breakpoint-utilities.js: Added. (TestPage.registerInitializer.window.teardown): (TestPage.registerInitializer.window.failOnPause): (TestPage.registerInitializer.window.addBreakpoint): (TestPage.registerInitializer.window.removeBreakpoint): (TestPage.registerInitializer.window.disableBreakpoint): (TestPage.registerInitializer.window.awaitEvent): Canonical link: https://commits.webkit.org/203952@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@235248 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2018-08-23 21:36:40 +00:00
suite.runTestCasesAndFinish();
}
</script>
</head>
<body onload="runTest()">
<p>Tests for Event Listener breakpoints.</p>
<div id="x"></div>
<script>
document.body.addEventListener("click", handleBody_click);
document.body.addEventListener("custom", handleBody_custom);
document.getElementById("x").addEventListener("click", handleX_click);
</script>
</body>
</html>