Web Inspector: DOM: lazily create the agent
authordrousso@apple.com <drousso@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 21 Mar 2019 03:10:28 +0000 (03:10 +0000)
committerdrousso@apple.com <drousso@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 21 Mar 2019 03:10:28 +0000 (03:10 +0000)
https://bugs.webkit.org/show_bug.cgi?id=195589
<rdar://problem/48791742>

Reviewed by Timothy Hatcher.

No change in functionality.

* inspector/agents/InspectorDOMAgent.h:
(WebCore::InspectorDOMAgent::DOMListener): Deleted.
(WebCore::InspectorDOMAgent::pageAgent): Deleted.
* inspector/agents/InspectorDOMAgent.cpp:
(WebCore::InspectorDOMAgent):
(WebCore::InspectorDOMAgent::unbind):
(WebCore::InspectorDOMAgent::setSearchingForNode):
(WebCore::InspectorDOMAgent::highlightSelector):
(WebCore::InspectorDOMAgent::highlightFrame):
(WebCore::InspectorDOMAgent::buildObjectForNode):
(WebCore::InspectorDOMAgent::didModifyDOMAttr):
(WebCore::InspectorDOMAgent::didRemoveDOMAttr):
(WebCore::InspectorDOMAgent::styleAttributeInvalidated):
(WebCore::InspectorDOMAgent::didInvalidateStyleAttr):
(WebCore::InspectorDOMAgent::setDOMListener): Deleted.

* inspector/agents/InspectorCSSAgent.h:
* inspector/agents/InspectorCSSAgent.cpp:
(WebCore::InspectorCSSAgent::InspectorCSSAgent):
(WebCore::InspectorCSSAgent::willDestroyFrontendAndBackend):
(WebCore::InspectorCSSAgent::reset):
(WebCore::InspectorCSSAgent::enable):
(WebCore::InspectorCSSAgent::disable):
(WebCore::InspectorCSSAgent::forcePseudoState):
(WebCore::InspectorCSSAgent::collectAllStyleSheets):
(WebCore::InspectorCSSAgent::setStyleSheetText):
(WebCore::InspectorCSSAgent::setStyleText):
(WebCore::InspectorCSSAgent::setRuleSelector):
(WebCore::InspectorCSSAgent::createStyleSheet):
(WebCore::InspectorCSSAgent::addRule):
(WebCore::InspectorCSSAgent::asInspectorStyleSheet):
(WebCore::InspectorCSSAgent::elementForId):
(WebCore::InspectorCSSAgent::bindStyleSheet):
(WebCore::InspectorCSSAgent::~InspectorCSSAgent): Deleted.
(WebCore::InspectorCSSAgent::discardAgent): Deleted.
(WebCore::InspectorCSSAgent::resetNonPersistentData): Deleted.
* inspector/InspectorStyleSheet.cpp:

* inspector/agents/InspectorDOMDebuggerAgent.h:
* inspector/agents/InspectorDOMDebuggerAgent.cpp:
(WebCore::InspectorDOMDebuggerAgent::InspectorDOMDebuggerAgent):
(WebCore::InspectorDOMDebuggerAgent::setDOMBreakpoint):
(WebCore::InspectorDOMDebuggerAgent::removeDOMBreakpoint):
(WebCore::InspectorDOMDebuggerAgent::descriptionForDOMEvent):
(WebCore::InspectorDOMDebuggerAgent::willHandleEvent):

* inspector/agents/page/PageConsoleAgent.h:
* inspector/agents/page/PageConsoleAgent.cpp:
(WebCore::PageConsoleAgent::PageConsoleAgent):
(WebCore::PageConsoleAgent::clearMessages):

* inspector/InspectorController.h:
* inspector/InspectorController.cpp:
(WebCore::InspectorController::InspectorController):
(WebCore::InspectorController::createLazyAgents):
(WebCore::InspectorController::inspect):
(WebCore::InspectorController::hideHighlight):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@243273 268f45cc-cd09-0410-ab3c-d52691b4dbfc

12 files changed:
Source/WebCore/ChangeLog
Source/WebCore/inspector/InspectorController.cpp
Source/WebCore/inspector/InspectorController.h
Source/WebCore/inspector/InspectorStyleSheet.cpp
Source/WebCore/inspector/agents/InspectorCSSAgent.cpp
Source/WebCore/inspector/agents/InspectorCSSAgent.h
Source/WebCore/inspector/agents/InspectorDOMAgent.cpp
Source/WebCore/inspector/agents/InspectorDOMAgent.h
Source/WebCore/inspector/agents/InspectorDOMDebuggerAgent.cpp
Source/WebCore/inspector/agents/InspectorDOMDebuggerAgent.h
Source/WebCore/inspector/agents/page/PageConsoleAgent.cpp
Source/WebCore/inspector/agents/page/PageConsoleAgent.h

