Changeset 249305 in webkit


Ignore:
Timestamp:
Aug 29, 2019 6:08:03 PM (5 years ago)
Author:
Devin Rousso
Message:

Web Inspector: DOMDebugger: support event breakpoints in Worker contexts
https://bugs.webkit.org/show_bug.cgi?id=200651

Reviewed by Joseph Pecoraro.

Source/JavaScriptCore:

  • inspector/protocol/DOMDebugger.json:

Make the domain available in "worker" contexts as well.

Source/WebCore:

Tests: inspector/worker/dom-debugger-dom-breakpoints.html

inspector/worker/dom-debugger-event-animation-frame-breakpoints.html
inspector/worker/dom-debugger-event-interval-breakpoints.html
inspector/worker/dom-debugger-event-listener-breakpoints.html
inspector/worker/dom-debugger-event-timeout-breakpoints.html
inspector/worker/dom-debugger-url-breakpoints.html

  • inspector/agents/InspectorDOMDebuggerAgent.h:
  • inspector/agents/InspectorDOMDebuggerAgent.cpp:

(WebCore::InspectorDOMDebuggerAgent::InspectorDOMDebuggerAgent):
(WebCore::InspectorDOMDebuggerAgent::enabled const):
(WebCore::InspectorDOMDebuggerAgent::enable):
(WebCore::InspectorDOMDebuggerAgent::disable):
(WebCore::InspectorDOMDebuggerAgent::debuggerWasEnabled):
(WebCore::InspectorDOMDebuggerAgent::debuggerWasDisabled):
(WebCore::InspectorDOMDebuggerAgent::setEventBreakpoint):
(WebCore::InspectorDOMDebuggerAgent::removeEventBreakpoint):
(WebCore::InspectorDOMDebuggerAgent::~InspectorDOMDebuggerAgent): Deleted.
(WebCore::InspectorDOMDebuggerAgent::frameDocumentUpdated): Deleted.
(WebCore::InspectorDOMDebuggerAgent::willInvalidateStyleAttr): Deleted.
(WebCore::InspectorDOMDebuggerAgent::didInsertDOMNode): Deleted.
(WebCore::InspectorDOMDebuggerAgent::didRemoveDOMNode): Deleted.
(WebCore::domTypeForName): Deleted.
(WebCore::domTypeName): Deleted.
(WebCore::InspectorDOMDebuggerAgent::setDOMBreakpoint): Deleted.
(WebCore::InspectorDOMDebuggerAgent::removeDOMBreakpoint): Deleted.
(WebCore::InspectorDOMDebuggerAgent::willInsertDOMNode): Deleted.
(WebCore::InspectorDOMDebuggerAgent::willRemoveDOMNode): Deleted.
(WebCore::InspectorDOMDebuggerAgent::willModifyDOMAttr): Deleted.
(WebCore::InspectorDOMDebuggerAgent::descriptionForDOMEvent): Deleted.
(WebCore::InspectorDOMDebuggerAgent::hasBreakpoint): Deleted.
(WebCore::InspectorDOMDebuggerAgent::updateSubtreeBreakpoints): Deleted.
(WebCore::InspectorDOMDebuggerAgent::willFireAnimationFrame): Deleted.

  • inspector/agents/page/PageDOMDebuggerAgent.h: Added.
  • inspector/agents/page/PageDOMDebuggerAgent.cpp: Added.

(WebCore::domTypeForName):
(WebCore::domTypeName):
(WebCore::PageDOMDebuggerAgent::PageDOMDebuggerAgent):
(WebCore::PageDOMDebuggerAgent::enabled const):
(WebCore::PageDOMDebuggerAgent::enable):
(WebCore::PageDOMDebuggerAgent::disable):
(WebCore::PageDOMDebuggerAgent::setDOMBreakpoint):
(WebCore::PageDOMDebuggerAgent::removeDOMBreakpoint):
(WebCore::PageDOMDebuggerAgent::frameDocumentUpdated):
(WebCore::PageDOMDebuggerAgent::willInsertDOMNode):
(WebCore::PageDOMDebuggerAgent::didInsertDOMNode):
(WebCore::PageDOMDebuggerAgent::willRemoveDOMNode):
(WebCore::PageDOMDebuggerAgent::didRemoveDOMNode):
(WebCore::PageDOMDebuggerAgent::willModifyDOMAttr):
(WebCore::PageDOMDebuggerAgent::willFireAnimationFrame):
(WebCore::PageDOMDebuggerAgent::willInvalidateStyleAttr):
(WebCore::PageDOMDebuggerAgent::setAnimationFrameBreakpoint):
(WebCore::PageDOMDebuggerAgent::descriptionForDOMEvent):
(WebCore::PageDOMDebuggerAgent::updateSubtreeBreakpoints):
(WebCore::PageDOMDebuggerAgent::hasBreakpoint):

  • inspector/agents/worker/WorkerDOMDebuggerAgent.h: Added.
  • inspector/agents/worker/WorkerDOMDebuggerAgent.cpp: Added.

(WebCore::WorkerDOMDebuggerAgent::WorkerDOMDebuggerAgent):
(WebCore::WorkerDOMDebuggerAgent::setDOMBreakpoint):
(WebCore::WorkerDOMDebuggerAgent::removeDOMBreakpoint):
(WebCore::WorkerDOMDebuggerAgent::setAnimationFrameBreakpoint):
Split the InspectorDOMDebuggerAgent into two subclasses depending on the inspected target
type, as certain DOMDebugger commands don't make sense for a Worker context:

  • DOM breakpoints, as there is no DOM in a Worker context
  • animation frame event breakpoints, as there is no requestAnimationFrame function
  • inspector/InspectorController.cpp:

(WebCore::InspectorController::createLazyAgents):

  • inspector/WorkerInspectorController.cpp:

(WebCore::WorkerInspectorController::createLazyAgents):

  • inspector/InstrumentingAgents.h:

(WebCore::InstrumentingAgents::pageDOMDebuggerAgent const): Added.
(WebCore::InstrumentingAgents::setPageDOMDebuggerAgent): Added.

  • inspector/InstrumentingAgents.cpp:

(WebCore::InstrumentingAgents::reset):

  • inspector/InspectorInstrumentation.cpp:

(WebCore::InspectorInstrumentation::willInsertDOMNodeImpl):
(WebCore::InspectorInstrumentation::didInsertDOMNodeImpl):
(WebCore::InspectorInstrumentation::willRemoveDOMNodeImpl):
(WebCore::InspectorInstrumentation::didRemoveDOMNodeImpl):
(WebCore::InspectorInstrumentation::willModifyDOMAttrImpl):
(WebCore::InspectorInstrumentation::willInvalidateStyleAttrImpl):
(WebCore::InspectorInstrumentation::frameDocumentUpdatedImpl):
(WebCore::InspectorInstrumentation::willFireAnimationFrameImpl):

  • Sources.txt:
  • WebCore.xcodeproj/project.pbxproj:

Source/WebInspectorUI:

  • UserInterface/Controllers/DOMDebuggerManager.js:

(WI.DOMDebuggerManager.prototype._updateDOMBreakpoint):
(WI.DOMDebuggerManager.prototype._updateEventBreakpoint):
Add assertions when adding/removing DOM breakpoints or animation frame event breakpoints if
the target is a WI.WorkerTarget, as neither are supported by Workers.

