Index: third_party/google_input_tools/third_party/closure_library/closure/goog/events/listenable.js |
diff --git a/third_party/google_input_tools/third_party/closure_library/closure/goog/events/listenable.js b/third_party/google_input_tools/third_party/closure_library/closure/goog/events/listenable.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..6483f26883aba65db57e78bbf643b8e320101f9e |
--- /dev/null |
+++ b/third_party/google_input_tools/third_party/closure_library/closure/goog/events/listenable.js |
@@ -0,0 +1,334 @@ |
+// Copyright 2012 The Closure Library Authors. All Rights Reserved. |
+// |
+// Licensed under the Apache License, Version 2.0 (the "License"); |
+// you may not use this file except in compliance with the License. |
+// You may obtain a copy of the License at |
+// |
+// http://www.apache.org/licenses/LICENSE-2.0 |
+// |
+// Unless required by applicable law or agreed to in writing, software |
+// distributed under the License is distributed on an "AS-IS" BASIS, |
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
+// See the License for the specific language governing permissions and |
+// limitations under the License. |
+ |
+/** |
+ * @fileoverview An interface for a listenable JavaScript object. |
+ */ |
+ |
+goog.provide('goog.events.Listenable'); |
+goog.provide('goog.events.ListenableKey'); |
+ |
+/** @suppress {extraRequire} */ |
+goog.require('goog.events.EventId'); |
+ |
+ |
+ |
+/** |
+ * A listenable interface. A listenable is an object with the ability |
+ * to dispatch/broadcast events to "event listeners" registered via |
+ * listen/listenOnce. |
+ * |
+ * The interface allows for an event propagation mechanism similar |
+ * to one offered by native browser event targets, such as |
+ * capture/bubble mechanism, stopping propagation, and preventing |
+ * default actions. Capture/bubble mechanism depends on the ancestor |
+ * tree constructed via {@code #getParentEventTarget}; this tree |
+ * must be directed acyclic graph. The meaning of default action(s) |
+ * in preventDefault is specific to a particular use case. |
+ * |
+ * Implementations that do not support capture/bubble or can not have |
+ * a parent listenable can simply not implement any ability to set the |
+ * parent listenable (and have {@code #getParentEventTarget} return |
+ * null). |
+ * |
+ * Implementation of this class can be used with or independently from |
+ * goog.events. |
+ * |
+ * Implementation must call {@code #addImplementation(implClass)}. |
+ * |
+ * @interface |
+ * @see goog.events |
+ * @see http://www.w3.org/TR/DOM-Level-2-Events/events.html |
+ */ |
+goog.events.Listenable = function() {}; |
+ |
+ |
+/** |
+ * An expando property to indicate that an object implements |
+ * goog.events.Listenable. |
+ * |
+ * See addImplementation/isImplementedBy. |
+ * |
+ * @type {string} |
+ * @const |
+ */ |
+goog.events.Listenable.IMPLEMENTED_BY_PROP = |
+ 'closure_listenable_' + ((Math.random() * 1e6) | 0); |
+ |
+ |
+/** |
+ * Marks a given class (constructor) as an implementation of |
+ * Listenable, do that we can query that fact at runtime. The class |
+ * must have already implemented the interface. |
+ * @param {!Function} cls The class constructor. The corresponding |
+ * class must have already implemented the interface. |
+ */ |
+goog.events.Listenable.addImplementation = function(cls) { |
+ cls.prototype[goog.events.Listenable.IMPLEMENTED_BY_PROP] = true; |
+}; |
+ |
+ |
+/** |
+ * @param {Object} obj The object to check. |
+ * @return {boolean} Whether a given instance implements Listenable. The |
+ * class/superclass of the instance must call addImplementation. |
+ */ |
+goog.events.Listenable.isImplementedBy = function(obj) { |
+ return !!(obj && obj[goog.events.Listenable.IMPLEMENTED_BY_PROP]); |
+}; |
+ |
+ |
+/** |
+ * Adds an event listener. A listener can only be added once to an |
+ * object and if it is added again the key for the listener is |
+ * returned. Note that if the existing listener is a one-off listener |
+ * (registered via listenOnce), it will no longer be a one-off |
+ * listener after a call to listen(). |
+ * |
+ * @param {string|!goog.events.EventId.<EVENTOBJ>} type The event type id. |
+ * @param {function(this:SCOPE, EVENTOBJ):(boolean|undefined)} listener Callback |
+ * method. |
+ * @param {boolean=} opt_useCapture Whether to fire in capture phase |
+ * (defaults to false). |
+ * @param {SCOPE=} opt_listenerScope Object in whose scope to call the |
+ * listener. |
+ * @return {goog.events.ListenableKey} Unique key for the listener. |
+ * @template SCOPE,EVENTOBJ |
+ */ |
+goog.events.Listenable.prototype.listen; |
+ |
+ |
+/** |
+ * Adds an event listener that is removed automatically after the |
+ * listener fired once. |
+ * |
+ * If an existing listener already exists, listenOnce will do |
+ * nothing. In particular, if the listener was previously registered |
+ * via listen(), listenOnce() will not turn the listener into a |
+ * one-off listener. Similarly, if there is already an existing |
+ * one-off listener, listenOnce does not modify the listeners (it is |
+ * still a once listener). |
+ * |
+ * @param {string|!goog.events.EventId.<EVENTOBJ>} type The event type id. |
+ * @param {function(this:SCOPE, EVENTOBJ):(boolean|undefined)} listener Callback |
+ * method. |
+ * @param {boolean=} opt_useCapture Whether to fire in capture phase |
+ * (defaults to false). |
+ * @param {SCOPE=} opt_listenerScope Object in whose scope to call the |
+ * listener. |
+ * @return {goog.events.ListenableKey} Unique key for the listener. |
+ * @template SCOPE,EVENTOBJ |
+ */ |
+goog.events.Listenable.prototype.listenOnce; |
+ |
+ |
+/** |
+ * Removes an event listener which was added with listen() or listenOnce(). |
+ * |
+ * @param {string|!goog.events.EventId.<EVENTOBJ>} type The event type id. |
+ * @param {function(this:SCOPE, EVENTOBJ):(boolean|undefined)} listener Callback |
+ * method. |
+ * @param {boolean=} opt_useCapture Whether to fire in capture phase |
+ * (defaults to false). |
+ * @param {SCOPE=} opt_listenerScope Object in whose scope to call |
+ * the listener. |
+ * @return {boolean} Whether any listener was removed. |
+ * @template SCOPE,EVENTOBJ |
+ */ |
+goog.events.Listenable.prototype.unlisten; |
+ |
+ |
+/** |
+ * Removes an event listener which was added with listen() by the key |
+ * returned by listen(). |
+ * |
+ * @param {goog.events.ListenableKey} key The key returned by |
+ * listen() or listenOnce(). |
+ * @return {boolean} Whether any listener was removed. |
+ */ |
+goog.events.Listenable.prototype.unlistenByKey; |
+ |
+ |
+/** |
+ * Dispatches an event (or event like object) and calls all listeners |
+ * listening for events of this type. The type of the event is decided by the |
+ * type property on the event object. |
+ * |
+ * If any of the listeners returns false OR calls preventDefault then this |
+ * function will return false. If one of the capture listeners calls |
+ * stopPropagation, then the bubble listeners won't fire. |
+ * |
+ * @param {goog.events.EventLike} e Event object. |
+ * @return {boolean} If anyone called preventDefault on the event object (or |
+ * if any of the listeners returns false) this will also return false. |
+ */ |
+goog.events.Listenable.prototype.dispatchEvent; |
+ |
+ |
+/** |
+ * Removes all listeners from this listenable. If type is specified, |
+ * it will only remove listeners of the particular type. otherwise all |
+ * registered listeners will be removed. |
+ * |
+ * @param {string=} opt_type Type of event to remove, default is to |
+ * remove all types. |
+ * @return {number} Number of listeners removed. |
+ */ |
+goog.events.Listenable.prototype.removeAllListeners; |
+ |
+ |
+/** |
+ * Returns the parent of this event target to use for capture/bubble |
+ * mechanism. |
+ * |
+ * NOTE(user): The name reflects the original implementation of |
+ * custom event target ({@code goog.events.EventTarget}). We decided |
+ * that changing the name is not worth it. |
+ * |
+ * @return {goog.events.Listenable} The parent EventTarget or null if |
+ * there is no parent. |
+ */ |
+goog.events.Listenable.prototype.getParentEventTarget; |
+ |
+ |
+/** |
+ * Fires all registered listeners in this listenable for the given |
+ * type and capture mode, passing them the given eventObject. This |
+ * does not perform actual capture/bubble. Only implementors of the |
+ * interface should be using this. |
+ * |
+ * @param {string|!goog.events.EventId.<EVENTOBJ>} type The type of the |
+ * listeners to fire. |
+ * @param {boolean} capture The capture mode of the listeners to fire. |
+ * @param {EVENTOBJ} eventObject The event object to fire. |
+ * @return {boolean} Whether all listeners succeeded without |
+ * attempting to prevent default behavior. If any listener returns |
+ * false or called goog.events.Event#preventDefault, this returns |
+ * false. |
+ * @template EVENTOBJ |
+ */ |
+goog.events.Listenable.prototype.fireListeners; |
+ |
+ |
+/** |
+ * Gets all listeners in this listenable for the given type and |
+ * capture mode. |
+ * |
+ * @param {string|!goog.events.EventId} type The type of the listeners to fire. |
+ * @param {boolean} capture The capture mode of the listeners to fire. |
+ * @return {!Array.<goog.events.ListenableKey>} An array of registered |
+ * listeners. |
+ * @template EVENTOBJ |
+ */ |
+goog.events.Listenable.prototype.getListeners; |
+ |
+ |
+/** |
+ * Gets the goog.events.ListenableKey for the event or null if no such |
+ * listener is in use. |
+ * |
+ * @param {string|!goog.events.EventId.<EVENTOBJ>} type The name of the event |
+ * without the 'on' prefix. |
+ * @param {function(this:SCOPE, EVENTOBJ):(boolean|undefined)} listener The |
+ * listener function to get. |
+ * @param {boolean} capture Whether the listener is a capturing listener. |
+ * @param {SCOPE=} opt_listenerScope Object in whose scope to call the |
+ * listener. |
+ * @return {goog.events.ListenableKey} the found listener or null if not found. |
+ * @template SCOPE,EVENTOBJ |
+ */ |
+goog.events.Listenable.prototype.getListener; |
+ |
+ |
+/** |
+ * Whether there is any active listeners matching the specified |
+ * signature. If either the type or capture parameters are |
+ * unspecified, the function will match on the remaining criteria. |
+ * |
+ * @param {string|!goog.events.EventId.<EVENTOBJ>=} opt_type Event type. |
+ * @param {boolean=} opt_capture Whether to check for capture or bubble |
+ * listeners. |
+ * @return {boolean} Whether there is any active listeners matching |
+ * the requested type and/or capture phase. |
+ * @template EVENTOBJ |
+ */ |
+goog.events.Listenable.prototype.hasListener; |
+ |
+ |
+ |
+/** |
+ * An interface that describes a single registered listener. |
+ * @interface |
+ */ |
+goog.events.ListenableKey = function() {}; |
+ |
+ |
+/** |
+ * Counter used to create a unique key |
+ * @type {number} |
+ * @private |
+ */ |
+goog.events.ListenableKey.counter_ = 0; |
+ |
+ |
+/** |
+ * Reserves a key to be used for ListenableKey#key field. |
+ * @return {number} A number to be used to fill ListenableKey#key |
+ * field. |
+ */ |
+goog.events.ListenableKey.reserveKey = function() { |
+ return ++goog.events.ListenableKey.counter_; |
+}; |
+ |
+ |
+/** |
+ * The source event target. |
+ * @type {!(Object|goog.events.Listenable|goog.events.EventTarget)} |
+ */ |
+goog.events.ListenableKey.prototype.src; |
+ |
+ |
+/** |
+ * The event type the listener is listening to. |
+ * @type {string} |
+ */ |
+goog.events.ListenableKey.prototype.type; |
+ |
+ |
+/** |
+ * The listener function. |
+ * @type {function(?):?|{handleEvent:function(?):?}|null} |
+ */ |
+goog.events.ListenableKey.prototype.listener; |
+ |
+ |
+/** |
+ * Whether the listener works on capture phase. |
+ * @type {boolean} |
+ */ |
+goog.events.ListenableKey.prototype.capture; |
+ |
+ |
+/** |
+ * The 'this' object for the listener function's scope. |
+ * @type {Object} |
+ */ |
+goog.events.ListenableKey.prototype.handler; |
+ |
+ |
+/** |
+ * A globally unique number to identify the key. |
+ * @type {number} |
+ */ |
+goog.events.ListenableKey.prototype.key; |