OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright (C) 2011 Google Inc. All rights reserved. | 2 * Copyright (C) 2011 Google Inc. All rights reserved. |
3 * Copyright (C) 2007, 2008 Apple Inc. All rights reserved. | 3 * Copyright (C) 2007, 2008 Apple Inc. All rights reserved. |
4 * Copyright (C) 2009 Joseph Pecoraro | 4 * Copyright (C) 2009 Joseph Pecoraro |
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 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
139 | 139 |
140 /** | 140 /** |
141 * @return {!Element} | 141 * @return {!Element} |
142 */ | 142 */ |
143 _formatMessage: function() | 143 _formatMessage: function() |
144 { | 144 { |
145 var formattedMessage = createElement("span"); | 145 var formattedMessage = createElement("span"); |
146 WebInspector.appendStyle(formattedMessage, "components/objectValue.css") ; | 146 WebInspector.appendStyle(formattedMessage, "components/objectValue.css") ; |
147 formattedMessage.className = "console-message-text source-code"; | 147 formattedMessage.className = "console-message-text source-code"; |
148 | 148 |
149 /** | 149 var consoleMessage = this._message; |
150 * @param {string} title | 150 var messageElement = this._buildMessage(consoleMessage); |
151 * @return {!Element} | 151 formattedMessage.appendChild(messageElement); |
152 * @this {WebInspector.ConsoleMessage} | 152 |
153 */ | 153 var anchorElement = this._buildAnchor(consoleMessage); |
154 function linkifyRequest(title) | 154 if (anchorElement) { |
155 { | 155 // Append a space to prevent the anchor text from being glued to the console message when the user selects and copies the console messages. |
156 return WebInspector.Linkifier.linkifyUsingRevealer(/** @type {!WebIn spector.NetworkRequest} */ (this.request), title, this.request.url); | 156 anchorElement.appendChild(createTextNode(" ")); |
157 formattedMessage.insertBefore(anchorElement, formattedMessage.firstC hild); | |
157 } | 158 } |
158 | 159 |
159 var consoleMessage = this._message; | 160 var dumpStackTrace = !!consoleMessage.stackTrace && (consoleMessage.sour ce === WebInspector.ConsoleMessage.MessageSource.Network || consoleMessage.level === WebInspector.ConsoleMessage.MessageLevel.Error || consoleMessage.level === WebInspector.ConsoleMessage.MessageLevel.RevokedError || consoleMessage.type === WebInspector.ConsoleMessage.MessageType.Trace || consoleMessage.level === WebIn spector.ConsoleMessage.MessageLevel.Warning); |
160 var anchorElement; | 161 var target = this._target(); |
162 if (dumpStackTrace && target) { | |
163 var stackTracePreview = WebInspector.DOMPresentationUtils.buildStack TracePreviewContents(target, this._linkifier, consoleMessage.stackTrace); | |
164 var autoExpand = consoleMessage.type === WebInspector.ConsoleMessage .MessageType.Trace; | |
165 formattedMessage = this._wrapStackTraceFormatting(formattedMessage, stackTracePreview, autoExpand); | |
166 } | |
167 | |
168 return formattedMessage; | |
169 }, | |
170 | |
171 /** | |
172 * @param {!WebInspector.ConsoleMessage} consoleMessage | |
173 * @return {!Element} | |
174 */ | |
175 _buildMessage: function(consoleMessage) | |
176 { | |
161 var messageElement; | 177 var messageElement; |
162 if (consoleMessage.source === WebInspector.ConsoleMessage.MessageSource. ConsoleAPI) { | 178 if (consoleMessage.source === WebInspector.ConsoleMessage.MessageSource. ConsoleAPI) { |
163 switch (consoleMessage.type) { | 179 switch (consoleMessage.type) { |
164 case WebInspector.ConsoleMessage.MessageType.Trace: | 180 case WebInspector.ConsoleMessage.MessageType.Trace: |
165 messageElement = this._format(consoleMessage.parameters || ["con sole.trace"]); | 181 messageElement = this._format(consoleMessage.parameters || ["con sole.trace"]); |
166 break; | 182 break; |
167 case WebInspector.ConsoleMessage.MessageType.Clear: | 183 case WebInspector.ConsoleMessage.MessageType.Clear: |
168 messageElement = createTextNode(WebInspector.UIString("Console w as cleared")); | 184 messageElement = createElementWithClass("span", "console-info"); |
169 formattedMessage.classList.add("console-info"); | 185 messageElement.textContent = WebInspector.UIString("Console was cleared"); |
170 break; | 186 break; |
171 case WebInspector.ConsoleMessage.MessageType.Assert: | 187 case WebInspector.ConsoleMessage.MessageType.Assert: |
172 var args = [WebInspector.UIString("Assertion failed:")]; | 188 var args = [WebInspector.UIString("Assertion failed:")]; |
173 if (consoleMessage.parameters) | 189 if (consoleMessage.parameters) |
174 args = args.concat(consoleMessage.parameters); | 190 args = args.concat(consoleMessage.parameters); |
175 messageElement = this._format(args); | 191 messageElement = this._format(args); |
176 break; | 192 break; |
177 case WebInspector.ConsoleMessage.MessageType.Dir: | 193 case WebInspector.ConsoleMessage.MessageType.Dir: |
178 var obj = consoleMessage.parameters ? consoleMessage.parameters[ 0] : undefined; | 194 var obj = consoleMessage.parameters ? consoleMessage.parameters[ 0] : undefined; |
179 var args = ["%O", obj]; | 195 var args = ["%O", obj]; |
(...skipping 17 matching lines...) Expand all Loading... | |
197 messageElement.appendChild(WebInspector.Linkifier.linkifyUsi ngRevealer(consoleMessage.request, consoleMessage.request.url, consoleMessage.re quest.url)); | 213 messageElement.appendChild(WebInspector.Linkifier.linkifyUsi ngRevealer(consoleMessage.request, consoleMessage.request.url, consoleMessage.re quest.url)); |
198 if (consoleMessage.request.failed) | 214 if (consoleMessage.request.failed) |
199 messageElement.createTextChildren(" ", consoleMessage.re quest.localizedFailDescription); | 215 messageElement.createTextChildren(" ", consoleMessage.re quest.localizedFailDescription); |
200 else | 216 else |
201 messageElement.createTextChildren(" ", String(consoleMes sage.request.statusCode), " (", consoleMessage.request.statusText, ")"); | 217 messageElement.createTextChildren(" ", String(consoleMes sage.request.statusCode), " (", consoleMessage.request.statusText, ")"); |
202 } else { | 218 } else { |
203 var fragment = WebInspector.linkifyStringAsFragmentWithCusto mLinkifier(consoleMessage.messageText, linkifyRequest.bind(consoleMessage)); | 219 var fragment = WebInspector.linkifyStringAsFragmentWithCusto mLinkifier(consoleMessage.messageText, linkifyRequest.bind(consoleMessage)); |
204 messageElement.appendChild(fragment); | 220 messageElement.appendChild(fragment); |
205 } | 221 } |
206 } else { | 222 } else { |
207 var url = consoleMessage.url; | |
208 if (url) { | |
209 var isExternal = !WebInspector.resourceForURL(url) && !WebIn spector.networkMapping.uiSourceCodeForURLForAnyTarget(url); | |
210 anchorElement = WebInspector.linkifyURLAsNode(url, url, "con sole-message-url", isExternal); | |
211 } | |
luoe
2016/09/28 01:08:30
This chunk was moved to L:259
| |
212 messageElement = this._format([consoleMessage.messageText]); | 223 messageElement = this._format([consoleMessage.messageText]); |
213 } | 224 } |
214 } else { | 225 } else { |
215 var args = consoleMessage.parameters || [consoleMessage.messageText] ; | 226 var args = consoleMessage.parameters || [consoleMessage.messageText] ; |
216 messageElement = this._format(args); | 227 messageElement = this._format(args); |
217 } | 228 } |
218 | 229 |
230 return messageElement; | |
231 | |
232 /** | |
233 * @param {string} title | |
234 * @return {!Element} | |
235 * @this {WebInspector.ConsoleMessage} | |
236 */ | |
237 function linkifyRequest(title) | |
238 { | |
239 return WebInspector.Linkifier.linkifyUsingRevealer(/** @type {!WebIn spector.NetworkRequest} */ (this.request), title, this.request.url); | |
240 } | |
241 }, | |
242 | |
243 /** | |
244 * @param {!WebInspector.ConsoleMessage} consoleMessage | |
245 * @return {?Element} | |
246 */ | |
247 _buildAnchor: function(consoleMessage) | |
248 { | |
249 var anchorElement = null; | |
219 if (consoleMessage.source !== WebInspector.ConsoleMessage.MessageSource. Network || consoleMessage.request) { | 250 if (consoleMessage.source !== WebInspector.ConsoleMessage.MessageSource. Network || consoleMessage.request) { |
220 if (consoleMessage.scriptId) { | 251 if (consoleMessage.scriptId) { |
221 anchorElement = this._linkifyScriptId(consoleMessage.scriptId, c onsoleMessage.url || "", consoleMessage.line, consoleMessage.column); | 252 anchorElement = this._linkifyScriptId(consoleMessage.scriptId, c onsoleMessage.url || "", consoleMessage.line, consoleMessage.column); |
222 } else { | 253 } else { |
223 if (consoleMessage.stackTrace && consoleMessage.stackTrace.callF rames.length) | 254 if (consoleMessage.stackTrace && consoleMessage.stackTrace.callF rames.length) |
224 anchorElement = this._linkifyStackTraceTopFrame(consoleMessa ge.stackTrace); | 255 anchorElement = this._linkifyStackTraceTopFrame(consoleMessa ge.stackTrace); |
225 else if (consoleMessage.url && consoleMessage.url !== "undefined ") | 256 else if (consoleMessage.url && consoleMessage.url !== "undefined ") |
226 anchorElement = this._linkifyLocation(consoleMessage.url, co nsoleMessage.line, consoleMessage.column); | 257 anchorElement = this._linkifyLocation(consoleMessage.url, co nsoleMessage.line, consoleMessage.column); |
227 } | 258 } |
259 } else if (consoleMessage.url) { | |
260 var url = consoleMessage.url; | |
261 var isExternal = !WebInspector.resourceForURL(url) && !WebInspector. networkMapping.uiSourceCodeForURLForAnyTarget(url); | |
262 anchorElement = WebInspector.linkifyURLAsNode(url, url, "console-mes sage-url", isExternal); | |
228 } | 263 } |
229 | 264 |
230 formattedMessage.appendChild(messageElement); | 265 return anchorElement; |
231 if (anchorElement) { | |
232 // Append a space to prevent the anchor text from being glued to the console message when the user selects and copies the console messages. | |
233 anchorElement.appendChild(createTextNode(" ")); | |
234 formattedMessage.insertBefore(anchorElement, formattedMessage.firstC hild); | |
235 } | |
236 | |
237 var dumpStackTrace = !!consoleMessage.stackTrace && (consoleMessage.sour ce === WebInspector.ConsoleMessage.MessageSource.Network || consoleMessage.level === WebInspector.ConsoleMessage.MessageLevel.Error || consoleMessage.level === WebInspector.ConsoleMessage.MessageLevel.RevokedError || consoleMessage.type === WebInspector.ConsoleMessage.MessageType.Trace || consoleMessage.level === WebIn spector.ConsoleMessage.MessageLevel.Warning); | |
238 var target = this._target(); | |
239 if (dumpStackTrace && target) { | |
240 var toggleElement = createElementWithClass("div", "console-message-s tack-trace-toggle"); | |
241 var triangleElement = toggleElement.createChild("div", "console-mess age-stack-trace-triangle"); | |
242 var contentElement = toggleElement.createChild("div", "console-messa ge-stack-trace-wrapper"); | |
243 | |
244 var clickableElement = contentElement.createChild("div"); | |
245 clickableElement.appendChild(formattedMessage); | |
246 var stackTraceElement = contentElement.createChild("div"); | |
247 stackTraceElement.appendChild(WebInspector.DOMPresentationUtils.buil dStackTracePreviewContents(target, this._linkifier, this._message.stackTrace)); | |
248 stackTraceElement.classList.add("hidden"); | |
249 | |
250 /** | |
251 * @param {boolean} expand | |
252 */ | |
253 function expandStackTrace(expand) | |
254 { | |
255 stackTraceElement.classList.toggle("hidden", !expand); | |
256 toggleElement.classList.toggle("expanded", expand); | |
257 } | |
258 | |
259 /** | |
260 * @param {?Event} event | |
261 */ | |
262 function toggleStackTrace(event) | |
263 { | |
264 if (event.target.hasSelection()) | |
265 return; | |
266 expandStackTrace(stackTraceElement.classList.contains("hidden")) ; | |
267 event.consume(); | |
268 } | |
269 | |
270 clickableElement.addEventListener("click", toggleStackTrace, false); | |
271 triangleElement.addEventListener("click", toggleStackTrace, false); | |
272 if (consoleMessage.type === WebInspector.ConsoleMessage.MessageType. Trace) | |
273 expandStackTrace(true); | |
274 | |
275 toggleElement._expandStackTraceForTest = expandStackTrace.bind(null, true); | |
276 formattedMessage = toggleElement; | |
277 } | |
278 | |
279 return formattedMessage; | |
280 }, | 266 }, |
281 | 267 |
282 /** | 268 /** |
269 * @param {!Element} contents | |
270 * @param {!Element} stackTracePreview | |
271 * @param {boolean=} autoExpand | |
272 * @return {!Element} | |
273 */ | |
274 _wrapStackTraceFormatting: function(contents, stackTracePreview, autoExpand) | |
275 { | |
276 var toggleElement = createElementWithClass("div", "console-message-stack -trace-toggle"); | |
277 var triangleElement = toggleElement.createChild("div", "console-message- stack-trace-triangle"); | |
278 var contentElement = toggleElement.createChild("div", "console-message-s tack-trace-wrapper"); | |
279 | |
280 var clickableElement = contentElement.createChild("div"); | |
281 clickableElement.appendChild(contents); | |
282 var stackTraceElement = contentElement.createChild("div"); | |
283 stackTraceElement.appendChild(stackTracePreview); | |
284 stackTraceElement.classList.add("hidden"); | |
285 | |
286 /** | |
287 * @param {boolean} expand | |
288 */ | |
289 function expandStackTrace(expand) | |
290 { | |
291 stackTraceElement.classList.toggle("hidden", !expand); | |
292 toggleElement.classList.toggle("expanded", expand); | |
293 } | |
294 | |
295 /** | |
296 * @param {?Event} event | |
297 */ | |
298 function toggleStackTrace(event) | |
299 { | |
300 if (event.target.hasSelection()) | |
301 return; | |
302 expandStackTrace(stackTraceElement.classList.contains("hidden")); | |
303 event.consume(); | |
304 } | |
305 | |
306 clickableElement.addEventListener("click", toggleStackTrace, false); | |
307 triangleElement.addEventListener("click", toggleStackTrace, false); | |
308 if (autoExpand) | |
309 expandStackTrace(true); | |
310 | |
311 toggleElement._expandStackTraceForTest = expandStackTrace.bind(null, tru e); | |
312 return toggleElement; | |
313 }, | |
314 | |
315 /** | |
283 * @param {string} url | 316 * @param {string} url |
284 * @param {number} lineNumber | 317 * @param {number} lineNumber |
285 * @param {number} columnNumber | 318 * @param {number} columnNumber |
286 * @return {?Element} | 319 * @return {?Element} |
287 */ | 320 */ |
288 _linkifyLocation: function(url, lineNumber, columnNumber) | 321 _linkifyLocation: function(url, lineNumber, columnNumber) |
289 { | 322 { |
290 var target = this._target(); | 323 var target = this._target(); |
291 if (!target) | 324 if (!target) |
292 return null; | 325 return null; |
(...skipping 20 matching lines...) Expand all Loading... | |
313 * @return {?Element} | 346 * @return {?Element} |
314 */ | 347 */ |
315 _linkifyScriptId: function(scriptId, url, lineNumber, columnNumber) | 348 _linkifyScriptId: function(scriptId, url, lineNumber, columnNumber) |
316 { | 349 { |
317 var target = this._target(); | 350 var target = this._target(); |
318 if (!target) | 351 if (!target) |
319 return null; | 352 return null; |
320 return this._linkifier.linkifyScriptLocation(target, scriptId, url, line Number, columnNumber, "console-message-url"); | 353 return this._linkifier.linkifyScriptLocation(target, scriptId, url, line Number, columnNumber, "console-message-url"); |
321 }, | 354 }, |
322 | 355 |
356 /** | |
357 * @param {!Array.<!WebInspector.RemoteObject|string>} parameters | |
358 * @return {!Element} | |
359 */ | |
323 _format: function(parameters) | 360 _format: function(parameters) |
324 { | 361 { |
325 // This node is used like a Builder. Values are continually appended ont o it. | 362 // This node is used like a Builder. Values are continually appended ont o it. |
326 var formattedResult = createElement("span"); | 363 var formattedResult = createElement("span"); |
327 if (!parameters.length) | 364 if (!parameters.length) |
328 return formattedResult; | 365 return formattedResult; |
329 | 366 |
330 var target = this._target(); | 367 var target = this._target(); |
331 | 368 |
332 // Formatting code below assumes that parameters are all wrappers wherea s frontend console | 369 // Formatting code below assumes that parameters are all wrappers wherea s frontend console |
333 // API allows passing arbitrary values as messages (strings, numbers, et c.). Wrap them here. | 370 // API allows passing arbitrary values as messages (strings, numbers, et c.). Wrap them here. |
334 for (var i = 0; i < parameters.length; ++i) { | 371 for (var i = 0; i < parameters.length; ++i) { |
335 // FIXME: Only pass runtime wrappers here. | 372 // FIXME: Only pass runtime wrappers here. |
336 if (parameters[i] instanceof WebInspector.RemoteObject) | 373 if (parameters[i] instanceof WebInspector.RemoteObject) |
337 continue; | 374 continue; |
338 | 375 |
339 if (!target) { | 376 if (!target) { |
340 parameters[i] = WebInspector.RemoteObject.fromLocalObject(parame ters[i]); | 377 parameters[i] = WebInspector.RemoteObject.fromLocalObject(parame ters[i]); |
341 continue; | 378 continue; |
342 } | 379 } |
343 | 380 |
344 if (typeof parameters[i] === "object") | 381 if (typeof parameters[i] === "object") |
345 parameters[i] = target.runtimeModel.createRemoteObject(parameter s[i]); | 382 parameters[i] = target.runtimeModel.createRemoteObject(parameter s[i]); |
346 else | 383 else |
347 parameters[i] = target.runtimeModel.createRemoteObjectFromPrimit iveValue(parameters[i]); | 384 parameters[i] = target.runtimeModel.createRemoteObjectFromPrimit iveValue(parameters[i]); |
348 } | 385 } |
349 | 386 |
350 // There can be string log and string eval result. We distinguish betwee n them based on message type. | 387 // There can be string log and string eval result. We distinguish betwee n them based on message type. |
351 var shouldFormatMessage = WebInspector.RemoteObject.type(parameters[0]) === "string" && (this._message.type !== WebInspector.ConsoleMessage.MessageType. Result || this._message.level === WebInspector.ConsoleMessage.MessageLevel.Error || this._message.level === WebInspector.ConsoleMessage.MessageLevel.RevokedErro r); | 388 var shouldFormatMessage = WebInspector.RemoteObject.type((/** @type {!Ar ray.<!WebInspector.RemoteObject>} **/ (parameters))[0]) === "string" && (this._m essage.type !== WebInspector.ConsoleMessage.MessageType.Result || this._message. level === WebInspector.ConsoleMessage.MessageLevel.Error || this._message.level === WebInspector.ConsoleMessage.MessageLevel.RevokedError); |
352 | 389 |
353 // Multiple parameters with the first being a format string. Save unused substitutions. | 390 // Multiple parameters with the first being a format string. Save unused substitutions. |
354 if (shouldFormatMessage) { | 391 if (shouldFormatMessage) { |
355 // Multiple parameters with the first being a format string. Save un used substitutions. | 392 var result = this._formatWithSubstitutionString(/** @type {string} * */ (parameters[0].description), parameters.slice(1), formattedResult); |
356 var result = this._formatWithSubstitutionString(parameters[0].descri ption, parameters.slice(1), formattedResult); | |
357 parameters = result.unusedSubstitutions; | 393 parameters = result.unusedSubstitutions; |
358 if (parameters.length) | 394 if (parameters.length) |
359 formattedResult.createTextChild(" "); | 395 formattedResult.createTextChild(" "); |
360 } | 396 } |
361 | 397 |
362 if (this._message.type === WebInspector.ConsoleMessage.MessageType.Table ) { | 398 if (this._message.type === WebInspector.ConsoleMessage.MessageType.Table ) { |
363 formattedResult.appendChild(this._formatParameterAsTable(parameters) ); | 399 formattedResult.appendChild(this._formatParameterAsTable(parameters) ); |
364 return formattedResult; | 400 return formattedResult; |
365 } | 401 } |
366 | 402 |
(...skipping 385 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
752 } | 788 } |
753 rootElement.appendChild(this._previewFormatter.renderPropertyPre view(type, subtype, description)); | 789 rootElement.appendChild(this._previewFormatter.renderPropertyPre view(type, subtype, description)); |
754 } | 790 } |
755 } | 791 } |
756 | 792 |
757 return rootElement; | 793 return rootElement; |
758 }, | 794 }, |
759 | 795 |
760 /** | 796 /** |
761 * @param {string} format | 797 * @param {string} format |
762 * @param {!Array.<string>} parameters | 798 * @param {!Array.<!WebInspector.RemoteObject>} parameters |
luoe
2016/09/28 01:08:30
Note: the old version was incorrect. It actually
| |
763 * @param {!Element} formattedResult | 799 * @param {!Element} formattedResult |
764 */ | 800 */ |
765 _formatWithSubstitutionString: function(format, parameters, formattedResult) | 801 _formatWithSubstitutionString: function(format, parameters, formattedResult) |
766 { | 802 { |
767 var formatters = {}; | 803 var formatters = {}; |
768 | 804 |
769 /** | 805 /** |
770 * @param {boolean} force | 806 * @param {boolean} force |
771 * @param {!WebInspector.RemoteObject} obj | 807 * @param {!WebInspector.RemoteObject} obj |
772 * @return {!Element} | 808 * @return {!Element} |
(...skipping 461 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1234 { | 1270 { |
1235 if (!this._element) { | 1271 if (!this._element) { |
1236 WebInspector.ConsoleViewMessage.prototype.toMessageElement.call(this ); | 1272 WebInspector.ConsoleViewMessage.prototype.toMessageElement.call(this ); |
1237 this._element.classList.toggle("collapsed", this._collapsed); | 1273 this._element.classList.toggle("collapsed", this._collapsed); |
1238 } | 1274 } |
1239 return this._element; | 1275 return this._element; |
1240 }, | 1276 }, |
1241 | 1277 |
1242 __proto__: WebInspector.ConsoleViewMessage.prototype | 1278 __proto__: WebInspector.ConsoleViewMessage.prototype |
1243 } | 1279 } |
OLD | NEW |