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..7245488f340256b46f309da3ba7a1e48f5057097 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,22 @@ 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 = { |
+ __proto__: WebInspector.SDKObject.prototype |
+} |
+ |
+/** |
+ * @constructor |
*/ |
WebInspector.TargetManager = function() |
{ |
@@ -246,9 +263,52 @@ 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 model = this._targets[i]._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 model = this._targets[i]._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 +349,22 @@ WebInspector.TargetManager.prototype = { |
}, |
/** |
- * @param {!WebInspector.Target} newTarget |
+ * @param {!WebInspector.Target} target |
*/ |
- addTarget: function(newTarget) |
+ addTarget: function(target) |
{ |
- this._targets.push(newTarget); |
- var copy = this._observers; |
+ this._targets.push(target); |
+ var copy = this._observers.slice(); |
for (var i = 0; i < copy.length; ++i) |
- copy[i].targetAdded(newTarget); |
+ copy[i].targetAdded(target); |
+ |
+ for (var eventType in this._listeners) { |
+ var listeners = this._listeners[eventType]; |
+ for (var i = 0; i < listeners.length; ++i) { |
+ var model = target._modelByConstructor.get(listeners[i].modelClass); |
+ model.addEventListener(eventType, listeners[i].listener, listeners[i].thisObject); |
+ } |
+ } |
}, |
/** |
@@ -308,6 +376,14 @@ WebInspector.TargetManager.prototype = { |
var copy = this._observers.slice(); |
for (var i = 0; i < copy.length; ++i) |
copy[i].targetRemoved(target); |
+ |
+ for (var eventType in this._listeners) { |
+ var listeners = this._listeners[eventType]; |
+ for (var i = 0; i < listeners.length; ++i) { |
+ var model = target._modelByConstructor.get(listeners[i].modelClass); |
+ model.removeEventListener(eventType, listeners[i].listener, listeners[i].thisObject); |
+ } |
+ } |
}, |
/** |