1234567891011121314151617181920212223242526272829303132333435363738394041424344 |
- import { Subscription } from '../Subscription';
- interface AnimationFrameProvider {
- schedule(callback: FrameRequestCallback): Subscription;
- requestAnimationFrame: typeof requestAnimationFrame;
- cancelAnimationFrame: typeof cancelAnimationFrame;
- delegate:
- | {
- requestAnimationFrame: typeof requestAnimationFrame;
- cancelAnimationFrame: typeof cancelAnimationFrame;
- }
- | undefined;
- }
- export const animationFrameProvider: AnimationFrameProvider = {
- // When accessing the delegate, use the variable rather than `this` so that
- // the functions can be called without being bound to the provider.
- schedule(callback) {
- let request = requestAnimationFrame;
- let cancel: typeof cancelAnimationFrame | undefined = cancelAnimationFrame;
- const { delegate } = animationFrameProvider;
- if (delegate) {
- request = delegate.requestAnimationFrame;
- cancel = delegate.cancelAnimationFrame;
- }
- const handle = request((timestamp) => {
- // Clear the cancel function. The request has been fulfilled, so
- // attempting to cancel the request upon unsubscription would be
- // pointless.
- cancel = undefined;
- callback(timestamp);
- });
- return new Subscription(() => cancel?.(handle));
- },
- requestAnimationFrame(...args) {
- const { delegate } = animationFrameProvider;
- return (delegate?.requestAnimationFrame || requestAnimationFrame)(...args);
- },
- cancelAnimationFrame(...args) {
- const { delegate } = animationFrameProvider;
- return (delegate?.cancelAnimationFrame || cancelAnimationFrame)(...args);
- },
- delegate: undefined,
- };
|