Index: third_party/WebKit/Source/platform/v8_inspector/V8InspectorSessionImpl.cpp |
diff --git a/third_party/WebKit/Source/platform/v8_inspector/V8InspectorSessionImpl.cpp b/third_party/WebKit/Source/platform/v8_inspector/V8InspectorSessionImpl.cpp |
index c728f9e2ff594f70ef684ed3f2ef71d8f358a12d..0f93696384ec6b27cfcaeb6de5406bba2ece075e 100644 |
--- a/third_party/WebKit/Source/platform/v8_inspector/V8InspectorSessionImpl.cpp |
+++ b/third_party/WebKit/Source/platform/v8_inspector/V8InspectorSessionImpl.cpp |
@@ -4,6 +4,7 @@ |
#include "platform/v8_inspector/V8InspectorSessionImpl.h" |
+#include "platform/inspector_protocol/Parser.h" |
#include "platform/v8_inspector/InjectedScript.h" |
#include "platform/v8_inspector/InspectedContext.h" |
#include "platform/v8_inspector/RemoteObjectId.h" |
@@ -19,53 +20,86 @@ namespace blink { |
const char V8InspectorSession::backtraceObjectGroup[] = "backtrace"; |
-PassOwnPtr<V8InspectorSessionImpl> V8InspectorSessionImpl::create(V8DebuggerImpl* debugger, int contextGroupId) |
+// static |
+bool V8InspectorSession::isV8ProtocolMethod(const String16& method) |
{ |
- return adoptPtr(new V8InspectorSessionImpl(debugger, contextGroupId)); |
+ return method.startWith("Debugger.") || method.startWith("HeapProfiler.") || method.startWith("Profiler.") || method.startWith("Runtime."); |
} |
-V8InspectorSessionImpl::V8InspectorSessionImpl(V8DebuggerImpl* debugger, int contextGroupId) |
+PassOwnPtr<V8InspectorSessionImpl> V8InspectorSessionImpl::create(V8DebuggerImpl* debugger, int contextGroupId, V8InspectorSessionClient* client, const String16* state) |
+{ |
+ return adoptPtr(new V8InspectorSessionImpl(debugger, contextGroupId, client, state)); |
+} |
+ |
+V8InspectorSessionImpl::V8InspectorSessionImpl(V8DebuggerImpl* debugger, int contextGroupId, V8InspectorSessionClient* client, const String16* savedState) |
: m_contextGroupId(contextGroupId) |
, m_debugger(debugger) |
- , m_client(nullptr) |
+ , m_client(client) |
, m_customObjectFormatterEnabled(false) |
, m_instrumentationCounter(0) |
- , m_runtimeAgent(adoptPtr(new V8RuntimeAgentImpl(this))) |
- , m_debuggerAgent(adoptPtr(new V8DebuggerAgentImpl(this))) |
- , m_heapProfilerAgent(adoptPtr(new V8HeapProfilerAgentImpl(this))) |
- , m_profilerAgent(adoptPtr(new V8ProfilerAgentImpl(this))) |
+ , m_frontend(adoptPtr(new protocol::Frontend(client))) |
+ , m_dispatcher(protocol::Dispatcher::create(client)) |
+ , m_state(nullptr) |
+ , m_runtimeAgent(nullptr) |
+ , m_debuggerAgent(nullptr) |
+ , m_heapProfilerAgent(nullptr) |
+ , m_profilerAgent(nullptr) |
{ |
-} |
+ if (savedState) { |
+ OwnPtr<protocol::Value> state = protocol::parseJSON(*savedState); |
+ if (state) |
+ m_state = protocol::DictionaryValue::cast(std::move(state)); |
+ if (!m_state) |
+ m_state = protocol::DictionaryValue::create(); |
+ } else { |
+ m_state = protocol::DictionaryValue::create(); |
+ } |
-V8InspectorSessionImpl::~V8InspectorSessionImpl() |
-{ |
- discardInjectedScripts(); |
- m_debugger->disconnect(this); |
-} |
+ m_runtimeAgent = adoptPtr(new V8RuntimeAgentImpl(this, protocol::Frontend::Runtime::from(m_frontend.get()), agentState("Runtime"))); |
+ m_dispatcher->registerAgent(static_cast<protocol::Backend::Runtime*>(m_runtimeAgent.get())); |
-V8DebuggerAgent* V8InspectorSessionImpl::debuggerAgent() |
-{ |
- return m_debuggerAgent.get(); |
-} |
+ m_debuggerAgent = adoptPtr(new V8DebuggerAgentImpl(this, protocol::Frontend::Debugger::from(m_frontend.get()), agentState("Debugger"))); |
+ m_dispatcher->registerAgent(static_cast<protocol::Backend::Debugger*>(m_debuggerAgent.get())); |
-V8HeapProfilerAgent* V8InspectorSessionImpl::heapProfilerAgent() |
-{ |
- return m_heapProfilerAgent.get(); |
-} |
+ m_heapProfilerAgent = adoptPtr(new V8HeapProfilerAgentImpl(this, protocol::Frontend::HeapProfiler::from(m_frontend.get()), agentState("HeapProfiler"))); |
+ m_dispatcher->registerAgent(static_cast<protocol::Backend::HeapProfiler*>(m_heapProfilerAgent.get())); |
-V8ProfilerAgent* V8InspectorSessionImpl::profilerAgent() |
-{ |
- return m_profilerAgent.get(); |
+ m_profilerAgent = adoptPtr(new V8ProfilerAgentImpl(this, protocol::Frontend::Profiler::from(m_frontend.get()), agentState("Profiler"))); |
+ m_dispatcher->registerAgent(static_cast<protocol::Backend::Profiler*>(m_profilerAgent.get())); |
+ |
+ if (savedState) { |
+ m_runtimeAgent->restore(); |
+ m_debuggerAgent->restore(); |
+ m_heapProfilerAgent->restore(); |
+ m_profilerAgent->restore(); |
+ } |
} |
-V8RuntimeAgent* V8InspectorSessionImpl::runtimeAgent() |
+V8InspectorSessionImpl::~V8InspectorSessionImpl() |
{ |
- return m_runtimeAgent.get(); |
+ m_dispatcher->clearFrontend(); |
+ m_dispatcher.clear(); |
+ |
+ ErrorString errorString; |
+ m_profilerAgent->disable(&errorString); |
+ m_heapProfilerAgent->disable(&errorString); |
+ m_debuggerAgent->disable(&errorString); |
+ m_runtimeAgent->disable(&errorString); |
+ |
+ m_frontend.clear(); |
+ discardInjectedScripts(); |
+ m_debugger->disconnect(this); |
} |
-void V8InspectorSessionImpl::setClient(V8InspectorSessionClient* client) |
+protocol::DictionaryValue* V8InspectorSessionImpl::agentState(const String16& name) |
{ |
- m_client = client; |
+ protocol::DictionaryValue* state = m_state->getObject(name); |
+ if (!state) { |
+ OwnPtr<protocol::DictionaryValue> newState = protocol::DictionaryValue::create(); |
+ state = newState.get(); |
+ m_state->setObject(name, std::move(newState)); |
+ } |
+ return state; |
} |
void V8InspectorSessionImpl::reset() |
@@ -204,13 +238,23 @@ void V8InspectorSessionImpl::reportAllContexts(V8RuntimeAgentImpl* agent) |
void V8InspectorSessionImpl::changeInstrumentationCounter(int delta) |
{ |
DCHECK_GE(m_instrumentationCounter + delta, 0); |
- if (!m_instrumentationCounter && m_client) |
+ if (!m_instrumentationCounter) |
m_client->startInstrumenting(); |
m_instrumentationCounter += delta; |
- if (!m_instrumentationCounter && m_client) |
+ if (!m_instrumentationCounter) |
m_client->stopInstrumenting(); |
} |
+void V8InspectorSessionImpl::dispatchProtocolMessage(const String16& message) |
+{ |
+ m_dispatcher->dispatch(message); |
+} |
+ |
+String16 V8InspectorSessionImpl::stateJSON() |
+{ |
+ return m_state->toJSONString(); |
+} |
+ |
void V8InspectorSessionImpl::addInspectedObject(PassOwnPtr<V8InspectorSession::Inspectable> inspectable) |
{ |
m_inspectedObjects.prepend(std::move(inspectable)); |
@@ -251,6 +295,18 @@ void V8InspectorSessionImpl::setSkipAllPauses(bool skip) |
m_debuggerAgent->setSkipAllPauses(&errorString, skip); |
} |
+void V8InspectorSessionImpl::resume() |
+{ |
+ ErrorString errorString; |
+ m_debuggerAgent->resume(&errorString); |
+} |
+ |
+void V8InspectorSessionImpl::stepOver() |
+{ |
+ ErrorString errorString; |
+ m_debuggerAgent->stepOver(&errorString); |
+} |
+ |
void V8InspectorSessionImpl::asyncTaskScheduled(const String16& taskName, void* task, bool recurring) |
{ |
m_debuggerAgent->asyncTaskScheduled(taskName, task, recurring); |