Chromium Code Reviews| Index: Source/core/inspector/InspectorConsoleAgent.cpp |
| diff --git a/Source/core/inspector/InspectorConsoleAgent.cpp b/Source/core/inspector/InspectorConsoleAgent.cpp |
| index 33e3328f128a6d3186ca5056e2b96cbc0b6af137..f4e4ebab6b42dd98cefcc53ec1cc2b58d665edce 100644 |
| --- a/Source/core/inspector/InspectorConsoleAgent.cpp |
| +++ b/Source/core/inspector/InspectorConsoleAgent.cpp |
| @@ -32,19 +32,23 @@ |
| #include "core/frame/LocalFrame.h" |
| #include "core/frame/UseCounter.h" |
| #include "core/inspector/ConsoleMessage.h" |
| +#include "core/inspector/ConsoleMessageStorage.h" |
| +#include "core/inspector/IdentifiersFactory.h" |
| +#include "core/inspector/InjectedScript.h" |
| #include "core/inspector/InjectedScriptHost.h" |
| #include "core/inspector/InjectedScriptManager.h" |
| -#include "core/inspector/InspectorConsoleMessage.h" |
| #include "core/inspector/InspectorState.h" |
| #include "core/inspector/InspectorTimelineAgent.h" |
| #include "core/inspector/InspectorTracingAgent.h" |
| #include "core/inspector/InstrumentingAgents.h" |
| #include "core/inspector/ScriptArguments.h" |
| +#include "core/inspector/ScriptAsyncCallStack.h" |
| #include "core/inspector/ScriptCallFrame.h" |
| #include "core/inspector/ScriptCallStack.h" |
| #include "core/loader/DocumentLoader.h" |
| #include "core/page/Page.h" |
| #include "core/workers/WorkerGlobalScopeProxy.h" |
| +#include "core/xml/XMLHttpRequest.h" |
| #include "platform/network/ResourceError.h" |
| #include "platform/network/ResourceResponse.h" |
| #include "wtf/CurrentTime.h" |
| @@ -55,9 +59,6 @@ |
| namespace blink { |
| -static const unsigned maximumConsoleMessages = 1000; |
| -static const int expireConsoleMessagesStep = 100; |
| - |
| namespace ConsoleAgentState { |
| static const char monitoringXHR[] = "monitoringXHR"; |
| static const char consoleMessagesEnabled[] = "consoleMessagesEnabled"; |
| @@ -72,7 +73,6 @@ InspectorConsoleAgent::InspectorConsoleAgent(InspectorTimelineAgent* timelineAge |
| , m_tracingAgent(tracingAgent) |
| , m_injectedScriptManager(injectedScriptManager) |
| , m_frontend(0) |
| - , m_expiredConsoleMessageCount(0) |
| , m_enabled(false) |
| { |
| } |
| @@ -108,15 +108,16 @@ void InspectorConsoleAgent::enable(ErrorString*) |
| m_state->setBoolean(ConsoleAgentState::consoleMessagesEnabled, true); |
| - if (m_expiredConsoleMessageCount) { |
| - InspectorConsoleMessage expiredMessage(OtherMessageSource, LogMessageType, WarningMessageLevel, String::format("%d console messages are not shown.", m_expiredConsoleMessageCount)); |
| - expiredMessage.setTimestamp(0); |
| - expiredMessage.addToFrontend(m_frontend, m_injectedScriptManager, false); |
| + ConsoleMessageStorage* storage = messageStorage(); |
| + if (storage->expiredCount()) { |
| + RefPtr<ConsoleMessage> expiredMessage = ConsoleMessage::create(OtherMessageSource, WarningMessageLevel, String::format("%d console messages are not shown.", storage->expiredCount())); |
| + expiredMessage->setTimestamp(0); |
| + sendConsoleMessageToFrontend(expiredMessage.get(), false); |
| } |
| - size_t messageCount = m_consoleMessages.size(); |
| + size_t messageCount = storage->size(); |
| for (size_t i = 0; i < messageCount; ++i) |
| - m_consoleMessages[i]->addToFrontend(m_frontend, m_injectedScriptManager, false); |
| + sendConsoleMessageToFrontend(storage->at(i).get(), false); |
| } |
| void InspectorConsoleAgent::disable(ErrorString*) |
| @@ -132,8 +133,7 @@ void InspectorConsoleAgent::disable(ErrorString*) |
| void InspectorConsoleAgent::clearMessages(ErrorString*) |
| { |
| - m_consoleMessages.clear(); |
| - m_expiredConsoleMessageCount = 0; |
| + messageStorage()->clear(); |
| m_injectedScriptManager->releaseObjectGroup("console"); |
| if (m_frontend && m_enabled) |
| m_frontend->messagesCleared(); |
| @@ -175,35 +175,20 @@ void InspectorConsoleAgent::addMessageToConsole(ConsoleMessage* consoleMessage) |
| clearMessages(&error); |
|
vsevik
2014/08/27 09:13:21
This code belongs to console message storage, we s
kozyatinskiy1
2014/08/27 12:01:27
I will move it in a separate patch.
|
| } |
| - InspectorConsoleMessage* message; |
| - if (consoleMessage->source() == ConsoleAPIMessageSource) { |
| - message = new InspectorConsoleMessage(consoleMessage->source(), consoleMessage->type(), consoleMessage->level(), consoleMessage->message(), consoleMessage->scriptArguments(), consoleMessage->scriptState()); |
| - } else if (consoleMessage->callStack()) { |
| - message = new InspectorConsoleMessage(consoleMessage->source(), LogMessageType, consoleMessage->level(), consoleMessage->message(), consoleMessage->callStack(), consoleMessage->requestIdentifier()); |
| - } else { |
| - bool shouldGenerateCallStack = m_frontend; |
| - message = new InspectorConsoleMessage(shouldGenerateCallStack, consoleMessage->source(), LogMessageType, consoleMessage->level(), consoleMessage->message(), consoleMessage->url(), consoleMessage->lineNumber(), consoleMessage->columnNumber(), consoleMessage->scriptState(), consoleMessage->requestIdentifier()); |
| - } |
| - message->setWorkerGlobalScopeProxy(consoleMessage->workerId()); |
| - addConsoleMessage(adoptPtr(message)); |
| + if (m_frontend && m_enabled) |
| + sendConsoleMessageToFrontend(consoleMessage, true); |
| } |
| void InspectorConsoleAgent::adoptWorkerConsoleMessages(WorkerGlobalScopeProxy* proxy) |
|
vsevik
2014/08/27 09:13:21
This method belongs to console message storage. We
kozyatinskiy1
2014/08/27 12:01:27
Acknowledged.
|
| { |
| - for (size_t i = 0; i < m_consoleMessages.size(); i++) { |
| - if (m_consoleMessages[i]->workerGlobalScopeProxy() == proxy) |
| - m_consoleMessages[i]->setWorkerGlobalScopeProxy(nullptr); |
| + ConsoleMessageStorage* storage = messageStorage(); |
| + size_t messageCount = storage->size(); |
| + for (size_t i = 0; i < messageCount; ++i) { |
| + if (storage->at(i)->workerGlobalScopeProxy() == proxy) |
| + storage->at(i)->setWorkerGlobalScopeProxy(nullptr); |
| } |
| } |
| -Vector<unsigned> InspectorConsoleAgent::consoleMessageArgumentCounts() |
| -{ |
| - Vector<unsigned> result(m_consoleMessages.size()); |
| - for (size_t i = 0; i < m_consoleMessages.size(); i++) |
| - result[i] = m_consoleMessages[i]->argumentCount(); |
| - return result; |
| -} |
| - |
| void InspectorConsoleAgent::consoleTime(ExecutionContext*, const String& title) |
| { |
| // Follow Firebug's behavior of requiring a title that is not null or |
| @@ -234,7 +219,7 @@ void InspectorConsoleAgent::consoleTimeEnd(ExecutionContext*, const String& titl |
| RefPtrWillBeRawPtr<ConsoleMessage> consoleMessage = ConsoleMessage::create(ConsoleAPIMessageSource, DebugMessageLevel, message); |
| consoleMessage->setType(LogMessageType); |
| consoleMessage->setScriptState(scriptState); |
| - addMessageToConsole(consoleMessage.get()); |
| + messageStorage()->reportMessage(consoleMessage.release()); |
| } |
| void InspectorConsoleAgent::setTracingBasedTimeline(ErrorString*, bool enabled) |
| @@ -276,14 +261,11 @@ void InspectorConsoleAgent::consoleCount(ScriptState* scriptState, PassRefPtrWil |
| RefPtrWillBeRawPtr<ConsoleMessage> consoleMessage = ConsoleMessage::create(ConsoleAPIMessageSource, DebugMessageLevel, message); |
| consoleMessage->setType(LogMessageType); |
| consoleMessage->setScriptState(scriptState); |
| - addMessageToConsole(consoleMessage.get()); |
| + messageStorage()->reportMessage(consoleMessage.release()); |
| } |
| void InspectorConsoleAgent::frameWindowDiscarded(LocalDOMWindow* window) |
| { |
| - size_t messageCount = m_consoleMessages.size(); |
| - for (size_t i = 0; i < messageCount; ++i) |
| - m_consoleMessages[i]->windowCleared(window); |
| m_injectedScriptManager->discardInjectedScriptsFor(window); |
| } |
| @@ -294,13 +276,13 @@ void InspectorConsoleAgent::didCommitLoad(LocalFrame* frame, DocumentLoader* loa |
| reset(); |
| } |
| -void InspectorConsoleAgent::didFinishXHRLoading(XMLHttpRequest*, ThreadableLoaderClient*, unsigned long requestIdentifier, ScriptString, const AtomicString& method, const String& url, const String& sendURL, unsigned sendLineNumber) |
| +void InspectorConsoleAgent::didFinishXHRLoading(XMLHttpRequest* request, ThreadableLoaderClient*, unsigned long requestIdentifier, ScriptString, const AtomicString& method, const String& url, const String& sendURL, unsigned sendLineNumber) |
|
vsevik
2014/08/27 09:13:21
request is unused, why did you add it?
kozyatinskiy1
2014/08/27 12:01:27
Removed.
|
| { |
| if (m_frontend && m_state->getBoolean(ConsoleAgentState::monitoringXHR)) { |
| String message = "XHR finished loading: " + method + " \"" + url + "\"."; |
| RefPtrWillBeRawPtr<ConsoleMessage> consoleMessage = ConsoleMessage::create(NetworkMessageSource, DebugMessageLevel, message, sendURL, sendLineNumber); |
| consoleMessage->setRequestIdentifier(requestIdentifier); |
| - addMessageToConsole(consoleMessage.get()); |
| + messageStorage()->reportMessage(consoleMessage.release()); |
| } |
| } |
| @@ -312,7 +294,7 @@ void InspectorConsoleAgent::didReceiveResourceResponse(LocalFrame*, unsigned lon |
| String message = "Failed to load resource: the server responded with a status of " + String::number(response.httpStatusCode()) + " (" + response.httpStatusText() + ')'; |
| RefPtrWillBeRawPtr<ConsoleMessage> consoleMessage = ConsoleMessage::create(NetworkMessageSource, ErrorMessageLevel, message, response.url().string()); |
| consoleMessage->setRequestIdentifier(requestIdentifier); |
| - addMessageToConsole(consoleMessage.get()); |
| + messageStorage()->reportMessage(consoleMessage.release()); |
| } |
| } |
| @@ -328,7 +310,7 @@ void InspectorConsoleAgent::didFailLoading(unsigned long requestIdentifier, cons |
| } |
| RefPtrWillBeRawPtr<ConsoleMessage> consoleMessage = ConsoleMessage::create(NetworkMessageSource, ErrorMessageLevel, message.toString(), error.failingURL()); |
| consoleMessage->setRequestIdentifier(requestIdentifier); |
| - addMessageToConsole(consoleMessage.get()); |
| + messageStorage()->reportMessage(consoleMessage.release()); |
| } |
| void InspectorConsoleAgent::setMonitoringXHREnabled(ErrorString*, bool enabled) |
| @@ -336,19 +318,109 @@ void InspectorConsoleAgent::setMonitoringXHREnabled(ErrorString*, bool enabled) |
| m_state->setBoolean(ConsoleAgentState::monitoringXHR, enabled); |
| } |
| -void InspectorConsoleAgent::addConsoleMessage(PassOwnPtr<InspectorConsoleMessage> consoleMessage) |
| +static TypeBuilder::Console::ConsoleMessage::Source::Enum messageSourceValue(MessageSource source) |
| { |
| - ASSERT_ARG(consoleMessage, consoleMessage); |
| + switch (source) { |
| + case XMLMessageSource: return TypeBuilder::Console::ConsoleMessage::Source::Xml; |
| + case JSMessageSource: return TypeBuilder::Console::ConsoleMessage::Source::Javascript; |
| + case NetworkMessageSource: return TypeBuilder::Console::ConsoleMessage::Source::Network; |
| + case ConsoleAPIMessageSource: return TypeBuilder::Console::ConsoleMessage::Source::Console_api; |
| + case StorageMessageSource: return TypeBuilder::Console::ConsoleMessage::Source::Storage; |
| + case AppCacheMessageSource: return TypeBuilder::Console::ConsoleMessage::Source::Appcache; |
| + case RenderingMessageSource: return TypeBuilder::Console::ConsoleMessage::Source::Rendering; |
| + case CSSMessageSource: return TypeBuilder::Console::ConsoleMessage::Source::Css; |
| + case SecurityMessageSource: return TypeBuilder::Console::ConsoleMessage::Source::Security; |
| + case OtherMessageSource: return TypeBuilder::Console::ConsoleMessage::Source::Other; |
| + case DeprecationMessageSource: return TypeBuilder::Console::ConsoleMessage::Source::Deprecation; |
| + } |
| + return TypeBuilder::Console::ConsoleMessage::Source::Other; |
| +} |
| - if (m_frontend && m_enabled) |
| - consoleMessage->addToFrontend(m_frontend, m_injectedScriptManager, true); |
| - m_consoleMessages.append(consoleMessage); |
| +static TypeBuilder::Console::ConsoleMessage::Type::Enum messageTypeValue(MessageType type) |
| +{ |
| + switch (type) { |
| + case LogMessageType: return TypeBuilder::Console::ConsoleMessage::Type::Log; |
| + case ClearMessageType: return TypeBuilder::Console::ConsoleMessage::Type::Clear; |
| + case DirMessageType: return TypeBuilder::Console::ConsoleMessage::Type::Dir; |
| + case DirXMLMessageType: return TypeBuilder::Console::ConsoleMessage::Type::Dirxml; |
| + case TableMessageType: return TypeBuilder::Console::ConsoleMessage::Type::Table; |
| + case TraceMessageType: return TypeBuilder::Console::ConsoleMessage::Type::Trace; |
| + case StartGroupMessageType: return TypeBuilder::Console::ConsoleMessage::Type::StartGroup; |
| + case StartGroupCollapsedMessageType: return TypeBuilder::Console::ConsoleMessage::Type::StartGroupCollapsed; |
| + case EndGroupMessageType: return TypeBuilder::Console::ConsoleMessage::Type::EndGroup; |
| + case AssertMessageType: return TypeBuilder::Console::ConsoleMessage::Type::Assert; |
| + } |
| + return TypeBuilder::Console::ConsoleMessage::Type::Log; |
| +} |
| + |
| +static TypeBuilder::Console::ConsoleMessage::Level::Enum messageLevelValue(MessageLevel level) |
| +{ |
| + switch (level) { |
| + case DebugMessageLevel: return TypeBuilder::Console::ConsoleMessage::Level::Debug; |
| + case LogMessageLevel: return TypeBuilder::Console::ConsoleMessage::Level::Log; |
| + case WarningMessageLevel: return TypeBuilder::Console::ConsoleMessage::Level::Warning; |
| + case ErrorMessageLevel: return TypeBuilder::Console::ConsoleMessage::Level::Error; |
| + case InfoMessageLevel: return TypeBuilder::Console::ConsoleMessage::Level::Info; |
| + } |
| + return TypeBuilder::Console::ConsoleMessage::Level::Log; |
| +} |
| - if (!m_frontend && m_consoleMessages.size() >= maximumConsoleMessages) { |
| - m_expiredConsoleMessageCount += expireConsoleMessagesStep; |
| - m_consoleMessages.remove(0, expireConsoleMessagesStep); |
| +void InspectorConsoleAgent::sendConsoleMessageToFrontend(ConsoleMessage* consoleMessage, bool generatePreview) |
| +{ |
| + if (consoleMessage->workerGlobalScopeProxy()) |
| + return; |
| + |
| + RefPtr<TypeBuilder::Console::ConsoleMessage> jsonObj = TypeBuilder::Console::ConsoleMessage::create() |
| + .setSource(messageSourceValue(consoleMessage->source())) |
| + .setLevel(messageLevelValue(consoleMessage->level())) |
| + .setText(consoleMessage->message()) |
| + .setTimestamp(consoleMessage->timestamp()); |
| + // FIXME: only send out type for ConsoleAPI source messages. |
| + jsonObj->setType(messageTypeValue(consoleMessage->type())); |
| + jsonObj->setLine(static_cast<int>(consoleMessage->lineNumber())); |
| + jsonObj->setColumn(static_cast<int>(consoleMessage->columnNumber())); |
| + jsonObj->setUrl(consoleMessage->url()); |
| + ScriptState* scriptState = consoleMessage->scriptState(); |
| + if (scriptState) |
| + jsonObj->setExecutionContextId(m_injectedScriptManager->injectedScriptIdFor(scriptState)); |
| + if (consoleMessage->source() == NetworkMessageSource && consoleMessage->requestIdentifier()) |
| + jsonObj->setNetworkRequestId(IdentifiersFactory::requestId(consoleMessage->requestIdentifier())); |
| + RefPtr<ScriptArguments> arguments = consoleMessage->scriptArguments(); |
| + if (arguments && arguments->argumentCount()) { |
| + InjectedScript injectedScript = m_injectedScriptManager->injectedScriptFor(arguments->scriptState()); |
| + if (!injectedScript.isEmpty()) { |
| + RefPtr<TypeBuilder::Array<TypeBuilder::Runtime::RemoteObject> > jsonArgs = TypeBuilder::Array<TypeBuilder::Runtime::RemoteObject>::create(); |
| + if (consoleMessage->type() == TableMessageType && generatePreview && arguments->argumentCount()) { |
| + ScriptValue table = arguments->argumentAt(0); |
| + ScriptValue columns = arguments->argumentCount() > 1 ? arguments->argumentAt(1) : ScriptValue(); |
| + RefPtr<TypeBuilder::Runtime::RemoteObject> inspectorValue = injectedScript.wrapTable(table, columns); |
| + if (!inspectorValue) { |
| + ASSERT_NOT_REACHED(); |
| + return; |
| + } |
| + jsonArgs->addItem(inspectorValue); |
| + } else { |
| + for (unsigned i = 0; i < arguments->argumentCount(); ++i) { |
| + RefPtr<TypeBuilder::Runtime::RemoteObject> inspectorValue = injectedScript.wrapObject(arguments->argumentAt(i), "console", generatePreview); |
| + if (!inspectorValue) { |
| + ASSERT_NOT_REACHED(); |
| + return; |
| + } |
| + jsonArgs->addItem(inspectorValue); |
| + } |
| + } |
| + jsonObj->setParameters(jsonArgs); |
| + } |
| + } |
| + if (consoleMessage->callStack()) { |
| + jsonObj->setStackTrace(consoleMessage->callStack()->buildInspectorArray()); |
| + RefPtrWillBeRawPtr<ScriptAsyncCallStack> asyncCallStack = consoleMessage->callStack()->asyncCallStack(); |
| + if (asyncCallStack) |
| + jsonObj->setAsyncStackTrace(asyncCallStack->buildInspectorObject()); |
| } |
| + m_frontend->messageAdded(jsonObj); |
| + m_frontend->flush(); |
| } |
| class InspectableHeapObject FINAL : public InjectedScriptHost::InspectableObject { |