Index: third_party/WebKit/Source/core/inspector/InspectorLogAgent.cpp |
diff --git a/third_party/WebKit/Source/core/inspector/InspectorLogAgent.cpp b/third_party/WebKit/Source/core/inspector/InspectorLogAgent.cpp |
new file mode 100644 |
index 0000000000000000000000000000000000000000..b3d801a96577f4dcefe13e65a88324c907809760 |
--- /dev/null |
+++ b/third_party/WebKit/Source/core/inspector/InspectorLogAgent.cpp |
@@ -0,0 +1,149 @@ |
+// Copyright 2016 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "core/inspector/InspectorLogAgent.h" |
+ |
+#include "bindings/core/v8/SourceLocation.h" |
+#include "core/inspector/ConsoleMessage.h" |
+#include "core/inspector/ConsoleMessageStorage.h" |
+#include "core/inspector/IdentifiersFactory.h" |
+ |
+namespace blink { |
+ |
+namespace LogAgentState { |
+static const char logEnabled[] = "logEnabled"; |
+} |
+ |
+namespace { |
+ |
+String messageSourceValue(MessageSource source) |
+{ |
+ DCHECK(source != ConsoleAPIMessageSource); |
+ switch (source) { |
+ case XMLMessageSource: return protocol::Log::LogMessage::SourceEnum::Xml; |
+ case JSMessageSource: return protocol::Log::LogMessage::SourceEnum::Javascript; |
+ case NetworkMessageSource: return protocol::Log::LogMessage::SourceEnum::Network; |
+ case StorageMessageSource: return protocol::Log::LogMessage::SourceEnum::Storage; |
+ case AppCacheMessageSource: return protocol::Log::LogMessage::SourceEnum::Appcache; |
+ case RenderingMessageSource: return protocol::Log::LogMessage::SourceEnum::Rendering; |
+ case SecurityMessageSource: return protocol::Log::LogMessage::SourceEnum::Security; |
+ case OtherMessageSource: return protocol::Log::LogMessage::SourceEnum::Other; |
+ case DeprecationMessageSource: return protocol::Log::LogMessage::SourceEnum::Deprecation; |
+ case WorkerMessageSource: return protocol::Log::LogMessage::SourceEnum::Worker; |
+ default: return protocol::Log::LogMessage::SourceEnum::Other; |
+ } |
+} |
+ |
+String messageLevelValue(MessageLevel level) |
+{ |
+ switch (level) { |
+ case DebugMessageLevel: return protocol::Log::LogMessage::LevelEnum::Debug; |
+ case LogMessageLevel: return protocol::Log::LogMessage::LevelEnum::Log; |
+ case WarningMessageLevel: return protocol::Log::LogMessage::LevelEnum::Warning; |
+ case ErrorMessageLevel: return protocol::Log::LogMessage::LevelEnum::Error; |
+ case InfoMessageLevel: return protocol::Log::LogMessage::LevelEnum::Info; |
+ } |
+ return protocol::Log::LogMessage::LevelEnum::Log; |
+} |
+ |
+} // namespace |
+ |
+InspectorLogAgent::InspectorLogAgent(ConsoleMessageStorage* storage) |
+ : m_enabled(false) |
+ , m_storage(storage) |
+{ |
+} |
+ |
+InspectorLogAgent::~InspectorLogAgent() |
+{ |
+} |
+ |
+DEFINE_TRACE(InspectorLogAgent) |
+{ |
+ visitor->trace(m_storage); |
+ InspectorBaseAgent::trace(visitor); |
+} |
+ |
+void InspectorLogAgent::restore() |
+{ |
+ if (!m_state->booleanProperty(LogAgentState::logEnabled, false)) |
+ return; |
+ ErrorString ignored; |
+ enable(&ignored); |
+} |
+ |
+void InspectorLogAgent::consoleMessageAdded(ConsoleMessage* message) |
+{ |
+ DCHECK(m_enabled); |
+ |
+ // TODO(dgozman): migrate location to Runtime, move this code to V8SourceLocation::buildInspectorObject. |
+ std::unique_ptr<protocol::Log::Location> location = protocol::Log::Location::create().build(); |
+ if (!message->location()->url().isEmpty()) |
+ location->setUrl(message->location()->url()); |
+ std::unique_ptr<protocol::Runtime::StackTrace> stackTrace = message->location()->buildInspectorObject(); |
+ if (stackTrace) |
+ location->setStackTrace(std::move(stackTrace)); |
+ if (message->location()->lineNumber()) |
+ location->setLineNumber(message->location()->lineNumber() - 1); |
+ if (message->location()->columnNumber()) |
+ location->setColumnNumber(message->location()->columnNumber() - 1); |
+ if (message->location()->scriptId()) |
+ location->setScriptId(String::number(message->location()->scriptId())); |
+ |
+ std::unique_ptr<protocol::Log::LogMessage> result = |
+ protocol::Log::LogMessage::create() |
+ .setSource(messageSourceValue(message->source())) |
+ .setLevel(messageLevelValue(message->level())) |
+ .setText(message->message()) |
+ .setTimestamp(message->timestamp()) |
+ .setLocation(std::move(location)) |
+ .build(); |
+ |
+ if (message->source() == WorkerMessageSource && !message->workerId().isEmpty()) |
+ result->setWorkerId(message->workerId()); |
+ if (message->source() == NetworkMessageSource && message->requestIdentifier()) |
+ result->setNetworkRequestId(IdentifiersFactory::requestId(message->requestIdentifier())); |
+ |
+ frontend()->messageLogged(std::move(result)); |
+ frontend()->flush(); |
+} |
+ |
+void InspectorLogAgent::enable(ErrorString*) |
+{ |
+ if (m_enabled) |
+ return; |
+ m_instrumentingAgents->addInspectorLogAgent(this); |
+ m_state->setBoolean(LogAgentState::logEnabled, true); |
+ m_enabled = true; |
+ |
+ if (m_storage->expiredCount()) { |
+ std::unique_ptr<protocol::Log::LogMessage> expired = protocol::Log::LogMessage::create() |
+ .setSource(protocol::Log::LogMessage::SourceEnum::Other) |
+ .setLevel(protocol::Log::LogMessage::LevelEnum::Warning) |
+ .setText(String::number(m_storage->expiredCount()) + String(" log messages are not shown.")) |
+ .setTimestamp(0) |
+ .setLocation(protocol::Log::Location::create().setLineNumber(0).setColumnNumber(0).setUrl("").build()) |
+ .build(); |
+ frontend()->messageLogged(std::move(expired)); |
+ frontend()->flush(); |
+ } |
+ for (size_t i = 0; i < m_storage->size(); ++i) |
+ consoleMessageAdded(m_storage->at(i)); |
+} |
+ |
+void InspectorLogAgent::disable(ErrorString*) |
+{ |
+ if (!m_enabled) |
+ return; |
+ m_state->setBoolean(LogAgentState::logEnabled, false); |
+ m_enabled = false; |
+ m_instrumentingAgents->removeInspectorLogAgent(this); |
+} |
+ |
+void InspectorLogAgent::clear(ErrorString*) |
+{ |
+ m_storage->clear(); |
+} |
+ |
+} // namespace blink |