Index: Source/bindings/core/v8/V8Initializer.cpp |
diff --git a/Source/bindings/core/v8/V8Initializer.cpp b/Source/bindings/core/v8/V8Initializer.cpp |
index 3e3157b30eea1a0a7b7052b561545c2c3e07bf16..552f93ef7f021b4fa284135b312a91fe3a6cac7d 100644 |
--- a/Source/bindings/core/v8/V8Initializer.cpp |
+++ b/Source/bindings/core/v8/V8Initializer.cpp |
@@ -158,7 +158,23 @@ static void messageHandlerInMainThread(v8::Handle<v8::Message> message, v8::Hand |
} |
} |
-typedef WillBeHeapDeque<ScriptValue> PromiseRejectMessageQueue; |
+namespace { |
+ |
+class PromiseRejectMessage { |
+public: |
+ PromiseRejectMessage(const ScriptValue& promise, PassRefPtrWillBeRawPtr<ScriptCallStack> callStack) |
+ : m_promise(promise) |
+ , m_callStack(callStack) |
+ { |
+ } |
+ |
+ const ScriptValue m_promise; |
+ const RefPtrWillBeMember<ScriptCallStack> m_callStack; |
+}; |
+ |
+} // namespace |
+ |
+typedef WillBeHeapDeque<PromiseRejectMessage> PromiseRejectMessageQueue; |
static PromiseRejectMessageQueue& promiseRejectMessageQueue() |
{ |
@@ -172,14 +188,14 @@ void V8Initializer::reportRejectedPromises() |
PromiseRejectMessageQueue& queue = promiseRejectMessageQueue(); |
while (!queue.isEmpty()) { |
- ScriptValue promise = queue.takeFirst(); |
- ScriptState* scriptState = promise.scriptState(); |
+ PromiseRejectMessage message = queue.takeFirst(); |
+ ScriptState* scriptState = message.m_promise.scriptState(); |
if (!scriptState->contextIsValid()) |
continue; |
ScriptState::Scope scope(scriptState); |
- ASSERT(!promise.isEmpty()); |
- v8::Handle<v8::Value> value = promise.v8Value(); |
+ ASSERT(!message.m_promise.isEmpty()); |
+ v8::Handle<v8::Value> value = message.m_promise.v8Value(); |
ASSERT(!value.IsEmpty() && value->IsPromise()); |
if (v8::Handle<v8::Promise>::Cast(value)->HasHandler()) |
continue; |
@@ -191,11 +207,12 @@ void V8Initializer::reportRejectedPromises() |
const String errorMessage = "Unhandled promise rejection"; |
Vector<ScriptValue> args; |
args.append(ScriptValue(scriptState, v8String(scriptState->isolate(), errorMessage))); |
- args.append(promise); |
+ args.append(message.m_promise); |
RefPtrWillBeRawPtr<ScriptArguments> arguments = ScriptArguments::create(scriptState, args); |
- RefPtrWillBeRawPtr<ConsoleMessage> consoleMessage = ConsoleMessage::create(JSMessageSource, ErrorMessageLevel, errorMessage, "", 0); |
+ RefPtrWillBeRawPtr<ConsoleMessage> consoleMessage = ConsoleMessage::create(JSMessageSource, ErrorMessageLevel, errorMessage); |
consoleMessage->setScriptArguments(arguments); |
+ consoleMessage->setCallStack(message.m_callStack); |
executionContext->addConsoleMessage(consoleMessage.release()); |
} |
} |
@@ -226,8 +243,13 @@ static void promiseRejectHandlerInMainThread(v8::PromiseRejectMessage message) |
if (!toFrameIfNotDetached(context)) |
return; |
+ RefPtrWillBeRawPtr<ScriptCallStack> callStack = nullptr; |
+ v8::Handle<v8::StackTrace> stackTrace = message.GetStackTrace(); |
+ if (!stackTrace.IsEmpty() && stackTrace->GetFrameCount() > 0) |
+ callStack = createScriptCallStack(stackTrace, ScriptCallStack::maxCallStackSizeToCapture, isolate); |
+ |
ScriptState* scriptState = ScriptState::from(context); |
- promiseRejectMessageQueue().append(ScriptValue(scriptState, promise)); |
+ promiseRejectMessageQueue().append(PromiseRejectMessage(ScriptValue(scriptState, promise), callStack)); |
} |
static void failedAccessCheckCallbackInMainThread(v8::Local<v8::Object> host, v8::AccessType type, v8::Local<v8::Value> data) |