Index: Source/devtools/front_end/console/ConsoleViewMessage.js |
diff --git a/Source/devtools/front_end/console/ConsoleViewMessage.js b/Source/devtools/front_end/console/ConsoleViewMessage.js |
index 2d88c73e68ef891d651f7e396b49ff3327815f3f..6b1f529d02a6d9c8b8e427e8bf3717facefb5dca 100644 |
--- a/Source/devtools/front_end/console/ConsoleViewMessage.js |
+++ b/Source/devtools/front_end/console/ConsoleViewMessage.js |
@@ -166,8 +166,11 @@ WebInspector.ConsoleViewMessage.prototype = { |
this._messageElement = this._format([consoleMessage.messageText]); |
break; |
default: |
+ if (consoleMessage.parameters && consoleMessage.parameters.length === 1 && consoleMessage.parameters[0].type === "string") |
+ this._messageElement = this._tryFormatAsError(/**@type {string} */(consoleMessage.parameters[0].value)); |
+ |
var args = consoleMessage.parameters || [consoleMessage.messageText]; |
- this._messageElement = this._format(args); |
+ this._messageElement = this._messageElement || this._format(args); |
} |
} else if (consoleMessage.source === WebInspector.ConsoleMessage.MessageSource.Network) { |
if (consoleMessage.request) { |
@@ -1272,6 +1275,74 @@ WebInspector.ConsoleViewMessage.prototype = { |
{ |
return this._message.messageText; |
}, |
+ |
+ /** |
+ * @param {string} string |
+ * @return {?Element} |
+ */ |
+ _tryFormatAsError: function(string) |
+ { |
+ if (!string.startsWith("Error")) |
aandrey
2014/10/23 17:51:30
what about ReferenceError? RangeError, SyntaxError
sergeyv
2014/10/27 08:30:59
Done.
|
+ return null; |
+ |
+ var lines = string.split("\n"); |
+ var links = []; |
+ var position = 0; |
+ var beforeStack = true; |
+ for (var i = 0; i < lines.length; ++i) { |
+ position += i > 0 ? lines[i - 1].length + 1 : 0; |
+ var hasAt = lines[i].trim().startsWith("at "); |
aandrey
2014/10/23 17:51:30
var isCallFrameLine = /^\s*at\s/.test(lines[i]);
sergeyv
2014/10/27 08:30:59
Done.
|
+ if (!hasAt && !beforeStack) |
aandrey
2014/10/23 17:51:30
beforeStack -> links.length
sergeyv
2014/10/27 08:31:00
Done.
|
+ return null; |
+ |
+ if (!hasAt) |
+ continue; |
+ |
+ beforeStack = false; |
+ |
+ var openBracketIndex = lines[i].indexOf("("); |
+ var closeBracketIndex = lines[i].indexOf(")"); |
+ var hasOpenBracket = openBracketIndex !== -1; |
+ var hasCloseBracket = closeBracketIndex !== -1; |
+ |
+ if ((openBracketIndex > closeBracketIndex) || (hasOpenBracket ^ hasCloseBracket)) |
+ return null; |
+ |
+ var left = hasOpenBracket ? openBracketIndex + 1 : lines[i].indexOf("at") + 3; |
+ var right = hasOpenBracket ? closeBracketIndex : lines[i].length; |
+ var linkPretender = lines[i].substring(left, right); |
+ var splitResult = WebInspector.ParsedURL.splitLineAndColumn(linkPretender); |
+ if (!splitResult) |
+ return null; |
+ |
+ var parsed = splitResult.url.asParsedURL(); |
+ if (!parsed) { |
+ var completeURL = WebInspector.ParsedURL.completeURL(WebInspector.targetManager.inspectedPageURL(), splitResult.url); |
+ parsed = completeURL ? completeURL.asParsedURL() : null; |
+ } |
+ |
+ if (!parsed) |
+ return null; |
+ |
+ links.push({url: parsed.url, positionLeft: position + left, positionRight: position + right, lineNumber: splitResult.lineNumber, columnNumber: splitResult.columnNumber}); |
aandrey
2014/10/23 17:51:30
too complex...
sergeyv
2014/10/27 08:31:00
Acknowledged.
|
+ } |
+ |
+ if (beforeStack) |
+ return null; |
+ |
+ var formattedResult = createElement("span"); |
+ var start = 0; |
+ for (var i = 0; i < links.length; ++i) { |
+ formattedResult.appendChild(this._linkifier.linkifyStringAsFragment(this._target(), string.substring(start, links[i].positionLeft))); |
+ formattedResult.appendChild(this._linkifier.linkifyScriptLocation(this._target(), null, links[i].url, links[i].lineNumber, links[i].columnNumber)); |
+ start = links[i].positionRight; |
+ } |
+ |
+ if (start != string.length) |
+ formattedResult.appendChild(this._linkifier.linkifyStringAsFragment(this._target(), string.substring(start))); |
+ |
+ return formattedResult; |
+ } |
} |
/** |