Skip to content

Commit 6919824

Browse files
mfreed7chromium-wpt-export-bot
authored andcommitted
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 <[email protected]> Commit-Queue: Mason Freed <[email protected]> Cr-Commit-Position: refs/heads/main@{#1520370}
1 parent 2ec34a4 commit 6919824

File tree

1 file changed

+93
-0
lines changed

1 file changed

+93
-0
lines changed

html/semantics/interestfor/interestfor-invoker-descendants.tentative.html

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,3 +100,96 @@
100100
},`Nested invokers, ${method}`);
101101
});
102102
</script>
103+
104+
<a id=outer2-first href="#" interestfor="middle2-inner">Outer first</a>
105+
<a id=outer2-second href="#" interestfor="middle2-outer">Outer second</a>
106+
<div id="middle2-outer">Middle outer
107+
<div id="middle2-inner">Middle inner
108+
<a id="middle2-link" href="#" interestfor="inner2">Middle</a>
109+
</div>
110+
</div>
111+
<div id="inner2">Inner <button id="inner2-button">btn</button></div>
112+
113+
<script>
114+
const outer2First = document.getElementById('outer2-first');
115+
const outer2Second = document.getElementById('outer2-second');
116+
const middle2Outer = document.getElementById('middle2-outer');
117+
const middle2Inner = document.getElementById('middle2-inner');
118+
const middle2Link = document.getElementById('middle2-link');
119+
const inner2 = document.getElementById('inner2');
120+
const inner2Button = document.getElementById('inner2-button');
121+
122+
['focus','hover'].forEach(method => {
123+
promise_test(async function (t) {
124+
t.add_cleanup(() => showInterest(otherbutton, method));
125+
const hideDelayMs = 500; // Long enough to focus a few things without elapsing
126+
outer2First.style.interestDelayEnd = `${hideDelayMs}ms`;
127+
128+
const hoverStart = performance.now();
129+
await showInterest(outer2First, method);
130+
assert_true(outer2First.matches(':interest-source'),'should show interest');
131+
assert_false(outer2Second.matches(':interest-source'),'no interest yet in second target');
132+
await showInterest(outer2Second, method);
133+
assert_true(outer2Second.matches(':interest-source'),'outer2Second should now have interest');
134+
await showInterest(middle2Link, method);
135+
let firstHasInterest = outer2First.matches(':interest-source');
136+
if (performance.now() - hoverStart >= hideDelayMs) {
137+
return; // Test is running too slowly
138+
}
139+
assert_true(firstHasInterest,'outer2First should still have interest (delay)');
140+
assert_true(inner2.matches(':interest-target'),'inner2 should be an interest target');
141+
assert_true(middle2Outer.matches(':interest-target'),'middle2Outer should still be an interest target');
142+
assert_true(outer2Second.matches(':interest-source'),'outer2Second should still have interest');
143+
144+
// Focusing the inner target should keep both outer invokers alive.
145+
await showInterest(inner2Button, method);
146+
assert_true(middle2Outer.matches(':interest-target'),'middle2Outer should still be an interest target (after moving to inner button)');
147+
assert_true(outer2Second.matches(':interest-source'),'outer2Second should still have interest (after moving to inner button)');
148+
assert_true(outer2First.matches(':interest-source'),'outer2First should still have interest');
149+
150+
// Now let the time elapse and make sure things are still good.
151+
const elapsedMs = performance.now() - hoverStart;
152+
await new Promise(resolve => step_timeout(resolve,hideDelayMs - elapsedMs + 10));
153+
assert_true(inner2.matches(':interest-target'),'inner2 should still be an interest target');
154+
assert_true(middle2Outer.matches(':interest-target'),'middle2Outer should still be an interest target');
155+
assert_true(outer2Second.matches(':interest-source'),'outer2Second should still have interest');
156+
assert_true(outer2First.matches(':interest-source'),'outer2First should still have interest');
157+
assert_true(middle2Inner.matches(':interest-target'),'middle2Inner should still be an interest target');
158+
},`Nested invokers with intermediate interest target, ${method}`);
159+
});
160+
</script>
161+
162+
163+
<a id=outer3 href="#" interestfor="middle3-inner">Outer</a>
164+
<div id="middle3-outer">Middle <button id=middle3-button>outer</button>
165+
<div id="middle3-inner">Middle inner
166+
<a id="middle3-link" href="#" interestfor="middle3-outer">Middle</a>
167+
</div>
168+
</div>
169+
170+
<script>
171+
const outer3 = document.getElementById('outer3');
172+
const middle3Outer = document.getElementById('middle3-outer');
173+
const middle3Inner = document.getElementById('middle3-inner');
174+
const middle3Link = document.getElementById('middle3-link');
175+
const middle3Button = document.getElementById('middle3-button');
176+
177+
['focus','hover'].forEach(method => {
178+
promise_test(async function (t) {
179+
t.add_cleanup(() => showInterest(otherbutton, method));
180+
await showInterest(outer3, method);
181+
assert_true(outer3.matches(':interest-source'),'should show interest');
182+
assert_true(middle3Inner.matches(':interest-target'),'middle3Inner should now be an interest target');
183+
await showInterest(middle3Link, method);
184+
assert_true(middle3Link.matches(':interest-source'),'middle3Link should now have interest');
185+
assert_true(middle3Outer.matches(':interest-target'),'middle3Outer should now be an interest target');
186+
assert_true(outer3.matches(':interest-source'),'outer3 should still have interest');
187+
assert_true(middle3Inner.matches(':interest-target'),'middle3Inner should still be an interest target');
188+
await showInterest(middle3Button, method);
189+
assert_true(middle3Link.matches(':interest-source'),'middle3Link should now have interest (on outer button)');
190+
assert_true(middle3Outer.matches(':interest-target'),'middle3Outer should now be an interest target (on outer button)');
191+
assert_true(outer3.matches(':interest-source'),'outer3 no longer has interest (on outer button)');
192+
assert_true(middle3Inner.matches(':interest-target'),'middle3Inner is no longer an interest target (on outer button)');
193+
},`Nested invokers with circular dependencies, ${method}`);
194+
});
195+
</script>

0 commit comments

Comments
 (0)