summaryrefslogtreecommitdiffstats
path: root/WebCore/bindings/v8/V8ConsoleMessage.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'WebCore/bindings/v8/V8ConsoleMessage.cpp')
-rw-r--r--WebCore/bindings/v8/V8ConsoleMessage.cpp34
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