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 |