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

Unified Diff: Source/devtools/front_end/sdk/Target.js

Issue 400633003: DevTools: introduce multitarget model listeners (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 6 years, 5 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « Source/devtools/front_end/sdk/RuntimeModel.js ('k') | Source/devtools/front_end/sdk/TimelineManager.js » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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);
+ }
+ }
},
/**
« no previous file with comments | « Source/devtools/front_end/sdk/RuntimeModel.js ('k') | Source/devtools/front_end/sdk/TimelineManager.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698