Chromium Code Reviews| Index: third_party/WebKit/Source/devtools/front_end/console/ConsoleViewMessage.js |
| diff --git a/third_party/WebKit/Source/devtools/front_end/console/ConsoleViewMessage.js b/third_party/WebKit/Source/devtools/front_end/console/ConsoleViewMessage.js |
| index b5d8d190ed0a097b7d21663146d2a424c64242b2..37ad46720da2e01636d05e7f6101db8426a629b3 100644 |
| --- a/third_party/WebKit/Source/devtools/front_end/console/ConsoleViewMessage.js |
| +++ b/third_party/WebKit/Source/devtools/front_end/console/ConsoleViewMessage.js |
| @@ -138,26 +138,11 @@ WebInspector.ConsoleViewMessage.prototype = { |
| }, |
| /** |
| + * @param {!WebInspector.ConsoleMessage} consoleMessage |
| * @return {!Element} |
| */ |
| - _formatMessage: function() |
| + _buildMessage: function(consoleMessage) |
| { |
| - var formattedMessage = createElement("span"); |
| - WebInspector.appendStyle(formattedMessage, "components/objectValue.css"); |
| - formattedMessage.className = "console-message-text source-code"; |
| - |
| - /** |
| - * @param {string} title |
| - * @return {!Element} |
| - * @this {WebInspector.ConsoleMessage} |
| - */ |
| - function linkifyRequest(title) |
| - { |
| - return WebInspector.Linkifier.linkifyUsingRevealer(/** @type {!WebInspector.NetworkRequest} */ (this.request), title, this.request.url); |
| - } |
| - |
| - var consoleMessage = this._message; |
| - var anchorElement; |
| var messageElement; |
| if (consoleMessage.source === WebInspector.ConsoleMessage.MessageSource.ConsoleAPI) { |
| switch (consoleMessage.type) { |
| @@ -165,8 +150,8 @@ WebInspector.ConsoleViewMessage.prototype = { |
| messageElement = this._format(consoleMessage.parameters || ["console.trace"]); |
| break; |
| case WebInspector.ConsoleMessage.MessageType.Clear: |
| - messageElement = createTextNode(WebInspector.UIString("Console was cleared")); |
| - formattedMessage.classList.add("console-info"); |
| + messageElement = createElementWithClass("span", "console-info"); |
| + messageElement.textContent = WebInspector.UIString("Console was cleared"); |
| break; |
| case WebInspector.ConsoleMessage.MessageType.Assert: |
| var args = [WebInspector.UIString("Assertion failed:")]; |
| @@ -204,11 +189,6 @@ WebInspector.ConsoleViewMessage.prototype = { |
| messageElement.appendChild(fragment); |
| } |
| } else { |
| - var url = consoleMessage.url; |
| - if (url) { |
| - var isExternal = !WebInspector.resourceForURL(url) && !WebInspector.networkMapping.uiSourceCodeForURLForAnyTarget(url); |
| - anchorElement = WebInspector.linkifyURLAsNode(url, url, "console-message-url", isExternal); |
| - } |
| messageElement = this._format([consoleMessage.messageText]); |
| } |
| } else { |
| @@ -216,6 +196,30 @@ WebInspector.ConsoleViewMessage.prototype = { |
| messageElement = this._format(args); |
| } |
| + var formattedMessage = this._buildMessageAnchor(messageElement, consoleMessage); |
| + if (!!consoleMessage.stackTrace && (consoleMessage.source === WebInspector.ConsoleMessage.MessageSource.Network || consoleMessage.level === WebInspector.ConsoleMessage.MessageLevel.Error || consoleMessage.level === WebInspector.ConsoleMessage.MessageLevel.RevokedError || consoleMessage.type === WebInspector.ConsoleMessage.MessageType.Trace || consoleMessage.level === WebInspector.ConsoleMessage.MessageLevel.Warning)) |
| + formattedMessage = this._buildMessageStackTrace(formattedMessage, consoleMessage, this._linkifier); |
| + return formattedMessage; |
| + |
| + /** |
| + * @param {string} title |
| + * @return {!Element} |
| + * @this {WebInspector.ConsoleMessage} |
| + */ |
| + function linkifyRequest(title) |
| + { |
| + return WebInspector.Linkifier.linkifyUsingRevealer(/** @type {!WebInspector.NetworkRequest} */ (this.request), title, this.request.url); |
| + } |
| + }, |
| + |
| + /** |
| + * @param {!Element} contents |
|
lushnikov
2016/09/30 21:28:05
let's not have the "contents" element - it makes s
luoe
2016/09/30 22:27:53
Done.
|
| + * @param {!WebInspector.ConsoleMessage} consoleMessage |
| + * @return {!Element} |
| + */ |
| + _buildMessageAnchor: function(contents, consoleMessage) |
| + { |
| + var anchorElement = null; |
| if (consoleMessage.source !== WebInspector.ConsoleMessage.MessageSource.Network || consoleMessage.request) { |
| if (consoleMessage.scriptId) { |
| anchorElement = this._linkifyScriptId(consoleMessage.scriptId, consoleMessage.url || "", consoleMessage.line, consoleMessage.column); |
| @@ -225,58 +229,75 @@ WebInspector.ConsoleViewMessage.prototype = { |
| else if (consoleMessage.url && consoleMessage.url !== "undefined") |
| anchorElement = this._linkifyLocation(consoleMessage.url, consoleMessage.line, consoleMessage.column); |
| } |
| + } else if (consoleMessage.url) { |
| + var url = consoleMessage.url; |
| + var isExternal = !WebInspector.resourceForURL(url) && !WebInspector.networkMapping.uiSourceCodeForURLForAnyTarget(url); |
| + anchorElement = WebInspector.linkifyURLAsNode(url, url, "console-message-url", isExternal); |
| } |
| - formattedMessage.appendChild(messageElement); |
| + var formattedMessage = createElement("span"); |
| + WebInspector.appendStyle(formattedMessage, "components/objectValue.css"); |
| + formattedMessage.className = "console-message-text source-code"; |
| + |
| if (anchorElement) { |
| // Append a space to prevent the anchor text from being glued to the console message when the user selects and copies the console messages. |
| anchorElement.appendChild(createTextNode(" ")); |
| - formattedMessage.insertBefore(anchorElement, formattedMessage.firstChild); |
| + formattedMessage.appendChild(anchorElement); |
| } |
| + formattedMessage.appendChild(contents); |
| + return formattedMessage; |
| + }, |
| - var dumpStackTrace = !!consoleMessage.stackTrace && (consoleMessage.source === WebInspector.ConsoleMessage.MessageSource.Network || consoleMessage.level === WebInspector.ConsoleMessage.MessageLevel.Error || consoleMessage.level === WebInspector.ConsoleMessage.MessageLevel.RevokedError || consoleMessage.type === WebInspector.ConsoleMessage.MessageType.Trace || consoleMessage.level === WebInspector.ConsoleMessage.MessageLevel.Warning); |
| - var target = this._target(); |
| - if (dumpStackTrace && target) { |
| - var toggleElement = createElementWithClass("div", "console-message-stack-trace-toggle"); |
| - var triangleElement = toggleElement.createChild("div", "console-message-stack-trace-triangle"); |
| - var contentElement = toggleElement.createChild("div", "console-message-stack-trace-wrapper"); |
| - |
| - var clickableElement = contentElement.createChild("div"); |
| - clickableElement.appendChild(formattedMessage); |
| - var stackTraceElement = contentElement.createChild("div"); |
| - stackTraceElement.appendChild(WebInspector.DOMPresentationUtils.buildStackTracePreviewContents(target, this._linkifier, this._message.stackTrace)); |
| - stackTraceElement.classList.add("hidden"); |
| - |
| - /** |
| - * @param {boolean} expand |
| - */ |
| - function expandStackTrace(expand) |
| - { |
| - stackTraceElement.classList.toggle("hidden", !expand); |
| - toggleElement.classList.toggle("expanded", expand); |
| - } |
| + /** |
| + * @param {!Element} contents |
| + * @param {!WebInspector.ConsoleMessage} consoleMessage |
| + * @param {!WebInspector.Linkifier} linkifier |
| + * @return {!Element} |
| + */ |
| + _buildMessageStackTrace: function(contents, consoleMessage, linkifier) |
| + { |
| + var target = consoleMessage.target(); |
| + if (!target) |
| + return contents; |
| - /** |
| - * @param {?Event} event |
| - */ |
| - function toggleStackTrace(event) |
| - { |
| - if (event.target.hasSelection()) |
| - return; |
| - expandStackTrace(stackTraceElement.classList.contains("hidden")); |
| - event.consume(); |
| - } |
| + var toggleElement = createElementWithClass("div", "console-message-stack-trace-toggle"); |
| + var triangleElement = toggleElement.createChild("div", "console-message-stack-trace-triangle"); |
| + var contentElement = toggleElement.createChild("div", "console-message-stack-trace-wrapper"); |
| - clickableElement.addEventListener("click", toggleStackTrace, false); |
| - triangleElement.addEventListener("click", toggleStackTrace, false); |
| - if (consoleMessage.type === WebInspector.ConsoleMessage.MessageType.Trace) |
| - expandStackTrace(true); |
| + var clickableElement = contentElement.createChild("div"); |
| + clickableElement.appendChild(contents); |
| + var stackTraceElement = contentElement.createChild("div"); |
| + var stackTracePreview = WebInspector.DOMPresentationUtils.buildStackTracePreviewContents(target, linkifier, consoleMessage.stackTrace); |
| + stackTraceElement.appendChild(stackTracePreview); |
| + stackTraceElement.classList.add("hidden"); |
| - toggleElement._expandStackTraceForTest = expandStackTrace.bind(null, true); |
| - formattedMessage = toggleElement; |
| + /** |
| + * @param {boolean} expand |
| + */ |
| + function expandStackTrace(expand) |
| + { |
| + stackTraceElement.classList.toggle("hidden", !expand); |
| + toggleElement.classList.toggle("expanded", expand); |
| } |
| - return formattedMessage; |
| + /** |
| + * @param {?Event} event |
| + */ |
| + function toggleStackTrace(event) |
| + { |
| + if (event.target.hasSelection()) |
| + return; |
| + expandStackTrace(stackTraceElement.classList.contains("hidden")); |
| + event.consume(); |
| + } |
| + |
| + clickableElement.addEventListener("click", toggleStackTrace, false); |
| + triangleElement.addEventListener("click", toggleStackTrace, false); |
| + if (consoleMessage.type === WebInspector.ConsoleMessage.MessageType.Trace) |
| + expandStackTrace(true); |
| + |
| + toggleElement._expandStackTraceForTest = expandStackTrace.bind(null, true); |
| + return toggleElement; |
| }, |
| /** |
| @@ -320,6 +341,26 @@ WebInspector.ConsoleViewMessage.prototype = { |
| return this._linkifier.linkifyScriptLocation(target, scriptId, url, lineNumber, columnNumber, "console-message-url"); |
| }, |
| + /** |
| + * @param {!WebInspector.RemoteObject|!Object|string} parameter |
| + * @param {?WebInspector.Target} target |
| + * @return {!WebInspector.RemoteObject} |
| + */ |
| + _parameterToRemoteObject: function(parameter, target) |
| + { |
| + if (parameter instanceof WebInspector.RemoteObject) |
| + return parameter; |
| + if (!target) |
| + return WebInspector.RemoteObject.fromLocalObject(parameter); |
| + if (typeof parameter === "object") |
| + return target.runtimeModel.createRemoteObject(parameter); |
| + return target.runtimeModel.createRemoteObjectFromPrimitiveValue(parameter); |
| + }, |
| + |
| + /** |
| + * @param {!Array.<!WebInspector.RemoteObject|string>} parameters |
| + * @return {!Element} |
| + */ |
| _format: function(parameters) |
| { |
| // This node is used like a Builder. Values are continually appended onto it. |
| @@ -327,33 +368,18 @@ WebInspector.ConsoleViewMessage.prototype = { |
| if (!parameters.length) |
| return formattedResult; |
| - var target = this._target(); |
| - |
| // Formatting code below assumes that parameters are all wrappers whereas frontend console |
| // API allows passing arbitrary values as messages (strings, numbers, etc.). Wrap them here. |
| - for (var i = 0; i < parameters.length; ++i) { |
| - // FIXME: Only pass runtime wrappers here. |
| - if (parameters[i] instanceof WebInspector.RemoteObject) |
| - continue; |
| - |
| - if (!target) { |
| - parameters[i] = WebInspector.RemoteObject.fromLocalObject(parameters[i]); |
| - continue; |
| - } |
| - |
| - if (typeof parameters[i] === "object") |
| - parameters[i] = target.runtimeModel.createRemoteObject(parameters[i]); |
| - else |
| - parameters[i] = target.runtimeModel.createRemoteObjectFromPrimitiveValue(parameters[i]); |
| - } |
| + // FIXME: Only pass runtime wrappers here. |
| + for (var i = 0; i < parameters.length; ++i) |
| + parameters[i] = this._parameterToRemoteObject(parameters[i], this._target()); |
| // There can be string log and string eval result. We distinguish between them based on message type. |
| - 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.RevokedError); |
| + var shouldFormatMessage = WebInspector.RemoteObject.type((/** @type {!Array.<!WebInspector.RemoteObject>} **/ (parameters))[0]) === "string" && (this._message.type !== WebInspector.ConsoleMessage.MessageType.Result || this._message.level === WebInspector.ConsoleMessage.MessageLevel.Error || this._message.level === WebInspector.ConsoleMessage.MessageLevel.RevokedError); |
| // Multiple parameters with the first being a format string. Save unused substitutions. |
| if (shouldFormatMessage) { |
| - // Multiple parameters with the first being a format string. Save unused substitutions. |
| - var result = this._formatWithSubstitutionString(parameters[0].description, parameters.slice(1), formattedResult); |
| + var result = this._formatWithSubstitutionString(/** @type {string} **/ (parameters[0].description), parameters.slice(1), formattedResult); |
| parameters = result.unusedSubstitutions; |
| if (parameters.length) |
| formattedResult.createTextChild(" "); |
| @@ -759,7 +785,7 @@ WebInspector.ConsoleViewMessage.prototype = { |
| /** |
| * @param {string} format |
| - * @param {!Array.<string>} parameters |
| + * @param {!Array.<!WebInspector.RemoteObject>} parameters |
| * @param {!Element} formattedResult |
| */ |
| _formatWithSubstitutionString: function(format, parameters, formattedResult) |
| @@ -945,14 +971,13 @@ WebInspector.ConsoleViewMessage.prototype = { |
| var contentElement = createElementWithClass("div", "console-message"); |
| this._contentElement = contentElement; |
| - |
| if (this._message.type === WebInspector.ConsoleMessage.MessageType.StartGroup || this._message.type === WebInspector.ConsoleMessage.MessageType.StartGroupCollapsed) |
| contentElement.classList.add("console-group-title"); |
| - contentElement.appendChild(this._formatMessage()); |
| + var formattedMessage = this._buildMessage(this._message); |
| + contentElement.appendChild(formattedMessage); |
| this.updateTimestamp(WebInspector.moduleSetting("consoleTimestampsEnabled").get()); |
| - |
| return this._contentElement; |
| }, |