80 lines
2.6 KiB
JavaScript
80 lines
2.6 KiB
JavaScript
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);
|
|
};
|