Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(332)

Side by Side Diff: third_party/WebKit/Source/devtools/front_end/common/Object.js

Issue 2580673002: [DevTools] Introduce typed events. (Closed)
Patch Set: [DevTools] Introduce typed events. Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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 };
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698