| 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 |