aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.eslintrc.json1
-rw-r--r--ext/mixed/js/core.js28
2 files changed, 29 insertions, 0 deletions
diff --git a/.eslintrc.json b/.eslintrc.json
index 663e9003..558fd928 100644
--- a/.eslintrc.json
+++ b/.eslintrc.json
@@ -108,6 +108,7 @@
"deferPromise": "readonly",
"clone": "readonly",
"generateId": "readonly",
+ "promiseAnimationFrame": "readonly",
"DynamicProperty": "readonly",
"EventDispatcher": "readonly",
"EventListenerCollection": "readonly"
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