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

Side by Side Diff: third_party/WebKit/Source/devtools/front_end/console/ConsoleViewMessage.js

Issue 2378493002: DevTools: ConsoleViewMessage breakup _formatMessage() (Closed)
Patch Set: withclass Created 4 years, 2 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
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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 }
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698