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:
Henrik Skupin 2019-01-09 18:24:06 +00:00
parent b0f2aca7f3
commit 3664921097
3 changed files with 37 additions and 32 deletions

View File

@ -3584,5 +3584,5 @@ function restoreWindow(window) {
} else {
reject();
}
});
}, {timeout: 2000});
}

View File

@ -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);

View File

@ -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);
});