diff options
Diffstat (limited to 'WebCore/bindings/v8/V8ConsoleMessage.cpp')
-rw-r--r-- | WebCore/bindings/v8/V8ConsoleMessage.cpp | 34 |
1 files changed, 25 insertions, 9 deletions
diff --git a/WebCore/bindings/v8/V8ConsoleMessage.cpp b/WebCore/bindings/v8/V8ConsoleMessage.cpp index d9fe069..8b6bb17 100644 --- a/WebCore/bindings/v8/V8ConsoleMessage.cpp +++ b/WebCore/bindings/v8/V8ConsoleMessage.cpp @@ -36,6 +36,7 @@ #include "Frame.h" #include "OwnPtr.h" #include "Page.h" +#include "ScriptCallStack.h" #include "V8Binding.h" #include "V8Proxy.h" @@ -52,14 +53,7 @@ V8ConsoleMessage::V8ConsoleMessage(const String& string, const String& sourceID, void V8ConsoleMessage::dispatchNow(Page* page) { - ASSERT(page); - - // Process any delayed messages to make sure that messages - // appear in the right order in the console. - processDelayed(); - - Console* console = page->mainFrame()->domWindow()->console(); - console->addMessage(JSMessageSource, LogMessageType, ErrorMessageLevel, m_string, m_lineNumber, m_sourceID); + dispatchNow(page, 0); } void V8ConsoleMessage::dispatchLater() @@ -118,11 +112,33 @@ void V8ConsoleMessage::handler(v8::Handle<v8::Message> message, v8::Handle<v8::V ASSERT(!errorMessageString.IsEmpty()); String errorMessage = toWebCoreString(errorMessageString); + v8::Handle<v8::StackTrace> stackTrace = message->GetStackTrace(); + OwnPtr<ScriptCallStack> callStack; + // Currently stack trace is only collected when inspector is open. + if (!stackTrace.IsEmpty() && stackTrace->GetFrameCount() > 0) { + v8::Local<v8::Context> context = v8::Context::GetEntered(); + ScriptState* scriptState = ScriptState::forContext(context); + callStack = ScriptCallStack::create(scriptState, stackTrace); + } + v8::Handle<v8::Value> resourceName = message->GetScriptResourceName(); bool useURL = resourceName.IsEmpty() || !resourceName->IsString(); String resourceNameString = useURL ? frame->document()->url() : toWebCoreString(resourceName); V8ConsoleMessage consoleMessage(errorMessage, resourceNameString, message->GetLineNumber()); - consoleMessage.dispatchNow(page); + consoleMessage.dispatchNow(page, callStack.get()); +} + +void V8ConsoleMessage::dispatchNow(Page* page, ScriptCallStack* callStack) +{ + ASSERT(page); + + // Process any delayed messages to make sure that messages + // appear in the right order in the console. + processDelayed(); + + Console* console = page->mainFrame()->domWindow()->console(); + MessageType messageType = callStack ? UncaughtExceptionMessageType : LogMessageType; + console->addMessage(JSMessageSource, messageType, ErrorMessageLevel, m_string, m_lineNumber, m_sourceID, callStack); } } // namespace WebCore |