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 94b7f9417757d4ce64a13540cf0ee05cd3f8a08c..adf9169d303ab9dca493c6e4c35eeb2162ec6be2 100644 |
--- a/src/inspector/v8-debugger-agent-impl.cc |
+++ b/src/inspector/v8-debugger-agent-impl.cc |
@@ -54,8 +54,11 @@ static const char skipAllPauses[] = "skipAllPauses"; |
} // namespace DebuggerAgentState |
-static const int maxSkipStepFrameCount = 128; |
-static const char backtraceObjectGroup[] = "backtrace"; |
+static const int kMaxSkipStepFrameCount = 128; |
+static const char kBacktraceObjectGroup[] = "backtrace"; |
+static const char kDebuggerNotEnabled[] = "Debugger agent is not enabled"; |
+static const char kDebuggerNotPaused[] = |
+ "Can only perform operation while paused."; |
static String16 breakpointIdSuffix( |
V8DebuggerAgentImpl::BreakpointSource source) { |
@@ -83,11 +86,6 @@ static bool positionComparator(const std::pair<int, int>& a, |
return a.second < b.second; |
} |
-static bool hasInternalError(ErrorString* errorString, bool hasError) { |
- if (hasError) *errorString = "Internal error"; |
- return hasError; |
-} |
- |
static std::unique_ptr<protocol::Debugger::Location> buildProtocolLocation( |
const String16& scriptId, int lineNumber, int columnNumber) { |
return protocol::Debugger::Location::create() |
@@ -122,13 +120,7 @@ V8DebuggerAgentImpl::V8DebuggerAgentImpl( |
V8DebuggerAgentImpl::~V8DebuggerAgentImpl() {} |
-bool V8DebuggerAgentImpl::checkEnabled(ErrorString* errorString) { |
- if (enabled()) return true; |
- *errorString = "Debugger agent is not enabled"; |
- return false; |
-} |
- |
-void V8DebuggerAgentImpl::enable() { |
+void V8DebuggerAgentImpl::enableImpl() { |
// m_inspector->addListener may result in reporting all parsed scripts to |
// the agent so it should already be in enabled state by then. |
m_enabled = true; |
@@ -147,19 +139,18 @@ void V8DebuggerAgentImpl::enable() { |
bool V8DebuggerAgentImpl::enabled() { return m_enabled; } |
-void V8DebuggerAgentImpl::enable(ErrorString* errorString) { |
- if (enabled()) return; |
+Response V8DebuggerAgentImpl::enable() { |
+ if (enabled()) return Response::OK(); |
- if (!m_inspector->client()->canExecuteScripts(m_session->contextGroupId())) { |
- *errorString = "Script execution is prohibited"; |
- return; |
- } |
+ if (!m_inspector->client()->canExecuteScripts(m_session->contextGroupId())) |
+ return Response::Error("Script execution is prohibited"); |
- enable(); |
+ enableImpl(); |
+ return Response::OK(); |
} |
-void V8DebuggerAgentImpl::disable(ErrorString*) { |
- if (!enabled()) return; |
+Response V8DebuggerAgentImpl::disable() { |
+ if (!enabled()) return Response::OK(); |
m_state->setObject(DebuggerAgentState::javaScriptBreakpoints, |
protocol::DictionaryValue::create()); |
@@ -190,6 +181,7 @@ void V8DebuggerAgentImpl::disable(ErrorString*) { |
m_state->remove(DebuggerAgentState::blackboxPattern); |
m_enabled = false; |
m_state->setBoolean(DebuggerAgentState::debuggerEnabled, false); |
+ return Response::OK(); |
} |
void V8DebuggerAgentImpl::restore() { |
@@ -199,7 +191,7 @@ void V8DebuggerAgentImpl::restore() { |
if (!m_inspector->client()->canExecuteScripts(m_session->contextGroupId())) |
return; |
- enable(); |
+ enableImpl(); |
int pauseState = v8::DebugInterface::NoBreakOnException; |
m_state->getInteger(DebuggerAgentState::pauseOnExceptionsState, &pauseState); |
@@ -216,20 +208,20 @@ void V8DebuggerAgentImpl::restore() { |
String16 blackboxPattern; |
if (m_state->getString(DebuggerAgentState::blackboxPattern, |
&blackboxPattern)) { |
- ErrorString error; |
- if (!setBlackboxPattern(&error, blackboxPattern)) UNREACHABLE(); |
+ setBlackboxPattern(blackboxPattern); |
} |
} |
-void V8DebuggerAgentImpl::setBreakpointsActive(ErrorString* errorString, |
- bool active) { |
- if (!checkEnabled(errorString)) return; |
+Response V8DebuggerAgentImpl::setBreakpointsActive(bool active) { |
+ if (!enabled()) return Response::Error(kDebuggerNotEnabled); |
m_debugger->setBreakpointsActivated(active); |
+ return Response::OK(); |
} |
-void V8DebuggerAgentImpl::setSkipAllPauses(ErrorString*, bool skip) { |
+Response V8DebuggerAgentImpl::setSkipAllPauses(bool skip) { |
m_skipAllPauses = skip; |
m_state->setBoolean(DebuggerAgentState::skipAllPauses, m_skipAllPauses); |
+ return Response::OK(); |
} |
static std::unique_ptr<protocol::DictionaryValue> |
@@ -255,27 +247,21 @@ static bool matches(V8InspectorImpl* inspector, const String16& url, |
return url == pattern; |
} |
-void V8DebuggerAgentImpl::setBreakpointByUrl( |
- ErrorString* errorString, int lineNumber, |
- const Maybe<String16>& optionalURL, const Maybe<String16>& optionalURLRegex, |
- const Maybe<int>& optionalColumnNumber, |
- const Maybe<String16>& optionalCondition, String16* outBreakpointId, |
+Response V8DebuggerAgentImpl::setBreakpointByUrl( |
+ int lineNumber, Maybe<String16> optionalURL, |
+ Maybe<String16> optionalURLRegex, Maybe<int> optionalColumnNumber, |
+ Maybe<String16> optionalCondition, String16* outBreakpointId, |
std::unique_ptr<protocol::Array<protocol::Debugger::Location>>* locations) { |
*locations = Array<protocol::Debugger::Location>::create(); |
- if (optionalURL.isJust() == optionalURLRegex.isJust()) { |
- *errorString = "Either url or urlRegex must be specified."; |
- return; |
- } |
+ if (optionalURL.isJust() == optionalURLRegex.isJust()) |
+ return Response::Error("Either url or urlRegex must be specified."); |
String16 url = optionalURL.isJust() ? optionalURL.fromJust() |
: optionalURLRegex.fromJust(); |
int columnNumber = 0; |
if (optionalColumnNumber.isJust()) { |
columnNumber = optionalColumnNumber.fromJust(); |
- if (columnNumber < 0) { |
- *errorString = "Incorrect column number"; |
- return; |
- } |
+ if (columnNumber < 0) return Response::Error("Incorrect column number"); |
} |
String16 condition = optionalCondition.fromMaybe(""); |
bool isRegex = optionalURLRegex.isJust(); |
@@ -292,10 +278,8 @@ void V8DebuggerAgentImpl::setBreakpointByUrl( |
m_state->setObject(DebuggerAgentState::javaScriptBreakpoints, |
std::move(newValue)); |
} |
- if (breakpointsCookie->get(breakpointId)) { |
- *errorString = "Breakpoint at specified location already exists."; |
- return; |
- } |
+ if (breakpointsCookie->get(breakpointId)) |
+ return Response::Error("Breakpoint at specified location already exists."); |
breakpointsCookie->setObject( |
breakpointId, buildObjectForBreakpointCookie( |
@@ -311,30 +295,16 @@ void V8DebuggerAgentImpl::setBreakpointByUrl( |
} |
*outBreakpointId = breakpointId; |
+ return Response::OK(); |
} |
-static bool parseLocation( |
- ErrorString* errorString, |
- std::unique_ptr<protocol::Debugger::Location> location, String16* scriptId, |
- int* lineNumber, int* columnNumber) { |
- *scriptId = location->getScriptId(); |
- *lineNumber = location->getLineNumber(); |
- *columnNumber = location->getColumnNumber(0); |
- return true; |
-} |
- |
-void V8DebuggerAgentImpl::setBreakpoint( |
- ErrorString* errorString, |
+Response V8DebuggerAgentImpl::setBreakpoint( |
std::unique_ptr<protocol::Debugger::Location> location, |
- const Maybe<String16>& optionalCondition, String16* outBreakpointId, |
+ Maybe<String16> optionalCondition, String16* outBreakpointId, |
std::unique_ptr<protocol::Debugger::Location>* actualLocation) { |
- String16 scriptId; |
- int lineNumber; |
- int columnNumber; |
- |
- if (!parseLocation(errorString, std::move(location), &scriptId, &lineNumber, |
- &columnNumber)) |
- return; |
+ String16 scriptId = location->getScriptId(); |
+ int lineNumber = location->getLineNumber(); |
+ int columnNumber = location->getColumnNumber(0); |
String16 condition = optionalCondition.fromMaybe(""); |
@@ -342,28 +312,26 @@ void V8DebuggerAgentImpl::setBreakpoint( |
scriptId, lineNumber, columnNumber, UserBreakpointSource); |
if (m_breakpointIdToDebuggerBreakpointIds.find(breakpointId) != |
m_breakpointIdToDebuggerBreakpointIds.end()) { |
- *errorString = "Breakpoint at specified location already exists."; |
- return; |
+ return Response::Error("Breakpoint at specified location already exists."); |
} |
ScriptBreakpoint breakpoint(lineNumber, columnNumber, condition); |
*actualLocation = resolveBreakpoint(breakpointId, scriptId, breakpoint, |
UserBreakpointSource); |
- if (*actualLocation) |
- *outBreakpointId = breakpointId; |
- else |
- *errorString = "Could not resolve breakpoint"; |
+ if (!*actualLocation) return Response::Error("Could not resolve breakpoint"); |
+ *outBreakpointId = breakpointId; |
+ return Response::OK(); |
} |
-void V8DebuggerAgentImpl::removeBreakpoint(ErrorString* errorString, |
- const String16& breakpointId) { |
- if (!checkEnabled(errorString)) return; |
+Response V8DebuggerAgentImpl::removeBreakpoint(const String16& breakpointId) { |
+ if (!enabled()) return Response::Error(kDebuggerNotEnabled); |
protocol::DictionaryValue* breakpointsCookie = |
m_state->getObject(DebuggerAgentState::javaScriptBreakpoints); |
if (breakpointsCookie) breakpointsCookie->remove(breakpointId); |
- removeBreakpoint(breakpointId); |
+ removeBreakpointImpl(breakpointId); |
+ return Response::OK(); |
} |
-void V8DebuggerAgentImpl::removeBreakpoint(const String16& breakpointId) { |
+void V8DebuggerAgentImpl::removeBreakpointImpl(const String16& breakpointId) { |
DCHECK(enabled()); |
BreakpointIdToDebuggerBreakpointIdsMap::iterator |
debuggerBreakpointIdsIterator = |
@@ -381,27 +349,22 @@ void V8DebuggerAgentImpl::removeBreakpoint(const String16& breakpointId) { |
m_breakpointIdToDebuggerBreakpointIds.erase(breakpointId); |
} |
-void V8DebuggerAgentImpl::continueToLocation( |
- ErrorString* errorString, |
+Response V8DebuggerAgentImpl::continueToLocation( |
std::unique_ptr<protocol::Debugger::Location> location) { |
- if (!checkEnabled(errorString)) return; |
+ if (!enabled()) return Response::Error(kDebuggerNotEnabled); |
if (!m_continueToLocationBreakpointId.isEmpty()) { |
m_debugger->removeBreakpoint(m_continueToLocationBreakpointId); |
m_continueToLocationBreakpointId = ""; |
} |
- String16 scriptId; |
- int lineNumber; |
- int columnNumber; |
- |
- if (!parseLocation(errorString, std::move(location), &scriptId, &lineNumber, |
- &columnNumber)) |
- return; |
+ String16 scriptId = location->getScriptId(); |
+ int lineNumber = location->getLineNumber(); |
+ int columnNumber = location->getColumnNumber(0); |
ScriptBreakpoint breakpoint(lineNumber, columnNumber, ""); |
m_continueToLocationBreakpointId = m_debugger->setBreakpoint( |
scriptId, breakpoint, &lineNumber, &columnNumber); |
- resume(errorString); |
+ return resume(); |
} |
bool V8DebuggerAgentImpl::isCurrentCallStackEmptyOrBlackboxed() { |
@@ -472,7 +435,7 @@ V8DebuggerAgentImpl::SkipPauseRequest V8DebuggerAgentImpl::shouldSkipStepPause( |
if (!isCallFrameWithUnknownScriptOrBlackboxed(topCallFrame)) |
return RequestNoSkip; |
- if (m_skippedStepFrameCount >= maxSkipStepFrameCount) return RequestStepOut; |
+ if (m_skippedStepFrameCount >= kMaxSkipStepFrameCount) return RequestStepOut; |
if (!m_skippedStepFrameCount) m_recursionLevelForStepFrame = 1; |
@@ -510,17 +473,14 @@ V8DebuggerAgentImpl::resolveBreakpoint(const String16& breakpointId, |
return buildProtocolLocation(scriptId, actualLineNumber, actualColumnNumber); |
} |
-void V8DebuggerAgentImpl::searchInContent( |
- ErrorString* error, const String16& scriptId, const String16& query, |
- const Maybe<bool>& optionalCaseSensitive, |
- const Maybe<bool>& optionalIsRegex, |
+Response V8DebuggerAgentImpl::searchInContent( |
+ const String16& scriptId, const String16& query, |
+ Maybe<bool> optionalCaseSensitive, Maybe<bool> optionalIsRegex, |
std::unique_ptr<Array<protocol::Debugger::SearchMatch>>* results) { |
v8::HandleScope handles(m_isolate); |
ScriptsMap::iterator it = m_scripts.find(scriptId); |
- if (it == m_scripts.end()) { |
- *error = String16("No script for id: " + scriptId); |
- return; |
- } |
+ if (it == m_scripts.end()) |
+ return Response::Error("No script for id: " + scriptId); |
std::vector<std::unique_ptr<protocol::Debugger::SearchMatch>> matches = |
searchInTextByLinesImpl(m_session, |
@@ -530,48 +490,46 @@ void V8DebuggerAgentImpl::searchInContent( |
*results = protocol::Array<protocol::Debugger::SearchMatch>::create(); |
for (size_t i = 0; i < matches.size(); ++i) |
(*results)->addItem(std::move(matches[i])); |
+ return Response::OK(); |
} |
-void V8DebuggerAgentImpl::setScriptSource( |
- ErrorString* errorString, const String16& scriptId, |
- const String16& newContent, const Maybe<bool>& dryRun, |
+Response V8DebuggerAgentImpl::setScriptSource( |
+ const String16& scriptId, const String16& newContent, Maybe<bool> dryRun, |
Maybe<protocol::Array<protocol::Debugger::CallFrame>>* newCallFrames, |
Maybe<bool>* stackChanged, Maybe<StackTrace>* asyncStackTrace, |
Maybe<protocol::Runtime::ExceptionDetails>* optOutCompileError) { |
- if (!checkEnabled(errorString)) return; |
+ if (!enabled()) return Response::Error(kDebuggerNotEnabled); |
v8::HandleScope handles(m_isolate); |
v8::Local<v8::String> newSource = toV8String(m_isolate, newContent); |
- if (!m_debugger->setScriptSource(scriptId, newSource, dryRun.fromMaybe(false), |
- errorString, optOutCompileError, |
- &m_pausedCallFrames, stackChanged)) |
- return; |
+ bool compileError = false; |
+ Response response = m_debugger->setScriptSource( |
+ scriptId, newSource, dryRun.fromMaybe(false), optOutCompileError, |
+ &m_pausedCallFrames, stackChanged, &compileError); |
+ if (!response.isSuccess() || compileError) return response; |
ScriptsMap::iterator it = m_scripts.find(scriptId); |
if (it != m_scripts.end()) it->second->setSource(m_isolate, newSource); |
- std::unique_ptr<Array<CallFrame>> callFrames = currentCallFrames(errorString); |
- if (!callFrames) return; |
+ std::unique_ptr<Array<CallFrame>> callFrames; |
+ response = currentCallFrames(&callFrames); |
+ if (!response.isSuccess()) return response; |
*newCallFrames = std::move(callFrames); |
*asyncStackTrace = currentAsyncStackTrace(); |
+ return Response::OK(); |
} |
-void V8DebuggerAgentImpl::restartFrame( |
- ErrorString* errorString, const String16& callFrameId, |
+Response V8DebuggerAgentImpl::restartFrame( |
+ const String16& callFrameId, |
std::unique_ptr<Array<CallFrame>>* newCallFrames, |
Maybe<StackTrace>* asyncStackTrace) { |
- if (!assertPaused(errorString)) return; |
+ if (m_pausedContext.IsEmpty()) return Response::Error(kDebuggerNotPaused); |
InjectedScript::CallFrameScope scope(m_inspector, m_session->contextGroupId(), |
callFrameId); |
Response response = scope.initialize(); |
- if (!response.isSuccess()) { |
- *errorString = response.errorMessage(); |
- return; |
- } |
- if (scope.frameOrdinal() >= m_pausedCallFrames.size()) { |
- *errorString = "Could not find call frame with given id"; |
- return; |
- } |
+ if (!response.isSuccess()) return response; |
+ if (scope.frameOrdinal() >= m_pausedCallFrames.size()) |
+ return Response::Error("Could not find call frame with given id"); |
v8::Local<v8::Value> resultValue; |
v8::Local<v8::Boolean> result; |
@@ -580,28 +538,26 @@ void V8DebuggerAgentImpl::restartFrame( |
scope.tryCatch().HasCaught() || |
!resultValue->ToBoolean(scope.context()).ToLocal(&result) || |
!result->Value()) { |
- *errorString = "Internal error"; |
- return; |
+ return Response::InternalError(); |
} |
JavaScriptCallFrames frames = m_debugger->currentCallFrames(); |
m_pausedCallFrames.swap(frames); |
- *newCallFrames = currentCallFrames(errorString); |
- if (!*newCallFrames) return; |
+ response = currentCallFrames(newCallFrames); |
+ if (!response.isSuccess()) return response; |
*asyncStackTrace = currentAsyncStackTrace(); |
+ return Response::OK(); |
} |
-void V8DebuggerAgentImpl::getScriptSource(ErrorString* error, |
- const String16& scriptId, |
- String16* scriptSource) { |
- if (!checkEnabled(error)) return; |
+Response V8DebuggerAgentImpl::getScriptSource(const String16& scriptId, |
+ String16* scriptSource) { |
+ if (!enabled()) return Response::Error(kDebuggerNotEnabled); |
ScriptsMap::iterator it = m_scripts.find(scriptId); |
- if (it == m_scripts.end()) { |
- *error = "No script for id: " + scriptId; |
- return; |
- } |
+ if (it == m_scripts.end()) |
+ return Response::Error("No script for id: " + scriptId); |
v8::HandleScope handles(m_isolate); |
*scriptSource = toProtocolString(it->second->source(m_isolate)); |
+ return Response::OK(); |
} |
void V8DebuggerAgentImpl::schedulePauseOnNextStatement( |
@@ -637,61 +593,64 @@ void V8DebuggerAgentImpl::cancelPauseOnNextStatement() { |
m_debugger->setPauseOnNextStatement(false); |
} |
-void V8DebuggerAgentImpl::pause(ErrorString* errorString) { |
- if (!checkEnabled(errorString)) return; |
- if (m_javaScriptPauseScheduled || m_debugger->isPaused()) return; |
+Response V8DebuggerAgentImpl::pause() { |
+ if (!enabled()) return Response::Error(kDebuggerNotEnabled); |
+ if (m_javaScriptPauseScheduled || m_debugger->isPaused()) |
+ return Response::OK(); |
clearBreakDetails(); |
m_javaScriptPauseScheduled = true; |
m_scheduledDebuggerStep = NoStep; |
m_skippedStepFrameCount = 0; |
m_steppingFromFramework = false; |
m_debugger->setPauseOnNextStatement(true); |
+ return Response::OK(); |
} |
-void V8DebuggerAgentImpl::resume(ErrorString* errorString) { |
- if (!assertPaused(errorString)) return; |
+Response V8DebuggerAgentImpl::resume() { |
+ if (m_pausedContext.IsEmpty()) return Response::Error(kDebuggerNotPaused); |
m_scheduledDebuggerStep = NoStep; |
m_steppingFromFramework = false; |
- m_session->releaseObjectGroup(backtraceObjectGroup); |
+ m_session->releaseObjectGroup(kBacktraceObjectGroup); |
m_debugger->continueProgram(); |
+ return Response::OK(); |
} |
-void V8DebuggerAgentImpl::stepOver(ErrorString* errorString) { |
- if (!assertPaused(errorString)) return; |
+Response V8DebuggerAgentImpl::stepOver() { |
+ if (m_pausedContext.IsEmpty()) return Response::Error(kDebuggerNotPaused); |
// StepOver at function return point should fallback to StepInto. |
JavaScriptCallFrame* frame = |
!m_pausedCallFrames.empty() ? m_pausedCallFrames[0].get() : nullptr; |
- if (frame && frame->isAtReturn()) { |
- stepInto(errorString); |
- return; |
- } |
+ if (frame && frame->isAtReturn()) return stepInto(); |
m_scheduledDebuggerStep = StepOver; |
m_steppingFromFramework = isTopPausedCallFrameBlackboxed(); |
- m_session->releaseObjectGroup(backtraceObjectGroup); |
+ m_session->releaseObjectGroup(kBacktraceObjectGroup); |
m_debugger->stepOverStatement(); |
+ return Response::OK(); |
} |
-void V8DebuggerAgentImpl::stepInto(ErrorString* errorString) { |
- if (!assertPaused(errorString)) return; |
+Response V8DebuggerAgentImpl::stepInto() { |
+ if (m_pausedContext.IsEmpty()) return Response::Error(kDebuggerNotPaused); |
m_scheduledDebuggerStep = StepInto; |
m_steppingFromFramework = isTopPausedCallFrameBlackboxed(); |
- m_session->releaseObjectGroup(backtraceObjectGroup); |
+ m_session->releaseObjectGroup(kBacktraceObjectGroup); |
m_debugger->stepIntoStatement(); |
+ return Response::OK(); |
} |
-void V8DebuggerAgentImpl::stepOut(ErrorString* errorString) { |
- if (!assertPaused(errorString)) return; |
+Response V8DebuggerAgentImpl::stepOut() { |
+ if (m_pausedContext.IsEmpty()) return Response::Error(kDebuggerNotPaused); |
m_scheduledDebuggerStep = StepOut; |
m_skipNextDebuggerStepOut = false; |
m_recursionLevelForStepOut = 1; |
m_steppingFromFramework = isTopPausedCallFrameBlackboxed(); |
- m_session->releaseObjectGroup(backtraceObjectGroup); |
+ m_session->releaseObjectGroup(kBacktraceObjectGroup); |
m_debugger->stepOutOfFunction(); |
+ return Response::OK(); |
} |
-void V8DebuggerAgentImpl::setPauseOnExceptions( |
- ErrorString* errorString, const String16& stringPauseState) { |
- if (!checkEnabled(errorString)) return; |
+Response V8DebuggerAgentImpl::setPauseOnExceptions( |
+ const String16& stringPauseState) { |
+ if (!enabled()) return Response::Error(kDebuggerNotEnabled); |
v8::DebugInterface::ExceptionBreakState pauseState; |
if (stringPauseState == "none") { |
pauseState = v8::DebugInterface::NoBreakOnException; |
@@ -700,10 +659,11 @@ void V8DebuggerAgentImpl::setPauseOnExceptions( |
} else if (stringPauseState == "uncaught") { |
pauseState = v8::DebugInterface::BreakOnUncaughtException; |
} else { |
- *errorString = "Unknown pause on exceptions mode: " + stringPauseState; |
- return; |
+ return Response::Error("Unknown pause on exceptions mode: " + |
+ stringPauseState); |
} |
setPauseOnExceptionsImpl(pauseState); |
+ return Response::OK(); |
} |
void V8DebuggerAgentImpl::setPauseOnExceptionsImpl(int pauseState) { |
@@ -712,25 +672,19 @@ void V8DebuggerAgentImpl::setPauseOnExceptionsImpl(int pauseState) { |
m_state->setInteger(DebuggerAgentState::pauseOnExceptionsState, pauseState); |
} |
-void V8DebuggerAgentImpl::evaluateOnCallFrame( |
- ErrorString* errorString, const String16& callFrameId, |
- const String16& expression, const Maybe<String16>& objectGroup, |
- const Maybe<bool>& includeCommandLineAPI, const Maybe<bool>& silent, |
- const Maybe<bool>& returnByValue, const Maybe<bool>& generatePreview, |
+Response V8DebuggerAgentImpl::evaluateOnCallFrame( |
+ const String16& callFrameId, const String16& expression, |
+ Maybe<String16> objectGroup, Maybe<bool> includeCommandLineAPI, |
+ Maybe<bool> silent, Maybe<bool> returnByValue, Maybe<bool> generatePreview, |
std::unique_ptr<RemoteObject>* result, |
Maybe<protocol::Runtime::ExceptionDetails>* exceptionDetails) { |
- if (!assertPaused(errorString)) return; |
+ if (m_pausedContext.IsEmpty()) return Response::Error(kDebuggerNotPaused); |
InjectedScript::CallFrameScope scope(m_inspector, m_session->contextGroupId(), |
callFrameId); |
Response response = scope.initialize(); |
- if (!response.isSuccess()) { |
- *errorString = response.errorMessage(); |
- return; |
- } |
- if (scope.frameOrdinal() >= m_pausedCallFrames.size()) { |
- *errorString = "Could not find call frame with given id"; |
- return; |
- } |
+ if (!response.isSuccess()) return response; |
+ if (scope.frameOrdinal() >= m_pausedCallFrames.size()) |
+ return Response::Error("Could not find call frame with given id"); |
if (includeCommandLineAPI.fromMaybe(false)) scope.installCommandLineAPI(); |
if (silent.fromMaybe(false)) scope.ignoreExceptionsAndMuteConsole(); |
@@ -742,65 +696,51 @@ void V8DebuggerAgentImpl::evaluateOnCallFrame( |
// Re-initialize after running client's code, as it could have destroyed |
// context or session. |
response = scope.initialize(); |
- if (!response.isSuccess()) { |
- *errorString = response.errorMessage(); |
- return; |
- } |
- response = scope.injectedScript()->wrapEvaluateResult( |
+ if (!response.isSuccess()) return response; |
+ return scope.injectedScript()->wrapEvaluateResult( |
maybeResultValue, scope.tryCatch(), objectGroup.fromMaybe(""), |
returnByValue.fromMaybe(false), generatePreview.fromMaybe(false), result, |
exceptionDetails); |
- if (!response.isSuccess()) *errorString = response.errorMessage(); |
} |
-void V8DebuggerAgentImpl::setVariableValue( |
- ErrorString* errorString, int scopeNumber, const String16& variableName, |
+Response V8DebuggerAgentImpl::setVariableValue( |
+ int scopeNumber, const String16& variableName, |
std::unique_ptr<protocol::Runtime::CallArgument> newValueArgument, |
const String16& callFrameId) { |
- if (!checkEnabled(errorString)) return; |
- if (!assertPaused(errorString)) return; |
+ if (!enabled()) return Response::Error(kDebuggerNotEnabled); |
+ if (m_pausedContext.IsEmpty()) return Response::Error(kDebuggerNotPaused); |
InjectedScript::CallFrameScope scope(m_inspector, m_session->contextGroupId(), |
callFrameId); |
Response response = scope.initialize(); |
- if (!response.isSuccess()) { |
- *errorString = response.errorMessage(); |
- return; |
- } |
+ if (!response.isSuccess()) return response; |
v8::Local<v8::Value> newValue; |
response = scope.injectedScript()->resolveCallArgument(newValueArgument.get(), |
&newValue); |
- if (!response.isSuccess()) { |
- *errorString = response.errorMessage(); |
- return; |
- } |
+ if (!response.isSuccess()) return response; |
- if (scope.frameOrdinal() >= m_pausedCallFrames.size()) { |
- *errorString = "Could not find call frame with given id"; |
- return; |
- } |
+ if (scope.frameOrdinal() >= m_pausedCallFrames.size()) |
+ return Response::Error("Could not find call frame with given id"); |
v8::MaybeLocal<v8::Value> result = |
m_pausedCallFrames[scope.frameOrdinal()]->setVariableValue( |
scopeNumber, toV8String(m_isolate, variableName), newValue); |
- if (scope.tryCatch().HasCaught() || result.IsEmpty()) { |
- *errorString = "Internal error"; |
- return; |
- } |
+ if (scope.tryCatch().HasCaught() || result.IsEmpty()) |
+ return Response::InternalError(); |
+ return Response::OK(); |
} |
-void V8DebuggerAgentImpl::setAsyncCallStackDepth(ErrorString* errorString, |
- int depth) { |
- if (!checkEnabled(errorString)) return; |
+Response V8DebuggerAgentImpl::setAsyncCallStackDepth(int depth) { |
+ if (!enabled()) return Response::Error(kDebuggerNotEnabled); |
m_state->setInteger(DebuggerAgentState::asyncCallStackDepth, depth); |
m_debugger->setAsyncCallStackDepth(this, depth); |
+ return Response::OK(); |
} |
-void V8DebuggerAgentImpl::setBlackboxPatterns( |
- ErrorString* errorString, |
+Response V8DebuggerAgentImpl::setBlackboxPatterns( |
std::unique_ptr<protocol::Array<String16>> patterns) { |
if (!patterns->length()) { |
m_blackboxPattern = nullptr; |
m_state->remove(DebuggerAgentState::blackboxPattern); |
- return; |
+ return Response::OK(); |
} |
String16Builder patternBuilder; |
@@ -812,48 +752,41 @@ void V8DebuggerAgentImpl::setBlackboxPatterns( |
patternBuilder.append(patterns->get(patterns->length() - 1)); |
patternBuilder.append(')'); |
String16 pattern = patternBuilder.toString(); |
- if (!setBlackboxPattern(errorString, pattern)) return; |
+ Response response = setBlackboxPattern(pattern); |
+ if (!response.isSuccess()) return response; |
m_state->setString(DebuggerAgentState::blackboxPattern, pattern); |
+ return Response::OK(); |
} |
-bool V8DebuggerAgentImpl::setBlackboxPattern(ErrorString* errorString, |
- const String16& pattern) { |
+Response V8DebuggerAgentImpl::setBlackboxPattern(const String16& pattern) { |
std::unique_ptr<V8Regex> regex(new V8Regex( |
m_inspector, pattern, true /** caseSensitive */, false /** multiline */)); |
- if (!regex->isValid()) { |
- *errorString = "Pattern parser error: " + regex->errorMessage(); |
- return false; |
- } |
+ if (!regex->isValid()) |
+ return Response::Error("Pattern parser error: " + regex->errorMessage()); |
m_blackboxPattern = std::move(regex); |
- return true; |
+ return Response::OK(); |
} |
-void V8DebuggerAgentImpl::setBlackboxedRanges( |
- ErrorString* error, const String16& scriptId, |
+Response V8DebuggerAgentImpl::setBlackboxedRanges( |
+ const String16& scriptId, |
std::unique_ptr<protocol::Array<protocol::Debugger::ScriptPosition>> |
inPositions) { |
- if (m_scripts.find(scriptId) == m_scripts.end()) { |
- *error = "No script with passed id."; |
- return; |
- } |
+ if (m_scripts.find(scriptId) == m_scripts.end()) |
+ return Response::Error("No script with passed id."); |
if (!inPositions->length()) { |
m_blackboxedPositions.erase(scriptId); |
- return; |
+ return Response::OK(); |
} |
std::vector<std::pair<int, int>> positions; |
positions.reserve(inPositions->length()); |
for (size_t i = 0; i < inPositions->length(); ++i) { |
protocol::Debugger::ScriptPosition* position = inPositions->get(i); |
- if (position->getLineNumber() < 0) { |
- *error = "Position missing 'line' or 'line' < 0."; |
- return; |
- } |
- if (position->getColumnNumber() < 0) { |
- *error = "Position missing 'column' or 'column' < 0."; |
- return; |
- } |
+ if (position->getLineNumber() < 0) |
+ return Response::Error("Position missing 'line' or 'line' < 0."); |
+ if (position->getColumnNumber() < 0) |
+ return Response::Error("Position missing 'column' or 'column' < 0."); |
positions.push_back( |
std::make_pair(position->getLineNumber(), position->getColumnNumber())); |
} |
@@ -863,12 +796,12 @@ void V8DebuggerAgentImpl::setBlackboxedRanges( |
if (positions[i - 1].first == positions[i].first && |
positions[i - 1].second < positions[i].second) |
continue; |
- *error = |
- "Input positions array is not sorted or contains duplicate values."; |
- return; |
+ return Response::Error( |
+ "Input positions array is not sorted or contains duplicate values."); |
} |
m_blackboxedPositions[scriptId] = positions; |
+ return Response::OK(); |
} |
void V8DebuggerAgentImpl::willExecuteScript(int scriptId) { |
@@ -921,10 +854,12 @@ void V8DebuggerAgentImpl::changeJavaScriptRecursionLevel(int step) { |
} |
} |
-std::unique_ptr<Array<CallFrame>> V8DebuggerAgentImpl::currentCallFrames( |
- ErrorString* errorString) { |
- if (m_pausedContext.IsEmpty() || !m_pausedCallFrames.size()) |
- return Array<CallFrame>::create(); |
+Response V8DebuggerAgentImpl::currentCallFrames( |
+ std::unique_ptr<Array<CallFrame>>* result) { |
+ if (m_pausedContext.IsEmpty() || !m_pausedCallFrames.size()) { |
+ *result = Array<CallFrame>::create(); |
+ return Response::OK(); |
+ } |
v8::HandleScope handles(m_isolate); |
v8::Local<v8::Context> debuggerContext = |
v8::DebugInterface::GetDebugContext(m_isolate); |
@@ -938,8 +873,7 @@ std::unique_ptr<Array<CallFrame>> V8DebuggerAgentImpl::currentCallFrames( |
m_pausedCallFrames[frameOrdinal]; |
v8::Local<v8::Object> details = currentCallFrame->details(); |
- if (hasInternalError(errorString, details.IsEmpty())) |
- return Array<CallFrame>::create(); |
+ if (details.IsEmpty()) return Response::InternalError(); |
int contextId = currentCallFrame->contextId(); |
@@ -948,101 +882,83 @@ std::unique_ptr<Array<CallFrame>> V8DebuggerAgentImpl::currentCallFrames( |
String16 callFrameId = |
RemoteCallFrameId::serialize(contextId, static_cast<int>(frameOrdinal)); |
- if (hasInternalError( |
- errorString, |
- !details |
- ->Set(debuggerContext, |
- toV8StringInternalized(m_isolate, "callFrameId"), |
- toV8String(m_isolate, callFrameId)) |
- .FromMaybe(false))) |
- return Array<CallFrame>::create(); |
+ if (!details |
+ ->Set(debuggerContext, |
+ toV8StringInternalized(m_isolate, "callFrameId"), |
+ toV8String(m_isolate, callFrameId)) |
+ .FromMaybe(false)) { |
+ return Response::InternalError(); |
+ } |
if (injectedScript) { |
v8::Local<v8::Value> scopeChain; |
- if (hasInternalError( |
- errorString, |
- !details->Get(debuggerContext, |
- toV8StringInternalized(m_isolate, "scopeChain")) |
- .ToLocal(&scopeChain) || |
- !scopeChain->IsArray())) |
- return Array<CallFrame>::create(); |
+ if (!details |
+ ->Get(debuggerContext, |
+ toV8StringInternalized(m_isolate, "scopeChain")) |
+ .ToLocal(&scopeChain) || |
+ !scopeChain->IsArray()) { |
+ return Response::InternalError(); |
+ } |
v8::Local<v8::Array> scopeChainArray = scopeChain.As<v8::Array>(); |
Response response = injectedScript->wrapPropertyInArray( |
scopeChainArray, toV8StringInternalized(m_isolate, "object"), |
- backtraceObjectGroup); |
- if (!response.isSuccess()) { |
- *errorString = response.errorMessage(); |
- return Array<CallFrame>::create(); |
- } |
+ kBacktraceObjectGroup); |
+ if (!response.isSuccess()) return response; |
response = injectedScript->wrapObjectProperty( |
details, toV8StringInternalized(m_isolate, "this"), |
- backtraceObjectGroup); |
- if (!response.isSuccess()) { |
- *errorString = response.errorMessage(); |
- return Array<CallFrame>::create(); |
- } |
+ kBacktraceObjectGroup); |
+ if (!response.isSuccess()) return response; |
if (details |
->Has(debuggerContext, |
toV8StringInternalized(m_isolate, "returnValue")) |
.FromMaybe(false)) { |
response = injectedScript->wrapObjectProperty( |
details, toV8StringInternalized(m_isolate, "returnValue"), |
- backtraceObjectGroup); |
- if (!response.isSuccess()) { |
- *errorString = response.errorMessage(); |
- return Array<CallFrame>::create(); |
- } |
+ kBacktraceObjectGroup); |
+ if (!response.isSuccess()) return response; |
} |
} else { |
- if (hasInternalError(errorString, !details |
- ->Set(debuggerContext, |
- toV8StringInternalized( |
- m_isolate, "scopeChain"), |
- v8::Array::New(m_isolate, 0)) |
- .FromMaybe(false))) |
- return Array<CallFrame>::create(); |
+ if (!details |
+ ->Set(debuggerContext, |
+ toV8StringInternalized(m_isolate, "scopeChain"), |
+ v8::Array::New(m_isolate, 0)) |
+ .FromMaybe(false)) { |
+ return Response::InternalError(); |
+ } |
v8::Local<v8::Object> remoteObject = v8::Object::New(m_isolate); |
- if (hasInternalError( |
- errorString, |
- !remoteObject |
- ->Set(debuggerContext, |
- toV8StringInternalized(m_isolate, "type"), |
- toV8StringInternalized(m_isolate, "undefined")) |
- .FromMaybe(false))) |
- return Array<CallFrame>::create(); |
- if (hasInternalError(errorString, |
- !details |
- ->Set(debuggerContext, |
- toV8StringInternalized(m_isolate, "this"), |
- remoteObject) |
- .FromMaybe(false))) |
- return Array<CallFrame>::create(); |
- if (hasInternalError( |
- errorString, |
- !details |
- ->Delete(debuggerContext, |
- toV8StringInternalized(m_isolate, "returnValue")) |
- .FromMaybe(false))) |
- return Array<CallFrame>::create(); |
+ if (!remoteObject |
+ ->Set(debuggerContext, toV8StringInternalized(m_isolate, "type"), |
+ toV8StringInternalized(m_isolate, "undefined")) |
+ .FromMaybe(false)) { |
+ return Response::InternalError(); |
+ } |
+ if (!details |
+ ->Set(debuggerContext, toV8StringInternalized(m_isolate, "this"), |
+ remoteObject) |
+ .FromMaybe(false)) { |
+ return Response::InternalError(); |
+ } |
+ if (!details |
+ ->Delete(debuggerContext, |
+ toV8StringInternalized(m_isolate, "returnValue")) |
+ .FromMaybe(false)) { |
+ return Response::InternalError(); |
+ } |
} |
- if (hasInternalError( |
- errorString, |
- !objects |
- ->Set(debuggerContext, static_cast<int>(frameOrdinal), details) |
- .FromMaybe(false))) |
- return Array<CallFrame>::create(); |
+ if (!objects->Set(debuggerContext, static_cast<int>(frameOrdinal), details) |
+ .FromMaybe(false)) { |
+ return Response::InternalError(); |
+ } |
} |
std::unique_ptr<protocol::Value> protocolValue; |
Response response = toProtocolValue(debuggerContext, objects, &protocolValue); |
- if (!response.isSuccess()) return Array<CallFrame>::create(); |
+ if (!response.isSuccess()) return response; |
protocol::ErrorSupport errorSupport; |
- std::unique_ptr<Array<CallFrame>> callFrames = |
- Array<CallFrame>::parse(protocolValue.get(), &errorSupport); |
- if (hasInternalError(errorString, !callFrames)) |
- return Array<CallFrame>::create(); |
- return callFrames; |
+ *result = Array<CallFrame>::parse(protocolValue.get(), &errorSupport); |
+ if (!*result) return Response::Error(errorSupport.errors()); |
+ return Response::OK(); |
} |
std::unique_ptr<StackTrace> V8DebuggerAgentImpl::currentAsyncStackTrace() { |
@@ -1069,8 +985,8 @@ void V8DebuggerAgentImpl::didParseSource( |
String16 scriptId = script->scriptId(); |
String16 scriptURL = script->sourceURL(); |
- const Maybe<String16>& sourceMapURLParam = script->sourceMappingURL(); |
- const Maybe<protocol::DictionaryValue>& executionContextAuxDataParam( |
+ Maybe<String16> sourceMapURLParam = script->sourceMappingURL(); |
+ Maybe<protocol::DictionaryValue> executionContextAuxDataParam( |
std::move(executionContextAuxData)); |
const bool* isLiveEditParam = isLiveEdit ? &isLiveEdit : nullptr; |
const bool* hasSourceURLParam = hasSourceURL ? &hasSourceURL : nullptr; |
@@ -1078,14 +994,14 @@ void V8DebuggerAgentImpl::didParseSource( |
m_frontend.scriptParsed( |
scriptId, scriptURL, script->startLine(), script->startColumn(), |
script->endLine(), script->endColumn(), script->executionContextId(), |
- script->hash(), executionContextAuxDataParam, isLiveEditParam, |
- sourceMapURLParam, hasSourceURLParam); |
+ script->hash(), std::move(executionContextAuxDataParam), |
+ isLiveEditParam, std::move(sourceMapURLParam), hasSourceURLParam); |
else |
m_frontend.scriptFailedToParse( |
scriptId, scriptURL, script->startLine(), script->startColumn(), |
script->endLine(), script->endColumn(), script->executionContextId(), |
- script->hash(), executionContextAuxDataParam, sourceMapURLParam, |
- hasSourceURLParam); |
+ script->hash(), std::move(executionContextAuxDataParam), |
+ std::move(sourceMapURLParam), hasSourceURLParam); |
m_scripts[scriptId] = std::move(script); |
@@ -1160,7 +1076,7 @@ V8DebuggerAgentImpl::SkipPauseRequest V8DebuggerAgentImpl::didPause( |
? protocol::Debugger::Paused::ReasonEnum::PromiseRejection |
: protocol::Debugger::Paused::ReasonEnum::Exception; |
std::unique_ptr<protocol::Runtime::RemoteObject> obj; |
- injectedScript->wrapObject(exception, backtraceObjectGroup, false, false, |
+ injectedScript->wrapObject(exception, kBacktraceObjectGroup, false, false, |
&obj); |
m_breakAuxData = obj ? obj->serialize() : nullptr; |
// m_breakAuxData might be null after this. |
@@ -1183,8 +1099,10 @@ V8DebuggerAgentImpl::SkipPauseRequest V8DebuggerAgentImpl::didPause( |
} |
} |
- ErrorString errorString; |
- m_frontend.paused(currentCallFrames(&errorString), m_breakReason, |
+ std::unique_ptr<Array<CallFrame>> protocolCallFrames; |
+ Response response = currentCallFrames(&protocolCallFrames); |
+ if (!response.isSuccess()) protocolCallFrames = Array<CallFrame>::create(); |
+ m_frontend.paused(std::move(protocolCallFrames), m_breakReason, |
std::move(m_breakAuxData), std::move(hitBreakpointIds), |
currentAsyncStackTrace()); |
m_scheduledDebuggerStep = NoStep; |
@@ -1234,14 +1152,6 @@ void V8DebuggerAgentImpl::breakProgramOnException( |
breakProgram(breakReason, std::move(data)); |
} |
-bool V8DebuggerAgentImpl::assertPaused(ErrorString* errorString) { |
- if (m_pausedContext.IsEmpty()) { |
- *errorString = "Can only perform operation while paused."; |
- return false; |
- } |
- return true; |
-} |
- |
void V8DebuggerAgentImpl::clearBreakDetails() { |
m_breakReason = protocol::Debugger::Paused::ReasonEnum::Other; |
m_breakAuxData = nullptr; |
@@ -1260,7 +1170,7 @@ void V8DebuggerAgentImpl::setBreakpointAt(const String16& scriptId, |
void V8DebuggerAgentImpl::removeBreakpointAt(const String16& scriptId, |
int lineNumber, int columnNumber, |
BreakpointSource source) { |
- removeBreakpoint( |
+ removeBreakpointImpl( |
generateBreakpointId(scriptId, lineNumber, columnNumber, source)); |
} |