Source code
Revision control
Copy as Markdown
Other Tools
<!DOCTYPE html>
<html>
<meta name="viewport" content="width=device-width; initial-scale=1.0">
<title>Tests that :active state is changed with `touchstart` event listener</title>
<script src="/tests/SimpleTest/SimpleTest.js"></script>
 <script src="/tests/SimpleTest/paint_listener.js"></script>
<script src="apz_test_utils.js"></script>
<script src="apz_test_native_event_utils.js"></script>
<style>
  #button {
    width: 100px;
    height: 100px;
  }
</style>
<button id="button">Button</button>
<script>
async function test() {
  // Set up an active touchstart event listner.
  let eventPromise =  promiseOneEvent(document.documentElement, "touchstart");
  await promiseApzFlushedRepaints();
  await synthesizeNativeTouch(button, 10, 10, SpecialPowers.DOMWindowUtils.TOUCH_CONTACT);
  await eventPromise;
  // In JS there's no way to ensure `APZStateChange::eStartTouch` notification
  // has been processed. So we wait for `:active` state change here.
  await SimpleTest.promiseWaitForCondition(
    () => button.matches(":active"),
    "Waiting for :active state change");
  ok(button.matches(":active"), "should be active");
  eventPromise =  promiseOneEvent(button, "touchend");
  await synthesizeNativeTouch(button, 10, 10, SpecialPowers.DOMWindowUtils.TOUCH_REMOVE);
  await eventPromise;
  // Same as above. We need to wait for not `:active` state here.
  await SimpleTest.promiseWaitForCondition(
    () => !button.matches(":active"),
    "Waiting for :active state change");
  ok(!button.matches(":active"), "should not be active");
}
if (getPlatform() == "windows") {
  // `InjectTouchInput failure` with ERROR_TIMEOUT.
  ok(true, "Test doesn't need to run on Windows");
  subtestDone();
} else {
  waitUntilApzStable()
  .then(test)
  .then(subtestDone, subtestFailed);
}
</script>
</html>