| Index: third_party/google_input_tools/third_party/closure_library/closure/goog/events/events.js
|
| diff --git a/third_party/google_input_tools/third_party/closure_library/closure/goog/events/events.js b/third_party/google_input_tools/third_party/closure_library/closure/goog/events/events.js
|
| index e39d3bd78b772e89ded2c99f71526b5154129950..faf4b9a6823c6452f66a0aa12265276b8401af37 100644
|
| --- a/third_party/google_input_tools/third_party/closure_library/closure/goog/events/events.js
|
| +++ b/third_party/google_input_tools/third_party/closure_library/closure/goog/events/events.js
|
| @@ -38,6 +38,7 @@
|
| * </pre>
|
| *
|
| * in IE and event object patching]
|
| + * @author arv@google.com (Erik Arvidsson)
|
| *
|
| * @see ../demos/events.html
|
| * @see ../demos/event-propagation.html
|
| @@ -81,8 +82,7 @@ goog.events.ListenableType;
|
| /**
|
| * Property name on a native event target for the listener map
|
| * associated with the event target.
|
| - * @const
|
| - * @private
|
| + * @private @const {string}
|
| */
|
| goog.events.LISTENER_MAP_PROP_ = 'closure_lm_' + ((Math.random() * 1e6) | 0);
|
|
|
| @@ -154,8 +154,8 @@ goog.events.listenerCountEstimate_ = 0;
|
| *
|
| * @param {EventTarget|goog.events.Listenable} src The node to listen
|
| * to events on.
|
| - * @param {string|Array.<string>|
|
| - * !goog.events.EventId.<EVENTOBJ>|!Array.<!goog.events.EventId.<EVENTOBJ>>}
|
| + * @param {string|Array<string>|
|
| + * !goog.events.EventId<EVENTOBJ>|!Array<!goog.events.EventId<EVENTOBJ>>}
|
| * type Event type or array of event types.
|
| * @param {function(this:T, EVENTOBJ):?|{handleEvent:function(?):?}|null}
|
| * listener Callback method, or an object with a handleEvent function.
|
| @@ -181,7 +181,7 @@ goog.events.listen = function(src, type, listener, opt_capt, opt_handler) {
|
| listener, opt_capt, opt_handler);
|
| } else {
|
| return goog.events.listen_(
|
| - /** @type {EventTarget} */ (src),
|
| + /** @type {!EventTarget} */ (src),
|
| /** @type {string|!goog.events.EventId} */ (type),
|
| listener, /* callOnce */ false, opt_capt, opt_handler);
|
| }
|
| @@ -250,13 +250,14 @@ goog.events.listen_ = function(
|
| // Attach the proxy through the browser's API
|
| if (src.addEventListener) {
|
| src.addEventListener(type.toString(), proxy, capture);
|
| - } else {
|
| - // The else above used to be else if (src.attachEvent) and then there was
|
| - // another else statement that threw an exception warning the developer
|
| - // they made a mistake. This resulted in an extra object allocation in IE6
|
| - // due to a wrapper object that had to be implemented around the element
|
| - // and so was removed.
|
| + } else if (src.attachEvent) {
|
| + // The else if above used to be an unconditional else. It would call
|
| + // exception on IE11, spoiling the day of some callers. The previous
|
| + // incarnation of this code, from 2007, indicates that it replaced an
|
| + // earlier still version that caused excess allocations on IE6.
|
| src.attachEvent(goog.events.getOnString_(type.toString()), proxy);
|
| + } else {
|
| + throw Error('addEventListener and attachEvent are unavailable.');
|
| }
|
|
|
| goog.events.listenerCountEstimate_++;
|
| @@ -277,7 +278,7 @@ goog.events.getProxy = function() {
|
| } :
|
| function(eventObject) {
|
| var v = proxyCallbackFunction.call(f.src, f.listener, eventObject);
|
| - // NOTE(user): In IE, we hack in a capture phase. However, if
|
| + // NOTE(chrishenry): In IE, we hack in a capture phase. However, if
|
| // there is inline event handler which tries to prevent default (for
|
| // example <a href="..." onclick="return false">...</a>) in a
|
| // descendant element, the prevent default will be overridden
|
| @@ -304,8 +305,8 @@ goog.events.getProxy = function() {
|
| *
|
| * @param {EventTarget|goog.events.Listenable} src The node to listen
|
| * to events on.
|
| - * @param {string|Array.<string>|
|
| - * !goog.events.EventId.<EVENTOBJ>|!Array.<!goog.events.EventId.<EVENTOBJ>>}
|
| + * @param {string|Array<string>|
|
| + * !goog.events.EventId<EVENTOBJ>|!Array<!goog.events.EventId<EVENTOBJ>>}
|
| * type Event type or array of event types.
|
| * @param {function(this:T, EVENTOBJ):?|{handleEvent:function(?):?}|null}
|
| * listener Callback method.
|
| @@ -329,7 +330,7 @@ goog.events.listenOnce = function(src, type, listener, opt_capt, opt_handler) {
|
| listener, opt_capt, opt_handler);
|
| } else {
|
| return goog.events.listen_(
|
| - /** @type {EventTarget} */ (src),
|
| + /** @type {!EventTarget} */ (src),
|
| /** @type {string|!goog.events.EventId} */ (type),
|
| listener, /* callOnce */ true, opt_capt, opt_handler);
|
| }
|
| @@ -362,8 +363,8 @@ goog.events.listenWithWrapper = function(src, wrapper, listener, opt_capt,
|
| *
|
| * @param {EventTarget|goog.events.Listenable} src The target to stop
|
| * listening to events on.
|
| - * @param {string|Array.<string>|
|
| - * !goog.events.EventId.<EVENTOBJ>|!Array.<!goog.events.EventId.<EVENTOBJ>>}
|
| + * @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(?):?|{handleEvent:function(?):?}|null} listener The
|
| * listener function to remove.
|
| @@ -390,14 +391,14 @@ goog.events.unlisten = function(src, type, listener, opt_capt, opt_handler) {
|
| }
|
|
|
| if (!src) {
|
| - // TODO(user): We should tighten the API to only accept
|
| + // TODO(chrishenry): We should tighten the API to only accept
|
| // non-null objects, or add an assertion here.
|
| return false;
|
| }
|
|
|
| var capture = !!opt_capt;
|
| var listenerMap = goog.events.getListenerMap_(
|
| - /** @type {EventTarget} */ (src));
|
| + /** @type {!EventTarget} */ (src));
|
| if (listenerMap) {
|
| var listenerObj = listenerMap.getListener(
|
| /** @type {string|!goog.events.EventId} */ (type),
|
| @@ -420,13 +421,13 @@ goog.events.unlisten = function(src, type, listener, opt_capt, opt_handler) {
|
| * @return {boolean} indicating whether the listener was there to remove.
|
| */
|
| goog.events.unlistenByKey = function(key) {
|
| - // TODO(user): Remove this check when tests that rely on this
|
| + // TODO(chrishenry): Remove this check when tests that rely on this
|
| // are fixed.
|
| if (goog.isNumber(key)) {
|
| return false;
|
| }
|
|
|
| - var listener = /** @type {goog.events.ListenableKey} */ (key);
|
| + var listener = key;
|
| if (!listener || listener.removed) {
|
| return false;
|
| }
|
| @@ -446,8 +447,8 @@ goog.events.unlistenByKey = function(key) {
|
| goog.events.listenerCountEstimate_--;
|
|
|
| var listenerMap = goog.events.getListenerMap_(
|
| - /** @type {EventTarget} */ (src));
|
| - // TODO(user): Try to remove this conditional and execute the
|
| + /** @type {!EventTarget} */ (src));
|
| + // TODO(chrishenry): Try to remove this conditional and execute the
|
| // first branch always. This should be safe.
|
| if (listenerMap) {
|
| listenerMap.removeByKey(listener);
|
| @@ -497,7 +498,7 @@ goog.events.unlistenWithWrapper = function(src, wrapper, listener, opt_capt,
|
| * @return {number} Number of listeners removed.
|
| */
|
| goog.events.removeAll = function(obj, opt_type) {
|
| - // TODO(user): Change the type of obj to
|
| + // TODO(chrishenry): Change the type of obj to
|
| // (!EventTarget|!goog.events.Listenable).
|
|
|
| if (!obj) {
|
| @@ -509,7 +510,7 @@ goog.events.removeAll = function(obj, opt_type) {
|
| }
|
|
|
| var listenerMap = goog.events.getListenerMap_(
|
| - /** @type {EventTarget} */ (obj));
|
| + /** @type {!EventTarget} */ (obj));
|
| if (!listenerMap) {
|
| return 0;
|
| }
|
| @@ -533,40 +534,25 @@ goog.events.removeAll = function(obj, opt_type) {
|
|
|
|
|
| /**
|
| - * Removes all native listeners registered via goog.events. Native
|
| - * listeners are listeners on native browser objects (such as DOM
|
| - * elements). In particular, goog.events.Listenable and
|
| - * goog.events.EventTarget listeners will NOT be removed.
|
| - * @return {number} Number of listeners removed.
|
| - * @deprecated This doesn't do anything, now that Closure no longer
|
| - * stores a central listener registry.
|
| - */
|
| -goog.events.removeAllNativeListeners = function() {
|
| - goog.events.listenerCountEstimate_ = 0;
|
| - return 0;
|
| -};
|
| -
|
| -
|
| -/**
|
| * Gets the listeners for a given object, type and capture phase.
|
| *
|
| * @param {Object} obj Object to get listeners for.
|
| * @param {string|!goog.events.EventId} type Event type.
|
| * @param {boolean} capture Capture phase?.
|
| - * @return {Array.<goog.events.Listener>} Array of listener objects.
|
| + * @return {Array<goog.events.Listener>} Array of listener objects.
|
| */
|
| goog.events.getListeners = function(obj, type, capture) {
|
| if (goog.events.Listenable.isImplementedBy(obj)) {
|
| return obj.getListeners(type, capture);
|
| } else {
|
| if (!obj) {
|
| - // TODO(user): We should tighten the API to accept
|
| + // TODO(chrishenry): We should tighten the API to accept
|
| // !EventTarget|goog.events.Listenable, and add an assertion here.
|
| return [];
|
| }
|
|
|
| var listenerMap = goog.events.getListenerMap_(
|
| - /** @type {EventTarget} */ (obj));
|
| + /** @type {!EventTarget} */ (obj));
|
| return listenerMap ? listenerMap.getListeners(type, capture) : [];
|
| }
|
| };
|
| @@ -578,7 +564,7 @@ goog.events.getListeners = function(obj, type, capture) {
|
| *
|
| * @param {EventTarget|goog.events.Listenable} src The target from
|
| * which to get listeners.
|
| - * @param {?string|!goog.events.EventId.<EVENTOBJ>} type The type of the event.
|
| + * @param {?string|!goog.events.EventId<EVENTOBJ>} type The type of the event.
|
| * @param {function(EVENTOBJ):?|{handleEvent:function(?):?}|null} listener The
|
| * listener function to get.
|
| * @param {boolean=} opt_capt In DOM-compliant browsers, this determines
|
| @@ -589,7 +575,7 @@ goog.events.getListeners = function(obj, type, capture) {
|
| * @template EVENTOBJ
|
| */
|
| goog.events.getListener = function(src, type, listener, opt_capt, opt_handler) {
|
| - // TODO(user): Change type from ?string to string, or add assertion.
|
| + // TODO(chrishenry): Change type from ?string to string, or add assertion.
|
| type = /** @type {string} */ (type);
|
| listener = goog.events.wrapListener(listener);
|
| var capture = !!opt_capt;
|
| @@ -598,13 +584,13 @@ goog.events.getListener = function(src, type, listener, opt_capt, opt_handler) {
|
| }
|
|
|
| if (!src) {
|
| - // TODO(user): We should tighten the API to only accept
|
| + // TODO(chrishenry): We should tighten the API to only accept
|
| // non-null objects, or add an assertion here.
|
| return null;
|
| }
|
|
|
| var listenerMap = goog.events.getListenerMap_(
|
| - /** @type {EventTarget} */ (src));
|
| + /** @type {!EventTarget} */ (src));
|
| if (listenerMap) {
|
| return listenerMap.getListener(type, listener, capture, opt_handler);
|
| }
|
| @@ -631,7 +617,7 @@ goog.events.hasListener = function(obj, opt_type, opt_capture) {
|
| }
|
|
|
| var listenerMap = goog.events.getListenerMap_(
|
| - /** @type {EventTarget} */ (obj));
|
| + /** @type {!EventTarget} */ (obj));
|
| return !!listenerMap && listenerMap.hasListener(opt_type, opt_capture);
|
| };
|
|
|
| @@ -698,12 +684,13 @@ goog.events.fireListeners = function(obj, type, capture, eventObject) {
|
| * @private
|
| */
|
| goog.events.fireListeners_ = function(obj, type, capture, eventObject) {
|
| - var retval = 1;
|
| + /** @type {boolean} */
|
| + var retval = true;
|
|
|
| var listenerMap = goog.events.getListenerMap_(
|
| /** @type {EventTarget} */ (obj));
|
| if (listenerMap) {
|
| - // TODO(user): Original code avoids array creation when there
|
| + // TODO(chrishenry): Original code avoids array creation when there
|
| // is no listener, so we do the same. If this optimization turns
|
| // out to be not required, we can replace this with
|
| // listenerMap.getListeners(type, capture) instead, which is simpler.
|
| @@ -714,13 +701,13 @@ goog.events.fireListeners_ = function(obj, type, capture, eventObject) {
|
| var listener = listenerArray[i];
|
| // We might not have a listener if the listener was removed.
|
| if (listener && listener.capture == capture && !listener.removed) {
|
| - retval &=
|
| - goog.events.fireListener(listener, eventObject) !== false;
|
| + var result = goog.events.fireListener(listener, eventObject);
|
| + retval = retval && (result !== false);
|
| }
|
| }
|
| }
|
| }
|
| - return Boolean(retval);
|
| + return retval;
|
| };
|
|
|
|
|
| @@ -815,6 +802,7 @@ goog.events.handleBrowserEvent_ = function(listener, opt_evt) {
|
| var ieEvent = opt_evt ||
|
| /** @type {Event} */ (goog.getObjectByName('window.event'));
|
| var evt = new goog.events.BrowserEvent(ieEvent, this);
|
| + /** @type {boolean} */
|
| var retval = true;
|
|
|
| if (goog.events.CAPTURE_SIMULATION_MODE ==
|
| @@ -835,7 +823,8 @@ goog.events.handleBrowserEvent_ = function(listener, opt_evt) {
|
| for (var i = ancestors.length - 1; !evt.propagationStopped_ && i >= 0;
|
| i--) {
|
| evt.currentTarget = ancestors[i];
|
| - retval &= goog.events.fireListeners_(ancestors[i], type, true, evt);
|
| + var result = goog.events.fireListeners_(ancestors[i], type, true, evt);
|
| + retval = retval && result;
|
| }
|
|
|
| // Fire bubble listeners.
|
| @@ -849,7 +838,8 @@ goog.events.handleBrowserEvent_ = function(listener, opt_evt) {
|
| // actually specify the order as the registration order.)
|
| for (var i = 0; !evt.propagationStopped_ && i < ancestors.length; i++) {
|
| evt.currentTarget = ancestors[i];
|
| - retval &= goog.events.fireListeners_(ancestors[i], type, false, evt);
|
| + var result = goog.events.fireListeners_(ancestors[i], type, false, evt);
|
| + retval = retval && result;
|
| }
|
| }
|
| } else {
|
| @@ -950,8 +940,7 @@ goog.events.getListenerMap_ = function(src) {
|
| /**
|
| * Expando property for listener function wrapper for Object with
|
| * handleEvent.
|
| - * @const
|
| - * @private
|
| + * @private @const {string}
|
| */
|
| goog.events.LISTENER_WRAPPER_PROP_ = '__closure_events_fn_' +
|
| ((Math.random() * 1e9) >>> 0);
|
|
|