Index: src/inspector/v8-debugger.cc |
diff --git a/src/inspector/v8-debugger.cc b/src/inspector/v8-debugger.cc |
index 1749efcf25d287949f1731d062c39e1b5de92c7e..f4c3ca5813a05249ba56d1278fde1a9561ddee80 100644 |
--- a/src/inspector/v8-debugger.cc |
+++ b/src/inspector/v8-debugger.cc |
@@ -328,8 +328,14 @@ void V8Debugger::setPauseOnExceptionsState( |
m_pauseOnExceptionsState = pauseOnExceptionsState; |
} |
-void V8Debugger::setPauseOnNextStatement(bool pause) { |
+void V8Debugger::setPauseOnNextStatement(bool pause, int targetContextGroupId) { |
if (isPaused()) return; |
+ DCHECK(targetContextGroupId); |
+ if (!pause && m_targetContextGroupId && |
+ m_targetContextGroupId != targetContextGroupId) { |
+ return; |
+ } |
+ m_targetContextGroupId = targetContextGroupId; |
if (pause) |
v8::debug::DebugBreak(m_isolate); |
else |
@@ -354,23 +360,29 @@ void V8Debugger::continueProgram() { |
m_executionState.Clear(); |
} |
-void V8Debugger::stepIntoStatement() { |
+void V8Debugger::stepIntoStatement(int targetContextGroupId) { |
DCHECK(isPaused()); |
DCHECK(!m_executionState.IsEmpty()); |
+ DCHECK(targetContextGroupId); |
+ m_targetContextGroupId = targetContextGroupId; |
v8::debug::PrepareStep(m_isolate, v8::debug::StepIn); |
continueProgram(); |
} |
-void V8Debugger::stepOverStatement() { |
+void V8Debugger::stepOverStatement(int targetContextGroupId) { |
DCHECK(isPaused()); |
DCHECK(!m_executionState.IsEmpty()); |
+ DCHECK(targetContextGroupId); |
+ m_targetContextGroupId = targetContextGroupId; |
v8::debug::PrepareStep(m_isolate, v8::debug::StepNext); |
continueProgram(); |
} |
-void V8Debugger::stepOutOfFunction() { |
+void V8Debugger::stepOutOfFunction(int targetContextGroupId) { |
DCHECK(isPaused()); |
DCHECK(!m_executionState.IsEmpty()); |
+ DCHECK(targetContextGroupId); |
+ m_targetContextGroupId = targetContextGroupId; |
v8::debug::PrepareStep(m_isolate, v8::debug::StepOut); |
continueProgram(); |
} |
@@ -504,6 +516,12 @@ void V8Debugger::handleProgramBreak(v8::Local<v8::Context> pausedContext, |
// Don't allow nested breaks. |
if (isPaused()) return; |
+ int contextGroupId = m_inspector->contextGroupId(pausedContext); |
+ if (m_targetContextGroupId && contextGroupId != m_targetContextGroupId) { |
+ v8::debug::PrepareStep(m_isolate, v8::debug::StepOut); |
+ return; |
+ } |
+ m_targetContextGroupId = 0; |
V8DebuggerAgentImpl* agent = m_inspector->enabledDebuggerAgentForGroup( |
m_inspector->contextGroupId(pausedContext)); |
if (!agent || (agent->skipAllPauses() && !m_scheduledOOMBreak)) return; |
@@ -549,7 +567,10 @@ void V8Debugger::v8OOMCallback(void* data) { |
V8Debugger* thisPtr = static_cast<V8Debugger*>(data); |
thisPtr->m_isolate->IncreaseHeapLimitForDebugging(); |
thisPtr->m_scheduledOOMBreak = true; |
- thisPtr->setPauseOnNextStatement(true); |
+ v8::Local<v8::Context> context = thisPtr->m_isolate->GetEnteredContext(); |
+ DCHECK(!context.IsEmpty()); |
+ thisPtr->setPauseOnNextStatement( |
+ true, thisPtr->m_inspector->contextGroupId(context)); |
} |
void V8Debugger::ScriptCompiled(v8::Local<v8::debug::Script> script, |
@@ -660,6 +681,7 @@ void V8Debugger::handleAsyncTaskStepping(v8::Local<v8::Context> context, |
if (createdByUser && type == v8::debug::kDebugPromiseCreated) { |
if (agent->shouldBreakInScheduledAsyncTask()) { |
m_taskWithScheduledBreak = task; |
+ v8::debug::ClearStepping(m_isolate); |
} |
return; |
} |