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

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

Issue 374903002: DevTools: Async call stacks for Promises and Object.observe. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: rebased Created 6 years, 5 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
« no previous file with comments | « Source/bindings/core/v8/ScriptDebugServer.h ('k') | Source/core/inspector/AsyncCallStackTracker.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/bindings/core/v8/ScriptDebugServer.cpp
diff --git a/Source/bindings/core/v8/ScriptDebugServer.cpp b/Source/bindings/core/v8/ScriptDebugServer.cpp
index ff1680335e62512a51670b632c872012c674cc2f..66fa3c5cc11edfb846d889aef30168213f4e1566 100644
--- a/Source/bindings/core/v8/ScriptDebugServer.cpp
+++ b/Source/bindings/core/v8/ScriptDebugServer.cpp
@@ -352,6 +352,11 @@ ScriptValue ScriptDebugServer::currentCallFramesInner(ScopeInfoDetails scopeDeta
return ScriptValue();
v8::HandleScope handleScope(m_isolate);
+ // Filter out stack traces entirely consisting of V8's internal scripts.
+ v8::Local<v8::StackTrace> stackTrace = v8::StackTrace::CurrentStackTrace(m_isolate, 1);
+ if (!stackTrace->GetFrameCount())
+ return ScriptValue();
+
RefPtrWillBeRawPtr<JavaScriptCallFrame> currentCallFrame = wrapCallFrames(0, scopeDetails);
if (!currentCallFrame)
return ScriptValue();
@@ -448,6 +453,13 @@ void ScriptDebugServer::v8DebugEventCallback(const v8::Debug::EventDetails& even
thisPtr->handleV8DebugEvent(eventDetails);
}
+static v8::Handle<v8::Value> callInternalGetterFunction(v8::Handle<v8::Object> object, const char* functionName, v8::Isolate* isolate)
+{
+ v8::Handle<v8::Value> getterValue = object->Get(v8AtomicString(isolate, functionName));
+ ASSERT(!getterValue.IsEmpty() && getterValue->IsFunction());
+ return V8ScriptRunner::callInternalFunction(v8::Handle<v8::Function>::Cast(getterValue), object, 0, 0, isolate);
+}
+
void ScriptDebugServer::handleV8DebugEvent(const v8::Debug::EventDetails& eventDetails)
{
v8::DebugEvent event = eventDetails.GetEvent();
@@ -458,7 +470,7 @@ void ScriptDebugServer::handleV8DebugEvent(const v8::Debug::EventDetails& eventD
return;
}
- if (event != v8::Break && event != v8::Exception && event != v8::AfterCompile && event != v8::BeforeCompile)
+ if (event != v8::AsyncTaskEvent && event != v8::Break && event != v8::Exception && event != v8::AfterCompile && event != v8::BeforeCompile)
return;
v8::Handle<v8::Context> eventContext = eventDetails.GetEventContext();
@@ -484,9 +496,7 @@ void ScriptDebugServer::handleV8DebugEvent(const v8::Debug::EventDetails& eventD
if (!stackTrace->GetFrameCount())
return;
v8::Handle<v8::Object> eventData = eventDetails.GetEventData();
- v8::Handle<v8::Value> exceptionGetterValue = eventData->Get(v8AtomicString(m_isolate, "exception"));
- ASSERT(!exceptionGetterValue.IsEmpty() && exceptionGetterValue->IsFunction());
- v8::Handle<v8::Value> exception = V8ScriptRunner::callInternalFunction(v8::Handle<v8::Function>::Cast(exceptionGetterValue), eventData, 0, 0, m_isolate);
+ v8::Handle<v8::Value> exception = callInternalGetterFunction(eventData, "exception", m_isolate);
handleProgramBreak(ScriptState::from(eventContext), eventDetails.GetExecutionState(), exception, v8::Handle<v8::Array>());
} else if (event == v8::Break) {
v8::Handle<v8::Function> getBreakpointNumbersFunction = v8::Local<v8::Function>::Cast(debuggerScript->Get(v8AtomicString(m_isolate, "getBreakpointNumbers")));
@@ -494,10 +504,31 @@ void ScriptDebugServer::handleV8DebugEvent(const v8::Debug::EventDetails& eventD
v8::Handle<v8::Value> hitBreakpoints = V8ScriptRunner::callInternalFunction(getBreakpointNumbersFunction, debuggerScript, WTF_ARRAY_LENGTH(argv), argv, m_isolate);
ASSERT(hitBreakpoints->IsArray());
handleProgramBreak(ScriptState::from(eventContext), eventDetails.GetExecutionState(), v8::Handle<v8::Value>(), hitBreakpoints.As<v8::Array>());
+ } else if (event == v8::AsyncTaskEvent) {
+ handleV8AsyncTaskEvent(listener, ScriptState::from(eventContext), eventDetails.GetExecutionState(), eventDetails.GetEventData());
}
}
}
+void ScriptDebugServer::handleV8AsyncTaskEvent(ScriptDebugListener* listener, ScriptState* pausedScriptState, v8::Handle<v8::Object> executionState, v8::Handle<v8::Object> eventData)
+{
+ String type = toCoreStringWithUndefinedOrNullCheck(callInternalGetterFunction(eventData, "type", m_isolate));
+ String name = toCoreStringWithUndefinedOrNullCheck(callInternalGetterFunction(eventData, "name", m_isolate));
+ int id = callInternalGetterFunction(eventData, "id", m_isolate)->ToInteger()->Value();
+
+ // FIXME: Remove when not needed.
+ if (name == "Promise.Resolved")
+ name = "Promise.resolve";
+ else if (name == "Promise.Rejected")
+ name = "Promise.reject";
+
+ m_pausedScriptState = pausedScriptState;
+ m_executionState = executionState;
+ listener->didReceiveV8AsyncTaskEvent(pausedScriptState->executionContext(), type, name, id);
+ m_pausedScriptState.clear();
+ m_executionState.Clear();
+}
+
void ScriptDebugServer::dispatchDidParseSource(ScriptDebugListener* listener, v8::Handle<v8::Object> object)
{
v8::Handle<v8::Value> id = object->Get(v8AtomicString(m_isolate, "id"));
« no previous file with comments | « Source/bindings/core/v8/ScriptDebugServer.h ('k') | Source/core/inspector/AsyncCallStackTracker.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698