| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2008 Apple Inc. All Rights Reserved. | 2 * Copyright (C) 2008 Apple Inc. All Rights Reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
| 6 * are met: | 6 * are met: |
| 7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
| 8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
| 9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
| 10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 83 */ | 83 */ |
| 84 dispatchEventToListeners(eventType, eventData) { | 84 dispatchEventToListeners(eventType, eventData) { |
| 85 if (!this._listeners || !this._listeners.has(eventType)) | 85 if (!this._listeners || !this._listeners.has(eventType)) |
| 86 return; | 86 return; |
| 87 | 87 |
| 88 var event = new Common.Event(eventData); | 88 var event = new Common.Event(eventData); |
| 89 var listeners = this._listeners.get(eventType).slice(0); | 89 var listeners = this._listeners.get(eventType).slice(0); |
| 90 for (var i = 0; i < listeners.length; ++i) | 90 for (var i = 0; i < listeners.length; ++i) |
| 91 listeners[i].listener.call(listeners[i].thisObject, event); | 91 listeners[i].listener.call(listeners[i].thisObject, event); |
| 92 } | 92 } |
| 93 |
| 94 /** |
| 95 * @template T |
| 96 * @override |
| 97 * @param {function(new:T, ...)} eventType |
| 98 * @param {function(!T)} listener |
| 99 * @param {!Object=} thisObject |
| 100 * @return {!Common.EventTarget.TypedEventDescriptor} |
| 101 */ |
| 102 on(eventType, listener, thisObject) { |
| 103 if (!this._listeners) |
| 104 this._listeners = new Map(); |
| 105 if (!this._listeners.has(eventType)) |
| 106 this._listeners.set(eventType, []); |
| 107 this._listeners.get(eventType).push({thisObject: thisObject, listener: liste
ner}); |
| 108 return new Common.EventTarget.TypedEventDescriptor(this, eventType, thisObje
ct, listener); |
| 109 } |
| 110 |
| 111 /** |
| 112 * @template T |
| 113 * @override |
| 114 * @param {function(new:T, ...)} eventType |
| 115 * @param {function(!T)} listener |
| 116 * @param {!Object=} thisObject |
| 117 */ |
| 118 off(eventType, listener, thisObject) { |
| 119 if (!this._listeners || !this._listeners.has(eventType)) |
| 120 return; |
| 121 var listeners = this._listeners.get(eventType); |
| 122 for (var i = 0; i < listeners.length; ++i) { |
| 123 if (listeners[i].listener === listener && listeners[i].thisObject === this
Object) |
| 124 listeners.splice(i--, 1); |
| 125 } |
| 126 if (!listeners.length) |
| 127 this._listeners.delete(eventType); |
| 128 } |
| 129 |
| 130 /** |
| 131 * @template T |
| 132 * @override |
| 133 * @param {!T} event |
| 134 */ |
| 135 emit(event) { |
| 136 var eventType = event.constructor; |
| 137 if (!this._listeners || !this._listeners.has(eventType)) |
| 138 return; |
| 139 var listeners = this._listeners.get(eventType).slice(0); |
| 140 for (var i = 0; i < listeners.length; ++i) |
| 141 listeners[i].listener.call(listeners[i].thisObject, event); |
| 142 } |
| 93 }; | 143 }; |
| 94 | 144 |
| 95 /** | 145 /** |
| 96 * @unrestricted | 146 * @unrestricted |
| 97 */ | 147 */ |
| 98 Common.Event = class { | 148 Common.Event = class { |
| 99 /** | 149 /** |
| 100 * @param {*=} data | 150 * @param {*=} data |
| 101 */ | 151 */ |
| 102 constructor(data) { | 152 constructor(data) { |
| 103 this.data = data; | 153 this.data = data; |
| 104 } | 154 } |
| 105 }; | 155 }; |
| 106 | 156 |
| 107 /** | 157 /** |
| 108 * @interface | 158 * @interface |
| 109 */ | 159 */ |
| 110 Common.EventTarget = function() {}; | 160 Common.EventTarget = function() {}; |
| 111 | 161 |
| 112 /** | 162 /** |
| 113 * @param {!Array<!Common.EventTarget.EventDescriptor>} eventList | 163 * @param {!Array<!Common.EventTarget.EventDescriptor|!Common.EventTarget.TypedE
ventDescriptor>} eventList |
| 114 */ | 164 */ |
| 115 Common.EventTarget.removeEventListeners = function(eventList) { | 165 Common.EventTarget.removeEventListeners = function(eventList) { |
| 116 for (var i = 0; i < eventList.length; ++i) { | 166 for (var i = 0; i < eventList.length; ++i) { |
| 117 var eventInfo = eventList[i]; | 167 var eventInfo = eventList[i]; |
| 118 eventInfo.eventTarget.removeEventListener(eventInfo.eventType, eventInfo.met
hod, eventInfo.receiver); | 168 if (eventInfo instanceof Common.EventTarget.EventDescriptor) |
| 169 eventInfo.eventTarget.removeEventListener(eventInfo.eventType, eventInfo.m
ethod, eventInfo.receiver); |
| 170 else |
| 171 eventInfo.eventTarget.off(eventInfo.eventType, eventInfo.method, eventInfo
.receiver); |
| 119 } | 172 } |
| 120 // Do not hold references on unused event descriptors. | 173 // Do not hold references on unused event descriptors. |
| 121 eventList.splice(0, eventList.length); | 174 eventList.splice(0, eventList.length); |
| 122 }; | 175 }; |
| 123 | 176 |
| 124 Common.EventTarget.prototype = { | 177 Common.EventTarget.prototype = { |
| 125 /** | 178 /** |
| 126 * @param {symbol} eventType | 179 * @param {symbol} eventType |
| 127 * @param {function(!Common.Event)} listener | 180 * @param {function(!Common.Event)} listener |
| 128 * @param {!Object=} thisObject | 181 * @param {!Object=} thisObject |
| (...skipping 12 matching lines...) Expand all Loading... |
| 141 * @param {symbol} eventType | 194 * @param {symbol} eventType |
| 142 * @return {boolean} | 195 * @return {boolean} |
| 143 */ | 196 */ |
| 144 hasEventListeners(eventType) {}, | 197 hasEventListeners(eventType) {}, |
| 145 | 198 |
| 146 /** | 199 /** |
| 147 * @param {symbol} eventType | 200 * @param {symbol} eventType |
| 148 * @param {*=} eventData | 201 * @param {*=} eventData |
| 149 */ | 202 */ |
| 150 dispatchEventToListeners(eventType, eventData) {}, | 203 dispatchEventToListeners(eventType, eventData) {}, |
| 204 |
| 205 /** |
| 206 * @template T |
| 207 * @param {function(new:T, ...)} eventType |
| 208 * @param {function(!T)} listener |
| 209 * @param {!Object=} thisObject |
| 210 * @return {!Common.EventTarget.TypedEventDescriptor} |
| 211 */ |
| 212 on(eventType, listener, thisObject) {}, |
| 213 |
| 214 /** |
| 215 * @template T |
| 216 * @param {function(new:T, ...)} eventType |
| 217 * @param {function(!T)} listener |
| 218 * @param {!Object=} thisObject |
| 219 */ |
| 220 off(eventType, listener, thisObject) {}, |
| 221 |
| 222 /** |
| 223 * @template T |
| 224 * @param {!T} event |
| 225 */ |
| 226 emit(event) {}, |
| 151 }; | 227 }; |
| 152 | 228 |
| 153 /** | 229 /** |
| 154 * @unrestricted | 230 * @unrestricted |
| 155 */ | 231 */ |
| 156 Common.EventTarget.EventDescriptor = class { | 232 Common.EventTarget.EventDescriptor = class { |
| 157 /** | 233 /** |
| 158 * @param {!Common.EventTarget} eventTarget | 234 * @param {!Common.EventTarget} eventTarget |
| 159 * @param {symbol} eventType | 235 * @param {symbol} eventType |
| 160 * @param {(!Object|undefined)} receiver | 236 * @param {(!Object|undefined)} receiver |
| 161 * @param {function(?):?} method | 237 * @param {function(?):?} method |
| 162 */ | 238 */ |
| 163 constructor(eventTarget, eventType, receiver, method) { | 239 constructor(eventTarget, eventType, receiver, method) { |
| 164 this.eventTarget = eventTarget; | 240 this.eventTarget = eventTarget; |
| 165 this.eventType = eventType; | 241 this.eventType = eventType; |
| 166 this.receiver = receiver; | 242 this.receiver = receiver; |
| 167 this.method = method; | 243 this.method = method; |
| 168 } | 244 } |
| 169 }; | 245 }; |
| 246 |
| 247 /** |
| 248 * @template T |
| 249 * @unrestricted |
| 250 */ |
| 251 Common.EventTarget.TypedEventDescriptor = class { |
| 252 /** |
| 253 * @param {!Common.EventTarget} eventTarget |
| 254 * @param {function(new:T, ...)} eventType |
| 255 * @param {(!Object|undefined)} receiver |
| 256 * @param {function(!T)} method |
| 257 */ |
| 258 constructor(eventTarget, eventType, receiver, method) { |
| 259 this.eventTarget = eventTarget; |
| 260 this.eventType = eventType; |
| 261 this.receiver = receiver; |
| 262 this.method = method; |
| 263 } |
| 264 }; |
| OLD | NEW |