// Responds to onmessage events from other frames to check for pending input. onmessage = async e => { if (e.data !== 'check-input') return; const discreteOptions = { includeContinuous: false }; const continuousOptions = { includeContinuous: true }; // Use a reasonable time to wait after dispatching events, since we want to be // able to test for cases where isInputPending returns false. const DISPATCH_WAIT_TIME_MS = 500; // Wait a reasonable amount of time for the event to be enqueued. const end = performance.now() + DISPATCH_WAIT_TIME_MS; let hasDiscrete; let hasContinuous; do { hasDiscrete = navigator.scheduling.isInputPending(discreteOptions); hasContinuous = navigator.scheduling.isInputPending(continuousOptions); } while (performance.now() < end && !(hasDiscrete && hasContinuous)); e.source.postMessage({ discrete: hasDiscrete, continuous: hasContinuous, }, '*'); }