89 lines
2.7 KiB
JavaScript
89 lines
2.7 KiB
JavaScript
/* Any copyright is dedicated to the Public Domain.
|
|
http://creativecommons.org/publicdomain/zero/1.0/ */
|
|
|
|
/**
|
|
* Tests UrlbarUtils.SkippableTimer
|
|
*/
|
|
|
|
"use strict";
|
|
|
|
let { SkippableTimer } = ChromeUtils.importESModule(
|
|
"resource:///modules/UrlbarUtils.sys.mjs"
|
|
);
|
|
const { setTimeout } = ChromeUtils.importESModule(
|
|
"resource://gre/modules/Timer.sys.mjs"
|
|
);
|
|
|
|
add_task(async function test_basic() {
|
|
let invoked = 0;
|
|
let deferred = Promise.withResolvers();
|
|
let timer = new SkippableTimer({
|
|
name: "test 1",
|
|
callback: () => {
|
|
invoked++;
|
|
deferred.resolve();
|
|
},
|
|
time: 50,
|
|
});
|
|
Assert.equal(timer.name, "test 1", "Timer should have the correct name");
|
|
Assert.ok(!timer.done, "Should not be done");
|
|
Assert.equal(invoked, 0, "Should not have invoked the callback yet");
|
|
await deferred.promise;
|
|
Assert.ok(timer.done, "Should be done");
|
|
Assert.equal(invoked, 1, "Should have invoked the callback");
|
|
});
|
|
|
|
add_task(async function test_fire() {
|
|
let longTimeMs = 1000;
|
|
let invoked = 0;
|
|
let deferred = Promise.withResolvers();
|
|
let timer = new SkippableTimer({
|
|
name: "test 1",
|
|
callback: () => {
|
|
invoked++;
|
|
deferred.resolve();
|
|
},
|
|
time: longTimeMs,
|
|
});
|
|
let start = Cu.now();
|
|
Assert.equal(timer.name, "test 1", "Timer should have the correct name");
|
|
Assert.ok(!timer.done, "Should not be done");
|
|
Assert.equal(invoked, 0, "Should not have invoked the callback yet");
|
|
// Call fire() many times to also verify the callback is invoked just once.
|
|
timer.fire();
|
|
timer.fire();
|
|
timer.fire();
|
|
Assert.ok(timer.done, "Should be done");
|
|
await deferred.promise;
|
|
Assert.greater(longTimeMs, Cu.now() - start, "Should have resolved earlier");
|
|
Assert.equal(invoked, 1, "Should have invoked the callback");
|
|
});
|
|
|
|
add_task(async function test_cancel() {
|
|
let timeMs = 50;
|
|
let invoked = 0;
|
|
let deferred = Promise.withResolvers();
|
|
let timer = new SkippableTimer({
|
|
name: "test 1",
|
|
callback: () => {
|
|
invoked++;
|
|
deferred.resolve();
|
|
},
|
|
time: timeMs,
|
|
});
|
|
let start = Cu.now();
|
|
Assert.equal(timer.name, "test 1", "Timer should have the correct name");
|
|
Assert.ok(!timer.done, "Should not be done");
|
|
Assert.equal(invoked, 0, "Should not have invoked the callback yet");
|
|
// Calling cancel many times shouldn't rise any error.
|
|
timer.cancel();
|
|
timer.cancel();
|
|
Assert.ok(timer.done, "Should be done");
|
|
await Promise.race([
|
|
deferred.promise,
|
|
// eslint-disable-next-line mozilla/no-arbitrary-setTimeout
|
|
new Promise(r => setTimeout(r, timeMs * 4)),
|
|
]);
|
|
Assert.greater(Cu.now() - start, timeMs, "Should not have resolved earlier");
|
|
Assert.equal(invoked, 0, "Should not have invoked the callback");
|
|
});
|