blob: b8f51462a772961d2efa1e1cf351165101ab9e98 [file] [log] [blame]
<!DOCTYPE html>
<script src="../../../resources/testharness.js"></script>
<script src="../../../resources/testharnessreport.js"></script>
<style>
html, body {
margin: 0;
}
iframe {
border: 0;
position: absolute;
}
</style>
<iframe id=iframe src="http://localhost:8080/input/resources/discard-events-to-unstable-iframe-subframe.html" sandbox="allow-scripts"></iframe>
<script>
async_test(t => {
if (!window.chrome || !chrome.gpuBenchmarking) {
t.done();
return;
}
let iframe = document.getElementById("iframe");
let expectedCounts = {};
let tapAndCount = (x, y, mousedownCount, mouseupCount, clickCount, description) => {
// Use double-rAF to stabilize layout before dispatching input event.
requestAnimationFrame(() => {
requestAnimationFrame(() => {
iframe.contentWindow.postMessage({tap: [x, y], description: description}, "*");
expectedCounts = {
mousedown: mousedownCount,
mouseup: mouseupCount,
click: clickCount
};
});
});
};
let step0 = () => {
tapAndCount(20, 20, 1, 1, 1, "Initial state");
};
let step1 = () => {
iframe.style.top = "50px";
// Iframe moved, but it's not running an IntersectionObserver, so input events
// are unaffected.
tapAndCount(20, 70, 1, 1, 1, "Iframe moved, no observer");
};
let step2 = () => {
// Start running IntersectionObserver in the iframe.
iframe.contentWindow.postMessage("observe", "*");
};
let step3 = () => {
iframe.style.left = "50px";
// Iframe moved, and it's running an IntersectionObserver with
// trackVisibility=true. Input events should be discarded.
tapAndCount(70, 70, 0, 0, 0, "Iframe moved, observer active");
};
let step4 = () => {
setTimeout(() => {
// Iframe position has been stable for 500ms, so input events should not
// be discarded.
tapAndCount(70, 70, 1, 1, 1, "Iframe stable, observer active");
}, 500);
};
let steps = [step0, step1, step2, step3, step4];
let runNextStep = () => {
if (steps.length) {
let step = steps.shift();
step();
} else {
t.done();
}
};
addEventListener("message", evt => {
if (evt.data.hasOwnProperty("count")) {
t.step(() => {
Object.keys(expectedCounts).forEach(key => {
let description = evt.data["description"] + " [" + key + "] ";
assert_equals(evt.data["count"][key], expectedCounts[key], description);
});
});
}
runNextStep();
});
iframe.addEventListener("load", runNextStep);
}, "Input events targeting a cross-origin iframe which has moved recently, and which is using IntersectionObserver V2, should be discarded.");
</script>