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

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

Issue 2378493002: DevTools: ConsoleViewMessage breakup _formatMessage() (Closed)
Patch Set: any type 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);
lushnikov 2016/09/28 20:50:17 you don't need insertBefore now
luoe 2016/09/29 21:29:26 Done.
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);
lushnikov 2016/09/28 20:50:17 should this code go inside _buildMessage?
luoe 2016/09/29 21:29:26 Done.
160 var anchorElement; 161 var target = this._target();
162 if (dumpStackTrace && target) {
163 var stackTracePreview = WebInspector.DOMPresentationUtils.buildStack TracePreviewContents(target, this._linkifier, consoleMessage.stackTrace);
lushnikov 2016/09/28 20:50:17 let's move this inside _wrapStackTraceFormatting
luoe 2016/09/29 21:29:26 Done.
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 }
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)
lushnikov 2016/09/28 20:50:17 lets call it _buildMessageStackTrace: function(con
luoe 2016/09/29 21:29:26 Done, with a couple more params: function(contents
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 {*} parameter
lushnikov 2016/09/28 20:50:17 {!Array.<!WebInspector.RemoteObject|string>} param
luoe 2016/09/29 21:29:26 Actually, some parameters are plain objects, so we
358 * @param {?WebInspector.Target} target
359 * @return {!WebInspector.RemoteObject}
360 */
361 _parameterToRemoteObject: function(parameter, target)
362 {
363 if (parameter instanceof WebInspector.RemoteObject)
364 return parameter;
365 else if (!target)
lushnikov 2016/09/28 20:50:17 style: drop "else" if (parameter instanceof WI.Re
luoe 2016/09/29 21:29:26 Done.
366 return WebInspector.RemoteObject.fromLocalObject(parameter);
367 else if (typeof parameter === "object")
368 return target.runtimeModel.createRemoteObject(parameter);
369 else
370 return target.runtimeModel.createRemoteObjectFromPrimitiveValue(para meter);
371 },
372
373 /**
374 * @param {!Array.<!WebInspector.RemoteObject|string>} parameters
375 * @return {!Element}
376 */
323 _format: function(parameters) 377 _format: function(parameters)
324 { 378 {
325 // This node is used like a Builder. Values are continually appended ont o it. 379 // This node is used like a Builder. Values are continually appended ont o it.
326 var formattedResult = createElement("span"); 380 var formattedResult = createElement("span");
327 if (!parameters.length) 381 if (!parameters.length)
328 return formattedResult; 382 return formattedResult;
329 383
330 var target = this._target();
331
332 // Formatting code below assumes that parameters are all wrappers wherea s frontend console 384 // 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. 385 // API allows passing arbitrary values as messages (strings, numbers, et c.). Wrap them here.
334 for (var i = 0; i < parameters.length; ++i) { 386 // FIXME: Only pass runtime wrappers here.
335 // FIXME: Only pass runtime wrappers here. 387 for (var i = 0; i < parameters.length; ++i)
336 if (parameters[i] instanceof WebInspector.RemoteObject) 388 parameters[i] = this._parameterToRemoteObject(parameters[i], this._t arget());
337 continue;
338
339 if (!target) {
340 parameters[i] = WebInspector.RemoteObject.fromLocalObject(parame ters[i]);
341 continue;
342 }
343
344 if (typeof parameters[i] === "object")
345 parameters[i] = target.runtimeModel.createRemoteObject(parameter s[i]);
346 else
347 parameters[i] = target.runtimeModel.createRemoteObjectFromPrimit iveValue(parameters[i]);
348 }
349 389
350 // There can be string log and string eval result. We distinguish betwee n them based on message type. 390 // 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); 391 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 392
353 // Multiple parameters with the first being a format string. Save unused substitutions. 393 // Multiple parameters with the first being a format string. Save unused substitutions.
354 if (shouldFormatMessage) { 394 if (shouldFormatMessage) {
355 // Multiple parameters with the first being a format string. Save un used substitutions. 395 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; 396 parameters = result.unusedSubstitutions;
358 if (parameters.length) 397 if (parameters.length)
359 formattedResult.createTextChild(" "); 398 formattedResult.createTextChild(" ");
360 } 399 }
361 400
362 if (this._message.type === WebInspector.ConsoleMessage.MessageType.Table ) { 401 if (this._message.type === WebInspector.ConsoleMessage.MessageType.Table ) {
363 formattedResult.appendChild(this._formatParameterAsTable(parameters) ); 402 formattedResult.appendChild(this._formatParameterAsTable(parameters) );
364 return formattedResult; 403 return formattedResult;
365 } 404 }
366 405
(...skipping 385 matching lines...) Expand 10 before | Expand all | Expand 10 after
752 } 791 }
753 rootElement.appendChild(this._previewFormatter.renderPropertyPre view(type, subtype, description)); 792 rootElement.appendChild(this._previewFormatter.renderPropertyPre view(type, subtype, description));
754 } 793 }
755 } 794 }
756 795
757 return rootElement; 796 return rootElement;
758 }, 797 },
759 798
760 /** 799 /**
761 * @param {string} format 800 * @param {string} format
762 * @param {!Array.<string>} parameters 801 * @param {!Array.<!WebInspector.RemoteObject>} parameters
763 * @param {!Element} formattedResult 802 * @param {!Element} formattedResult
764 */ 803 */
765 _formatWithSubstitutionString: function(format, parameters, formattedResult) 804 _formatWithSubstitutionString: function(format, parameters, formattedResult)
766 { 805 {
767 var formatters = {}; 806 var formatters = {};
768 807
769 /** 808 /**
770 * @param {boolean} force 809 * @param {boolean} force
771 * @param {!WebInspector.RemoteObject} obj 810 * @param {!WebInspector.RemoteObject} obj
772 * @return {!Element} 811 * @return {!Element}
(...skipping 461 matching lines...) Expand 10 before | Expand all | Expand 10 after
1234 { 1273 {
1235 if (!this._element) { 1274 if (!this._element) {
1236 WebInspector.ConsoleViewMessage.prototype.toMessageElement.call(this ); 1275 WebInspector.ConsoleViewMessage.prototype.toMessageElement.call(this );
1237 this._element.classList.toggle("collapsed", this._collapsed); 1276 this._element.classList.toggle("collapsed", this._collapsed);
1238 } 1277 }
1239 return this._element; 1278 return this._element;
1240 }, 1279 },
1241 1280
1242 __proto__: WebInspector.ConsoleViewMessage.prototype 1281 __proto__: WebInspector.ConsoleViewMessage.prototype
1243 } 1282 }
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