tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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:
Mtesting/web-platform/tests/html/semantics/interestfor/interestfor-invoker-descendants.tentative.html | 93+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
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>