export function setupDocumentReadyState( document: Document, Event: typeof Event, ) { let readyState: 0 | 1 | 2 = 0; Object.defineProperty(document, 'readyState', { get() { switch (readyState) { case 0: return 'loading'; case 1: return 'interactive'; case 2: return 'complete'; } }, set(value) { if (value === 'interactive' && readyState < 1) { readyState = 1; document.dispatchEvent(new Event('readystatechange')); } else if (value === 'complete' && readyState < 2) { readyState = 2; document.dispatchEvent(new Event('readystatechange')); document.dispatchEvent(new Event('DOMContentLoaded')); } else if (value === 'loading') { // We allow resetting the readyState to loading mostly for pragamtism. // tests that use this environment don't reset the document between tests. readyState = 0; } }, configurable: true, }); }