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

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: 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_executionContextURL()
abarth-chromium 2013/07/24 23:59:09 There's no need to call the default constructor ex
Devlin 2013/07/25 00:10:46 Yeah, I was just wondering if it was Blink style (
54 , m_url() 55 , m_url()
55 , m_line(0) 56 , m_line(0)
56 , m_column(0) 57 , m_column(0)
57 , m_repeatCount(1) 58 , m_repeatCount(1)
58 , m_requestId(IdentifiersFactory::requestId(0)) 59 , m_requestId(IdentifiersFactory::requestId(0))
59 , m_timestamp(WTF::currentTime()) 60 , m_timestamp(WTF::currentTime())
60 { 61 {
61 autogenerateMetadata(canGenerateCallStack); 62 autogenerateMetadata(canGenerateCallStack);
62 } 63 }
63 64
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) 65 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) 66 : m_source(source)
66 , m_type(type) 67 , m_type(type)
67 , m_level(level) 68 , m_level(level)
68 , m_message(message) 69 , m_message(message)
70 , m_executionContextURL(executionContextURL)
69 , m_url(url) 71 , m_url(url)
70 , m_line(line) 72 , m_line(line)
71 , m_column(column) 73 , m_column(column)
72 , m_repeatCount(1) 74 , m_repeatCount(1)
73 , m_requestId(IdentifiersFactory::requestId(requestIdentifier)) 75 , m_requestId(IdentifiersFactory::requestId(requestIdentifier))
74 , m_timestamp(WTF::currentTime()) 76 , m_timestamp(WTF::currentTime())
75 { 77 {
76 autogenerateMetadata(canGenerateCallStack, state); 78 autogenerateMetadata(canGenerateCallStack, state);
77 } 79 }
78 80
79 ConsoleMessage::ConsoleMessage(bool, MessageSource source, MessageType type, Mes sageLevel level, const String& message, PassRefPtr<ScriptCallStack> callStack, u nsigned long requestIdentifier) 81 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) 82 : m_source(source)
81 , m_type(type) 83 , m_type(type)
82 , m_level(level) 84 , m_level(level)
83 , m_message(message) 85 , m_message(message)
86 , m_executionContextURL(executionContextURL)
84 , m_arguments(0) 87 , m_arguments(0)
85 , m_line(0) 88 , m_line(0)
86 , m_column(0) 89 , m_column(0)
87 , m_repeatCount(1) 90 , m_repeatCount(1)
88 , m_requestId(IdentifiersFactory::requestId(requestIdentifier)) 91 , m_requestId(IdentifiersFactory::requestId(requestIdentifier))
89 , m_timestamp(WTF::currentTime()) 92 , m_timestamp(WTF::currentTime())
90 { 93 {
91 if (callStack && callStack->size()) { 94 if (callStack && callStack->size()) {
92 const ScriptCallFrame& frame = callStack->at(0); 95 const ScriptCallFrame& frame = callStack->at(0);
93 m_url = frame.sourceURL(); 96 m_url = frame.sourceURL();
94 m_line = frame.lineNumber(); 97 m_line = frame.lineNumber();
95 m_column = frame.columnNumber(); 98 m_column = frame.columnNumber();
96 } 99 }
97 m_callStack = callStack; 100 m_callStack = callStack;
98 } 101 }
99 102
100 ConsoleMessage::ConsoleMessage(bool canGenerateCallStack, MessageSource source, MessageType type, MessageLevel level, const String& message, PassRefPtr<ScriptAr guments> arguments, ScriptState* state, unsigned long requestIdentifier) 103 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) 104 : m_source(source)
102 , m_type(type) 105 , m_type(type)
103 , m_level(level) 106 , m_level(level)
104 , m_message(message) 107 , m_message(message)
108 , m_executionContextURL(executionContextURL)
105 , m_arguments(arguments) 109 , m_arguments(arguments)
106 , m_url() 110 , m_url()
107 , m_line(0) 111 , m_line(0)
108 , m_column(0) 112 , m_column(0)
109 , m_repeatCount(1) 113 , m_repeatCount(1)
110 , m_requestId(IdentifiersFactory::requestId(requestIdentifier)) 114 , m_requestId(IdentifiersFactory::requestId(requestIdentifier))
111 , m_timestamp(WTF::currentTime()) 115 , m_timestamp(WTF::currentTime())
112 { 116 {
113 autogenerateMetadata(canGenerateCallStack, state); 117 autogenerateMetadata(canGenerateCallStack, state);
114 } 118 }
115 119
116 ConsoleMessage::~ConsoleMessage() 120 ConsoleMessage::~ConsoleMessage()
117 { 121 {
118 } 122 }
119 123
120 void ConsoleMessage::autogenerateMetadata(bool canGenerateCallStack, ScriptState * state) 124 void ConsoleMessage::autogenerateMetadata(bool canGenerateCallStack, ScriptState * state)
121 { 125 {
122 if (m_type == EndGroupMessageType) 126 if (m_type == EndGroupMessageType)
123 return; 127 return;
124 128
125 if (state) 129 if (canGenerateCallStack)
130 generateCallStack(ScriptCallStack::maxCallStackSizeToCapture);
131 else if (state)
126 m_callStack = createScriptCallStackForConsole(state); 132 m_callStack = createScriptCallStackForConsole(state);
127 else if (canGenerateCallStack)
128 m_callStack = createScriptCallStack(ScriptCallStack::maxCallStackSizeToC apture, true);
129 else 133 else
130 return; 134 return;
131 135
132 if (m_callStack && m_callStack->size()) { 136 if (m_callStack && m_callStack->size()) {
133 const ScriptCallFrame& frame = m_callStack->at(0); 137 const ScriptCallFrame& frame = m_callStack->at(0);
134 m_url = frame.sourceURL(); 138 m_url = frame.sourceURL();
135 m_line = frame.lineNumber(); 139 m_line = frame.lineNumber();
136 m_column = frame.columnNumber(); 140 m_column = frame.columnNumber();
137 return; 141 return;
138 } 142 }
139 143
140 m_callStack.clear(); 144 m_callStack.clear();
141 } 145 }
142 146
147 void ConsoleMessage::generateCallStack(size_t maxSizeToCapture)
148 {
149 m_callStack = createScriptCallStack(maxSizeToCapture, true);
150 }
151
143 static TypeBuilder::Console::ConsoleMessage::Source::Enum messageSourceValue(Mes sageSource source) 152 static TypeBuilder::Console::ConsoleMessage::Source::Enum messageSourceValue(Mes sageSource source)
144 { 153 {
145 switch (source) { 154 switch (source) {
146 case XMLMessageSource: return TypeBuilder::Console::ConsoleMessage::Source:: Xml; 155 case XMLMessageSource: return TypeBuilder::Console::ConsoleMessage::Source:: Xml;
147 case JSMessageSource: return TypeBuilder::Console::ConsoleMessage::Source::J avascript; 156 case JSMessageSource: return TypeBuilder::Console::ConsoleMessage::Source::J avascript;
148 case NetworkMessageSource: return TypeBuilder::Console::ConsoleMessage::Sour ce::Network; 157 case NetworkMessageSource: return TypeBuilder::Console::ConsoleMessage::Sour ce::Network;
149 case ConsoleAPIMessageSource: return TypeBuilder::Console::ConsoleMessage::S ource::Console_api; 158 case ConsoleAPIMessageSource: return TypeBuilder::Console::ConsoleMessage::S ource::Console_api;
150 case StorageMessageSource: return TypeBuilder::Console::ConsoleMessage::Sour ce::Storage; 159 case StorageMessageSource: return TypeBuilder::Console::ConsoleMessage::Sour ce::Storage;
151 case AppCacheMessageSource: return TypeBuilder::Console::ConsoleMessage::Sou rce::Appcache; 160 case AppCacheMessageSource: return TypeBuilder::Console::ConsoleMessage::Sou rce::Appcache;
152 case RenderingMessageSource: return TypeBuilder::Console::ConsoleMessage::So urce::Rendering; 161 case RenderingMessageSource: return TypeBuilder::Console::ConsoleMessage::So urce::Rendering;
(...skipping 29 matching lines...) Expand all
182 { 191 {
183 switch (level) { 192 switch (level) {
184 case DebugMessageLevel: return TypeBuilder::Console::ConsoleMessage::Level:: Debug; 193 case DebugMessageLevel: return TypeBuilder::Console::ConsoleMessage::Level:: Debug;
185 case LogMessageLevel: return TypeBuilder::Console::ConsoleMessage::Level::Lo g; 194 case LogMessageLevel: return TypeBuilder::Console::ConsoleMessage::Level::Lo g;
186 case WarningMessageLevel: return TypeBuilder::Console::ConsoleMessage::Level ::Warning; 195 case WarningMessageLevel: return TypeBuilder::Console::ConsoleMessage::Level ::Warning;
187 case ErrorMessageLevel: return TypeBuilder::Console::ConsoleMessage::Level:: Error; 196 case ErrorMessageLevel: return TypeBuilder::Console::ConsoleMessage::Level:: Error;
188 } 197 }
189 return TypeBuilder::Console::ConsoleMessage::Level::Log; 198 return TypeBuilder::Console::ConsoleMessage::Level::Log;
190 } 199 }
191 200
192 void ConsoleMessage::addToFrontend(InspectorFrontend::Console* frontend, Injecte dScriptManager* injectedScriptManager, bool generatePreview) 201 PassRefPtr<TypeBuilder::Console::ConsoleMessage> ConsoleMessage::generateJSONWit houtArguments() const
193 { 202 {
194 RefPtr<TypeBuilder::Console::ConsoleMessage> jsonObj = TypeBuilder::Console: :ConsoleMessage::create() 203 RefPtr<TypeBuilder::Console::ConsoleMessage> jsonObj = TypeBuilder::Console: :ConsoleMessage::create()
195 .setSource(messageSourceValue(m_source)) 204 .setSource(messageSourceValue(m_source))
196 .setLevel(messageLevelValue(m_level)) 205 .setLevel(messageLevelValue(m_level))
197 .setText(m_message) 206 .setText(m_message)
198 .setTimestamp(m_timestamp); 207 .setTimestamp(m_timestamp);
199 // FIXME: only send out type for ConsoleAPI source messages. 208 // FIXME: only send out type for ConsoleAPI source messages.
200 jsonObj->setType(messageTypeValue(m_type)); 209 jsonObj->setType(messageTypeValue(m_type));
201 jsonObj->setLine(static_cast<int>(m_line)); 210 jsonObj->setLine(static_cast<int>(m_line));
202 jsonObj->setColumn(static_cast<int>(m_column)); 211 jsonObj->setColumn(static_cast<int>(m_column));
203 jsonObj->setUrl(m_url); 212 jsonObj->setUrl(m_url);
213 jsonObj->setExecutionContextURL(m_executionContextURL);
204 jsonObj->setRepeatCount(static_cast<int>(m_repeatCount)); 214 jsonObj->setRepeatCount(static_cast<int>(m_repeatCount));
205 if (m_source == NetworkMessageSource && !m_requestId.isEmpty()) 215 if (m_source == NetworkMessageSource && !m_requestId.isEmpty())
206 jsonObj->setNetworkRequestId(m_requestId); 216 jsonObj->setNetworkRequestId(m_requestId);
217 if (m_callStack)
218 jsonObj->setStackTrace(m_callStack->buildInspectorArray());
219 return jsonObj;
220 }
221
222 void ConsoleMessage::addToFrontend(InspectorFrontend::Console* frontend, Injecte dScriptManager* injectedScriptManager, bool generatePreview)
223 {
224 RefPtr<TypeBuilder::Console::ConsoleMessage> jsonObj = generateJSONWithoutAr guments();
207 if (m_arguments && m_arguments->argumentCount()) { 225 if (m_arguments && m_arguments->argumentCount()) {
208 InjectedScript injectedScript = injectedScriptManager->injectedScriptFor (m_arguments->globalState()); 226 InjectedScript injectedScript = injectedScriptManager->injectedScriptFor (m_arguments->globalState());
209 if (!injectedScript.hasNoValue()) { 227 if (!injectedScript.hasNoValue()) {
210 RefPtr<TypeBuilder::Array<TypeBuilder::Runtime::RemoteObject> > json Args = TypeBuilder::Array<TypeBuilder::Runtime::RemoteObject>::create(); 228 RefPtr<TypeBuilder::Array<TypeBuilder::Runtime::RemoteObject> > json Args = TypeBuilder::Array<TypeBuilder::Runtime::RemoteObject>::create();
211 if (m_type == TableMessageType && generatePreview && m_arguments->ar gumentCount()) { 229 if (m_type == TableMessageType && generatePreview && m_arguments->ar gumentCount()) {
212 ScriptValue table = m_arguments->argumentAt(0); 230 ScriptValue table = m_arguments->argumentAt(0);
213 ScriptValue columns = m_arguments->argumentCount() > 1 ? m_argum ents->argumentAt(1) : ScriptValue(); 231 ScriptValue columns = m_arguments->argumentCount() > 1 ? m_argum ents->argumentAt(1) : ScriptValue();
214 RefPtr<TypeBuilder::Runtime::RemoteObject> inspectorValue = inje ctedScript.wrapTable(table, columns); 232 RefPtr<TypeBuilder::Runtime::RemoteObject> inspectorValue = inje ctedScript.wrapTable(table, columns);
215 if (!inspectorValue) { 233 if (!inspectorValue) {
216 ASSERT_NOT_REACHED(); 234 ASSERT_NOT_REACHED();
217 return; 235 return;
218 } 236 }
219 jsonArgs->addItem(inspectorValue); 237 jsonArgs->addItem(inspectorValue);
220 } else { 238 } else {
221 for (unsigned i = 0; i < m_arguments->argumentCount(); ++i) { 239 for (unsigned i = 0; i < m_arguments->argumentCount(); ++i) {
222 RefPtr<TypeBuilder::Runtime::RemoteObject> inspectorValue = injectedScript.wrapObject(m_arguments->argumentAt(i), "console", generatePreview ); 240 RefPtr<TypeBuilder::Runtime::RemoteObject> inspectorValue = injectedScript.wrapObject(m_arguments->argumentAt(i), "console", generatePreview );
223 if (!inspectorValue) { 241 if (!inspectorValue) {
224 ASSERT_NOT_REACHED(); 242 ASSERT_NOT_REACHED();
225 return; 243 return;
226 } 244 }
227 jsonArgs->addItem(inspectorValue); 245 jsonArgs->addItem(inspectorValue);
228 } 246 }
229 } 247 }
230 jsonObj->setParameters(jsonArgs); 248 jsonObj->setParameters(jsonArgs);
231 } 249 }
232 } 250 }
233 if (m_callStack)
234 jsonObj->setStackTrace(m_callStack->buildInspectorArray());
235 frontend->messageAdded(jsonObj); 251 frontend->messageAdded(jsonObj);
236 } 252 }
237 253
238 void ConsoleMessage::incrementCount() 254 void ConsoleMessage::incrementCount()
239 { 255 {
240 m_timestamp = WTF::currentTime(); 256 m_timestamp = WTF::currentTime();
241 ++m_repeatCount; 257 ++m_repeatCount;
242 } 258 }
243 259
244 void ConsoleMessage::updateRepeatCountInConsole(InspectorFrontend::Console* fron tend) 260 void ConsoleMessage::updateRepeatCountInConsole(InspectorFrontend::Console* fron tend)
(...skipping 23 matching lines...) Expand all
268 return msg->m_source == m_source 284 return msg->m_source == m_source
269 && msg->m_type == m_type 285 && msg->m_type == m_type
270 && msg->m_level == m_level 286 && msg->m_level == m_level
271 && msg->m_message == m_message 287 && msg->m_message == m_message
272 && msg->m_line == m_line 288 && msg->m_line == m_line
273 && msg->m_column == m_column 289 && msg->m_column == m_column
274 && msg->m_url == m_url 290 && msg->m_url == m_url
275 && msg->m_requestId == m_requestId; 291 && msg->m_requestId == m_requestId;
276 } 292 }
277 293
294 bool ConsoleMessage::hasGeneratedCallStack() const
295 {
296 return m_callStack;
297 }
298
278 void ConsoleMessage::windowCleared(DOMWindow* window) 299 void ConsoleMessage::windowCleared(DOMWindow* window)
279 { 300 {
280 if (!m_arguments) 301 if (!m_arguments)
281 return; 302 return;
282 if (m_arguments->globalState()->domWindow() != window) 303 if (m_arguments->globalState()->domWindow() != window)
283 return; 304 return;
284 if (!m_message) 305 if (!m_message)
285 m_message = "<message collected>"; 306 m_message = "<message collected>";
286 m_arguments.clear(); 307 m_arguments.clear();
287 } 308 }
288 309
289 unsigned ConsoleMessage::argumentCount() 310 unsigned ConsoleMessage::argumentCount()
290 { 311 {
291 if (m_arguments) 312 if (m_arguments)
292 return m_arguments->argumentCount(); 313 return m_arguments->argumentCount();
293 return 0; 314 return 0;
294 } 315 }
295 316
296 } // namespace WebCore 317 } // namespace WebCore
297 318
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698