| 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 12 matching lines...) Expand all Loading... |
| 23 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | 23 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
| 24 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | 24 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
| 25 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | 25 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND |
| 26 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 26 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
| 28 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 28 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 29 */ | 29 */ |
| 30 | 30 |
| 31 /** | 31 /** |
| 32 * @constructor | 32 * @constructor |
| 33 * @extends {WebInspector.TargetAware} |
| 33 * @param {!WebInspector.Target} target | 34 * @param {!WebInspector.Target} target |
| 34 * @param {!WebInspector.ConsoleMessage} consoleMessage | 35 * @param {!WebInspector.ConsoleMessage} consoleMessage |
| 35 * @param {?WebInspector.Linkifier} linkifier | 36 * @param {?WebInspector.Linkifier} linkifier |
| 36 */ | 37 */ |
| 37 WebInspector.ConsoleViewMessage = function(target, consoleMessage, linkifier) | 38 WebInspector.ConsoleViewMessage = function(target, consoleMessage, linkifier) |
| 38 { | 39 { |
| 40 WebInspector.TargetAware.call(this, target); |
| 39 this._message = consoleMessage; | 41 this._message = consoleMessage; |
| 40 this._linkifier = linkifier; | 42 this._linkifier = linkifier; |
| 41 this._target = target; | |
| 42 this._repeatCount = 1; | 43 this._repeatCount = 1; |
| 43 | 44 |
| 44 /** @type {!Array.<!WebInspector.DataGrid>} */ | 45 /** @type {!Array.<!WebInspector.DataGrid>} */ |
| 45 this._dataGrids = []; | 46 this._dataGrids = []; |
| 46 /** @type {!Map.<!WebInspector.DataGrid, ?Element>} */ | 47 /** @type {!Map.<!WebInspector.DataGrid, ?Element>} */ |
| 47 this._dataGridParents = new Map(); | 48 this._dataGridParents = new Map(); |
| 48 | 49 |
| 49 this._customFormatters = { | 50 this._customFormatters = { |
| 50 "object": this._formatParameterAsObject, | 51 "object": this._formatParameterAsObject, |
| 51 "array": this._formatParameterAsArray, | 52 "array": this._formatParameterAsArray, |
| (...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 216 */ | 217 */ |
| 217 _linkifyLocation: function(url, lineNumber, columnNumber) | 218 _linkifyLocation: function(url, lineNumber, columnNumber) |
| 218 { | 219 { |
| 219 console.assert(this._linkifier); | 220 console.assert(this._linkifier); |
| 220 if (!this._linkifier) | 221 if (!this._linkifier) |
| 221 return null; | 222 return null; |
| 222 // FIXME(62725): stack trace line/column numbers are one-based. | 223 // FIXME(62725): stack trace line/column numbers are one-based. |
| 223 lineNumber = lineNumber ? lineNumber - 1 : 0; | 224 lineNumber = lineNumber ? lineNumber - 1 : 0; |
| 224 columnNumber = columnNumber ? columnNumber - 1 : 0; | 225 columnNumber = columnNumber ? columnNumber - 1 : 0; |
| 225 if (this._message.source === WebInspector.ConsoleMessage.MessageSource.C
SS) { | 226 if (this._message.source === WebInspector.ConsoleMessage.MessageSource.C
SS) { |
| 226 var headerIds = WebInspector.cssModel.styleSheetIdsForURL(url); | 227 var headerIds = this.target().cssModel.styleSheetIdsForURL(url); |
| 227 var cssLocation = new WebInspector.CSSLocation(url, lineNumber, colu
mnNumber); | 228 var cssLocation = new WebInspector.CSSLocation(this.target(), url, l
ineNumber, columnNumber); |
| 228 return this._linkifier.linkifyCSSLocation(headerIds[0] || null, cssL
ocation, "console-message-url"); | 229 return this._linkifier.linkifyCSSLocation(headerIds[0] || null, cssL
ocation, "console-message-url"); |
| 229 } | 230 } |
| 230 | 231 |
| 231 return this._linkifier.linkifyLocation(url, lineNumber, columnNumber, "c
onsole-message-url"); | 232 return this._linkifier.linkifyLocation(url, lineNumber, columnNumber, "c
onsole-message-url"); |
| 232 }, | 233 }, |
| 233 | 234 |
| 234 /** | 235 /** |
| 235 * @param {!ConsoleAgent.CallFrame} callFrame | 236 * @param {!ConsoleAgent.CallFrame} callFrame |
| 236 * @return {?Element} | 237 * @return {?Element} |
| 237 */ | 238 */ |
| 238 _linkifyCallFrame: function(callFrame) | 239 _linkifyCallFrame: function(callFrame) |
| 239 { | 240 { |
| 240 console.assert(this._linkifier); | 241 console.assert(this._linkifier); |
| 241 if (!this._linkifier) | 242 if (!this._linkifier) |
| 242 return null; | 243 return null; |
| 243 // FIXME(62725): stack trace line/column numbers are one-based. | 244 // FIXME(62725): stack trace line/column numbers are one-based. |
| 244 var lineNumber = callFrame.lineNumber ? callFrame.lineNumber - 1 : 0; | 245 var lineNumber = callFrame.lineNumber ? callFrame.lineNumber - 1 : 0; |
| 245 var columnNumber = callFrame.columnNumber ? callFrame.columnNumber - 1 :
0; | 246 var columnNumber = callFrame.columnNumber ? callFrame.columnNumber - 1 :
0; |
| 246 var rawLocation = new WebInspector.DebuggerModel.Location(callFrame.scri
ptId, lineNumber, columnNumber); | 247 var rawLocation = new WebInspector.DebuggerModel.Location(this.target(),
callFrame.scriptId, lineNumber, columnNumber); |
| 247 return this._linkifier.linkifyRawLocation(rawLocation, "console-message-
url"); | 248 return this._linkifier.linkifyRawLocation(rawLocation, "console-message-
url"); |
| 248 }, | 249 }, |
| 249 | 250 |
| 250 /** | 251 /** |
| 251 * @param {?Array.<!ConsoleAgent.CallFrame>} stackTrace | 252 * @param {?Array.<!ConsoleAgent.CallFrame>} stackTrace |
| 252 * @return {?ConsoleAgent.CallFrame} | 253 * @return {?ConsoleAgent.CallFrame} |
| 253 */ | 254 */ |
| 254 _callFrameAnchorFromStackTrace: function(stackTrace) | 255 _callFrameAnchorFromStackTrace: function(stackTrace) |
| 255 { | 256 { |
| 256 if (!stackTrace || !stackTrace.length) | 257 if (!stackTrace || !stackTrace.length) |
| 257 return null; | 258 return null; |
| 258 var callFrame = stackTrace[0].scriptId ? stackTrace[0] : null; | 259 var callFrame = stackTrace[0].scriptId ? stackTrace[0] : null; |
| 259 if (!WebInspector.experimentsSettings.frameworksDebuggingSupport.isEnabl
ed()) | 260 if (!WebInspector.experimentsSettings.frameworksDebuggingSupport.isEnabl
ed()) |
| 260 return callFrame; | 261 return callFrame; |
| 261 if (!WebInspector.settings.skipStackFramesSwitch.get()) | 262 if (!WebInspector.settings.skipStackFramesSwitch.get()) |
| 262 return callFrame; | 263 return callFrame; |
| 263 var regex = WebInspector.settings.skipStackFramesPattern.asRegExp(); | 264 var regex = WebInspector.settings.skipStackFramesPattern.asRegExp(); |
| 264 if (!regex) | 265 if (!regex) |
| 265 return callFrame; | 266 return callFrame; |
| 266 for (var i = 0; i < stackTrace.length; ++i) { | 267 for (var i = 0; i < stackTrace.length; ++i) { |
| 267 var script = this._target.debuggerModel.scriptForId(stackTrace[i].sc
riptId); | 268 var script = this.target().debuggerModel.scriptForId(stackTrace[i].s
criptId); |
| 268 if (!script || !regex.test(script.sourceURL)) | 269 if (!script || !regex.test(script.sourceURL)) |
| 269 return stackTrace[i].scriptId ? stackTrace[i] : null; | 270 return stackTrace[i].scriptId ? stackTrace[i] : null; |
| 270 } | 271 } |
| 271 return callFrame; | 272 return callFrame; |
| 272 }, | 273 }, |
| 273 | 274 |
| 274 /** | 275 /** |
| 275 * @return {boolean} | 276 * @return {boolean} |
| 276 */ | 277 */ |
| 277 isErrorOrWarning: function() | 278 isErrorOrWarning: function() |
| 278 { | 279 { |
| 279 return (this._message.level === WebInspector.ConsoleMessage.MessageLevel
.Warning || this._message.level === WebInspector.ConsoleMessage.MessageLevel.Err
or); | 280 return (this._message.level === WebInspector.ConsoleMessage.MessageLevel
.Warning || this._message.level === WebInspector.ConsoleMessage.MessageLevel.Err
or); |
| 280 }, | 281 }, |
| 281 | 282 |
| 282 _format: function(parameters) | 283 _format: function(parameters) |
| 283 { | 284 { |
| 284 // This node is used like a Builder. Values are continually appended ont
o it. | 285 // This node is used like a Builder. Values are continually appended ont
o it. |
| 285 var formattedResult = document.createElement("span"); | 286 var formattedResult = document.createElement("span"); |
| 286 if (!parameters.length) | 287 if (!parameters.length) |
| 287 return formattedResult; | 288 return formattedResult; |
| 288 | 289 |
| 289 // Formatting code below assumes that parameters are all wrappers wherea
s frontend console | 290 // Formatting code below assumes that parameters are all wrappers wherea
s frontend console |
| 290 // API allows passing arbitrary values as messages (strings, numbers, et
c.). Wrap them here. | 291 // API allows passing arbitrary values as messages (strings, numbers, et
c.). Wrap them here. |
| 291 for (var i = 0; i < parameters.length; ++i) { | 292 for (var i = 0; i < parameters.length; ++i) { |
| 292 // FIXME: Only pass runtime wrappers here. | 293 // FIXME: Only pass runtime wrappers here. |
| 293 if (parameters[i] instanceof WebInspector.RemoteObject) | 294 if (parameters[i] instanceof WebInspector.RemoteObject) |
| 294 continue; | 295 continue; |
| 295 | 296 |
| 296 if (typeof parameters[i] === "object") | 297 if (typeof parameters[i] === "object") |
| 297 parameters[i] = this._target.runtimeModel.createRemoteObject(par
ameters[i], this._target); | 298 parameters[i] = this.target().runtimeModel.createRemoteObject(pa
rameters[i]); |
| 298 else | 299 else |
| 299 parameters[i] = this._target.runtimeModel.createRemoteObjectFrom
PrimitiveValue(parameters[i]); | 300 parameters[i] = this.target().runtimeModel.createRemoteObjectFro
mPrimitiveValue(parameters[i]); |
| 300 } | 301 } |
| 301 | 302 |
| 302 // There can be string log and string eval result. We distinguish betwee
n them based on message type. | 303 // There can be string log and string eval result. We distinguish betwee
n them based on message type. |
| 303 var shouldFormatMessage = WebInspector.RemoteObject.type(parameters[0])
=== "string" && this._message.type !== WebInspector.ConsoleMessage.MessageType.R
esult; | 304 var shouldFormatMessage = WebInspector.RemoteObject.type(parameters[0])
=== "string" && this._message.type !== WebInspector.ConsoleMessage.MessageType.R
esult; |
| 304 | 305 |
| 305 // Multiple parameters with the first being a format string. Save unused
substitutions. | 306 // Multiple parameters with the first being a format string. Save unused
substitutions. |
| 306 if (shouldFormatMessage) { | 307 if (shouldFormatMessage) { |
| 307 // Multiple parameters with the first being a format string. Save un
used substitutions. | 308 // Multiple parameters with the first being a format string. Save un
used substitutions. |
| 308 var result = this._formatWithSubstitutionString(parameters[0].descri
ption, parameters.slice(1), formattedResult); | 309 var result = this._formatWithSubstitutionString(parameters[0].descri
ption, parameters.slice(1), formattedResult); |
| 309 parameters = result.unusedSubstitutions; | 310 parameters = result.unusedSubstitutions; |
| (...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 491 * @this {WebInspector.ConsoleViewMessage} | 492 * @this {WebInspector.ConsoleViewMessage} |
| 492 */ | 493 */ |
| 493 function printNode(nodeId) | 494 function printNode(nodeId) |
| 494 { | 495 { |
| 495 if (!nodeId) { | 496 if (!nodeId) { |
| 496 // Sometimes DOM is loaded after the sync message is being forma
tted, so we get no | 497 // Sometimes DOM is loaded after the sync message is being forma
tted, so we get no |
| 497 // nodeId here. So we fall back to object formatting here. | 498 // nodeId here. So we fall back to object formatting here. |
| 498 this._formatParameterAsObject(object, elem, false); | 499 this._formatParameterAsObject(object, elem, false); |
| 499 return; | 500 return; |
| 500 } | 501 } |
| 501 var node = this._target.domModel.nodeForId(nodeId); | 502 var node = this.target().domModel.nodeForId(nodeId); |
| 502 var renderer = WebInspector.moduleManager.instance(WebInspector.Rend
erer, node); | 503 var renderer = WebInspector.moduleManager.instance(WebInspector.Rend
erer, node); |
| 503 if (renderer) | 504 if (renderer) |
| 504 elem.appendChild(renderer.render(node)); | 505 elem.appendChild(renderer.render(node)); |
| 505 else | 506 else |
| 506 console.error("No renderer for node found"); | 507 console.error("No renderer for node found"); |
| 507 } | 508 } |
| 508 object.pushNodeToFrontend(printNode.bind(this)); | 509 object.pushNodeToFrontend(printNode.bind(this)); |
| 509 }, | 510 }, |
| 510 | 511 |
| 511 /** | 512 /** |
| (...skipping 557 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1069 levelString = "Info"; | 1070 levelString = "Info"; |
| 1070 break; | 1071 break; |
| 1071 } | 1072 } |
| 1072 | 1073 |
| 1073 return sourceString + " " + typeString + " " + levelString + ": " + this
.formattedMessage().textContent + "\n" + this._message.url + " line " + this._me
ssage.line; | 1074 return sourceString + " " + typeString + " " + levelString + ": " + this
.formattedMessage().textContent + "\n" + this._message.url + " line " + this._me
ssage.line; |
| 1074 }, | 1075 }, |
| 1075 | 1076 |
| 1076 get text() | 1077 get text() |
| 1077 { | 1078 { |
| 1078 return this._message.messageText; | 1079 return this._message.messageText; |
| 1079 } | 1080 }, |
| 1081 |
| 1082 __proto__: WebInspector.TargetAware.prototype |
| 1080 } | 1083 } |
| OLD | NEW |