1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
|
// Copyright 2014 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.
/**
* @constructor
* @param {number} timeout
*/
WebInspector.Throttler = function(timeout)
{
this._timeout = timeout;
this._isRunningProcess = false;
this._asSoonAsPossible = false;
/** @type {?function(!WebInspector.Throttler.FinishCallback)} */
this._process = null;
}
WebInspector.Throttler.prototype = {
_processCompleted: function()
{
this._isRunningProcess = false;
if (this._process)
this._innerSchedule(false);
this._processCompletedForTests();
},
_processCompletedForTests: function()
{
// For sniffing in tests.
},
_onTimeout: function()
{
delete this._processTimeout;
this._asSoonAsPossible = false;
this._isRunningProcess = true;
// Process might issue synchronous calls to this throttler.
var process = this._process;
this._process = null;
process(this._processCompleted.bind(this));
},
/**
* @param {function(!WebInspector.Throttler.FinishCallback)} process
* @param {boolean=} asSoonAsPossible
*/
schedule: function(process, asSoonAsPossible)
{
// Deliberately skip previous process.
this._process = process;
// Run the first scheduled task instantly.
var hasScheduledTasks = !!this._processTimeout || this._isRunningProcess;
asSoonAsPossible = !!asSoonAsPossible || !hasScheduledTasks;
var forceTimerUpdate = asSoonAsPossible && !this._asSoonAsPossible;
this._asSoonAsPossible = this._asSoonAsPossible || asSoonAsPossible;
this._innerSchedule(forceTimerUpdate);
},
/**
* @param {boolean} forceTimerUpdate
*/
_innerSchedule: function(forceTimerUpdate)
{
if (this._isRunningProcess)
return;
if (this._processTimeout && !forceTimerUpdate)
return;
if (this._processTimeout)
this._clearTimeout(this._processTimeout);
var timeout = this._asSoonAsPossible ? 0 : this._timeout;
this._processTimeout = this._setTimeout(this._onTimeout.bind(this), timeout);
},
/**
* @param {number} timeoutId
*/
_clearTimeout: function(timeoutId)
{
clearTimeout(timeoutId);
},
/**
* @param {function()} operation
* @param {number} timeout
* @return {number}
*/
_setTimeout: function(operation, timeout)
{
return setTimeout(operation, timeout);
}
}
/** @typedef {function()} */
WebInspector.Throttler.FinishCallback;
|