Bug 731779: Integrate the Add-on SDK loader and API libraries into Firefox (uplifting from addon-sdk a16bbd5772880b578a939eeb65102bca6560d494)
This commit is contained in:
53
addon-sdk/source/lib/sdk/timers.js
Normal file
53
addon-sdk/source/lib/sdk/timers.js
Normal file
@@ -0,0 +1,53 @@
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
'use strict';
|
||||
|
||||
module.metadata = {
|
||||
"stability": "stable"
|
||||
};
|
||||
|
||||
const { CC, Ci } = require('chrome');
|
||||
const { when: unload } = require('./system/unload');
|
||||
|
||||
const { TYPE_ONE_SHOT, TYPE_REPEATING_SLACK } = Ci.nsITimer;
|
||||
const Timer = CC('@mozilla.org/timer;1', 'nsITimer');
|
||||
const timers = Object.create(null);
|
||||
|
||||
// Last timer id.
|
||||
let lastID = 0;
|
||||
|
||||
// Sets typer either by timeout or by interval
|
||||
// depending on a given type.
|
||||
function setTimer(type, callback, delay) {
|
||||
let id = ++ lastID;
|
||||
let timer = timers[id] = Timer();
|
||||
let args = Array.slice(arguments, 3);
|
||||
timer.initWithCallback({
|
||||
notify: function notify() {
|
||||
try {
|
||||
if (type === TYPE_ONE_SHOT)
|
||||
delete timers[id];
|
||||
callback.apply(null, args);
|
||||
}
|
||||
catch(error) {
|
||||
console.exception(error);
|
||||
}
|
||||
}
|
||||
}, delay || 0, type);
|
||||
return id;
|
||||
}
|
||||
|
||||
function unsetTimer(id) {
|
||||
let timer = timers[id];
|
||||
delete timers[id];
|
||||
if (timer)
|
||||
timer.cancel();
|
||||
}
|
||||
|
||||
exports.setTimeout = setTimer.bind(null, TYPE_ONE_SHOT);
|
||||
exports.setInterval = setTimer.bind(null, TYPE_REPEATING_SLACK);
|
||||
exports.clearTimeout = unsetTimer.bind(null);
|
||||
exports.clearInterval = unsetTimer.bind(null);
|
||||
|
||||
unload(function() { Object.keys(timers).forEach(unsetTimer) });
|
||||
Reference in New Issue
Block a user