Index: third_party/WebKit/Source/devtools/front_end/common/Object.js |
diff --git a/third_party/WebKit/Source/devtools/front_end/common/Object.js b/third_party/WebKit/Source/devtools/front_end/common/Object.js |
index 6f5d793c827a6d14ee94043e1b8a9248b4074a63..a696fcb298f2e0ff04d3486b5dbb4b37e82c5e5d 100644 |
--- a/third_party/WebKit/Source/devtools/front_end/common/Object.js |
+++ b/third_party/WebKit/Source/devtools/front_end/common/Object.js |
@@ -27,6 +27,10 @@ |
* @unrestricted |
*/ |
Common.Object = class { |
+ constructor() { |
+ /** @type {(!Map<(symbol|!Common.Emittable), !Array<!Common.Object._listenerCallbackTuple>>|undefined)} */ |
+ this._listeners; |
+ } |
/** |
* @override |
* @param {symbol} eventType |
@@ -40,6 +44,7 @@ Common.Object = class { |
if (!this._listeners) |
this._listeners = new Map(); |
+ |
if (!this._listeners.has(eventType)) |
this._listeners.set(eventType, []); |
this._listeners.get(eventType).push({thisObject: thisObject, listener: listener}); |
@@ -73,7 +78,7 @@ Common.Object = class { |
* @return {boolean} |
*/ |
hasEventListeners(eventType) { |
- return this._listeners && this._listeners.has(eventType); |
+ return !!(this._listeners && this._listeners.has(eventType)); |
} |
/** |
@@ -92,12 +97,12 @@ Common.Object = class { |
} |
/** |
- * @template T |
* @override |
- * @param {function(new:T, ...)} eventType |
+ * @param {function(new:Common.Emittable, ...)} eventType |
* @param {function(!T)} listener |
* @param {!Object=} thisObject |
* @return {!Common.EventTarget.TypedEventDescriptor} |
+ * @template T |
*/ |
on(eventType, listener, thisObject) { |
if (!this._listeners) |
@@ -109,10 +114,9 @@ Common.Object = class { |
} |
/** |
- * @template T |
* @override |
- * @param {function(new:T, ...)} eventType |
- * @param {function(!T)} listener |
+ * @param {function(new:Common.Emittable, ...)} eventType |
+ * @param {function(!Common.Emittable)} listener |
* @param {!Object=} thisObject |
*/ |
off(eventType, listener, thisObject) { |
@@ -128,9 +132,8 @@ Common.Object = class { |
} |
/** |
- * @template T |
* @override |
- * @param {!T} event |
+ * @param {!Common.Emittable} event |
*/ |
emit(event) { |
var eventType = event.constructor; |
@@ -143,6 +146,17 @@ Common.Object = class { |
}; |
/** |
+ * @interface |
+ */ |
+Common.Emittable = function() {}; |
+ |
+/** |
+ * @typedef {!{thisObject: (!Object|undefined), listener: function(!Common.Emittable)}} |
+ */ |
+Common.Object._listenerCallbackTuple; |
+ |
+/** |
+ * @implements {Common.Emittable} |
* @unrestricted |
*/ |
Common.Event = class { |
@@ -160,15 +174,72 @@ Common.Event = class { |
Common.EventTarget = function() {}; |
/** |
- * @param {!Array<!Common.EventTarget.EventDescriptor|!Common.EventTarget.TypedEventDescriptor>} eventList |
+ * @record |
+ * @template T |
+ */ |
+Common.EventTarget.EventDescriptorStruct = class { |
+ constructor() { |
+ /** @type {!Common.EventTarget} */ |
+ this.eventTarget; |
+ /** @type {!T} */ |
+ this.eventType; |
+ /** @type {(!Object|undefined)} */ |
+ this.receiver; |
+ /** @type {function(!Common.Emittable)} */ |
+ this.method; |
+ } |
+}; |
+ |
+/** |
+ * @implements {Common.EventTarget.EventDescriptorStruct<symbol>} |
+ * @unrestricted |
+ */ |
+Common.EventTarget.EventDescriptor = class { |
+ /** |
+ * @param {!Common.EventTarget} eventTarget |
+ * @param {symbol} eventType |
+ * @param {(!Object|undefined)} receiver |
+ * @param {function(!Common.Event)} method |
+ */ |
+ constructor(eventTarget, eventType, receiver, method) { |
+ this.eventTarget = eventTarget; |
+ this.eventType = eventType; |
+ this.receiver = receiver; |
+ this.method = method; |
+ } |
+}; |
+ |
+/** |
+ * @implements {Common.EventTarget.EventDescriptorStruct<function(new:Common.Emittable)>} |
+ * @unrestricted |
+ */ |
+Common.EventTarget.TypedEventDescriptor = class { |
+ /** |
+ * @param {!Common.EventTarget} eventTarget |
+ * @param {function(new:Common.Emittable, ...)} eventType |
+ * @param {(!Object|undefined)} receiver |
+ * @param {function(!Common.Emittable)} method |
+ */ |
+ constructor(eventTarget, eventType, receiver, method) { |
+ this.eventTarget = eventTarget; |
+ this.eventType = eventType; |
+ this.receiver = receiver; |
+ this.method = method; |
+ } |
+}; |
+ |
+/** |
+ * @param {!Array<!Common.EventTarget.EventDescriptorStruct>} eventList |
*/ |
Common.EventTarget.removeEventListeners = function(eventList) { |
for (var i = 0; i < eventList.length; ++i) { |
- var eventInfo = eventList[i]; |
- if (eventInfo instanceof Common.EventTarget.EventDescriptor) |
+ if (eventList[i] instanceof Common.EventTarget.EventDescriptor) { |
+ var eventInfo = /** @type {!Common.EventTarget.EventDescriptor} */ (eventList[i]); |
eventInfo.eventTarget.removeEventListener(eventInfo.eventType, eventInfo.method, eventInfo.receiver); |
- else |
+ } else { |
+ var eventInfo = /** @type {!Common.EventTarget.TypedEventDescriptor} */ (eventList[i]); |
eventInfo.eventTarget.off(eventInfo.eventType, eventInfo.method, eventInfo.receiver); |
+ } |
} |
// Do not hold references on unused event descriptors. |
eventList.splice(0, eventList.length); |
@@ -203,62 +274,23 @@ Common.EventTarget.prototype = { |
dispatchEventToListeners(eventType, eventData) {}, |
/** |
- * @template T |
- * @param {function(new:T, ...)} eventType |
+ * @param {function(new:Common.Emittable, ...)} eventType |
* @param {function(!T)} listener |
* @param {!Object=} thisObject |
* @return {!Common.EventTarget.TypedEventDescriptor} |
+ * @template T |
*/ |
on(eventType, listener, thisObject) {}, |
/** |
- * @template T |
- * @param {function(new:T, ...)} eventType |
- * @param {function(!T)} listener |
+ * @param {function(new:Common.Emittable, ...)} eventType |
+ * @param {function(!Common.Emittable)} listener |
* @param {!Object=} thisObject |
*/ |
off(eventType, listener, thisObject) {}, |
/** |
- * @template T |
- * @param {!T} event |
+ * @param {!Common.Emittable} event |
*/ |
emit(event) {}, |
}; |
- |
-/** |
- * @unrestricted |
- */ |
-Common.EventTarget.EventDescriptor = class { |
- /** |
- * @param {!Common.EventTarget} eventTarget |
- * @param {symbol} eventType |
- * @param {(!Object|undefined)} receiver |
- * @param {function(?):?} method |
- */ |
- constructor(eventTarget, eventType, receiver, method) { |
- this.eventTarget = eventTarget; |
- this.eventType = eventType; |
- this.receiver = receiver; |
- this.method = method; |
- } |
-}; |
- |
-/** |
- * @template T |
- * @unrestricted |
- */ |
-Common.EventTarget.TypedEventDescriptor = class { |
- /** |
- * @param {!Common.EventTarget} eventTarget |
- * @param {function(new:T, ...)} eventType |
- * @param {(!Object|undefined)} receiver |
- * @param {function(!T)} method |
- */ |
- constructor(eventTarget, eventType, receiver, method) { |
- this.eventTarget = eventTarget; |
- this.eventType = eventType; |
- this.receiver = receiver; |
- this.method = method; |
- } |
-}; |