Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright (C) 2011 Google Inc. All rights reserved. | 2 * Copyright (C) 2011 Google Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
| 6 * are met: | 6 * are met: |
| 7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
| 8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
| 9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
| 10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 25 | 25 |
| 26 #include "config.h" | 26 #include "config.h" |
| 27 #include "core/inspector/InspectorConsoleAgent.h" | 27 #include "core/inspector/InspectorConsoleAgent.h" |
| 28 | 28 |
| 29 #include "bindings/core/v8/ScriptCallStackFactory.h" | 29 #include "bindings/core/v8/ScriptCallStackFactory.h" |
| 30 #include "bindings/core/v8/ScriptController.h" | 30 #include "bindings/core/v8/ScriptController.h" |
| 31 #include "bindings/core/v8/ScriptProfiler.h" | 31 #include "bindings/core/v8/ScriptProfiler.h" |
| 32 #include "core/frame/LocalFrame.h" | 32 #include "core/frame/LocalFrame.h" |
| 33 #include "core/frame/UseCounter.h" | 33 #include "core/frame/UseCounter.h" |
| 34 #include "core/inspector/ConsoleMessage.h" | 34 #include "core/inspector/ConsoleMessage.h" |
| 35 #include "core/inspector/ConsoleMessageStorage.h" | |
| 36 #include "core/inspector/IdentifiersFactory.h" | |
| 37 #include "core/inspector/InjectedScript.h" | |
| 35 #include "core/inspector/InjectedScriptHost.h" | 38 #include "core/inspector/InjectedScriptHost.h" |
| 36 #include "core/inspector/InjectedScriptManager.h" | 39 #include "core/inspector/InjectedScriptManager.h" |
| 37 #include "core/inspector/InspectorConsoleMessage.h" | |
| 38 #include "core/inspector/InspectorState.h" | 40 #include "core/inspector/InspectorState.h" |
| 39 #include "core/inspector/InspectorTimelineAgent.h" | 41 #include "core/inspector/InspectorTimelineAgent.h" |
| 40 #include "core/inspector/InspectorTracingAgent.h" | 42 #include "core/inspector/InspectorTracingAgent.h" |
| 41 #include "core/inspector/InstrumentingAgents.h" | 43 #include "core/inspector/InstrumentingAgents.h" |
| 42 #include "core/inspector/ScriptArguments.h" | 44 #include "core/inspector/ScriptArguments.h" |
| 45 #include "core/inspector/ScriptAsyncCallStack.h" | |
| 43 #include "core/inspector/ScriptCallFrame.h" | 46 #include "core/inspector/ScriptCallFrame.h" |
| 44 #include "core/inspector/ScriptCallStack.h" | 47 #include "core/inspector/ScriptCallStack.h" |
| 45 #include "core/loader/DocumentLoader.h" | 48 #include "core/loader/DocumentLoader.h" |
| 46 #include "core/page/Page.h" | 49 #include "core/page/Page.h" |
| 47 #include "core/workers/WorkerGlobalScopeProxy.h" | 50 #include "core/workers/WorkerGlobalScopeProxy.h" |
| 51 #include "core/xml/XMLHttpRequest.h" | |
| 48 #include "platform/network/ResourceError.h" | 52 #include "platform/network/ResourceError.h" |
| 49 #include "platform/network/ResourceResponse.h" | 53 #include "platform/network/ResourceResponse.h" |
| 50 #include "wtf/CurrentTime.h" | 54 #include "wtf/CurrentTime.h" |
| 51 #include "wtf/OwnPtr.h" | 55 #include "wtf/OwnPtr.h" |
| 52 #include "wtf/PassOwnPtr.h" | 56 #include "wtf/PassOwnPtr.h" |
| 53 #include "wtf/text/StringBuilder.h" | 57 #include "wtf/text/StringBuilder.h" |
| 54 #include "wtf/text/WTFString.h" | 58 #include "wtf/text/WTFString.h" |
| 55 | 59 |
| 60 #include <base/debug/stack_trace.h> | |
|
vsevik
2014/08/25 13:04:02
Please remove
kozyatinskiy1
2014/08/25 14:12:39
Done.
| |
| 61 | |
| 56 namespace blink { | 62 namespace blink { |
| 57 | 63 |
| 58 static const unsigned maximumConsoleMessages = 1000; | |
| 59 static const int expireConsoleMessagesStep = 100; | |
| 60 | |
| 61 namespace ConsoleAgentState { | 64 namespace ConsoleAgentState { |
| 62 static const char monitoringXHR[] = "monitoringXHR"; | 65 static const char monitoringXHR[] = "monitoringXHR"; |
| 63 static const char consoleMessagesEnabled[] = "consoleMessagesEnabled"; | 66 static const char consoleMessagesEnabled[] = "consoleMessagesEnabled"; |
| 64 static const char tracingBasedTimeline[] = "tracingBasedTimeline"; | 67 static const char tracingBasedTimeline[] = "tracingBasedTimeline"; |
| 65 } | 68 } |
| 66 | 69 |
| 67 int InspectorConsoleAgent::s_enabledAgentCount = 0; | 70 int InspectorConsoleAgent::s_enabledAgentCount = 0; |
| 68 | 71 |
| 69 InspectorConsoleAgent::InspectorConsoleAgent(InspectorTimelineAgent* timelineAge nt, InspectorTracingAgent* tracingAgent, InjectedScriptManager* injectedScriptMa nager) | 72 InspectorConsoleAgent::InspectorConsoleAgent(InspectorTimelineAgent* timelineAge nt, InspectorTracingAgent* tracingAgent, InjectedScriptManager* injectedScriptMa nager) |
| 70 : InspectorBaseAgent<InspectorConsoleAgent>("Console") | 73 : InspectorBaseAgent<InspectorConsoleAgent>("Console") |
| 71 , m_timelineAgent(timelineAgent) | 74 , m_timelineAgent(timelineAgent) |
| 72 , m_tracingAgent(tracingAgent) | 75 , m_tracingAgent(tracingAgent) |
| 73 , m_injectedScriptManager(injectedScriptManager) | 76 , m_injectedScriptManager(injectedScriptManager) |
| 74 , m_frontend(0) | 77 , m_frontend(0) |
| 75 , m_expiredConsoleMessageCount(0) | |
| 76 , m_enabled(false) | 78 , m_enabled(false) |
| 77 { | 79 { |
| 78 } | 80 } |
| 79 | 81 |
| 80 InspectorConsoleAgent::~InspectorConsoleAgent() | 82 InspectorConsoleAgent::~InspectorConsoleAgent() |
| 81 { | 83 { |
| 82 #if !ENABLE(OILPAN) | 84 #if !ENABLE(OILPAN) |
| 83 m_instrumentingAgents->setInspectorConsoleAgent(0); | 85 m_instrumentingAgents->setInspectorConsoleAgent(0); |
| 84 #endif | 86 #endif |
| 85 } | 87 } |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 101 { | 103 { |
| 102 if (m_enabled) | 104 if (m_enabled) |
| 103 return; | 105 return; |
| 104 m_enabled = true; | 106 m_enabled = true; |
| 105 if (!s_enabledAgentCount) | 107 if (!s_enabledAgentCount) |
| 106 ScriptController::setCaptureCallStackForUncaughtExceptions(true); | 108 ScriptController::setCaptureCallStackForUncaughtExceptions(true); |
| 107 ++s_enabledAgentCount; | 109 ++s_enabledAgentCount; |
| 108 | 110 |
| 109 m_state->setBoolean(ConsoleAgentState::consoleMessagesEnabled, true); | 111 m_state->setBoolean(ConsoleAgentState::consoleMessagesEnabled, true); |
| 110 | 112 |
| 111 if (m_expiredConsoleMessageCount) { | 113 ConsoleMessageStorage* storage = messageStorage(); |
| 112 InspectorConsoleMessage expiredMessage(OtherMessageSource, LogMessageTyp e, WarningMessageLevel, String::format("%d console messages are not shown.", m_e xpiredConsoleMessageCount)); | 114 if (storage->expiredCount()) { |
| 113 expiredMessage.setTimestamp(0); | 115 RefPtr<ConsoleMessage> expiredMessage = ConsoleMessage::create(OtherMess ageSource, WarningMessageLevel, String::format("%d console messages are not show n.", storage->expiredCount())); |
| 114 expiredMessage.addToFrontend(m_frontend, m_injectedScriptManager, false) ; | 116 expiredMessage->setTimestamp(0); |
| 117 sendConsoleMessageToFrontend(expiredMessage, false); | |
| 115 } | 118 } |
| 116 | 119 |
| 117 size_t messageCount = m_consoleMessages.size(); | 120 size_t messageCount = storage->size(); |
| 118 for (size_t i = 0; i < messageCount; ++i) | 121 for (size_t i = 0; i < messageCount; ++i) |
| 119 m_consoleMessages[i]->addToFrontend(m_frontend, m_injectedScriptManager, false); | 122 sendConsoleMessageToFrontend(storage->at(i), false); |
| 120 } | 123 } |
| 121 | 124 |
| 122 void InspectorConsoleAgent::disable(ErrorString*) | 125 void InspectorConsoleAgent::disable(ErrorString*) |
| 123 { | 126 { |
| 124 if (!m_enabled) | 127 if (!m_enabled) |
| 125 return; | 128 return; |
| 126 m_enabled = false; | 129 m_enabled = false; |
| 127 if (!(--s_enabledAgentCount)) | 130 if (!(--s_enabledAgentCount)) |
| 128 ScriptController::setCaptureCallStackForUncaughtExceptions(false); | 131 ScriptController::setCaptureCallStackForUncaughtExceptions(false); |
| 129 m_state->setBoolean(ConsoleAgentState::consoleMessagesEnabled, false); | 132 m_state->setBoolean(ConsoleAgentState::consoleMessagesEnabled, false); |
| 130 m_state->setBoolean(ConsoleAgentState::tracingBasedTimeline, false); | 133 m_state->setBoolean(ConsoleAgentState::tracingBasedTimeline, false); |
| 131 } | 134 } |
| 132 | 135 |
| 133 void InspectorConsoleAgent::clearMessages(ErrorString*) | 136 void InspectorConsoleAgent::clearMessages(ErrorString*) |
| 134 { | 137 { |
| 135 m_consoleMessages.clear(); | 138 messageStorage()->clear(); |
| 136 m_expiredConsoleMessageCount = 0; | |
| 137 m_injectedScriptManager->releaseObjectGroup("console"); | 139 m_injectedScriptManager->releaseObjectGroup("console"); |
| 138 if (m_frontend && m_enabled) | 140 if (m_frontend && m_enabled) |
| 139 m_frontend->messagesCleared(); | 141 m_frontend->messagesCleared(); |
| 140 } | 142 } |
| 141 | 143 |
| 142 void InspectorConsoleAgent::reset() | 144 void InspectorConsoleAgent::reset() |
| 143 { | 145 { |
| 144 ErrorString error; | 146 ErrorString error; |
| 145 clearMessages(&error); | 147 clearMessages(&error); |
| 146 m_times.clear(); | 148 m_times.clear(); |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 161 m_frontend = frontend->console(); | 163 m_frontend = frontend->console(); |
| 162 } | 164 } |
| 163 | 165 |
| 164 void InspectorConsoleAgent::clearFrontend() | 166 void InspectorConsoleAgent::clearFrontend() |
| 165 { | 167 { |
| 166 m_frontend = 0; | 168 m_frontend = 0; |
| 167 String errorString; | 169 String errorString; |
| 168 disable(&errorString); | 170 disable(&errorString); |
| 169 } | 171 } |
| 170 | 172 |
| 171 void InspectorConsoleAgent::addMessageToConsole(ConsoleMessage* consoleMessage) | 173 void InspectorConsoleAgent::addMessageToConsole(PassRefPtr<ConsoleMessage> prpCo nsoleMessage) |
| 172 { | 174 { |
| 175 RefPtr<ConsoleMessage> consoleMessage = prpConsoleMessage; | |
| 176 | |
| 173 if (consoleMessage->type() == ClearMessageType) { | 177 if (consoleMessage->type() == ClearMessageType) { |
| 174 ErrorString error; | 178 ErrorString error; |
| 175 clearMessages(&error); | 179 clearMessages(&error); |
| 176 } | 180 } |
| 177 | 181 |
| 178 InspectorConsoleMessage* message; | 182 if (m_frontend && m_enabled) { |
| 179 if (consoleMessage->source() == ConsoleAPIMessageSource) { | 183 sendConsoleMessageToFrontend(consoleMessage, true); |
| 180 message = new InspectorConsoleMessage(consoleMessage->source(), consoleM essage->type(), consoleMessage->level(), consoleMessage->message(), consoleMessa ge->scriptArguments(), consoleMessage->scriptState()); | |
| 181 } else if (consoleMessage->callStack()) { | |
| 182 message = new InspectorConsoleMessage(consoleMessage->source(), LogMessa geType, consoleMessage->level(), consoleMessage->message(), consoleMessage->call Stack(), consoleMessage->requestIdentifier()); | |
| 183 } else { | |
| 184 bool shouldGenerateCallStack = m_frontend; | |
| 185 message = new InspectorConsoleMessage(shouldGenerateCallStack, consoleMe ssage->source(), LogMessageType, consoleMessage->level(), consoleMessage->messag e(), consoleMessage->url(), consoleMessage->lineNumber(), consoleMessage->column Number(), consoleMessage->scriptState(), consoleMessage->requestIdentifier()); | |
| 186 } | 184 } |
| 187 message->setWorkerGlobalScopeProxy(consoleMessage->workerId()); | |
| 188 addConsoleMessage(adoptPtr(message)); | |
| 189 } | 185 } |
| 190 | 186 |
| 191 void InspectorConsoleAgent::adoptWorkerConsoleMessages(WorkerGlobalScopeProxy* p roxy) | 187 void InspectorConsoleAgent::adoptWorkerConsoleMessages(WorkerGlobalScopeProxy* p roxy) |
| 192 { | 188 { |
| 193 for (size_t i = 0; i < m_consoleMessages.size(); i++) { | 189 ConsoleMessageStorage* storage = messageStorage(); |
| 194 if (m_consoleMessages[i]->workerGlobalScopeProxy() == proxy) | 190 size_t messageCount = storage->size(); |
| 195 m_consoleMessages[i]->setWorkerGlobalScopeProxy(nullptr); | 191 for (size_t i = 0; i < messageCount; ++i) { |
| 192 if (storage->at(i)->workerId() == proxy) | |
| 193 storage->at(i)->setWorkerId(nullptr); | |
| 196 } | 194 } |
| 197 } | 195 } |
| 198 | 196 |
| 199 Vector<unsigned> InspectorConsoleAgent::consoleMessageArgumentCounts() | |
| 200 { | |
| 201 Vector<unsigned> result(m_consoleMessages.size()); | |
| 202 for (size_t i = 0; i < m_consoleMessages.size(); i++) | |
| 203 result[i] = m_consoleMessages[i]->argumentCount(); | |
| 204 return result; | |
| 205 } | |
| 206 | |
| 207 void InspectorConsoleAgent::consoleTime(ExecutionContext*, const String& title) | 197 void InspectorConsoleAgent::consoleTime(ExecutionContext*, const String& title) |
| 208 { | 198 { |
| 209 // Follow Firebug's behavior of requiring a title that is not null or | 199 // Follow Firebug's behavior of requiring a title that is not null or |
| 210 // undefined for timing functions | 200 // undefined for timing functions |
| 211 if (title.isNull()) | 201 if (title.isNull()) |
| 212 return; | 202 return; |
| 213 | 203 |
| 214 m_times.add(title, monotonicallyIncreasingTime()); | 204 m_times.add(title, monotonicallyIncreasingTime()); |
| 215 } | 205 } |
| 216 | 206 |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 227 | 217 |
| 228 double startTime = it->value; | 218 double startTime = it->value; |
| 229 m_times.remove(it); | 219 m_times.remove(it); |
| 230 | 220 |
| 231 double elapsed = monotonicallyIncreasingTime() - startTime; | 221 double elapsed = monotonicallyIncreasingTime() - startTime; |
| 232 String message = title + String::format(": %.3fms", elapsed * 1000); | 222 String message = title + String::format(": %.3fms", elapsed * 1000); |
| 233 | 223 |
| 234 RefPtrWillBeRawPtr<ConsoleMessage> consoleMessage = ConsoleMessage::create(C onsoleAPIMessageSource, DebugMessageLevel, message); | 224 RefPtrWillBeRawPtr<ConsoleMessage> consoleMessage = ConsoleMessage::create(C onsoleAPIMessageSource, DebugMessageLevel, message); |
| 235 consoleMessage->setType(LogMessageType); | 225 consoleMessage->setType(LogMessageType); |
| 236 consoleMessage->setScriptState(scriptState); | 226 consoleMessage->setScriptState(scriptState); |
| 237 addMessageToConsole(consoleMessage.get()); | 227 messageStorage()->reportMessage(consoleMessage); |
|
vsevik
2014/08/25 13:04:02
.release()
kozyatinskiy1
2014/08/25 14:12:39
Done.
| |
| 238 } | 228 } |
| 239 | 229 |
| 240 void InspectorConsoleAgent::setTracingBasedTimeline(ErrorString*, bool enabled) | 230 void InspectorConsoleAgent::setTracingBasedTimeline(ErrorString*, bool enabled) |
| 241 { | 231 { |
| 242 m_state->setBoolean(ConsoleAgentState::tracingBasedTimeline, enabled); | 232 m_state->setBoolean(ConsoleAgentState::tracingBasedTimeline, enabled); |
| 243 } | 233 } |
| 244 | 234 |
| 245 void InspectorConsoleAgent::consoleTimeline(ExecutionContext* context, const Str ing& title, ScriptState* scriptState) | 235 void InspectorConsoleAgent::consoleTimeline(ExecutionContext* context, const Str ing& title, ScriptState* scriptState) |
| 246 { | 236 { |
| 247 UseCounter::count(context, UseCounter::DevToolsConsoleTimeline); | 237 UseCounter::count(context, UseCounter::DevToolsConsoleTimeline); |
| (...skipping 21 matching lines...) Expand all Loading... | |
| 269 arguments->getFirstArgumentAsString(title); | 259 arguments->getFirstArgumentAsString(title); |
| 270 String identifier = title.isEmpty() ? String(lastCaller.sourceURL() + ':' + String::number(lastCaller.lineNumber())) | 260 String identifier = title.isEmpty() ? String(lastCaller.sourceURL() + ':' + String::number(lastCaller.lineNumber())) |
| 271 : String(title + '@'); | 261 : String(title + '@'); |
| 272 | 262 |
| 273 HashCountedSet<String>::AddResult result = m_counts.add(identifier); | 263 HashCountedSet<String>::AddResult result = m_counts.add(identifier); |
| 274 String message = title + ": " + String::number(result.storedValue->value); | 264 String message = title + ": " + String::number(result.storedValue->value); |
| 275 | 265 |
| 276 RefPtrWillBeRawPtr<ConsoleMessage> consoleMessage = ConsoleMessage::create(C onsoleAPIMessageSource, DebugMessageLevel, message); | 266 RefPtrWillBeRawPtr<ConsoleMessage> consoleMessage = ConsoleMessage::create(C onsoleAPIMessageSource, DebugMessageLevel, message); |
| 277 consoleMessage->setType(LogMessageType); | 267 consoleMessage->setType(LogMessageType); |
| 278 consoleMessage->setScriptState(scriptState); | 268 consoleMessage->setScriptState(scriptState); |
| 279 addMessageToConsole(consoleMessage.get()); | 269 messageStorage()->reportMessage(consoleMessage.release()); |
| 280 } | 270 } |
| 281 | 271 |
| 282 void InspectorConsoleAgent::frameWindowDiscarded(LocalDOMWindow* window) | 272 void InspectorConsoleAgent::frameWindowDiscarded(LocalDOMWindow* window) |
| 283 { | 273 { |
| 284 size_t messageCount = m_consoleMessages.size(); | |
| 285 for (size_t i = 0; i < messageCount; ++i) | |
| 286 m_consoleMessages[i]->windowCleared(window); | |
| 287 m_injectedScriptManager->discardInjectedScriptsFor(window); | 274 m_injectedScriptManager->discardInjectedScriptsFor(window); |
| 288 } | 275 } |
| 289 | 276 |
| 290 void InspectorConsoleAgent::didCommitLoad(LocalFrame* frame, DocumentLoader* loa der) | 277 void InspectorConsoleAgent::didCommitLoad(LocalFrame* frame, DocumentLoader* loa der) |
| 291 { | 278 { |
| 292 if (loader->frame() != frame->page()->mainFrame()) | 279 if (loader->frame() != frame->page()->mainFrame()) |
| 293 return; | 280 return; |
| 294 reset(); | 281 reset(); |
| 295 } | 282 } |
| 296 | 283 |
| 297 void InspectorConsoleAgent::didFinishXHRLoading(XMLHttpRequest*, ThreadableLoade rClient*, unsigned long requestIdentifier, ScriptString, const AtomicString& met hod, const String& url, const String& sendURL, unsigned sendLineNumber) | 284 void InspectorConsoleAgent::didFinishXHRLoading(XMLHttpRequest* request, Threada bleLoaderClient*, unsigned long requestIdentifier, ScriptString, const AtomicStr ing& method, const String& url, const String& sendURL, unsigned sendLineNumber) |
| 298 { | 285 { |
| 299 if (m_frontend && m_state->getBoolean(ConsoleAgentState::monitoringXHR)) { | 286 if (m_frontend && m_state->getBoolean(ConsoleAgentState::monitoringXHR)) { |
| 300 String message = "XHR finished loading: " + method + " \"" + url + "\"." ; | 287 String message = "XHR finished loading: " + method + " \"" + url + "\"." ; |
| 301 RefPtrWillBeRawPtr<ConsoleMessage> consoleMessage = ConsoleMessage::crea te(NetworkMessageSource, DebugMessageLevel, message, sendURL, sendLineNumber); | 288 RefPtrWillBeRawPtr<ConsoleMessage> consoleMessage = ConsoleMessage::crea te(NetworkMessageSource, DebugMessageLevel, message, sendURL, sendLineNumber); |
| 302 consoleMessage->setRequestIdentifier(requestIdentifier); | 289 consoleMessage->setRequestIdentifier(requestIdentifier); |
| 303 addMessageToConsole(consoleMessage.get()); | 290 messageStorage()->reportMessage(consoleMessage.release()); |
| 304 } | 291 } |
| 305 } | 292 } |
| 306 | 293 |
| 307 void InspectorConsoleAgent::didReceiveResourceResponse(LocalFrame*, unsigned lon g requestIdentifier, DocumentLoader* loader, const ResourceResponse& response, R esourceLoader* resourceLoader) | 294 void InspectorConsoleAgent::didReceiveResourceResponse(LocalFrame*, unsigned lon g requestIdentifier, DocumentLoader* loader, const ResourceResponse& response, R esourceLoader* resourceLoader) |
| 308 { | 295 { |
| 309 if (!loader) | 296 if (!loader) |
| 310 return; | 297 return; |
| 311 if (response.httpStatusCode() >= 400) { | 298 if (response.httpStatusCode() >= 400) { |
| 312 String message = "Failed to load resource: the server responded with a s tatus of " + String::number(response.httpStatusCode()) + " (" + response.httpSta tusText() + ')'; | 299 String message = "Failed to load resource: the server responded with a s tatus of " + String::number(response.httpStatusCode()) + " (" + response.httpSta tusText() + ')'; |
| 313 RefPtrWillBeRawPtr<ConsoleMessage> consoleMessage = ConsoleMessage::crea te(NetworkMessageSource, ErrorMessageLevel, message, response.url().string()); | 300 RefPtrWillBeRawPtr<ConsoleMessage> consoleMessage = ConsoleMessage::crea te(NetworkMessageSource, ErrorMessageLevel, message, response.url().string()); |
| 314 consoleMessage->setRequestIdentifier(requestIdentifier); | 301 consoleMessage->setRequestIdentifier(requestIdentifier); |
| 315 addMessageToConsole(consoleMessage.get()); | 302 messageStorage()->reportMessage(consoleMessage.release()); |
| 316 } | 303 } |
| 317 } | 304 } |
| 318 | 305 |
| 319 void InspectorConsoleAgent::didFailLoading(unsigned long requestIdentifier, cons t ResourceError& error) | 306 void InspectorConsoleAgent::didFailLoading(unsigned long requestIdentifier, cons t ResourceError& error) |
| 320 { | 307 { |
| 321 if (error.isCancellation()) // Report failures only. | 308 if (error.isCancellation()) // Report failures only. |
| 322 return; | 309 return; |
| 323 StringBuilder message; | 310 StringBuilder message; |
| 324 message.appendLiteral("Failed to load resource"); | 311 message.appendLiteral("Failed to load resource"); |
| 325 if (!error.localizedDescription().isEmpty()) { | 312 if (!error.localizedDescription().isEmpty()) { |
| 326 message.appendLiteral(": "); | 313 message.appendLiteral(": "); |
| 327 message.append(error.localizedDescription()); | 314 message.append(error.localizedDescription()); |
| 328 } | 315 } |
| 329 RefPtrWillBeRawPtr<ConsoleMessage> consoleMessage = ConsoleMessage::create(N etworkMessageSource, ErrorMessageLevel, message.toString(), error.failingURL()); | 316 RefPtrWillBeRawPtr<ConsoleMessage> consoleMessage = ConsoleMessage::create(N etworkMessageSource, ErrorMessageLevel, message.toString(), error.failingURL()); |
| 330 consoleMessage->setRequestIdentifier(requestIdentifier); | 317 consoleMessage->setRequestIdentifier(requestIdentifier); |
| 331 addMessageToConsole(consoleMessage.get()); | 318 messageStorage()->reportMessage(consoleMessage.release()); |
| 332 } | 319 } |
| 333 | 320 |
| 334 void InspectorConsoleAgent::setMonitoringXHREnabled(ErrorString*, bool enabled) | 321 void InspectorConsoleAgent::setMonitoringXHREnabled(ErrorString*, bool enabled) |
| 335 { | 322 { |
| 336 m_state->setBoolean(ConsoleAgentState::monitoringXHR, enabled); | 323 m_state->setBoolean(ConsoleAgentState::monitoringXHR, enabled); |
| 337 } | 324 } |
| 338 | 325 |
| 339 void InspectorConsoleAgent::addConsoleMessage(PassOwnPtr<InspectorConsoleMessage > consoleMessage) | 326 static TypeBuilder::Console::ConsoleMessage::Source::Enum messageSourceValue(Mes sageSource source) |
| 340 { | 327 { |
| 341 ASSERT_ARG(consoleMessage, consoleMessage); | 328 switch (source) { |
| 329 case XMLMessageSource: return TypeBuilder::Console::ConsoleMessage::Source:: Xml; | |
| 330 case JSMessageSource: return TypeBuilder::Console::ConsoleMessage::Source::J avascript; | |
| 331 case NetworkMessageSource: return TypeBuilder::Console::ConsoleMessage::Sour ce::Network; | |
| 332 case ConsoleAPIMessageSource: return TypeBuilder::Console::ConsoleMessage::S ource::Console_api; | |
| 333 case StorageMessageSource: return TypeBuilder::Console::ConsoleMessage::Sour ce::Storage; | |
| 334 case AppCacheMessageSource: return TypeBuilder::Console::ConsoleMessage::Sou rce::Appcache; | |
| 335 case RenderingMessageSource: return TypeBuilder::Console::ConsoleMessage::So urce::Rendering; | |
| 336 case CSSMessageSource: return TypeBuilder::Console::ConsoleMessage::Source:: Css; | |
| 337 case SecurityMessageSource: return TypeBuilder::Console::ConsoleMessage::Sou rce::Security; | |
| 338 case OtherMessageSource: return TypeBuilder::Console::ConsoleMessage::Source ::Other; | |
| 339 case DeprecationMessageSource: return TypeBuilder::Console::ConsoleMessage:: Source::Deprecation; | |
| 340 } | |
| 341 return TypeBuilder::Console::ConsoleMessage::Source::Other; | |
| 342 } | |
| 342 | 343 |
| 343 if (m_frontend && m_enabled) | |
| 344 consoleMessage->addToFrontend(m_frontend, m_injectedScriptManager, true) ; | |
| 345 | 344 |
| 346 m_consoleMessages.append(consoleMessage); | 345 static TypeBuilder::Console::ConsoleMessage::Type::Enum messageTypeValue(Message Type type) |
| 346 { | |
| 347 switch (type) { | |
| 348 case LogMessageType: return TypeBuilder::Console::ConsoleMessage::Type::Log; | |
| 349 case ClearMessageType: return TypeBuilder::Console::ConsoleMessage::Type::Cl ear; | |
| 350 case DirMessageType: return TypeBuilder::Console::ConsoleMessage::Type::Dir; | |
| 351 case DirXMLMessageType: return TypeBuilder::Console::ConsoleMessage::Type::D irxml; | |
| 352 case TableMessageType: return TypeBuilder::Console::ConsoleMessage::Type::Ta ble; | |
| 353 case TraceMessageType: return TypeBuilder::Console::ConsoleMessage::Type::Tr ace; | |
| 354 case StartGroupMessageType: return TypeBuilder::Console::ConsoleMessage::Typ e::StartGroup; | |
| 355 case StartGroupCollapsedMessageType: return TypeBuilder::Console::ConsoleMes sage::Type::StartGroupCollapsed; | |
| 356 case EndGroupMessageType: return TypeBuilder::Console::ConsoleMessage::Type: :EndGroup; | |
| 357 case AssertMessageType: return TypeBuilder::Console::ConsoleMessage::Type::A ssert; | |
| 358 } | |
| 359 return TypeBuilder::Console::ConsoleMessage::Type::Log; | |
| 360 } | |
| 347 | 361 |
| 348 if (!m_frontend && m_consoleMessages.size() >= maximumConsoleMessages) { | 362 static TypeBuilder::Console::ConsoleMessage::Level::Enum messageLevelValue(Messa geLevel level) |
| 349 m_expiredConsoleMessageCount += expireConsoleMessagesStep; | 363 { |
| 350 m_consoleMessages.remove(0, expireConsoleMessagesStep); | 364 switch (level) { |
| 365 case DebugMessageLevel: return TypeBuilder::Console::ConsoleMessage::Level:: Debug; | |
| 366 case LogMessageLevel: return TypeBuilder::Console::ConsoleMessage::Level::Lo g; | |
| 367 case WarningMessageLevel: return TypeBuilder::Console::ConsoleMessage::Level ::Warning; | |
| 368 case ErrorMessageLevel: return TypeBuilder::Console::ConsoleMessage::Level:: Error; | |
| 369 case InfoMessageLevel: return TypeBuilder::Console::ConsoleMessage::Level::I nfo; | |
| 351 } | 370 } |
| 371 return TypeBuilder::Console::ConsoleMessage::Level::Log; | |
| 372 } | |
| 373 | |
| 374 void InspectorConsoleAgent::sendConsoleMessageToFrontend(PassRefPtr<ConsoleMessa ge> consoleMessage, bool generatePreview) | |
| 375 { | |
| 376 if (consoleMessage->workerId()) | |
| 377 return; | |
| 378 | |
| 379 RefPtr<TypeBuilder::Console::ConsoleMessage> jsonObj = TypeBuilder::Console: :ConsoleMessage::create() | |
| 380 .setSource(messageSourceValue(consoleMessage->source())) | |
| 381 .setLevel(messageLevelValue(consoleMessage->level())) | |
| 382 .setText(consoleMessage->message()) | |
| 383 .setTimestamp(consoleMessage->timestamp()); | |
| 384 // FIXME: only send out type for ConsoleAPI source messages. | |
| 385 jsonObj->setType(messageTypeValue(consoleMessage->type())); | |
| 386 jsonObj->setLine(static_cast<int>(consoleMessage->lineNumber())); | |
| 387 jsonObj->setColumn(static_cast<int>(consoleMessage->columnNumber())); | |
| 388 jsonObj->setUrl(consoleMessage->url()); | |
| 389 ScriptState* scriptState = consoleMessage->scriptState(); | |
| 390 if (scriptState) | |
| 391 jsonObj->setExecutionContextId(m_injectedScriptManager->injectedScriptId For(scriptState)); | |
| 392 if (consoleMessage->source() == NetworkMessageSource && consoleMessage->requ estIdentifier()) | |
| 393 jsonObj->setNetworkRequestId(IdentifiersFactory::requestId(consoleMessag e->requestIdentifier())); | |
| 394 RefPtr<ScriptArguments> arguments = consoleMessage->scriptArguments(); | |
| 395 if (arguments && arguments->argumentCount()) { | |
| 396 InjectedScript injectedScript = m_injectedScriptManager->injectedScriptF or(arguments->scriptState()); | |
| 397 if (!injectedScript.isEmpty()) { | |
| 398 RefPtr<TypeBuilder::Array<TypeBuilder::Runtime::RemoteObject> > json Args = TypeBuilder::Array<TypeBuilder::Runtime::RemoteObject>::create(); | |
| 399 if (consoleMessage->type() == TableMessageType && generatePreview && arguments->argumentCount()) { | |
| 400 ScriptValue table = arguments->argumentAt(0); | |
| 401 ScriptValue columns = arguments->argumentCount() > 1 ? arguments ->argumentAt(1) : ScriptValue(); | |
| 402 RefPtr<TypeBuilder::Runtime::RemoteObject> inspectorValue = inje ctedScript.wrapTable(table, columns); | |
| 403 if (!inspectorValue) { | |
| 404 ASSERT_NOT_REACHED(); | |
| 405 return; | |
| 406 } | |
| 407 jsonArgs->addItem(inspectorValue); | |
| 408 } else { | |
| 409 for (unsigned i = 0; i < arguments->argumentCount(); ++i) { | |
| 410 RefPtr<TypeBuilder::Runtime::RemoteObject> inspectorValue = injectedScript.wrapObject(arguments->argumentAt(i), "console", generatePreview); | |
| 411 if (!inspectorValue) { | |
| 412 ASSERT_NOT_REACHED(); | |
| 413 return; | |
| 414 } | |
| 415 jsonArgs->addItem(inspectorValue); | |
| 416 } | |
| 417 } | |
| 418 jsonObj->setParameters(jsonArgs); | |
| 419 } | |
| 420 } | |
| 421 if (consoleMessage->callStack()) { | |
| 422 jsonObj->setStackTrace(consoleMessage->callStack()->buildInspectorArray( )); | |
| 423 RefPtrWillBeRawPtr<ScriptAsyncCallStack> asyncCallStack = consoleMessage ->callStack()->asyncCallStack(); | |
| 424 if (asyncCallStack) | |
| 425 jsonObj->setAsyncStackTrace(asyncCallStack->buildInspectorObject()); | |
| 426 } | |
| 427 m_frontend->messageAdded(jsonObj); | |
| 428 m_frontend->flush(); | |
| 352 } | 429 } |
| 353 | 430 |
| 354 class InspectableHeapObject FINAL : public InjectedScriptHost::InspectableObject { | 431 class InspectableHeapObject FINAL : public InjectedScriptHost::InspectableObject { |
| 355 public: | 432 public: |
| 356 explicit InspectableHeapObject(int heapObjectId) : m_heapObjectId(heapObject Id) { } | 433 explicit InspectableHeapObject(int heapObjectId) : m_heapObjectId(heapObject Id) { } |
| 357 virtual ScriptValue get(ScriptState*) OVERRIDE | 434 virtual ScriptValue get(ScriptState*) OVERRIDE |
| 358 { | 435 { |
| 359 return ScriptProfiler::objectByHeapObjectId(m_heapObjectId); | 436 return ScriptProfiler::objectByHeapObjectId(m_heapObjectId); |
| 360 } | 437 } |
| 361 private: | 438 private: |
| 362 int m_heapObjectId; | 439 int m_heapObjectId; |
| 363 }; | 440 }; |
| 364 | 441 |
| 365 void InspectorConsoleAgent::addInspectedHeapObject(ErrorString*, int inspectedHe apObjectId) | 442 void InspectorConsoleAgent::addInspectedHeapObject(ErrorString*, int inspectedHe apObjectId) |
| 366 { | 443 { |
| 367 m_injectedScriptManager->injectedScriptHost()->addInspectedObject(adoptPtr(n ew InspectableHeapObject(inspectedHeapObjectId))); | 444 m_injectedScriptManager->injectedScriptHost()->addInspectedObject(adoptPtr(n ew InspectableHeapObject(inspectedHeapObjectId))); |
| 368 } | 445 } |
| 369 | 446 |
| 370 } // namespace blink | 447 } // namespace blink |
| OLD | NEW |