aboutsummaryrefslogtreecommitdiff
path: root/ext/mixed/js
diff options
context:
space:
mode:
Diffstat (limited to 'ext/mixed/js')
-rw-r--r--ext/mixed/js/core.js28
1 files changed, 28 insertions, 0 deletions
diff --git a/ext/mixed/js/core.js b/ext/mixed/js/core.js
index 5bee4670..c5c6fef2 100644
--- a/ext/mixed/js/core.js
+++ b/ext/mixed/js/core.js
@@ -258,6 +258,34 @@ function promiseTimeout(delay, resolveValue) {
return promise;
}
+function promiseAnimationFrame(timeout=null) {
+ return new Promise((resolve) => {
+ let timer = null;
+ let frameRequest = null;
+ const onFrame = (time) => {
+ frameRequest = null;
+ if (timer !== null) {
+ clearTimeout(timer);
+ timer = null;
+ }
+ resolve({time, timeout: false});
+ };
+ const onTimeout = () => {
+ timer = null;
+ if (frameRequest !== null) {
+ cancelAnimationFrame(frameRequest);
+ frameRequest = null;
+ }
+ resolve({time: timeout, timeout: true});
+ };
+
+ frameRequest = requestAnimationFrame(onFrame);
+ if (typeof timeout === 'number') {
+ timer = setTimeout(onTimeout, timeout);
+ }
+ });
+}
+
/*
* Common classes