OLD | NEW |
| (Empty) |
1 /* | |
2 * Copyright (C) 2011 Google Inc. All rights reserved. | |
3 * | |
4 * Redistribution and use in source and binary forms, with or without | |
5 * modification, are permitted provided that the following conditions are | |
6 * met: | |
7 * | |
8 * * Redistributions of source code must retain the above copyright | |
9 * notice, this list of conditions and the following disclaimer. | |
10 * * Redistributions in binary form must reproduce the above | |
11 * copyright notice, this list of conditions and the following disclaimer | |
12 * in the documentation and/or other materials provided with the | |
13 * distribution. | |
14 * * Neither the name of Google Inc. nor the names of its | |
15 * contributors may be used to endorse or promote products derived from | |
16 * this software without specific prior written permission. | |
17 * | |
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | |
19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | |
20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | |
21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | |
22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |
23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |
24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | |
25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | |
26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | |
28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
29 */ | |
30 | |
31 /** | |
32 * @implements {SDK.TargetManager.Observer} | |
33 */ | |
34 SDK.ConsoleModel = class extends Common.Object { | |
35 constructor() { | |
36 super(); | |
37 | |
38 /** @type {!Array.<!SDK.ConsoleMessage>} */ | |
39 this._messages = []; | |
40 /** @type {!Map<!SDK.Target, !Map<number, !SDK.ConsoleMessage>>} */ | |
41 this._messageByExceptionId = new Map(); | |
42 this._warnings = 0; | |
43 this._errors = 0; | |
44 | |
45 SDK.targetManager.observeTargets(this); | |
46 } | |
47 | |
48 /** | |
49 * @override | |
50 * @param {!SDK.Target} target | |
51 */ | |
52 targetAdded(target) { | |
53 var eventListeners = []; | |
54 | |
55 var logModel = target.model(SDK.LogModel); | |
56 if (logModel) | |
57 eventListeners.push(logModel.on(SDK.LogModel.EntryAddedEvent, this._logEnt
ryAdded, this)); | |
58 | |
59 var cpuProfilerModel = target.model(SDK.CPUProfilerModel); | |
60 if (cpuProfilerModel) { | |
61 eventListeners.push(cpuProfilerModel.addEventListener( | |
62 SDK.CPUProfilerModel.Events.ConsoleProfileStarted, this._consoleProfil
eStarted.bind(this, cpuProfilerModel))); | |
63 eventListeners.push(cpuProfilerModel.addEventListener( | |
64 SDK.CPUProfilerModel.Events.ConsoleProfileFinished, | |
65 this._consoleProfileFinished.bind(this, cpuProfilerModel))); | |
66 } | |
67 | |
68 var resourceTreeModel = target.model(SDK.ResourceTreeModel); | |
69 if (resourceTreeModel) { | |
70 eventListeners.push(resourceTreeModel.addEventListener( | |
71 SDK.ResourceTreeModel.Events.MainFrameStartedLoading, this._mainFrameS
tartedLoading, this)); | |
72 eventListeners.push(resourceTreeModel.addEventListener( | |
73 SDK.ResourceTreeModel.Events.MainFrameNavigated, this._mainFrameNaviga
ted, this)); | |
74 } | |
75 | |
76 var runtimeModel = target.model(SDK.RuntimeModel); | |
77 if (runtimeModel) { | |
78 eventListeners.push(runtimeModel.addEventListener( | |
79 SDK.RuntimeModel.Events.ExceptionThrown, this._exceptionThrown.bind(th
is, runtimeModel))); | |
80 eventListeners.push(runtimeModel.addEventListener( | |
81 SDK.RuntimeModel.Events.ExceptionRevoked, this._exceptionRevoked.bind(
this, runtimeModel))); | |
82 eventListeners.push(runtimeModel.addEventListener( | |
83 SDK.RuntimeModel.Events.ConsoleAPICalled, this._consoleAPICalled.bind(
this, runtimeModel))); | |
84 } | |
85 | |
86 var networkManager = target.model(SDK.NetworkManager); | |
87 if (networkManager) { | |
88 eventListeners.push(networkManager.addEventListener( | |
89 SDK.NetworkManager.Events.WarningGenerated, this._networkWarningGenera
ted.bind(this, networkManager))); | |
90 } | |
91 | |
92 target[SDK.ConsoleModel._events] = eventListeners; | |
93 } | |
94 | |
95 /** | |
96 * @override | |
97 * @param {!SDK.Target} target | |
98 */ | |
99 targetRemoved(target) { | |
100 this._messageByExceptionId.delete(target); | |
101 Common.EventTarget.removeEventListeners(target[SDK.ConsoleModel._events]); | |
102 } | |
103 | |
104 /** | |
105 * @param {!SDK.ExecutionContext} executionContext | |
106 * @param {string} text | |
107 * @param {boolean} useCommandLineAPI | |
108 */ | |
109 evaluateCommandInConsole(executionContext, text, useCommandLineAPI) { | |
110 var target = executionContext.target(); | |
111 var requestedText = text; | |
112 | |
113 var commandMessage = new SDK.ConsoleMessage( | |
114 target, SDK.ConsoleMessage.MessageSource.JS, null, text, SDK.ConsoleMess
age.MessageType.Command); | |
115 commandMessage.setExecutionContextId(executionContext.id); | |
116 this.addMessage(commandMessage); | |
117 | |
118 /** | |
119 * @param {?SDK.RemoteObject} result | |
120 * @param {!Protocol.Runtime.ExceptionDetails=} exceptionDetails | |
121 * @this {SDK.ConsoleModel} | |
122 */ | |
123 function printResult(result, exceptionDetails) { | |
124 if (!result) | |
125 return; | |
126 | |
127 Common.console.showPromise().then(() => { | |
128 this.dispatchEventToListeners( | |
129 SDK.ConsoleModel.Events.CommandEvaluated, | |
130 {result: result, text: requestedText, commandMessage: commandMessage
, exceptionDetails: exceptionDetails}); | |
131 }); | |
132 } | |
133 | |
134 /** | |
135 * @param {string} code | |
136 * @suppress {uselessCode} | |
137 * @return {boolean} | |
138 */ | |
139 function looksLikeAnObjectLiteral(code) { | |
140 // Only parenthesize what appears to be an object literal. | |
141 if (!(/^\s*\{/.test(code) && /\}\s*$/.test(code))) | |
142 return false; | |
143 | |
144 try { | |
145 // Check if the code can be interpreted as an expression. | |
146 Function('return ' + code + ';'); | |
147 | |
148 // No syntax error! Does it work parenthesized? | |
149 Function('(' + code + ')'); | |
150 | |
151 return true; | |
152 } catch (e) { | |
153 return false; | |
154 } | |
155 } | |
156 | |
157 if (looksLikeAnObjectLiteral(text)) | |
158 text = '(' + text + ')'; | |
159 | |
160 executionContext.evaluate(text, 'console', useCommandLineAPI, false, false,
true, true, printResult.bind(this)); | |
161 Host.userMetrics.actionTaken(Host.UserMetrics.Action.ConsoleEvaluated); | |
162 } | |
163 | |
164 /** | |
165 * @param {!SDK.ConsoleMessage} msg | |
166 */ | |
167 addMessage(msg) { | |
168 if (msg.source === SDK.ConsoleMessage.MessageSource.Worker && SDK.targetMana
ger.targetById(msg.workerId)) | |
169 return; | |
170 | |
171 if (msg.source === SDK.ConsoleMessage.MessageSource.ConsoleAPI && msg.type =
== SDK.ConsoleMessage.MessageType.Clear) | |
172 this._clear(); | |
173 | |
174 this._messages.push(msg); | |
175 if (msg._exceptionId && msg.target()) { | |
176 // TODO(dgozman): make target non-nullable, as we only have messages witho
ut a target | |
177 // internally in ConsoleView. | |
178 var target = /** @type {!SDK.Target} */ (msg.target()); | |
179 var targetMap = this._messageByExceptionId.get(target); | |
180 if (!targetMap) { | |
181 targetMap = new Map(); | |
182 this._messageByExceptionId.set(target, targetMap); | |
183 } | |
184 targetMap.set(msg._exceptionId, msg); | |
185 } | |
186 this._incrementErrorWarningCount(msg); | |
187 this.dispatchEventToListeners(SDK.ConsoleModel.Events.MessageAdded, msg); | |
188 } | |
189 | |
190 /** | |
191 * @param {!SDK.LogModel.EntryAddedEvent} event | |
192 */ | |
193 _logEntryAdded(event) { | |
194 var consoleMessage = new SDK.ConsoleMessage( | |
195 event.logModel.target(), event.entry.source, event.entry.level, event.en
try.text, undefined, event.entry.url, | |
196 event.entry.lineNumber, undefined, event.entry.networkRequestId, undefin
ed, event.entry.stackTrace, | |
197 event.entry.timestamp, undefined, undefined, event.entry.workerId); | |
198 this.addMessage(consoleMessage); | |
199 } | |
200 | |
201 /** | |
202 * @param {!SDK.RuntimeModel} runtimeModel | |
203 * @param {!Common.Event} event | |
204 */ | |
205 _exceptionThrown(runtimeModel, event) { | |
206 var exceptionWithTimestamp = /** @type {!SDK.RuntimeModel.ExceptionWithTimes
tamp} */ (event.data); | |
207 var consoleMessage = SDK.ConsoleMessage.fromException( | |
208 runtimeModel.target(), exceptionWithTimestamp.details, undefined, except
ionWithTimestamp.timestamp, undefined); | |
209 consoleMessage.setExceptionId(exceptionWithTimestamp.details.exceptionId); | |
210 this.addMessage(consoleMessage); | |
211 } | |
212 | |
213 /** | |
214 * @param {!SDK.RuntimeModel} runtimeModel | |
215 * @param {!Common.Event} event | |
216 */ | |
217 _exceptionRevoked(runtimeModel, event) { | |
218 var exceptionId = /** @type {number} */ (event.data); | |
219 var targetMap = this._messageByExceptionId.get(runtimeModel.target()); | |
220 var exceptionMessage = targetMap ? targetMap.get(exceptionId) : null; | |
221 if (!exceptionMessage) | |
222 return; | |
223 this._errors--; | |
224 exceptionMessage.level = SDK.ConsoleMessage.MessageLevel.Info; | |
225 this.dispatchEventToListeners(SDK.ConsoleModel.Events.MessageUpdated, except
ionMessage); | |
226 } | |
227 | |
228 /** | |
229 * @param {!SDK.RuntimeModel} runtimeModel | |
230 * @param {!Common.Event} event | |
231 */ | |
232 _consoleAPICalled(runtimeModel, event) { | |
233 var call = /** @type {!SDK.RuntimeModel.ConsoleAPICall} */ (event.data); | |
234 var level = SDK.ConsoleMessage.MessageLevel.Info; | |
235 if (call.type === SDK.ConsoleMessage.MessageType.Debug) | |
236 level = SDK.ConsoleMessage.MessageLevel.Verbose; | |
237 else if (call.type === SDK.ConsoleMessage.MessageType.Error || call.type ===
SDK.ConsoleMessage.MessageType.Assert) | |
238 level = SDK.ConsoleMessage.MessageLevel.Error; | |
239 else if (call.type === SDK.ConsoleMessage.MessageType.Warning) | |
240 level = SDK.ConsoleMessage.MessageLevel.Warning; | |
241 else if (call.type === SDK.ConsoleMessage.MessageType.Info || call.type ===
SDK.ConsoleMessage.MessageType.Log) | |
242 level = SDK.ConsoleMessage.MessageLevel.Info; | |
243 var message = ''; | |
244 if (call.args.length && typeof call.args[0].value === 'string') | |
245 message = call.args[0].value; | |
246 else if (call.args.length && call.args[0].description) | |
247 message = call.args[0].description; | |
248 var callFrame = call.stackTrace && call.stackTrace.callFrames.length ? call.
stackTrace.callFrames[0] : null; | |
249 var consoleMessage = new SDK.ConsoleMessage( | |
250 runtimeModel.target(), SDK.ConsoleMessage.MessageSource.ConsoleAPI, leve
l, | |
251 /** @type {string} */ (message), call.type, callFrame ? callFrame.url :
undefined, | |
252 callFrame ? callFrame.lineNumber : undefined, callFrame ? callFrame.colu
mnNumber : undefined, undefined, | |
253 call.args, call.stackTrace, call.timestamp, call.executionContextId, und
efined); | |
254 this.addMessage(consoleMessage); | |
255 } | |
256 | |
257 /** | |
258 * @param {!Common.Event} event | |
259 */ | |
260 _mainFrameStartedLoading(event) { | |
261 if (!Common.moduleSetting('preserveConsoleLog').get()) | |
262 this._clear(); | |
263 } | |
264 | |
265 /** | |
266 * @param {!Common.Event} event | |
267 */ | |
268 _mainFrameNavigated(event) { | |
269 if (Common.moduleSetting('preserveConsoleLog').get()) | |
270 Common.console.log(Common.UIString('Navigated to %s', event.data.url)); | |
271 } | |
272 | |
273 /** | |
274 * @param {!SDK.CPUProfilerModel} cpuProfilerModel | |
275 * @param {!Common.Event} event | |
276 */ | |
277 _consoleProfileStarted(cpuProfilerModel, event) { | |
278 var data = /** @type {!SDK.CPUProfilerModel.EventData} */ (event.data); | |
279 this._addConsoleProfileMessage( | |
280 cpuProfilerModel, SDK.ConsoleMessage.MessageType.Profile, data.scriptLoc
ation, | |
281 Common.UIString('Profile \'%s\' started.', data.title)); | |
282 } | |
283 | |
284 /** | |
285 * @param {!SDK.CPUProfilerModel} cpuProfilerModel | |
286 * @param {!Common.Event} event | |
287 */ | |
288 _consoleProfileFinished(cpuProfilerModel, event) { | |
289 var data = /** @type {!SDK.CPUProfilerModel.EventData} */ (event.data); | |
290 this._addConsoleProfileMessage( | |
291 cpuProfilerModel, SDK.ConsoleMessage.MessageType.ProfileEnd, data.script
Location, | |
292 Common.UIString('Profile \'%s\' finished.', data.title)); | |
293 } | |
294 | |
295 /** | |
296 * @param {!SDK.CPUProfilerModel} cpuProfilerModel | |
297 * @param {string} type | |
298 * @param {!SDK.DebuggerModel.Location} scriptLocation | |
299 * @param {string} messageText | |
300 */ | |
301 _addConsoleProfileMessage(cpuProfilerModel, type, scriptLocation, messageText)
{ | |
302 var stackTrace = [{ | |
303 functionName: '', | |
304 scriptId: scriptLocation.scriptId, | |
305 url: scriptLocation.script() ? scriptLocation.script().contentURL() : '', | |
306 lineNumber: scriptLocation.lineNumber, | |
307 columnNumber: scriptLocation.columnNumber || 0 | |
308 }]; | |
309 this.addMessage(new SDK.ConsoleMessage( | |
310 cpuProfilerModel.target(), SDK.ConsoleMessage.MessageSource.ConsoleAPI,
SDK.ConsoleMessage.MessageLevel.Info, | |
311 messageText, type, undefined, undefined, undefined, undefined, stackTrac
e)); | |
312 } | |
313 | |
314 /** | |
315 * @param {!SDK.NetworkManager} networkManager | |
316 * @param {!Common.Event} event | |
317 */ | |
318 _networkWarningGenerated(networkManager, event) { | |
319 var warning = /** @type {!SDK.NetworkManager.Warning} */ (event.data); | |
320 this.addMessage(new SDK.ConsoleMessage( | |
321 networkManager.target(), SDK.ConsoleMessage.MessageSource.Network, SDK.C
onsoleMessage.MessageLevel.Warning, | |
322 warning.message, undefined, undefined, undefined, undefined, warning.req
uestId)); | |
323 } | |
324 | |
325 /** | |
326 * @param {!SDK.ConsoleMessage} msg | |
327 */ | |
328 _incrementErrorWarningCount(msg) { | |
329 if (msg.source === SDK.ConsoleMessage.MessageSource.Violation) | |
330 return; | |
331 switch (msg.level) { | |
332 case SDK.ConsoleMessage.MessageLevel.Warning: | |
333 this._warnings++; | |
334 break; | |
335 case SDK.ConsoleMessage.MessageLevel.Error: | |
336 this._errors++; | |
337 break; | |
338 } | |
339 } | |
340 | |
341 /** | |
342 * @return {!Array.<!SDK.ConsoleMessage>} | |
343 */ | |
344 messages() { | |
345 return this._messages; | |
346 } | |
347 | |
348 requestClearMessages() { | |
349 for (var logModel of SDK.targetManager.models(SDK.LogModel)) | |
350 logModel.requestClear(); | |
351 for (var runtimeModel of SDK.targetManager.models(SDK.RuntimeModel)) | |
352 runtimeModel.discardConsoleEntries(); | |
353 this._clear(); | |
354 } | |
355 | |
356 _clear() { | |
357 this._messages = []; | |
358 this._messageByExceptionId.clear(); | |
359 this._errors = 0; | |
360 this._warnings = 0; | |
361 this.dispatchEventToListeners(SDK.ConsoleModel.Events.ConsoleCleared); | |
362 } | |
363 | |
364 /** | |
365 * @return {number} | |
366 */ | |
367 errors() { | |
368 return this._errors; | |
369 } | |
370 | |
371 /** | |
372 * @return {number} | |
373 */ | |
374 warnings() { | |
375 return this._warnings; | |
376 } | |
377 }; | |
378 | |
379 /** @enum {symbol} */ | |
380 SDK.ConsoleModel.Events = { | |
381 ConsoleCleared: Symbol('ConsoleCleared'), | |
382 MessageAdded: Symbol('MessageAdded'), | |
383 MessageUpdated: Symbol('MessageUpdated'), | |
384 CommandEvaluated: Symbol('CommandEvaluated') | |
385 }; | |
386 | |
387 | |
388 /** | |
389 * @unrestricted | |
390 */ | |
391 SDK.ConsoleMessage = class { | |
392 /** | |
393 * @param {?SDK.Target} target | |
394 * @param {string} source | |
395 * @param {?string} level | |
396 * @param {string} messageText | |
397 * @param {string=} type | |
398 * @param {?string=} url | |
399 * @param {number=} line | |
400 * @param {number=} column | |
401 * @param {!Protocol.Network.RequestId=} requestId | |
402 * @param {!Array.<!Protocol.Runtime.RemoteObject>=} parameters | |
403 * @param {!Protocol.Runtime.StackTrace=} stackTrace | |
404 * @param {number=} timestamp | |
405 * @param {!Protocol.Runtime.ExecutionContextId=} executionContextId | |
406 * @param {?string=} scriptId | |
407 * @param {?string=} workerId | |
408 */ | |
409 constructor( | |
410 target, | |
411 source, | |
412 level, | |
413 messageText, | |
414 type, | |
415 url, | |
416 line, | |
417 column, | |
418 requestId, | |
419 parameters, | |
420 stackTrace, | |
421 timestamp, | |
422 executionContextId, | |
423 scriptId, | |
424 workerId) { | |
425 this._target = target; | |
426 this.source = source; | |
427 this.level = /** @type {?SDK.ConsoleMessage.MessageLevel} */ (level); | |
428 this.messageText = messageText; | |
429 this.type = type || SDK.ConsoleMessage.MessageType.Log; | |
430 /** @type {string|undefined} */ | |
431 this.url = url || undefined; | |
432 /** @type {number} */ | |
433 this.line = line || 0; | |
434 /** @type {number} */ | |
435 this.column = column || 0; | |
436 this.parameters = parameters; | |
437 /** @type {!Protocol.Runtime.StackTrace|undefined} */ | |
438 this.stackTrace = stackTrace; | |
439 this.timestamp = timestamp || Date.now(); | |
440 this.executionContextId = executionContextId || 0; | |
441 this.scriptId = scriptId || null; | |
442 this.workerId = workerId || null; | |
443 | |
444 var networkLog = target && SDK.NetworkLog.fromTarget(target); | |
445 this.request = (requestId && networkLog) ? networkLog.requestForId(requestId
) : null; | |
446 | |
447 if (this.request) { | |
448 var initiator = this.request.initiator(); | |
449 if (initiator) { | |
450 this.stackTrace = initiator.stack || undefined; | |
451 if (initiator.url) { | |
452 this.url = initiator.url; | |
453 this.line = initiator.lineNumber || 0; | |
454 } | |
455 } | |
456 } | |
457 } | |
458 | |
459 /** | |
460 * @param {!SDK.ConsoleMessage} a | |
461 * @param {!SDK.ConsoleMessage} b | |
462 * @return {number} | |
463 */ | |
464 static timestampComparator(a, b) { | |
465 return a.timestamp - b.timestamp; | |
466 } | |
467 | |
468 /** | |
469 * @param {!SDK.Target} target | |
470 * @param {!Protocol.Runtime.ExceptionDetails} exceptionDetails | |
471 * @param {string=} messageType | |
472 * @param {number=} timestamp | |
473 * @param {string=} forceUrl | |
474 * @return {!SDK.ConsoleMessage} | |
475 */ | |
476 static fromException(target, exceptionDetails, messageType, timestamp, forceUr
l) { | |
477 return new SDK.ConsoleMessage( | |
478 target, SDK.ConsoleMessage.MessageSource.JS, SDK.ConsoleMessage.MessageL
evel.Error, | |
479 SDK.RuntimeModel.simpleTextFromException(exceptionDetails), messageType,
forceUrl || exceptionDetails.url, | |
480 exceptionDetails.lineNumber, exceptionDetails.columnNumber, undefined, | |
481 exceptionDetails.exception ? | |
482 [SDK.RemoteObject.fromLocalObject(exceptionDetails.text), exceptionD
etails.exception] : | |
483 undefined, | |
484 exceptionDetails.stackTrace, timestamp, exceptionDetails.executionContex
tId, exceptionDetails.scriptId); | |
485 } | |
486 | |
487 /** | |
488 * @return {?SDK.Target} | |
489 */ | |
490 target() { | |
491 return this._target; | |
492 } | |
493 | |
494 /** | |
495 * @param {!SDK.ConsoleMessage} originatingMessage | |
496 */ | |
497 setOriginatingMessage(originatingMessage) { | |
498 this._originatingConsoleMessage = originatingMessage; | |
499 this.executionContextId = originatingMessage.executionContextId; | |
500 } | |
501 | |
502 /** | |
503 * @param {!Protocol.Runtime.ExecutionContextId} executionContextId | |
504 */ | |
505 setExecutionContextId(executionContextId) { | |
506 this.executionContextId = executionContextId; | |
507 } | |
508 | |
509 /** | |
510 * @param {number} exceptionId | |
511 */ | |
512 setExceptionId(exceptionId) { | |
513 this._exceptionId = exceptionId; | |
514 } | |
515 | |
516 /** | |
517 * @return {?SDK.ConsoleMessage} | |
518 */ | |
519 originatingMessage() { | |
520 return this._originatingConsoleMessage; | |
521 } | |
522 | |
523 /** | |
524 * @return {boolean} | |
525 */ | |
526 isGroupMessage() { | |
527 return this.type === SDK.ConsoleMessage.MessageType.StartGroup || | |
528 this.type === SDK.ConsoleMessage.MessageType.StartGroupCollapsed || | |
529 this.type === SDK.ConsoleMessage.MessageType.EndGroup; | |
530 } | |
531 | |
532 /** | |
533 * @return {boolean} | |
534 */ | |
535 isGroupStartMessage() { | |
536 return this.type === SDK.ConsoleMessage.MessageType.StartGroup || | |
537 this.type === SDK.ConsoleMessage.MessageType.StartGroupCollapsed; | |
538 } | |
539 | |
540 /** | |
541 * @return {boolean} | |
542 */ | |
543 isErrorOrWarning() { | |
544 return ( | |
545 this.level === SDK.ConsoleMessage.MessageLevel.Warning || this.level ===
SDK.ConsoleMessage.MessageLevel.Error); | |
546 } | |
547 | |
548 /** | |
549 * @param {?SDK.ConsoleMessage} msg | |
550 * @return {boolean} | |
551 */ | |
552 isEqual(msg) { | |
553 if (!msg) | |
554 return false; | |
555 | |
556 if (this._exceptionId || msg._exceptionId) | |
557 return false; | |
558 | |
559 if (!this._isEqualStackTraces(this.stackTrace, msg.stackTrace)) | |
560 return false; | |
561 | |
562 if (this.parameters) { | |
563 if (!msg.parameters || this.parameters.length !== msg.parameters.length) | |
564 return false; | |
565 | |
566 for (var i = 0; i < msg.parameters.length; ++i) { | |
567 // Never treat objects as equal - their properties might change over tim
e. | |
568 if (this.parameters[i].type !== msg.parameters[i].type || msg.parameters
[i].type === 'object' || | |
569 this.parameters[i].value !== msg.parameters[i].value) | |
570 return false; | |
571 } | |
572 } | |
573 | |
574 return (this.target() === msg.target()) && (this.source === msg.source) && (
this.type === msg.type) && | |
575 (this.level === msg.level) && (this.line === msg.line) && (this.url ===
msg.url) && | |
576 (this.messageText === msg.messageText) && (this.request === msg.request)
&& | |
577 (this.executionContextId === msg.executionContextId); | |
578 } | |
579 | |
580 /** | |
581 * @param {!Protocol.Runtime.StackTrace|undefined} stackTrace1 | |
582 * @param {!Protocol.Runtime.StackTrace|undefined} stackTrace2 | |
583 * @return {boolean} | |
584 */ | |
585 _isEqualStackTraces(stackTrace1, stackTrace2) { | |
586 if (!stackTrace1 !== !stackTrace2) | |
587 return false; | |
588 if (!stackTrace1) | |
589 return true; | |
590 var callFrames1 = stackTrace1.callFrames; | |
591 var callFrames2 = stackTrace2.callFrames; | |
592 if (callFrames1.length !== callFrames2.length) | |
593 return false; | |
594 for (var i = 0, n = callFrames1.length; i < n; ++i) { | |
595 if (callFrames1[i].url !== callFrames2[i].url || callFrames1[i].functionNa
me !== callFrames2[i].functionName || | |
596 callFrames1[i].lineNumber !== callFrames2[i].lineNumber || | |
597 callFrames1[i].columnNumber !== callFrames2[i].columnNumber) | |
598 return false; | |
599 } | |
600 return this._isEqualStackTraces(stackTrace1.parent, stackTrace2.parent); | |
601 } | |
602 }; | |
603 | |
604 // Note: Keep these constants in sync with the ones in Console.h | |
605 /** | |
606 * @enum {string} | |
607 */ | |
608 SDK.ConsoleMessage.MessageSource = { | |
609 XML: 'xml', | |
610 JS: 'javascript', | |
611 Network: 'network', | |
612 ConsoleAPI: 'console-api', | |
613 Storage: 'storage', | |
614 AppCache: 'appcache', | |
615 Rendering: 'rendering', | |
616 CSS: 'css', | |
617 Security: 'security', | |
618 Deprecation: 'deprecation', | |
619 Worker: 'worker', | |
620 Violation: 'violation', | |
621 Intervention: 'intervention', | |
622 Other: 'other' | |
623 }; | |
624 | |
625 /** | |
626 * @enum {string} | |
627 */ | |
628 SDK.ConsoleMessage.MessageType = { | |
629 Log: 'log', | |
630 Debug: 'debug', | |
631 Info: 'info', | |
632 Error: 'error', | |
633 Warning: 'warning', | |
634 Dir: 'dir', | |
635 DirXML: 'dirxml', | |
636 Table: 'table', | |
637 Trace: 'trace', | |
638 Clear: 'clear', | |
639 StartGroup: 'startGroup', | |
640 StartGroupCollapsed: 'startGroupCollapsed', | |
641 EndGroup: 'endGroup', | |
642 Assert: 'assert', | |
643 Result: 'result', | |
644 Profile: 'profile', | |
645 ProfileEnd: 'profileEnd', | |
646 Command: 'command' | |
647 }; | |
648 | |
649 /** | |
650 * @enum {string} | |
651 */ | |
652 SDK.ConsoleMessage.MessageLevel = { | |
653 Verbose: 'verbose', | |
654 Info: 'info', | |
655 Warning: 'warning', | |
656 Error: 'error' | |
657 }; | |
658 | |
659 /** | |
660 * @param {!SDK.ConsoleMessage.MessageLevel} level | |
661 * @return {number} | |
662 */ | |
663 SDK.ConsoleMessage.MessageLevel.ordinal = function(level) { | |
664 if (level === SDK.ConsoleMessage.MessageLevel.Verbose) | |
665 return 0; | |
666 if (level === SDK.ConsoleMessage.MessageLevel.Info) | |
667 return 1; | |
668 if (level === SDK.ConsoleMessage.MessageLevel.Warning) | |
669 return 2; | |
670 return 3; | |
671 }; | |
672 | |
673 SDK.ConsoleModel._events = Symbol('SDK.ConsoleModel.events'); | |
674 | |
675 /** | |
676 * @type {!SDK.ConsoleModel} | |
677 */ | |
678 SDK.consoleModel; | |
OLD | NEW |