| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2007, 2008 Apple Inc. All rights reserved. | 2 * Copyright (C) 2007, 2008 Apple Inc. All rights reserved. |
| 3 * Copyright (C) 2008 Matt Lilek <webkit@mattlilek.com> | 3 * Copyright (C) 2008 Matt Lilek <webkit@mattlilek.com> |
| 4 * Copyright (C) 2009, 2010 Google Inc. All rights reserved. | 4 * Copyright (C) 2009, 2010 Google Inc. All rights reserved. |
| 5 * | 5 * |
| 6 * Redistribution and use in source and binary forms, with or without | 6 * Redistribution and use in source and binary forms, with or without |
| 7 * modification, are permitted provided that the following conditions | 7 * modification, are permitted provided that the following conditions |
| 8 * are met: | 8 * are met: |
| 9 * | 9 * |
| 10 * 1. Redistributions of source code must retain the above copyright | 10 * 1. Redistributions of source code must retain the above copyright |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 44 #include "core/inspector/ScriptCallStack.h" | 44 #include "core/inspector/ScriptCallStack.h" |
| 45 #include "wtf/CurrentTime.h" | 45 #include "wtf/CurrentTime.h" |
| 46 | 46 |
| 47 namespace WebCore { | 47 namespace WebCore { |
| 48 | 48 |
| 49 ConsoleMessage::ConsoleMessage(bool canGenerateCallStack, MessageSource source,
MessageType type, MessageLevel level, const String& message) | 49 ConsoleMessage::ConsoleMessage(bool canGenerateCallStack, MessageSource source,
MessageType type, MessageLevel level, const String& message) |
| 50 : m_source(source) | 50 : m_source(source) |
| 51 , m_type(type) | 51 , m_type(type) |
| 52 , m_level(level) | 52 , m_level(level) |
| 53 , m_message(message) | 53 , m_message(message) |
| 54 , m_url() | |
| 55 , m_line(0) | 54 , m_line(0) |
| 56 , m_column(0) | 55 , m_column(0) |
| 57 , m_repeatCount(1) | 56 , m_repeatCount(1) |
| 58 , m_requestId(IdentifiersFactory::requestId(0)) | 57 , m_requestId(IdentifiersFactory::requestId(0)) |
| 59 , m_timestamp(WTF::currentTime()) | 58 , m_timestamp(WTF::currentTime()) |
| 60 { | 59 { |
| 61 autogenerateMetadata(canGenerateCallStack); | 60 autogenerateMetadata(canGenerateCallStack); |
| 62 } | 61 } |
| 63 | 62 |
| 64 ConsoleMessage::ConsoleMessage(bool canGenerateCallStack, MessageSource source,
MessageType type, MessageLevel level, const String& message, const String& url,
unsigned line, unsigned column, ScriptState* state, unsigned long requestIdentif
ier) | 63 ConsoleMessage::ConsoleMessage(bool canGenerateCallStack, MessageSource source,
MessageType type, MessageLevel level, const String& message, const String& execu
tionContextURL, const String& url, unsigned line, unsigned column, ScriptState*
state, unsigned long requestIdentifier) |
| 65 : m_source(source) | 64 : m_source(source) |
| 66 , m_type(type) | 65 , m_type(type) |
| 67 , m_level(level) | 66 , m_level(level) |
| 68 , m_message(message) | 67 , m_message(message) |
| 68 , m_executionContextURL(executionContextURL) |
| 69 , m_url(url) | 69 , m_url(url) |
| 70 , m_line(line) | 70 , m_line(line) |
| 71 , m_column(column) | 71 , m_column(column) |
| 72 , m_repeatCount(1) | 72 , m_repeatCount(1) |
| 73 , m_requestId(IdentifiersFactory::requestId(requestIdentifier)) | 73 , m_requestId(IdentifiersFactory::requestId(requestIdentifier)) |
| 74 , m_timestamp(WTF::currentTime()) | 74 , m_timestamp(WTF::currentTime()) |
| 75 { | 75 { |
| 76 autogenerateMetadata(canGenerateCallStack, state); | 76 autogenerateMetadata(canGenerateCallStack, state); |
| 77 } | 77 } |
| 78 | 78 |
| 79 ConsoleMessage::ConsoleMessage(bool, MessageSource source, MessageType type, Mes
sageLevel level, const String& message, PassRefPtr<ScriptCallStack> callStack, u
nsigned long requestIdentifier) | 79 ConsoleMessage::ConsoleMessage(bool, MessageSource source, MessageType type, Mes
sageLevel level, const String& message, const String& executionContextURL, PassR
efPtr<ScriptCallStack> callStack, unsigned long requestIdentifier) |
| 80 : m_source(source) | 80 : m_source(source) |
| 81 , m_type(type) | 81 , m_type(type) |
| 82 , m_level(level) | 82 , m_level(level) |
| 83 , m_message(message) | 83 , m_message(message) |
| 84 , m_executionContextURL(executionContextURL) |
| 84 , m_arguments(0) | 85 , m_arguments(0) |
| 85 , m_line(0) | 86 , m_line(0) |
| 86 , m_column(0) | 87 , m_column(0) |
| 87 , m_repeatCount(1) | 88 , m_repeatCount(1) |
| 88 , m_requestId(IdentifiersFactory::requestId(requestIdentifier)) | 89 , m_requestId(IdentifiersFactory::requestId(requestIdentifier)) |
| 89 , m_timestamp(WTF::currentTime()) | 90 , m_timestamp(WTF::currentTime()) |
| 90 { | 91 { |
| 91 if (callStack && callStack->size()) { | 92 if (callStack && callStack->size()) { |
| 92 const ScriptCallFrame& frame = callStack->at(0); | 93 const ScriptCallFrame& frame = callStack->at(0); |
| 93 m_url = frame.sourceURL(); | 94 m_url = frame.sourceURL(); |
| 94 m_line = frame.lineNumber(); | 95 m_line = frame.lineNumber(); |
| 95 m_column = frame.columnNumber(); | 96 m_column = frame.columnNumber(); |
| 96 } | 97 } |
| 97 m_callStack = callStack; | 98 m_callStack = callStack; |
| 98 } | 99 } |
| 99 | 100 |
| 100 ConsoleMessage::ConsoleMessage(bool canGenerateCallStack, MessageSource source,
MessageType type, MessageLevel level, const String& message, PassRefPtr<ScriptAr
guments> arguments, ScriptState* state, unsigned long requestIdentifier) | 101 ConsoleMessage::ConsoleMessage(bool canGenerateCallStack, MessageSource source,
MessageType type, MessageLevel level, const String& message, const String& execu
tionContextURL, PassRefPtr<ScriptArguments> arguments, ScriptState* state, unsig
ned long requestIdentifier) |
| 101 : m_source(source) | 102 : m_source(source) |
| 102 , m_type(type) | 103 , m_type(type) |
| 103 , m_level(level) | 104 , m_level(level) |
| 104 , m_message(message) | 105 , m_message(message) |
| 106 , m_executionContextURL(executionContextURL) |
| 105 , m_arguments(arguments) | 107 , m_arguments(arguments) |
| 106 , m_url() | |
| 107 , m_line(0) | 108 , m_line(0) |
| 108 , m_column(0) | 109 , m_column(0) |
| 109 , m_repeatCount(1) | 110 , m_repeatCount(1) |
| 110 , m_requestId(IdentifiersFactory::requestId(requestIdentifier)) | 111 , m_requestId(IdentifiersFactory::requestId(requestIdentifier)) |
| 111 , m_timestamp(WTF::currentTime()) | 112 , m_timestamp(WTF::currentTime()) |
| 112 { | 113 { |
| 113 autogenerateMetadata(canGenerateCallStack, state); | 114 autogenerateMetadata(canGenerateCallStack, state); |
| 114 } | 115 } |
| 115 | 116 |
| 116 ConsoleMessage::~ConsoleMessage() | 117 ConsoleMessage::~ConsoleMessage() |
| 117 { | 118 { |
| 118 } | 119 } |
| 119 | 120 |
| 120 void ConsoleMessage::autogenerateMetadata(bool canGenerateCallStack, ScriptState
* state) | 121 void ConsoleMessage::autogenerateMetadata(bool canGenerateCallStack, ScriptState
* state) |
| 121 { | 122 { |
| 122 if (m_type == EndGroupMessageType) | 123 if (m_type == EndGroupMessageType) |
| 123 return; | 124 return; |
| 124 | 125 |
| 125 if (state) | 126 if (canGenerateCallStack) |
| 127 generateCallStack(ScriptCallStack::maxCallStackSizeToCapture); |
| 128 else if (state) |
| 126 m_callStack = createScriptCallStackForConsole(state); | 129 m_callStack = createScriptCallStackForConsole(state); |
| 127 else if (canGenerateCallStack) | |
| 128 m_callStack = createScriptCallStack(ScriptCallStack::maxCallStackSizeToC
apture, true); | |
| 129 else | 130 else |
| 130 return; | 131 return; |
| 131 | 132 |
| 132 if (m_callStack && m_callStack->size()) { | 133 if (m_callStack && m_callStack->size()) { |
| 133 const ScriptCallFrame& frame = m_callStack->at(0); | 134 const ScriptCallFrame& frame = m_callStack->at(0); |
| 134 m_url = frame.sourceURL(); | 135 m_url = frame.sourceURL(); |
| 135 m_line = frame.lineNumber(); | 136 m_line = frame.lineNumber(); |
| 136 m_column = frame.columnNumber(); | 137 m_column = frame.columnNumber(); |
| 137 return; | 138 return; |
| 138 } | 139 } |
| 139 | 140 |
| 140 m_callStack.clear(); | 141 m_callStack.clear(); |
| 141 } | 142 } |
| 142 | 143 |
| 144 void ConsoleMessage::generateCallStack(size_t maxSizeToCapture) |
| 145 { |
| 146 m_callStack = createScriptCallStack(maxSizeToCapture, true); |
| 147 } |
| 148 |
| 143 static TypeBuilder::Console::ConsoleMessage::Source::Enum messageSourceValue(Mes
sageSource source) | 149 static TypeBuilder::Console::ConsoleMessage::Source::Enum messageSourceValue(Mes
sageSource source) |
| 144 { | 150 { |
| 145 switch (source) { | 151 switch (source) { |
| 146 case XMLMessageSource: return TypeBuilder::Console::ConsoleMessage::Source::
Xml; | 152 case XMLMessageSource: return TypeBuilder::Console::ConsoleMessage::Source::
Xml; |
| 147 case JSMessageSource: return TypeBuilder::Console::ConsoleMessage::Source::J
avascript; | 153 case JSMessageSource: return TypeBuilder::Console::ConsoleMessage::Source::J
avascript; |
| 148 case NetworkMessageSource: return TypeBuilder::Console::ConsoleMessage::Sour
ce::Network; | 154 case NetworkMessageSource: return TypeBuilder::Console::ConsoleMessage::Sour
ce::Network; |
| 149 case ConsoleAPIMessageSource: return TypeBuilder::Console::ConsoleMessage::S
ource::Console_api; | 155 case ConsoleAPIMessageSource: return TypeBuilder::Console::ConsoleMessage::S
ource::Console_api; |
| 150 case StorageMessageSource: return TypeBuilder::Console::ConsoleMessage::Sour
ce::Storage; | 156 case StorageMessageSource: return TypeBuilder::Console::ConsoleMessage::Sour
ce::Storage; |
| 151 case AppCacheMessageSource: return TypeBuilder::Console::ConsoleMessage::Sou
rce::Appcache; | 157 case AppCacheMessageSource: return TypeBuilder::Console::ConsoleMessage::Sou
rce::Appcache; |
| 152 case RenderingMessageSource: return TypeBuilder::Console::ConsoleMessage::So
urce::Rendering; | 158 case RenderingMessageSource: return TypeBuilder::Console::ConsoleMessage::So
urce::Rendering; |
| (...skipping 29 matching lines...) Expand all Loading... |
| 182 { | 188 { |
| 183 switch (level) { | 189 switch (level) { |
| 184 case DebugMessageLevel: return TypeBuilder::Console::ConsoleMessage::Level::
Debug; | 190 case DebugMessageLevel: return TypeBuilder::Console::ConsoleMessage::Level::
Debug; |
| 185 case LogMessageLevel: return TypeBuilder::Console::ConsoleMessage::Level::Lo
g; | 191 case LogMessageLevel: return TypeBuilder::Console::ConsoleMessage::Level::Lo
g; |
| 186 case WarningMessageLevel: return TypeBuilder::Console::ConsoleMessage::Level
::Warning; | 192 case WarningMessageLevel: return TypeBuilder::Console::ConsoleMessage::Level
::Warning; |
| 187 case ErrorMessageLevel: return TypeBuilder::Console::ConsoleMessage::Level::
Error; | 193 case ErrorMessageLevel: return TypeBuilder::Console::ConsoleMessage::Level::
Error; |
| 188 } | 194 } |
| 189 return TypeBuilder::Console::ConsoleMessage::Level::Log; | 195 return TypeBuilder::Console::ConsoleMessage::Level::Log; |
| 190 } | 196 } |
| 191 | 197 |
| 192 void ConsoleMessage::addToFrontend(InspectorFrontend::Console* frontend, Injecte
dScriptManager* injectedScriptManager, bool generatePreview) | 198 PassRefPtr<TypeBuilder::Console::ConsoleMessage> ConsoleMessage::generateJSONWit
houtArguments() const |
| 193 { | 199 { |
| 194 RefPtr<TypeBuilder::Console::ConsoleMessage> jsonObj = TypeBuilder::Console:
:ConsoleMessage::create() | 200 RefPtr<TypeBuilder::Console::ConsoleMessage> jsonObj = TypeBuilder::Console:
:ConsoleMessage::create() |
| 195 .setSource(messageSourceValue(m_source)) | 201 .setSource(messageSourceValue(m_source)) |
| 196 .setLevel(messageLevelValue(m_level)) | 202 .setLevel(messageLevelValue(m_level)) |
| 197 .setText(m_message) | 203 .setText(m_message) |
| 198 .setTimestamp(m_timestamp); | 204 .setTimestamp(m_timestamp); |
| 199 // FIXME: only send out type for ConsoleAPI source messages. | 205 // FIXME: only send out type for ConsoleAPI source messages. |
| 200 jsonObj->setType(messageTypeValue(m_type)); | 206 jsonObj->setType(messageTypeValue(m_type)); |
| 201 jsonObj->setLine(static_cast<int>(m_line)); | 207 jsonObj->setLine(static_cast<int>(m_line)); |
| 202 jsonObj->setColumn(static_cast<int>(m_column)); | 208 jsonObj->setColumn(static_cast<int>(m_column)); |
| 203 jsonObj->setUrl(m_url); | 209 jsonObj->setUrl(m_url); |
| 210 jsonObj->setExecutionContextURL(m_executionContextURL); |
| 204 jsonObj->setRepeatCount(static_cast<int>(m_repeatCount)); | 211 jsonObj->setRepeatCount(static_cast<int>(m_repeatCount)); |
| 205 if (m_source == NetworkMessageSource && !m_requestId.isEmpty()) | 212 if (m_source == NetworkMessageSource && !m_requestId.isEmpty()) |
| 206 jsonObj->setNetworkRequestId(m_requestId); | 213 jsonObj->setNetworkRequestId(m_requestId); |
| 214 if (m_callStack) |
| 215 jsonObj->setStackTrace(m_callStack->buildInspectorArray()); |
| 216 return jsonObj; |
| 217 } |
| 218 |
| 219 void ConsoleMessage::addToFrontend(InspectorFrontend::Console* frontend, Injecte
dScriptManager* injectedScriptManager, bool generatePreview) |
| 220 { |
| 221 RefPtr<TypeBuilder::Console::ConsoleMessage> jsonObj = generateJSONWithoutAr
guments(); |
| 207 if (m_arguments && m_arguments->argumentCount()) { | 222 if (m_arguments && m_arguments->argumentCount()) { |
| 208 InjectedScript injectedScript = injectedScriptManager->injectedScriptFor
(m_arguments->globalState()); | 223 InjectedScript injectedScript = injectedScriptManager->injectedScriptFor
(m_arguments->globalState()); |
| 209 if (!injectedScript.hasNoValue()) { | 224 if (!injectedScript.hasNoValue()) { |
| 210 RefPtr<TypeBuilder::Array<TypeBuilder::Runtime::RemoteObject> > json
Args = TypeBuilder::Array<TypeBuilder::Runtime::RemoteObject>::create(); | 225 RefPtr<TypeBuilder::Array<TypeBuilder::Runtime::RemoteObject> > json
Args = TypeBuilder::Array<TypeBuilder::Runtime::RemoteObject>::create(); |
| 211 if (m_type == TableMessageType && generatePreview && m_arguments->ar
gumentCount()) { | 226 if (m_type == TableMessageType && generatePreview && m_arguments->ar
gumentCount()) { |
| 212 ScriptValue table = m_arguments->argumentAt(0); | 227 ScriptValue table = m_arguments->argumentAt(0); |
| 213 ScriptValue columns = m_arguments->argumentCount() > 1 ? m_argum
ents->argumentAt(1) : ScriptValue(); | 228 ScriptValue columns = m_arguments->argumentCount() > 1 ? m_argum
ents->argumentAt(1) : ScriptValue(); |
| 214 RefPtr<TypeBuilder::Runtime::RemoteObject> inspectorValue = inje
ctedScript.wrapTable(table, columns); | 229 RefPtr<TypeBuilder::Runtime::RemoteObject> inspectorValue = inje
ctedScript.wrapTable(table, columns); |
| 215 if (!inspectorValue) { | 230 if (!inspectorValue) { |
| 216 ASSERT_NOT_REACHED(); | 231 ASSERT_NOT_REACHED(); |
| 217 return; | 232 return; |
| 218 } | 233 } |
| 219 jsonArgs->addItem(inspectorValue); | 234 jsonArgs->addItem(inspectorValue); |
| 220 } else { | 235 } else { |
| 221 for (unsigned i = 0; i < m_arguments->argumentCount(); ++i) { | 236 for (unsigned i = 0; i < m_arguments->argumentCount(); ++i) { |
| 222 RefPtr<TypeBuilder::Runtime::RemoteObject> inspectorValue =
injectedScript.wrapObject(m_arguments->argumentAt(i), "console", generatePreview
); | 237 RefPtr<TypeBuilder::Runtime::RemoteObject> inspectorValue =
injectedScript.wrapObject(m_arguments->argumentAt(i), "console", generatePreview
); |
| 223 if (!inspectorValue) { | 238 if (!inspectorValue) { |
| 224 ASSERT_NOT_REACHED(); | 239 ASSERT_NOT_REACHED(); |
| 225 return; | 240 return; |
| 226 } | 241 } |
| 227 jsonArgs->addItem(inspectorValue); | 242 jsonArgs->addItem(inspectorValue); |
| 228 } | 243 } |
| 229 } | 244 } |
| 230 jsonObj->setParameters(jsonArgs); | 245 jsonObj->setParameters(jsonArgs); |
| 231 } | 246 } |
| 232 } | 247 } |
| 233 if (m_callStack) | |
| 234 jsonObj->setStackTrace(m_callStack->buildInspectorArray()); | |
| 235 frontend->messageAdded(jsonObj); | 248 frontend->messageAdded(jsonObj); |
| 236 } | 249 } |
| 237 | 250 |
| 238 void ConsoleMessage::incrementCount() | 251 void ConsoleMessage::incrementCount() |
| 239 { | 252 { |
| 240 m_timestamp = WTF::currentTime(); | 253 m_timestamp = WTF::currentTime(); |
| 241 ++m_repeatCount; | 254 ++m_repeatCount; |
| 242 } | 255 } |
| 243 | 256 |
| 244 void ConsoleMessage::updateRepeatCountInConsole(InspectorFrontend::Console* fron
tend) | 257 void ConsoleMessage::updateRepeatCountInConsole(InspectorFrontend::Console* fron
tend) |
| (...skipping 23 matching lines...) Expand all Loading... |
| 268 return msg->m_source == m_source | 281 return msg->m_source == m_source |
| 269 && msg->m_type == m_type | 282 && msg->m_type == m_type |
| 270 && msg->m_level == m_level | 283 && msg->m_level == m_level |
| 271 && msg->m_message == m_message | 284 && msg->m_message == m_message |
| 272 && msg->m_line == m_line | 285 && msg->m_line == m_line |
| 273 && msg->m_column == m_column | 286 && msg->m_column == m_column |
| 274 && msg->m_url == m_url | 287 && msg->m_url == m_url |
| 275 && msg->m_requestId == m_requestId; | 288 && msg->m_requestId == m_requestId; |
| 276 } | 289 } |
| 277 | 290 |
| 291 bool ConsoleMessage::hasGeneratedCallStack() const |
| 292 { |
| 293 return m_callStack; |
| 294 } |
| 295 |
| 278 void ConsoleMessage::windowCleared(DOMWindow* window) | 296 void ConsoleMessage::windowCleared(DOMWindow* window) |
| 279 { | 297 { |
| 280 if (!m_arguments) | 298 if (!m_arguments) |
| 281 return; | 299 return; |
| 282 if (m_arguments->globalState()->domWindow() != window) | 300 if (m_arguments->globalState()->domWindow() != window) |
| 283 return; | 301 return; |
| 284 if (!m_message) | 302 if (!m_message) |
| 285 m_message = "<message collected>"; | 303 m_message = "<message collected>"; |
| 286 m_arguments.clear(); | 304 m_arguments.clear(); |
| 287 } | 305 } |
| 288 | 306 |
| 289 unsigned ConsoleMessage::argumentCount() | 307 unsigned ConsoleMessage::argumentCount() |
| 290 { | 308 { |
| 291 if (m_arguments) | 309 if (m_arguments) |
| 292 return m_arguments->argumentCount(); | 310 return m_arguments->argumentCount(); |
| 293 return 0; | 311 return 0; |
| 294 } | 312 } |
| 295 | 313 |
| 296 } // namespace WebCore | 314 } // namespace WebCore |
| 297 | 315 |
| OLD | NEW |