diff options
Diffstat (limited to 'testing/web-platform/tests/intersection-observer/v2/delay-test.html')
-rw-r--r-- | testing/web-platform/tests/intersection-observer/v2/delay-test.html | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/testing/web-platform/tests/intersection-observer/v2/delay-test.html b/testing/web-platform/tests/intersection-observer/v2/delay-test.html new file mode 100644 index 0000000000..e3906ea2c2 --- /dev/null +++ b/testing/web-platform/tests/intersection-observer/v2/delay-test.html @@ -0,0 +1,89 @@ +<!DOCTYPE html> +<meta name="viewport" content="width=device-width,initial-scale=1"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="../resources/intersection-observer-test-utils.js"></script> + +<style> +body, html { + margin: 0; +} +pre, #log { + position: absolute; + top: 0; + left: 200px; +} +#target { + width: 100px; + height: 100px; + background-color: green; +} +#occluder { + width: 100px; + height: 100px; + background-color: blue; +} +</style> + +<div id="target"></div> +<div id="occluder"></div> + +<script> +async_test(t => { + let entries = []; + let delay = 100; + let target = document.getElementById("target"); + let occluder = document.getElementById("occluder"); + + assert_true(!!target, "target exists"); + assert_true(!!occluder, "occluder exists"); + let observer = new IntersectionObserver(function(changes) { + entries = entries.concat(changes) + }, {trackVisibility: true, delay: delay}); + observer.observe(target); + entries = entries.concat(observer.takeRecords()); + assert_equals(entries.length, 0, "No initial notifications."); + // The first notification should be sent without delay. + waitForNotification(t, t.step_func(step0)); + + function waitForDelay(timerExpiredBeforeLastFrame, nextStep) { + requestAnimationFrame(t.step_func(() => { + if (timerExpiredBeforeLastFrame) { + // New notifications should have been generated during the previous + // frame and delivered by now. + assert_equals(entries.length, 2); + assert_greater_than(entries[1].time - entries[0].time, delay); + assert_false(entries[1].isVisible); + nextStep(); + } else { + // Observer may not have updated yet. Wait for next frame. + let timerExpired = performance.now() - entries[0].time >= delay; + waitForDelay(timerExpired, nextStep); + } + })); + } + + function step0() { + assert_equals(entries.length, 1); + assert_true(entries[0].isVisible); + // This should trigger a notification on the next run. + occluder.style.marginTop = "-10px"; + // Enter a rAF loop until the delay timer expires. + waitForDelay(false, step1); + } + + function step1() { + occluder.style.marginTop = "10px"; + // This style invalidation should cause a frame to run before the observer + // can generate a notification (due to delay parameter). Make sure the + // notification will still be generated even if we don't force more frames + // with a rAF loop. + t.step_timeout(() => { + assert_equals(entries.length, 3); + assert_true(entries[0].isVisible); + t.done(); + }, 2 * delay); + } + +}, "'delay' parameter throttles frequency of notifications."); +</script> |