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

Unified Diff: third_party/google_input_tools/third_party/closure_library/closure/goog/timer/timer.js

Issue 674153004: Add third_party/google-input-tools: Take 2 (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@google_input_tools
Patch Set: Created 6 years, 2 months 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/google_input_tools/third_party/closure_library/closure/goog/timer/timer.js
diff --git a/third_party/google_input_tools/third_party/closure_library/closure/goog/timer/timer.js b/third_party/google_input_tools/third_party/closure_library/closure/goog/timer/timer.js
new file mode 100644
index 0000000000000000000000000000000000000000..ccee170d00cc3cc79bbf58d1836e2517bf0e7cc1
--- /dev/null
+++ b/third_party/google_input_tools/third_party/closure_library/closure/goog/timer/timer.js
@@ -0,0 +1,292 @@
+// Copyright 2006 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 A timer class to which other classes and objects can
+ * listen on. This is only an abstraction above setInterval.
+ *
+ * @see ../demos/timers.html
+ */
+
+goog.provide('goog.Timer');
+
+goog.require('goog.events.EventTarget');
+
+
+
+/**
+ * Class for handling timing events.
+ *
+ * @param {number=} opt_interval Number of ms between ticks (Default: 1ms).
+ * @param {Object=} opt_timerObject An object that has setTimeout, setInterval,
+ * clearTimeout and clearInterval (eg Window).
+ * @constructor
+ * @extends {goog.events.EventTarget}
+ */
+goog.Timer = function(opt_interval, opt_timerObject) {
+ goog.events.EventTarget.call(this);
+
+ /**
+ * Number of ms between ticks
+ * @type {number}
+ * @private
+ */
+ this.interval_ = opt_interval || 1;
+
+ /**
+ * An object that implements setTimeout, setInterval, clearTimeout and
+ * clearInterval. We default to the window object. Changing this on
+ * goog.Timer.prototype changes the object for all timer instances which can
+ * be useful if your environment has some other implementation of timers than
+ * the window object.
+ * @type {Object}
+ * @private
+ */
+ this.timerObject_ = opt_timerObject || goog.Timer.defaultTimerObject;
+
+ /**
+ * Cached tick_ bound to the object for later use in the timer.
+ * @type {Function}
+ * @private
+ */
+ this.boundTick_ = goog.bind(this.tick_, this);
+
+ /**
+ * Firefox browser often fires the timer event sooner
+ * (sometimes MUCH sooner) than the requested timeout. So we
+ * compare the time to when the event was last fired, and
+ * reschedule if appropriate. See also goog.Timer.intervalScale
+ * @type {number}
+ * @private
+ */
+ this.last_ = goog.now();
+};
+goog.inherits(goog.Timer, goog.events.EventTarget);
+
+
+/**
+ * Maximum timeout value.
+ *
+ * Timeout values too big to fit into a signed 32-bit integer may cause
+ * overflow in FF, Safari, and Chrome, resulting in the timeout being
+ * scheduled immediately. It makes more sense simply not to schedule these
+ * timeouts, since 24.8 days is beyond a reasonable expectation for the
+ * browser to stay open.
+ *
+ * @type {number}
+ * @private
+ */
+goog.Timer.MAX_TIMEOUT_ = 2147483647;
+
+
+/**
+ * Whether this timer is enabled
+ * @type {boolean}
+ */
+goog.Timer.prototype.enabled = false;
+
+
+/**
+ * An object that implements setTimout, setInterval, clearTimeout and
+ * clearInterval. We default to the global object. Changing
+ * goog.Timer.defaultTimerObject changes the object for all timer instances
+ * which can be useful if your environment has some other implementation of
+ * timers you'd like to use.
+ * @type {Object}
+ */
+goog.Timer.defaultTimerObject = goog.global;
+
+
+/**
+ * A variable that controls the timer error correction. If the
+ * timer is called before the requested interval times
+ * intervalScale, which often happens on mozilla, the timer is
+ * rescheduled. See also this.last_
+ * @type {number}
+ */
+goog.Timer.intervalScale = 0.8;
+
+
+/**
+ * Variable for storing the result of setInterval
+ * @type {?number}
+ * @private
+ */
+goog.Timer.prototype.timer_ = null;
+
+
+/**
+ * Gets the interval of the timer.
+ * @return {number} interval Number of ms between ticks.
+ */
+goog.Timer.prototype.getInterval = function() {
+ return this.interval_;
+};
+
+
+/**
+ * Sets the interval of the timer.
+ * @param {number} interval Number of ms between ticks.
+ */
+goog.Timer.prototype.setInterval = function(interval) {
+ this.interval_ = interval;
+ if (this.timer_ && this.enabled) {
+ // Stop and then start the timer to reset the interval.
+ this.stop();
+ this.start();
+ } else if (this.timer_) {
+ this.stop();
+ }
+};
+
+
+/**
+ * Callback for the setTimeout used by the timer
+ * @private
+ */
+goog.Timer.prototype.tick_ = function() {
+ if (this.enabled) {
+ var elapsed = goog.now() - this.last_;
+ if (elapsed > 0 &&
+ elapsed < this.interval_ * goog.Timer.intervalScale) {
+ this.timer_ = this.timerObject_.setTimeout(this.boundTick_,
+ this.interval_ - elapsed);
+ return;
+ }
+
+ // Prevents setInterval from registering a duplicate timeout when called
+ // in the timer event handler.
+ if (this.timer_) {
+ this.timerObject_.clearTimeout(this.timer_);
+ this.timer_ = null;
+ }
+
+ this.dispatchTick();
+ // The timer could be stopped in the timer event handler.
+ if (this.enabled) {
+ this.timer_ = this.timerObject_.setTimeout(this.boundTick_,
+ this.interval_);
+ this.last_ = goog.now();
+ }
+ }
+};
+
+
+/**
+ * Dispatches the TICK event. This is its own method so subclasses can override.
+ */
+goog.Timer.prototype.dispatchTick = function() {
+ this.dispatchEvent(goog.Timer.TICK);
+};
+
+
+/**
+ * Starts the timer.
+ */
+goog.Timer.prototype.start = function() {
+ this.enabled = true;
+
+ // If there is no interval already registered, start it now
+ if (!this.timer_) {
+ // IMPORTANT!
+ // window.setInterval in FireFox has a bug - it fires based on
+ // absolute time, rather than on relative time. What this means
+ // is that if a computer is sleeping/hibernating for 24 hours
+ // and the timer interval was configured to fire every 1000ms,
+ // then after the PC wakes up the timer will fire, in rapid
+ // succession, 3600*24 times.
+ // This bug is described here and is already fixed, but it will
+ // take time to propagate, so for now I am switching this over
+ // to setTimeout logic.
+ // https://bugzilla.mozilla.org/show_bug.cgi?id=376643
+ //
+ this.timer_ = this.timerObject_.setTimeout(this.boundTick_,
+ this.interval_);
+ this.last_ = goog.now();
+ }
+};
+
+
+/**
+ * Stops the timer.
+ */
+goog.Timer.prototype.stop = function() {
+ this.enabled = false;
+ if (this.timer_) {
+ this.timerObject_.clearTimeout(this.timer_);
+ this.timer_ = null;
+ }
+};
+
+
+/** @override */
+goog.Timer.prototype.disposeInternal = function() {
+ goog.Timer.superClass_.disposeInternal.call(this);
+ this.stop();
+ delete this.timerObject_;
+};
+
+
+/**
+ * Constant for the timer's event type
+ * @type {string}
+ */
+goog.Timer.TICK = 'tick';
+
+
+/**
+ * Calls the given function once, after the optional pause.
+ *
+ * The function is always called asynchronously, even if the delay is 0. This
+ * is a common trick to schedule a function to run after a batch of browser
+ * event processing.
+ *
+ * @param {function(this:SCOPE)|{handleEvent:function()}|null} listener Function
+ * or object that has a handleEvent method.
+ * @param {number=} opt_delay Milliseconds to wait; default is 0.
+ * @param {SCOPE=} opt_handler Object in whose scope to call the listener.
+ * @return {number} A handle to the timer ID.
+ * @template SCOPE
+ */
+goog.Timer.callOnce = function(listener, opt_delay, opt_handler) {
+ if (goog.isFunction(listener)) {
+ if (opt_handler) {
+ listener = goog.bind(listener, opt_handler);
+ }
+ } else if (listener && typeof listener.handleEvent == 'function') {
+ // using typeof to prevent strict js warning
+ listener = goog.bind(listener.handleEvent, listener);
+ } else {
+ throw Error('Invalid listener argument');
+ }
+
+ if (opt_delay > goog.Timer.MAX_TIMEOUT_) {
+ // Timeouts greater than MAX_INT return immediately due to integer
+ // overflow in many browsers. Since MAX_INT is 24.8 days, just don't
+ // schedule anything at all.
+ return -1;
+ } else {
+ return goog.Timer.defaultTimerObject.setTimeout(
+ listener, opt_delay || 0);
+ }
+};
+
+
+/**
+ * Clears a timeout initiated by callOnce
+ * @param {?number} timerId a timer ID.
+ */
+goog.Timer.clear = function(timerId) {
+ goog.Timer.defaultTimerObject.clearTimeout(timerId);
+};

Powered by Google App Engine
This is Rietveld 408576698