| Index: third_party/google_input_tools/third_party/closure_library/closure/goog/disposable/disposable.js
|
| diff --git a/third_party/google_input_tools/third_party/closure_library/closure/goog/disposable/disposable.js b/third_party/google_input_tools/third_party/closure_library/closure/goog/disposable/disposable.js
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..c8340dba2b45038a96a602cb43807231c5a3cff1
|
| --- /dev/null
|
| +++ b/third_party/google_input_tools/third_party/closure_library/closure/goog/disposable/disposable.js
|
| @@ -0,0 +1,299 @@
|
| +// 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 Implements the disposable interface. The dispose method is used
|
| + * to clean up references and resources.
|
| + * @author arv@google.com (Erik Arvidsson)
|
| + */
|
| +
|
| +
|
| +goog.provide('goog.Disposable');
|
| +/** @suppress {extraProvide} */
|
| +goog.provide('goog.dispose');
|
| +/** @suppress {extraProvide} */
|
| +goog.provide('goog.disposeAll');
|
| +
|
| +goog.require('goog.disposable.IDisposable');
|
| +
|
| +
|
| +
|
| +/**
|
| + * Class that provides the basic implementation for disposable objects. If your
|
| + * class holds one or more references to COM objects, DOM nodes, or other
|
| + * disposable objects, it should extend this class or implement the disposable
|
| + * interface (defined in goog.disposable.IDisposable).
|
| + * @constructor
|
| + * @implements {goog.disposable.IDisposable}
|
| + */
|
| +goog.Disposable = function() {
|
| + if (goog.Disposable.MONITORING_MODE != goog.Disposable.MonitoringMode.OFF) {
|
| + if (goog.Disposable.INCLUDE_STACK_ON_CREATION) {
|
| + this.creationStack = new Error().stack;
|
| + }
|
| + goog.Disposable.instances_[goog.getUid(this)] = this;
|
| + }
|
| +};
|
| +
|
| +
|
| +/**
|
| + * @enum {number} Different monitoring modes for Disposable.
|
| + */
|
| +goog.Disposable.MonitoringMode = {
|
| + /**
|
| + * No monitoring.
|
| + */
|
| + OFF: 0,
|
| + /**
|
| + * Creating and disposing the goog.Disposable instances is monitored. All
|
| + * disposable objects need to call the {@code goog.Disposable} base
|
| + * constructor. The PERMANENT mode must be switched on before creating any
|
| + * goog.Disposable instances.
|
| + */
|
| + PERMANENT: 1,
|
| + /**
|
| + * INTERACTIVE mode can be switched on and off on the fly without producing
|
| + * errors. It also doesn't warn if the disposable objects don't call the
|
| + * {@code goog.Disposable} base constructor.
|
| + */
|
| + INTERACTIVE: 2
|
| +};
|
| +
|
| +
|
| +/**
|
| + * @define {number} The monitoring mode of the goog.Disposable
|
| + * instances. Default is OFF. Switching on the monitoring is only
|
| + * recommended for debugging because it has a significant impact on
|
| + * performance and memory usage. If switched off, the monitoring code
|
| + * compiles down to 0 bytes.
|
| + */
|
| +goog.define('goog.Disposable.MONITORING_MODE', 0);
|
| +
|
| +
|
| +/**
|
| + * @define {boolean} Whether to attach creation stack to each created disposable
|
| + * instance; This is only relevant for when MonitoringMode != OFF.
|
| + */
|
| +goog.define('goog.Disposable.INCLUDE_STACK_ON_CREATION', true);
|
| +
|
| +
|
| +/**
|
| + * Maps the unique ID of every undisposed {@code goog.Disposable} object to
|
| + * the object itself.
|
| + * @type {!Object.<number, !goog.Disposable>}
|
| + * @private
|
| + */
|
| +goog.Disposable.instances_ = {};
|
| +
|
| +
|
| +/**
|
| + * @return {!Array.<!goog.Disposable>} All {@code goog.Disposable} objects that
|
| + * haven't been disposed of.
|
| + */
|
| +goog.Disposable.getUndisposedObjects = function() {
|
| + var ret = [];
|
| + for (var id in goog.Disposable.instances_) {
|
| + if (goog.Disposable.instances_.hasOwnProperty(id)) {
|
| + ret.push(goog.Disposable.instances_[Number(id)]);
|
| + }
|
| + }
|
| + return ret;
|
| +};
|
| +
|
| +
|
| +/**
|
| + * Clears the registry of undisposed objects but doesn't dispose of them.
|
| + */
|
| +goog.Disposable.clearUndisposedObjects = function() {
|
| + goog.Disposable.instances_ = {};
|
| +};
|
| +
|
| +
|
| +/**
|
| + * Whether the object has been disposed of.
|
| + * @type {boolean}
|
| + * @private
|
| + */
|
| +goog.Disposable.prototype.disposed_ = false;
|
| +
|
| +
|
| +/**
|
| + * Callbacks to invoke when this object is disposed.
|
| + * @type {Array.<!Function>}
|
| + * @private
|
| + */
|
| +goog.Disposable.prototype.onDisposeCallbacks_;
|
| +
|
| +
|
| +/**
|
| + * If monitoring the goog.Disposable instances is enabled, stores the creation
|
| + * stack trace of the Disposable instance.
|
| + * @type {string}
|
| + */
|
| +goog.Disposable.prototype.creationStack;
|
| +
|
| +
|
| +/**
|
| + * @return {boolean} Whether the object has been disposed of.
|
| + * @override
|
| + */
|
| +goog.Disposable.prototype.isDisposed = function() {
|
| + return this.disposed_;
|
| +};
|
| +
|
| +
|
| +/**
|
| + * @return {boolean} Whether the object has been disposed of.
|
| + * @deprecated Use {@link #isDisposed} instead.
|
| + */
|
| +goog.Disposable.prototype.getDisposed = goog.Disposable.prototype.isDisposed;
|
| +
|
| +
|
| +/**
|
| + * Disposes of the object. If the object hasn't already been disposed of, calls
|
| + * {@link #disposeInternal}. Classes that extend {@code goog.Disposable} should
|
| + * override {@link #disposeInternal} in order to delete references to COM
|
| + * objects, DOM nodes, and other disposable objects. Reentrant.
|
| + *
|
| + * @return {void} Nothing.
|
| + * @override
|
| + */
|
| +goog.Disposable.prototype.dispose = function() {
|
| + if (!this.disposed_) {
|
| + // Set disposed_ to true first, in case during the chain of disposal this
|
| + // gets disposed recursively.
|
| + this.disposed_ = true;
|
| + this.disposeInternal();
|
| + if (goog.Disposable.MONITORING_MODE != goog.Disposable.MonitoringMode.OFF) {
|
| + var uid = goog.getUid(this);
|
| + if (goog.Disposable.MONITORING_MODE ==
|
| + goog.Disposable.MonitoringMode.PERMANENT &&
|
| + !goog.Disposable.instances_.hasOwnProperty(uid)) {
|
| + throw Error(this + ' did not call the goog.Disposable base ' +
|
| + 'constructor or was disposed of after a clearUndisposedObjects ' +
|
| + 'call');
|
| + }
|
| + delete goog.Disposable.instances_[uid];
|
| + }
|
| + }
|
| +};
|
| +
|
| +
|
| +/**
|
| + * Associates a disposable object with this object so that they will be disposed
|
| + * together.
|
| + * @param {goog.disposable.IDisposable} disposable that will be disposed when
|
| + * this object is disposed.
|
| + */
|
| +goog.Disposable.prototype.registerDisposable = function(disposable) {
|
| + this.addOnDisposeCallback(goog.partial(goog.dispose, disposable));
|
| +};
|
| +
|
| +
|
| +/**
|
| + * Invokes a callback function when this object is disposed. Callbacks are
|
| + * invoked in the order in which they were added.
|
| + * @param {function(this:T):?} callback The callback function.
|
| + * @param {T=} opt_scope An optional scope to call the callback in.
|
| + * @template T
|
| + */
|
| +goog.Disposable.prototype.addOnDisposeCallback = function(callback, opt_scope) {
|
| + if (!this.onDisposeCallbacks_) {
|
| + this.onDisposeCallbacks_ = [];
|
| + }
|
| +
|
| + this.onDisposeCallbacks_.push(
|
| + goog.isDef(opt_scope) ? goog.bind(callback, opt_scope) : callback);
|
| +};
|
| +
|
| +
|
| +/**
|
| + * Deletes or nulls out any references to COM objects, DOM nodes, or other
|
| + * disposable objects. Classes that extend {@code goog.Disposable} should
|
| + * override this method.
|
| + * Not reentrant. To avoid calling it twice, it must only be called from the
|
| + * subclass' {@code disposeInternal} method. Everywhere else the public
|
| + * {@code dispose} method must be used.
|
| + * For example:
|
| + * <pre>
|
| + * mypackage.MyClass = function() {
|
| + * mypackage.MyClass.base(this, 'constructor');
|
| + * // Constructor logic specific to MyClass.
|
| + * ...
|
| + * };
|
| + * goog.inherits(mypackage.MyClass, goog.Disposable);
|
| + *
|
| + * mypackage.MyClass.prototype.disposeInternal = function() {
|
| + * // Dispose logic specific to MyClass.
|
| + * ...
|
| + * // Call superclass's disposeInternal at the end of the subclass's, like
|
| + * // in C++, to avoid hard-to-catch issues.
|
| + * mypackage.MyClass.base(this, 'disposeInternal');
|
| + * };
|
| + * </pre>
|
| + * @protected
|
| + */
|
| +goog.Disposable.prototype.disposeInternal = function() {
|
| + if (this.onDisposeCallbacks_) {
|
| + while (this.onDisposeCallbacks_.length) {
|
| + this.onDisposeCallbacks_.shift()();
|
| + }
|
| + }
|
| +};
|
| +
|
| +
|
| +/**
|
| + * Returns True if we can verify the object is disposed.
|
| + * Calls {@code isDisposed} on the argument if it supports it. If obj
|
| + * is not an object with an isDisposed() method, return false.
|
| + * @param {*} obj The object to investigate.
|
| + * @return {boolean} True if we can verify the object is disposed.
|
| + */
|
| +goog.Disposable.isDisposed = function(obj) {
|
| + if (obj && typeof obj.isDisposed == 'function') {
|
| + return obj.isDisposed();
|
| + }
|
| + return false;
|
| +};
|
| +
|
| +
|
| +/**
|
| + * Calls {@code dispose} on the argument if it supports it. If obj is not an
|
| + * object with a dispose() method, this is a no-op.
|
| + * @param {*} obj The object to dispose of.
|
| + */
|
| +goog.dispose = function(obj) {
|
| + if (obj && typeof obj.dispose == 'function') {
|
| + obj.dispose();
|
| + }
|
| +};
|
| +
|
| +
|
| +/**
|
| + * Calls {@code dispose} on each member of the list that supports it. (If the
|
| + * member is an ArrayLike, then {@code goog.disposeAll()} will be called
|
| + * recursively on each of its members.) If the member is not an object with a
|
| + * {@code dispose()} method, then it is ignored.
|
| + * @param {...*} var_args The list.
|
| + */
|
| +goog.disposeAll = function(var_args) {
|
| + for (var i = 0, len = arguments.length; i < len; ++i) {
|
| + var disposable = arguments[i];
|
| + if (goog.isArrayLike(disposable)) {
|
| + goog.disposeAll.apply(null, disposable);
|
| + } else {
|
| + goog.dispose(disposable);
|
| + }
|
| + }
|
| +};
|
|
|