| Index: src/inspector/v8-debugger-agent-impl.cc | 
| diff --git a/src/inspector/v8-debugger-agent-impl.cc b/src/inspector/v8-debugger-agent-impl.cc | 
| index 8af7d5243418c7e559b1b5ce5d7fa2087d9a1217..7064ae95ee8b526833244781f3018efce3a8ac46 100644 | 
| --- a/src/inspector/v8-debugger-agent-impl.cc | 
| +++ b/src/inspector/v8-debugger-agent-impl.cc | 
| @@ -247,7 +247,7 @@ Response V8DebuggerAgentImpl::disable() { | 
| m_scripts.clear(); | 
| m_breakpointIdToDebuggerBreakpointIds.clear(); | 
| m_debugger->setAsyncCallStackDepth(this, 0); | 
| -  m_continueToLocationBreakpointId = String16(); | 
| +  clearContinueToLocation(); | 
| clearBreakDetails(); | 
| m_skipAllPauses = false; | 
| m_state->setBoolean(DebuggerAgentState::skipAllPauses, false); | 
| @@ -484,12 +484,11 @@ Response V8DebuggerAgentImpl::getPossibleBreakpoints( | 
| } | 
|  | 
| Response V8DebuggerAgentImpl::continueToLocation( | 
| -    std::unique_ptr<protocol::Debugger::Location> location) { | 
| +    std::unique_ptr<protocol::Debugger::Location> location, | 
| +    Maybe<String16> strategy) { | 
| if (!enabled()) return Response::Error(kDebuggerNotEnabled); | 
| -  if (!m_continueToLocationBreakpointId.isEmpty()) { | 
| -    m_debugger->removeBreakpoint(m_continueToLocationBreakpointId); | 
| -    m_continueToLocationBreakpointId = ""; | 
| -  } | 
| +  if (!isPaused()) return Response::Error(kDebuggerNotPaused); | 
| +  clearContinueToLocation(); | 
|  | 
| ScriptBreakpoint breakpoint(location->getScriptId(), | 
| location->getLineNumber(), | 
| @@ -497,10 +496,31 @@ Response V8DebuggerAgentImpl::continueToLocation( | 
|  | 
| m_continueToLocationBreakpointId = m_debugger->setBreakpoint( | 
| breakpoint, &breakpoint.line_number, &breakpoint.column_number); | 
| +  if (m_continueToLocationBreakpointId.isEmpty()) { | 
| +    return Response::Error("Location can't be resolved"); | 
| +  } | 
| +  m_continueToLocationStrategy = strategy.fromMaybe( | 
| +      protocol::Debugger::ContinueToLocation::StrategyEnum::Default); | 
| +  if (m_continueToLocationStrategy != | 
| +      protocol::Debugger::ContinueToLocation::StrategyEnum::Default) { | 
| +    m_continueToLocationStack = m_debugger->captureStackTrace(true); | 
| +    if (m_continueToLocationStack) { | 
| +      m_continueToLocationStrategy = | 
| +          protocol::Debugger::ContinueToLocation::StrategyEnum::Default; | 
| +    } | 
| +  } | 
| // TODO(kozyatinskiy): Return actual line and column number. | 
| return resume(); | 
| } | 
|  | 
| +void V8DebuggerAgentImpl::clearContinueToLocation() { | 
| +  if (m_continueToLocationBreakpointId.isEmpty()) return; | 
| +  m_debugger->removeBreakpoint(m_continueToLocationBreakpointId); | 
| +  m_continueToLocationBreakpointId = String16(); | 
| +  m_continueToLocationStrategy = String16(); | 
| +  m_continueToLocationStack.reset(); | 
| +} | 
| + | 
| bool V8DebuggerAgentImpl::isFunctionBlackboxed(const String16& scriptId, | 
| const v8::debug::Location& start, | 
| const v8::debug::Location& end) { | 
| @@ -1144,6 +1164,23 @@ void V8DebuggerAgentImpl::didParseSource( | 
| } | 
| } | 
|  | 
| +bool V8DebuggerAgentImpl::shouldIgnoreContinueToLocation( | 
| +    const String16& breakpointId) { | 
| +  if (breakpointId != m_continueToLocationBreakpointId) return false; | 
| +  if (m_continueToLocationStrategy == | 
| +      protocol::Debugger::ContinueToLocation::StrategyEnum::Default) { | 
| +    return false; | 
| +  } | 
| +  std::unique_ptr<V8StackTraceImpl> currentStack = | 
| +      m_debugger->captureStackTrace(true); | 
| +  if (m_continueToLocationStrategy == | 
| +      protocol::Debugger::ContinueToLocation::StrategyEnum::InCurrentFrame) { | 
| +    return !m_continueToLocationStack->isEqualIgnoringTopFrame( | 
| +        currentStack.get()); | 
| +  } | 
| +  return false; | 
| +} | 
| + | 
| void V8DebuggerAgentImpl::didPause(int contextId, | 
| v8::Local<v8::Value> exception, | 
| const std::vector<String16>& hitBreakpoints, | 
| @@ -1234,10 +1271,7 @@ void V8DebuggerAgentImpl::didPause(int contextId, | 
| std::move(breakAuxData), std::move(hitBreakpointIds), | 
| currentAsyncStackTrace()); | 
|  | 
| -  if (!m_continueToLocationBreakpointId.isEmpty()) { | 
| -    m_debugger->removeBreakpoint(m_continueToLocationBreakpointId); | 
| -    m_continueToLocationBreakpointId = ""; | 
| -  } | 
| +  clearContinueToLocation(); | 
| } | 
|  | 
| void V8DebuggerAgentImpl::didContinue() { | 
|  |