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); |
+ } |
+ } |
+ } |
}, |
/** |