window.createRecordingCloseWatcher = (t, events, name, type, parentWatcher) => { let watcher = null; if (type === 'dialog') { watcher = document.createElement('dialog'); watcher.textContent = 'hello world'; t.add_cleanup(() => watcher.remove()); if (parentWatcher?.appendChild) { parentWatcher.appendChild(watcher); } else { document.body.appendChild(watcher); } watcher.showModal(); } else if (type === 'popover') { watcher = document.createElement('div'); watcher.setAttribute('popover', 'auto'); watcher.textContent = 'hello world'; t.add_cleanup(() => watcher.remove()); if (parentWatcher?.appendChild) { parentWatcher.appendChild(watcher); } else { document.body.appendChild(watcher); } watcher.showPopover(); } else { watcher = new CloseWatcher(); t.add_cleanup(() => watcher.destroy()); } const prefix = name === undefined ? '' : name + ' '; watcher.addEventListener('cancel', e => { const cancelable = e.cancelable ? '[cancelable=true]' : '[cancelable=false]'; events.push(prefix + 'cancel' + cancelable); }); watcher.addEventListener('close', () => { events.push(prefix + 'close'); }); return watcher; }; window.createBlessedRecordingCloseWatcher = async (t, events, name, type, parentWatcher) => { await maybeTopLayerBless(parentWatcher); return createRecordingCloseWatcher(t, events, name, type, parentWatcher); }; window.destroyCloseWatcher = (watcher) => { if (watcher instanceof HTMLElement) { watcher.remove(); } else { watcher.destroy(); } }; window.sendEscKey = () => { // Esc is \uE00C, *not* \uu001B; see https://w3c.github.io/webdriver/#keyboard-actions. // // It's important to target document.body, and not any element that might stop receiving events // if a popover or dialog is making that element inert. return test_driver.send_keys(document.body, '\uE00C'); }; // For now, we always use the Esc keypress as our close request. In // theory, in the future, we could add a WebDriver command or similar // for the close request, which would allow different tests on platforms // with different close requests. In that case, we'd update this // function, but not update the sendEscKey function above. window.sendCloseRequest = window.sendEscKey; window.maybeTopLayerBless = (watcher) => { if (watcher instanceof HTMLElement) { return blessTopLayer(watcher); } return test_driver.bless(); }; window.waitForPotentialCloseEvent = () => { // CloseWatchers fire close events synchronously, but dialog elements wait // for a rAF before firing them. return new Promise(requestAnimationFrame); };