index 70853d3..cf107a4 100644 (file)
@@ -1,3 +1,71 @@
+2019-03-20  Devin Rousso  <drousso@apple.com>
+
+        Web Inspector: DOM: lazily create the agent
+        https://bugs.webkit.org/show_bug.cgi?id=195589
+        <rdar://problem/48791742>
+
+        Reviewed by Timothy Hatcher.
+
+        No change in functionality.
+
+        * inspector/agents/InspectorDOMAgent.h:
+        (WebCore::InspectorDOMAgent::DOMListener): Deleted.
+        (WebCore::InspectorDOMAgent::pageAgent): Deleted.
+        * inspector/agents/InspectorDOMAgent.cpp:
+        (WebCore::InspectorDOMAgent):
+        (WebCore::InspectorDOMAgent::unbind):
+        (WebCore::InspectorDOMAgent::setSearchingForNode):
+        (WebCore::InspectorDOMAgent::highlightSelector):
+        (WebCore::InspectorDOMAgent::highlightFrame):
+        (WebCore::InspectorDOMAgent::buildObjectForNode):
+        (WebCore::InspectorDOMAgent::didModifyDOMAttr):
+        (WebCore::InspectorDOMAgent::didRemoveDOMAttr):
+        (WebCore::InspectorDOMAgent::styleAttributeInvalidated):
+        (WebCore::InspectorDOMAgent::didInvalidateStyleAttr):
+        (WebCore::InspectorDOMAgent::setDOMListener): Deleted.
+
+        * inspector/agents/InspectorCSSAgent.h:
+        * inspector/agents/InspectorCSSAgent.cpp:
+        (WebCore::InspectorCSSAgent::InspectorCSSAgent):
+        (WebCore::InspectorCSSAgent::willDestroyFrontendAndBackend):
+        (WebCore::InspectorCSSAgent::reset):
+        (WebCore::InspectorCSSAgent::enable):
+        (WebCore::InspectorCSSAgent::disable):
+        (WebCore::InspectorCSSAgent::forcePseudoState):
+        (WebCore::InspectorCSSAgent::collectAllStyleSheets):
+        (WebCore::InspectorCSSAgent::setStyleSheetText):
+        (WebCore::InspectorCSSAgent::setStyleText):
+        (WebCore::InspectorCSSAgent::setRuleSelector):
+        (WebCore::InspectorCSSAgent::createStyleSheet):
+        (WebCore::InspectorCSSAgent::addRule):
+        (WebCore::InspectorCSSAgent::asInspectorStyleSheet):
+        (WebCore::InspectorCSSAgent::elementForId):
+        (WebCore::InspectorCSSAgent::bindStyleSheet):
+        (WebCore::InspectorCSSAgent::~InspectorCSSAgent): Deleted.
+        (WebCore::InspectorCSSAgent::discardAgent): Deleted.
+        (WebCore::InspectorCSSAgent::resetNonPersistentData): Deleted.
+        * inspector/InspectorStyleSheet.cpp:
+
+        * inspector/agents/InspectorDOMDebuggerAgent.h:
+        * inspector/agents/InspectorDOMDebuggerAgent.cpp:
+        (WebCore::InspectorDOMDebuggerAgent::InspectorDOMDebuggerAgent):
+        (WebCore::InspectorDOMDebuggerAgent::setDOMBreakpoint):
+        (WebCore::InspectorDOMDebuggerAgent::removeDOMBreakpoint):
+        (WebCore::InspectorDOMDebuggerAgent::descriptionForDOMEvent):
+        (WebCore::InspectorDOMDebuggerAgent::willHandleEvent):
+
+        * inspector/agents/page/PageConsoleAgent.h:
+        * inspector/agents/page/PageConsoleAgent.cpp:
+        (WebCore::PageConsoleAgent::PageConsoleAgent):
+        (WebCore::PageConsoleAgent::clearMessages):
+
+        * inspector/InspectorController.h:
+        * inspector/InspectorController.cpp:
+        (WebCore::InspectorController::InspectorController):
+        (WebCore::InspectorController::createLazyAgents):
+        (WebCore::InspectorController::inspect):
+        (WebCore::InspectorController::hideHighlight):
+
 2019-03-20  Youenn Fablet  <youenn@apple.com>
 
         Include WAL and SHM file size in IDB database size computation
index 831e773..b9aa66c 100644 (file)
@@ -111,15 +111,10 @@ InspectorController::InspectorController(Page& page, InspectorClient* inspectorC
     m_agents.append(WTFMove(inspectorAgentPtr));
 
     auto pageAgentPtr = std::make_unique<InspectorPageAgent>(pageContext, inspectorClient, m_overlay.get());
-    InspectorPageAgent* pageAgent = pageAgentPtr.get();
     m_pageAgent = pageAgentPtr.get();
     m_agents.append(WTFMove(pageAgentPtr));
 
-    auto domAgentPtr = std::make_unique<InspectorDOMAgent>(pageContext, pageAgent, m_overlay.get());
-    m_domAgent = domAgentPtr.get();
-    m_agents.append(WTFMove(domAgentPtr));
-
-    auto consoleAgent = std::make_unique<PageConsoleAgent>(pageContext, m_domAgent);
+    auto consoleAgent = std::make_unique<PageConsoleAgent>(pageContext);
     m_instrumentingAgents->setWebConsoleAgent(consoleAgent.get());
     m_agents.append(WTFMove(consoleAgent));
 
@@ -172,8 +167,9 @@ void InspectorController::createLazyAgents()
     m_agents.append(WTFMove(debuggerAgent));
 
     m_agents.append(std::make_unique<PageNetworkAgent>(pageContext, m_pageAgent));
-    m_agents.append(std::make_unique<InspectorCSSAgent>(pageContext, m_domAgent));
-    m_agents.append(std::make_unique<InspectorDOMDebuggerAgent>(pageContext, m_domAgent, debuggerAgentPtr));
+    m_agents.append(std::make_unique<InspectorCSSAgent>(pageContext));
+    m_agents.append(std::make_unique<InspectorDOMAgent>(pageContext, m_overlay.get()));
+    m_agents.append(std::make_unique<InspectorDOMDebuggerAgent>(pageContext, debuggerAgentPtr));
     m_agents.append(std::make_unique<InspectorApplicationCacheAgent>(pageContext, m_pageAgent));
     m_agents.append(std::make_unique<InspectorLayerTreeAgent>(pageContext));
     m_agents.append(std::make_unique<InspectorWorkerAgent>(pageContext));
@@ -385,7 +381,8 @@ void InspectorController::inspect(Node* node)
     if (!hasRemoteFrontend())
         show();
 
-    m_domAgent->inspect(node);
+    if (auto* domAgent = m_instrumentingAgents->inspectorDOMAgent())
+        domAgent->inspect(node);
 }
 
 bool InspectorController::enabled() const
@@ -405,8 +402,10 @@ void InspectorController::dispatchMessageFromFrontend(const String& message)
 
 void InspectorController::hideHighlight()
 {
-    ErrorString unused;
-    m_domAgent->hideHighlight(unused);
+    if (auto* domAgent = m_instrumentingAgents->inspectorDOMAgent()) {
+        ErrorString unused;
+        domAgent->hideHighlight(unused);
+    }
 }
 
 Node* InspectorController::highlightedNode() const
index 1a5f270..b77a4d0 100644 (file)
@@ -52,7 +52,6 @@ class DOMWrapperWorld;
 class Frame;
 class GraphicsContext;
 class InspectorClient;
-class InspectorDOMAgent;
 class InspectorFrontendClient;
 class InspectorInstrumentation;
 class InspectorPageAgent;
@@ -137,7 +136,6 @@ private:
     InspectorFrontendClient* m_inspectorFrontendClient { nullptr };
 
     Inspector::InspectorAgent* m_inspectorAgent { nullptr };
