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()); |
} |