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

Unified 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, 1 month 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 side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/devtools/front_end/common/ObjectBase.js
diff --git a/third_party/WebKit/Source/devtools/front_end/common/ObjectBase.js b/third_party/WebKit/Source/devtools/front_end/common/ObjectBase.js
new file mode 100644
index 0000000000000000000000000000000000000000..e5dfc4bca2857123bb57a0d0c4fba9fbe763aa62
--- /dev/null
+++ b/third_party/WebKit/Source/devtools/front_end/common/ObjectBase.js
@@ -0,0 +1,170 @@
+/*
+ * Copyright (C) 2008 Apple Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+/**
+ * @implements {Common.EventTargetBase}
+ * @unrestricted
+ */
+Common.ObjectBase = class {
+ constructor() {
+ this._listeners = new Map();
lushnikov 2016/11/28 19:01:43 multimap!
+ }
+
+ /**
+ * @template T
+ * @override
+ * @param {function(new:T, ...)} eventType
+ * @param {function(!T)} listener
pfeldman 2016/11/28 19:30:38 I think this exact thing did not work for me in Ru
+ * @param {!Object=} thisObject
+ * @return {!Common.EventTargetBase.EventDescriptor}
+ */
+ addEventListener(eventType, listener, thisObject) {
+ console.assert(listener);
+ if (!this._listeners.has(eventType))
+ this._listeners.set(eventType, []);
+ this._listeners.get(eventType).push({thisObject: thisObject, listener: listener});
+ return new Common.EventTargetBase.EventDescriptor(this, eventType, thisObject, listener);
+ }
+
+ /**
+ * @template T
+ * @override
+ * @param {function(new:T, ...)} eventType
+ * @param {function(!T)} listener
+ * @param {!Object=} thisObject
+ */
+ removeEventListener(eventType, listener, thisObject) {
+ console.assert(listener);
+ if (!this._listeners.has(eventType))
+ return;
+ var listeners = this._listeners.get(eventType);
+ for (var i = 0; i < listeners.length; ++i) {
+ if (listeners[i].listener === listener && listeners[i].thisObject === thisObject)
+ listeners.splice(i--, 1);
+ }
+ if (!listeners.length)
+ this._listeners.delete(eventType);
+ }
+
+ /**
+ * @override
+ */
+ removeAllListeners() {
+ this._listeners.clear();
+ }
+
+ /**
+ * @template T
+ * @override
+ * @param {function(new:T, ...)} eventType
+ * @return {boolean}
+ */
+ hasEventListeners(eventType) {
+ return this._listeners.has(eventType);
+ }
+
+ /**
+ * @template T
+ * @override
+ * @param {T} event
+ */
+ dispatchEventToListeners(event) {
+ var eventType = event.constructor;
+ if (!this._listeners.has(eventType))
+ return;
+ var listeners = this._listeners.get(eventType).slice(0);
+ for (var i = 0; i < listeners.length; ++i)
+ listeners[i].listener.call(listeners[i].thisObject, event);
+ }
+};
+
+/**
+ * @interface
+ */
+Common.EventTargetBase = function() {};
+
+/**
+ * @param {!Array<!Common.EventTargetBase.EventDescriptor>} eventList
+ */
+Common.EventTargetBase.removeEventListeners = function(eventList) {
+ for (var i = 0; i < eventList.length; ++i) {
+ var eventInfo = eventList[i];
+ eventInfo.eventTarget.removeEventListener(eventInfo.eventType, eventInfo.listener, eventInfo.receiver);
+ }
+ // Do not hold references on unused event descriptors.
+ eventList.splice(0, eventList.length);
+};
+
+Common.EventTargetBase.prototype = {
+ /**
+ * @template T
+ * @param {function(new:T, ...)} eventType
+ * @param {function(!T)} listener
+ * @param {!Object=} thisObject
+ * @return {!Common.EventTargetBase.EventDescriptor}
+ */
+ addEventListener(eventType, listener, thisObject) {},
+
+ /**
+ * @template T
+ * @param {function(new:T, ...)} eventType
+ * @param {function(!T)} listener
+ * @param {!Object=} thisObject
+ */
+ removeEventListener(eventType, listener, thisObject) {},
+
+ removeAllListeners() {},
+
+ /**
+ * @template T
+ * @param {function(new:T, ...)} eventType
+ * @return {boolean}
+ */
+ hasEventListeners(eventType) {},
+
+ /**
+ * @template T
+ * @param {T} event
+ */
+ dispatchEventToListeners(event) {},
+};
+
+/**
+ * @template T
+ * @unrestricted
+ */
+Common.EventTargetBase.EventDescriptor = class {
+ /**
+ * @param {!Common.EventTargetBase} eventTarget
+ * @param {function(new:T, ...)} eventType
+ * @param {(!Object|undefined)} receiver
+ * @param {function(!T)} listener
+ */
+ constructor(eventTarget, eventType, receiver, listener) {
+ this.eventTarget = eventTarget;
+ this.eventType = eventType;
+ this.receiver = receiver;
+ this.listener = listener;
+ }
+};

Powered by Google App Engine
This is Rietveld 408576698