Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(186)

Side by Side Diff: Source/core/inspector/ConsoleMessage.cpp

Issue 20191003: Route JS Error Info From Blink to Chrome (Closed) Base URL: https://chromium.googlesource.com/chromium/blink@gclient
Patch Set: Adam's requests Created 7 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698