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

Unified Diff: ui/file_manager/file_manager/common/js/async_util.js

Issue 645853013: Remove some platform specific stuff from views. (Closed) Base URL: https://github.com/domokit/mojo.git@master
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: ui/file_manager/file_manager/common/js/async_util.js
diff --git a/ui/file_manager/file_manager/common/js/async_util.js b/ui/file_manager/file_manager/common/js/async_util.js
deleted file mode 100644
index dcd03e3b56736d0c711cca816cfc4e320f20a01f..0000000000000000000000000000000000000000
--- a/ui/file_manager/file_manager/common/js/async_util.js
+++ /dev/null
@@ -1,416 +0,0 @@
-// Copyright (c) 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-'use strict';
-
-/**
- * Namespace for async utility functions.
- */
-var AsyncUtil = {};
-
-/**
- * Asynchronous version of Array.forEach.
- * This executes a provided function callback once per array element, then
- * run completionCallback to notify the completion.
- * The callback can be an asynchronous function, but the execution is
- * sequentially done.
- *
- * @param {Array.<T>} array The array to be iterated.
- * @param {function(function(), T, number, Array.<T>)} callback The iteration
- * callback. The first argument is a callback to notify the completion of
- * the iteration.
- * @param {function()} completionCallback Called when all iterations are
- * completed.
- * @param {Object=} opt_thisObject Bound to callback if given.
- * @template T
- */
-AsyncUtil.forEach = function(
- array, callback, completionCallback, opt_thisObject) {
- if (opt_thisObject)
- callback = callback.bind(opt_thisObject);
-
- var queue = new AsyncUtil.Queue();
- for (var i = 0; i < array.length; i++) {
- queue.run(function(element, index, iterationCompletionCallback) {
- callback(iterationCompletionCallback, element, index, array);
- }.bind(null, array[i], i));
- }
- queue.run(function(iterationCompletionCallback) {
- completionCallback(); // Don't pass iteration completion callback.
- });
-};
-
-/**
- * Creates a class for executing several asynchronous closures in a fifo queue.
- * Added tasks will be started in order they were added. Tasks are run
- * concurrently. At most, |limit| jobs will be run at the same time.
- *
- * @param {number} limit The number of jobs to run at the same time.
- * @constructor
- */
-AsyncUtil.ConcurrentQueue = function(limit) {
- console.assert(limit > 0, '|limit| must be larger than 0');
-
- this.limit_ = limit;
- this.addedTasks_ = [];
- this.pendingTasks_ = [];
- this.isCancelled_ = false;
-
- Object.seal(this);
-};
-
-/**
- * @return {boolean} True when a task is running, otherwise false.
- */
-AsyncUtil.ConcurrentQueue.prototype.isRunning = function() {
- return this.pendingTasks_.length !== 0;
-};
-
-/**
- * @return {number} Number of waiting tasks.
- */
-AsyncUtil.ConcurrentQueue.prototype.getWaitingTasksCount = function() {
- return this.addedTasks_.length;
-};
-
-/**
- * @return {number} Number of running tasks.
- */
-AsyncUtil.ConcurrentQueue.prototype.getRunningTasksCount = function() {
- return this.pendingTasks_.length;
-};
-
-/**
- * Enqueues a closure to be executed.
- * @param {function(function())} closure Closure with a completion
- * callback to be executed.
- */
-AsyncUtil.ConcurrentQueue.prototype.run = function(closure) {
- if (this.isCancelled_) {
- console.error('Queue is calcelled. Cannot add a new task.');
- return;
- }
-
- this.addedTasks_.push(closure);
- this.continue_();
-};
-
-/**
- * Cancels the queue. It removes all the not-run (yet) tasks. Note that this
- * does NOT stop tasks currently running.
- */
-AsyncUtil.ConcurrentQueue.prototype.cancel = function() {
- this.isCancelled_ = true;
- this.addedTasks_ = [];
-};
-
-/**
- * @return {boolean} True when the queue have been requested to cancel or is
- * already cancelled. Otherwise false.
- */
-AsyncUtil.ConcurrentQueue.prototype.isCancelled = function() {
- return this.isCancelled_;
-};
-
-/**
- * Runs the next tasks if available.
- * @private
- */
-AsyncUtil.ConcurrentQueue.prototype.continue_ = function() {
- if (this.addedTasks_.length === 0)
- return;
-
- console.assert(
- this.pendingTasks_.length <= this.limit_,
- 'Too many jobs are running (' + this.pendingTasks_.length + ')');
-
- if (this.pendingTasks_.length >= this.limit_)
- return;
-
- // Run the next closure.
- var closure = this.addedTasks_.shift();
- this.pendingTasks_.push(closure);
- closure(this.onTaskFinished_.bind(this, closure));
-
- this.continue_();
-};
-
-/**
- * Called when a task is finished. Removes the tasks from pending task list.
- * @param {function()} closure Finished task, which has been bound in
- * |continue_|.
- * @private
- */
-AsyncUtil.ConcurrentQueue.prototype.onTaskFinished_ = function(closure) {
- var index = this.pendingTasks_.indexOf(closure);
- console.assert(index >= 0, 'Invalid task is finished');
- this.pendingTasks_.splice(index, 1);
-
- this.continue_();
-};
-
-/**
- * Creates a class for executing several asynchronous closures in a fifo queue.
- * Added tasks will be executed sequentially in order they were added.
- *
- * @constructor
- * @extends {AsyncUtil.ConcurrentQueue}
- */
-AsyncUtil.Queue = function() {
- AsyncUtil.ConcurrentQueue.call(this, 1);
-};
-
-AsyncUtil.Queue.prototype = {
- __proto__: AsyncUtil.ConcurrentQueue.prototype
-};
-
-/**
- * Creates a class for executing several asynchronous closures in a group in
- * a dependency order.
- *
- * @constructor
- */
-AsyncUtil.Group = function() {
- this.addedTasks_ = {};
- this.pendingTasks_ = {};
- this.finishedTasks_ = {};
- this.completionCallbacks_ = [];
-};
-
-/**
- * Enqueues a closure to be executed after dependencies are completed.
- *
- * @param {function(function())} closure Closure with a completion callback to
- * be executed.
- * @param {Array.<string>=} opt_dependencies Array of dependencies. If no
- * dependencies, then the the closure will be executed immediately.
- * @param {string=} opt_name Task identifier. Specify to use in dependencies.
- */
-AsyncUtil.Group.prototype.add = function(closure, opt_dependencies, opt_name) {
- var length = Object.keys(this.addedTasks_).length;
- var name = opt_name || ('(unnamed#' + (length + 1) + ')');
-
- var task = {
- closure: closure,
- dependencies: opt_dependencies || [],
- name: name
- };
-
- this.addedTasks_[name] = task;
- this.pendingTasks_[name] = task;
-};
-
-/**
- * Runs the enqueued closured in order of dependencies.
- *
- * @param {function()=} opt_onCompletion Completion callback.
- */
-AsyncUtil.Group.prototype.run = function(opt_onCompletion) {
- if (opt_onCompletion)
- this.completionCallbacks_.push(opt_onCompletion);
- this.continue_();
-};
-
-/**
- * Runs enqueued pending tasks whose dependencies are completed.
- * @private
- */
-AsyncUtil.Group.prototype.continue_ = function() {
- // If all of the added tasks have finished, then call completion callbacks.
- if (Object.keys(this.addedTasks_).length ==
- Object.keys(this.finishedTasks_).length) {
- for (var index = 0; index < this.completionCallbacks_.length; index++) {
- var callback = this.completionCallbacks_[index];
- callback();
- }
- this.completionCallbacks_ = [];
- return;
- }
-
- for (var name in this.pendingTasks_) {
- var task = this.pendingTasks_[name];
- var dependencyMissing = false;
- for (var index = 0; index < task.dependencies.length; index++) {
- var dependency = task.dependencies[index];
- // Check if the dependency has finished.
- if (!this.finishedTasks_[dependency])
- dependencyMissing = true;
- }
- // All dependences finished, therefore start the task.
- if (!dependencyMissing) {
- delete this.pendingTasks_[task.name];
- task.closure(this.finish_.bind(this, task));
- }
- }
-};
-
-/**
- * Finishes the passed task and continues executing enqueued closures.
- *
- * @param {Object} task Task object.
- * @private
- */
-AsyncUtil.Group.prototype.finish_ = function(task) {
- this.finishedTasks_[task.name] = task;
- this.continue_();
-};
-
-/**
- * Aggregates consecutive calls and executes the closure only once instead of
- * several times. The first call is always called immediately, and the next
- * consecutive ones are aggregated and the closure is called only once once
- * |delay| amount of time passes after the last call to run().
- *
- * @param {function()} closure Closure to be aggregated.
- * @param {number=} opt_delay Minimum aggregation time in milliseconds. Default
- * is 50 milliseconds.
- * @constructor
- */
-AsyncUtil.Aggregator = function(closure, opt_delay) {
- /**
- * @type {number}
- * @private
- */
- this.delay_ = opt_delay || 50;
-
- /**
- * @type {function()}
- * @private
- */
- this.closure_ = closure;
-
- /**
- * @type {number?}
- * @private
- */
- this.scheduledRunsTimer_ = null;
-
- /**
- * @type {number}
- * @private
- */
- this.lastRunTime_ = 0;
-};
-
-/**
- * Runs a closure. Skips consecutive calls. The first call is called
- * immediately.
- */
-AsyncUtil.Aggregator.prototype.run = function() {
- // If recently called, then schedule the consecutive call with a delay.
- if (Date.now() - this.lastRunTime_ < this.delay_) {
- this.cancelScheduledRuns_();
- this.scheduledRunsTimer_ = setTimeout(this.runImmediately_.bind(this),
- this.delay_ + 1);
- this.lastRunTime_ = Date.now();
- return;
- }
-
- // Otherwise, run immediately.
- this.runImmediately_();
-};
-
-/**
- * Calls the schedule immediately and cancels any scheduled calls.
- * @private
- */
-AsyncUtil.Aggregator.prototype.runImmediately_ = function() {
- this.cancelScheduledRuns_();
- this.closure_();
- this.lastRunTime_ = Date.now();
-};
-
-/**
- * Cancels all scheduled runs (if any).
- * @private
- */
-AsyncUtil.Aggregator.prototype.cancelScheduledRuns_ = function() {
- if (this.scheduledRunsTimer_) {
- clearTimeout(this.scheduledRunsTimer_);
- this.scheduledRunsTimer_ = null;
- }
-};
-
-/**
- * Samples calls so that they are not called too frequently.
- * The first call is always called immediately, and the following calls may
- * be skipped or delayed to keep each interval no less than |minInterval_|.
- *
- * @param {function()} closure Closure to be called.
- * @param {number=} opt_minInterval Minimum interval between each call in
- * milliseconds. Default is 200 milliseconds.
- * @constructor
- */
-AsyncUtil.RateLimiter = function(closure, opt_minInterval) {
- /**
- * @type {function()}
- * @private
- */
- this.closure_ = closure;
-
- /**
- * @type {number}
- * @private
- */
- this.minInterval_ = opt_minInterval || 200;
-
- /**
- * @type {number}
- * @private
- */
- this.scheduledRunsTimer_ = 0;
-
- /**
- * This variable remembers the last time the closure is called.
- * @type {number}
- * @private
- */
- this.lastRunTime_ = 0;
-
- Object.seal(this);
-};
-
-/**
- * Requests to run the closure.
- * Skips or delays calls so that the intervals between calls are no less than
- * |minInteval_| milliseconds.
- */
-AsyncUtil.RateLimiter.prototype.run = function() {
- var now = Date.now();
- // If |minInterval| has not passed since the closure is run, skips or delays
- // this run.
- if (now - this.lastRunTime_ < this.minInterval_) {
- // Delays this run only when there is no scheduled run.
- // Otherwise, simply skip this run.
- if (!this.scheduledRunsTimer_) {
- this.scheduledRunsTimer_ = setTimeout(
- this.runImmediately.bind(this),
- this.lastRunTime_ + this.minInterval_ - now);
- }
- return;
- }
-
- // Otherwise, run immediately
- this.runImmediately();
-};
-
-/**
- * Calls the scheduled run immediately and cancels any scheduled calls.
- */
-AsyncUtil.RateLimiter.prototype.runImmediately = function() {
- this.cancelScheduledRuns_();
- this.closure_();
- this.lastRunTime_ = Date.now();
-};
-
-/**
- * Cancels all scheduled runs (if any).
- * @private
- */
-AsyncUtil.RateLimiter.prototype.cancelScheduledRuns_ = function() {
- if (this.scheduledRunsTimer_) {
- clearTimeout(this.scheduledRunsTimer_);
- this.scheduledRunsTimer_ = 0;
- }
-};
« no previous file with comments | « ui/file_manager/file_manager/common/images/icon96.png ('k') | ui/file_manager/file_manager/common/js/error_util.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698