diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 19:33:14 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 19:33:14 +0000 |
commit | 36d22d82aa202bb199967e9512281e9a53db42c9 (patch) | |
tree | 105e8c98ddea1c1e4784a60a5a6410fa416be2de /testing/web-platform/tests/resize-observer/eventloop.html | |
parent | Initial commit. (diff) | |
download | firefox-esr-upstream.tar.xz firefox-esr-upstream.zip |
Adding upstream version 115.7.0esr.upstream/115.7.0esrupstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'testing/web-platform/tests/resize-observer/eventloop.html')
-rw-r--r-- | testing/web-platform/tests/resize-observer/eventloop.html | 253 |
1 files changed, 253 insertions, 0 deletions
diff --git a/testing/web-platform/tests/resize-observer/eventloop.html b/testing/web-platform/tests/resize-observer/eventloop.html new file mode 100644 index 0000000000..3a9e453faf --- /dev/null +++ b/testing/web-platform/tests/resize-observer/eventloop.html @@ -0,0 +1,253 @@ +<!doctype html> +<title>ResizeObserver notification event loop tests</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="./resources/resizeTestHelper.js"></script> +<div id="log"></div> +<script> +'use strict'; + +// allow uncaught exception because ResizeObserver posts exceptions +// to window error handler when limit is exceeded. +// This codepath is tested in this file. + +setup({allow_uncaught_exception: true}); + +function template() { + let helper = new ResizeTestHelper( + "test0: title", + [ + { + setup: observer => { + }, + notify: (entries, observer) => { + return true; // Delay next step + } + } + ]); + return helper.start(); +} + +var onErrorCalled = false; + +window.onerror = err => { + onErrorCalled = true; +} + +function test0() { + let t1 = createAndAppendElement("div"); + let t2 = createAndAppendElement("div", t1); + let t3 = createAndAppendElement("div", t2); + + let divs = [t1, t2, t3]; + let rAF = 0; + let helper = new ResizeTestHelper( + "test0: multiple notifications inside same event loop", + [ + { + setup: observer => { + onErrorCalled = false; + observer.observe(t1); + observer.observe(t2); + observer.observe(t3); + }, + notify: (entries, observer) => { + assert_equals(entries.length, 3, "3 notifications"); + } + }, + { + setup: observer => { + helper.startCountingRaf(); + divs.forEach( el => { el.style.width = "101px";}); + }, + notify: (entries, observer) => { + // t1 is not delivered + assert_equals(entries.length, 2, "2 notifications"); + assert_equals(helper.rafCount, 0, "still in same loop"); + } + }, + { + setup: observer => { + divs.forEach( el => { el.style.width = "102px";}); + }, + notify: (entries, observer) => { + assert_equals(entries.length, 1, "1 notifications"); + assert_equals(helper.rafCount, 0, "same loop"); + } + }, + { // t1 and t2 get notified + setup: observer => { + }, + notify: (entries, observer) => { + assert_equals(entries.length, 2, "2 notifications"); + assert_equals(helper.rafCount, 1, "new loop"); + assert_equals(onErrorCalled, true, "error was fired"); + observer.disconnect(); + } + } + ]); + + return new Promise((resolve, reject) => { + // This test uses requestAnimationFrame() to check the count of event loop, + // but on some browsers, the FrameRequestCallback may be throttled (i.e. + // simply fired after some extra time) in cases where this test is running + // in an iframe that hasn't yet been painted (i.e. we're not visible). + // This may result in some intermittent failures if this test didn't get a + // first paint (and hence may not have started firing FrameRequestCallbacks) + // by the time the test starts expecting helper.rafCount to have changed. + // + // Therefore, we don't start the test logic until body.onload has fired. + // This increases the likelihood that this testcase will have gotten a + // chance to paint when we start invoking requestAnimationFrame, and that + // its rAF callbacks will fire when the test logic expects them to. + document.body.onload = () => resolve(); + }).then(() => { + return helper.start(() => t1.remove()); + }); +} + +function test1() { + let t1 = createAndAppendElement("div"); + t1.style.width = '100px'; + let t2 = createAndAppendElement("div", t1); + let t3 = createAndAppendElement("div", t2); + let shadow = t3.attachShadow({ mode: "open" }); + let t4 = createAndAppendElement("div", shadow); + let t5 = createAndAppendElement("div", t4); + + let resizers = [t1, t2, t3, t4, t5]; + + // Testing depths of shadow roots + // DOM: t1 <- t2 <- t3 <-shadow- t4 <- t5 + let helper = new ResizeTestHelper( + "test1: depths of shadow roots", + [ + { + setup: observer => { + onErrorCalled = false; + resizers.forEach( el => observer.observe(el) ); + }, + notify: (entries, observer) => { + assert_equals(entries.length, 5, "all entries resized"); + } + }, + { + setup: observer => { + resizers.forEach( el => el.style.width = "111px" ); + }, + notify: (entries, observer) => { + assert_equals(entries.length, 4, "depth limited"); + } + }, + { + setup: observer => { + resizers.forEach( el => el.style.width = "112px" ); + }, + notify: (entries, observer) => { + assert_equals(entries.length, 3, "depth limited"); + } + }, + { + setup: observer => { + resizers.forEach( el => el.style.width = "113px" ); + }, + notify: (entries, observer) => { + assert_equals(entries.length, 2, "depth limited"); + } + }, + { + setup: observer => { + resizers.forEach( el => el.style.width = "114px" ); + }, + notify: (entries, observer) => { + assert_equals(entries.length, 1, "depth limited"); + } + }, + { + setup: observer => { + }, + notify: (entries, observer) => { + assert_equals(entries.length, 4, "limit notifications"); + assert_equals(onErrorCalled, true, "breached limit"); + observer.disconnect(); + } + }, + ]); + return helper.start(() => t1.remove()); +} + +function test2() { + // <div id="container"> + // <div id="a1" style="width:100px;height:100px"> + // <div id="a2" style="width:100px;height:100px"></div> + // </div> + // <div id="b1" style="width:100px;height:100px"> + // <div id="b2" style="width:100px;height:100px"></div> + // </div> + // </div> + let container = createAndAppendElement("div"); + let a1 = createAndAppendElement("div", container); + let a2 = createAndAppendElement("div", a1); + let b1 = createAndAppendElement("div", container); + let b2 = createAndAppendElement("div", b1); + let targets = [a1, a2, b1, b2]; + + let helper = new ResizeTestHelper( + "test2: move target in dom while inside event loop", + [ + { + setup: observer => { + for (let t of targets) + observer.observe(t); + }, + notify: (entries, observer) => { + return true; // delay next observation + } + }, + { // resize them all + setup: observer => { + for (let t of targets) + t.style.width = "110px"; + }, + notify: (entries, observer) => { + assert_equals(entries.length, targets.length, "all targets observed"); + } + }, + { // resize all, move dom upwards + setup: observer => { + for (let t of targets) + t.style.width = "130px"; + container.appendChild(b2); + }, + notify: (entries, observer) => { + assert_equals(entries.length, 1, "b2 moved upwards"); + assert_equals(entries[0].target, a2); + } + }, + { // resize all, move dom downwards + setup: observer => { + for (let t of targets) + t.style.width = "130px"; + a2.appendChild(b2); + }, + notify: (entries, observer) => { + assert_equals(entries.length, 1, "b2 moved downwards"); + assert_equals(entries[0].target, b2); + } + }, + ]); + return helper.start(() => container.remove()); +} + +let guard; +test(_ => { + assert_own_property(window, "ResizeObserver"); + guard = async_test('guard'); +}, "ResizeObserver implemented") + +test0() + .then(() => test1()) + .then(() => test2()) + .then(() => guard.done()); + +</script> |