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 |