| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (c) 2010-2011 Google Inc. All rights reserved. | 2 * Copyright (c) 2010-2011 Google Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
| 6 * met: | 6 * met: |
| 7 * | 7 * |
| 8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 47 V8InspectorClient* client) { | 47 V8InspectorClient* client) { |
| 48 return std::unique_ptr<V8Inspector>(new V8InspectorImpl(isolate, client)); | 48 return std::unique_ptr<V8Inspector>(new V8InspectorImpl(isolate, client)); |
| 49 } | 49 } |
| 50 | 50 |
| 51 V8InspectorImpl::V8InspectorImpl(v8::Isolate* isolate, | 51 V8InspectorImpl::V8InspectorImpl(v8::Isolate* isolate, |
| 52 V8InspectorClient* client) | 52 V8InspectorClient* client) |
| 53 : m_isolate(isolate), | 53 : m_isolate(isolate), |
| 54 m_client(client), | 54 m_client(client), |
| 55 m_debugger(new V8Debugger(isolate, this)), | 55 m_debugger(new V8Debugger(isolate, this)), |
| 56 m_capturingStackTracesCount(0), | 56 m_capturingStackTracesCount(0), |
| 57 m_lastExceptionId(0) {} | 57 m_lastExceptionId(0), |
| 58 m_lastContextId(0) {} |
| 58 | 59 |
| 59 V8InspectorImpl::~V8InspectorImpl() {} | 60 V8InspectorImpl::~V8InspectorImpl() {} |
| 60 | 61 |
| 62 int V8InspectorImpl::contextGroupId(v8::Local<v8::Context> context) { |
| 63 return contextGroupId(InspectedContext::contextId(context)); |
| 64 } |
| 65 |
| 66 int V8InspectorImpl::contextGroupId(int contextId) { |
| 67 protocol::HashMap<int, int>::iterator it = |
| 68 m_contextIdToGroupIdMap.find(contextId); |
| 69 return it != m_contextIdToGroupIdMap.end() ? it->second : 0; |
| 70 } |
| 71 |
| 61 V8DebuggerAgentImpl* V8InspectorImpl::enabledDebuggerAgentForGroup( | 72 V8DebuggerAgentImpl* V8InspectorImpl::enabledDebuggerAgentForGroup( |
| 62 int contextGroupId) { | 73 int contextGroupId) { |
| 63 V8InspectorSessionImpl* session = sessionForContextGroup(contextGroupId); | 74 V8InspectorSessionImpl* session = sessionForContextGroup(contextGroupId); |
| 64 V8DebuggerAgentImpl* agent = session ? session->debuggerAgent() : nullptr; | 75 V8DebuggerAgentImpl* agent = session ? session->debuggerAgent() : nullptr; |
| 65 return agent && agent->enabled() ? agent : nullptr; | 76 return agent && agent->enabled() ? agent : nullptr; |
| 66 } | 77 } |
| 67 | 78 |
| 68 V8RuntimeAgentImpl* V8InspectorImpl::enabledRuntimeAgentForGroup( | 79 V8RuntimeAgentImpl* V8InspectorImpl::enabledRuntimeAgentForGroup( |
| 69 int contextGroupId) { | 80 int contextGroupId) { |
| 70 V8InspectorSessionImpl* session = sessionForContextGroup(contextGroupId); | 81 V8InspectorSessionImpl* session = sessionForContextGroup(contextGroupId); |
| 71 V8RuntimeAgentImpl* agent = session ? session->runtimeAgent() : nullptr; | 82 V8RuntimeAgentImpl* agent = session ? session->runtimeAgent() : nullptr; |
| 72 return agent && agent->enabled() ? agent : nullptr; | 83 return agent && agent->enabled() ? agent : nullptr; |
| 73 } | 84 } |
| 74 | 85 |
| 75 V8ProfilerAgentImpl* V8InspectorImpl::enabledProfilerAgentForGroup( | 86 V8ProfilerAgentImpl* V8InspectorImpl::enabledProfilerAgentForGroup( |
| 76 int contextGroupId) { | 87 int contextGroupId) { |
| 77 V8InspectorSessionImpl* session = sessionForContextGroup(contextGroupId); | 88 V8InspectorSessionImpl* session = sessionForContextGroup(contextGroupId); |
| 78 V8ProfilerAgentImpl* agent = session ? session->profilerAgent() : nullptr; | 89 V8ProfilerAgentImpl* agent = session ? session->profilerAgent() : nullptr; |
| 79 return agent && agent->enabled() ? agent : nullptr; | 90 return agent && agent->enabled() ? agent : nullptr; |
| 80 } | 91 } |
| 81 | 92 |
| 82 v8::MaybeLocal<v8::Value> V8InspectorImpl::runCompiledScript( | 93 v8::MaybeLocal<v8::Value> V8InspectorImpl::runCompiledScript( |
| 83 v8::Local<v8::Context> context, v8::Local<v8::Script> script) { | 94 v8::Local<v8::Context> context, v8::Local<v8::Script> script) { |
| 84 v8::MicrotasksScope microtasksScope(m_isolate, | 95 v8::MicrotasksScope microtasksScope(m_isolate, |
| 85 v8::MicrotasksScope::kRunMicrotasks); | 96 v8::MicrotasksScope::kRunMicrotasks); |
| 86 int groupId = V8Debugger::getGroupId(context); | 97 int groupId = contextGroupId(context); |
| 87 if (V8DebuggerAgentImpl* agent = enabledDebuggerAgentForGroup(groupId)) | 98 if (V8DebuggerAgentImpl* agent = enabledDebuggerAgentForGroup(groupId)) |
| 88 agent->willExecuteScript(script->GetUnboundScript()->GetId()); | 99 agent->willExecuteScript(script->GetUnboundScript()->GetId()); |
| 89 v8::MaybeLocal<v8::Value> result = script->Run(context); | 100 v8::MaybeLocal<v8::Value> result = script->Run(context); |
| 90 // Get agent from the map again, since it could have detached during script | 101 // Get agent from the map again, since it could have detached during script |
| 91 // execution. | 102 // execution. |
| 92 if (V8DebuggerAgentImpl* agent = enabledDebuggerAgentForGroup(groupId)) | 103 if (V8DebuggerAgentImpl* agent = enabledDebuggerAgentForGroup(groupId)) |
| 93 agent->didExecuteScript(); | 104 agent->didExecuteScript(); |
| 94 return result; | 105 return result; |
| 95 } | 106 } |
| 96 | 107 |
| 97 v8::MaybeLocal<v8::Value> V8InspectorImpl::callFunction( | 108 v8::MaybeLocal<v8::Value> V8InspectorImpl::callFunction( |
| 98 v8::Local<v8::Function> function, v8::Local<v8::Context> context, | 109 v8::Local<v8::Function> function, v8::Local<v8::Context> context, |
| 99 v8::Local<v8::Value> receiver, int argc, v8::Local<v8::Value> info[]) { | 110 v8::Local<v8::Value> receiver, int argc, v8::Local<v8::Value> info[]) { |
| 100 return callFunction(function, context, receiver, argc, info, | 111 return callFunction(function, context, receiver, argc, info, |
| 101 v8::MicrotasksScope::kRunMicrotasks); | 112 v8::MicrotasksScope::kRunMicrotasks); |
| 102 } | 113 } |
| 103 | 114 |
| 104 v8::MaybeLocal<v8::Value> V8InspectorImpl::callInternalFunction( | 115 v8::MaybeLocal<v8::Value> V8InspectorImpl::callInternalFunction( |
| 105 v8::Local<v8::Function> function, v8::Local<v8::Context> context, | 116 v8::Local<v8::Function> function, v8::Local<v8::Context> context, |
| 106 v8::Local<v8::Value> receiver, int argc, v8::Local<v8::Value> info[]) { | 117 v8::Local<v8::Value> receiver, int argc, v8::Local<v8::Value> info[]) { |
| 107 return callFunction(function, context, receiver, argc, info, | 118 return callFunction(function, context, receiver, argc, info, |
| 108 v8::MicrotasksScope::kDoNotRunMicrotasks); | 119 v8::MicrotasksScope::kDoNotRunMicrotasks); |
| 109 } | 120 } |
| 110 | 121 |
| 111 v8::MaybeLocal<v8::Value> V8InspectorImpl::callFunction( | 122 v8::MaybeLocal<v8::Value> V8InspectorImpl::callFunction( |
| 112 v8::Local<v8::Function> function, v8::Local<v8::Context> context, | 123 v8::Local<v8::Function> function, v8::Local<v8::Context> context, |
| 113 v8::Local<v8::Value> receiver, int argc, v8::Local<v8::Value> info[], | 124 v8::Local<v8::Value> receiver, int argc, v8::Local<v8::Value> info[], |
| 114 v8::MicrotasksScope::Type runMicrotasks) { | 125 v8::MicrotasksScope::Type runMicrotasks) { |
| 115 v8::MicrotasksScope microtasksScope(m_isolate, runMicrotasks); | 126 v8::MicrotasksScope microtasksScope(m_isolate, runMicrotasks); |
| 116 int groupId = V8Debugger::getGroupId(context); | 127 int groupId = contextGroupId(context); |
| 117 if (V8DebuggerAgentImpl* agent = enabledDebuggerAgentForGroup(groupId)) | 128 if (V8DebuggerAgentImpl* agent = enabledDebuggerAgentForGroup(groupId)) |
| 118 agent->willExecuteScript(function->ScriptId()); | 129 agent->willExecuteScript(function->ScriptId()); |
| 119 v8::MaybeLocal<v8::Value> result = | 130 v8::MaybeLocal<v8::Value> result = |
| 120 function->Call(context, receiver, argc, info); | 131 function->Call(context, receiver, argc, info); |
| 121 // Get agent from the map again, since it could have detached during script | 132 // Get agent from the map again, since it could have detached during script |
| 122 // execution. | 133 // execution. |
| 123 if (V8DebuggerAgentImpl* agent = enabledDebuggerAgentForGroup(groupId)) | 134 if (V8DebuggerAgentImpl* agent = enabledDebuggerAgentForGroup(groupId)) |
| 124 agent->didExecuteScript(); | 135 agent->didExecuteScript(); |
| 125 return result; | 136 return result; |
| 126 } | 137 } |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 219 ContextsByGroupMap::const_iterator contextGroupIt = m_contexts.find(groupId); | 230 ContextsByGroupMap::const_iterator contextGroupIt = m_contexts.find(groupId); |
| 220 if (contextGroupIt == m_contexts.end()) return nullptr; | 231 if (contextGroupIt == m_contexts.end()) return nullptr; |
| 221 | 232 |
| 222 ContextByIdMap::iterator contextIt = contextGroupIt->second->find(contextId); | 233 ContextByIdMap::iterator contextIt = contextGroupIt->second->find(contextId); |
| 223 if (contextIt == contextGroupIt->second->end()) return nullptr; | 234 if (contextIt == contextGroupIt->second->end()) return nullptr; |
| 224 | 235 |
| 225 return contextIt->second.get(); | 236 return contextIt->second.get(); |
| 226 } | 237 } |
| 227 | 238 |
| 228 void V8InspectorImpl::contextCreated(const V8ContextInfo& info) { | 239 void V8InspectorImpl::contextCreated(const V8ContextInfo& info) { |
| 229 int contextId = m_debugger->markContext(info); | 240 int contextId = ++m_lastContextId; |
| 241 InspectedContext* context = new InspectedContext(this, info, contextId); |
| 242 m_contextIdToGroupIdMap[contextId] = info.contextGroupId; |
| 230 | 243 |
| 231 ContextsByGroupMap::iterator contextIt = m_contexts.find(info.contextGroupId); | 244 ContextsByGroupMap::iterator contextIt = m_contexts.find(info.contextGroupId); |
| 232 if (contextIt == m_contexts.end()) | 245 if (contextIt == m_contexts.end()) |
| 233 contextIt = m_contexts | 246 contextIt = m_contexts |
| 234 .insert(std::make_pair( | 247 .insert(std::make_pair( |
| 235 info.contextGroupId, | 248 info.contextGroupId, |
| 236 std::unique_ptr<ContextByIdMap>(new ContextByIdMap()))) | 249 std::unique_ptr<ContextByIdMap>(new ContextByIdMap()))) |
| 237 .first; | 250 .first; |
| 238 | |
| 239 const auto& contextById = contextIt->second; | 251 const auto& contextById = contextIt->second; |
| 240 | 252 |
| 241 DCHECK(contextById->find(contextId) == contextById->cend()); | 253 DCHECK(contextById->find(contextId) == contextById->cend()); |
| 242 InspectedContext* context = new InspectedContext(this, info, contextId); | |
| 243 (*contextById)[contextId].reset(context); | 254 (*contextById)[contextId].reset(context); |
| 244 SessionMap::iterator sessionIt = m_sessions.find(info.contextGroupId); | 255 SessionMap::iterator sessionIt = m_sessions.find(info.contextGroupId); |
| 245 if (sessionIt != m_sessions.end()) | 256 if (sessionIt != m_sessions.end()) |
| 246 sessionIt->second->runtimeAgent()->reportExecutionContextCreated(context); | 257 sessionIt->second->runtimeAgent()->reportExecutionContextCreated(context); |
| 247 } | 258 } |
| 248 | 259 |
| 249 void V8InspectorImpl::contextDestroyed(v8::Local<v8::Context> context) { | 260 void V8InspectorImpl::contextDestroyed(v8::Local<v8::Context> context) { |
| 250 int contextId = V8Debugger::contextId(context); | 261 int contextId = InspectedContext::contextId(context); |
| 251 int contextGroupId = V8Debugger::getGroupId(context); | 262 int groupId = contextGroupId(context); |
| 263 m_contextIdToGroupIdMap.erase(contextId); |
| 252 | 264 |
| 253 ConsoleStorageMap::iterator storageIt = | 265 ConsoleStorageMap::iterator storageIt = m_consoleStorageMap.find(groupId); |
| 254 m_consoleStorageMap.find(contextGroupId); | |
| 255 if (storageIt != m_consoleStorageMap.end()) | 266 if (storageIt != m_consoleStorageMap.end()) |
| 256 storageIt->second->contextDestroyed(contextId); | 267 storageIt->second->contextDestroyed(contextId); |
| 257 | 268 |
| 258 InspectedContext* inspectedContext = getContext(contextGroupId, contextId); | 269 InspectedContext* inspectedContext = getContext(groupId, contextId); |
| 259 if (!inspectedContext) return; | 270 if (!inspectedContext) return; |
| 260 | 271 |
| 261 SessionMap::iterator iter = m_sessions.find(contextGroupId); | 272 SessionMap::iterator iter = m_sessions.find(groupId); |
| 262 if (iter != m_sessions.end()) | 273 if (iter != m_sessions.end()) |
| 263 iter->second->runtimeAgent()->reportExecutionContextDestroyed( | 274 iter->second->runtimeAgent()->reportExecutionContextDestroyed( |
| 264 inspectedContext); | 275 inspectedContext); |
| 265 discardInspectedContext(contextGroupId, contextId); | 276 discardInspectedContext(groupId, contextId); |
| 266 } | 277 } |
| 267 | 278 |
| 268 void V8InspectorImpl::resetContextGroup(int contextGroupId) { | 279 void V8InspectorImpl::resetContextGroup(int contextGroupId) { |
| 269 m_consoleStorageMap.erase(contextGroupId); | 280 m_consoleStorageMap.erase(contextGroupId); |
| 270 m_muteExceptionsMap.erase(contextGroupId); | 281 m_muteExceptionsMap.erase(contextGroupId); |
| 271 SessionMap::iterator session = m_sessions.find(contextGroupId); | 282 SessionMap::iterator session = m_sessions.find(contextGroupId); |
| 272 if (session != m_sessions.end()) session->second->reset(); | 283 if (session != m_sessions.end()) session->second->reset(); |
| 273 m_contexts.erase(contextGroupId); | 284 m_contexts.erase(contextGroupId); |
| 274 m_debugger->wasmTranslation()->Clear(); | 285 m_debugger->wasmTranslation()->Clear(); |
| 275 } | 286 } |
| 276 | 287 |
| 277 void V8InspectorImpl::willExecuteScript(v8::Local<v8::Context> context, | 288 void V8InspectorImpl::willExecuteScript(v8::Local<v8::Context> context, |
| 278 int scriptId) { | 289 int scriptId) { |
| 279 if (V8DebuggerAgentImpl* agent = | 290 if (V8DebuggerAgentImpl* agent = |
| 280 enabledDebuggerAgentForGroup(V8Debugger::getGroupId(context))) | 291 enabledDebuggerAgentForGroup(contextGroupId(context))) { |
| 281 agent->willExecuteScript(scriptId); | 292 agent->willExecuteScript(scriptId); |
| 293 } |
| 282 } | 294 } |
| 283 | 295 |
| 284 void V8InspectorImpl::didExecuteScript(v8::Local<v8::Context> context) { | 296 void V8InspectorImpl::didExecuteScript(v8::Local<v8::Context> context) { |
| 285 if (V8DebuggerAgentImpl* agent = | 297 if (V8DebuggerAgentImpl* agent = |
| 286 enabledDebuggerAgentForGroup(V8Debugger::getGroupId(context))) | 298 enabledDebuggerAgentForGroup(contextGroupId(context))) { |
| 287 agent->didExecuteScript(); | 299 agent->didExecuteScript(); |
| 300 } |
| 288 } | 301 } |
| 289 | 302 |
| 290 void V8InspectorImpl::idleStarted() { | 303 void V8InspectorImpl::idleStarted() { |
| 291 for (auto it = m_sessions.begin(); it != m_sessions.end(); ++it) { | 304 for (auto it = m_sessions.begin(); it != m_sessions.end(); ++it) { |
| 292 if (it->second->profilerAgent()->idleStarted()) return; | 305 if (it->second->profilerAgent()->idleStarted()) return; |
| 293 } | 306 } |
| 294 } | 307 } |
| 295 | 308 |
| 296 void V8InspectorImpl::idleFinished() { | 309 void V8InspectorImpl::idleFinished() { |
| 297 for (auto it = m_sessions.begin(); it != m_sessions.end(); ++it) { | 310 for (auto it = m_sessions.begin(); it != m_sessions.end(); ++it) { |
| 298 if (it->second->profilerAgent()->idleFinished()) return; | 311 if (it->second->profilerAgent()->idleFinished()) return; |
| 299 } | 312 } |
| 300 } | 313 } |
| 301 | 314 |
| 302 unsigned V8InspectorImpl::exceptionThrown( | 315 unsigned V8InspectorImpl::exceptionThrown( |
| 303 v8::Local<v8::Context> context, const StringView& message, | 316 v8::Local<v8::Context> context, const StringView& message, |
| 304 v8::Local<v8::Value> exception, const StringView& detailedMessage, | 317 v8::Local<v8::Value> exception, const StringView& detailedMessage, |
| 305 const StringView& url, unsigned lineNumber, unsigned columnNumber, | 318 const StringView& url, unsigned lineNumber, unsigned columnNumber, |
| 306 std::unique_ptr<V8StackTrace> stackTrace, int scriptId) { | 319 std::unique_ptr<V8StackTrace> stackTrace, int scriptId) { |
| 307 int contextGroupId = V8Debugger::getGroupId(context); | 320 int groupId = contextGroupId(context); |
| 308 if (!contextGroupId || m_muteExceptionsMap[contextGroupId]) return 0; | 321 if (!groupId || m_muteExceptionsMap[groupId]) return 0; |
| 309 std::unique_ptr<V8StackTraceImpl> stackTraceImpl( | 322 std::unique_ptr<V8StackTraceImpl> stackTraceImpl( |
| 310 static_cast<V8StackTraceImpl*>(stackTrace.release())); | 323 static_cast<V8StackTraceImpl*>(stackTrace.release())); |
| 311 unsigned exceptionId = nextExceptionId(); | 324 unsigned exceptionId = nextExceptionId(); |
| 312 std::unique_ptr<V8ConsoleMessage> consoleMessage = | 325 std::unique_ptr<V8ConsoleMessage> consoleMessage = |
| 313 V8ConsoleMessage::createForException( | 326 V8ConsoleMessage::createForException( |
| 314 m_client->currentTimeMS(), toString16(detailedMessage), | 327 m_client->currentTimeMS(), toString16(detailedMessage), |
| 315 toString16(url), lineNumber, columnNumber, std::move(stackTraceImpl), | 328 toString16(url), lineNumber, columnNumber, std::move(stackTraceImpl), |
| 316 scriptId, m_isolate, toString16(message), | 329 scriptId, m_isolate, toString16(message), |
| 317 V8Debugger::contextId(context), exception, exceptionId); | 330 InspectedContext::contextId(context), exception, exceptionId); |
| 318 ensureConsoleMessageStorage(contextGroupId) | 331 ensureConsoleMessageStorage(groupId)->addMessage(std::move(consoleMessage)); |
| 319 ->addMessage(std::move(consoleMessage)); | |
| 320 return exceptionId; | 332 return exceptionId; |
| 321 } | 333 } |
| 322 | 334 |
| 323 void V8InspectorImpl::exceptionRevoked(v8::Local<v8::Context> context, | 335 void V8InspectorImpl::exceptionRevoked(v8::Local<v8::Context> context, |
| 324 unsigned exceptionId, | 336 unsigned exceptionId, |
| 325 const StringView& message) { | 337 const StringView& message) { |
| 326 int contextGroupId = V8Debugger::getGroupId(context); | 338 int groupId = contextGroupId(context); |
| 327 if (!contextGroupId) return; | 339 if (!groupId) return; |
| 328 | 340 |
| 329 std::unique_ptr<V8ConsoleMessage> consoleMessage = | 341 std::unique_ptr<V8ConsoleMessage> consoleMessage = |
| 330 V8ConsoleMessage::createForRevokedException( | 342 V8ConsoleMessage::createForRevokedException( |
| 331 m_client->currentTimeMS(), toString16(message), exceptionId); | 343 m_client->currentTimeMS(), toString16(message), exceptionId); |
| 332 ensureConsoleMessageStorage(contextGroupId) | 344 ensureConsoleMessageStorage(groupId)->addMessage(std::move(consoleMessage)); |
| 333 ->addMessage(std::move(consoleMessage)); | |
| 334 } | 345 } |
| 335 | 346 |
| 336 std::unique_ptr<V8StackTrace> V8InspectorImpl::captureStackTrace( | 347 std::unique_ptr<V8StackTrace> V8InspectorImpl::captureStackTrace( |
| 337 bool fullStack) { | 348 bool fullStack) { |
| 338 return m_debugger->captureStackTrace(fullStack); | 349 return m_debugger->captureStackTrace(fullStack); |
| 339 } | 350 } |
| 340 | 351 |
| 341 void V8InspectorImpl::asyncTaskScheduled(const StringView& taskName, void* task, | 352 void V8InspectorImpl::asyncTaskScheduled(const StringView& taskName, void* task, |
| 342 bool recurring) { | 353 bool recurring) { |
| 343 m_debugger->asyncTaskScheduled(taskName, task, recurring); | 354 m_debugger->asyncTaskScheduled(taskName, task, recurring); |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 379 } | 390 } |
| 380 | 391 |
| 381 V8InspectorSessionImpl* V8InspectorImpl::sessionForContextGroup( | 392 V8InspectorSessionImpl* V8InspectorImpl::sessionForContextGroup( |
| 382 int contextGroupId) { | 393 int contextGroupId) { |
| 383 if (!contextGroupId) return nullptr; | 394 if (!contextGroupId) return nullptr; |
| 384 SessionMap::iterator iter = m_sessions.find(contextGroupId); | 395 SessionMap::iterator iter = m_sessions.find(contextGroupId); |
| 385 return iter == m_sessions.end() ? nullptr : iter->second; | 396 return iter == m_sessions.end() ? nullptr : iter->second; |
| 386 } | 397 } |
| 387 | 398 |
| 388 } // namespace v8_inspector | 399 } // namespace v8_inspector |
| OLD | NEW |