Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(242)

Unified Diff: Source/bindings/v8/ScriptDebugServer.cpp

Issue 15096004: Passing hit breakpoint IDs to ScriptDebugServer. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 7 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: Source/bindings/v8/ScriptDebugServer.cpp
diff --git a/Source/bindings/v8/ScriptDebugServer.cpp b/Source/bindings/v8/ScriptDebugServer.cpp
index 9a3ab63027c6d50fbc79e181d212746436f78d65..e2d3a92efd23e2845193e81a73d6ebd886ab25ba 100644
--- a/Source/bindings/v8/ScriptDebugServer.cpp
+++ b/Source/bindings/v8/ScriptDebugServer.cpp
@@ -43,6 +43,7 @@
#include "core/inspector/ScriptDebugListener.h"
#include "wtf/StdLibExtras.h"
#include "wtf/Vector.h"
+#include "wtf/dtoa/utils.h"
namespace WebCore {
@@ -382,11 +383,12 @@ v8::Handle<v8::Value> ScriptDebugServer::breakProgramCallback(const v8::Argument
ScriptDebugServer* thisPtr = toScriptDebugServer(args.Data());
v8::Handle<v8::Value> exception;
- thisPtr->breakProgram(v8::Handle<v8::Object>::Cast(args[0]), exception);
+ v8::Handle<v8::Array> hitBreakpoints;
+ thisPtr->breakProgram(v8::Handle<v8::Object>::Cast(args[0]), exception, hitBreakpoints);
return v8::Undefined();
}
-void ScriptDebugServer::breakProgram(v8::Handle<v8::Object> executionState, v8::Handle<v8::Value> exception)
+void ScriptDebugServer::breakProgram(v8::Handle<v8::Object> executionState, v8::Handle<v8::Value> exception, v8::Handle<v8::Array> hitBreakpointNumbers)
{
// Don't allow nested breaks.
if (isPaused())
@@ -396,15 +398,29 @@ void ScriptDebugServer::breakProgram(v8::Handle<v8::Object> executionState, v8::
if (!listener)
return;
+ Vector<String> breakpointIds;
+ if (!hitBreakpointNumbers.IsEmpty()) {
+ breakpointIds.resize(hitBreakpointNumbers->Length());
+ for (size_t i = 0; i < hitBreakpointNumbers->Length(); i++)
+ breakpointIds[i] = toWebCoreStringWithUndefinedOrNullCheck(hitBreakpointNumbers->Get(i));
+ }
+
m_executionState.set(m_isolate, executionState);
ScriptState* currentCallFrameState = ScriptState::forContext(m_pausedContext);
- listener->didPause(currentCallFrameState, currentCallFrame(), ScriptValue(exception));
+ listener->didPause(currentCallFrameState, currentCallFrame(), ScriptValue(exception), breakpointIds);
m_runningNestedMessageLoop = true;
runMessageLoopOnPause(m_pausedContext);
m_runningNestedMessageLoop = false;
}
+void ScriptDebugServer::breakProgram(const v8::Debug::EventDetails& eventDetails, v8::Handle<v8::Value> exception, v8::Handle<v8::Array> hitBreakpointNumbers)
+{
+ m_pausedContext = *eventDetails.GetEventContext();
+ breakProgram(eventDetails.GetExecutionState(), exception, hitBreakpointNumbers);
+ m_pausedContext.Clear();
+}
+
void ScriptDebugServer::v8DebugEventCallback(const v8::Debug::EventDetails& eventDetails)
{
ScriptDebugServer* thisPtr = toScriptDebugServer(eventDetails.GetCallbackData());
@@ -454,30 +470,32 @@ void ScriptDebugServer::handleV8DebugEvent(const v8::Debug::EventDetails& eventD
m_scriptPreprocessor = preprocessor.release();
} else if (event == v8::AfterCompile) {
v8::Context::Scope contextScope(v8::Debug::GetDebugContext());
- v8::Handle<v8::Function> onAfterCompileFunction = v8::Local<v8::Function>::Cast(m_debuggerScript.get()->Get(v8::String::NewSymbol("getAfterCompileScript")));
+ v8::Handle<v8::Function> getAfterCompileScript = v8::Local<v8::Function>::Cast(m_debuggerScript.get()->Get(v8::String::NewSymbol("getAfterCompileScript")));
v8::Handle<v8::Value> argv[] = { eventDetails.GetEventData() };
- v8::Handle<v8::Value> value = onAfterCompileFunction->Call(m_debuggerScript.get(), 1, argv);
+ v8::Handle<v8::Value> value = getAfterCompileScript->Call(m_debuggerScript.get(), 1, argv);
ASSERT(value->IsObject());
v8::Handle<v8::Object> object = v8::Handle<v8::Object>::Cast(value);
dispatchDidParseSource(listener, object);
- } else if (event == v8::Break || event == v8::Exception) {
- v8::Handle<v8::Value> exception;
- if (event == v8::Exception) {
- v8::Local<v8::StackTrace> stackTrace = v8::StackTrace::CurrentStackTrace(1);
- // Stack trace is empty in case of syntax error. Silently continue execution in such cases.
- if (!stackTrace->GetFrameCount())
- return;
- v8::Handle<v8::Object> eventData = eventDetails.GetEventData();
- v8::Handle<v8::Value> exceptionGetterValue = eventData->Get(v8::String::NewSymbol("exception"));
- ASSERT(!exceptionGetterValue.IsEmpty() && exceptionGetterValue->IsFunction());
- v8::Handle<v8::Value> argv[] = { v8Undefined() };
- V8RecursionScope::MicrotaskSuppression scope;
- exception = v8::Handle<v8::Function>::Cast(exceptionGetterValue)->Call(eventData, 0, argv);
- }
-
- m_pausedContext = *eventContext;
- breakProgram(eventDetails.GetExecutionState(), exception);
- m_pausedContext.Clear();
+ } else if (event == v8::Exception) {
+ v8::Local<v8::StackTrace> stackTrace = v8::StackTrace::CurrentStackTrace(1);
+ // Stack trace is empty in case of syntax error. Silently continue execution in such cases.
+ if (!stackTrace->GetFrameCount())
+ return;
+ v8::Handle<v8::Object> eventData = eventDetails.GetEventData();
+ v8::Handle<v8::Value> exceptionGetterValue = eventData->Get(v8::String::NewSymbol("exception"));
+ ASSERT(!exceptionGetterValue.IsEmpty() && exceptionGetterValue->IsFunction());
+ v8::Handle<v8::Value> argv[] = { v8Undefined() };
+ V8RecursionScope::MicrotaskSuppression scope;
+ v8::Handle<v8::Value> exception = v8::Handle<v8::Function>::Cast(exceptionGetterValue)->Call(eventData, 0, argv);
+
+ breakProgram(eventDetails, exception, v8::Handle<v8::Array>());
+ } else if (event == v8::Break) {
+ v8::Handle<v8::Function> getBreakpointNumbersFunction = v8::Local<v8::Function>::Cast(m_debuggerScript.get()->Get(v8::String::NewSymbol("getBreakpointNumbers")));
+ v8::Handle<v8::Value> argv[] = { eventDetails.GetEventData() };
+ v8::Handle<v8::Value> hitBreakpoints = getBreakpointNumbersFunction->Call(m_debuggerScript.get(), ARRAY_SIZE(argv), argv);
+ ASSERT(hitBreakpoints->IsArray());
+
+ breakProgram(eventDetails, v8::Handle<v8::Value>(), hitBreakpoints.As<v8::Array>());
}
}
}

Powered by Google App Engine
This is Rietveld 408576698