-    InspectorDOMAgent* m_domAgent { nullptr };
     InspectorPageAgent* m_pageAgent { nullptr };
 
     bool m_isUnderTest { false };
index e9c0a14..ca30e1a 100644 (file)
@@ -46,6 +46,7 @@
 #include "HTMLParserIdioms.h"
 #include "HTMLStyleElement.h"
 #include "InspectorCSSAgent.h"
+#include "InspectorDOMAgent.h"
 #include "InspectorPageAgent.h"
 #include "MediaList.h"
 #include "Node.h"
index 6d48509..27920df 100644 (file)
@@ -43,6 +43,7 @@
 #include "Frame.h"
 #include "HTMLHeadElement.h"
 #include "HTMLStyleElement.h"
+#include "InspectorDOMAgent.h"
 #include "InspectorHistory.h"
 #include "InspectorPageAgent.h"
 #include "InstrumentingAgents.h"
@@ -294,19 +295,11 @@ CSSStyleRule* InspectorCSSAgent::asCSSStyleRule(CSSRule& rule)
     return downcast<CSSStyleRule>(&rule);
 }
 
-InspectorCSSAgent::InspectorCSSAgent(WebAgentContext& context, InspectorDOMAgent* domAgent)
+InspectorCSSAgent::InspectorCSSAgent(WebAgentContext& context)
     : InspectorAgentBase("CSS"_s, context)
     , m_frontendDispatcher(std::make_unique<CSSFrontendDispatcher>(context.frontendRouter))
     , m_backendDispatcher(CSSBackendDispatcher::create(context.backendDispatcher, this))
-    , m_domAgent(domAgent)
 {
-    m_domAgent->setDOMListener(this);
-}
-
-InspectorCSSAgent::~InspectorCSSAgent()
-{
-    ASSERT(!m_domAgent);
-    reset();
 }
 
 void InspectorCSSAgent::didCreateFrontendAndBackend(Inspector::FrontendRouter*, Inspector::BackendDispatcher*)
