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