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

Side by Side Diff: third_party/WebKit/Source/devtools/front_end/sdk/Target.js

Issue 1801293003: DevTools: Extract TargetManager into its own file (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: only public interfaces for target properties Created 4 years, 9 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
OLDNEW
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
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
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();
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/devtools/devtools.gypi ('k') | third_party/WebKit/Source/devtools/front_end/sdk/TargetManager.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698