Skip to content

Commit

Permalink
Refactor pointerevents_iframe-touch-action-none
Browse files Browse the repository at this point in the history
Problems in the test:
* onload only ensures the parent frame is loaded and not the child
  frame. Fix by explicitly triggering load of the child frame and
  waiting on completion.
* assumes message from child frame will be posted and processed by the
  time the button is pressed, but this can happen too quickly. Fix by
  waiting on a message promise from the child frame.
* concatenation of events from the child frame is needlessly
  convoluted and likely the result of copy-paste from another test.

1 flake over 100 runs without fix.
0 flakes over 600 runs with the fix.

Bug: 40770210
Change-Id: Icf6640ee87b0d85f93bfa0753794545f1c302462
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6035259
Reviewed-by: Mustaq Ahmed <[email protected]>
Commit-Queue: Kevin Ellis <[email protected]>
Cr-Commit-Position: refs/heads/main@{#1386777}
  • Loading branch information
kevers-google authored and chromium-wpt-export-bot committed Nov 22, 2024
1 parent 3664516 commit 97bfee7
Showing 1 changed file with 45 additions and 44 deletions.
89 changes: 45 additions & 44 deletions pointerevents/pointerevent_iframe-touch-action-none_touch.html
Original file line number Diff line number Diff line change
@@ -1,66 +1,67 @@
<html>
<head>
<title>iframe touch-action:none attribute</title>
<meta name="viewport" content="width=device-width">
<link rel="stylesheet" type="text/css" href="pointerevent_styles.css">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="pointerevent_support.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-actions.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<title>iframe touch-action:none does not prevent panning or zooming inside
the iframe</title>
<meta name="viewport" content="width=device-width">
<link rel="stylesheet" type="text/css" href="pointerevent_styles.css">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="pointerevent_support.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-actions.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
</head>
<body onload="run()">
<style>
iframe {
touch-action: none;
}
</style>
<body>
<h1>iframe touch-action:none attribute</h1>
<h2 id="pointerTypeDescription"></h2>
<h4>Test Description: Drag your finger in the green rectangle below then tap the "Done" button.</h4>
<br>
<iframe id="target"
style="touch-action:none;"
src="resources/iframe-touch-action-none-subframe.html">
</iframe>
<input type="button" id="btnDone" value="Done">
<iframe id="target"></iframe>
</body>
<script>
var event_log = [];
'use strict';

function resetTestState() {
event_log = [];
function loadFrame() {
return new Promise(resolve => {
const frame = document.getElementById('target');
frame.onload = resolve;
frame.src = 'resources/iframe-touch-action-none-subframe.html';
});
}

function run() {
var test_pointerEvent = setup_pointerevent_test("iframe received pointercancel",
["touch"]);
var actions_promise;
var target = document.getElementById("target");

on_event(document.getElementById("btnDone"), "click", () => {
test_pointerEvent.step(() => {
assert_equals(event_log.join(", "), "pointercancel",
"exactly one pointercancel received");
});
actions_promise.then(() => test_pointerEvent.done());
function messageReceived() {
return new Promise(resolve => {
window.addEventListener('message', (event) => {
if (event.source != target.contentWindow) {
return;
}
if (event.data && event.data.type == "subframe-event") {
resolve(event.data.eventType);
}
});
});
}

on_event(window, "message", function(event) {
if (event.source != target.contentWindow) {
return;
}
if (event.data && event.data.type == "subframe-event") {
event_log.push(event.data.eventType);
}
});
promise_test(async t => {
const target = document.getElementById("target");
await loadFrame();

const messagePromise = messageReceived();

actions_promise = new test_driver.Actions()
await new test_driver.Actions()
.addPointer("pointer1", "touch")
.pointerMove(0, 0, {origin: target})
.pointerDown()
.pointerMove(25, 25, {origin: target})
.pointerUp()
.pointerMove(0, 0, {origin: btnDone})
.pointerDown()
.pointerUp()
.send();
}

const eventType = await messagePromise;
assert_equals(eventType, 'pointercancel');
}, 'touch iframe received pointercancel');
</script>
</html>

0 comments on commit 97bfee7

Please sign in to comment.