Chromium Code Reviews| 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; |
| - } |
| -}; |