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 |