Index: third_party/google_input_tools/third_party/closure_library/closure/goog/events/eventhandler.js |
diff --git a/third_party/google_input_tools/third_party/closure_library/closure/goog/events/eventhandler.js b/third_party/google_input_tools/third_party/closure_library/closure/goog/events/eventhandler.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..70071f9a6b9419b62c779bdb4fa2e527e287fa75 |
--- /dev/null |
+++ b/third_party/google_input_tools/third_party/closure_library/closure/goog/events/eventhandler.js |
@@ -0,0 +1,461 @@ |
+// Copyright 2005 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 Class to create objects which want to handle multiple events |
+ * and have their listeners easily cleaned up via a dispose method. |
+ * |
+ * Example: |
+ * <pre> |
+ * function Something() { |
+ * Something.base(this); |
+ * |
+ * ... set up object ... |
+ * |
+ * // Add event listeners |
+ * this.listen(this.starEl, goog.events.EventType.CLICK, this.handleStar); |
+ * this.listen(this.headerEl, goog.events.EventType.CLICK, this.expand); |
+ * this.listen(this.collapseEl, goog.events.EventType.CLICK, this.collapse); |
+ * this.listen(this.infoEl, goog.events.EventType.MOUSEOVER, this.showHover); |
+ * this.listen(this.infoEl, goog.events.EventType.MOUSEOUT, this.hideHover); |
+ * } |
+ * goog.inherits(Something, goog.events.EventHandler); |
+ * |
+ * Something.prototype.disposeInternal = function() { |
+ * Something.base(this, 'disposeInternal'); |
+ * goog.dom.removeNode(this.container); |
+ * }; |
+ * |
+ * |
+ * // Then elsewhere: |
+ * |
+ * var activeSomething = null; |
+ * function openSomething() { |
+ * activeSomething = new Something(); |
+ * } |
+ * |
+ * function closeSomething() { |
+ * if (activeSomething) { |
+ * activeSomething.dispose(); // Remove event listeners |
+ * activeSomething = null; |
+ * } |
+ * } |
+ * </pre> |
+ * |
+ */ |
+ |
+goog.provide('goog.events.EventHandler'); |
+ |
+goog.require('goog.Disposable'); |
+goog.require('goog.events'); |
+goog.require('goog.object'); |
+ |
+goog.forwardDeclare('goog.events.EventWrapper'); |
+ |
+ |
+ |
+/** |
+ * Super class for objects that want to easily manage a number of event |
+ * listeners. It allows a short cut to listen and also provides a quick way |
+ * to remove all events listeners belonging to this object. |
+ * @param {SCOPE=} opt_scope Object in whose scope to call the listeners. |
+ * @constructor |
+ * @extends {goog.Disposable} |
+ * @template SCOPE |
+ */ |
+goog.events.EventHandler = function(opt_scope) { |
+ goog.Disposable.call(this); |
+ // TODO(user): Rename this to this.scope_ and fix the classes in google3 |
+ // that access this private variable. :( |
+ this.handler_ = opt_scope; |
+ |
+ /** |
+ * Keys for events that are being listened to. |
+ * @type {!Object.<!goog.events.Key>} |
+ * @private |
+ */ |
+ this.keys_ = {}; |
+}; |
+goog.inherits(goog.events.EventHandler, goog.Disposable); |
+ |
+ |
+/** |
+ * Utility array used to unify the cases of listening for an array of types |
+ * and listening for a single event, without using recursion or allocating |
+ * an array each time. |
+ * @type {!Array.<string>} |
+ * @const |
+ * @private |
+ */ |
+goog.events.EventHandler.typeArray_ = []; |
+ |
+ |
+/** |
+ * Listen to an event on a Listenable. If the function is omitted then the |
+ * EventHandler's handleEvent method will be used. |
+ * @param {goog.events.ListenableType} src Event source. |
+ * @param {string|Array.<string>| |
+ * !goog.events.EventId.<EVENTOBJ>|!Array.<!goog.events.EventId.<EVENTOBJ>>} |
+ * type Event type to listen for or array of event types. |
+ * @param {function(this:SCOPE, EVENTOBJ):?|{handleEvent:function(?):?}|null=} |
+ * opt_fn Optional callback function to be used as the listener or an object |
+ * with handleEvent function. |
+ * @param {boolean=} opt_capture Optional whether to use capture phase. |
+ * @return {!goog.events.EventHandler.<SCOPE>} This object, allowing for |
+ * chaining of calls. |
+ * @template EVENTOBJ |
+ */ |
+goog.events.EventHandler.prototype.listen = function( |
+ src, type, opt_fn, opt_capture) { |
+ return this.listen_(src, type, opt_fn, opt_capture); |
+}; |
+ |
+ |
+/** |
+ * Listen to an event on a Listenable. If the function is omitted then the |
+ * EventHandler's handleEvent method will be used. |
+ * @param {goog.events.ListenableType} src Event source. |
+ * @param {string|Array.<string>| |
+ * !goog.events.EventId.<EVENTOBJ>|!Array.<!goog.events.EventId.<EVENTOBJ>>} |
+ * type Event type to listen for or array of event types. |
+ * @param {function(this:T, EVENTOBJ):?|{handleEvent:function(this:T, ?):?}| |
+ * null|undefined} fn Optional callback function to be used as the |
+ * listener or an object with handleEvent function. |
+ * @param {boolean|undefined} capture Optional whether to use capture phase. |
+ * @param {T} scope Object in whose scope to call the listener. |
+ * @return {!goog.events.EventHandler.<SCOPE>} This object, allowing for |
+ * chaining of calls. |
+ * @template T,EVENTOBJ |
+ */ |
+goog.events.EventHandler.prototype.listenWithScope = function( |
+ src, type, fn, capture, scope) { |
+ // TODO(user): Deprecate this function. |
+ return this.listen_(src, type, fn, capture, scope); |
+}; |
+ |
+ |
+/** |
+ * Listen to an event on a Listenable. If the function is omitted then the |
+ * EventHandler's handleEvent method will be used. |
+ * @param {goog.events.ListenableType} src Event source. |
+ * @param {string|Array.<string>| |
+ * !goog.events.EventId.<EVENTOBJ>|!Array.<!goog.events.EventId.<EVENTOBJ>>} |
+ * type Event type to listen for or array of event types. |
+ * @param {function(EVENTOBJ):?|{handleEvent:function(?):?}|null=} opt_fn |
+ * Optional callback function to be used as the listener or an object with |
+ * handleEvent function. |
+ * @param {boolean=} opt_capture Optional whether to use capture phase. |
+ * @param {Object=} opt_scope Object in whose scope to call the listener. |
+ * @return {!goog.events.EventHandler.<SCOPE>} This object, allowing for |
+ * chaining of calls. |
+ * @template EVENTOBJ |
+ * @private |
+ */ |
+goog.events.EventHandler.prototype.listen_ = function(src, type, opt_fn, |
+ opt_capture, |
+ opt_scope) { |
+ if (!goog.isArray(type)) { |
+ if (type) { |
+ goog.events.EventHandler.typeArray_[0] = type.toString(); |
+ } |
+ type = goog.events.EventHandler.typeArray_; |
+ } |
+ for (var i = 0; i < type.length; i++) { |
+ var listenerObj = goog.events.listen( |
+ src, type[i], opt_fn || this.handleEvent, |
+ opt_capture || false, |
+ opt_scope || this.handler_ || this); |
+ |
+ if (!listenerObj) { |
+ // When goog.events.listen run on OFF_AND_FAIL or OFF_AND_SILENT |
+ // (goog.events.CaptureSimulationMode) in IE8-, it will return null |
+ // value. |
+ return this; |
+ } |
+ |
+ var key = listenerObj.key; |
+ this.keys_[key] = listenerObj; |
+ } |
+ |
+ return this; |
+}; |
+ |
+ |
+/** |
+ * Listen to an event on a Listenable. If the function is omitted, then the |
+ * EventHandler's handleEvent method will be used. After the event has fired the |
+ * event listener is removed from the target. If an array of event types is |
+ * provided, each event type will be listened to once. |
+ * @param {goog.events.ListenableType} src Event source. |
+ * @param {string|Array.<string>| |
+ * !goog.events.EventId.<EVENTOBJ>|!Array.<!goog.events.EventId.<EVENTOBJ>>} |
+ * type Event type to listen for or array of event types. |
+ * @param {function(this:SCOPE, EVENTOBJ):?|{handleEvent:function(?):?}|null=} opt_fn |
+ * Optional callback function to be used as the listener or an object with |
+ * handleEvent function. |
+ * @param {boolean=} opt_capture Optional whether to use capture phase. |
+ * @return {!goog.events.EventHandler.<SCOPE>} This object, allowing for |
+ * chaining of calls. |
+ * @template EVENTOBJ |
+ */ |
+goog.events.EventHandler.prototype.listenOnce = function( |
+ src, type, opt_fn, opt_capture) { |
+ // TODO(user): Remove the opt_scope from this function and then |
+ // templatize it. |
+ return this.listenOnce_(src, type, opt_fn, opt_capture); |
+}; |
+ |
+ |
+/** |
+ * Listen to an event on a Listenable. If the function is omitted, then the |
+ * EventHandler's handleEvent method will be used. After the event has fired the |
+ * event listener is removed from the target. If an array of event types is |
+ * provided, each event type will be listened to once. |
+ * @param {goog.events.ListenableType} src Event source. |
+ * @param {string|Array.<string>| |
+ * !goog.events.EventId.<EVENTOBJ>|!Array.<!goog.events.EventId.<EVENTOBJ>>} |
+ * type Event type to listen for or array of event types. |
+ * @param {function(this:T, EVENTOBJ):?|{handleEvent:function(this:T, ?):?}| |
+ * null|undefined} fn Optional callback function to be used as the |
+ * listener or an object with handleEvent function. |
+ * @param {boolean|undefined} capture Optional whether to use capture phase. |
+ * @param {T} scope Object in whose scope to call the listener. |
+ * @return {!goog.events.EventHandler.<SCOPE>} This object, allowing for |
+ * chaining of calls. |
+ * @template T,EVENTOBJ |
+ */ |
+goog.events.EventHandler.prototype.listenOnceWithScope = function( |
+ src, type, fn, capture, scope) { |
+ // TODO(user): Deprecate this function. |
+ return this.listenOnce_(src, type, fn, capture, scope); |
+}; |
+ |
+ |
+/** |
+ * Listen to an event on a Listenable. If the function is omitted, then the |
+ * EventHandler's handleEvent method will be used. After the event has fired |
+ * the event listener is removed from the target. If an array of event types is |
+ * provided, each event type will be listened to once. |
+ * @param {goog.events.ListenableType} src Event source. |
+ * @param {string|Array.<string>| |
+ * !goog.events.EventId.<EVENTOBJ>|!Array.<!goog.events.EventId.<EVENTOBJ>>} |
+ * type Event type to listen for or array of event types. |
+ * @param {function(EVENTOBJ):?|{handleEvent:function(?):?}|null=} opt_fn |
+ * Optional callback function to be used as the listener or an object with |
+ * handleEvent function. |
+ * @param {boolean=} opt_capture Optional whether to use capture phase. |
+ * @param {Object=} opt_scope Object in whose scope to call the listener. |
+ * @return {!goog.events.EventHandler.<SCOPE>} This object, allowing for |
+ * chaining of calls. |
+ * @template EVENTOBJ |
+ * @private |
+ */ |
+goog.events.EventHandler.prototype.listenOnce_ = function( |
+ src, type, opt_fn, opt_capture, opt_scope) { |
+ if (goog.isArray(type)) { |
+ for (var i = 0; i < type.length; i++) { |
+ this.listenOnce_(src, type[i], opt_fn, opt_capture, opt_scope); |
+ } |
+ } else { |
+ var listenerObj = goog.events.listenOnce( |
+ src, type, opt_fn || this.handleEvent, opt_capture, |
+ opt_scope || this.handler_ || this); |
+ if (!listenerObj) { |
+ // When goog.events.listen run on OFF_AND_FAIL or OFF_AND_SILENT |
+ // (goog.events.CaptureSimulationMode) in IE8-, it will return null |
+ // value. |
+ return this; |
+ } |
+ |
+ var key = listenerObj.key; |
+ this.keys_[key] = listenerObj; |
+ } |
+ |
+ return this; |
+}; |
+ |
+ |
+/** |
+ * Adds an event listener with a specific event wrapper on a DOM Node or an |
+ * object that has implemented {@link goog.events.EventTarget}. A listener can |
+ * only be added once to an object. |
+ * |
+ * @param {EventTarget|goog.events.EventTarget} src The node to listen to |
+ * events on. |
+ * @param {goog.events.EventWrapper} wrapper Event wrapper to use. |
+ * @param {function(this:SCOPE, ?):?|{handleEvent:function(?):?}|null} listener |
+ * Callback method, or an object with a handleEvent function. |
+ * @param {boolean=} opt_capt Whether to fire in capture phase (defaults to |
+ * false). |
+ * @return {!goog.events.EventHandler.<SCOPE>} This object, allowing for |
+ * chaining of calls. |
+ */ |
+goog.events.EventHandler.prototype.listenWithWrapper = function( |
+ src, wrapper, listener, opt_capt) { |
+ // TODO(user): Remove the opt_scope from this function and then |
+ // templatize it. |
+ return this.listenWithWrapper_(src, wrapper, listener, opt_capt); |
+}; |
+ |
+ |
+/** |
+ * Adds an event listener with a specific event wrapper on a DOM Node or an |
+ * object that has implemented {@link goog.events.EventTarget}. A listener can |
+ * only be added once to an object. |
+ * |
+ * @param {EventTarget|goog.events.EventTarget} src The node to listen to |
+ * events on. |
+ * @param {goog.events.EventWrapper} wrapper Event wrapper to use. |
+ * @param {function(this:T, ?):?|{handleEvent:function(this:T, ?):?}|null} |
+ * listener Optional callback function to be used as the |
+ * listener or an object with handleEvent function. |
+ * @param {boolean|undefined} capture Optional whether to use capture phase. |
+ * @param {T} scope Object in whose scope to call the listener. |
+ * @return {!goog.events.EventHandler.<SCOPE>} This object, allowing for |
+ * chaining of calls. |
+ * @template T |
+ */ |
+goog.events.EventHandler.prototype.listenWithWrapperAndScope = function( |
+ src, wrapper, listener, capture, scope) { |
+ // TODO(user): Deprecate this function. |
+ return this.listenWithWrapper_(src, wrapper, listener, capture, scope); |
+}; |
+ |
+ |
+/** |
+ * Adds an event listener with a specific event wrapper on a DOM Node or an |
+ * object that has implemented {@link goog.events.EventTarget}. A listener can |
+ * only be added once to an object. |
+ * |
+ * @param {EventTarget|goog.events.EventTarget} src The node to listen to |
+ * events on. |
+ * @param {goog.events.EventWrapper} wrapper Event wrapper to use. |
+ * @param {function(?):?|{handleEvent:function(?):?}|null} listener Callback |
+ * method, or an object with a handleEvent function. |
+ * @param {boolean=} opt_capt Whether to fire in capture phase (defaults to |
+ * false). |
+ * @param {Object=} opt_scope Element in whose scope to call the listener. |
+ * @return {!goog.events.EventHandler.<SCOPE>} This object, allowing for |
+ * chaining of calls. |
+ * @private |
+ */ |
+goog.events.EventHandler.prototype.listenWithWrapper_ = function( |
+ src, wrapper, listener, opt_capt, opt_scope) { |
+ wrapper.listen(src, listener, opt_capt, opt_scope || this.handler_ || this, |
+ this); |
+ return this; |
+}; |
+ |
+ |
+/** |
+ * @return {number} Number of listeners registered by this handler. |
+ */ |
+goog.events.EventHandler.prototype.getListenerCount = function() { |
+ var count = 0; |
+ for (var key in this.keys_) { |
+ if (Object.prototype.hasOwnProperty.call(this.keys_, key)) { |
+ count++; |
+ } |
+ } |
+ return count; |
+}; |
+ |
+ |
+/** |
+ * Unlistens on an event. |
+ * @param {goog.events.ListenableType} src Event source. |
+ * @param {string|Array.<string>| |
+ * !goog.events.EventId.<EVENTOBJ>|!Array.<!goog.events.EventId.<EVENTOBJ>>} |
+ * type Event type or array of event types to unlisten to. |
+ * @param {function(EVENTOBJ):?|{handleEvent:function(?):?}|null=} opt_fn |
+ * Optional callback function to be used as the listener or an object with |
+ * handleEvent function. |
+ * @param {boolean=} opt_capture Optional whether to use capture phase. |
+ * @param {Object=} opt_scope Object in whose scope to call the listener. |
+ * @return {!goog.events.EventHandler} This object, allowing for chaining of |
+ * calls. |
+ * @template EVENTOBJ |
+ */ |
+goog.events.EventHandler.prototype.unlisten = function(src, type, opt_fn, |
+ opt_capture, |
+ opt_scope) { |
+ if (goog.isArray(type)) { |
+ for (var i = 0; i < type.length; i++) { |
+ this.unlisten(src, type[i], opt_fn, opt_capture, opt_scope); |
+ } |
+ } else { |
+ var listener = goog.events.getListener(src, type, |
+ opt_fn || this.handleEvent, |
+ opt_capture, opt_scope || this.handler_ || this); |
+ |
+ if (listener) { |
+ goog.events.unlistenByKey(listener); |
+ delete this.keys_[listener.key]; |
+ } |
+ } |
+ |
+ return this; |
+}; |
+ |
+ |
+/** |
+ * Removes an event listener which was added with listenWithWrapper(). |
+ * |
+ * @param {EventTarget|goog.events.EventTarget} src The target to stop |
+ * listening to events on. |
+ * @param {goog.events.EventWrapper} wrapper Event wrapper to use. |
+ * @param {function(?):?|{handleEvent:function(?):?}|null} listener The |
+ * listener function to remove. |
+ * @param {boolean=} opt_capt In DOM-compliant browsers, this determines |
+ * whether the listener is fired during the capture or bubble phase of the |
+ * event. |
+ * @param {Object=} opt_scope Element in whose scope to call the listener. |
+ * @return {!goog.events.EventHandler} This object, allowing for chaining of |
+ * calls. |
+ */ |
+goog.events.EventHandler.prototype.unlistenWithWrapper = function(src, wrapper, |
+ listener, opt_capt, opt_scope) { |
+ wrapper.unlisten(src, listener, opt_capt, |
+ opt_scope || this.handler_ || this, this); |
+ return this; |
+}; |
+ |
+ |
+/** |
+ * Unlistens to all events. |
+ */ |
+goog.events.EventHandler.prototype.removeAll = function() { |
+ goog.object.forEach(this.keys_, goog.events.unlistenByKey); |
+ this.keys_ = {}; |
+}; |
+ |
+ |
+/** |
+ * Disposes of this EventHandler and removes all listeners that it registered. |
+ * @override |
+ * @protected |
+ */ |
+goog.events.EventHandler.prototype.disposeInternal = function() { |
+ goog.events.EventHandler.superClass_.disposeInternal.call(this); |
+ this.removeAll(); |
+}; |
+ |
+ |
+/** |
+ * Default event handler |
+ * @param {goog.events.Event} e Event object. |
+ */ |
+goog.events.EventHandler.prototype.handleEvent = function(e) { |
+ throw Error('EventHandler.handleEvent not implemented'); |
+}; |