Backed out changeset 489046125fa6 (bug 897683) due to Ubuntu debug Jetpack perma-orange.
This commit is contained in:
@@ -7,31 +7,22 @@ module.metadata = {
|
||||
"stability": "stable"
|
||||
};
|
||||
|
||||
const { CC, Cc, Ci } = require("chrome");
|
||||
const { when: unload } = require("./system/unload");
|
||||
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 Timer = CC('@mozilla.org/timer;1', 'nsITimer');
|
||||
const timers = Object.create(null);
|
||||
const threadManager = Cc["@mozilla.org/thread-manager;1"].
|
||||
getService(Ci.nsIThreadManager);
|
||||
const prefBranch = Cc["@mozilla.org/preferences-service;1"].
|
||||
getService(Ci.nsIPrefService).
|
||||
QueryInterface(Ci.nsIPrefBranch);
|
||||
|
||||
let MIN_DELAY = 4;
|
||||
// Try to get min timeout delay used by browser.
|
||||
try { MIN_DELAY = prefBranch.getIntPref("dom.min_timeout_value"); } finally {}
|
||||
|
||||
|
||||
// Last timer id.
|
||||
let lastID = 0;
|
||||
|
||||
// Sets typer either by timeout or by interval
|
||||
// depending on a given type.
|
||||
function setTimer(type, callback, delay, ...args) {
|
||||
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 {
|
||||
@@ -43,63 +34,20 @@ function setTimer(type, callback, delay, ...args) {
|
||||
console.exception(error);
|
||||
}
|
||||
}
|
||||
}, Math.max(delay || MIN_DELAY), type);
|
||||
}, delay || 0, type);
|
||||
return id;
|
||||
}
|
||||
|
||||
function unsetTimer(id) {
|
||||
let timer = timers[id];
|
||||
delete timers[id];
|
||||
if (timer) timer.cancel();
|
||||
if (timer)
|
||||
timer.cancel();
|
||||
}
|
||||
|
||||
let immediates = new Map();
|
||||
|
||||
let dispatcher = _ => {
|
||||
// Allow scheduling of a new dispatch loop.
|
||||
dispatcher.scheduled = false;
|
||||
// Take a snapshot of timer `id`'s that have being present before
|
||||
// starting a dispatch loop, in order to ignore timers registered
|
||||
// in side effect to dispatch while also skipping immediates that
|
||||
// were removed in side effect.
|
||||
let ids = [id for ([id] of immediates)];
|
||||
for (let id of ids) {
|
||||
let immediate = immediates.get(id);
|
||||
if (immediate) {
|
||||
immediates.delete(id);
|
||||
try { immediate(); }
|
||||
catch (error) { console.exception(error); }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function setImmediate(callback, ...params) {
|
||||
let id = ++ lastID;
|
||||
// register new immediate timer with curried params.
|
||||
immediates.set(id, _ => callback.apply(callback, params));
|
||||
// if dispatch loop is not scheduled schedule one. Own scheduler
|
||||
if (!dispatcher.scheduled) {
|
||||
dispatcher.scheduled = true;
|
||||
threadManager.currentThread.dispatch(dispatcher,
|
||||
Ci.nsIThread.DISPATCH_NORMAL);
|
||||
}
|
||||
return id;
|
||||
}
|
||||
|
||||
function clearImmediate(id) {
|
||||
immediates.delete(id);
|
||||
}
|
||||
|
||||
// Bind timers so that toString-ing them looks same as on native timers.
|
||||
exports.setImmediate = setImmediate.bind(null);
|
||||
exports.clearImmediate = clearImmediate.bind(null);
|
||||
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);
|
||||
|
||||
// all timers are cleared out on unload.
|
||||
unload(function() {
|
||||
immediates.clear();
|
||||
Object.keys(timers).forEach(unsetTimer)
|
||||
});
|
||||
unload(function() { Object.keys(timers).forEach(unsetTimer) });
|
||||
|
||||
Reference in New Issue
Block a user