@@ -315,18 +308,10 @@ void InspectorCSSAgent::didCreateFrontendAndBackend(Inspector::FrontendRouter*,
 
 void InspectorCSSAgent::willDestroyFrontendAndBackend(Inspector::DisconnectReason)
 {
-    resetNonPersistentData();
-
     String unused;
     disable(unused);
 }
 
-void InspectorCSSAgent::discardAgent()
-{
-    m_domAgent->setDOMListener(nullptr);
-    m_domAgent = nullptr;
-}
-
 void InspectorCSSAgent::reset()
 {
     // FIXME: Should we be resetting on main frame navigations?
@@ -335,25 +320,27 @@ void InspectorCSSAgent::reset()
     m_nodeToInspectorStyleSheet.clear();
     m_documentToInspectorStyleSheet.clear();
     m_documentToKnownCSSStyleSheets.clear();
-    resetNonPersistentData();
-}
-
-void InspectorCSSAgent::resetNonPersistentData()
-{
     resetPseudoStates();
 }
 
 void InspectorCSSAgent::enable(ErrorString&)
 {
+    if (m_instrumentingAgents.inspectorCSSAgent() == this)
+        return;
+
     m_instrumentingAgents.setInspectorCSSAgent(this);
 
-    for (auto* document : m_domAgent->documents())
-        activeStyleSheetsUpdated(*document);
+    if (auto* domAgent = m_instrumentingAgents.inspectorDOMAgent()) {
+        for (auto* document : domAgent->documents())
+            activeStyleSheetsUpdated(*document);
+    }
 }
 
 void InspectorCSSAgent::disable(ErrorString&)
 {
     m_instrumentingAgents.setInspectorCSSAgent(nullptr);
+
+    reset();
 }
 
 void InspectorCSSAgent::documentDetached(Document& document)
@@ -415,7 +402,11 @@ bool InspectorCSSAgent::forcePseudoState(const Element& element, CSSSelector::Ps
     if (m_nodeIdToForcedPseudoState.isEmpty())
         return false;
 
-    int nodeId = m_domAgent->boundNodeId(&element);
+    auto* domAgent = m_instrumentingAgents.inspectorDOMAgent();
+    if (!domAgent)
+        return false;
+
+    int nodeId = domAgent->boundNodeId(&element);
     if (!nodeId)
         return false;
 
@@ -574,8 +565,10 @@ void InspectorCSSAgent::getAllStyleSheets(ErrorString&, RefPtr<JSON::ArrayOf<Ins
 void InspectorCSSAgent::collectAllStyleSheets(Vector<InspectorStyleSheet*>& result)
 {
     Vector<CSSStyleSheet*> cssStyleSheets;
-    for (auto* document : m_domAgent->documents())
-        collectAllDocumentStyleSheets(*document, cssStyleSheets);
+    if (auto* domAgent = m_instrumentingAgents.inspectorDOMAgent()) {
+        for (auto* document : domAgent->documents())
+            collectAllDocumentStyleSheets(*document, cssStyleSheets);
+    }
 
     for (auto* cssStyleSheet : cssStyleSheets)
         result.append(bindStyleSheet(cssStyleSheet));
@@ -627,7 +620,13 @@ void InspectorCSSAgent::setStyleSheetText(ErrorString& errorString, const String
     if (!inspectorStyleSheet)
         return;
 
-    auto result = m_domAgent->history()->perform(std::make_unique<SetStyleSheetTextAction>(inspectorStyleSheet, text));
+    auto* domAgent = m_instrumentingAgents.inspectorDOMAgent();
+    if (!domAgent) {
+        errorString = "Missing DOM agent"_s;
+        return;
+    }
+
+    auto result = domAgent->history()->perform(std::make_unique<SetStyleSheetTextAction>(inspectorStyleSheet, text));
     if (result.hasException())
         errorString = InspectorDOMAgent::toErrorString(result.releaseException());
 }
@@ -641,7 +640,13 @@ void InspectorCSSAgent::setStyleText(ErrorString& errorString, const JSON::Objec
     if (!inspectorStyleSheet)
         return;
 
-    auto performResult = m_domAgent->history()->perform(std::make_unique<SetStyleTextAction>(inspectorStyleSheet, compoundId, text));
+    auto* domAgent = m_instrumentingAgents.inspectorDOMAgent();
+    if (!domAgent) {
+        errorString = "Missing DOM agent"_s;
+        return;
+    }
+
+    auto performResult = domAgent->history()->perform(std::make_unique<SetStyleTextAction>(inspectorStyleSheet, compoundId, text));
     if (performResult.hasException()) {
         errorString = InspectorDOMAgent::toErrorString(performResult.releaseException());
         return;
@@ -659,7 +664,13 @@ void InspectorCSSAgent::setRuleSelector(ErrorString& errorString, const JSON::Ob
     if (!inspectorStyleSheet)
         return;
 
-    auto performResult = m_domAgent->history()->perform(std::make_unique<SetRuleSelectorAction>(inspectorStyleSheet, compoundId, selector));
+    auto* domAgent = m_instrumentingAgents.inspectorDOMAgent();
+    if (!domAgent) {
+        errorString = "Missing DOM agent"_s;
+        return;
+    }
+
+    auto performResult = domAgent->history()->perform(std::make_unique<SetRuleSelectorAction>(inspectorStyleSheet, compoundId, selector));
     if (performResult.hasException()) {
         errorString = InspectorDOMAgent::toErrorString(performResult.releaseException());
         return;
@@ -670,7 +681,13 @@ void InspectorCSSAgent::setRuleSelector(ErrorString& errorString, const JSON::Ob
 
 void InspectorCSSAgent::createStyleSheet(ErrorString& errorString, const String& frameId, String* styleSheetId)
 {
-    Frame* frame = m_domAgent->pageAgent()->frameForId(frameId);
+    auto* pageAgent = m_instrumentingAgents.inspectorPageAgent();
+    if (!pageAgent) {
+        errorString = "Missing Page agent"_s;
+        return;
+    }
+
+    Frame* frame = pageAgent->frameForId(frameId);
     if (!frame) {
         errorString = "No frame for given id found"_s;
         return;
@@ -740,9 +757,15 @@ void InspectorCSSAgent::addRule(ErrorString& errorString, const String& styleShe
         return;
     }
 
+    auto* domAgent = m_instrumentingAgents.inspectorDOMAgent();
+    if (!domAgent) {
+        errorString = "Missing DOM agent"_s;
+        return;
+    }
+
     auto action = std::make_unique<AddRuleAction>(inspectorStyleSheet, selector);
     auto& rawAction = *action;
-    auto performResult = m_domAgent->history()->perform(WTFMove(action));
+    auto performResult = domAgent->history()->perform(WTFMove(action));
     if (performResult.hasException()) {
         errorString = InspectorDOMAgent::toErrorString(performResult.releaseException());
         return;
@@ -816,7 +839,13 @@ void InspectorCSSAgent::getSupportedSystemFontFamilyNames(ErrorString&, RefPtr<J
 
 void InspectorCSSAgent::forcePseudoState(ErrorString& errorString, int nodeId, const JSON::Array& forcedPseudoClasses)
 {
-    Element* element = m_domAgent->assertElement(errorString, nodeId);
+    auto* domAgent = m_instrumentingAgents.inspectorDOMAgent();
+    if (!domAgent) {
+        errorString = "Missing DOM agent"_s;
+        return;
+    }
+
+    Element* element = domAgent->assertElement(errorString, nodeId);
     if (!element)
         return;
 
@@ -842,7 +871,7 @@ InspectorStyleSheetForInlineStyle& InspectorCSSAgent::asInspectorStyleSheet(Styl
 {
     return m_nodeToInspectorStyleSheet.ensure(&element, [this, &element] {
         String newStyleSheetId = String::number(m_lastStyleSheetId++);
-        auto inspectorStyleSheet = InspectorStyleSheetForInlineStyle::create(m_domAgent->pageAgent(), newStyleSheetId, element, Inspector::Protocol::CSS::StyleSheetOrigin::Regular, this);
+        auto inspectorStyleSheet = InspectorStyleSheetForInlineStyle::create(m_instrumentingAgents.inspectorPageAgent(), newStyleSheetId, element, Inspector::Protocol::CSS::StyleSheetOrigin::Regular, this);
         m_idToInspectorStyleSheet.set(newStyleSheetId, inspectorStyleSheet.copyRef());
         return inspectorStyleSheet;
     }).iterator->value;
@@ -850,7 +879,13 @@ InspectorStyleSheetForInlineStyle& InspectorCSSAgent::asInspectorStyleSheet(Styl
 
 Element* InspectorCSSAgent::elementForId(ErrorString& errorString, int nodeId)
 {
-    Node* node = m_domAgent->nodeForId(nodeId);
+    auto* domAgent = m_instrumentingAgents.inspectorDOMAgent();
+    if (!domAgent) {
+        errorString = "Missing DOM agent"_s;
+        return nullptr;
+    }
+
+    Node* node = domAgent->nodeForId(nodeId);
     if (!node) {
         errorString = "No node with given id found"_s;
         return nullptr;
@@ -877,7 +912,7 @@ InspectorStyleSheet* InspectorCSSAgent::bindStyleSheet(CSSStyleSheet* styleSheet
     if (!inspectorStyleSheet) {
         String id = String::number(m_lastStyleSheetId++);
         Document* document = styleSheet->ownerDocument();
-        inspectorStyleSheet = InspectorStyleSheet::create(m_domAgent->pageAgent(), id, styleSheet, detectOrigin(styleSheet, document), InspectorDOMAgent::documentURLString(document), this);
+        inspectorStyleSheet = InspectorStyleSheet::create(m_instrumentingAgents.inspectorPageAgent(), id, styleSheet, detectOrigin(styleSheet, document), InspectorDOMAgent::documentURLString(document), this);
         m_idToInspectorStyleSheet.set(id, inspectorStyleSheet);
         m_cssStyleSheetToInspectorStyleSheet.set(styleSheet, inspectorStyleSheet);
         if (m_creatingViaInspectorStyleSheet) {
index 35494fe..1df7958 100644 (file)
@@ -27,7 +27,6 @@
 
 #include "CSSSelector.h"
 #include "ContentSecurityPolicy.h"
-#include "InspectorDOMAgent.h"
 #include "InspectorStyleSheet.h"
 #include "InspectorWebAgentBase.h"
 #include "SecurityContext.h"
@@ -56,7 +55,6 @@ class StyleRule;
 
 class InspectorCSSAgent final
     : public InspectorAgentBase
-    , public InspectorDOMAgent::DOMListener
     , public Inspector::CSSBackendDispatcherHandler
     , public InspectorStyleSheet::Listener {
     WTF_MAKE_NONCOPYABLE(InspectorCSSAgent);
@@ -79,16 +77,13 @@ public:
         ContentSecurityPolicy* m_contentSecurityPolicy;
     };
 
-    InspectorCSSAgent(WebAgentContext&, InspectorDOMAgent*);
-    virtual ~InspectorCSSAgent();
+    InspectorCSSAgent(WebAgentContext&);
+    virtual ~InspectorCSSAgent() = default;
 
     static CSSStyleRule* asCSSStyleRule(CSSRule&);
 
     void didCreateFrontendAndBackend(Inspector::FrontendRouter*, Inspector::BackendDispatcher*) override;
     void willDestroyFrontendAndBackend(Inspector::DisconnectReason) override;
-    void discardAgent() override;
-    void enable(ErrorString&) override;
-    void disable(ErrorString&) override;
     void reset();
 
     // InspectorInstrumentation
@@ -97,6 +92,9 @@ public:
     void activeStyleSheetsUpdated(Document&);
     bool forcePseudoState(const Element&, CSSSelector::PseudoClassType);
 
+    // CSSBackendDispatcherHandler
+    void enable(ErrorString&) override;
+    void disable(ErrorString&) override;
     void getComputedStyleForNode(ErrorString&, int nodeId, RefPtr<JSON::ArrayOf<Inspector::Protocol::CSS::CSSComputedStyleProperty>>&) override;
     void getInlineStylesForNode(ErrorString&, int nodeId, RefPtr<Inspector::Protocol::CSS::CSSStyle>& inlineStyle, RefPtr<Inspector::Protocol::CSS::CSSStyle>& attributes) override;
     void getMatchedStylesForNode(ErrorString&, int nodeId, const bool* includePseudo, const bool* includeInherited, RefPtr<JSON::ArrayOf<Inspector::Protocol::CSS::RuleMatch>>& matchedCSSRules, RefPtr<JSON::ArrayOf<Inspector::Protocol::CSS::PseudoIdMatches>>&, RefPtr<JSON::ArrayOf<Inspector::Protocol::CSS::InheritedStyleEntry>>& inheritedEntries) override;
@@ -112,6 +110,10 @@ public:
     void getSupportedSystemFontFamilyNames(ErrorString&, RefPtr<JSON::ArrayOf<String>>& result) override;
     void forcePseudoState(ErrorString&, int nodeId, const JSON::Array& forcedPseudoClasses) override;
 
+    // InspectorDOMAgent hooks
+    void didRemoveDOMNode(Node&, int nodeId);
+    void didModifyDOMAttr(Element&);
+
 private:
     class StyleSheetAction;
     class SetStyleSheetTextAction;
@@ -124,7 +126,6 @@ private:
     typedef HashMap<RefPtr<Document>, Vector<RefPtr<InspectorStyleSheet>>> DocumentToViaInspectorStyleSheet; // "via inspector" stylesheets
     typedef HashMap<int, unsigned> NodeIdToForcedPseudoState;
 
-    void resetNonPersistentData();
     InspectorStyleSheetForInlineStyle& asInspectorStyleSheet(StyledElement&);
     Element* elementForId(ErrorString&, int nodeId);
 
@@ -144,10 +145,6 @@ private:
     RefPtr<JSON::ArrayOf<Inspector::Protocol::CSS::RuleMatch>> buildArrayForMatchedRuleList(const Vector<RefPtr<StyleRule>>&, StyleResolver&, Element&, PseudoId);
     RefPtr<Inspector::Protocol::CSS::CSSStyle> buildObjectForAttributesStyle(StyledElement&);
 
-    // InspectorDOMAgent::DOMListener implementation
-    void didRemoveDOMNode(Node&, int nodeId) override;
-    void didModifyDOMAttr(Element&) override;
-
     // InspectorCSSAgent::Listener implementation
     void styleSheetChanged(InspectorStyleSheet*) override;
 
@@ -155,7 +152,6 @@ private:
 
     std::unique_ptr<Inspector::CSSFrontendDispatcher> m_frontendDispatcher;
     RefPtr<Inspector::CSSBackendDispatcher> m_backendDispatcher;
-    InspectorDOMAgent* m_domAgent { nullptr };
 
     IdToInspectorStyleSheet m_idToInspectorStyleSheet;
     CSSStyleSheetToInspectorStyleSheet m_cssStyleSheetToInspectorStyleSheet;
index dd9afee..6863443 100644 (file)
@@ -69,6 +69,7 @@
 #include "HTMLTemplateElement.h"
 #include "HTMLVideoElement.h"
 #include "HitTestResult.h"
+#include "InspectorCSSAgent.h"
 #include "InspectorClient.h"
 #include "InspectorController.h"
 #include "InspectorHistory.h"
@@ -277,12 +278,12 @@ String InspectorDOMAgent::toErrorString(Exception&& exception)
     return DOMException::name(exception.code());
 }
 
-InspectorDOMAgent::InspectorDOMAgent(WebAgentContext& context, InspectorPageAgent* pageAgent, InspectorOverlay* overlay)
+InspectorDOMAgent::InspectorDOMAgent(PageAgentContext& context, InspectorOverlay* overlay)
     : InspectorAgentBase("DOM"_s, context)
     , m_injectedScriptManager(context.injectedScriptManager)
     , m_frontendDispatcher(std::make_unique<Inspector::DOMFrontendDispatcher>(context.frontendRouter))
     , m_backendDispatcher(Inspector::DOMBackendDispatcher::create(context.backendDispatcher, this))
-    , m_pageAgent(pageAgent)
+    , m_inspectedPage(context.inspectedPage)
     , m_overlay(overlay)
 #if ENABLE(VIDEO)
     , m_mediaMetricsTimer(*this, &InspectorDOMAgent::mediaMetricsTimerFired)
@@ -302,7 +303,7 @@ void InspectorDOMAgent::didCreateFrontendAndBackend(Inspector::FrontendRouter*,
     m_domEditor = std::make_unique<DOMEditor>(*m_history);
 
     m_instrumentingAgents.setInspectorDOMAgent(this);
-    m_document = m_pageAgent->mainFrame().document();
+    m_document = m_inspectedPage.mainFrame().document();
 
 #if ENABLE(VIDEO)
     if (m_document)
@@ -354,11 +355,6 @@ void InspectorDOMAgent::reset()
     m_document = nullptr;
 }
 
-void InspectorDOMAgent::setDOMListener(DOMListener* listener)
-{
-    m_domListener = listener;
-}
-
 void InspectorDOMAgent::setDocument(Document* document)
 {
     if (document == m_document.get())
@@ -418,8 +414,9 @@ void InspectorDOMAgent::unbind(Node* node, NodeToIdMap* nodesMap)
     }
 
     nodesMap->remove(node);
-    if (m_domListener)
-        m_domListener->didRemoveDOMNode(*node, id);
+
+    if (auto* cssAgent = m_instrumentingAgents.inspectorCSSAgent())
+        cssAgent->didRemoveDOMNode(*node, id);
 
     if (m_childrenRequested.remove(id)) {
         // FIXME: Would be better to do this iteratively rather than recursively.
@@ -1160,7 +1157,7 @@ void InspectorDOMAgent::setSearchingForNode(ErrorString& errorString, bool enabl
 
     m_overlay->didSetSearchingForNode(m_searchingForNode);
 
-    if (InspectorClient* client = m_pageAgent->page().inspectorController().inspectorClient())
+    if (InspectorClient* client = m_inspectedPage.inspectorController().inspectorClient())
         client->elementSelectionChanged(m_searchingForNode);
 }
 
@@ -1218,7 +1215,13 @@ void InspectorDOMAgent::highlightSelector(ErrorString& errorString, const JSON::
     RefPtr<Document> document;
 
     if (frameId) {
-        Frame* frame = m_pageAgent->frameForId(*frameId);
+        auto* pageAgent = m_instrumentingAgents.inspectorPageAgent();
+        if (!pageAgent) {
+            errorString = "Missing Page agent"_s;
+            return;
+        }
+
+        Frame* frame = pageAgent->frameForId(*frameId);
         if (!frame) {
             errorString = "No frame for given id found"_s;
             return;
@@ -1305,7 +1308,13 @@ void InspectorDOMAgent::highlightNodeList(ErrorString& errorString, const JSON::
 
 void InspectorDOMAgent::highlightFrame(ErrorString& errorString, const String& frameId, const JSON::Object* color, const JSON::Object* outlineColor)
 {
-    Frame* frame = m_pageAgent->assertFrame(errorString, frameId);
+    auto* pageAgent = m_instrumentingAgents.inspectorPageAgent();
+    if (!pageAgent) {
+        errorString = "Missing Page agent"_s;
+        return;
+    }
+
+    Frame* frame = pageAgent->assertFrame(errorString, frameId);
     if (!frame)
         return;
 
@@ -1541,14 +1550,18 @@ Ref<Inspector::Protocol::DOM::Node> InspectorDOMAgent::buildObjectForNode(Node*
             value->setChildren(WTFMove(children));
     }
 
+    auto* pageAgent = m_instrumentingAgents.inspectorPageAgent();
+
     if (is<Element>(*node)) {
         Element& element = downcast<Element>(*node);
         value->setAttributes(buildArrayForElementAttributes(&element));
         if (is<HTMLFrameOwnerElement>(element)) {
             HTMLFrameOwnerElement& frameOwner = downcast<HTMLFrameOwnerElement>(element);
-            Frame* frame = frameOwner.contentFrame();
-            if (frame)
-                value->setFrameId(m_pageAgent->frameId(frame));
+            if (pageAgent) {
+                Frame* frame = frameOwner.contentFrame();
+                if (frame)
+                    value->setFrameId(pageAgent->frameId(frame));
+            }
             Document* document = frameOwner.contentDocument();
             if (document)
                 value->setContentDocument(buildObjectForNode(document, 0, nodesMap));
@@ -1578,10 +1591,10 @@ Ref<Inspector::Protocol::DOM::Node> InspectorDOMAgent::buildObjectForNode(Node*
             if (auto pseudoElements = buildArrayForPseudoElements(element, nodesMap))
                 value->setPseudoElements(WTFMove(pseudoElements));
         }
-
     } else if (is<Document>(*node)) {
         Document& document = downcast<Document>(*node);
-        value->setFrameId(m_pageAgent->frameId(document.frame()));
+        if (pageAgent)
+            value->setFrameId(pageAgent->frameId(document.frame()));
         value->setDocumentURL(documentURLString(&document));
         value->setBaseURL(documentBaseURLString(&document));
         value->setXmlVersion(document.xmlVersion());
@@ -2243,12 +2256,11 @@ void InspectorDOMAgent::didModifyDOMAttr(Element& element, const AtomicString& n
         return;
 
     int id = boundNodeId(&element);
-    // If node is not mapped yet -> ignore the event.
     if (!id)
         return;
 
-    if (m_domListener)
-        m_domListener->didModifyDOMAttr(element);
+    if (auto* cssAgent = m_instrumentingAgents.inspectorCSSAgent())
+        cssAgent->didModifyDOMAttr(element);
 
     m_frontendDispatcher->attributeModified(id, name, value);
 }
@@ -2256,12 +2268,11 @@ void InspectorDOMAgent::didModifyDOMAttr(Element& element, const AtomicString& n
 void InspectorDOMAgent::didRemoveDOMAttr(Element& element, const AtomicString& name)
 {
     int id = boundNodeId(&element);
-    // If node is not mapped yet -> ignore the event.
     if (!id)
         return;
 
-    if (m_domListener)
-        m_domListener->didModifyDOMAttr(element);
+    if (auto* cssAgent = m_instrumentingAgents.inspectorCSSAgent())
+        cssAgent->didModifyDOMAttr(element);
 
     m_frontendDispatcher->attributeRemoved(id, name);
 }
@@ -2271,12 +2282,12 @@ void InspectorDOMAgent::styleAttributeInvalidated(const Vector<Element*>& elemen
     auto nodeIds = JSON::ArrayOf<int>::create();
     for (auto& element : elements) {
         int id = boundNodeId(element);
-        // If node is not mapped yet -> ignore the event.
         if (!id)
             continue;
 
-        if (m_domListener)
-            m_domListener->didModifyDOMAttr(*element);
+        if (auto* cssAgent = m_instrumentingAgents.inspectorCSSAgent())
+            cssAgent->didModifyDOMAttr(*element);
+
         nodeIds->addItem(id);
     }
     m_frontendDispatcher->inlineStyleInvalidated(WTFMove(nodeIds));
@@ -2296,7 +2307,6 @@ void InspectorDOMAgent::characterDataModified(CharacterData& characterData)
 void InspectorDOMAgent::didInvalidateStyleAttr(Node& node)
 {
     int id = m_documentNodeToIdMap.get(&node);
-    // If node is not mapped yet -> ignore the event.
     if (!id)
         return;
 
index ff59b56..4a58b0f 100644 (file)
@@ -51,7 +51,7 @@ class JSValue;
 }
 
 namespace WebCore {
-    
+
 class AccessibilityObject;
 class CharacterData;
 class DOMEditor;
@@ -63,12 +63,12 @@ class FloatQuad;
 class Frame;
 class InspectorHistory;
 class InspectorOverlay;
-class InspectorPageAgent;
 #if ENABLE(VIDEO)
 class HTMLMediaElement;
 #endif
 class HitTestResult;
 class Node;
+class Page;
 class PseudoElement;
 class RevalidateStyleAttributeTask;
 class ShadowRoot;
@@ -81,13 +81,7 @@ class InspectorDOMAgent final : public InspectorAgentBase, public Inspector::DOM
     WTF_MAKE_NONCOPYABLE(InspectorDOMAgent);
     WTF_MAKE_FAST_ALLOCATED;
 public:
-    struct DOMListener {
-        virtual ~DOMListener() = default;
-        virtual void didRemoveDOMNode(Node&, int nodeId) = 0;
-        virtual void didModifyDOMAttr(Element&) = 0;
-    };
-
-    InspectorDOMAgent(WebAgentContext&, InspectorPageAgent*, InspectorOverlay*);
+    InspectorDOMAgent(PageAgentContext&, InspectorOverlay*);
     virtual ~InspectorDOMAgent();
 
     static String toErrorString(ExceptionCode);
@@ -175,7 +169,6 @@ public:
     int pushNodeToFrontend(ErrorString&, int documentNodeId, Node*);
     Node* nodeForId(int nodeId);
     int boundNodeId(const Node*);
-    void setDOMListener(DOMListener*);
 
     static String documentURLString(Document*);
 
@@ -202,9 +195,6 @@ public:
     static Node* scriptValueAsNode(JSC::JSValue);
     static JSC::JSValue nodeAsScriptValue(JSC::ExecState&, Node*);
 
-    // Methods called from other agents.
-    InspectorPageAgent* pageAgent() { return m_pageAgent; }
-
     bool hasBreakpointForEventListener(EventTarget&, const AtomicString& eventType, EventListener&, bool capture);
     int idForEventListener(EventTarget&, const AtomicString& eventType, EventListener&, bool capture);
 
@@ -246,10 +236,8 @@ private:
     Inspector::InjectedScriptManager& m_injectedScriptManager;
     std::unique_ptr<Inspector::DOMFrontendDispatcher> m_frontendDispatcher;
     RefPtr<Inspector::DOMBackendDispatcher> m_backendDispatcher;
-    InspectorPageAgent* m_pageAgent { nullptr };
-
+    Page& m_inspectedPage;
     InspectorOverlay* m_overlay { nullptr };
-    DOMListener* m_domListener { nullptr };
     NodeToIdMap m_documentNodeToIdMap;
     // Owns node mappings for dangling nodes.
     Vector<std::unique_ptr<NodeToIdMap>> m_danglingNodeToIdMaps;
index ac915dc..e467679 100644 (file)
@@ -65,11 +65,10 @@ namespace WebCore {
 
 using namespace Inspector;
 
-InspectorDOMDebuggerAgent::InspectorDOMDebuggerAgent(WebAgentContext& context, InspectorDOMAgent* domAgent, InspectorDebuggerAgent* debuggerAgent)
+InspectorDOMDebuggerAgent::InspectorDOMDebuggerAgent(WebAgentContext& context, InspectorDebuggerAgent* debuggerAgent)
     : InspectorAgentBase("DOMDebugger"_s, context)
     , m_backendDispatcher(Inspector::DOMDebuggerBackendDispatcher::create(context.backendDispatcher, this))
     , m_injectedScriptManager(context.injectedScriptManager)
-    , m_domAgent(domAgent)
     , m_debuggerAgent(debuggerAgent)
 {
     m_debuggerAgent->addListener(*this);
@@ -233,7 +232,13 @@ static String domTypeName(int type)
 
 void InspectorDOMDebuggerAgent::setDOMBreakpoint(ErrorString& errorString, int nodeId, const String& typeString)
 {
-    Node* node = m_domAgent->assertNode(errorString, nodeId);
+    auto* domAgent = m_instrumentingAgents.inspectorDOMAgent();
+    if (!domAgent) {
+        errorString = "Missing DOM agent"_s;
+        return;
+    }
+
+    Node* node = domAgent->assertNode(errorString, nodeId);
     if (!node)
         return;
 
@@ -251,9 +256,16 @@ void InspectorDOMDebuggerAgent::setDOMBreakpoint(ErrorString& errorString, int n
 
 void InspectorDOMDebuggerAgent::removeDOMBreakpoint(ErrorString& errorString, int nodeId, const String& typeString)
 {
-    Node* node = m_domAgent->assertNode(errorString, nodeId);
+    auto* domAgent = m_instrumentingAgents.inspectorDOMAgent();
+    if (!domAgent) {
+        errorString = "Missing DOM agent"_s;
+        return;
+    }
+
+    Node* node = domAgent->assertNode(errorString, nodeId);
     if (!node)
         return;
+
     int type = domTypeForName(errorString, typeString);
     if (type == -1)
         return;
@@ -316,12 +328,16 @@ void InspectorDOMDebuggerAgent::descriptionForDOMEvent(Node& target, int breakpo
 {
     ASSERT(hasBreakpoint(&target, breakpointType));
 
+    auto* domAgent = m_instrumentingAgents.inspectorDOMAgent();
+
     Node* breakpointOwner = &target;
     if ((1 << breakpointType) & inheritableDOMBreakpointTypesMask) {
-        // For inheritable breakpoint types, target node isn't always the same as the node that owns a breakpoint.
-        // Target node may be unknown to frontend, so we need to push it first.
-        RefPtr<Inspector::Protocol::Runtime::RemoteObject> targetNodeObject = m_domAgent->resolveNode(&target, InspectorDebuggerAgent::backtraceObjectGroup);
-        description.setValue("targetNode", targetNodeObject);
+        if (domAgent) {
+            // For inheritable breakpoint types, target node isn't always the same as the node that owns a breakpoint.
+            // Target node may be unknown to frontend, so we need to push it first.
+            RefPtr<Inspector::Protocol::Runtime::RemoteObject> targetNodeObject = domAgent->resolveNode(&target, InspectorDebuggerAgent::backtraceObjectGroup);
+            description.setValue("targetNode", targetNodeObject);
+        }
 
         // Find breakpoint owner node.
         if (!insertion)
@@ -338,9 +354,12 @@ void InspectorDOMDebuggerAgent::descriptionForDOMEvent(Node& target, int breakpo
             description.setBoolean("insertion", insertion);
     }
 
-    int breakpointOwnerNodeId = m_domAgent->boundNodeId(breakpointOwner);
-    ASSERT(breakpointOwnerNodeId);
-    description.setInteger("nodeId", breakpointOwnerNodeId);
+    if (domAgent) {
+        int breakpointOwnerNodeId = domAgent->boundNodeId(breakpointOwner);
+        ASSERT(breakpointOwnerNodeId);
+        description.setInteger("nodeId", breakpointOwnerNodeId);
+    }
+
     description.setString("type", domTypeName(breakpointType));
 }
 
@@ -383,18 +402,20 @@ void InspectorDOMDebuggerAgent::willHandleEvent(Event& event, const RegisteredEv
         injectedScript.setEventValue(toJS(state, deprecatedGlobalObjectForPrototype(state), event));
     }
 
+    auto* domAgent = m_instrumentingAgents.inspectorDOMAgent();
+
     bool shouldPause = m_debuggerAgent->pauseOnNextStatementEnabled() || m_eventBreakpoints.contains(std::make_pair(Inspector::Protocol::DOMDebugger::EventBreakpointType::Listener, event.type()));
 
-    if (!shouldPause && m_domAgent)
-        shouldPause = m_domAgent->hasBreakpointForEventListener(*event.currentTarget(), event.type(), registeredEventListener.callback(), registeredEventListener.useCapture());
+    if (!shouldPause && domAgent)
+        shouldPause = domAgent->hasBreakpointForEventListener(*event.currentTarget(), event.type(), registeredEventListener.callback(), registeredEventListener.useCapture());
 
     if (!shouldPause)
         return;
 
     Ref<JSON::Object> eventData = JSON::Object::create();
     eventData->setString("eventName"_s, event.type());
-    if (m_domAgent) {
-        int eventListenerId = m_domAgent->idForEventListener(*event.currentTarget(), event.type(), registeredEventListener.callback(), registeredEventListener.useCapture());
+    if (domAgent) {
+        int eventListenerId = domAgent->idForEventListener(*event.currentTarget(), event.type(), registeredEventListener.callback(), registeredEventListener.useCapture());
         if (eventListenerId)
             eventData->setInteger("eventListenerId"_s, eventListenerId);
     }
index f266475..a365939 100644 (file)
@@ -47,7 +47,6 @@ namespace WebCore {
 class Element;
 class Event;
 class Frame;
-class InspectorDOMAgent;
 class Node;
 class RegisteredEventListener;
 
@@ -57,7 +56,7 @@ class InspectorDOMDebuggerAgent final : public InspectorAgentBase, public Inspec
     WTF_MAKE_NONCOPYABLE(InspectorDOMDebuggerAgent);
     WTF_MAKE_FAST_ALLOCATED;
 public:
-    InspectorDOMDebuggerAgent(WebAgentContext&, InspectorDOMAgent*, Inspector::InspectorDebuggerAgent*);
+    InspectorDOMDebuggerAgent(WebAgentContext&, Inspector::InspectorDebuggerAgent*);
     virtual ~InspectorDOMDebuggerAgent();
 
     // DOMDebugger API
@@ -104,7 +103,7 @@ private:
 
     RefPtr<Inspector::DOMDebuggerBackendDispatcher> m_backendDispatcher;
     Inspector::InjectedScriptManager& m_injectedScriptManager;
-    InspectorDOMAgent* m_domAgent { nullptr };
+
     Inspector::InspectorDebuggerAgent* m_debuggerAgent { nullptr };
 
     HashMap<Node*, uint32_t> m_domBreakpoints;
index 6eb26e0..f717ea7 100644 (file)
 
 #include "CommandLineAPIHost.h"
 #include "InspectorDOMAgent.h"
+#include "InstrumentingAgents.h"
 #include "Node.h"
 #include "WebInjectedScriptManager.h"
 
-
 namespace WebCore {
 
 using namespace Inspector;
 
-PageConsoleAgent::PageConsoleAgent(WebAgentContext& context, InspectorDOMAgent* domAgent)
+PageConsoleAgent::PageConsoleAgent(WebAgentContext& context)
     : WebConsoleAgent(context)
-    , m_inspectorDOMAgent(domAgent)
+    , m_instrumentingAgents(context.instrumentingAgents)
 {
 }
 
 void PageConsoleAgent::clearMessages(ErrorString& errorString)
 {
-    m_inspectorDOMAgent->releaseDanglingNodes();
+    if (auto* domAgent = m_instrumentingAgents.inspectorDOMAgent())
+        domAgent->releaseDanglingNodes();
 
     WebConsoleAgent::clearMessages(errorString);
 }
index 71cb890..ada24fe 100644 (file)
 
 namespace WebCore {
 
-class InspectorDOMAgent;
-
 class PageConsoleAgent final : public WebConsoleAgent {
     WTF_MAKE_NONCOPYABLE(PageConsoleAgent);
     WTF_MAKE_FAST_ALLOCATED;
 public:
-    PageConsoleAgent(WebAgentContext&, InspectorDOMAgent*);
+    PageConsoleAgent(WebAgentContext&);
     virtual ~PageConsoleAgent() = default;
 
 private:
     void clearMessages(ErrorString&) override;
 
-    InspectorDOMAgent* m_inspectorDOMAgent;
+    InstrumentingAgents& m_instrumentingAgents;
 };
 
 } // namespace WebCore