mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-22 09:45:41 +00:00
Bug 1504756 - [marionette] Remove default timeout from PollPromise. r=ato
By default PollPromise has to behave similar to a normal Promise and wait forever until it gets resolved or rejected. Depends on D13662 Differential Revision: https://phabricator.services.mozilla.com/D15907 --HG-- extra : moz-landing-system : lando
This commit is contained in:
parent
b0f2aca7f3
commit
3664921097
@ -3584,5 +3584,5 @@ function restoreWindow(window) {
|
||||
} else {
|
||||
reject();
|
||||
}
|
||||
});
|
||||
}, {timeout: 2000});
|
||||
}
|
||||
|
@ -92,14 +92,14 @@ function executeSoon(func) {
|
||||
* } else {
|
||||
* reject([]);
|
||||
* }
|
||||
* });
|
||||
* }, {timeout: 1000});
|
||||
*
|
||||
* @param {Condition} func
|
||||
* Function to run off the main thread.
|
||||
* @param {number=} [timeout=2000] timeout
|
||||
* Desired timeout. If 0 or less than the runtime evaluation
|
||||
* @param {number=} [timeout] timeout
|
||||
* Desired timeout if wanted. If 0 or less than the runtime evaluation
|
||||
* time of ``func``, ``func`` is guaranteed to run at least once.
|
||||
* The default is 2000 milliseconds.
|
||||
* Defaults to using no timeout.
|
||||
* @param {number=} [interval=10] interval
|
||||
* Duration between each poll of ``func`` in milliseconds.
|
||||
* Defaults to 10 milliseconds.
|
||||
@ -115,23 +115,30 @@ function executeSoon(func) {
|
||||
* @throws {RangeError}
|
||||
* If `timeout` or `interval` are not unsigned integers.
|
||||
*/
|
||||
function PollPromise(func, {timeout = 2000, interval = 10} = {}) {
|
||||
function PollPromise(func, {timeout = null, interval = 10} = {}) {
|
||||
const timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
|
||||
|
||||
if (typeof func != "function") {
|
||||
throw new TypeError();
|
||||
}
|
||||
if (!(typeof timeout == "number" && typeof interval == "number")) {
|
||||
if (timeout != null && typeof timeout != "number") {
|
||||
throw new TypeError();
|
||||
}
|
||||
if ((!Number.isInteger(timeout) || timeout < 0) ||
|
||||
if (typeof interval != "number") {
|
||||
throw new TypeError();
|
||||
}
|
||||
if ((timeout && (!Number.isInteger(timeout) || timeout < 0)) ||
|
||||
(!Number.isInteger(interval) || interval < 0)) {
|
||||
throw new RangeError();
|
||||
}
|
||||
|
||||
return new Promise((resolve, reject) => {
|
||||
const start = new Date().getTime();
|
||||
const end = start + timeout;
|
||||
let start, end;
|
||||
|
||||
if (Number.isInteger(timeout)) {
|
||||
start = new Date().getTime();
|
||||
end = start + timeout;
|
||||
}
|
||||
|
||||
let evalFn = () => {
|
||||
new Promise(func).then(resolve, rejected => {
|
||||
@ -139,9 +146,10 @@ function PollPromise(func, {timeout = 2000, interval = 10} = {}) {
|
||||
throw rejected;
|
||||
}
|
||||
|
||||
// return if timeout is 0, allowing |func| to be evaluated at
|
||||
// least once
|
||||
if (start == end || new Date().getTime() >= end) {
|
||||
// return if there is a timeout and set to 0,
|
||||
// allowing |func| to be evaluated at least once
|
||||
if (typeof end != "undefined" &&
|
||||
(start == end || new Date().getTime() >= end)) {
|
||||
resolve(rejected);
|
||||
}
|
||||
}).catch(reject);
|
||||
|
@ -15,8 +15,6 @@ const {
|
||||
waitForObserverTopic,
|
||||
} = ChromeUtils.import("chrome://marionette/content/sync.js", {});
|
||||
|
||||
const DEFAULT_TIMEOUT = 2000;
|
||||
|
||||
/**
|
||||
* Mimic a DOM node for listening for events.
|
||||
*/
|
||||
@ -140,13 +138,15 @@ add_test(function test_PollPromise_funcTypes() {
|
||||
});
|
||||
|
||||
add_test(function test_PollPromise_timeoutTypes() {
|
||||
for (let timeout of ["foo", null, true, [], {}]) {
|
||||
for (let timeout of ["foo", true, [], {}]) {
|
||||
Assert.throws(() => new PollPromise(() => {}, {timeout}), /TypeError/);
|
||||
}
|
||||
for (let timeout of [1.2, -1]) {
|
||||
Assert.throws(() => new PollPromise(() => {}, {timeout}), /RangeError/);
|
||||
}
|
||||
new PollPromise(() => {}, {timeout: 42});
|
||||
for (let timeout of [null, undefined, 42]) {
|
||||
new PollPromise(resolve => resolve(1), {timeout});
|
||||
}
|
||||
|
||||
run_next_test();
|
||||
});
|
||||
@ -169,18 +169,6 @@ add_task(async function test_PollPromise_retvalTypes() {
|
||||
}
|
||||
});
|
||||
|
||||
add_task(async function test_PollPromise_timeoutElapse() {
|
||||
let nevals = 0;
|
||||
let start = new Date().getTime();
|
||||
await new PollPromise((resolve, reject) => {
|
||||
++nevals;
|
||||
reject();
|
||||
});
|
||||
let end = new Date().getTime();
|
||||
greaterOrEqual((end - start), DEFAULT_TIMEOUT);
|
||||
greaterOrEqual(nevals, 15);
|
||||
});
|
||||
|
||||
add_task(async function test_PollPromise_rethrowError() {
|
||||
let nevals = 0;
|
||||
let err;
|
||||
@ -197,6 +185,15 @@ add_task(async function test_PollPromise_rethrowError() {
|
||||
});
|
||||
|
||||
add_task(async function test_PollPromise_noTimeout() {
|
||||
let nevals = 0;
|
||||
await new PollPromise((resolve, reject) => {
|
||||
++nevals;
|
||||
nevals < 100 ? reject() : resolve();
|
||||
});
|
||||
equal(100, nevals);
|
||||
});
|
||||
|
||||
add_task(async function test_PollPromise_zeroTimeout() {
|
||||
// run at least once when timeout is 0
|
||||
let nevals = 0;
|
||||
let start = new Date().getTime();
|
||||
@ -206,10 +203,10 @@ add_task(async function test_PollPromise_noTimeout() {
|
||||
}, {timeout: 0});
|
||||
let end = new Date().getTime();
|
||||
equal(1, nevals);
|
||||
less((end - start), DEFAULT_TIMEOUT);
|
||||
less((end - start), 500);
|
||||
});
|
||||
|
||||
add_task(async function test_PollPromise_timeout() {
|
||||
add_task(async function test_PollPromise_timeoutElapse() {
|
||||
let nevals = 0;
|
||||
let start = new Date().getTime();
|
||||
await new PollPromise((resolve, reject) => {
|
||||
@ -217,7 +214,7 @@ add_task(async function test_PollPromise_timeout() {
|
||||
reject();
|
||||
}, {timeout: 100});
|
||||
let end = new Date().getTime();
|
||||
greater(nevals, 1);
|
||||
lessOrEqual(nevals, 10);
|
||||
greaterOrEqual((end - start), 100);
|
||||
});
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user