Index: src/inspector/v8-debugger.cc |
diff --git a/src/inspector/v8-debugger.cc b/src/inspector/v8-debugger.cc |
index e5da610bf3aff704e46acf71486462c15214bc87..1c0f823cd79e2aa15f793b4e2d7b48174f46f69f 100644 |
--- a/src/inspector/v8-debugger.cc |
+++ b/src/inspector/v8-debugger.cc |
@@ -347,16 +347,13 @@ bool V8Debugger::canBreakProgram() { |
return !v8::debug::AllFramesOnStackAreBlackboxed(m_isolate); |
} |
-bool V8Debugger::breakProgram(int targetContextGroupId) { |
+void V8Debugger::breakProgram(int targetContextGroupId) { |
// Don't allow nested breaks. |
- if (isPaused()) return true; |
- if (!canBreakProgram()) return true; |
+ if (isPaused()) return; |
+ if (!canBreakProgram()) return; |
DCHECK(targetContextGroupId); |
m_targetContextGroupId = targetContextGroupId; |
v8::debug::BreakRightNow(m_isolate); |
- V8InspectorSessionImpl* session = |
- m_inspector->sessionForContextGroup(targetContextGroupId); |
- return session && session->debuggerAgent()->enabled(); |
} |
void V8Debugger::continueProgram(int targetContextGroupId) { |
@@ -600,10 +597,19 @@ void V8Debugger::handleProgramBreak(v8::Local<v8::Context> pausedContext, |
m_stepIntoAsyncCallback.reset(); |
} |
m_breakRequested = false; |
- V8InspectorSessionImpl* session = |
- m_inspector->sessionForContextGroup(contextGroupId); |
- if (!session || !session->debuggerAgent()->enabled()) return; |
- if (!m_scheduledOOMBreak && session->debuggerAgent()->skipAllPauses()) return; |
+ |
+ bool scheduledOOMBreak = m_scheduledOOMBreak; |
+ auto agentCheck = [&scheduledOOMBreak](V8DebuggerAgentImpl* agent) { |
+ return agent->enabled() && (scheduledOOMBreak || !agent->skipAllPauses()); |
+ }; |
+ |
+ bool hasAgents = false; |
+ m_inspector->forEachSession( |
+ contextGroupId, |
+ [&agentCheck, &hasAgents](V8InspectorSessionImpl* session) { |
+ if (agentCheck(session->debuggerAgent())) hasAgents = true; |
+ }); |
+ if (!hasAgents) return; |
std::vector<String16> breakpointIds; |
if (!hitBreakpointNumbers.IsEmpty()) { |
@@ -627,9 +633,17 @@ void V8Debugger::handleProgramBreak(v8::Local<v8::Context> pausedContext, |
m_pausedContext = pausedContext; |
m_executionState = executionState; |
m_pausedContextGroupId = contextGroupId; |
- session->debuggerAgent()->didPause( |
- InspectedContext::contextId(pausedContext), exception, breakpointIds, |
- isPromiseRejection, isUncaught, m_scheduledOOMBreak); |
+ |
+ m_inspector->forEachSession( |
+ contextGroupId, [&agentCheck, &pausedContext, &exception, &breakpointIds, |
+ &isPromiseRejection, &isUncaught, |
+ &scheduledOOMBreak](V8InspectorSessionImpl* session) { |
+ if (agentCheck(session->debuggerAgent())) { |
+ session->debuggerAgent()->didPause( |
+ InspectedContext::contextId(pausedContext), exception, |
+ breakpointIds, isPromiseRejection, isUncaught, scheduledOOMBreak); |
+ } |
+ }); |
{ |
v8::Context::Scope scope(pausedContext); |
v8::Local<v8::Context> context = m_isolate->GetCurrentContext(); |
@@ -638,10 +652,12 @@ void V8Debugger::handleProgramBreak(v8::Local<v8::Context> pausedContext, |
m_inspector->client()->runMessageLoopOnPause(contextGroupId); |
m_pausedContextGroupId = 0; |
} |
- // The agent may have been removed in the nested loop. |
- session = m_inspector->sessionForContextGroup(contextGroupId); |
- if (session && session->debuggerAgent()->enabled()) |
- session->debuggerAgent()->didContinue(); |
+ m_inspector->forEachSession(contextGroupId, |
+ [](V8InspectorSessionImpl* session) { |
+ if (session->debuggerAgent()->enabled()) |
+ session->debuggerAgent()->didContinue(); |
+ }); |
+ |
if (m_scheduledOOMBreak) m_isolate->RestoreOriginalHeapLimit(); |
m_scheduledOOMBreak = false; |
m_pausedContext.Clear(); |
@@ -662,16 +678,26 @@ void V8Debugger::ScriptCompiled(v8::Local<v8::debug::Script> script, |
bool has_compile_error) { |
int contextId; |
if (!script->ContextId().To(&contextId)) return; |
- V8InspectorSessionImpl* session = m_inspector->sessionForContextGroup( |
- m_inspector->contextGroupId(contextId)); |
- if (!session || !session->debuggerAgent()->enabled()) return; |
if (script->IsWasm()) { |
- m_wasmTranslation.AddScript(script.As<v8::debug::WasmScript>(), |
- session->debuggerAgent()); |
+ WasmTranslation* wasmTranslation = &m_wasmTranslation; |
+ m_inspector->forEachSession( |
+ m_inspector->contextGroupId(contextId), |
+ [&script, &wasmTranslation](V8InspectorSessionImpl* session) { |
+ if (!session->debuggerAgent()->enabled()) return; |
+ wasmTranslation->AddScript(script.As<v8::debug::WasmScript>(), |
+ session->debuggerAgent()); |
+ }); |
} else if (m_ignoreScriptParsedEventsCounter == 0) { |
- session->debuggerAgent()->didParseSource( |
- V8DebuggerScript::Create(m_isolate, script, inLiveEditScope), |
- !has_compile_error); |
+ v8::Isolate* isolate = m_isolate; |
+ m_inspector->forEachSession( |
+ m_inspector->contextGroupId(contextId), |
+ [&isolate, &script, |
+ &has_compile_error](V8InspectorSessionImpl* session) { |
+ if (!session->debuggerAgent()->enabled()) return; |
+ session->debuggerAgent()->didParseSource( |
+ V8DebuggerScript::Create(isolate, script, inLiveEditScope), |
+ !has_compile_error); |
+ }); |
} |
} |
@@ -704,11 +730,19 @@ bool V8Debugger::IsFunctionBlackboxed(v8::Local<v8::debug::Script> script, |
const v8::debug::Location& end) { |
int contextId; |
if (!script->ContextId().To(&contextId)) return false; |
- V8InspectorSessionImpl* session = m_inspector->sessionForContextGroup( |
- m_inspector->contextGroupId(contextId)); |
- if (!session || !session->debuggerAgent()->enabled()) return false; |
- return session->debuggerAgent()->isFunctionBlackboxed( |
- String16::fromInteger(script->Id()), start, end); |
+ bool hasAgents = false; |
+ bool allBlackboxed = true; |
+ String16 scriptId = String16::fromInteger(script->Id()); |
+ m_inspector->forEachSession( |
+ m_inspector->contextGroupId(contextId), |
+ [&hasAgents, &allBlackboxed, &scriptId, &start, |
+ &end](V8InspectorSessionImpl* session) { |
+ V8DebuggerAgentImpl* agent = session->debuggerAgent(); |
+ if (!agent->enabled()) return; |
+ hasAgents = true; |
+ allBlackboxed &= agent->isFunctionBlackboxed(scriptId, start, end); |
+ }); |
+ return hasAgents && allBlackboxed; |
} |
void V8Debugger::PromiseEventOccurred(v8::debug::PromiseDebugActionType type, |
@@ -1084,10 +1118,14 @@ std::unique_ptr<V8StackTraceImpl> V8Debugger::captureStackTrace( |
if (!contextGroupId) return nullptr; |
int stackSize = 1; |
- V8InspectorSessionImpl* session = |
- m_inspector->sessionForContextGroup(contextGroupId); |
- if (fullStack || (session && session->runtimeAgent()->enabled())) { |
+ if (fullStack) { |
stackSize = V8StackTraceImpl::maxCallStackSizeToCapture; |
+ } else { |
+ m_inspector->forEachSession( |
+ contextGroupId, [&stackSize](V8InspectorSessionImpl* session) { |
+ if (session->runtimeAgent()->enabled()) |
+ stackSize = V8StackTraceImpl::maxCallStackSizeToCapture; |
+ }); |
} |
return V8StackTraceImpl::capture(this, contextGroupId, stackSize); |
} |