LayoutTests:

  • inspector/worker/dom-debugger-dom-breakpoints.html: Added.
  • inspector/worker/dom-debugger-dom-breakpoints-expected.txt: Added.
  • inspector/worker/dom-debugger-event-animation-frame-breakpoints.html: Added.
  • inspector/worker/dom-debugger-event-animation-frame-breakpoints-expected.txt: Added.
  • inspector/worker/dom-debugger-event-interval-breakpoints.html: Added.
  • inspector/worker/dom-debugger-event-interval-breakpoints-expected.txt: Added.
  • inspector/worker/dom-debugger-event-listener-breakpoints.html: Added.
  • inspector/worker/dom-debugger-event-listener-breakpoints-expected.txt: Added.
  • inspector/worker/dom-debugger-event-timeout-breakpoints.html: Added.
  • inspector/worker/dom-debugger-event-timeout-breakpoints-expected.txt: Added.
  • inspector/worker/dom-debugger-url-breakpoints.html: Added.
  • inspector/worker/dom-debugger-url-breakpoints-expected.txt: Added.
  • inspector/debugger/resources/log-active-stack-trace.js: Added.

(TestPage.registerInitializer.window.logStackTrace): Added.
(TestPage.registerInitializer.window.logActiveStackTrace):

  • inspector/worker/resources/dom-debugger-utilities.js: Added.

(TestPage.registerInitializer.InspectorTest.Worker.DOMDebugger.createWorkerTarget):

  • inspector/worker/resources/worker-dom-debugger.js: Added.
