| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2014 The Chromium Authors. All rights reserved. | 2 * Copyright 2014 The Chromium Authors. All rights reserved. |
| 3 * Use of this source code is governed by a BSD-style license that can be | 3 * Use of this source code is governed by a BSD-style license that can be |
| 4 * found in the LICENSE file. | 4 * found in the LICENSE file. |
| 5 */ | 5 */ |
| 6 | 6 |
| 7 /** | 7 /** |
| 8 * @constructor | 8 * @constructor |
| 9 * @extends {Protocol.Agents} | 9 * @extends {Protocol.Agents} |
| 10 * @param {!WebInspector.TargetManager} targetManager | 10 * @param {!WebInspector.TargetManager} targetManager |
| 11 * @param {string} name | 11 * @param {string} name |
| 12 * @param {number} type | 12 * @param {number} type |
| 13 * @param {!InspectorBackendClass.Connection} connection | 13 * @param {!InspectorBackendClass.Connection} connection |
| 14 * @param {?WebInspector.Target} parentTarget | 14 * @param {?WebInspector.Target} parentTarget |
| 15 */ | 15 */ |
| 16 WebInspector.Target = function(targetManager, name, type, connection, parentTarg
et) | 16 WebInspector.Target = function(targetManager, name, type, connection, parentTarg
et) |
| 17 { | 17 { |
| 18 Protocol.Agents.call(this, connection.agentsMap()); | 18 Protocol.Agents.call(this, connection.agentsMap()); |
| 19 this._targetManager = targetManager; | 19 this._targetManager = targetManager; |
| 20 this._name = name; | 20 this._name = name; |
| 21 this._type = type; | 21 this._type = type; |
| 22 this._connection = connection; | 22 this._connection = connection; |
| 23 this._parentTarget = parentTarget; | 23 this._parentTarget = parentTarget; |
| 24 connection.addEventListener(InspectorBackendClass.Connection.Events.Disconne
cted, this._onDisconnect, this); | 24 connection.addEventListener(InspectorBackendClass.Connection.Events.Disconne
cted, this._onDisconnect, this); |
| 25 this._id = WebInspector.Target._nextId++; | 25 this._id = WebInspector.Target._nextId++; |
| 26 | 26 |
| 27 /** @type {!Map.<!Function, !WebInspector.SDKModel>} */ | 27 /** @type {!Map.<!Function, !WebInspector.SDKModel>} */ |
| 28 this._modelByConstructor = new Map(); | 28 this._modelByConstructor = new Map(); |
| 29 | |
| 30 /** @type {!WebInspector.ConsoleModel} */ | |
| 31 this.consoleModel = new WebInspector.ConsoleModel(this); | |
| 32 /** @type {!WebInspector.NetworkManager} */ | |
| 33 this.networkManager = new WebInspector.NetworkManager(this); | |
| 34 /** @type {!WebInspector.ResourceTreeModel} */ | |
| 35 this.resourceTreeModel = new WebInspector.ResourceTreeModel(this); | |
| 36 /** @type {!WebInspector.NetworkLog} */ | |
| 37 this.networkLog = new WebInspector.NetworkLog(this); | |
| 38 | |
| 39 /** @type {!WebInspector.RuntimeModel} */ | |
| 40 this.runtimeModel = new WebInspector.RuntimeModel(this); | |
| 41 if (this.hasJSContext()) | |
| 42 new WebInspector.DebuggerModel(this); | |
| 43 | |
| 44 if (this._type === WebInspector.Target.Type.Page) { | |
| 45 new WebInspector.DOMModel(this); | |
| 46 new WebInspector.CSSModel(this); | |
| 47 } | |
| 48 | |
| 49 /** @type {?WebInspector.WorkerManager} */ | |
| 50 this.workerManager = !this.isDedicatedWorker() ? new WebInspector.WorkerMana
ger(this) : null; | |
| 51 /** @type {!WebInspector.CPUProfilerModel} */ | |
| 52 this.cpuProfilerModel = new WebInspector.CPUProfilerModel(this); | |
| 53 /** @type {!WebInspector.HeapProfilerModel} */ | |
| 54 this.heapProfilerModel = new WebInspector.HeapProfilerModel(this); | |
| 55 | |
| 56 this.tracingManager = new WebInspector.TracingManager(this); | |
| 57 | |
| 58 if (this.isPage()) | |
| 59 this.serviceWorkerManager = new WebInspector.ServiceWorkerManager(this); | |
| 60 } | 29 } |
| 61 | 30 |
| 62 /** | 31 /** |
| 63 * @enum {number} | 32 * @enum {number} |
| 64 */ | 33 */ |
| 65 WebInspector.Target.Type = { | 34 WebInspector.Target.Type = { |
| 66 Page: 1, | 35 Page: 1, |
| 67 DedicatedWorker: 2, | 36 DedicatedWorker: 2, |
| 68 ServiceWorker: 4 | 37 ServiceWorker: 4 |
| 69 } | 38 } |
| (...skipping 13 matching lines...) Expand all Loading... |
| 83 * | 52 * |
| 84 * @return {string} | 53 * @return {string} |
| 85 */ | 54 */ |
| 86 name: function() | 55 name: function() |
| 87 { | 56 { |
| 88 return this._name; | 57 return this._name; |
| 89 }, | 58 }, |
| 90 | 59 |
| 91 /** | 60 /** |
| 92 * | 61 * |
| 62 * @return {number} |
| 63 */ |
| 64 type: function() |
| 65 { |
| 66 return this._type; |
| 67 }, |
| 68 |
| 69 /** |
| 70 * |
| 93 * @return {!WebInspector.TargetManager} | 71 * @return {!WebInspector.TargetManager} |
| 94 */ | 72 */ |
| 95 targetManager: function() | 73 targetManager: function() |
| 96 { | 74 { |
| 97 return this._targetManager; | 75 return this._targetManager; |
| 98 }, | 76 }, |
| 99 | 77 |
| 100 /** | 78 /** |
| 101 * @param {string} label | 79 * @param {string} label |
| 102 * @return {string} | 80 * @return {string} |
| (...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 247 /** | 225 /** |
| 248 * @return {!Promise} | 226 * @return {!Promise} |
| 249 */ | 227 */ |
| 250 resumeModel: function() | 228 resumeModel: function() |
| 251 { | 229 { |
| 252 return Promise.resolve(); | 230 return Promise.resolve(); |
| 253 }, | 231 }, |
| 254 | 232 |
| 255 __proto__: WebInspector.SDKObject.prototype | 233 __proto__: WebInspector.SDKObject.prototype |
| 256 } | 234 } |
| 257 | |
| 258 /** | |
| 259 * @constructor | |
| 260 * @extends {WebInspector.Object} | |
| 261 */ | |
| 262 WebInspector.TargetManager = function() | |
| 263 { | |
| 264 WebInspector.Object.call(this); | |
| 265 /** @type {!Array.<!WebInspector.Target>} */ | |
| 266 this._targets = []; | |
| 267 /** @type {!Array.<!WebInspector.TargetManager.Observer>} */ | |
| 268 this._observers = []; | |
| 269 this._observerTypeSymbol = Symbol("observerType"); | |
| 270 /** @type {!Object.<string, !Array.<{modelClass: !Function, thisObject: (!Ob
ject|undefined), listener: function(!WebInspector.Event)}>>} */ | |
| 271 this._modelListeners = {}; | |
| 272 this._isSuspended = false; | |
| 273 } | |
| 274 | |
| 275 WebInspector.TargetManager.Events = { | |
| 276 InspectedURLChanged: "InspectedURLChanged", | |
| 277 MainFrameNavigated: "MainFrameNavigated", | |
| 278 Load: "Load", | |
| 279 PageReloadRequested: "PageReloadRequested", | |
| 280 WillReloadPage: "WillReloadPage", | |
| 281 TargetDisposed: "TargetDisposed", | |
| 282 SuspendStateChanged: "SuspendStateChanged" | |
| 283 } | |
| 284 | |
| 285 WebInspector.TargetManager.prototype = { | |
| 286 suspendAllTargets: function() | |
| 287 { | |
| 288 if (this._isSuspended) | |
| 289 return; | |
| 290 this._isSuspended = true; | |
| 291 this.dispatchEventToListeners(WebInspector.TargetManager.Events.SuspendS
tateChanged); | |
| 292 | |
| 293 for (var i = 0; i < this._targets.length; ++i) { | |
| 294 for (var model of this._targets[i]._modelByConstructor.values()) | |
| 295 model.suspendModel(); | |
| 296 } | |
| 297 }, | |
| 298 | |
| 299 /** | |
| 300 * @return {!Promise} | |
| 301 */ | |
| 302 resumeAllTargets: function() | |
| 303 { | |
| 304 if (!this._isSuspended) | |
| 305 throw new Error("Not suspended"); | |
| 306 this._isSuspended = false; | |
| 307 this.dispatchEventToListeners(WebInspector.TargetManager.Events.SuspendS
tateChanged); | |
| 308 | |
| 309 var promises = []; | |
| 310 for (var i = 0; i < this._targets.length; ++i) { | |
| 311 for (var model of this._targets[i]._modelByConstructor.values()) | |
| 312 promises.push(model.resumeModel()); | |
| 313 } | |
| 314 return Promise.all(promises); | |
| 315 }, | |
| 316 | |
| 317 suspendAndResumeAllTargets: function() | |
| 318 { | |
| 319 this.suspendAllTargets(); | |
| 320 this.resumeAllTargets(); | |
| 321 }, | |
| 322 | |
| 323 /** | |
| 324 * @return {boolean} | |
| 325 */ | |
| 326 allTargetsSuspended: function() | |
| 327 { | |
| 328 return this._isSuspended; | |
| 329 }, | |
| 330 | |
| 331 /** | |
| 332 * @return {string} | |
| 333 */ | |
| 334 inspectedPageURL: function() | |
| 335 { | |
| 336 if (!this._targets.length) | |
| 337 return ""; | |
| 338 | |
| 339 return this._targets[0].resourceTreeModel.inspectedPageURL(); | |
| 340 }, | |
| 341 | |
| 342 /** | |
| 343 * @return {string} | |
| 344 */ | |
| 345 inspectedPageDomain: function() | |
| 346 { | |
| 347 if (!this._targets.length) | |
| 348 return ""; | |
| 349 | |
| 350 return this._targets[0].resourceTreeModel.inspectedPageDomain(); | |
| 351 }, | |
| 352 | |
| 353 /** | |
| 354 * @param {!WebInspector.Event} event | |
| 355 */ | |
| 356 _redispatchEvent: function(event) | |
| 357 { | |
| 358 this.dispatchEventToListeners(event.type, event.data); | |
| 359 }, | |
| 360 | |
| 361 /** | |
| 362 * @param {boolean=} ignoreCache | |
| 363 * @param {string=} injectedScript | |
| 364 */ | |
| 365 reloadPage: function(ignoreCache, injectedScript) | |
| 366 { | |
| 367 if (this._targets.length) | |
| 368 this._targets[0].resourceTreeModel.reloadPage(ignoreCache, injectedS
cript); | |
| 369 }, | |
| 370 | |
| 371 /** | |
| 372 * @param {!Function} modelClass | |
| 373 * @param {string} eventType | |
| 374 * @param {function(!WebInspector.Event)} listener | |
| 375 * @param {!Object=} thisObject | |
| 376 */ | |
| 377 addModelListener: function(modelClass, eventType, listener, thisObject) | |
| 378 { | |
| 379 for (var i = 0; i < this._targets.length; ++i) { | |
| 380 var model = this._targets[i]._modelByConstructor.get(modelClass); | |
| 381 if (model) | |
| 382 model.addEventListener(eventType, listener, thisObject); | |
| 383 } | |
| 384 if (!this._modelListeners[eventType]) | |
| 385 this._modelListeners[eventType] = []; | |
| 386 this._modelListeners[eventType].push({ modelClass: modelClass, thisObjec
t: thisObject, listener: listener }); | |
| 387 }, | |
| 388 | |
| 389 /** | |
| 390 * @param {!Function} modelClass | |
| 391 * @param {string} eventType | |
| 392 * @param {function(!WebInspector.Event)} listener | |
| 393 * @param {!Object=} thisObject | |
| 394 */ | |
| 395 removeModelListener: function(modelClass, eventType, listener, thisObject) | |
| 396 { | |
| 397 if (!this._modelListeners[eventType]) | |
| 398 return; | |
| 399 | |
| 400 for (var i = 0; i < this._targets.length; ++i) { | |
| 401 var model = this._targets[i]._modelByConstructor.get(modelClass); | |
| 402 if (model) | |
| 403 model.removeEventListener(eventType, listener, thisObject); | |
| 404 } | |
| 405 | |
| 406 var listeners = this._modelListeners[eventType]; | |
| 407 for (var i = 0; i < listeners.length; ++i) { | |
| 408 if (listeners[i].modelClass === modelClass && listeners[i].listener
=== listener && listeners[i].thisObject === thisObject) | |
| 409 listeners.splice(i--, 1); | |
| 410 } | |
| 411 if (!listeners.length) | |
| 412 delete this._modelListeners[eventType]; | |
| 413 }, | |
| 414 | |
| 415 /** | |
| 416 * @param {!WebInspector.TargetManager.Observer} targetObserver | |
| 417 * @param {number=} type | |
| 418 */ | |
| 419 observeTargets: function(targetObserver, type) | |
| 420 { | |
| 421 if (this._observerTypeSymbol in targetObserver) | |
| 422 throw new Error("Observer can only be registered once"); | |
| 423 targetObserver[this._observerTypeSymbol] = type || 0x7fff; | |
| 424 this.targets(type).forEach(targetObserver.targetAdded.bind(targetObserve
r)); | |
| 425 this._observers.push(targetObserver); | |
| 426 }, | |
| 427 | |
| 428 /** | |
| 429 * @param {!WebInspector.TargetManager.Observer} targetObserver | |
| 430 */ | |
| 431 unobserveTargets: function(targetObserver) | |
| 432 { | |
| 433 delete targetObserver[this._observerTypeSymbol]; | |
| 434 this._observers.remove(targetObserver); | |
| 435 }, | |
| 436 | |
| 437 /** | |
| 438 * @param {string} name | |
| 439 * @param {number} type | |
| 440 * @param {!InspectorBackendClass.Connection} connection | |
| 441 * @param {?WebInspector.Target} parentTarget | |
| 442 * @return {!WebInspector.Target} | |
| 443 */ | |
| 444 createTarget: function(name, type, connection, parentTarget) | |
| 445 { | |
| 446 var target = new WebInspector.Target(this, name, type, connection, paren
tTarget); | |
| 447 this.addTarget(target); | |
| 448 return target; | |
| 449 }, | |
| 450 | |
| 451 /** | |
| 452 * @param {number} type | |
| 453 * @return {!Array<!WebInspector.TargetManager.Observer>} | |
| 454 */ | |
| 455 _observersByType: function(type) | |
| 456 { | |
| 457 var result = []; | |
| 458 for (var observer of this._observers) { | |
| 459 if (observer[this._observerTypeSymbol] & type) | |
| 460 result.push(observer); | |
| 461 } | |
| 462 return result; | |
| 463 }, | |
| 464 | |
| 465 /** | |
| 466 * @param {!WebInspector.Target} target | |
| 467 */ | |
| 468 addTarget: function(target) | |
| 469 { | |
| 470 this._targets.push(target); | |
| 471 if (this._targets.length === 1) { | |
| 472 target.resourceTreeModel.addEventListener(WebInspector.ResourceTreeM
odel.EventTypes.InspectedURLChanged, this._redispatchEvent, this); | |
| 473 target.resourceTreeModel.addEventListener(WebInspector.ResourceTreeM
odel.EventTypes.MainFrameNavigated, this._redispatchEvent, this); | |
| 474 target.resourceTreeModel.addEventListener(WebInspector.ResourceTreeM
odel.EventTypes.Load, this._redispatchEvent, this); | |
| 475 target.resourceTreeModel.addEventListener(WebInspector.ResourceTreeM
odel.EventTypes.PageReloadRequested, this._redispatchEvent, this); | |
| 476 target.resourceTreeModel.addEventListener(WebInspector.ResourceTreeM
odel.EventTypes.WillReloadPage, this._redispatchEvent, this); | |
| 477 } | |
| 478 var copy = this._observersByType(target._type); | |
| 479 for (var i = 0; i < copy.length; ++i) | |
| 480 copy[i].targetAdded(target); | |
| 481 | |
| 482 for (var eventType in this._modelListeners) { | |
| 483 var listeners = this._modelListeners[eventType]; | |
| 484 for (var i = 0; i < listeners.length; ++i) { | |
| 485 var model = target._modelByConstructor.get(listeners[i].modelCla
ss); | |
| 486 if (model) | |
| 487 model.addEventListener(eventType, listeners[i].listener, lis
teners[i].thisObject); | |
| 488 } | |
| 489 } | |
| 490 }, | |
| 491 | |
| 492 /** | |
| 493 * @param {!WebInspector.Target} target | |
| 494 */ | |
| 495 removeTarget: function(target) | |
| 496 { | |
| 497 this._targets.remove(target); | |
| 498 if (this._targets.length === 0) { | |
| 499 target.resourceTreeModel.removeEventListener(WebInspector.ResourceTr
eeModel.EventTypes.InspectedURLChanged, this._redispatchEvent, this); | |
| 500 target.resourceTreeModel.removeEventListener(WebInspector.ResourceTr
eeModel.EventTypes.MainFrameNavigated, this._redispatchEvent, this); | |
| 501 target.resourceTreeModel.removeEventListener(WebInspector.ResourceTr
eeModel.EventTypes.Load, this._redispatchEvent, this); | |
| 502 target.resourceTreeModel.removeEventListener(WebInspector.ResourceTr
eeModel.EventTypes.WillReloadPage, this._redispatchEvent, this); | |
| 503 } | |
| 504 var copy = this._observersByType(target._type); | |
| 505 for (var i = 0; i < copy.length; ++i) | |
| 506 copy[i].targetRemoved(target); | |
| 507 | |
| 508 for (var eventType in this._modelListeners) { | |
| 509 var listeners = this._modelListeners[eventType]; | |
| 510 for (var i = 0; i < listeners.length; ++i) { | |
| 511 var model = target._modelByConstructor.get(listeners[i].modelCla
ss); | |
| 512 if (model) | |
| 513 model.removeEventListener(eventType, listeners[i].listener,
listeners[i].thisObject); | |
| 514 } | |
| 515 } | |
| 516 }, | |
| 517 | |
| 518 /** | |
| 519 * @param {number=} type | |
| 520 * @return {boolean} | |
| 521 */ | |
| 522 hasTargets: function(type) | |
| 523 { | |
| 524 return !!this.targets(type).length; | |
| 525 }, | |
| 526 | |
| 527 /** | |
| 528 * @param {number=} type | |
| 529 * @return {!Array.<!WebInspector.Target>} | |
| 530 */ | |
| 531 targets: function(type) | |
| 532 { | |
| 533 if (!type) | |
| 534 return this._targets.slice(); | |
| 535 | |
| 536 var result = []; | |
| 537 for (var target of this._targets) { | |
| 538 if (target._type & type) | |
| 539 result.push(target); | |
| 540 } | |
| 541 return result; | |
| 542 }, | |
| 543 | |
| 544 /** | |
| 545 * @return {!Array.<!WebInspector.Target>} | |
| 546 */ | |
| 547 targetsWithJSContext: function() | |
| 548 { | |
| 549 var result = []; | |
| 550 for (var target of this._targets) { | |
| 551 if (target.hasJSContext()) | |
| 552 result.push(target); | |
| 553 } | |
| 554 return result; | |
| 555 }, | |
| 556 | |
| 557 /** | |
| 558 * | |
| 559 * @param {number} id | |
| 560 * @return {?WebInspector.Target} | |
| 561 */ | |
| 562 targetById: function(id) | |
| 563 { | |
| 564 for (var i = 0; i < this._targets.length; ++i) { | |
| 565 if (this._targets[i].id() === id) | |
| 566 return this._targets[i]; | |
| 567 } | |
| 568 return null; | |
| 569 }, | |
| 570 | |
| 571 /** | |
| 572 * @return {?WebInspector.Target} | |
| 573 */ | |
| 574 mainTarget: function() | |
| 575 { | |
| 576 return this._targets[0] || null; | |
| 577 }, | |
| 578 | |
| 579 __proto__: WebInspector.Object.prototype | |
| 580 } | |
| 581 | |
| 582 /** | |
| 583 * @interface | |
| 584 */ | |
| 585 WebInspector.TargetManager.Observer = function() | |
| 586 { | |
| 587 } | |
| 588 | |
| 589 WebInspector.TargetManager.Observer.prototype = { | |
| 590 /** | |
| 591 * @param {!WebInspector.Target} target | |
| 592 */ | |
| 593 targetAdded: function(target) { }, | |
| 594 | |
| 595 /** | |
| 596 * @param {!WebInspector.Target} target | |
| 597 */ | |
| 598 targetRemoved: function(target) { }, | |
| 599 } | |
| 600 | |
| 601 /** | |
| 602 * @type {!WebInspector.TargetManager} | |
| 603 */ | |
| 604 WebInspector.targetManager = new WebInspector.TargetManager(); | |
| OLD | NEW |