62 lines
1.8 KiB
JavaScript
62 lines
1.8 KiB
JavaScript
|
/* @odoo-module */
|
||
|
|
||
|
import { browser } from "@web/core/browser/browser";
|
||
|
import { uniqueId } from "@web/core/utils/functions";
|
||
|
import { patchWithCleanup } from "@web/../tests/helpers/utils";
|
||
|
|
||
|
/**
|
||
|
* Wait a task tick, so that anything in micro-task queue that can be processed
|
||
|
* is processed.
|
||
|
*/
|
||
|
async function nextTick() {
|
||
|
await new Promise(setTimeout);
|
||
|
}
|
||
|
|
||
|
export function getAdvanceTime() {
|
||
|
// list of timeout ids that have timed out.
|
||
|
let timedOutIds = [];
|
||
|
// key: timeoutId, value: func + remaining duration
|
||
|
const timeouts = new Map();
|
||
|
patchWithCleanup(browser, {
|
||
|
clearTimeout: (id) => {
|
||
|
timeouts.delete(id);
|
||
|
timedOutIds = timedOutIds.filter((i) => i !== id);
|
||
|
},
|
||
|
setTimeout: (func, duration) => {
|
||
|
const timeoutId = uniqueId("timeout_");
|
||
|
const timeout = {
|
||
|
id: timeoutId,
|
||
|
isTimedOut: false,
|
||
|
func,
|
||
|
duration,
|
||
|
};
|
||
|
timeouts.set(timeoutId, timeout);
|
||
|
if (duration === 0) {
|
||
|
timedOutIds.push(timeoutId);
|
||
|
timeout.isTimedOut = true;
|
||
|
}
|
||
|
return timeoutId;
|
||
|
},
|
||
|
});
|
||
|
return async function (duration) {
|
||
|
await nextTick();
|
||
|
for (const id of timeouts.keys()) {
|
||
|
const timeout = timeouts.get(id);
|
||
|
if (timeout.isTimedOut) {
|
||
|
continue;
|
||
|
}
|
||
|
timeout.duration = Math.max(timeout.duration - duration, 0);
|
||
|
if (timeout.duration === 0) {
|
||
|
timedOutIds.push(id);
|
||
|
}
|
||
|
}
|
||
|
while (timedOutIds.length > 0) {
|
||
|
const id = timedOutIds.shift();
|
||
|
const timeout = timeouts.get(id);
|
||
|
timeouts.delete(id);
|
||
|
timeout.func();
|
||
|
await nextTick();
|
||
|
}
|
||
|
};
|
||
|
}
|