Web Inspector: REGRESSION(r244172): crash when trying to add extra domain while inspe...
authordrousso@apple.com <drousso@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 15 Apr 2019 20:29:30 +0000 (20:29 +0000)
committerdrousso@apple.com <drousso@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 15 Apr 2019 20:29:30 +0000 (20:29 +0000)
https://bugs.webkit.org/show_bug.cgi?id=196925
<rdar://problem/49873994>

Reviewed by Joseph Pecoraro.

Move the logic for creating the `InspectorAgent` and `InspectorDebuggerAgent` into separate
functions so that callers can be guaranteed to have a valid instance of the agent.

* inspector/JSGlobalObjectInspectorController.h:
* inspector/JSGlobalObjectInspectorController.cpp:
(Inspector::JSGlobalObjectInspectorController::connectFrontend):
(Inspector::JSGlobalObjectInspectorController::frontendInitialized):
(Inspector::JSGlobalObjectInspectorController::appendExtraAgent):
(Inspector::JSGlobalObjectInspectorController::ensureInspectorAgent): Added.
(Inspector::JSGlobalObjectInspectorController::ensureDebuggerAgent): Added.
(Inspector::JSGlobalObjectInspectorController::createLazyAgents):

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

Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/inspector/JSGlobalObjectInspectorController.cpp
Source/JavaScriptCore/inspector/JSGlobalObjectInspectorController.h

index 841e720..fdca786 100644 (file)
@@ -1,3 +1,23 @@
+2019-04-15  Devin Rousso  <drousso@apple.com>
+
+        Web Inspector: REGRESSION(r244172): crash when trying to add extra domain while inspecting JSContext
+        https://bugs.webkit.org/show_bug.cgi?id=196925
+        <rdar://problem/49873994>
+
+        Reviewed by Joseph Pecoraro.
+
+        Move the logic for creating the `InspectorAgent` and `InspectorDebuggerAgent` into separate
+        functions so that callers can be guaranteed to have a valid instance of the agent.
+
+        * inspector/JSGlobalObjectInspectorController.h:
+        * inspector/JSGlobalObjectInspectorController.cpp:
+        (Inspector::JSGlobalObjectInspectorController::connectFrontend):
+        (Inspector::JSGlobalObjectInspectorController::frontendInitialized):
+        (Inspector::JSGlobalObjectInspectorController::appendExtraAgent):
+        (Inspector::JSGlobalObjectInspectorController::ensureInspectorAgent): Added.
+        (Inspector::JSGlobalObjectInspectorController::ensureDebuggerAgent): Added.
+        (Inspector::JSGlobalObjectInspectorController::createLazyAgents):
+
 2019-04-14  Don Olmstead  <don.olmstead@sony.com>
 
         [CMake] JavaScriptCore derived sources should only be referenced inside JavaScriptCore
index 2b36d0d..c8da52e 100644 (file)
@@ -118,8 +118,7 @@ void JSGlobalObjectInspectorController::connectFrontend(FrontendChannel& fronten
     m_agents.didCreateFrontendAndBackend(nullptr, nullptr);
 
 #if ENABLE(INSPECTOR_ALTERNATE_DISPATCHERS)
-    ASSERT(m_inspectorAgent);
-    m_inspectorAgent->activateExtraDomains(m_agents.extraDomains());
+    ensureInspectorAgent().activateExtraDomains(m_agents.extraDomains());
 
     if (m_augmentingClient)
         m_augmentingClient->inspectorConnected();
@@ -237,10 +236,9 @@ void JSGlobalObjectInspectorController::frontendInitialized()
     if (m_pauseAfterInitialization) {
         m_pauseAfterInitialization = false;
 
-        ASSERT(m_debuggerAgent);
         ErrorString ignored;
-        m_debuggerAgent->enable(ignored);
-        m_debuggerAgent->pause(ignored);
+        ensureDebuggerAgent().enable(ignored);
+        ensureDebuggerAgent().pause(ignored);
     }
 
 #if ENABLE(REMOTE_INSPECTOR)
@@ -274,11 +272,33 @@ void JSGlobalObjectInspectorController::appendExtraAgent(std::unique_ptr<Inspect
 
     m_agents.appendExtraAgent(WTFMove(agent));
 
-    ASSERT(m_inspectorAgent);
-    m_inspectorAgent->activateExtraDomain(domainName);
+    ensureInspectorAgent().activateExtraDomain(domainName);
 }
 #endif
 
+InspectorAgent& JSGlobalObjectInspectorController::ensureInspectorAgent()
+{
+    if (!m_inspectorAgent) {
+        auto context = jsAgentContext();
+        auto inspectorAgent = std::make_unique<InspectorAgent>(context);
+        m_inspectorAgent = inspectorAgent.get();
+        m_agents.append(WTFMove(inspectorAgent));
+    }
+    return *m_inspectorAgent;
+}
+
+InspectorDebuggerAgent& JSGlobalObjectInspectorController::ensureDebuggerAgent()
+{
+    if (!m_debuggerAgent) {
+        auto context = jsAgentContext();
+        auto debuggerAgent = std::make_unique<JSGlobalObjectDebuggerAgent>(context, m_consoleAgent);
+        m_debuggerAgent = debuggerAgent.get();
+        m_consoleClient->setInspectorDebuggerAgent(m_debuggerAgent);
+        m_agents.append(WTFMove(debuggerAgent));
+    }
+    return *m_debuggerAgent;
+}
+
 JSAgentContext JSGlobalObjectInspectorController::jsAgentContext()
 {
     AgentContext baseContext = {
@@ -305,16 +325,11 @@ void JSGlobalObjectInspectorController::createLazyAgents()
 
     auto context = jsAgentContext();
 
-    auto inspectorAgent = std::make_unique<InspectorAgent>(context);
-    m_inspectorAgent = inspectorAgent.get();
-    m_agents.append(WTFMove(inspectorAgent));
+    ensureInspectorAgent();
 
     m_agents.append(std::make_unique<JSGlobalObjectRuntimeAgent>(context));
 
-    auto debuggerAgent = std::make_unique<JSGlobalObjectDebuggerAgent>(context, m_consoleAgent);
-    m_debuggerAgent = debuggerAgent.get();
-    m_consoleClient->setInspectorDebuggerAgent(m_debuggerAgent);
-    m_agents.append(WTFMove(debuggerAgent));
+    ensureDebuggerAgent();
 
     auto scriptProfilerAgentPtr = std::make_unique<InspectorScriptProfilerAgent>(context);
     m_consoleClient->setInspectorScriptProfilerAgent(scriptProfilerAgentPtr.get());
index 1aa05b5..f0ffc45 100644 (file)
@@ -104,6 +104,9 @@ public:
 private:
     void appendAPIBacktrace(ScriptCallStack&);
 
+    InspectorAgent& ensureInspectorAgent();
+    InspectorDebuggerAgent& ensureDebuggerAgent();
+
     JSAgentContext jsAgentContext();
     void createLazyAgents();
 
@@ -114,8 +117,10 @@ private:
     JSGlobalObjectScriptDebugServer m_scriptDebugServer;
 
     AgentRegistry m_agents;
-    InspectorAgent* m_inspectorAgent { nullptr };
     InspectorConsoleAgent* m_consoleAgent { nullptr };
+
+    // Lazy, but also on-demand agents.
+    InspectorAgent* m_inspectorAgent { nullptr };
     InspectorDebuggerAgent* m_debuggerAgent { nullptr };
 
     Ref<FrontendRouter> m_frontendRouter;