| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "platform/v8_inspector/V8InspectorSessionImpl.h" | 5 #include "platform/v8_inspector/V8InspectorSessionImpl.h" |
| 6 | 6 |
| 7 #include "platform/inspector_protocol/Parser.h" |
| 7 #include "platform/v8_inspector/InjectedScript.h" | 8 #include "platform/v8_inspector/InjectedScript.h" |
| 8 #include "platform/v8_inspector/InspectedContext.h" | 9 #include "platform/v8_inspector/InspectedContext.h" |
| 9 #include "platform/v8_inspector/RemoteObjectId.h" | 10 #include "platform/v8_inspector/RemoteObjectId.h" |
| 10 #include "platform/v8_inspector/V8DebuggerAgentImpl.h" | 11 #include "platform/v8_inspector/V8DebuggerAgentImpl.h" |
| 11 #include "platform/v8_inspector/V8DebuggerImpl.h" | 12 #include "platform/v8_inspector/V8DebuggerImpl.h" |
| 12 #include "platform/v8_inspector/V8HeapProfilerAgentImpl.h" | 13 #include "platform/v8_inspector/V8HeapProfilerAgentImpl.h" |
| 13 #include "platform/v8_inspector/V8ProfilerAgentImpl.h" | 14 #include "platform/v8_inspector/V8ProfilerAgentImpl.h" |
| 14 #include "platform/v8_inspector/V8RuntimeAgentImpl.h" | 15 #include "platform/v8_inspector/V8RuntimeAgentImpl.h" |
| 15 #include "platform/v8_inspector/public/V8ContextInfo.h" | 16 #include "platform/v8_inspector/public/V8ContextInfo.h" |
| 16 #include "platform/v8_inspector/public/V8DebuggerClient.h" | 17 #include "platform/v8_inspector/public/V8DebuggerClient.h" |
| 17 | 18 |
| 18 namespace blink { | 19 namespace blink { |
| 19 | 20 |
| 20 const char V8InspectorSession::backtraceObjectGroup[] = "backtrace"; | 21 const char V8InspectorSession::backtraceObjectGroup[] = "backtrace"; |
| 21 | 22 |
| 22 PassOwnPtr<V8InspectorSessionImpl> V8InspectorSessionImpl::create(V8DebuggerImpl
* debugger, int contextGroupId) | 23 // static |
| 24 bool V8InspectorSession::isV8ProtocolMethod(const String16& method) |
| 23 { | 25 { |
| 24 return adoptPtr(new V8InspectorSessionImpl(debugger, contextGroupId)); | 26 return method.startWith("Debugger.") || method.startWith("HeapProfiler.") ||
method.startWith("Profiler.") || method.startWith("Runtime."); |
| 25 } | 27 } |
| 26 | 28 |
| 27 V8InspectorSessionImpl::V8InspectorSessionImpl(V8DebuggerImpl* debugger, int con
textGroupId) | 29 PassOwnPtr<V8InspectorSessionImpl> V8InspectorSessionImpl::create(V8DebuggerImpl
* debugger, int contextGroupId, V8InspectorSessionClient* client, const String16
* state) |
| 30 { |
| 31 return adoptPtr(new V8InspectorSessionImpl(debugger, contextGroupId, client,
state)); |
| 32 } |
| 33 |
| 34 V8InspectorSessionImpl::V8InspectorSessionImpl(V8DebuggerImpl* debugger, int con
textGroupId, V8InspectorSessionClient* client, const String16* savedState) |
| 28 : m_contextGroupId(contextGroupId) | 35 : m_contextGroupId(contextGroupId) |
| 29 , m_debugger(debugger) | 36 , m_debugger(debugger) |
| 30 , m_client(nullptr) | 37 , m_client(client) |
| 31 , m_customObjectFormatterEnabled(false) | 38 , m_customObjectFormatterEnabled(false) |
| 32 , m_instrumentationCounter(0) | 39 , m_instrumentationCounter(0) |
| 33 , m_runtimeAgent(adoptPtr(new V8RuntimeAgentImpl(this))) | 40 , m_frontend(adoptPtr(new protocol::Frontend(client))) |
| 34 , m_debuggerAgent(adoptPtr(new V8DebuggerAgentImpl(this))) | 41 , m_dispatcher(protocol::Dispatcher::create(client)) |
| 35 , m_heapProfilerAgent(adoptPtr(new V8HeapProfilerAgentImpl(this))) | 42 , m_state(nullptr) |
| 36 , m_profilerAgent(adoptPtr(new V8ProfilerAgentImpl(this))) | 43 , m_runtimeAgent(nullptr) |
| 44 , m_debuggerAgent(nullptr) |
| 45 , m_heapProfilerAgent(nullptr) |
| 46 , m_profilerAgent(nullptr) |
| 37 { | 47 { |
| 48 if (savedState) { |
| 49 OwnPtr<protocol::Value> state = protocol::parseJSON(*savedState); |
| 50 if (state) |
| 51 m_state = protocol::DictionaryValue::cast(std::move(state)); |
| 52 if (!m_state) |
| 53 m_state = protocol::DictionaryValue::create(); |
| 54 } else { |
| 55 m_state = protocol::DictionaryValue::create(); |
| 56 } |
| 57 |
| 58 m_runtimeAgent = adoptPtr(new V8RuntimeAgentImpl(this, protocol::Frontend::R
untime::from(m_frontend.get()), agentState("Runtime"))); |
| 59 m_dispatcher->registerAgent(static_cast<protocol::Backend::Runtime*>(m_runti
meAgent.get())); |
| 60 |
| 61 m_debuggerAgent = adoptPtr(new V8DebuggerAgentImpl(this, protocol::Frontend:
:Debugger::from(m_frontend.get()), agentState("Debugger"))); |
| 62 m_dispatcher->registerAgent(static_cast<protocol::Backend::Debugger*>(m_debu
ggerAgent.get())); |
| 63 |
| 64 m_heapProfilerAgent = adoptPtr(new V8HeapProfilerAgentImpl(this, protocol::F
rontend::HeapProfiler::from(m_frontend.get()), agentState("HeapProfiler"))); |
| 65 m_dispatcher->registerAgent(static_cast<protocol::Backend::HeapProfiler*>(m_
heapProfilerAgent.get())); |
| 66 |
| 67 m_profilerAgent = adoptPtr(new V8ProfilerAgentImpl(this, protocol::Frontend:
:Profiler::from(m_frontend.get()), agentState("Profiler"))); |
| 68 m_dispatcher->registerAgent(static_cast<protocol::Backend::Profiler*>(m_prof
ilerAgent.get())); |
| 69 |
| 70 if (savedState) { |
| 71 m_runtimeAgent->restore(); |
| 72 m_debuggerAgent->restore(); |
| 73 m_heapProfilerAgent->restore(); |
| 74 m_profilerAgent->restore(); |
| 75 } |
| 38 } | 76 } |
| 39 | 77 |
| 40 V8InspectorSessionImpl::~V8InspectorSessionImpl() | 78 V8InspectorSessionImpl::~V8InspectorSessionImpl() |
| 41 { | 79 { |
| 80 m_dispatcher->clearFrontend(); |
| 81 m_dispatcher.clear(); |
| 82 |
| 83 ErrorString errorString; |
| 84 m_profilerAgent->disable(&errorString); |
| 85 m_heapProfilerAgent->disable(&errorString); |
| 86 m_debuggerAgent->disable(&errorString); |
| 87 m_runtimeAgent->disable(&errorString); |
| 88 |
| 89 m_frontend.clear(); |
| 42 discardInjectedScripts(); | 90 discardInjectedScripts(); |
| 43 m_debugger->disconnect(this); | 91 m_debugger->disconnect(this); |
| 44 } | 92 } |
| 45 | 93 |
| 46 V8DebuggerAgent* V8InspectorSessionImpl::debuggerAgent() | 94 protocol::DictionaryValue* V8InspectorSessionImpl::agentState(const String16& na
me) |
| 47 { | 95 { |
| 48 return m_debuggerAgent.get(); | 96 protocol::DictionaryValue* state = m_state->getObject(name); |
| 49 } | 97 if (!state) { |
| 50 | 98 OwnPtr<protocol::DictionaryValue> newState = protocol::DictionaryValue::
create(); |
| 51 V8HeapProfilerAgent* V8InspectorSessionImpl::heapProfilerAgent() | 99 state = newState.get(); |
| 52 { | 100 m_state->setObject(name, std::move(newState)); |
| 53 return m_heapProfilerAgent.get(); | 101 } |
| 54 } | 102 return state; |
| 55 | |
| 56 V8ProfilerAgent* V8InspectorSessionImpl::profilerAgent() | |
| 57 { | |
| 58 return m_profilerAgent.get(); | |
| 59 } | |
| 60 | |
| 61 V8RuntimeAgent* V8InspectorSessionImpl::runtimeAgent() | |
| 62 { | |
| 63 return m_runtimeAgent.get(); | |
| 64 } | |
| 65 | |
| 66 void V8InspectorSessionImpl::setClient(V8InspectorSessionClient* client) | |
| 67 { | |
| 68 m_client = client; | |
| 69 } | 103 } |
| 70 | 104 |
| 71 void V8InspectorSessionImpl::reset() | 105 void V8InspectorSessionImpl::reset() |
| 72 { | 106 { |
| 73 m_debuggerAgent->reset(); | 107 m_debuggerAgent->reset(); |
| 74 m_runtimeAgent->reset(); | 108 m_runtimeAgent->reset(); |
| 75 discardInjectedScripts(); | 109 discardInjectedScripts(); |
| 76 } | 110 } |
| 77 | 111 |
| 78 void V8InspectorSessionImpl::discardInjectedScripts() | 112 void V8InspectorSessionImpl::discardInjectedScripts() |
| (...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 197 const V8DebuggerImpl::ContextByIdMap* contexts = m_debugger->contextGroup(m_
contextGroupId); | 231 const V8DebuggerImpl::ContextByIdMap* contexts = m_debugger->contextGroup(m_
contextGroupId); |
| 198 if (!contexts) | 232 if (!contexts) |
| 199 return; | 233 return; |
| 200 for (auto& idContext : *contexts) | 234 for (auto& idContext : *contexts) |
| 201 agent->reportExecutionContextCreated(idContext.second); | 235 agent->reportExecutionContextCreated(idContext.second); |
| 202 } | 236 } |
| 203 | 237 |
| 204 void V8InspectorSessionImpl::changeInstrumentationCounter(int delta) | 238 void V8InspectorSessionImpl::changeInstrumentationCounter(int delta) |
| 205 { | 239 { |
| 206 DCHECK_GE(m_instrumentationCounter + delta, 0); | 240 DCHECK_GE(m_instrumentationCounter + delta, 0); |
| 207 if (!m_instrumentationCounter && m_client) | 241 if (!m_instrumentationCounter) |
| 208 m_client->startInstrumenting(); | 242 m_client->startInstrumenting(); |
| 209 m_instrumentationCounter += delta; | 243 m_instrumentationCounter += delta; |
| 210 if (!m_instrumentationCounter && m_client) | 244 if (!m_instrumentationCounter) |
| 211 m_client->stopInstrumenting(); | 245 m_client->stopInstrumenting(); |
| 212 } | 246 } |
| 213 | 247 |
| 248 void V8InspectorSessionImpl::dispatchProtocolMessage(const String16& message) |
| 249 { |
| 250 m_dispatcher->dispatch(message); |
| 251 } |
| 252 |
| 253 String16 V8InspectorSessionImpl::stateJSON() |
| 254 { |
| 255 return m_state->toJSONString(); |
| 256 } |
| 257 |
| 214 void V8InspectorSessionImpl::addInspectedObject(PassOwnPtr<V8InspectorSession::I
nspectable> inspectable) | 258 void V8InspectorSessionImpl::addInspectedObject(PassOwnPtr<V8InspectorSession::I
nspectable> inspectable) |
| 215 { | 259 { |
| 216 m_inspectedObjects.prepend(std::move(inspectable)); | 260 m_inspectedObjects.prepend(std::move(inspectable)); |
| 217 while (m_inspectedObjects.size() > kInspectedObjectBufferSize) | 261 while (m_inspectedObjects.size() > kInspectedObjectBufferSize) |
| 218 m_inspectedObjects.removeLast(); | 262 m_inspectedObjects.removeLast(); |
| 219 } | 263 } |
| 220 | 264 |
| 221 V8InspectorSession::Inspectable* V8InspectorSessionImpl::inspectedObject(unsigne
d num) | 265 V8InspectorSession::Inspectable* V8InspectorSessionImpl::inspectedObject(unsigne
d num) |
| 222 { | 266 { |
| 223 if (num >= m_inspectedObjects.size()) | 267 if (num >= m_inspectedObjects.size()) |
| (...skipping 20 matching lines...) Expand all Loading... |
| 244 { | 288 { |
| 245 m_debuggerAgent->breakProgramOnException(breakReason, std::move(data)); | 289 m_debuggerAgent->breakProgramOnException(breakReason, std::move(data)); |
| 246 } | 290 } |
| 247 | 291 |
| 248 void V8InspectorSessionImpl::setSkipAllPauses(bool skip) | 292 void V8InspectorSessionImpl::setSkipAllPauses(bool skip) |
| 249 { | 293 { |
| 250 ErrorString errorString; | 294 ErrorString errorString; |
| 251 m_debuggerAgent->setSkipAllPauses(&errorString, skip); | 295 m_debuggerAgent->setSkipAllPauses(&errorString, skip); |
| 252 } | 296 } |
| 253 | 297 |
| 298 void V8InspectorSessionImpl::resume() |
| 299 { |
| 300 ErrorString errorString; |
| 301 m_debuggerAgent->resume(&errorString); |
| 302 } |
| 303 |
| 304 void V8InspectorSessionImpl::stepOver() |
| 305 { |
| 306 ErrorString errorString; |
| 307 m_debuggerAgent->stepOver(&errorString); |
| 308 } |
| 309 |
| 254 void V8InspectorSessionImpl::asyncTaskScheduled(const String16& taskName, void*
task, bool recurring) | 310 void V8InspectorSessionImpl::asyncTaskScheduled(const String16& taskName, void*
task, bool recurring) |
| 255 { | 311 { |
| 256 m_debuggerAgent->asyncTaskScheduled(taskName, task, recurring); | 312 m_debuggerAgent->asyncTaskScheduled(taskName, task, recurring); |
| 257 } | 313 } |
| 258 | 314 |
| 259 void V8InspectorSessionImpl::asyncTaskCanceled(void* task) | 315 void V8InspectorSessionImpl::asyncTaskCanceled(void* task) |
| 260 { | 316 { |
| 261 m_debuggerAgent->asyncTaskCanceled(task); | 317 m_debuggerAgent->asyncTaskCanceled(task); |
| 262 } | 318 } |
| 263 | 319 |
| 264 void V8InspectorSessionImpl::asyncTaskStarted(void* task) | 320 void V8InspectorSessionImpl::asyncTaskStarted(void* task) |
| 265 { | 321 { |
| 266 m_debuggerAgent->asyncTaskStarted(task); | 322 m_debuggerAgent->asyncTaskStarted(task); |
| 267 } | 323 } |
| 268 | 324 |
| 269 void V8InspectorSessionImpl::asyncTaskFinished(void* task) | 325 void V8InspectorSessionImpl::asyncTaskFinished(void* task) |
| 270 { | 326 { |
| 271 m_debuggerAgent->asyncTaskFinished(task); | 327 m_debuggerAgent->asyncTaskFinished(task); |
| 272 } | 328 } |
| 273 | 329 |
| 274 void V8InspectorSessionImpl::allAsyncTasksCanceled() | 330 void V8InspectorSessionImpl::allAsyncTasksCanceled() |
| 275 { | 331 { |
| 276 m_debuggerAgent->allAsyncTasksCanceled(); | 332 m_debuggerAgent->allAsyncTasksCanceled(); |
| 277 } | 333 } |
| 278 | 334 |
| 279 } // namespace blink | 335 } // namespace blink |
| OLD | NEW |