Location:
trunk
Files:
18 added
16 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r249301 r249305  
     12019-08-29  Devin Rousso  <drousso@apple.com>
     2
     3        Web Inspector: DOMDebugger: support event breakpoints in Worker contexts
     4        https://bugs.webkit.org/show_bug.cgi?id=200651
     5
     6        Reviewed by Joseph Pecoraro.
     7
     8        * inspector/worker/dom-debugger-dom-breakpoints.html: Added.
     9        * inspector/worker/dom-debugger-dom-breakpoints-expected.txt: Added.
     10        * inspector/worker/dom-debugger-event-animation-frame-breakpoints.html: Added.
     11        * inspector/worker/dom-debugger-event-animation-frame-breakpoints-expected.txt: Added.
     12        * inspector/worker/dom-debugger-event-interval-breakpoints.html: Added.
     13        * inspector/worker/dom-debugger-event-interval-breakpoints-expected.txt: Added.
     14        * inspector/worker/dom-debugger-event-listener-breakpoints.html: Added.
     15        * inspector/worker/dom-debugger-event-listener-breakpoints-expected.txt: Added.
     16        * inspector/worker/dom-debugger-event-timeout-breakpoints.html: Added.
     17        * inspector/worker/dom-debugger-event-timeout-breakpoints-expected.txt: Added.
     18        * inspector/worker/dom-debugger-url-breakpoints.html: Added.
     19        * inspector/worker/dom-debugger-url-breakpoints-expected.txt: Added.
     20
     21        * inspector/debugger/resources/log-active-stack-trace.js: Added.
     22        (TestPage.registerInitializer.window.logStackTrace): Added.
     23        (TestPage.registerInitializer.window.logActiveStackTrace):
     24
     25        * inspector/worker/resources/dom-debugger-utilities.js: Added.
     26        (TestPage.registerInitializer.InspectorTest.Worker.DOMDebugger.createWorkerTarget):
     27        * inspector/worker/resources/worker-dom-debugger.js: Added.
     28
    1292019-08-29  Devin Rousso  <drousso@apple.com>
    230
  • trunk/LayoutTests/inspector/debugger/resources/log-active-stack-trace.js

    r220119 r249305  
    11TestPage.registerInitializer(() => {
     2    window.logStackTrace = function(stackTrace) {
     3        let foundAsyncBoundary = false;
     4        let callFrameIndex = 0;
     5
     6        function logCallFrame(callFrame, isAsyncBoundary) {
     7            let label = callFrame.functionName;
     8            if (isAsyncBoundary)
     9                InspectorTest.log(`${callFrameIndex}: --- ${label} ---`);
     10            else {
     11                let code = callFrame.nativeCode ? "N" : (callFrame.programCode ? "P" : "F");
     12                InspectorTest.log(`${callFrameIndex}: [${code}] ${label}`);
     13            }
     14            callFrameIndex++;
     15        }
     16
     17        InspectorTest.log("CALL STACK:");
     18
     19        while (stackTrace) {
     20            let callFrames = stackTrace.callFrames;
     21            let topCallFrameIsBoundary = stackTrace.topCallFrameIsBoundary;
     22            let truncated = stackTrace.truncated;
     23            stackTrace = stackTrace.parentStackTrace;
     24            if (!callFrames || !callFrames.length)
     25                continue;
     26
     27            if (topCallFrameIsBoundary) {
     28                if (!foundAsyncBoundary) {
     29                    InspectorTest.log("ASYNC CALL STACK:");
     30                    foundAsyncBoundary = true;
     31                }
     32                logCallFrame(callFrames[0], true);
     33            }
     34
     35            for (let i = topCallFrameIsBoundary ? 1 : 0; i < callFrames.length; ++i) {
     36                let callFrame = callFrames[i];
     37                logCallFrame(callFrame);
     38
     39                // Skip call frames after the test harness entry point.
     40                if (callFrame.programCode)
     41                    break;
     42            }
     43
     44            if (truncated)
     45                InspectorTest.log("(remaining call frames truncated)");
     46        }
     47    };
     48
    249    window.getActiveStackTrace = function() {
    350        InspectorTest.assert(WI.debuggerManager.activeCallFrame, "Active call frame should exist.");
     
    1663
    1764    window.logActiveStackTrace = function() {
    18         function logStackTrace(stackTrace) {
    19             let foundAsyncBoundary = false;
    20             let callFrameIndex = 0;
    21 
    22             function logCallFrame(callFrame, isAsyncBoundary) {
    23                 let label = callFrame.functionName;
    24                 if (isAsyncBoundary)
    25                     InspectorTest.log(`${callFrameIndex}: --- ${label} ---`);
    26                 else {
    27                     let code = callFrame.nativeCode ? "N" : (callFrame.programCode ? "P" : "F");
    28                     InspectorTest.log(`${callFrameIndex}: [${code}] ${label}`);
    29                 }
    30                 callFrameIndex++;
    31             }
    32 
    33             InspectorTest.log("CALL STACK:");
    34 
    35             while (stackTrace) {
    36                 let callFrames = stackTrace.callFrames;
    37                 let topCallFrameIsBoundary = stackTrace.topCallFrameIsBoundary;
    38                 let truncated = stackTrace.truncated;
    39                 stackTrace = stackTrace.parentStackTrace;
    40                 if (!callFrames || !callFrames.length)
    41                     continue;
    42 
    43                 if (topCallFrameIsBoundary) {
    44                     if (!foundAsyncBoundary) {
    45                         InspectorTest.log("ASYNC CALL STACK:");
    46                         foundAsyncBoundary = true;
    47                     }
    48                     logCallFrame(callFrames[0], true);
    49                 }
    50 
    51                 for (let i = topCallFrameIsBoundary ? 1 : 0; i < callFrames.length; ++i) {
    52                     let callFrame = callFrames[i];
    53                     logCallFrame(callFrame);
    54 
    55                     // Skip call frames after the test harness entry point.
    56                     if (callFrame.programCode)
    57                         break;
    58                 }
    59 
    60                 if (truncated)
    61                     InspectorTest.log("(remaining call frames truncated)");
    62             }
    63         }
    64 
    6565        logStackTrace(getActiveStackTrace());
    6666    }
  • trunk/Source/JavaScriptCore/ChangeLog

    r249304 r249305  
     12019-08-29  Devin Rousso  <drousso@apple.com>
     2
     3        Web Inspector: DOMDebugger: support event breakpoints in Worker contexts
     4        https://bugs.webkit.org/show_bug.cgi?id=200651
     5
     6        Reviewed by Joseph Pecoraro.
     7
     8        * inspector/protocol/DOMDebugger.json:
     9        Make the domain available in "worker" contexts as well.
     10
    1112019-08-29  Keith Rollin  <krollin@apple.com>
    212
  • trunk/Source/JavaScriptCore/inspector/protocol/DOMDebugger.json

    r248201 r249305  
    22    "domain": "DOMDebugger",
    33    "description": "DOM debugging allows setting breakpoints on particular DOM operations and events. JavaScript execution will stop on these operations as if there was a regular breakpoint set.",
    4     "availability": ["web"],
     4    "availability": ["web", "worker"],
    55    "types": [
    66        {
  • trunk/Source/WebCore/ChangeLog

    r249302 r249305  
     12019-08-29  Devin Rousso  <drousso@apple.com>
     2
     3        Web Inspector: DOMDebugger: support event breakpoints in Worker contexts
     4        https://bugs.webkit.org/show_bug.cgi?id=200651
     5
     6        Reviewed by Joseph Pecoraro.
     7
     8        Tests: inspector/worker/dom-debugger-dom-breakpoints.html
     9               inspector/worker/dom-debugger-event-animation-frame-breakpoints.html
     10               inspector/worker/dom-debugger-event-interval-breakpoints.html
     11               inspector/worker/dom-debugger-event-listener-breakpoints.html
     12               inspector/worker/dom-debugger-event-timeout-breakpoints.html
     13               inspector/worker/dom-debugger-url-breakpoints.html
     14
     15        * inspector/agents/InspectorDOMDebuggerAgent.h:
     16        * inspector/agents/InspectorDOMDebuggerAgent.cpp:
     17        (WebCore::InspectorDOMDebuggerAgent::InspectorDOMDebuggerAgent):
     18        (WebCore::InspectorDOMDebuggerAgent::enabled const):
     19        (WebCore::InspectorDOMDebuggerAgent::enable):
     20        (WebCore::InspectorDOMDebuggerAgent::disable):
     21        (WebCore::InspectorDOMDebuggerAgent::debuggerWasEnabled):
     22        (WebCore::InspectorDOMDebuggerAgent::debuggerWasDisabled):
     23        (WebCore::InspectorDOMDebuggerAgent::setEventBreakpoint):
     24        (WebCore::InspectorDOMDebuggerAgent::removeEventBreakpoint):
     25        (WebCore::InspectorDOMDebuggerAgent::~InspectorDOMDebuggerAgent): Deleted.
     26        (WebCore::InspectorDOMDebuggerAgent::frameDocumentUpdated): Deleted.
     27        (WebCore::InspectorDOMDebuggerAgent::willInvalidateStyleAttr): Deleted.
     28        (WebCore::InspectorDOMDebuggerAgent::didInsertDOMNode): Deleted.
     29        (WebCore::InspectorDOMDebuggerAgent::didRemoveDOMNode): Deleted.
     30        (WebCore::domTypeForName): Deleted.
     31        (WebCore::domTypeName): Deleted.
     32        (WebCore::InspectorDOMDebuggerAgent::setDOMBreakpoint): Deleted.
     33        (WebCore::InspectorDOMDebuggerAgent::removeDOMBreakpoint): Deleted.
     34        (WebCore::InspectorDOMDebuggerAgent::willInsertDOMNode): Deleted.
     35        (WebCore::InspectorDOMDebuggerAgent::willRemoveDOMNode): Deleted.
     36        (WebCore::InspectorDOMDebuggerAgent::willModifyDOMAttr): Deleted.
     37        (WebCore::InspectorDOMDebuggerAgent::descriptionForDOMEvent): Deleted.
     38        (WebCore::InspectorDOMDebuggerAgent::hasBreakpoint): Deleted.
     39        (WebCore::InspectorDOMDebuggerAgent::updateSubtreeBreakpoints): Deleted.
     40        (WebCore::InspectorDOMDebuggerAgent::willFireAnimationFrame): Deleted.
     41        * inspector/agents/page/PageDOMDebuggerAgent.h: Added.
     42        * inspector/agents/page/PageDOMDebuggerAgent.cpp: Added.
     43        (WebCore::domTypeForName):
     44        (WebCore::domTypeName):
     45        (WebCore::PageDOMDebuggerAgent::PageDOMDebuggerAgent):
     46        (WebCore::PageDOMDebuggerAgent::enabled const):
     47        (WebCore::PageDOMDebuggerAgent::enable):
     48        (WebCore::PageDOMDebuggerAgent::disable):
     49        (WebCore::PageDOMDebuggerAgent::setDOMBreakpoint):
     50        (WebCore::PageDOMDebuggerAgent::removeDOMBreakpoint):
     51        (WebCore::PageDOMDebuggerAgent::frameDocumentUpdated):
     52        (WebCore::PageDOMDebuggerAgent::willInsertDOMNode):
     53        (WebCore::PageDOMDebuggerAgent::didInsertDOMNode):
     54        (WebCore::PageDOMDebuggerAgent::willRemoveDOMNode):
     55        (WebCore::PageDOMDebuggerAgent::didRemoveDOMNode):
     56        (WebCore::PageDOMDebuggerAgent::willModifyDOMAttr):
     57        (WebCore::PageDOMDebuggerAgent::willFireAnimationFrame):
     58        (WebCore::PageDOMDebuggerAgent::willInvalidateStyleAttr):
     59        (WebCore::PageDOMDebuggerAgent::setAnimationFrameBreakpoint):
     60        (WebCore::PageDOMDebuggerAgent::descriptionForDOMEvent):
     61        (WebCore::PageDOMDebuggerAgent::updateSubtreeBreakpoints):
     62        (WebCore::PageDOMDebuggerAgent::hasBreakpoint):
     63        * inspector/agents/worker/WorkerDOMDebuggerAgent.h: Added.
     64        * inspector/agents/worker/WorkerDOMDebuggerAgent.cpp: Added.
     65        (WebCore::WorkerDOMDebuggerAgent::WorkerDOMDebuggerAgent):
     66        (WebCore::WorkerDOMDebuggerAgent::setDOMBreakpoint):
     67        (WebCore::WorkerDOMDebuggerAgent::removeDOMBreakpoint):
     68        (WebCore::WorkerDOMDebuggerAgent::setAnimationFrameBreakpoint):
     69        Split the `InspectorDOMDebuggerAgent` into two subclasses depending on the inspected target
     70        type, as certain `DOMDebugger` commands don't make sense for a `Worker` context:
     71         - DOM breakpoints, as there is no DOM in a `Worker` context
     72         - animation frame event breakpoints, as there is no `requestAnimationFrame` function
     73
     74        * inspector/InspectorController.cpp:
     75        (WebCore::InspectorController::createLazyAgents):
     76        * inspector/WorkerInspectorController.cpp:
     77        (WebCore::WorkerInspectorController::createLazyAgents):
     78
     79        * inspector/InstrumentingAgents.h:
     80        (WebCore::InstrumentingAgents::pageDOMDebuggerAgent const): Added.
     81        (WebCore::InstrumentingAgents::setPageDOMDebuggerAgent): Added.
     82        * inspector/InstrumentingAgents.cpp:
     83        (WebCore::InstrumentingAgents::reset):
     84
     85        * inspector/InspectorInstrumentation.cpp:
     86        (WebCore::InspectorInstrumentation::willInsertDOMNodeImpl):
     87        (WebCore::InspectorInstrumentation::didInsertDOMNodeImpl):
     88        (WebCore::InspectorInstrumentation::willRemoveDOMNodeImpl):
     89        (WebCore::InspectorInstrumentation::didRemoveDOMNodeImpl):
     90        (WebCore::InspectorInstrumentation::willModifyDOMAttrImpl):
     91        (WebCore::InspectorInstrumentation::willInvalidateStyleAttrImpl):
     92        (WebCore::InspectorInstrumentation::frameDocumentUpdatedImpl):
     93        (WebCore::InspectorInstrumentation::willFireAnimationFrameImpl):
     94
     95        * Sources.txt:
     96        * WebCore.xcodeproj/project.pbxproj:
     97
    1982019-08-29  Keith Rollin  <krollin@apple.com>
    299
  • trunk/Source/WebCore/Sources.txt

    r249212 r249305  
    13731373inspector/agents/page/PageAuditAgent.cpp
    13741374inspector/agents/page/PageConsoleAgent.cpp
     1375inspector/agents/page/PageDOMDebuggerAgent.cpp
    13751376inspector/agents/page/PageDebuggerAgent.cpp
    13761377inspector/agents/page/PageHeapAgent.cpp
     
    13811382inspector/agents/worker/WorkerAuditAgent.cpp
    13821383inspector/agents/worker/WorkerConsoleAgent.cpp
     1384inspector/agents/worker/WorkerDOMDebuggerAgent.cpp
    13831385inspector/agents/worker/WorkerDebuggerAgent.cpp
    13841386inspector/agents/worker/WorkerNetworkAgent.cpp
  • trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj

    r249217 r249305  
    25332533                91B952241F58A58F00931DC2 /* RecordingSwizzleTypes.h in Headers */ = {isa = PBXBuildFile; fileRef = 91B952221F58A58000931DC2 /* RecordingSwizzleTypes.h */; };
    25342534                91C9F2F91AE3BEB00095B61C /* AXTextStateChangeIntent.h in Headers */ = {isa = PBXBuildFile; fileRef = 91C9F2F81AE3BE240095B61C /* AXTextStateChangeIntent.h */; settings = {ATTRIBUTES = (Private, ); }; };
     2535                91E0DDC1230B41E50019E1E3 /* PageDOMDebuggerAgent.h in Headers */ = {isa = PBXBuildFile; fileRef = 91E0DDBF230B41E50019E1E3 /* PageDOMDebuggerAgent.h */; };
     2536                91E0DDC4230B41F10019E1E3 /* WorkerDOMDebuggerAgent.h in Headers */ = {isa = PBXBuildFile; fileRef = 91E0DDC2230B41F00019E1E3 /* WorkerDOMDebuggerAgent.h */; };
    25352537                9302B0BF0D79F82C00C7EE83 /* PageGroup.h in Headers */ = {isa = PBXBuildFile; fileRef = 9302B0BE0D79F82C00C7EE83 /* PageGroup.h */; settings = {ATTRIBUTES = (Private, ); }; };
    25362538                9305B24D098F1B6B00C28855 /* Timer.h in Headers */ = {isa = PBXBuildFile; fileRef = 9305B24C098F1B6B00C28855 /* Timer.h */; settings = {ATTRIBUTES = (Private, ); }; };
     
    1038410386                91B952221F58A58000931DC2 /* RecordingSwizzleTypes.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RecordingSwizzleTypes.h; sourceTree = "<group>"; };
    1038510387                91C9F2F81AE3BE240095B61C /* AXTextStateChangeIntent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AXTextStateChangeIntent.h; sourceTree = "<group>"; };
     10388                91E0DDBD230B41E40019E1E3 /* PageDOMDebuggerAgent.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PageDOMDebuggerAgent.cpp; sourceTree = "<group>"; };
     10389                91E0DDBF230B41E50019E1E3 /* PageDOMDebuggerAgent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PageDOMDebuggerAgent.h; sourceTree = "<group>"; };
     10390                91E0DDC2230B41F00019E1E3 /* WorkerDOMDebuggerAgent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WorkerDOMDebuggerAgent.h; sourceTree = "<group>"; };
     10391                91E0DDC3230B41F00019E1E3 /* WorkerDOMDebuggerAgent.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WorkerDOMDebuggerAgent.cpp; sourceTree = "<group>"; };
    1038610392                9302B0BC0D79F82900C7EE83 /* PageGroup.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PageGroup.cpp; sourceTree = "<group>"; };
    1038710393                9302B0BE0D79F82C00C7EE83 /* PageGroup.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PageGroup.h; sourceTree = "<group>"; };
     
    2251622522                                A5B81CBD1FAA44B70037D1E6 /* PageDebuggerAgent.cpp */,
    2251722523                                A5B81CBE1FAA44B70037D1E6 /* PageDebuggerAgent.h */,
     22524                                91E0DDBD230B41E40019E1E3 /* PageDOMDebuggerAgent.cpp */,
     22525                                91E0DDBF230B41E50019E1E3 /* PageDOMDebuggerAgent.h */,
    2251822526                                A5B81CBA1FAA44B70037D1E6 /* PageHeapAgent.cpp */,
    2251922527                                A5B81CBC1FAA44B70037D1E6 /* PageHeapAgent.h */,
     
    2253722545                                A5B81CC81FAA44DA0037D1E6 /* WorkerDebuggerAgent.cpp */,
    2253822546                                A5B81CCC1FAA44DA0037D1E6 /* WorkerDebuggerAgent.h */,
     22547                                91E0DDC3230B41F00019E1E3 /* WorkerDOMDebuggerAgent.cpp */,
     22548                                91E0DDC2230B41F00019E1E3 /* WorkerDOMDebuggerAgent.h */,
    2253922549                                A5CB05221FB51F2300089B97 /* WorkerNetworkAgent.cpp */,
    2254022550                                A5CB05231FB51F2400089B97 /* WorkerNetworkAgent.h */,
     
    3091530925                                A5A2AF0C1829734300DE1729 /* PageDebuggable.h in Headers */,
    3091630926                                A5B81CC31FAA44BC0037D1E6 /* PageDebuggerAgent.h in Headers */,
     30927                                91E0DDC1230B41E50019E1E3 /* PageDOMDebuggerAgent.h in Headers */,
    3091730928                                9302B0BF0D79F82C00C7EE83 /* PageGroup.h in Headers */,
    3091830929                                7A674BDC0F9EBF4E006CF099 /* PageGroupLoadDeferrer.h in Headers */,
     
    3229432305                                A5B81CCE1FAA44DE0037D1E6 /* WorkerDebuggerAgent.h in Headers */,
    3229532306                                A52B349E1FA41703008B6246 /* WorkerDebuggerProxy.h in Headers */,
     32307                                91E0DDC4230B41F10019E1E3 /* WorkerDOMDebuggerAgent.h in Headers */,
    3229632308                                A3E2643114748991005A8588 /* WorkerEventQueue.h in Headers */,
    3229732309                                2E4346490F546A8200B0F1BA /* WorkerGlobalScope.h in Headers */,
  • trunk/Source/WebCore/inspector/InspectorController.cpp

    r248846 r249305  
    4545#include "InspectorClient.h"
    4646#include "InspectorDOMAgent.h"
    47 #include "InspectorDOMDebuggerAgent.h"
    4847#include "InspectorDOMStorageAgent.h"
    4948#include "InspectorDatabaseAgent.h"
     
    6564#include "PageAuditAgent.h"
    6665#include "PageConsoleAgent.h"
     66#include "PageDOMDebuggerAgent.h"
    6767#include "PageDebuggerAgent.h"
    6868#include "PageHeapAgent.h"
     
    163163    m_agents.append(makeUnique<InspectorCSSAgent>(pageContext));
    164164    ensureDOMAgent();
    165     m_agents.append(makeUnique<InspectorDOMDebuggerAgent>(pageContext, debuggerAgentPtr));
     165    m_agents.append(makeUnique<PageDOMDebuggerAgent>(pageContext, debuggerAgentPtr));
    166166    m_agents.append(makeUnique<InspectorApplicationCacheAgent>(pageContext));
    167167    m_agents.append(makeUnique<InspectorLayerTreeAgent>(pageContext));
  • trunk/Source/WebCore/inspector/InspectorInstrumentation.cpp

    r248286 r249305  
    144144void InspectorInstrumentation::willInsertDOMNodeImpl(InstrumentingAgents& instrumentingAgents, Node& parent)
    145145{
    146     if (InspectorDOMDebuggerAgent* domDebuggerAgent = instrumentingAgents.inspectorDOMDebuggerAgent())
    147         domDebuggerAgent->willInsertDOMNode(parent);
     146    if (auto* pageDOMDebuggerAgent = instrumentingAgents.pageDOMDebuggerAgent())
     147        pageDOMDebuggerAgent->willInsertDOMNode(parent);
    148148}
    149149
     
    152152    if (InspectorDOMAgent* domAgent = instrumentingAgents.inspectorDOMAgent())
    153153        domAgent->didInsertDOMNode(node);
    154     if (InspectorDOMDebuggerAgent* domDebuggerAgent = instrumentingAgents.inspectorDOMDebuggerAgent())
    155         domDebuggerAgent->didInsertDOMNode(node);
     154    if (auto* pageDOMDebuggerAgent = instrumentingAgents.pageDOMDebuggerAgent())
     155        pageDOMDebuggerAgent->didInsertDOMNode(node);
    156156}
    157157
    158158void InspectorInstrumentation::willRemoveDOMNodeImpl(InstrumentingAgents& instrumentingAgents, Node& node)
    159159{
    160     if (InspectorDOMDebuggerAgent* domDebuggerAgent = instrumentingAgents.inspectorDOMDebuggerAgent())
    161         domDebuggerAgent->willRemoveDOMNode(node);
     160    if (auto* pageDOMDebuggerAgent = instrumentingAgents.pageDOMDebuggerAgent())
     161        pageDOMDebuggerAgent->willRemoveDOMNode(node);
    162162}
    163163
    164164void InspectorInstrumentation::didRemoveDOMNodeImpl(InstrumentingAgents& instrumentingAgents, Node& node)
    165165{
    166     if (InspectorDOMDebuggerAgent* domDebuggerAgent = instrumentingAgents.inspectorDOMDebuggerAgent())
    167         domDebuggerAgent->didRemoveDOMNode(node);
     166    if (auto* pageDOMDebuggerAgent = instrumentingAgents.pageDOMDebuggerAgent())
     167        pageDOMDebuggerAgent->didRemoveDOMNode(node);
    168168    if (InspectorDOMAgent* domAgent = instrumentingAgents.inspectorDOMAgent())
    169169        domAgent->didRemoveDOMNode(node);
     
    172172void InspectorInstrumentation::willModifyDOMAttrImpl(InstrumentingAgents& instrumentingAgents, Element& element, const AtomString& oldValue, const AtomString& newValue)
    173173{
    174     if (InspectorDOMDebuggerAgent* domDebuggerAgent = instrumentingAgents.inspectorDOMDebuggerAgent())
    175         domDebuggerAgent->willModifyDOMAttr(element);
     174    if (auto* pageDOMDebuggerAgent = instrumentingAgents.pageDOMDebuggerAgent())
     175        pageDOMDebuggerAgent->willModifyDOMAttr(element);
    176176    if (InspectorDOMAgent* domAgent = instrumentingAgents.inspectorDOMAgent())
    177177        domAgent->willModifyDOMAttr(element, oldValue, newValue);
     
    192192void InspectorInstrumentation::willInvalidateStyleAttrImpl(InstrumentingAgents& instrumentingAgents, Element& element)
    193193{
    194     if (auto* domDebuggerAgent = instrumentingAgents.inspectorDOMDebuggerAgent())
    195         domDebuggerAgent->willInvalidateStyleAttr(element);
     194    if (auto* pageDOMDebuggerAgent = instrumentingAgents.pageDOMDebuggerAgent())
     195        pageDOMDebuggerAgent->willInvalidateStyleAttr(element);
    196196}
    197197
     
    765765        domAgent->frameDocumentUpdated(frame);
    766766
    767     if (InspectorDOMDebuggerAgent* domDebuggerAgent = instrumentingAgents.inspectorDOMDebuggerAgent())
    768         domDebuggerAgent->frameDocumentUpdated(frame);
     767    if (auto* pageDOMDebuggerAgent = instrumentingAgents.pageDOMDebuggerAgent())
     768        pageDOMDebuggerAgent->frameDocumentUpdated(frame);
    769769}
    770770
     
    11421142        pageDebuggerAgent->willFireAnimationFrame(callbackId);
    11431143
    1144     if (InspectorDOMDebuggerAgent* domDebuggerAgent = instrumentingAgents.inspectorDOMDebuggerAgent())
    1145         domDebuggerAgent->willFireAnimationFrame();
     1144    if (auto* pageDOMDebuggerAgent = instrumentingAgents.pageDOMDebuggerAgent())
     1145        pageDOMDebuggerAgent->willFireAnimationFrame();
    11461146
    11471147    int timelineAgentId = 0;
  • trunk/Source/WebCore/inspector/InstrumentingAgents.cpp

    r248286 r249305  
    6868    m_pageHeapAgent = nullptr;
    6969    m_inspectorDOMDebuggerAgent = nullptr;
     70    m_pageDOMDebuggerAgent = nullptr;
    7071    m_inspectorCanvasAgent = nullptr;
    7172}
  • trunk/Source/WebCore/inspector/InstrumentingAgents.h

    r248286 r249305  
    6060class InspectorWorkerAgent;
    6161class Page;
     62class PageDOMDebuggerAgent;
    6263class PageDebuggerAgent;
    6364class PageHeapAgent;
     
    142143    void setInspectorDOMDebuggerAgent(InspectorDOMDebuggerAgent* agent) { m_inspectorDOMDebuggerAgent = agent; }
    143144
     145    PageDOMDebuggerAgent* pageDOMDebuggerAgent() const { return m_pageDOMDebuggerAgent; }
     146    void setPageDOMDebuggerAgent(PageDOMDebuggerAgent* agent) { m_pageDOMDebuggerAgent = agent; }
     147
    144148    InspectorLayerTreeAgent* inspectorLayerTreeAgent() const { return m_inspectorLayerTreeAgent; }
    145149    void setInspectorLayerTreeAgent(InspectorLayerTreeAgent* agent) { m_inspectorLayerTreeAgent = agent; }
     
    176180    PageHeapAgent* m_pageHeapAgent { nullptr };
    177181    InspectorDOMDebuggerAgent* m_inspectorDOMDebuggerAgent { nullptr };
     182    PageDOMDebuggerAgent* m_pageDOMDebuggerAgent { nullptr };
    178183    InspectorCanvasAgent* m_inspectorCanvasAgent { nullptr };
    179184};
  • trunk/Source/WebCore/inspector/WorkerInspectorController.cpp

    r248846 r249305  
    3535#include "WorkerAuditAgent.h"
    3636#include "WorkerConsoleAgent.h"
     37#include "WorkerDOMDebuggerAgent.h"
    3738#include "WorkerDebuggerAgent.h"
    3839#include "WorkerGlobalScope.h"
     
    175176
    176177    m_agents.append(makeUnique<WebHeapAgent>(workerContext));
    177     m_agents.append(makeUnique<WorkerDebuggerAgent>(workerContext));
     178
     179    auto debuggerAgent = makeUnique<WorkerDebuggerAgent>(workerContext);
     180    auto debuggerAgentPtr = debuggerAgent.get();
     181    m_agents.append(WTFMove(debuggerAgent));
     182
     183    m_agents.append(makeUnique<WorkerDOMDebuggerAgent>(workerContext, debuggerAgentPtr));
    178184    m_agents.append(makeUnique<WorkerAuditAgent>(workerContext));
    179185
  • trunk/Source/WebCore/inspector/agents/InspectorDOMDebuggerAgent.cpp

    r249132 r249305  
    3434
    3535#include "Event.h"
    36 #include "Frame.h"
    37 #include "HTMLElement.h"
     36#include "EventTarget.h"
    3837#include "InspectorDOMAgent.h"
    3938#include "InstrumentingAgents.h"
    4039#include "JSEvent.h"
    4140#include "RegisteredEventListener.h"
     41#include "ScriptExecutionContext.h"
    4242#include <JavaScriptCore/ContentSearchUtilities.h>
    4343#include <JavaScriptCore/InjectedScript.h>
     
    4747#include <wtf/JSONValues.h>
    4848
    49 namespace {
    50 
    51 enum DOMBreakpointType {
    52     SubtreeModified,
    53     AttributeModified,
    54     NodeRemoved,
    55     DOMBreakpointTypesCount
    56 };
    57 
    58 const uint32_t inheritableDOMBreakpointTypesMask = (1 << SubtreeModified);
    59 const int domBreakpointDerivedTypeShift = 16;
    60 
    61 }
    62 
    63 
    6449namespace WebCore {
    6550
     
    6853InspectorDOMDebuggerAgent::InspectorDOMDebuggerAgent(WebAgentContext& context, InspectorDebuggerAgent* debuggerAgent)
    6954    : InspectorAgentBase("DOMDebugger"_s, context)
     55    , m_debuggerAgent(debuggerAgent)
    7056    , m_backendDispatcher(Inspector::DOMDebuggerBackendDispatcher::create(context.backendDispatcher, this))
    7157    , m_injectedScriptManager(context.injectedScriptManager)
    72     , m_debuggerAgent(debuggerAgent)
    7358{
    7459    m_debuggerAgent->addListener(*this);
     
    7762InspectorDOMDebuggerAgent::~InspectorDOMDebuggerAgent() = default;
    7863
    79 // Browser debugger agent enabled only when JS debugger is enabled.
    80 void InspectorDOMDebuggerAgent::debuggerWasEnabled()
     64bool InspectorDOMDebuggerAgent::enabled() const
     65{
     66    return m_instrumentingAgents.inspectorDOMDebuggerAgent() == this;
     67}
     68
     69void InspectorDOMDebuggerAgent::enable()
    8170{
    8271    m_instrumentingAgents.setInspectorDOMDebuggerAgent(this);
    8372}
    8473
    85 void InspectorDOMDebuggerAgent::debuggerWasDisabled()
    86 {
    87     disable();
    88 }
    89 
    9074void InspectorDOMDebuggerAgent::disable()
    9175{
    9276    m_instrumentingAgents.setInspectorDOMDebuggerAgent(nullptr);
    93     m_domBreakpoints.clear();
     77
    9478    m_listenerBreakpoints.clear();
    9579    m_urlBreakpoints.clear();
    96     m_pauseOnAllAnimationFramesEnabled = false;
    9780    m_pauseOnAllIntervalsEnabled = false;
    9881    m_pauseOnAllListenersEnabled = false;
     
    10184}
    10285
     86// Browser debugger agent enabled only when JS debugger is enabled.
     87void InspectorDOMDebuggerAgent::debuggerWasEnabled()
     88{
     89    ASSERT(!enabled());
     90    enable();
     91}
     92
     93void InspectorDOMDebuggerAgent::debuggerWasDisabled()
     94{
     95    ASSERT(enabled());
     96    disable();
     97}
     98
    10399void InspectorDOMDebuggerAgent::didCreateFrontendAndBackend(Inspector::FrontendRouter*, Inspector::BackendDispatcher*)
    104100{
     
    114110    m_debuggerAgent->removeListener(*this);
    115111    m_debuggerAgent = nullptr;
    116 }
    117 
    118 void InspectorDOMDebuggerAgent::frameDocumentUpdated(Frame& frame)
    119 {
    120     if (!frame.isMainFrame())
    121         return;
    122 
    123     m_domBreakpoints.clear();
    124112}
    125113
     
    150138    switch (breakpointType.value()) {
    151139    case Inspector::Protocol::DOMDebugger::EventBreakpointType::AnimationFrame:
    152         if (m_pauseOnAllAnimationFramesEnabled)
    153             errorString = "Breakpoint for AnimationFrame already exists"_s;
    154         m_pauseOnAllAnimationFramesEnabled = true;
     140        setAnimationFrameBreakpoint(errorString, true);
    155141        break;
    156142
     
    201187    switch (breakpointType.value()) {
    202188    case Inspector::Protocol::DOMDebugger::EventBreakpointType::AnimationFrame:
    203         if (!m_pauseOnAllAnimationFramesEnabled)
    204             errorString = "Breakpoint for AnimationFrame missing"_s;
    205         m_pauseOnAllAnimationFramesEnabled = false;
     189        setAnimationFrameBreakpoint(errorString, false);
    206190        break;
    207191
     
    224208        break;
    225209    }
    226 }
    227 
    228 void InspectorDOMDebuggerAgent::willInvalidateStyleAttr(Element& element)
    229 {
    230     if (!m_debuggerAgent->breakpointsActive())
    231         return;
    232 
    233     if (hasBreakpoint(&element, AttributeModified)) {
    234         Ref<JSON::Object> eventData = JSON::Object::create();
    235         descriptionForDOMEvent(element, AttributeModified, false, eventData.get());
    236         m_debuggerAgent->breakProgram(Inspector::DebuggerFrontendDispatcher::Reason::DOM, WTFMove(eventData));
    237     }
    238 }
    239 
    240 void InspectorDOMDebuggerAgent::didInsertDOMNode(Node& node)
    241 {
    242     if (m_domBreakpoints.size()) {
    243         uint32_t mask = m_domBreakpoints.get(InspectorDOMAgent::innerParentNode(&node));
    244         uint32_t inheritableTypesMask = (mask | (mask >> domBreakpointDerivedTypeShift)) & inheritableDOMBreakpointTypesMask;
    245         if (inheritableTypesMask)
    246             updateSubtreeBreakpoints(&node, inheritableTypesMask, true);
    247     }
    248 }
    249 
    250 void InspectorDOMDebuggerAgent::didRemoveDOMNode(Node& node)
    251 {
    252     if (m_domBreakpoints.size()) {
    253         // Remove subtree breakpoints.
    254         m_domBreakpoints.remove(&node);
    255         Vector<Node*> stack(1, InspectorDOMAgent::innerFirstChild(&node));
    256         do {
    257             Node* node = stack.last();
    258             stack.removeLast();
    259             if (!node)
    260                 continue;
    261             m_domBreakpoints.remove(node);
    262             stack.append(InspectorDOMAgent::innerFirstChild(node));
    263             stack.append(InspectorDOMAgent::innerNextSibling(node));
    264         } while (!stack.isEmpty());
    265     }
    266 }
    267 
    268 static int domTypeForName(ErrorString& errorString, const String& typeString)
    269 {
    270     if (typeString == "subtree-modified")
    271         return SubtreeModified;
    272     if (typeString == "attribute-modified")
    273         return AttributeModified;
    274     if (typeString == "node-removed")
    275         return NodeRemoved;
    276     errorString = makeString("Unknown type: ", typeString);
    277     return -1;
    278 }
    279 
    280 static String domTypeName(int type)
    281 {
    282     switch (type) {
    283     case SubtreeModified: return "subtree-modified"_s;
    284     case AttributeModified: return "attribute-modified"_s;
    285     case NodeRemoved: return "node-removed"_s;
    286     default: break;
    287     }
    288     return emptyString();
    289 }
    290 
    291 void InspectorDOMDebuggerAgent::setDOMBreakpoint(ErrorString& errorString, int nodeId, const String& typeString)
    292 {
    293     auto* domAgent = m_instrumentingAgents.inspectorDOMAgent();
    294     if (!domAgent) {
    295         errorString = "DOM domain must be enabled"_s;
    296         return;
    297     }
    298 
    299     Node* node = domAgent->assertNode(errorString, nodeId);
    300     if (!node)
    301         return;
    302 
    303     int type = domTypeForName(errorString, typeString);
    304     if (type == -1)
    305         return;
    306 
    307     uint32_t rootBit = 1 << type;
    308     m_domBreakpoints.set(node, m_domBreakpoints.get(node) | rootBit);
    309     if (rootBit & inheritableDOMBreakpointTypesMask) {
    310         for (Node* child = InspectorDOMAgent::innerFirstChild(node); child; child = InspectorDOMAgent::innerNextSibling(child))
    311             updateSubtreeBreakpoints(child, rootBit, true);
    312     }
    313 }
    314 
    315 void InspectorDOMDebuggerAgent::removeDOMBreakpoint(ErrorString& errorString, int nodeId, const String& typeString)
    316 {
    317     auto* domAgent = m_instrumentingAgents.inspectorDOMAgent();
    318     if (!domAgent) {
    319         errorString = "DOM domain must be enabled"_s;
    320         return;
    321     }
    322 
    323     Node* node = domAgent->assertNode(errorString, nodeId);
    324     if (!node)
    325         return;
    326 
    327     int type = domTypeForName(errorString, typeString);
    328     if (type == -1)
    329         return;
    330 
    331     uint32_t rootBit = 1 << type;
    332     uint32_t mask = m_domBreakpoints.get(node) & ~rootBit;
    333     if (mask)
    334         m_domBreakpoints.set(node, mask);
    335     else
    336         m_domBreakpoints.remove(node);
    337 
    338     if ((rootBit & inheritableDOMBreakpointTypesMask) && !(mask & (rootBit << domBreakpointDerivedTypeShift))) {
    339         for (Node* child = InspectorDOMAgent::innerFirstChild(node); child; child = InspectorDOMAgent::innerNextSibling(child))
    340             updateSubtreeBreakpoints(child, rootBit, false);
    341     }
    342 }
    343 
    344 void InspectorDOMDebuggerAgent::willInsertDOMNode(Node& parent)
    345 {
    346     if (!m_debuggerAgent->breakpointsActive())
    347         return;
    348 
    349     if (hasBreakpoint(&parent, SubtreeModified)) {
    350         Ref<JSON::Object> eventData = JSON::Object::create();
    351         descriptionForDOMEvent(parent, SubtreeModified, true, eventData.get());
    352         m_debuggerAgent->breakProgram(Inspector::DebuggerFrontendDispatcher::Reason::DOM, WTFMove(eventData));
    353     }
    354 }
    355 
    356 void InspectorDOMDebuggerAgent::willRemoveDOMNode(Node& node)
    357 {
    358     if (!m_debuggerAgent->breakpointsActive())
    359         return;
    360 
    361     Node* parentNode = InspectorDOMAgent::innerParentNode(&node);
    362     if (hasBreakpoint(&node, NodeRemoved)) {
    363         Ref<JSON::Object> eventData = JSON::Object::create();
    364         descriptionForDOMEvent(node, NodeRemoved, false, eventData.get());
    365         m_debuggerAgent->breakProgram(Inspector::DebuggerFrontendDispatcher::Reason::DOM, WTFMove(eventData));
    366     } else if (parentNode && hasBreakpoint(parentNode, SubtreeModified)) {
    367         Ref<JSON::Object> eventData = JSON::Object::create();
    368         descriptionForDOMEvent(node, SubtreeModified, false, eventData.get());
    369         m_debuggerAgent->breakProgram(Inspector::DebuggerFrontendDispatcher::Reason::DOM, WTFMove(eventData));
    370     }
    371 }
    372 
    373 void InspectorDOMDebuggerAgent::willModifyDOMAttr(Element& element)
    374 {
    375     if (!m_debuggerAgent->breakpointsActive())
    376         return;
    377 
    378     if (hasBreakpoint(&element, AttributeModified)) {
    379         Ref<JSON::Object> eventData = JSON::Object::create();
    380         descriptionForDOMEvent(element, AttributeModified, false, eventData.get());
    381         m_debuggerAgent->breakProgram(Inspector::DebuggerFrontendDispatcher::Reason::DOM, WTFMove(eventData));
    382     }
    383 }
    384 
    385 void InspectorDOMDebuggerAgent::descriptionForDOMEvent(Node& target, int breakpointType, bool insertion, JSON::Object& description)
    386 {
    387     ASSERT(m_debuggerAgent->breakpointsActive());
    388     ASSERT(hasBreakpoint(&target, breakpointType));
    389 
    390     auto* domAgent = m_instrumentingAgents.inspectorDOMAgent();
    391 
    392     Node* breakpointOwner = &target;
    393     if ((1 << breakpointType) & inheritableDOMBreakpointTypesMask) {
    394         if (domAgent) {
    395             // For inheritable breakpoint types, target node isn't always the same as the node that owns a breakpoint.
    396             // Target node may be unknown to frontend, so we need to push it first.
    397             RefPtr<Inspector::Protocol::Runtime::RemoteObject> targetNodeObject = domAgent->resolveNode(&target, InspectorDebuggerAgent::backtraceObjectGroup);
    398             description.setValue("targetNode", targetNodeObject);
    399         }
    400 
    401         // Find breakpoint owner node.
    402         if (!insertion)
    403             breakpointOwner = InspectorDOMAgent::innerParentNode(&target);
    404         ASSERT(breakpointOwner);
    405         while (!(m_domBreakpoints.get(breakpointOwner) & (1 << breakpointType))) {
    406             Node* parentNode = InspectorDOMAgent::innerParentNode(breakpointOwner);
    407             if (!parentNode)
    408                 break;
    409             breakpointOwner = parentNode;
    410         }
    411 
    412         if (breakpointType == SubtreeModified)
    413             description.setBoolean("insertion", insertion);
    414     }
    415 
    416     if (domAgent) {
    417         int breakpointOwnerNodeId = domAgent->boundNodeId(breakpointOwner);
    418         ASSERT(breakpointOwnerNodeId);
    419         description.setInteger("nodeId", breakpointOwnerNodeId);
    420     }
    421 
    422     description.setString("type", domTypeName(breakpointType));
    423 }
    424 
    425 bool InspectorDOMDebuggerAgent::hasBreakpoint(Node* node, int type)
    426 {
    427     uint32_t rootBit = 1 << type;
    428     uint32_t derivedBit = rootBit << domBreakpointDerivedTypeShift;
    429     return m_domBreakpoints.get(node) & (rootBit | derivedBit);
    430 }
    431 
    432 void InspectorDOMDebuggerAgent::updateSubtreeBreakpoints(Node* node, uint32_t rootMask, bool set)
    433 {
    434     uint32_t oldMask = m_domBreakpoints.get(node);
    435     uint32_t derivedMask = rootMask << domBreakpointDerivedTypeShift;
    436     uint32_t newMask = set ? oldMask | derivedMask : oldMask & ~derivedMask;
    437     if (newMask)
    438         m_domBreakpoints.set(node, newMask);
    439     else
    440         m_domBreakpoints.remove(node);
    441 
    442     uint32_t newRootMask = rootMask & ~newMask;
    443     if (!newRootMask)
    444         return;
    445 
    446     for (Node* child = InspectorDOMAgent::innerFirstChild(node); child; child = InspectorDOMAgent::innerNextSibling(child))
    447         updateSubtreeBreakpoints(child, newRootMask, set);
    448210}
    449211
     
    497259    auto breakReason = oneShot ? Inspector::DebuggerFrontendDispatcher::Reason::Timeout : Inspector::DebuggerFrontendDispatcher::Reason::Interval;
    498260    m_debuggerAgent->schedulePauseOnNextStatement(breakReason, nullptr);
    499 }
    500 
    501 void InspectorDOMDebuggerAgent::willFireAnimationFrame()
    502 {
    503     if (!m_debuggerAgent->breakpointsActive())
    504         return;
    505 
    506     bool shouldPause = m_debuggerAgent->pauseOnNextStatementEnabled() || m_pauseOnAllAnimationFramesEnabled;
    507     if (!shouldPause)
    508         return;
    509 
    510     m_debuggerAgent->schedulePauseOnNextStatement(Inspector::DebuggerFrontendDispatcher::Reason::AnimationFrame, nullptr);
    511261}
    512262
  • trunk/Source/WebCore/inspector/agents/InspectorDOMDebuggerAgent.h

    r249132 r249305  
    4545namespace WebCore {
    4646
    47 class Element;
    4847class Event;
    49 class Frame;
    50 class Node;
    5148class RegisteredEventListener;
    5249
    5350typedef String ErrorString;
    5451
    55 class InspectorDOMDebuggerAgent final : public InspectorAgentBase, public Inspector::DOMDebuggerBackendDispatcherHandler, public Inspector::InspectorDebuggerAgent::Listener {
     52class InspectorDOMDebuggerAgent : public InspectorAgentBase, public Inspector::DOMDebuggerBackendDispatcherHandler, public Inspector::InspectorDebuggerAgent::Listener {
    5653    WTF_MAKE_NONCOPYABLE(InspectorDOMDebuggerAgent);
    5754    WTF_MAKE_FAST_ALLOCATED;
    5855public:
    59     InspectorDOMDebuggerAgent(WebAgentContext&, Inspector::InspectorDebuggerAgent*);
    6056    virtual ~InspectorDOMDebuggerAgent();
    6157
     
    6460    void willDestroyFrontendAndBackend(Inspector::DisconnectReason);
    6561    void discardAgent();
     62    virtual bool enabled() const;
    6663
    6764    // DOMDebuggerBackendDispatcherHandler
    68     void setURLBreakpoint(ErrorString&, const String& url, const bool* optionalIsRegex);
    69     void removeURLBreakpoint(ErrorString&, const String& url);
    70     void setEventBreakpoint(ErrorString&, const String& breakpointType, const String* eventName);
    71     void removeEventBreakpoint(ErrorString&, const String& breakpointType, const String* eventName);
    72     void setDOMBreakpoint(ErrorString&, int nodeId, const String& type);
    73     void removeDOMBreakpoint(ErrorString&, int nodeId, const String& type);
     65    void setURLBreakpoint(ErrorString&, const String& url, const bool* optionalIsRegex) final;
     66    void removeURLBreakpoint(ErrorString&, const String& url) final;
     67    void setEventBreakpoint(ErrorString&, const String& breakpointType, const String* eventName) final;
     68    void removeEventBreakpoint(ErrorString&, const String& breakpointType, const String* eventName) final;
    7469
    7570    // InspectorDebuggerAgent::Listener
     
    7873
    7974    // InspectorInstrumentation
    80     void willInsertDOMNode(Node& parent);
    81     void willInvalidateStyleAttr(Element&);
    82     void didInsertDOMNode(Node&);
    83     void willRemoveDOMNode(Node&);
    84     void didRemoveDOMNode(Node&);
    85     void willModifyDOMAttr(Element&);
    8675    void willSendXMLHttpRequest(const String& url);
    8776    void willFetch(const String& url);
    88     void frameDocumentUpdated(Frame&);
    8977    void willHandleEvent(Event&, const RegisteredEventListener&);
    9078    void didHandleEvent();
    9179    void willFireTimer(bool oneShot);
    92     void willFireAnimationFrame();
    93     void mainFrameDOMContentLoaded();
    9480
    95     void disable();
     81protected:
     82    InspectorDOMDebuggerAgent(WebAgentContext&, Inspector::InspectorDebuggerAgent*);
     83    virtual void enable();
     84    virtual void disable();
     85
     86    virtual void setAnimationFrameBreakpoint(ErrorString&, bool enabled) = 0;
     87
     88    Inspector::InspectorDebuggerAgent* m_debuggerAgent { nullptr };
    9689
    9790private:
     
    9992    void breakOnURLIfNeeded(const String& url, URLBreakpointSource);
    10093
    101     void descriptionForDOMEvent(Node& target, int breakpointType, bool insertion, JSON::Object& description);
    102     void updateSubtreeBreakpoints(Node*, uint32_t rootMask, bool set);
    103     bool hasBreakpoint(Node*, int type);
    104 
    10594    RefPtr<Inspector::DOMDebuggerBackendDispatcher> m_backendDispatcher;
    10695    Inspector::InjectedScriptManager& m_injectedScriptManager;
    10796
    108     Inspector::InspectorDebuggerAgent* m_debuggerAgent { nullptr };
    109 
    110     HashMap<Node*, uint32_t> m_domBreakpoints;
    11197    HashSet<String> m_listenerBreakpoints;
    11298
     
    114100    HashMap<String, URLBreakpointType> m_urlBreakpoints;
    115101
    116     bool m_pauseOnAllAnimationFramesEnabled { false };
    117102    bool m_pauseOnAllIntervalsEnabled { false };
    118103    bool m_pauseOnAllListenersEnabled { false };
  • trunk/Source/WebInspectorUI/ChangeLog

    r249301 r249305  
     12019-08-29  Devin Rousso  <drousso@apple.com>
     2
     3        Web Inspector: DOMDebugger: support event breakpoints in Worker contexts
     4        https://bugs.webkit.org/show_bug.cgi?id=200651
     5
     6        Reviewed by Joseph Pecoraro.
     7
     8        * UserInterface/Controllers/DOMDebuggerManager.js:
     9        (WI.DOMDebuggerManager.prototype._updateDOMBreakpoint):
     10        (WI.DOMDebuggerManager.prototype._updateEventBreakpoint):
     11        Add assertions when adding/removing DOM breakpoints or animation frame event breakpoints if
     12        the target is a `WI.WorkerTarget`, as neither are supported by `Worker`s.
     13
    1142019-08-29  Devin Rousso  <drousso@apple.com>
    215
  • trunk/Source/WebInspectorUI/UserInterface/Controllers/DOMDebuggerManager.js

    r249301 r249305  
    604604    _updateDOMBreakpoint(breakpoint, target)
    605605    {
     606        console.assert(target.type !== WI.Target.Type.Worker, "Worker targets do not support DOM breakpoints");
     607        if (target.type === WI.Target.Type.Worker)
     608            return;
     609
    606610        if (!target.DOMDebuggerAgent || !target.DOMDebuggerAgent.setDOMBreakpoint || !target.DOMDebuggerAgent.removeDOMBreakpoint)
    607611            return;
     
    622626    _updateEventBreakpoint(breakpoint, target)
    623627    {
     628        // Worker targets do not support `requestAnimationFrame` breakpoints.
     629        if (breakpoint === this._allAnimationFramesBreakpoint && target.type === WI.Target.Type.Worker)
     630            return;
     631
    624632        if (!target.DOMDebuggerAgent)
    625633            return;
     
    686694        }
    687695
     696        const callback = null;
     697
    688698        if (breakpoint.disabled)
    689             target.DOMDebuggerAgent.removeEventBreakpoint.invoke(commandArguments);
     699            target.DOMDebuggerAgent.removeEventBreakpoint.invoke(commandArguments, callback, target.DOMDebuggerAgent);
    690700        else {
    691701            if (!this._restoringBreakpoints && !WI.debuggerManager.breakpointsDisabledTemporarily)
    692702                WI.debuggerManager.breakpointsEnabled = true;
    693703
    694             target.DOMDebuggerAgent.setEventBreakpoint.invoke(commandArguments);
     704            target.DOMDebuggerAgent.setEventBreakpoint.invoke(commandArguments, callback, target.DOMDebuggerAgent);
    695705        }
    696706    }
Note: See TracChangeset for help on using the changeset viewer.