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

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

Issue 2533483002: [DevTools] Typed events and event listeners. (Closed)
Patch Set: 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
(Empty)
1 /*
2 * Copyright (C) 2008 Apple Inc. All Rights Reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 *
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
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.
24 */
25 /**
26 * @implements {Common.EventTargetBase}
27 * @unrestricted
28 */
29 Common.ObjectBase = class {
30 constructor() {
31 this._listeners = new Map();
lushnikov 2016/11/28 19:01:43 multimap!
32 }
33
34 /**
35 * @template T
36 * @override
37 * @param {function(new:T, ...)} eventType
38 * @param {function(!T)} listener
pfeldman 2016/11/28 19:30:38 I think this exact thing did not work for me in Ru
39 * @param {!Object=} thisObject
40 * @return {!Common.EventTargetBase.EventDescriptor}
41 */
42 addEventListener(eventType, listener, thisObject) {
43 console.assert(listener);
44 if (!this._listeners.has(eventType))
45 this._listeners.set(eventType, []);
46 this._listeners.get(eventType).push({thisObject: thisObject, listener: liste ner});
47 return new Common.EventTargetBase.EventDescriptor(this, eventType, thisObjec t, listener);
48 }
49
50 /**
51 * @template T
52 * @override
53 * @param {function(new:T, ...)} eventType
54 * @param {function(!T)} listener
55 * @param {!Object=} thisObject
56 */
57 removeEventListener(eventType, listener, thisObject) {
58 console.assert(listener);
59 if (!this._listeners.has(eventType))
60 return;
61 var listeners = this._listeners.get(eventType);
62 for (var i = 0; i < listeners.length; ++i) {
63 if (listeners[i].listener === listener && listeners[i].thisObject === this Object)
64 listeners.splice(i--, 1);
65 }
66 if (!listeners.length)
67 this._listeners.delete(eventType);
68 }
69
70 /**
71 * @override
72 */
73 removeAllListeners() {
74 this._listeners.clear();
75 }
76
77 /**
78 * @template T
79 * @override
80 * @param {function(new:T, ...)} eventType
81 * @return {boolean}
82 */
83 hasEventListeners(eventType) {
84 return this._listeners.has(eventType);
85 }
86
87 /**
88 * @template T
89 * @override
90 * @param {T} event
91 */
92 dispatchEventToListeners(event) {
93 var eventType = event.constructor;
94 if (!this._listeners.has(eventType))
95 return;
96 var listeners = this._listeners.get(eventType).slice(0);
97 for (var i = 0; i < listeners.length; ++i)
98 listeners[i].listener.call(listeners[i].thisObject, event);
99 }
100 };
101
102 /**
103 * @interface
104 */
105 Common.EventTargetBase = function() {};
106
107 /**
108 * @param {!Array<!Common.EventTargetBase.EventDescriptor>} eventList
109 */
110 Common.EventTargetBase.removeEventListeners = function(eventList) {
111 for (var i = 0; i < eventList.length; ++i) {
112 var eventInfo = eventList[i];
113 eventInfo.eventTarget.removeEventListener(eventInfo.eventType, eventInfo.lis tener, eventInfo.receiver);
114 }
115 // Do not hold references on unused event descriptors.
116 eventList.splice(0, eventList.length);
117 };
118
119 Common.EventTargetBase.prototype = {
120 /**
121 * @template T
122 * @param {function(new:T, ...)} eventType
123 * @param {function(!T)} listener
124 * @param {!Object=} thisObject
125 * @return {!Common.EventTargetBase.EventDescriptor}
126 */
127 addEventListener(eventType, listener, thisObject) {},
128
129 /**
130 * @template T
131 * @param {function(new:T, ...)} eventType
132 * @param {function(!T)} listener
133 * @param {!Object=} thisObject
134 */
135 removeEventListener(eventType, listener, thisObject) {},
136
137 removeAllListeners() {},
138
139 /**
140 * @template T
141 * @param {function(new:T, ...)} eventType
142 * @return {boolean}
143 */
144 hasEventListeners(eventType) {},
145
146 /**
147 * @template T
148 * @param {T} event
149 */
150 dispatchEventToListeners(event) {},
151 };
152
153 /**
154 * @template T
155 * @unrestricted
156 */
157 Common.EventTargetBase.EventDescriptor = class {
158 /**
159 * @param {!Common.EventTargetBase} eventTarget
160 * @param {function(new:T, ...)} eventType
161 * @param {(!Object|undefined)} receiver
162 * @param {function(!T)} listener
163 */
164 constructor(eventTarget, eventType, receiver, listener) {
165 this.eventTarget = eventTarget;
166 this.eventType = eventType;
167 this.receiver = receiver;
168 this.listener = listener;
169 }
170 };
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698