Index: third_party/WebKit/Source/platform/v8_inspector/V8ConsoleMessage.cpp |
diff --git a/third_party/WebKit/Source/platform/v8_inspector/V8ConsoleMessage.cpp b/third_party/WebKit/Source/platform/v8_inspector/V8ConsoleMessage.cpp |
index 3fcdf36d35c0c0a7da1d06be45e79ee76144d2de..e4c90838255a6080d1978b5a43fd8db96f874083 100644 |
--- a/third_party/WebKit/Source/platform/v8_inspector/V8ConsoleMessage.cpp |
+++ b/third_party/WebKit/Source/platform/v8_inspector/V8ConsoleMessage.cpp |
@@ -8,6 +8,7 @@ |
#include "platform/v8_inspector/V8ConsoleAgentImpl.h" |
#include "platform/v8_inspector/V8DebuggerImpl.h" |
#include "platform/v8_inspector/V8InspectorSessionImpl.h" |
+#include "platform/v8_inspector/V8RuntimeAgentImpl.h" |
#include "platform/v8_inspector/V8StackTraceImpl.h" |
#include "platform/v8_inspector/V8StringUtil.h" |
#include "platform/v8_inspector/public/V8DebuggerClient.h" |
@@ -61,7 +62,6 @@ String messageLevelValue(MessageLevel level) |
case WarningMessageLevel: return protocol::Console::ConsoleMessage::LevelEnum::Warning; |
case ErrorMessageLevel: return protocol::Console::ConsoleMessage::LevelEnum::Error; |
case InfoMessageLevel: return protocol::Console::ConsoleMessage::LevelEnum::Info; |
- case RevokedErrorMessageLevel: return protocol::Console::ConsoleMessage::LevelEnum::RevokedError; |
} |
return protocol::Console::ConsoleMessage::LevelEnum::Log; |
} |
@@ -198,7 +198,7 @@ private: |
} // namespace |
V8ConsoleMessage::V8ConsoleMessage( |
- double timestampMS, |
+ double timestamp, |
MessageSource source, |
MessageLevel level, |
const String16& message, |
@@ -208,7 +208,8 @@ V8ConsoleMessage::V8ConsoleMessage( |
std::unique_ptr<V8StackTrace> stackTrace, |
int scriptId, |
const String16& requestIdentifier) |
- : m_timestamp(timestampMS / 1000.0) |
+ : m_origin(V8MessageOrigin::kConsole) |
+ , m_timestamp(timestamp) |
, m_source(source) |
, m_level(level) |
, m_message(message) |
@@ -220,8 +221,8 @@ V8ConsoleMessage::V8ConsoleMessage( |
, m_requestIdentifier(requestIdentifier) |
, m_contextId(0) |
, m_type(LogMessageType) |
- , m_messageId(0) |
- , m_relatedMessageId(0) |
+ , m_exceptionId(0) |
+ , m_revokedExceptionId(0) |
{ |
} |
@@ -229,14 +230,15 @@ V8ConsoleMessage::~V8ConsoleMessage() |
{ |
} |
-std::unique_ptr<protocol::Console::ConsoleMessage> V8ConsoleMessage::buildInspectorObject(V8InspectorSessionImpl* session, bool generatePreview) const |
+void V8ConsoleMessage::reportToFrontend(protocol::Console::Frontend* frontend, V8InspectorSessionImpl* session, bool generatePreview) const |
{ |
+ DCHECK_EQ(V8MessageOrigin::kConsole, m_origin); |
std::unique_ptr<protocol::Console::ConsoleMessage> result = |
protocol::Console::ConsoleMessage::create() |
.setSource(messageSourceValue(m_source)) |
.setLevel(messageLevelValue(m_level)) |
.setText(m_message) |
- .setTimestamp(m_timestamp) |
+ .setTimestamp(m_timestamp / 1000) // TODO(dgozman): migrate this to milliseconds. |
.build(); |
result->setType(messageTypeValue(m_type)); |
result->setLine(static_cast<int>(m_lineNumber)); |
@@ -248,23 +250,21 @@ std::unique_ptr<protocol::Console::ConsoleMessage> V8ConsoleMessage::buildInspec |
result->setNetworkRequestId(m_requestIdentifier); |
if (m_contextId) |
result->setExecutionContextId(m_contextId); |
- appendArguments(result.get(), session, generatePreview); |
+ std::unique_ptr<protocol::Array<protocol::Runtime::RemoteObject>> args = wrapArguments(session, generatePreview); |
+ if (args) |
+ result->setParameters(std::move(args)); |
if (m_stackTrace) |
result->setStack(m_stackTrace->buildInspectorObject()); |
- if (m_messageId) |
- result->setMessageId(m_messageId); |
- if (m_relatedMessageId) |
- result->setRelatedMessageId(m_relatedMessageId); |
- return result; |
+ frontend->messageAdded(std::move(result)); |
} |
-void V8ConsoleMessage::appendArguments(protocol::Console::ConsoleMessage* result, V8InspectorSessionImpl* session, bool generatePreview) const |
+std::unique_ptr<protocol::Array<protocol::Runtime::RemoteObject>> V8ConsoleMessage::wrapArguments(V8InspectorSessionImpl* session, bool generatePreview) const |
{ |
if (!m_arguments.size() || !m_contextId) |
- return; |
+ return nullptr; |
InspectedContext* inspectedContext = session->debugger()->getContext(session->contextGroupId(), m_contextId); |
if (!inspectedContext) |
- return; |
+ return nullptr; |
v8::Isolate* isolate = inspectedContext->isolate(); |
v8::HandleScope handles(isolate); |
@@ -289,8 +289,57 @@ void V8ConsoleMessage::appendArguments(protocol::Console::ConsoleMessage* result |
args->addItem(std::move(wrapped)); |
} |
} |
- if (args) |
- result->setParameters(std::move(args)); |
+ return args; |
+} |
+ |
+void V8ConsoleMessage::reportToFrontend(protocol::Runtime::Frontend* frontend, V8InspectorSessionImpl* session, bool generatePreview) const |
+{ |
+ if (m_origin == V8MessageOrigin::kException) { |
+ // TODO(dgozman): unify with InjectedScript::createExceptionDetails. |
+ std::unique_ptr<protocol::Runtime::ExceptionDetails> details = protocol::Runtime::ExceptionDetails::create().setText(m_message).build(); |
+ details->setUrl(m_url); |
+ if (m_lineNumber) |
+ details->setLineNumber(static_cast<int>(m_lineNumber) - 1); |
+ if (m_columnNumber) |
+ details->setColumnNumber(static_cast<int>(m_columnNumber) - 1); |
+ if (m_scriptId) |
+ details->setScriptId(String::number(m_scriptId)); |
+ if (m_stackTrace) |
+ details->setStack(m_stackTrace->buildInspectorObject()); |
+ |
+ std::unique_ptr<protocol::Runtime::RemoteObject> exception = wrapException(session, generatePreview); |
+ |
+ if (exception) |
+ frontend->exceptionThrown(m_exceptionId, m_timestamp, std::move(details), std::move(exception), m_contextId); |
+ else |
+ frontend->exceptionThrown(m_exceptionId, m_timestamp, std::move(details)); |
+ return; |
+ } |
+ if (m_origin == V8MessageOrigin::kRevokedException) { |
+ frontend->exceptionRevoked(m_timestamp, m_message, m_revokedExceptionId); |
+ return; |
+ } |
+ NOTREACHED(); |
+} |
+ |
+std::unique_ptr<protocol::Runtime::RemoteObject> V8ConsoleMessage::wrapException(V8InspectorSessionImpl* session, bool generatePreview) const |
+{ |
+ if (!m_arguments.size() || !m_contextId) |
+ return nullptr; |
+ DCHECK_EQ(1u, m_arguments.size()); |
+ InspectedContext* inspectedContext = session->debugger()->getContext(session->contextGroupId(), m_contextId); |
+ if (!inspectedContext) |
+ return nullptr; |
+ |
+ v8::Isolate* isolate = inspectedContext->isolate(); |
+ v8::HandleScope handles(isolate); |
+ // TODO(dgozman): should we use different object group? |
+ return session->wrapObject(inspectedContext->context(), m_arguments[0]->Get(isolate), "console", generatePreview); |
+} |
+ |
+V8MessageOrigin V8ConsoleMessage::origin() const |
+{ |
+ return m_origin; |
} |
unsigned V8ConsoleMessage::argumentCount() const |
@@ -304,7 +353,7 @@ MessageType V8ConsoleMessage::type() const |
} |
// static |
-std::unique_ptr<V8ConsoleMessage> V8ConsoleMessage::createForConsoleAPI(double timestampMS, MessageType type, MessageLevel level, const String16& messageText, std::vector<v8::Local<v8::Value>>* arguments, std::unique_ptr<V8StackTrace> stackTrace, InspectedContext* context) |
+std::unique_ptr<V8ConsoleMessage> V8ConsoleMessage::createForConsoleAPI(double timestamp, MessageType type, MessageLevel level, const String16& messageText, std::vector<v8::Local<v8::Value>>* arguments, std::unique_ptr<V8StackTrace> stackTrace, InspectedContext* context) |
{ |
String16 url; |
unsigned lineNumber = 0; |
@@ -325,7 +374,7 @@ std::unique_ptr<V8ConsoleMessage> V8ConsoleMessage::createForConsoleAPI(double t |
actualMessage = V8ValueStringBuilder::toString(messageArguments.at(0)->Get(context->isolate()), context->isolate()); |
} |
- std::unique_ptr<V8ConsoleMessage> message = wrapUnique(new V8ConsoleMessage(timestampMS, ConsoleAPIMessageSource, level, actualMessage, url, lineNumber, columnNumber, std::move(stackTrace), 0 /* scriptId */, String16() /* requestIdentifier */)); |
+ std::unique_ptr<V8ConsoleMessage> message = wrapUnique(new V8ConsoleMessage(timestamp, ConsoleAPIMessageSource, level, actualMessage, url, lineNumber, columnNumber, std::move(stackTrace), 0 /* scriptId */, String16() /* requestIdentifier */)); |
message->m_type = type; |
if (messageArguments.size()) { |
message->m_contextId = context->contextId(); |
@@ -336,6 +385,28 @@ std::unique_ptr<V8ConsoleMessage> V8ConsoleMessage::createForConsoleAPI(double t |
return message; |
} |
+// static |
+std::unique_ptr<V8ConsoleMessage> V8ConsoleMessage::createForException(double timestamp, const String16& messageText, const String16& url, unsigned lineNumber, unsigned columnNumber, std::unique_ptr<V8StackTrace> stackTrace, int scriptId, v8::Isolate* isolate, int contextId, v8::Local<v8::Value> exception, unsigned exceptionId) |
+{ |
+ std::unique_ptr<V8ConsoleMessage> message = wrapUnique(new V8ConsoleMessage(timestamp, JSMessageSource, ErrorMessageLevel, messageText, url, lineNumber, columnNumber, std::move(stackTrace), scriptId, String16() /* requestIdentifier */)); |
+ message->m_exceptionId = exceptionId; |
+ message->m_origin = V8MessageOrigin::kException; |
+ if (contextId && !exception.IsEmpty()) { |
+ message->m_contextId = contextId; |
+ message->m_arguments.push_back(wrapUnique(new v8::Global<v8::Value>(isolate, exception))); |
+ } |
+ return message; |
+} |
+ |
+// static |
+std::unique_ptr<V8ConsoleMessage> V8ConsoleMessage::createForRevokedException(double timestamp, const String16& messageText, unsigned revokedExceptionId) |
+{ |
+ std::unique_ptr<V8ConsoleMessage> message = wrapUnique(new V8ConsoleMessage(timestamp, JSMessageSource, ErrorMessageLevel, messageText, String16(), 0, 0, nullptr, 0, String16())); |
+ message->m_origin = V8MessageOrigin::kRevokedException; |
+ message->m_revokedExceptionId = revokedExceptionId; |
+ return message; |
+} |
+ |
void V8ConsoleMessage::contextDestroyed(int contextId) |
{ |
if (contextId != m_contextId) |
@@ -347,25 +418,6 @@ void V8ConsoleMessage::contextDestroyed(int contextId) |
m_arguments.swap(empty); |
} |
-void V8ConsoleMessage::assignId(unsigned id) |
-{ |
- m_messageId = id; |
-} |
- |
-void V8ConsoleMessage::assignRelatedId(unsigned id) |
-{ |
- m_relatedMessageId = id; |
-} |
- |
-void V8ConsoleMessage::addArguments(v8::Isolate* isolate, int contextId, std::vector<v8::Local<v8::Value>>* arguments) |
-{ |
- if (!arguments || !contextId) |
- return; |
- m_contextId = contextId; |
- for (size_t i = 0; i < arguments->size(); ++i) |
- m_arguments.push_back(wrapUnique(new v8::Global<v8::Value>(isolate, arguments->at(i)))); |
-} |
- |
// ------------------------ V8ConsoleMessageStorage ---------------------------- |
V8ConsoleMessageStorage::V8ConsoleMessageStorage(V8DebuggerImpl* debugger, int contextGroupId) |
@@ -386,8 +438,12 @@ void V8ConsoleMessageStorage::addMessage(std::unique_ptr<V8ConsoleMessage> messa |
clear(); |
V8InspectorSessionImpl* session = m_debugger->sessionForContextGroup(m_contextGroupId); |
- if (session) |
- session->consoleAgent()->messageAdded(message.get()); |
+ if (session) { |
+ if (message->origin() == V8MessageOrigin::kConsole) |
+ session->consoleAgent()->messageAdded(message.get()); |
+ else |
+ session->runtimeAgent()->exceptionMessageAdded(message.get()); |
+ } |
DCHECK(m_messages.size() <= maxConsoleMessageCount); |
if (m_messages.size() == maxConsoleMessageCount) { |