diff options
| -rw-r--r-- | .eslintrc.json | 1 | ||||
| -rw-r--r-- | ext/mixed/js/core.js | 28 | 
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 |