Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(170)

Unified Diff: third_party/WebKit/Source/web/WebDevToolsAgentImpl.cpp

Issue 1899933003: [DevTools] Introduce InspectorSession. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: export, comment Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « third_party/WebKit/Source/web/WebDevToolsAgentImpl.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: third_party/WebKit/Source/web/WebDevToolsAgentImpl.cpp
diff --git a/third_party/WebKit/Source/web/WebDevToolsAgentImpl.cpp b/third_party/WebKit/Source/web/WebDevToolsAgentImpl.cpp
index 6418cacd1b44e0ba7a4cef579b9d6d533a700028..8ed585e805ccaa6bdde4c95c1918172741f97910 100644
--- a/third_party/WebKit/Source/web/WebDevToolsAgentImpl.cpp
+++ b/third_party/WebKit/Source/web/WebDevToolsAgentImpl.cpp
@@ -300,7 +300,6 @@ WebDevToolsAgentImpl::WebDevToolsAgentImpl(
bool includeViewAgents)
: m_client(client)
, m_webLocalFrameImpl(webLocalFrameImpl)
- , m_attached(false)
#if DCHECK_IS_ON()
, m_hasBeenDisposed(false)
#endif
@@ -314,10 +313,7 @@ WebDevToolsAgentImpl::WebDevToolsAgentImpl(
, m_resourceAgent(nullptr)
, m_layerTreeAgent(nullptr)
, m_tracingAgent(nullptr)
- , m_agents(m_instrumentingAgents.get())
, m_includeViewAgents(includeViewAgents)
- , m_sessionId(0)
- , m_stateMuted(false)
, m_layerTreeId(0)
{
DCHECK(isMainThread());
@@ -335,7 +331,7 @@ void WebDevToolsAgentImpl::dispose()
{
// Explicitly dispose of the agent before destructing to ensure
// same behavior (and correctness) with and without Oilpan.
- if (m_attached)
+ if (attached())
Platform::current()->currentThread()->removeTaskObserver(this);
#if DCHECK_IS_ON()
DCHECK(!m_hasBeenDisposed);
@@ -368,23 +364,21 @@ DEFINE_TRACE(WebDevToolsAgentImpl)
visitor->trace(m_resourceAgent);
visitor->trace(m_layerTreeAgent);
visitor->trace(m_tracingAgent);
- visitor->trace(m_agents);
+ visitor->trace(m_session);
}
void WebDevToolsAgentImpl::willBeDestroyed()
{
DCHECK(m_webLocalFrameImpl->frame());
DCHECK(m_inspectedFrames->root()->view());
-
detach();
m_resourceContentLoader->dispose();
- m_agents.discardAgents();
- m_instrumentingAgents->reset();
- m_v8Session.clear();
}
-void WebDevToolsAgentImpl::initializeAgents()
+void WebDevToolsAgentImpl::initializeSession(int sessionId, const String& hostId)
{
+ m_session = new InspectorSession(this, sessionId, m_instrumentingAgents.get(), false /* autoFlush */);
+
ClientMessageLoopAdapter::ensureMainThreadDebuggerCreated(m_client);
MainThreadDebugger* mainThreadDebugger = MainThreadDebugger::instance();
v8::Isolate* isolate = V8PerIsolateData::mainThreadIsolate();
@@ -392,79 +386,83 @@ void WebDevToolsAgentImpl::initializeAgents()
m_v8Session = mainThreadDebugger->debugger()->connect(mainThreadDebugger->contextGroupId(m_inspectedFrames->root()));
V8RuntimeAgent* runtimeAgent = m_v8Session->runtimeAgent();
- m_agents.append(PageRuntimeAgent::create(this, runtimeAgent, m_inspectedFrames.get()));
+ m_session->append(PageRuntimeAgent::create(this, runtimeAgent, m_inspectedFrames.get()));
InspectorDOMAgent* domAgent = InspectorDOMAgent::create(isolate, m_inspectedFrames.get(), runtimeAgent, m_overlay.get());
m_domAgent = domAgent;
- m_agents.append(domAgent);
+ m_session->append(domAgent);
InspectorLayerTreeAgent* layerTreeAgent = InspectorLayerTreeAgent::create(m_inspectedFrames.get());
m_layerTreeAgent = layerTreeAgent;
- m_agents.append(layerTreeAgent);
+ m_session->append(layerTreeAgent);
InspectorResourceAgent* resourceAgent = InspectorResourceAgent::create(m_inspectedFrames.get());
m_resourceAgent = resourceAgent;
- m_agents.append(resourceAgent);
+ m_session->append(resourceAgent);
InspectorCSSAgent* cssAgent = InspectorCSSAgent::create(m_domAgent, m_inspectedFrames.get(), m_resourceAgent, m_resourceContentLoader.get(), m_resourceContainer.get());
- m_agents.append(cssAgent);
+ m_session->append(cssAgent);
- m_agents.append(InspectorAnimationAgent::create(m_inspectedFrames.get(), m_domAgent, cssAgent, runtimeAgent));
+ m_session->append(InspectorAnimationAgent::create(m_inspectedFrames.get(), m_domAgent, cssAgent, runtimeAgent));
- m_agents.append(InspectorMemoryAgent::create());
+ m_session->append(InspectorMemoryAgent::create());
- m_agents.append(InspectorApplicationCacheAgent::create(m_inspectedFrames.get()));
+ m_session->append(InspectorApplicationCacheAgent::create(m_inspectedFrames.get()));
- m_agents.append(InspectorIndexedDBAgent::create(m_inspectedFrames.get()));
+ m_session->append(InspectorIndexedDBAgent::create(m_inspectedFrames.get()));
InspectorDebuggerAgent* debuggerAgent = PageDebuggerAgent::create(m_v8Session->debuggerAgent(), m_inspectedFrames.get());
- m_agents.append(debuggerAgent);
+ m_session->append(debuggerAgent);
PageConsoleAgent* pageConsoleAgent = PageConsoleAgent::create(runtimeAgent, m_v8Session->debuggerAgent(), m_domAgent, m_inspectedFrames.get());
- m_agents.append(pageConsoleAgent);
+ m_session->append(pageConsoleAgent);
InspectorWorkerAgent* workerAgent = InspectorWorkerAgent::create(m_inspectedFrames.get(), pageConsoleAgent);
- m_agents.append(workerAgent);
+ m_session->append(workerAgent);
InspectorTracingAgent* tracingAgent = InspectorTracingAgent::create(this, workerAgent, m_inspectedFrames.get());
m_tracingAgent = tracingAgent;
- m_agents.append(tracingAgent);
+ m_session->append(tracingAgent);
- m_agents.append(InspectorDOMDebuggerAgent::create(isolate, m_domAgent, runtimeAgent, debuggerAgent->v8Agent()));
+ m_session->append(InspectorDOMDebuggerAgent::create(isolate, m_domAgent, runtimeAgent, debuggerAgent->v8Agent()));
- m_agents.append(InspectorInputAgent::create(m_inspectedFrames.get()));
+ m_session->append(InspectorInputAgent::create(m_inspectedFrames.get()));
- m_agents.append(InspectorProfilerAgent::create(m_v8Session->profilerAgent(), m_overlay.get()));
+ m_session->append(InspectorProfilerAgent::create(m_v8Session->profilerAgent(), m_overlay.get()));
- m_agents.append(InspectorHeapProfilerAgent::create(isolate, m_v8Session->heapProfilerAgent()));
+ m_session->append(InspectorHeapProfilerAgent::create(isolate, m_v8Session->heapProfilerAgent()));
InspectorPageAgent* pageAgent = InspectorPageAgent::create(m_inspectedFrames.get(), this, m_resourceContentLoader.get(), debuggerAgent);
m_pageAgent = pageAgent;
- m_agents.append(pageAgent);
+ m_session->append(pageAgent);
runtimeAgent->setClearConsoleCallback(bind<>(&InspectorConsoleAgent::clearAllMessages, pageConsoleAgent));
m_tracingAgent->setLayerTreeId(m_layerTreeId);
+ m_resourceAgent->setHostId(hostId);
if (m_includeViewAgents) {
// TODO(dgozman): we should actually pass the view instead of frame, but during
// remote->local transition we cannot access mainFrameImpl() yet, so we have to store the
// frame which will become the main frame later.
- m_agents.append(InspectorRenderingAgent::create(m_webLocalFrameImpl, m_overlay.get()));
- m_agents.append(InspectorEmulationAgent::create(m_webLocalFrameImpl, this));
+ m_session->append(InspectorRenderingAgent::create(m_webLocalFrameImpl, m_overlay.get()));
+ m_session->append(InspectorEmulationAgent::create(m_webLocalFrameImpl, this));
// TODO(dgozman): migrate each of the following agents to frame once module is ready.
Page* page = m_webLocalFrameImpl->viewImpl()->page();
- m_agents.append(InspectorDatabaseAgent::create(page));
- m_agents.append(DeviceOrientationInspectorAgent::create(page));
- m_agents.append(InspectorAccessibilityAgent::create(page));
- m_agents.append(InspectorDOMStorageAgent::create(page));
- m_agents.append(InspectorCacheStorageAgent::create());
+ m_session->append(InspectorDatabaseAgent::create(page));
+ m_session->append(DeviceOrientationInspectorAgent::create(page));
+ m_session->append(InspectorAccessibilityAgent::create(page));
+ m_session->append(InspectorDOMStorageAgent::create(page));
+ m_session->append(InspectorCacheStorageAgent::create());
}
if (m_overlay)
m_overlay->init(cssAgent, debuggerAgent, m_domAgent);
+
+ Platform::current()->currentThread()->addTaskObserver(this);
+ InspectorInstrumentation::registerInstrumentingAgents(m_instrumentingAgents.get());
}
-void WebDevToolsAgentImpl::destroyAgents()
+void WebDevToolsAgentImpl::destroySession()
{
if (m_overlay)
m_overlay->clear();
@@ -475,68 +473,36 @@ void WebDevToolsAgentImpl::destroyAgents()
m_pageAgent.clear();
m_domAgent.clear();
- m_agents.discardAgents();
- m_instrumentingAgents->reset();
+ m_session->detach();
m_v8Session.clear();
+ m_session.clear();
+
+ Platform::current()->currentThread()->removeTaskObserver(this);
+ InspectorInstrumentation::unregisterInstrumentingAgents(m_instrumentingAgents.get());
}
void WebDevToolsAgentImpl::attach(const WebString& hostId, int sessionId)
{
- if (m_attached)
+ if (attached())
return;
-
- // Set the attached bit first so that sync notifications were delivered.
- m_attached = true;
- m_sessionId = sessionId;
-
- initializeAgents();
- m_resourceAgent->setHostId(hostId);
-
- m_inspectorFrontend = adoptPtr(new protocol::Frontend(this));
- // We can reconnect to existing front-end -> unmute state.
- m_stateMuted = false;
- m_agents.setFrontend(m_inspectorFrontend.get());
-
- InspectorInstrumentation::registerInstrumentingAgents(m_instrumentingAgents.get());
- InspectorInstrumentation::frontendCreated();
-
- m_inspectorBackendDispatcher = protocol::Dispatcher::create(this);
- m_agents.registerInDispatcher(m_inspectorBackendDispatcher.get());
-
- Platform::current()->currentThread()->addTaskObserver(this);
+ initializeSession(sessionId, hostId);
+ m_session->attach(nullptr);
}
void WebDevToolsAgentImpl::reattach(const WebString& hostId, int sessionId, const WebString& savedState)
{
- if (m_attached)
+ if (attached())
return;
-
- attach(hostId, sessionId);
- m_agents.restore(savedState);
+ initializeSession(sessionId, hostId);
+ String state = savedState;
+ m_session->attach(&state);
}
void WebDevToolsAgentImpl::detach()
{
- if (!m_attached)
+ if (!attached())
return;
-
- Platform::current()->currentThread()->removeTaskObserver(this);
-
- m_inspectorBackendDispatcher->clearFrontend();
- m_inspectorBackendDispatcher.clear();
-
- // Destroying agents would change the state, but we don't want that.
- // Pre-disconnect state will be used to restore inspector agents.
- m_stateMuted = true;
- m_agents.clearFrontend();
- m_inspectorFrontend.clear();
-
- destroyAgents();
- InspectorInstrumentation::frontendDeleted();
- InspectorInstrumentation::unregisterInstrumentingAgents(m_instrumentingAgents.get());
-
- m_sessionId = 0;
- m_attached = false;
+ destroySession();
}
void WebDevToolsAgentImpl::continueProgram()
@@ -548,7 +514,8 @@ void WebDevToolsAgentImpl::didCommitLoadForLocalFrame(LocalFrame* frame)
{
m_resourceContainer->didCommitLoadForLocalFrame(frame);
m_resourceContentLoader->didCommitLoadForLocalFrame(frame);
- m_agents.didCommitLoadForLocalFrame(frame);
+ if (m_session)
+ m_session->didCommitLoadForLocalFrame(frame);
}
bool WebDevToolsAgentImpl::screencastEnabled()
@@ -592,7 +559,7 @@ void WebDevToolsAgentImpl::setCPUThrottlingRate(double rate)
void WebDevToolsAgentImpl::dispatchOnInspectorBackend(int sessionId, const WebString& message)
{
- if (!m_attached)
+ if (!attached())
return;
if (WebDevToolsAgent::shouldInterruptForMessage(message))
MainThreadDebugger::instance()->taskRunner()->runAllTasksDontWait();
@@ -602,9 +569,10 @@ void WebDevToolsAgentImpl::dispatchOnInspectorBackend(int sessionId, const WebSt
void WebDevToolsAgentImpl::dispatchMessageFromFrontend(int sessionId, const String& message)
{
+ if (!attached() || sessionId != m_session->sessionId())
+ return;
InspectorTaskRunner::IgnoreInterruptsScope scope(MainThreadDebugger::instance()->taskRunner());
- if (m_inspectorBackendDispatcher)
- m_inspectorBackendDispatcher->dispatch(sessionId, message);
+ m_session->dispatchProtocolMessage(message);
}
void WebDevToolsAgentImpl::inspectElementAt(const WebPoint& pointInRootFrame)
@@ -631,33 +599,10 @@ void WebDevToolsAgentImpl::failedToRequestDevTools()
ClientMessageLoopAdapter::resumeForCreateWindow();
}
-void WebDevToolsAgentImpl::sendProtocolResponse(int sessionId, int callId, PassOwnPtr<protocol::DictionaryValue> message)
-{
- if (!m_attached)
- return;
- flushPendingProtocolNotifications();
- String stateToSend;
- if (!m_stateMuted) {
- stateToSend = m_agents.state();
- if (stateToSend == m_stateCookie)
- stateToSend = String();
- else
- m_stateCookie = stateToSend;
- }
-
- m_client->sendProtocolMessage(sessionId, callId, message->toJSONString(), stateToSend);
-}
-
-void WebDevToolsAgentImpl::sendProtocolNotification(PassOwnPtr<protocol::DictionaryValue> message)
-{
- if (!m_attached)
- return;
- m_notificationQueue.append(std::make_pair(m_sessionId, message));
-}
-
-void WebDevToolsAgentImpl::flush()
+void WebDevToolsAgentImpl::sendProtocolMessage(int sessionId, int callId, const String& response, const String& state)
{
- flushPendingProtocolNotifications();
+ ASSERT(attached());
+ m_client->sendProtocolMessage(sessionId, callId, response, state);
}
void WebDevToolsAgentImpl::resumeStartup()
@@ -683,7 +628,7 @@ void WebDevToolsAgentImpl::setPausedInDebuggerMessage(const String& message)
void WebDevToolsAgentImpl::waitForCreateWindow(LocalFrame* frame)
{
- if (!m_attached)
+ if (!attached())
return;
if (m_client->requestDevToolsForFrame(WebLocalFrameImpl::fromFrame(frame)))
ClientMessageLoopAdapter::pauseForCreateWindow(m_webLocalFrameImpl);
@@ -699,17 +644,13 @@ WebString WebDevToolsAgentImpl::evaluateInWebInspectorOverlay(const WebString& s
void WebDevToolsAgentImpl::flushPendingProtocolNotifications()
{
- if (m_attached) {
- m_agents.flushPendingProtocolNotifications();
- for (size_t i = 0; i < m_notificationQueue.size(); ++i)
- m_client->sendProtocolMessage(m_notificationQueue[i].first, 0, m_notificationQueue[i].second->toJSONString(), WebString());
- }
- m_notificationQueue.clear();
+ if (m_session)
+ m_session->flushPendingProtocolNotifications();
}
void WebDevToolsAgentImpl::willProcessTask()
{
- if (!m_attached)
+ if (!attached())
return;
if (InspectorProfilerAgent* profilerAgent = m_instrumentingAgents->inspectorProfilerAgent())
profilerAgent->willProcessTask();
@@ -717,7 +658,7 @@ void WebDevToolsAgentImpl::willProcessTask()
void WebDevToolsAgentImpl::didProcessTask()
{
- if (!m_attached)
+ if (!attached())
return;
if (InspectorProfilerAgent* profilerAgent = m_instrumentingAgents->inspectorProfilerAgent())
profilerAgent->didProcessTask();
@@ -731,7 +672,7 @@ void WebDevToolsAgentImpl::runDebuggerTask(int sessionId, PassOwnPtr<WebDevTools
return;
WebDevToolsAgentImpl* agentImpl = static_cast<WebDevToolsAgentImpl*>(webagent);
- if (agentImpl->m_attached)
+ if (agentImpl->attached())
agentImpl->dispatchMessageFromFrontend(sessionId, descriptor->message());
}
« no previous file with comments | « third_party/WebKit/Source/web/WebDevToolsAgentImpl.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698