Index: Source/core/inspector/InspectorDebuggerAgent.cpp |
diff --git a/Source/core/inspector/InspectorDebuggerAgent.cpp b/Source/core/inspector/InspectorDebuggerAgent.cpp |
index 48f3cd49ababa13266d803017ac3031a2d7c6a25..3a08bb8526b03bf66a126d87cb32d11119c684f7 100644 |
--- a/Source/core/inspector/InspectorDebuggerAgent.cpp |
+++ b/Source/core/inspector/InspectorDebuggerAgent.cpp |
@@ -121,8 +121,8 @@ InspectorDebuggerAgent::InspectorDebuggerAgent(InjectedScriptManager* injectedSc |
, m_injectedScriptManager(injectedScriptManager) |
, m_frontend(0) |
, m_pausedScriptState(nullptr) |
+ , m_scheduledDebuggerStep(NoStep) |
, m_javaScriptPauseScheduled(false) |
- , m_debuggerStepScheduled(false) |
, m_steppingFromFramework(false) |
, m_pausingOnNativeEvent(false) |
, m_listener(nullptr) |
@@ -719,7 +719,7 @@ void InspectorDebuggerAgent::getCollectionEntries(ErrorString* errorString, cons |
void InspectorDebuggerAgent::schedulePauseOnNextStatement(InspectorFrontend::Debugger::Reason::Enum breakReason, PassRefPtr<JSONObject> data) |
{ |
- if (m_javaScriptPauseScheduled || isPaused()) |
+ if (m_scheduledDebuggerStep == StepInto || m_javaScriptPauseScheduled || isPaused()) |
return; |
m_breakReason = breakReason; |
m_breakAuxData = data; |
@@ -727,6 +727,16 @@ void InspectorDebuggerAgent::schedulePauseOnNextStatement(InspectorFrontend::Deb |
scriptDebugServer().setPauseOnNextStatement(true); |
} |
+void InspectorDebuggerAgent::schedulePauseOnNextStatementIfSteppingInto() |
+{ |
+ if (m_scheduledDebuggerStep != StepInto || m_javaScriptPauseScheduled || isPaused()) |
+ return; |
+ clearBreakDetails(); |
+ m_pausingOnNativeEvent = false; |
+ m_skippedStepInCount = 0; |
+ scriptDebugServer().setPauseOnNextStatement(true); |
+} |
+ |
void InspectorDebuggerAgent::cancelPauseOnNextStatement() |
{ |
if (m_javaScriptPauseScheduled || isPaused()) |
@@ -959,7 +969,7 @@ void InspectorDebuggerAgent::resume(ErrorString* errorString) |
{ |
if (!assertPaused(errorString)) |
return; |
- m_debuggerStepScheduled = false; |
+ m_scheduledDebuggerStep = NoStep; |
m_steppingFromFramework = false; |
m_injectedScriptManager->releaseObjectGroup(InspectorDebuggerAgent::backtraceObjectGroup); |
scriptDebugServer().continueProgram(); |
@@ -969,7 +979,7 @@ void InspectorDebuggerAgent::stepOver(ErrorString* errorString) |
{ |
if (!assertPaused(errorString)) |
return; |
- m_debuggerStepScheduled = true; |
+ m_scheduledDebuggerStep = StepOver; |
m_steppingFromFramework = isTopCallFrameInFramework(); |
m_injectedScriptManager->releaseObjectGroup(InspectorDebuggerAgent::backtraceObjectGroup); |
scriptDebugServer().stepOverStatement(); |
@@ -979,19 +989,17 @@ void InspectorDebuggerAgent::stepInto(ErrorString* errorString) |
{ |
if (!assertPaused(errorString)) |
return; |
- m_debuggerStepScheduled = true; |
+ m_scheduledDebuggerStep = StepInto; |
m_steppingFromFramework = isTopCallFrameInFramework(); |
m_injectedScriptManager->releaseObjectGroup(InspectorDebuggerAgent::backtraceObjectGroup); |
scriptDebugServer().stepIntoStatement(); |
- if (m_listener) |
- m_listener->stepInto(); |
} |
void InspectorDebuggerAgent::stepOut(ErrorString* errorString) |
{ |
if (!assertPaused(errorString)) |
return; |
- m_debuggerStepScheduled = true; |
+ m_scheduledDebuggerStep = StepOut; |
m_steppingFromFramework = isTopCallFrameInFramework(); |
m_injectedScriptManager->releaseObjectGroup(InspectorDebuggerAgent::backtraceObjectGroup); |
scriptDebugServer().stepOutOfFunction(); |
@@ -1234,6 +1242,19 @@ void InspectorDebuggerAgent::scriptExecutionBlockedByCSP(const String& directive |
} |
} |
+void InspectorDebuggerAgent::willCallFunction(ExecutionContext*, int scriptId, const String&, int) |
+{ |
+ // Skip unknown scripts (i.e. InjectedScript). |
+ if (!m_scripts.contains(String::number(scriptId))) |
+ return; |
+ schedulePauseOnNextStatementIfSteppingInto(); |
+} |
+ |
+void InspectorDebuggerAgent::willEvaluateScript(LocalFrame*, const String&, int) |
+{ |
+ schedulePauseOnNextStatementIfSteppingInto(); |
+} |
+ |
PassRefPtr<Array<CallFrame> > InspectorDebuggerAgent::currentCallFrames() |
{ |
if (!m_pausedScriptState || m_currentCallStack.isEmpty()) |
@@ -1400,7 +1421,7 @@ ScriptDebugListener::SkipPauseRequest InspectorDebuggerAgent::didPause(ScriptSta |
result = ScriptDebugListener::NoSkip; // Don't skip explicit breakpoints even if set in frameworks. |
else if (!exception.isEmpty()) |
result = shouldSkipExceptionPause(); |
- else if (m_debuggerStepScheduled || m_pausingOnNativeEvent) |
+ else if (m_scheduledDebuggerStep != NoStep || m_pausingOnNativeEvent) |
result = shouldSkipStepPause(); |
else |
result = ScriptDebugListener::NoSkip; |
@@ -1436,8 +1457,8 @@ ScriptDebugListener::SkipPauseRequest InspectorDebuggerAgent::didPause(ScriptSta |
} |
m_frontend->paused(currentCallFrames(), m_breakReason, m_breakAuxData, hitBreakpointIds, currentAsyncStackTrace()); |
+ m_scheduledDebuggerStep = NoStep; |
m_javaScriptPauseScheduled = false; |
- m_debuggerStepScheduled = false; |
m_steppingFromFramework = false; |
m_pausingOnNativeEvent = false; |
m_skippedStepInCount = 0; |
@@ -1446,8 +1467,6 @@ ScriptDebugListener::SkipPauseRequest InspectorDebuggerAgent::didPause(ScriptSta |
scriptDebugServer().removeBreakpoint(m_continueToLocationBreakpointId); |
m_continueToLocationBreakpointId = ""; |
} |
- if (m_listener) |
- m_listener->didPause(); |
return result; |
} |
@@ -1470,7 +1489,7 @@ void InspectorDebuggerAgent::breakProgram(InspectorFrontend::Debugger::Reason::E |
return; |
m_breakReason = breakReason; |
m_breakAuxData = data; |
- m_debuggerStepScheduled = false; |
+ m_scheduledDebuggerStep = NoStep; |
m_steppingFromFramework = false; |
m_pausingOnNativeEvent = false; |
scriptDebugServer().breakProgram(); |
@@ -1486,8 +1505,8 @@ void InspectorDebuggerAgent::clear() |
promiseTracker().clear(); |
m_continueToLocationBreakpointId = String(); |
clearBreakDetails(); |
+ m_scheduledDebuggerStep = NoStep; |
m_javaScriptPauseScheduled = false; |
- m_debuggerStepScheduled = false; |
m_steppingFromFramework = false; |
m_pausingOnNativeEvent = false; |
ErrorString error; |
@@ -1523,6 +1542,7 @@ void InspectorDebuggerAgent::removeBreakpoint(const String& scriptId, int lineNu |
void InspectorDebuggerAgent::reset() |
{ |
+ m_scheduledDebuggerStep = NoStep; |
m_scripts.clear(); |
m_breakpointIdToDebugServerBreakpointIds.clear(); |
asyncCallStackTracker().clear(); |