Chromium Code Reviews| Index: Source/core/inspector/InspectorDebuggerAgent.cpp |
| diff --git a/Source/core/inspector/InspectorDebuggerAgent.cpp b/Source/core/inspector/InspectorDebuggerAgent.cpp |
| index 0e1cd9d38380307b213f0feccb0d5c962f611651..2f48f20346e46364266a0505d9962d4f9e9640e2 100644 |
| --- a/Source/core/inspector/InspectorDebuggerAgent.cpp |
| +++ b/Source/core/inspector/InspectorDebuggerAgent.cpp |
| @@ -76,7 +76,7 @@ static const char skipAllPausesExpiresOnReload[] = "skipAllPausesExpiresOnReload |
| }; |
| -static const int numberOfStepsBeforeStepOut = 20; |
| +static const int maxSkipStepInCount = 20; |
| const char InspectorDebuggerAgent::backtraceObjectGroup[] = "backtrace"; |
| @@ -105,8 +105,9 @@ InspectorDebuggerAgent::InspectorDebuggerAgent(InjectedScriptManager* injectedSc |
| , m_pausedScriptState(nullptr) |
| , m_javaScriptPauseScheduled(false) |
| , m_debuggerStepScheduled(false) |
| + , m_pauseOnNextStatementScheduled(false) |
| , m_listener(0) |
| - , m_skipStepInCount(numberOfStepsBeforeStepOut) |
| + , m_skippedStepInCount(0) |
| , m_skipAllPauses(false) |
| { |
| } |
| @@ -529,14 +530,29 @@ ScriptDebugListener::SkipPauseRequest InspectorDebuggerAgent::shouldSkipStepPaus |
| RefPtr<JavaScriptCallFrame> topFrame = scriptDebugServer().topCallFrameNoScopes(); |
| String scriptUrl = scriptURL(topFrame.get()); |
| - if (!scriptUrl.isEmpty() && m_cachedSkipStackRegExp->match(scriptUrl) != -1) { |
| - if (m_skipStepInCount > 0) { |
| - --m_skipStepInCount; |
| - return ScriptDebugListener::StepInto; |
| + if (scriptUrl.isEmpty() || m_cachedSkipStackRegExp->match(scriptUrl) == -1) |
| + return ScriptDebugListener::NoSkip; |
| + |
| + if (m_skippedStepInCount == 0) { |
| + m_minFrameCountForSkip = scriptDebugServer().frameCount(); |
| + m_skippedStepInCount = 1; |
| + return ScriptDebugListener::StepInto; |
| + } |
| + |
| + if (m_skippedStepInCount < maxSkipStepInCount && topFrame->isAtReturn() && scriptDebugServer().frameCount() <= m_minFrameCountForSkip) |
| + m_skippedStepInCount = maxSkipStepInCount; |
|
yurys
2014/06/03 13:02:11
You could change if condition at line 545 instead:
|
| + |
| + if (m_skippedStepInCount >= maxSkipStepInCount) { |
| + if (m_pauseOnNextStatementScheduled) { |
| + m_pauseOnNextStatementScheduled = false; |
| + m_skippedStepInCount = 0; |
| + return ScriptDebugListener::Continue; |
| } |
| return ScriptDebugListener::StepOut; |
| } |
| - return ScriptDebugListener::NoSkip; |
| + |
| + ++m_skippedStepInCount; |
| + return ScriptDebugListener::StepInto; |
| } |
| PassRefPtr<TypeBuilder::Debugger::Location> InspectorDebuggerAgent::resolveBreakpoint(const String& breakpointId, const String& scriptId, const ScriptBreakpoint& breakpoint, BreakpointSource source) |
| @@ -629,20 +645,20 @@ void InspectorDebuggerAgent::getFunctionDetails(ErrorString* errorString, const |
| void InspectorDebuggerAgent::schedulePauseOnNextStatement(InspectorFrontend::Debugger::Reason::Enum breakReason, PassRefPtr<JSONObject> data) |
| { |
| - if (m_javaScriptPauseScheduled) |
| + if (m_javaScriptPauseScheduled || isPaused()) |
| return; |
| m_breakReason = breakReason; |
| m_breakAuxData = data; |
| - m_debuggerStepScheduled = true; |
| + m_pauseOnNextStatementScheduled = true; |
| scriptDebugServer().setPauseOnNextStatement(true); |
| } |
| void InspectorDebuggerAgent::cancelPauseOnNextStatement() |
| { |
| - if (m_javaScriptPauseScheduled) |
| + if (m_javaScriptPauseScheduled || isPaused()) |
| return; |
| clearBreakDetails(); |
| - m_debuggerStepScheduled = false; |
| + m_pauseOnNextStatementScheduled = false; |
| scriptDebugServer().setPauseOnNextStatement(false); |
| } |
| @@ -742,11 +758,10 @@ void InspectorDebuggerAgent::didDeliverMutationRecords() |
| void InspectorDebuggerAgent::pause(ErrorString*) |
| { |
| - if (m_javaScriptPauseScheduled) |
| + if (m_javaScriptPauseScheduled || isPaused()) |
| return; |
| clearBreakDetails(); |
| m_javaScriptPauseScheduled = true; |
| - m_debuggerStepScheduled = false; |
| scriptDebugServer().setPauseOnNextStatement(true); |
| } |
| @@ -1111,7 +1126,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) |
| + else if (m_debuggerStepScheduled || m_pauseOnNextStatementScheduled) |
| result = shouldSkipStepPause(); |
| else |
| result = ScriptDebugListener::NoSkip; |
| @@ -1123,8 +1138,6 @@ ScriptDebugListener::SkipPauseRequest InspectorDebuggerAgent::didPause(ScriptSta |
| m_pausedScriptState = scriptState; |
| m_currentCallStack = callFrames; |
| - m_skipStepInCount = numberOfStepsBeforeStepOut; |
| - |
| if (!exception.isEmpty()) { |
| InjectedScript injectedScript = m_injectedScriptManager->injectedScriptFor(scriptState); |
| if (!injectedScript.isEmpty()) { |
| @@ -1151,6 +1164,8 @@ ScriptDebugListener::SkipPauseRequest InspectorDebuggerAgent::didPause(ScriptSta |
| m_frontend->paused(currentCallFrames(), m_breakReason, m_breakAuxData, hitBreakpointIds, currentAsyncStackTrace()); |
| m_javaScriptPauseScheduled = false; |
| m_debuggerStepScheduled = false; |
| + m_pauseOnNextStatementScheduled = false; |
| + m_skippedStepInCount = 0; |
| if (!m_continueToLocationBreakpointId.isEmpty()) { |
| scriptDebugServer().removeBreakpoint(m_continueToLocationBreakpointId); |
| @@ -1181,6 +1196,7 @@ void InspectorDebuggerAgent::breakProgram(InspectorFrontend::Debugger::Reason::E |
| m_breakReason = breakReason; |
| m_breakAuxData = data; |
| m_debuggerStepScheduled = false; |
| + m_pauseOnNextStatementScheduled = false; |
| scriptDebugServer().breakProgram(); |
| } |
| @@ -1195,6 +1211,7 @@ void InspectorDebuggerAgent::clear() |
| clearBreakDetails(); |
| m_javaScriptPauseScheduled = false; |
| m_debuggerStepScheduled = false; |
| + m_pauseOnNextStatementScheduled = false; |
| ErrorString error; |
| setOverlayMessage(&error, 0); |
| } |