Chromium Code Reviews| Index: Source/devtools/front_end/sdk/Target.js |
| diff --git a/Source/devtools/front_end/sdk/Target.js b/Source/devtools/front_end/sdk/Target.js |
| index 7d0c98327ce8a26d40e4de5800eee0ba975a51db..6b6190c9ffc0217abe34dc1d9da601fed5706475 100644 |
| --- a/Source/devtools/front_end/sdk/Target.js |
| +++ b/Source/devtools/front_end/sdk/Target.js |
| @@ -21,6 +21,9 @@ WebInspector.Target = function(name, connection, callback) |
| connection.addEventListener(InspectorBackendClass.Connection.Events.Disconnected, this._onDisconnect, this); |
| this._id = WebInspector.Target._nextId++; |
| + /** @type {!Map.<!Function, !WebInspector.SDKModel>} */ |
| + this._modelByConstructor = new Map(); |
| + |
| /** @type {!Object.<string, boolean>} */ |
| this._capabilities = {}; |
| this.pageAgent().canScreencast(this._initializeCapability.bind(this, WebInspector.Target.Capabilities.canScreencast, null)); |
| @@ -104,8 +107,6 @@ WebInspector.Target.prototype = { |
| /** @type {!WebInspector.NetworkManager} */ |
| this.networkManager = new WebInspector.NetworkManager(this); |
| - if (!WebInspector.networkManager) |
| - WebInspector.networkManager = this.networkManager; |
| /** @type {!WebInspector.ResourceTreeModel} */ |
| this.resourceTreeModel = new WebInspector.ResourceTreeModel(this); |
| @@ -239,6 +240,23 @@ WebInspector.SDKObject.prototype = { |
| /** |
| * @constructor |
| + * @extends {WebInspector.SDKObject} |
| + * @param {!Function} modelClass |
| + * @param {!WebInspector.Target} target |
| + */ |
| +WebInspector.SDKModel = function(modelClass, target) |
| +{ |
| + WebInspector.SDKObject.call(this, target); |
| + target._modelByConstructor.put(modelClass, this); |
| +} |
| + |
| +WebInspector.SDKModel.prototype = { |
| + |
|
apavlov
2014/07/17 22:09:59
extra line
pfeldman
2014/07/18 11:59:47
Done.
|
| + __proto__: WebInspector.SDKObject.prototype |
| +} |
| + |
| +/** |
| + * @constructor |
| */ |
| WebInspector.TargetManager = function() |
| { |
| @@ -246,9 +264,54 @@ WebInspector.TargetManager = function() |
| this._targets = []; |
| /** @type {!Array.<!WebInspector.TargetManager.Observer>} */ |
| this._observers = []; |
| + /** @type {!Object.<string, !Array.<{modelClass: !Function, thisObject: (!Object|undefined), listener: function(!WebInspector.Event)}>>} */ |
| + this._listeners = {}; |
| } |
| WebInspector.TargetManager.prototype = { |
| + /** |
| + * @param {!Function} modelClass |
| + * @param {string} eventType |
| + * @param {function(!WebInspector.Event)} listener |
| + * @param {!Object=} thisObject |
| + */ |
| + addModelListener: function(modelClass, eventType, listener, thisObject) |
| + { |
| + for (var i = 0; i < this._targets.length; ++i) { |
| + var target = this._targets[i]; |
|
apavlov
2014/07/17 22:09:58
can be inlined
pfeldman
2014/07/18 11:59:47
Done.
|
| + var model = target._modelByConstructor.get(modelClass); |
| + model.addEventListener(eventType, listener, thisObject); |
| + } |
| + if (!this._listeners[eventType]) |
| + this._listeners[eventType] = []; |
| + this._listeners[eventType].push({ modelClass: modelClass, thisObject: thisObject, listener: listener }); |
| + }, |
| + |
| + /** |
| + * @param {!Function} modelClass |
| + * @param {string} eventType |
| + * @param {function(!WebInspector.Event)} listener |
| + * @param {!Object=} thisObject |
| + */ |
| + removeModelListener: function(modelClass, eventType, listener, thisObject) |
| + { |
| + if (!this._listeners[eventType]) |
| + return; |
| + |
| + for (var i = 0; i < this._targets.length; ++i) { |
| + var target = this._targets[i]; |
|
apavlov
2014/07/17 22:09:59
ditto
pfeldman
2014/07/18 11:59:47
Done.
|
| + var model = target._modelByConstructor.get(modelClass); |
| + model.removeEventListener(eventType, listener, thisObject); |
| + } |
| + |
| + var listeners = this._listeners[eventType]; |
| + for (var i = 0; i < listeners.length; ++i) { |
| + if (listeners[i].modelClass === modelClass && listeners[i].listener === listener && listeners[i].thisObject === thisObject) |
| + listeners.splice(i--, 1); |
| + } |
| + if (!listeners.length) |
| + delete this._listeners[eventType]; |
| + }, |
| /** |
| * @param {!WebInspector.TargetManager.Observer} targetObserver |
| @@ -289,14 +352,22 @@ WebInspector.TargetManager.prototype = { |
| }, |
| /** |
| - * @param {!WebInspector.Target} newTarget |
| + * @param {!WebInspector.Target} target |
| */ |
| - addTarget: function(newTarget) |
| + addTarget: function(target) |
| { |
| - this._targets.push(newTarget); |
| + this._targets.push(target); |
| var copy = this._observers; |
|
apavlov
2014/07/17 22:09:59
while we are here, "copy" sounds a bit wrong - it'
pfeldman
2014/07/18 11:59:47
Done.
|
| - for (var i = 0; i < copy.length; ++i) |
| - copy[i].targetAdded(newTarget); |
| + for (var i = 0; i < copy.length; ++i) { |
| + copy[i].targetAdded(target); |
| + for (var eventType in this._listeners) { |
|
apavlov
2014/07/17 22:09:58
Should this loop reside outside the outer one? It
pfeldman
2014/07/18 11:59:47
Done.
|
| + var listeners = this._listeners[eventType]; |
| + for (var i = 0; i < listeners.length; ++i) { |
|
apavlov
2014/07/17 22:09:58
nested iteration by "i". Argh.
pfeldman
2014/07/18 11:59:47
Done.
|
| + var model = target._modelByConstructor.get(listeners[i].modelClass); |
| + model.addEventListener(eventType, listeners[i].listener, listeners[i].thisObject); |
| + } |
| + } |
| + } |
| }, |
| /** |
| @@ -306,8 +377,16 @@ WebInspector.TargetManager.prototype = { |
| { |
| this._targets.remove(target); |
| var copy = this._observers.slice(); |
| - for (var i = 0; i < copy.length; ++i) |
| + for (var i = 0; i < copy.length; ++i) { |
| copy[i].targetRemoved(target); |
| + for (var eventType in this._listeners) { |
|
apavlov
2014/07/17 22:09:59
ditto
pfeldman
2014/07/18 11:59:47
Done.
|
| + var listeners = this._listeners[eventType]; |
| + for (var i = 0; i < listeners.length; ++i) { |
|
apavlov
2014/07/17 22:09:59
ditto
pfeldman
2014/07/18 11:59:47
Done.
|
| + var model = target._modelByConstructor.get(listeners[i].modelClass); |
| + model.removeEventListener(eventType, listeners[i].listener, listeners[i].thisObject); |
| + } |
| + } |
| + } |
| }, |
| /** |