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

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

Issue 2378493002: DevTools: ConsoleViewMessage breakup _formatMessage() (Closed)
Patch Set: rebase master 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 120 matching lines...) Expand 10 before | Expand all | Expand 10 after
131 131
132 /** 132 /**
133 * @return {!WebInspector.ConsoleMessage} 133 * @return {!WebInspector.ConsoleMessage}
134 */ 134 */
135 consoleMessage: function() 135 consoleMessage: function()
136 { 136 {
137 return this._message; 137 return this._message;
138 }, 138 },
139 139
140 /** 140 /**
141 * @param {!WebInspector.ConsoleMessage} consoleMessage
141 * @return {!Element} 142 * @return {!Element}
142 */ 143 */
143 _formatMessage: function() 144 _buildMessage: function(consoleMessage)
144 { 145 {
145 var formattedMessage = createElement("span");
146 WebInspector.appendStyle(formattedMessage, "components/objectValue.css") ;
147 formattedMessage.className = "console-message-text source-code";
148
149 /**
150 * @param {string} title
151 * @return {!Element}
152 * @this {WebInspector.ConsoleMessage}
153 */
154 function linkifyRequest(title)
155 {
156 return WebInspector.Linkifier.linkifyUsingRevealer(/** @type {!WebIn spector.NetworkRequest} */ (this.request), title, this.request.url);
157 }
158
159 var consoleMessage = this._message;
160 var anchorElement;
161 var messageElement; 146 var messageElement;
162 if (consoleMessage.source === WebInspector.ConsoleMessage.MessageSource. ConsoleAPI) { 147 if (consoleMessage.source === WebInspector.ConsoleMessage.MessageSource. ConsoleAPI) {
163 switch (consoleMessage.type) { 148 switch (consoleMessage.type) {
164 case WebInspector.ConsoleMessage.MessageType.Trace: 149 case WebInspector.ConsoleMessage.MessageType.Trace:
165 messageElement = this._format(consoleMessage.parameters || ["con sole.trace"]); 150 messageElement = this._format(consoleMessage.parameters || ["con sole.trace"]);
166 break; 151 break;
167 case WebInspector.ConsoleMessage.MessageType.Clear: 152 case WebInspector.ConsoleMessage.MessageType.Clear:
168 messageElement = createTextNode(WebInspector.UIString("Console w as cleared")); 153 messageElement = createElementWithClass("span", "console-info");
169 formattedMessage.classList.add("console-info"); 154 messageElement.textContent = WebInspector.UIString("Console was cleared");
lushnikov 2016/10/01 02:30:41 why this change?
luoe 2016/10/03 17:02:58 Before ".console-info" was being applied to make f
170 break; 155 break;
171 case WebInspector.ConsoleMessage.MessageType.Assert: 156 case WebInspector.ConsoleMessage.MessageType.Assert:
172 var args = [WebInspector.UIString("Assertion failed:")]; 157 var args = [WebInspector.UIString("Assertion failed:")];
173 if (consoleMessage.parameters) 158 if (consoleMessage.parameters)
174 args = args.concat(consoleMessage.parameters); 159 args = args.concat(consoleMessage.parameters);
175 messageElement = this._format(args); 160 messageElement = this._format(args);
176 break; 161 break;
177 case WebInspector.ConsoleMessage.MessageType.Dir: 162 case WebInspector.ConsoleMessage.MessageType.Dir:
178 var obj = consoleMessage.parameters ? consoleMessage.parameters[ 0] : undefined; 163 var obj = consoleMessage.parameters ? consoleMessage.parameters[ 0] : undefined;
179 var args = ["%O", obj]; 164 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)); 182 messageElement.appendChild(WebInspector.Linkifier.linkifyUsi ngRevealer(consoleMessage.request, consoleMessage.request.url, consoleMessage.re quest.url));
198 if (consoleMessage.request.failed) 183 if (consoleMessage.request.failed)
199 messageElement.createTextChildren(" ", consoleMessage.re quest.localizedFailDescription); 184 messageElement.createTextChildren(" ", consoleMessage.re quest.localizedFailDescription);
200 else 185 else
201 messageElement.createTextChildren(" ", String(consoleMes sage.request.statusCode), " (", consoleMessage.request.statusText, ")"); 186 messageElement.createTextChildren(" ", String(consoleMes sage.request.statusCode), " (", consoleMessage.request.statusText, ")");
202 } else { 187 } else {
203 var fragment = WebInspector.linkifyStringAsFragmentWithCusto mLinkifier(consoleMessage.messageText, linkifyRequest.bind(consoleMessage)); 188 var fragment = WebInspector.linkifyStringAsFragmentWithCusto mLinkifier(consoleMessage.messageText, linkifyRequest.bind(consoleMessage));
204 messageElement.appendChild(fragment); 189 messageElement.appendChild(fragment);
205 } 190 }
206 } else { 191 } 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]); 192 messageElement = this._format([consoleMessage.messageText]);
213 } 193 }
214 } else { 194 } else {
215 var args = consoleMessage.parameters || [consoleMessage.messageText] ; 195 var args = consoleMessage.parameters || [consoleMessage.messageText] ;
216 messageElement = this._format(args); 196 messageElement = this._format(args);
217 } 197 }
218 198
199 var formattedMessage = createElement("span");
200 WebInspector.appendStyle(formattedMessage, "components/objectValue.css") ;
201 formattedMessage.className = "console-message-text source-code";
202 var anchorElement = this._buildMessageAnchor(consoleMessage);
203 if (anchorElement)
204 formattedMessage.appendChild(anchorElement);
205 formattedMessage.appendChild(messageElement);
206
207 if (!!consoleMessage.stackTrace && (consoleMessage.source === WebInspect or.ConsoleMessage.MessageSource.Network || consoleMessage.level === WebInspector .ConsoleMessage.MessageLevel.Error || consoleMessage.level === WebInspector.Cons oleMessage.MessageLevel.RevokedError || consoleMessage.type === WebInspector.Con soleMessage.MessageType.Trace || consoleMessage.level === WebInspector.ConsoleMe ssage.MessageLevel.Warning))
208 formattedMessage = this._buildMessageStackTrace(formattedMessage, co nsoleMessage, this._linkifier);
209 return formattedMessage;
210
211 /**
212 * @param {string} title
213 * @return {!Element}
214 * @this {WebInspector.ConsoleMessage}
215 */
216 function linkifyRequest(title)
217 {
218 return WebInspector.Linkifier.linkifyUsingRevealer(/** @type {!WebIn spector.NetworkRequest} */ (this.request), title, this.request.url);
219 }
220 },
221
222 /**
223 * @param {!WebInspector.ConsoleMessage} consoleMessage
224 * @return {?Element}
225 */
226 _buildMessageAnchor: function(consoleMessage)
227 {
228 var anchorElement = null;
219 if (consoleMessage.source !== WebInspector.ConsoleMessage.MessageSource. Network || consoleMessage.request) { 229 if (consoleMessage.source !== WebInspector.ConsoleMessage.MessageSource. Network || consoleMessage.request) {
220 if (consoleMessage.scriptId) { 230 if (consoleMessage.scriptId) {
221 anchorElement = this._linkifyScriptId(consoleMessage.scriptId, c onsoleMessage.url || "", consoleMessage.line, consoleMessage.column); 231 anchorElement = this._linkifyScriptId(consoleMessage.scriptId, c onsoleMessage.url || "", consoleMessage.line, consoleMessage.column);
222 } else { 232 } else {
223 if (consoleMessage.stackTrace && consoleMessage.stackTrace.callF rames.length) 233 if (consoleMessage.stackTrace && consoleMessage.stackTrace.callF rames.length)
224 anchorElement = this._linkifyStackTraceTopFrame(consoleMessa ge.stackTrace); 234 anchorElement = this._linkifyStackTraceTopFrame(consoleMessa ge.stackTrace);
225 else if (consoleMessage.url && consoleMessage.url !== "undefined ") 235 else if (consoleMessage.url && consoleMessage.url !== "undefined ")
226 anchorElement = this._linkifyLocation(consoleMessage.url, co nsoleMessage.line, consoleMessage.column); 236 anchorElement = this._linkifyLocation(consoleMessage.url, co nsoleMessage.line, consoleMessage.column);
227 } 237 }
238 } else if (consoleMessage.url) {
239 var url = consoleMessage.url;
240 var isExternal = !WebInspector.resourceForURL(url) && !WebInspector. networkMapping.uiSourceCodeForURLForAnyTarget(url);
241 anchorElement = WebInspector.linkifyURLAsNode(url, url, "console-mes sage-url", isExternal);
228 } 242 }
229 243
230 formattedMessage.appendChild(messageElement); 244 // Append a space to prevent the anchor text from being glued to the con sole message when the user selects and copies the console messages.
231 if (anchorElement) { 245 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(" ")); 246 anchorElement.appendChild(createTextNode(" "));
234 formattedMessage.insertBefore(anchorElement, formattedMessage.firstC hild); 247 return anchorElement;
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 }, 248 },
281 249
282 /** 250 /**
251 * @param {!Element} contents
252 * @param {!WebInspector.ConsoleMessage} consoleMessage
253 * @param {!WebInspector.Linkifier} linkifier
254 * @return {!Element}
255 */
256 _buildMessageStackTrace: function(contents, consoleMessage, linkifier)
lushnikov 2016/10/01 02:30:41 _buildMessageWithStackTrace: function(consoleMessa
luoe 2016/10/03 17:02:57 Done.
257 {
258 var target = consoleMessage.target();
lushnikov 2016/10/01 02:30:41 var messageElement = this._buildMessage(consoleMes
luoe 2016/10/03 17:02:58 Done.
259 if (!target)
260 return contents;
261
262 var toggleElement = createElementWithClass("div", "console-message-stack -trace-toggle");
263 var triangleElement = toggleElement.createChild("div", "console-message- stack-trace-triangle");
264 var contentElement = toggleElement.createChild("div", "console-message-s tack-trace-wrapper");
265
266 var clickableElement = contentElement.createChild("div");
267 clickableElement.appendChild(contents);
268 var stackTraceElement = contentElement.createChild("div");
269 var stackTracePreview = WebInspector.DOMPresentationUtils.buildStackTrac ePreviewContents(target, linkifier, consoleMessage.stackTrace);
270 stackTraceElement.appendChild(stackTracePreview);
271 stackTraceElement.classList.add("hidden");
272
273 /**
274 * @param {boolean} expand
275 */
276 function expandStackTrace(expand)
277 {
278 stackTraceElement.classList.toggle("hidden", !expand);
279 toggleElement.classList.toggle("expanded", expand);
280 }
281
282 /**
283 * @param {?Event} event
284 */
285 function toggleStackTrace(event)
286 {
287 if (event.target.hasSelection())
288 return;
289 expandStackTrace(stackTraceElement.classList.contains("hidden"));
290 event.consume();
291 }
292
293 clickableElement.addEventListener("click", toggleStackTrace, false);
294 triangleElement.addEventListener("click", toggleStackTrace, false);
295 if (consoleMessage.type === WebInspector.ConsoleMessage.MessageType.Trac e)
296 expandStackTrace(true);
297
298 toggleElement._expandStackTraceForTest = expandStackTrace.bind(null, tru e);
299 return toggleElement;
300 },
301
302 /**
283 * @param {string} url 303 * @param {string} url
284 * @param {number} lineNumber 304 * @param {number} lineNumber
285 * @param {number} columnNumber 305 * @param {number} columnNumber
286 * @return {?Element} 306 * @return {?Element}
287 */ 307 */
288 _linkifyLocation: function(url, lineNumber, columnNumber) 308 _linkifyLocation: function(url, lineNumber, columnNumber)
289 { 309 {
290 var target = this._target(); 310 var target = this._target();
291 if (!target) 311 if (!target)
292 return null; 312 return null;
(...skipping 20 matching lines...) Expand all
313 * @return {?Element} 333 * @return {?Element}
314 */ 334 */
315 _linkifyScriptId: function(scriptId, url, lineNumber, columnNumber) 335 _linkifyScriptId: function(scriptId, url, lineNumber, columnNumber)
316 { 336 {
317 var target = this._target(); 337 var target = this._target();
318 if (!target) 338 if (!target)
319 return null; 339 return null;
320 return this._linkifier.linkifyScriptLocation(target, scriptId, url, line Number, columnNumber, "console-message-url"); 340 return this._linkifier.linkifyScriptLocation(target, scriptId, url, line Number, columnNumber, "console-message-url");
321 }, 341 },
322 342
343 /**
344 * @param {!WebInspector.RemoteObject|!Object|string} parameter
345 * @param {?WebInspector.Target} target
346 * @return {!WebInspector.RemoteObject}
347 */
348 _parameterToRemoteObject: function(parameter, target)
349 {
350 if (parameter instanceof WebInspector.RemoteObject)
351 return parameter;
352 if (!target)
353 return WebInspector.RemoteObject.fromLocalObject(parameter);
354 if (typeof parameter === "object")
355 return target.runtimeModel.createRemoteObject(parameter);
356 return target.runtimeModel.createRemoteObjectFromPrimitiveValue(paramete r);
357 },
358
359 /**
360 * @param {!Array.<!WebInspector.RemoteObject|string>} parameters
361 * @return {!Element}
362 */
323 _format: function(parameters) 363 _format: function(parameters)
324 { 364 {
325 // This node is used like a Builder. Values are continually appended ont o it. 365 // This node is used like a Builder. Values are continually appended ont o it.
326 var formattedResult = createElement("span"); 366 var formattedResult = createElement("span");
327 if (!parameters.length) 367 if (!parameters.length)
328 return formattedResult; 368 return formattedResult;
329 369
330 var target = this._target();
331
332 // Formatting code below assumes that parameters are all wrappers wherea s frontend console 370 // 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. 371 // API allows passing arbitrary values as messages (strings, numbers, et c.). Wrap them here.
334 for (var i = 0; i < parameters.length; ++i) { 372 // FIXME: Only pass runtime wrappers here.
335 // FIXME: Only pass runtime wrappers here. 373 for (var i = 0; i < parameters.length; ++i)
336 if (parameters[i] instanceof WebInspector.RemoteObject) 374 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 375
350 // There can be string log and string eval result. We distinguish betwee n them based on message type. 376 // 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); 377 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 378
353 // Multiple parameters with the first being a format string. Save unused substitutions. 379 // Multiple parameters with the first being a format string. Save unused substitutions.
354 if (shouldFormatMessage) { 380 if (shouldFormatMessage) {
355 // Multiple parameters with the first being a format string. Save un used substitutions. 381 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; 382 parameters = result.unusedSubstitutions;
358 if (parameters.length) 383 if (parameters.length)
359 formattedResult.createTextChild(" "); 384 formattedResult.createTextChild(" ");
360 } 385 }
361 386
362 if (this._message.type === WebInspector.ConsoleMessage.MessageType.Table ) { 387 if (this._message.type === WebInspector.ConsoleMessage.MessageType.Table ) {
363 formattedResult.appendChild(this._formatParameterAsTable(parameters) ); 388 formattedResult.appendChild(this._formatParameterAsTable(parameters) );
364 return formattedResult; 389 return formattedResult;
365 } 390 }
366 391
(...skipping 381 matching lines...) Expand 10 before | Expand all | Expand 10 after
748 } 773 }
749 rootElement.appendChild(this._previewFormatter.renderPropertyPre view(type, subtype, description)); 774 rootElement.appendChild(this._previewFormatter.renderPropertyPre view(type, subtype, description));
750 } 775 }
751 } 776 }
752 777
753 return rootElement; 778 return rootElement;
754 }, 779 },
755 780
756 /** 781 /**
757 * @param {string} format 782 * @param {string} format
758 * @param {!Array.<string>} parameters 783 * @param {!Array.<!WebInspector.RemoteObject>} parameters
759 * @param {!Element} formattedResult 784 * @param {!Element} formattedResult
760 */ 785 */
761 _formatWithSubstitutionString: function(format, parameters, formattedResult) 786 _formatWithSubstitutionString: function(format, parameters, formattedResult)
762 { 787 {
763 var formatters = {}; 788 var formatters = {};
764 789
765 /** 790 /**
766 * @param {boolean} force 791 * @param {boolean} force
767 * @param {!WebInspector.RemoteObject} obj 792 * @param {!WebInspector.RemoteObject} obj
768 * @return {!Element} 793 * @return {!Element}
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after
934 /** 959 /**
935 * @return {!Element} 960 * @return {!Element}
936 */ 961 */
937 contentElement: function() 962 contentElement: function()
938 { 963 {
939 if (this._contentElement) 964 if (this._contentElement)
940 return this._contentElement; 965 return this._contentElement;
941 966
942 var contentElement = createElementWithClass("div", "console-message"); 967 var contentElement = createElementWithClass("div", "console-message");
943 this._contentElement = contentElement; 968 this._contentElement = contentElement;
944
945 if (this._message.type === WebInspector.ConsoleMessage.MessageType.Start Group || this._message.type === WebInspector.ConsoleMessage.MessageType.StartGro upCollapsed) 969 if (this._message.type === WebInspector.ConsoleMessage.MessageType.Start Group || this._message.type === WebInspector.ConsoleMessage.MessageType.StartGro upCollapsed)
946 contentElement.classList.add("console-group-title"); 970 contentElement.classList.add("console-group-title");
947 971
948 contentElement.appendChild(this._formatMessage()); 972 var formattedMessage = this._buildMessage(this._message);
lushnikov 2016/10/01 02:30:41 if (THIS_IS_STACK_MESSAGE) formatterMessage =
luoe 2016/10/03 17:02:57 Done.
973 contentElement.appendChild(formattedMessage);
949 974
950 this.updateTimestamp(WebInspector.moduleSetting("consoleTimestampsEnable d").get()); 975 this.updateTimestamp(WebInspector.moduleSetting("consoleTimestampsEnable d").get());
951
952 return this._contentElement; 976 return this._contentElement;
953 }, 977 },
954 978
955 /** 979 /**
956 * @return {!Element} 980 * @return {!Element}
957 */ 981 */
958 toMessageElement: function() 982 toMessageElement: function()
959 { 983 {
960 if (this._element) 984 if (this._element)
961 return this._element; 985 return this._element;
(...skipping 268 matching lines...) Expand 10 before | Expand all | Expand 10 after
1230 { 1254 {
1231 if (!this._element) { 1255 if (!this._element) {
1232 WebInspector.ConsoleViewMessage.prototype.toMessageElement.call(this ); 1256 WebInspector.ConsoleViewMessage.prototype.toMessageElement.call(this );
1233 this._element.classList.toggle("collapsed", this._collapsed); 1257 this._element.classList.toggle("collapsed", this._collapsed);
1234 } 1258 }
1235 return this._element; 1259 return this._element;
1236 }, 1260 },
1237 1261
1238 __proto__: WebInspector.ConsoleViewMessage.prototype 1262 __proto__: WebInspector.ConsoleViewMessage.prototype
1239 } 1263 }
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