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 |
11 * documentation and/or other materials provided with the distribution. | 11 * documentation and/or other materials provided with the distribution. |
12 * | 12 * |
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY | 13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY |
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | 14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | 15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR | 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR |
17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, | 17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, | 18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR | 19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY | 20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY |
21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
24 */ | 24 */ |
| 25 /** |
| 26 * @implements {WebInspector.EventTarget} |
| 27 * @unrestricted |
| 28 */ |
| 29 WebInspector.Object = class { |
| 30 /** |
| 31 * @override |
| 32 * @param {string|symbol} eventType |
| 33 * @param {function(!WebInspector.Event)} listener |
| 34 * @param {!Object=} thisObject |
| 35 * @return {!WebInspector.EventTarget.EventDescriptor} |
| 36 */ |
| 37 addEventListener(eventType, listener, thisObject) { |
| 38 if (!listener) |
| 39 console.assert(false); |
25 | 40 |
26 /** | 41 if (!this._listeners) |
27 * @constructor | 42 this._listeners = new Map(); |
28 * @implements {WebInspector.EventTarget} | 43 if (!this._listeners.has(eventType)) |
29 */ | 44 this._listeners.set(eventType, []); |
30 WebInspector.Object = function() { | 45 this._listeners.get(eventType).push({thisObject: thisObject, listener: liste
ner}); |
31 }; | 46 return new WebInspector.EventTarget.EventDescriptor(this, eventType, thisObj
ect, listener); |
| 47 } |
32 | 48 |
33 WebInspector.Object.prototype = { | 49 /** |
34 /** | 50 * @override |
35 * @override | 51 * @param {string|symbol} eventType |
36 * @param {string|symbol} eventType | 52 * @param {function(!WebInspector.Event)} listener |
37 * @param {function(!WebInspector.Event)} listener | 53 * @param {!Object=} thisObject |
38 * @param {!Object=} thisObject | 54 */ |
39 * @return {!WebInspector.EventTarget.EventDescriptor} | 55 removeEventListener(eventType, listener, thisObject) { |
40 */ | 56 console.assert(listener); |
41 addEventListener: function(eventType, listener, thisObject) | |
42 { | |
43 if (!listener) | |
44 console.assert(false); | |
45 | 57 |
46 if (!this._listeners) | 58 if (!this._listeners || !this._listeners.has(eventType)) |
47 this._listeners = new Map(); | 59 return; |
48 if (!this._listeners.has(eventType)) | 60 var listeners = this._listeners.get(eventType); |
49 this._listeners.set(eventType, []); | 61 for (var i = 0; i < listeners.length; ++i) { |
50 this._listeners.get(eventType).push({ thisObject: thisObject, listener:
listener }); | 62 if (listeners[i].listener === listener && listeners[i].thisObject === this
Object) |
51 return new WebInspector.EventTarget.EventDescriptor(this, eventType, thi
sObject, listener); | 63 listeners.splice(i--, 1); |
52 }, | 64 } |
53 | 65 |
54 /** | 66 if (!listeners.length) |
55 * @override | 67 this._listeners.delete(eventType); |
56 * @param {string|symbol} eventType | 68 } |
57 * @param {function(!WebInspector.Event)} listener | |
58 * @param {!Object=} thisObject | |
59 */ | |
60 removeEventListener: function(eventType, listener, thisObject) | |
61 { | |
62 console.assert(listener); | |
63 | 69 |
64 if (!this._listeners || !this._listeners.has(eventType)) | 70 /** |
65 return; | 71 * @override |
66 var listeners = this._listeners.get(eventType); | 72 */ |
67 for (var i = 0; i < listeners.length; ++i) { | 73 removeAllListeners() { |
68 if (listeners[i].listener === listener && listeners[i].thisObject ==
= thisObject) | 74 delete this._listeners; |
69 listeners.splice(i--, 1); | 75 } |
70 } | |
71 | 76 |
72 if (!listeners.length) | 77 /** |
73 this._listeners.delete(eventType); | 78 * @override |
74 }, | 79 * @param {string|symbol} eventType |
| 80 * @return {boolean} |
| 81 */ |
| 82 hasEventListeners(eventType) { |
| 83 return this._listeners && this._listeners.has(eventType); |
| 84 } |
75 | 85 |
76 /** | 86 /** |
77 * @override | 87 * @override |
78 */ | 88 * @param {string|symbol} eventType |
79 removeAllListeners: function() | 89 * @param {*=} eventData |
80 { | 90 * @return {boolean} |
81 delete this._listeners; | 91 */ |
82 }, | 92 dispatchEventToListeners(eventType, eventData) { |
| 93 if (!this._listeners || !this._listeners.has(eventType)) |
| 94 return false; |
83 | 95 |
84 /** | 96 var event = new WebInspector.Event(this, eventType, eventData); |
85 * @override | 97 var listeners = this._listeners.get(eventType).slice(0); |
86 * @param {string|symbol} eventType | 98 for (var i = 0; i < listeners.length; ++i) { |
87 * @return {boolean} | 99 listeners[i].listener.call(listeners[i].thisObject, event); |
88 */ | 100 if (event._stoppedPropagation) |
89 hasEventListeners: function(eventType) | 101 break; |
90 { | 102 } |
91 return this._listeners && this._listeners.has(eventType); | |
92 }, | |
93 | 103 |
94 /** | 104 return event.defaultPrevented; |
95 * @override | 105 } |
96 * @param {string|symbol} eventType | |
97 * @param {*=} eventData | |
98 * @return {boolean} | |
99 */ | |
100 dispatchEventToListeners: function(eventType, eventData) | |
101 { | |
102 if (!this._listeners || !this._listeners.has(eventType)) | |
103 return false; | |
104 | |
105 var event = new WebInspector.Event(this, eventType, eventData); | |
106 var listeners = this._listeners.get(eventType).slice(0); | |
107 for (var i = 0; i < listeners.length; ++i) { | |
108 listeners[i].listener.call(listeners[i].thisObject, event); | |
109 if (event._stoppedPropagation) | |
110 break; | |
111 } | |
112 | |
113 return event.defaultPrevented; | |
114 } | |
115 }; | 106 }; |
116 | 107 |
117 /** | 108 /** |
118 * @constructor | 109 * @unrestricted |
119 * @param {!WebInspector.EventTarget} target | |
120 * @param {string|symbol} type | |
121 * @param {*=} data | |
122 */ | 110 */ |
123 WebInspector.Event = function(target, type, data) | 111 WebInspector.Event = class { |
124 { | 112 /** |
| 113 * @param {!WebInspector.EventTarget} target |
| 114 * @param {string|symbol} type |
| 115 * @param {*=} data |
| 116 */ |
| 117 constructor(target, type, data) { |
125 this.target = target; | 118 this.target = target; |
126 this.type = type; | 119 this.type = type; |
127 this.data = data; | 120 this.data = data; |
128 this.defaultPrevented = false; | 121 this.defaultPrevented = false; |
129 this._stoppedPropagation = false; | 122 this._stoppedPropagation = false; |
130 }; | 123 } |
131 | 124 |
132 WebInspector.Event.prototype = { | 125 stopPropagation() { |
133 stopPropagation: function() | 126 this._stoppedPropagation = true; |
134 { | 127 } |
135 this._stoppedPropagation = true; | |
136 }, | |
137 | 128 |
138 preventDefault: function() | 129 preventDefault() { |
139 { | 130 this.defaultPrevented = true; |
140 this.defaultPrevented = true; | 131 } |
141 }, | |
142 | 132 |
143 /** | 133 /** |
144 * @param {boolean=} preventDefault | 134 * @param {boolean=} preventDefault |
145 */ | 135 */ |
146 consume: function(preventDefault) | 136 consume(preventDefault) { |
147 { | 137 this.stopPropagation(); |
148 this.stopPropagation(); | 138 if (preventDefault) |
149 if (preventDefault) | 139 this.preventDefault(); |
150 this.preventDefault(); | 140 } |
151 } | |
152 }; | 141 }; |
153 | 142 |
154 /** | 143 /** |
155 * @interface | 144 * @interface |
156 */ | 145 */ |
157 WebInspector.EventTarget = function() | 146 WebInspector.EventTarget = function() {}; |
158 { | |
159 }; | |
160 | 147 |
161 /** | 148 /** |
162 * @param {!Array<!WebInspector.EventTarget.EventDescriptor>} eventList | 149 * @param {!Array<!WebInspector.EventTarget.EventDescriptor>} eventList |
163 */ | 150 */ |
164 WebInspector.EventTarget.removeEventListeners = function(eventList) | 151 WebInspector.EventTarget.removeEventListeners = function(eventList) { |
165 { | 152 for (var i = 0; i < eventList.length; ++i) { |
166 for (var i = 0; i < eventList.length; ++i) { | 153 var eventInfo = eventList[i]; |
167 var eventInfo = eventList[i]; | 154 eventInfo.eventTarget.removeEventListener(eventInfo.eventType, eventInfo.met
hod, eventInfo.receiver); |
168 eventInfo.eventTarget.removeEventListener(eventInfo.eventType, eventInfo
.method, eventInfo.receiver); | 155 } |
169 } | 156 // Do not hold references on unused event descriptors. |
170 // Do not hold references on unused event descriptors. | 157 eventList.splice(0, eventList.length); |
171 eventList.splice(0, eventList.length); | |
172 }; | 158 }; |
173 | 159 |
174 WebInspector.EventTarget.prototype = { | 160 WebInspector.EventTarget.prototype = { |
175 /** | 161 /** |
176 * @param {string|symbol} eventType | 162 * @param {string|symbol} eventType |
177 * @param {function(!WebInspector.Event)} listener | 163 * @param {function(!WebInspector.Event)} listener |
178 * @param {!Object=} thisObject | 164 * @param {!Object=} thisObject |
179 * @return {!WebInspector.EventTarget.EventDescriptor} | 165 * @return {!WebInspector.EventTarget.EventDescriptor} |
180 */ | 166 */ |
181 addEventListener: function(eventType, listener, thisObject) { }, | 167 addEventListener: function(eventType, listener, thisObject) {}, |
182 | 168 |
183 /** | 169 /** |
184 * @param {string|symbol} eventType | 170 * @param {string|symbol} eventType |
185 * @param {function(!WebInspector.Event)} listener | 171 * @param {function(!WebInspector.Event)} listener |
186 * @param {!Object=} thisObject | 172 * @param {!Object=} thisObject |
187 */ | 173 */ |
188 removeEventListener: function(eventType, listener, thisObject) { }, | 174 removeEventListener: function(eventType, listener, thisObject) {}, |
189 | 175 |
190 removeAllListeners: function() { }, | 176 removeAllListeners: function() {}, |
191 | 177 |
192 /** | 178 /** |
193 * @param {string|symbol} eventType | 179 * @param {string|symbol} eventType |
194 * @return {boolean} | 180 * @return {boolean} |
195 */ | 181 */ |
196 hasEventListeners: function(eventType) { }, | 182 hasEventListeners: function(eventType) {}, |
197 | 183 |
198 /** | 184 /** |
199 * @param {string|symbol} eventType | 185 * @param {string|symbol} eventType |
200 * @param {*=} eventData | 186 * @param {*=} eventData |
201 * @return {boolean} | 187 * @return {boolean} |
202 */ | 188 */ |
203 dispatchEventToListeners: function(eventType, eventData) { }, | 189 dispatchEventToListeners: function(eventType, eventData) {}, |
204 }; | 190 }; |
205 | 191 |
206 /** | 192 /** |
207 * @constructor | 193 * @unrestricted |
208 * @param {!WebInspector.EventTarget} eventTarget | |
209 * @param {string|symbol} eventType | |
210 * @param {(!Object|undefined)} receiver | |
211 * @param {function(?):?} method | |
212 */ | 194 */ |
213 WebInspector.EventTarget.EventDescriptor = function(eventTarget, eventType, rece
iver, method) | 195 WebInspector.EventTarget.EventDescriptor = class { |
214 { | 196 /** |
| 197 * @param {!WebInspector.EventTarget} eventTarget |
| 198 * @param {string|symbol} eventType |
| 199 * @param {(!Object|undefined)} receiver |
| 200 * @param {function(?):?} method |
| 201 */ |
| 202 constructor(eventTarget, eventType, receiver, method) { |
215 this.eventTarget = eventTarget; | 203 this.eventTarget = eventTarget; |
216 this.eventType = eventType; | 204 this.eventType = eventType; |
217 this.receiver = receiver; | 205 this.receiver = receiver; |
218 this.method = method; | 206 this.method = method; |
| 207 } |
219 }; | 208 }; |
OLD | NEW |