commit 4d67b5d52fdf6c46470e71da89256d73606d93f2
parent d191ca6c895127ef1423d106f90e822bd9f0e997
Author: Mason Freed <masonf@chromium.org>
Date: Fri, 26 Sep 2025 21:28:43 +0000
Bug 1990747 [wpt PR 55056] - Add two more "nested" interest invoker test cases, and fix corner case, a=testonly
Automatic update from web-platform-tests
Add two more "nested" interest invoker test cases, and fix corner case
This adds a few more test cases for nested interest invokers,
including one with double-nested invokers, and another with circular
dependencies. The CL also fixes these new cases, by doing a
more complete search for upstream invokers, through both DOM parents
and SourceInterestInvoker() upstream invokers.
Bug: 326681249
Change-Id: I594448de6e9f90d8b4f95d4aea6aaeb27a4ee972
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6970966
Reviewed-by: Joey Arhar <jarhar@chromium.org>
Commit-Queue: Mason Freed <masonf@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1520370}
--
wpt-commits: 6919824ac54da7d65d8ef4dc3725ab35c2caabb6
wpt-pr: 55056
Diffstat:
1 file changed, 93 insertions(+), 0 deletions(-)
diff --git a/testing/web-platform/tests/html/semantics/interestfor/interestfor-invoker-descendants.tentative.html b/testing/web-platform/tests/html/semantics/interestfor/interestfor-invoker-descendants.tentative.html
@@ -100,3 +100,96 @@ const innerButton = document.getElementById('inner-button');
},`Nested invokers, ${method}`);
});
</script>
+
+<a id=outer2-first href="#" interestfor="middle2-inner">Outer first</a>
+<a id=outer2-second href="#" interestfor="middle2-outer">Outer second</a>
+<div id="middle2-outer">Middle outer
+ <div id="middle2-inner">Middle inner
+ <a id="middle2-link" href="#" interestfor="inner2">Middle</a>
+ </div>
+</div>
+<div id="inner2">Inner <button id="inner2-button">btn</button></div>
+
+<script>
+const outer2First = document.getElementById('outer2-first');
+const outer2Second = document.getElementById('outer2-second');
+const middle2Outer = document.getElementById('middle2-outer');
+const middle2Inner = document.getElementById('middle2-inner');
+const middle2Link = document.getElementById('middle2-link');
+const inner2 = document.getElementById('inner2');
+const inner2Button = document.getElementById('inner2-button');
+
+['focus','hover'].forEach(method => {
+ promise_test(async function (t) {
+ t.add_cleanup(() => showInterest(otherbutton, method));
+ const hideDelayMs = 500; // Long enough to focus a few things without elapsing
+ outer2First.style.interestDelayEnd = `${hideDelayMs}ms`;
+
+ const hoverStart = performance.now();
+ await showInterest(outer2First, method);
+ assert_true(outer2First.matches(':interest-source'),'should show interest');
+ assert_false(outer2Second.matches(':interest-source'),'no interest yet in second target');
+ await showInterest(outer2Second, method);
+ assert_true(outer2Second.matches(':interest-source'),'outer2Second should now have interest');
+ await showInterest(middle2Link, method);
+ let firstHasInterest = outer2First.matches(':interest-source');
+ if (performance.now() - hoverStart >= hideDelayMs) {
+ return; // Test is running too slowly
+ }
+ assert_true(firstHasInterest,'outer2First should still have interest (delay)');
+ assert_true(inner2.matches(':interest-target'),'inner2 should be an interest target');
+ assert_true(middle2Outer.matches(':interest-target'),'middle2Outer should still be an interest target');
+ assert_true(outer2Second.matches(':interest-source'),'outer2Second should still have interest');
+
+ // Focusing the inner target should keep both outer invokers alive.
+ await showInterest(inner2Button, method);
+ assert_true(middle2Outer.matches(':interest-target'),'middle2Outer should still be an interest target (after moving to inner button)');
+ assert_true(outer2Second.matches(':interest-source'),'outer2Second should still have interest (after moving to inner button)');
+ assert_true(outer2First.matches(':interest-source'),'outer2First should still have interest');
+
+ // Now let the time elapse and make sure things are still good.
+ const elapsedMs = performance.now() - hoverStart;
+ await new Promise(resolve => step_timeout(resolve,hideDelayMs - elapsedMs + 10));
+ assert_true(inner2.matches(':interest-target'),'inner2 should still be an interest target');
+ assert_true(middle2Outer.matches(':interest-target'),'middle2Outer should still be an interest target');
+ assert_true(outer2Second.matches(':interest-source'),'outer2Second should still have interest');
+ assert_true(outer2First.matches(':interest-source'),'outer2First should still have interest');
+ assert_true(middle2Inner.matches(':interest-target'),'middle2Inner should still be an interest target');
+ },`Nested invokers with intermediate interest target, ${method}`);
+});
+</script>
+
+
+<a id=outer3 href="#" interestfor="middle3-inner">Outer</a>
+<div id="middle3-outer">Middle <button id=middle3-button>outer</button>
+ <div id="middle3-inner">Middle inner
+ <a id="middle3-link" href="#" interestfor="middle3-outer">Middle</a>
+ </div>
+</div>
+
+<script>
+const outer3 = document.getElementById('outer3');
+const middle3Outer = document.getElementById('middle3-outer');
+const middle3Inner = document.getElementById('middle3-inner');
+const middle3Link = document.getElementById('middle3-link');
+const middle3Button = document.getElementById('middle3-button');
+
+['focus','hover'].forEach(method => {
+ promise_test(async function (t) {
+ t.add_cleanup(() => showInterest(otherbutton, method));
+ await showInterest(outer3, method);
+ assert_true(outer3.matches(':interest-source'),'should show interest');
+ assert_true(middle3Inner.matches(':interest-target'),'middle3Inner should now be an interest target');
+ await showInterest(middle3Link, method);
+ assert_true(middle3Link.matches(':interest-source'),'middle3Link should now have interest');
+ assert_true(middle3Outer.matches(':interest-target'),'middle3Outer should now be an interest target');
+ assert_true(outer3.matches(':interest-source'),'outer3 should still have interest');
+ assert_true(middle3Inner.matches(':interest-target'),'middle3Inner should still be an interest target');
+ await showInterest(middle3Button, method);
+ assert_true(middle3Link.matches(':interest-source'),'middle3Link should now have interest (on outer button)');
+ assert_true(middle3Outer.matches(':interest-target'),'middle3Outer should now be an interest target (on outer button)');
+ assert_true(outer3.matches(':interest-source'),'outer3 no longer has interest (on outer button)');
+ assert_true(middle3Inner.matches(':interest-target'),'middle3Inner is no longer an interest target (on outer button)');
+ },`Nested invokers with circular dependencies, ${method}`);
+});
+</script>