68 lines
2.2 KiB
JavaScript
68 lines
2.2 KiB
JavaScript
// Dispatches the given sequence of actions and verifies isInputPending state
|
|
// after dispatch according to expectations. Returns when all dispatched input
|
|
// has been handled.
|
|
const pendingActionTest = async (label, target, actionCallback, expectations) => {
|
|
promise_test(async () => {
|
|
// Give focus to the page first, before running the test.
|
|
await new test_driver.Actions()
|
|
.pointerMove(0, 0)
|
|
.pointerDown()
|
|
.pointerUp()
|
|
.send();
|
|
|
|
// Register a handler to fetch the result of isInputPending from the target
|
|
// window.
|
|
const resultPromise = new Promise(res => {
|
|
window.addEventListener('message', function handler(e) {
|
|
if (e.data === 'check-input') return;
|
|
res(e.data);
|
|
window.removeEventListener('message', handler);
|
|
});
|
|
});
|
|
|
|
// Signal to the target window to monitor isInputPending.
|
|
target.postMessage('check-input', '*');
|
|
|
|
const actions = actionCallback();
|
|
const actionsPromise = actions.send();
|
|
|
|
const {discrete, continuous} = await resultPromise;
|
|
|
|
assert_equals(discrete, expectations.discrete, 'detected discrete input');
|
|
assert_equals(continuous, expectations.continuous, 'detected continuous input');
|
|
|
|
await actionsPromise;
|
|
}, label);
|
|
}
|
|
|
|
const PendingInputUtils = {
|
|
testDetectNoPendingInput(target, actionCallback, label) {
|
|
pendingActionTest(label, target, actionCallback, {
|
|
discrete: false,
|
|
continuous: false,
|
|
});
|
|
},
|
|
|
|
testDetectDiscretePendingInput(target, actionCallback, label) {
|
|
pendingActionTest(label, target, actionCallback, {
|
|
discrete: true,
|
|
continuous: true,
|
|
});
|
|
},
|
|
|
|
testDetectContinuousPendingInput(target, actionCallback, label) {
|
|
pendingActionTest(label, target, actionCallback, {
|
|
discrete: false,
|
|
continuous: true,
|
|
});
|
|
},
|
|
|
|
// Simulates a pointer event at the given coordinates, and tests that the
|
|
// given target window cannot access it. Intended for cross-origin compliance
|
|
// tests.
|
|
testCannotAccessPendingInputAt(target, x, y, label) {
|
|
PendingInputUtils.testDetectNoPendingInput(target, () => {
|
|
return new test_driver.Actions().pointerMove(x, y).pointerDown().pointerUp();
|
|
}, label);
|
|
},
|
|
}
|