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..ed576c4e50204da6bb19cfc193a458e88f0e682d 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, !Array<!Common.Object._listenerCallbackTuple>>|undefined)} */ |
+ this._listeners; |
+ } |
/** |
* @override |
* @param {symbol} eventType |
@@ -39,9 +43,10 @@ Common.Object = class { |
console.assert(false); |
if (!this._listeners) |
- this._listeners = new Map(); |
+ this._listeners = /** @type {!Map<symbol, !Array<!Common.Object._listenerCallbackTuple>>} */ (new Map()); |
dgozman
2017/01/04 18:07:53
I'm surprised you have to cast here.
allada
2017/01/04 21:47:25
There are no side affects, but closure silently do
|
+ |
if (!this._listeners.has(eventType)) |
- this._listeners.set(eventType, []); |
+ this._listeners.set(eventType, /** @type {!Array<!Common.Object._listenerCallbackTuple>} */ ([])); |
this._listeners.get(eventType).push({thisObject: thisObject, listener: listener}); |
return new Common.EventTarget.EventDescriptor(this, eventType, thisObject, 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,16 +97,16 @@ Common.Object = class { |
} |
/** |
- * @template T |
* @override |
* @param {function(new:T, ...)} eventType |
* @param {function(!T)} listener |
* @param {!Object=} thisObject |
* @return {!Common.EventTarget.TypedEventDescriptor} |
+ * @template T |
*/ |
on(eventType, listener, thisObject) { |
if (!this._listeners) |
dgozman
2017/01/04 18:07:53
Let's add a line here
var emitableListener = /** @
allada
2017/01/04 21:47:25
Done.
|
- this._listeners = new Map(); |
+ this._listeners = /** @type {!Map<symbol, !Array<!Common.Object._listenerCallbackTuple>>} */ (new Map()); |
if (!this._listeners.has(eventType)) |
this._listeners.set(eventType, []); |
this._listeners.get(eventType).push({thisObject: thisObject, listener: listener}); |
@@ -109,11 +114,11 @@ Common.Object = class { |
} |
/** |
- * @template T |
* @override |
* @param {function(new:T, ...)} eventType |
* @param {function(!T)} listener |
* @param {!Object=} thisObject |
+ * @template T |
*/ |
off(eventType, listener, thisObject) { |
dgozman
2017/01/04 18:07:53
ditto
allada
2017/01/04 21:47:25
Done.
|
if (!this._listeners || !this._listeners.has(eventType)) |
@@ -128,9 +133,8 @@ Common.Object = class { |
} |
/** |
- * @template T |
* @override |
- * @param {!T} event |
+ * @param {!Common.Emitable} event |
*/ |
emit(event) { |
var eventType = event.constructor; |
@@ -143,6 +147,17 @@ Common.Object = class { |
}; |
/** |
+ * @interface |
+ */ |
+Common.Emitable = function() {}; |
+ |
+/** |
+ * @typedef {!{thisObject: (!Object|undefined), listener: function(!Common.Emitable)}} |
+ */ |
+Common.Object._listenerCallbackTuple; |
+ |
+/** |
+ * @implements {Common.Emitable} |
* @unrestricted |
*/ |
Common.Event = class { |
@@ -160,15 +175,49 @@ Common.Event = class { |
Common.EventTarget = function() {}; |
/** |
- * @param {!Array<!Common.EventTarget.EventDescriptor|!Common.EventTarget.TypedEventDescriptor>} eventList |
+ * @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; |
+ } |
+}; |
+ |
+/** |
+ * @param {!Array<!Common.EventTarget.EventDescriptor>} eventList |
*/ |
Common.EventTarget.removeEventListeners = function(eventList) { |
for (var i = 0; i < eventList.length; ++i) { |
var eventInfo = eventList[i]; |
- if (eventInfo instanceof Common.EventTarget.EventDescriptor) |
- eventInfo.eventTarget.removeEventListener(eventInfo.eventType, eventInfo.method, eventInfo.receiver); |
- else |
- eventInfo.eventTarget.off(eventInfo.eventType, eventInfo.method, eventInfo.receiver); |
dgozman
2017/01/04 18:07:53
Removing this is incorrect.
|
+ eventInfo.eventTarget.removeEventListener(eventInfo.eventType, eventInfo.method, eventInfo.receiver); |
} |
// Do not hold references on unused event descriptors. |
eventList.splice(0, eventList.length); |
@@ -203,62 +252,24 @@ Common.EventTarget.prototype = { |
dispatchEventToListeners(eventType, eventData) {}, |
/** |
- * @template T |
* @param {function(new:T, ...)} 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 {!Object=} thisObject |
+ * @template T |
*/ |
off(eventType, listener, thisObject) {}, |
/** |
- * @template T |
- * @param {!T} event |
+ * @param {!Common.Emitable} 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; |
- } |
-}; |