Closed Bug 1765494 Opened 3 years ago Closed 3 years ago

[wpt-sync] Sync PR 33712 - Fix :has() invalidation bug on the inserted element/subtree

Categories

(Core :: CSS Parsing and Computation, task, P4)

task

Tracking

()

RESOLVED FIXED
102 Branch
Tracking Status
firefox102 --- fixed

People

(Reporter: wpt-sync, Unassigned)

References

()

Details

(Whiteboard: [wptsync downstream])

Sync web-platform-tests PR 33712 into mozilla-central (this bug is closed when the sync is complete).

PR: https://github.com/web-platform-tests/wpt/pull/33712
Details from upstream follow.

Byungwoo Lee <blee@igalia.com> wrote:

Fix :has() invalidation bug on the inserted element/subtree

:has() invalidation doesn't work for any mutation on an inserted
element or subtree if the element or subtree didn't trigger the
:has() invalidation when it inserted.

\<style> .a:has(.b) { color: green } \</style>
\<div id="subject" class="a">\</div>
\<script>
const child = document.createElement('div');
subject.appendChild(child);
child.classList.add('b');
getComputedStyle(subject).color; // Must be green. But it isn't.
\</script>

Currently, only the SelectorChecker set the SiblingsAffectedByHas and
AncestorsOrAncestorSiblingsAffectedByHas flags while checking a :has()
argument selector. So if an insertion didn't trigger any :has()
invalidation, the inserted element or subtree doesn't have the flags
set. If an element doesn't have the flag set, any mutations on the
element cannot trigger the :has() invalidation.

To fix this bug, StyleEngine gets the two flags from the parent or
previous sibling of the inserted element (or the root of inserted
subtree), and set the flags on the inserted element or subtree.

  • Get AncestorsOrAncestorSiblingsAffectedByHas from parent
  • Get SiblingsAffectedByHas from previous sibling

To prevent unnecessary AncestorsOrAncestorSiblingsAffectdByHas flag
set, the SiblingsAffectedByHas flag is divided into these two flags.

  • SiblingsAffectedByHasForSiblingRelationship
    The :has() argument starts with a sibling combinator, and it
    doesn't have any child or descendant combinator.
    (.e.g. '.a:has(~ .b) {}')
  • SiblingsAffectedByHasForSiblingDescendantRelationship
    The :has() argument starts with sibling combinator, and it also
    has a child or descendant combinator.
    (.e.g. '.a:has(~ .b .c) {}'

Only when one or more of these two conditions are satisfied,
StyleEngine sets the AncestorsOrAncestorSiblingsAffectedByHas flag
on the descendants of the inserted subtree root.

  • If the previous sibling has the
    SiblingsAffectedByHasForSiblingDescendantRelationship flag set.
  • If the parent has the AncestorsOrAncestorSiblingsAffectedByHas flag
    set

The :has() scope element need to have the flags set also because
the inserted element can be the only element that possibly affects
the :has() state of the :has() scope element. (Then the StyleEngine
needs to get the flags from the :has() scope element) So, the flag
setting logic in the SelectorChecker::CheckPseudoHas() was changed
to set the flags on the :has() scope element before starting the
:has() argument checking traversal.

The logic of setting SiblingsAffectedByHas flags was relocated to
be invoked before starting :has() argument checking traversal to
simplify the flag setting logic.

To collect flags setting related code in the same place, the
AffectedByHasIterator class was moved to the selector_checker.cc
file. And it was renamed as below to clarify its purpose.

  • AncestorsOrAncestorSiblingsAffectedByHasIterator

Bug: 669058
Change-Id: I20c5b7e2956514d10257e90270982ab3afd93cb6
Reviewed-on: https://chromium-review.googlesource.com/3590254
WPT-Export-Revision: ad950b00cd405aca78d16f1853796d94b56908d1

Component: web-platform-tests → CSS Parsing and Computation
Product: Testing → Core

CI Results

Ran 0 Firefox configurations based on mozilla-central, and Firefox, and Chrome on GitHub CI

Total 4 tests and 295 subtests

Status Summary

Firefox

OK : 4
PASS: 736
FAIL: 402

Chrome

OK : 4
PASS: 1138

Links

GitHub PR Head
GitHub PR Base

Details

New Tests That Don't Pass

  • /css/selectors/invalidation/has-in-adjacent-position.html [wpt.fyi]
    • add .test to previous_sibling_child: FAIL (Chrome: PASS)
    • add .test to previous_sibling_descendant: FAIL (Chrome: PASS)
    • add .test to subject: FAIL (Chrome: PASS)
    • add .test to next_sibling: FAIL (Chrome: PASS)
    • add .test to next_sibling_child: FAIL (Chrome: PASS)
    • add .test to next_sibling_descendant: FAIL (Chrome: PASS)
    • insert element div.test before previous_sibling_child: FAIL (Chrome: PASS)
    • add the class 'test' again to the element inserted before previous_sibling_child: FAIL (Chrome: PASS)
    • add the class 'test' to the element inserted again before previous_sibling_child: FAIL (Chrome: PASS)
    • insert element div[test_attr] before previous_sibling_child: FAIL (Chrome: PASS)
    • insert element div.test before previous_sibling_descendant: FAIL (Chrome: PASS)
    • add the class 'test' again to the element inserted before previous_sibling_descendant: FAIL (Chrome: PASS)
    • add the class 'test' to the element inserted again before previous_sibling_descendant: FAIL (Chrome: PASS)
    • insert element div[test_attr] before previous_sibling_descendant: FAIL (Chrome: PASS)
    • insert element div.test before next_sibling: FAIL (Chrome: PASS)
    • add the class 'test' again to the element inserted before next_sibling: FAIL (Chrome: PASS)
    • add the class 'test' to the element inserted again before next_sibling: FAIL (Chrome: PASS)
    • insert element div[test_attr] before next_sibling: FAIL (Chrome: PASS)
    • insert element div.test before next_sibling_child: FAIL (Chrome: PASS)
    • add the class 'test' again to the element inserted before next_sibling_child: FAIL (Chrome: PASS)
    • add the class 'test' to the element inserted again before next_sibling_child: FAIL (Chrome: PASS)
    • insert element div[test_attr] before next_sibling_child: FAIL (Chrome: PASS)
    • insert element div.test before next_sibling_descendant: FAIL (Chrome: PASS)
    • add the class 'test' again to the element inserted before next_sibling_descendant: FAIL (Chrome: PASS)
    • add the class 'test' to the element inserted again before next_sibling_descendant: FAIL (Chrome: PASS)
    • insert element div[test_attr] before next_sibling_descendant: FAIL (Chrome: PASS)
    • insert element div.test after previous_sibling_child: FAIL (Chrome: PASS)
    • add the class 'test' again to the element inserted after previous_sibling_child: FAIL (Chrome: PASS)
    • add the class 'test' to the element inserted again after previous_sibling_child: FAIL (Chrome: PASS)
    • insert element div[test_attr] after previous_sibling_child: FAIL (Chrome: PASS)
    • insert element div.test after previous_sibling_descendant: FAIL (Chrome: PASS)
    • add the class 'test' again to the element inserted after previous_sibling_descendant: FAIL (Chrome: PASS)
    • add the class 'test' to the element inserted again after previous_sibling_descendant: FAIL (Chrome: PASS)
    • insert element div[test_attr] after previous_sibling_descendant: FAIL (Chrome: PASS)
    • insert element div.test after subject: FAIL (Chrome: PASS)
    • add the class 'test' again to the element inserted after subject: FAIL (Chrome: PASS)
    • add the class 'test' to the element inserted again after subject: FAIL (Chrome: PASS)
    • insert element div[test_attr] after subject: FAIL (Chrome: PASS)
    • insert element div.test after next_sibling: FAIL (Chrome: PASS)
    • add the class 'test' again to the element inserted after next_sibling: FAIL (Chrome: PASS)
    • add the class 'test' to the element inserted again after next_sibling: FAIL (Chrome: PASS)
    • insert element div[test_attr] after next_sibling: FAIL (Chrome: PASS)
    • insert element div.test after next_sibling_child: FAIL (Chrome: PASS)
    • add the class 'test' again to the element inserted after next_sibling_child: FAIL (Chrome: PASS)
    • add the class 'test' to the element inserted again after next_sibling_child: FAIL (Chrome: PASS)
    • insert element div[test_attr] after next_sibling_child: FAIL (Chrome: PASS)
    • insert element div.test after next_sibling_descendant: FAIL (Chrome: PASS)
    • add the class 'test' again to the element inserted after next_sibling_descendant: FAIL (Chrome: PASS)
    • add the class 'test' to the element inserted again after next_sibling_descendant: FAIL (Chrome: PASS)
    • insert element div[test_attr] after next_sibling_descendant: FAIL (Chrome: PASS)
    • insert tree div>div.test before previous_sibling_child: FAIL (Chrome: PASS)
    • add the class 'test' again to the element in the tree inserted before previous_sibling_child: FAIL (Chrome: PASS)
    • add the class 'test' to the element in the tree inserted again before previous_sibling_child: FAIL (Chrome: PASS)
    • insert element div>div[test_attr] before previous_sibling_child: FAIL (Chrome: PASS)
    • insert tree div>div.test before previous_sibling_descendant: FAIL (Chrome: PASS)
    • add the class 'test' again to the element in the tree inserted before previous_sibling_descendant: FAIL (Chrome: PASS)
    • add the class 'test' to the element in the tree inserted again before previous_sibling_descendant: FAIL (Chrome: PASS)
    • insert element div>div[test_attr] before previous_sibling_descendant: FAIL (Chrome: PASS)
    • insert tree div>div.test before subject: FAIL (Chrome: PASS)
    • add the class 'test' again to the element in the tree inserted before subject: FAIL (Chrome: PASS)
    • add the class 'test' to the element in the tree inserted again before subject: FAIL (Chrome: PASS)
    • insert element div>div[test_attr] before subject: FAIL (Chrome: PASS)
    • insert tree div>div.test before next_sibling: FAIL (Chrome: PASS)
    • add the class 'test' again to the element in the tree inserted before next_sibling: FAIL (Chrome: PASS)
    • add the class 'test' to the element in the tree inserted again before next_sibling: FAIL (Chrome: PASS)
    • insert element div>div[test_attr] before next_sibling: FAIL (Chrome: PASS)
    • insert tree div>div.test before next_sibling_child: FAIL (Chrome: PASS)
    • add the class 'test' again to the element in the tree inserted before next_sibling_child: FAIL (Chrome: PASS)
    • add the class 'test' to the element in the tree inserted again before next_sibling_child: FAIL (Chrome: PASS)
    • insert element div>div[test_attr] before next_sibling_child: FAIL (Chrome: PASS)
    • insert tree div>div.test before next_sibling_descendant: FAIL (Chrome: PASS)
    • add the class 'test' again to the element in the tree inserted before next_sibling_descendant: FAIL (Chrome: PASS)
    • add the class 'test' to the element in the tree inserted again before next_sibling_descendant: FAIL (Chrome: PASS)
    • insert element div>div[test_attr] before next_sibling_descendant: FAIL (Chrome: PASS)
    • insert tree div>div.test after previous_sibling: FAIL (Chrome: PASS)
    • add the class 'test' again to the element in the tree inserted after previous_sibling: FAIL (Chrome: PASS)
    • add the class 'test' to the element in the tree inserted again after previous_sibling: FAIL (Chrome: PASS)
    • insert element div>div[test_attr] after previous_sibling: FAIL (Chrome: PASS)
    • insert tree div>div.test after previous_sibling_child: FAIL (Chrome: PASS)
    • add the class 'test' again to the element in the tree inserted after previous_sibling_child: FAIL (Chrome: PASS)
    • add the class 'test' to the element in the tree inserted again after previous_sibling_child: FAIL (Chrome: PASS)
    • insert element div>div[test_attr] after previous_sibling_child: FAIL (Chrome: PASS)
    • insert tree div>div.test after previous_sibling_descendant: FAIL (Chrome: PASS)
    • add the class 'test' again to the element in the tree inserted after previous_sibling_descendant: FAIL (Chrome: PASS)
    • add the class 'test' to the element in the tree inserted again after previous_sibling_descendant: FAIL (Chrome: PASS)
    • insert element div>div[test_attr] after previous_sibling_descendant: FAIL (Chrome: PASS)
    • insert tree div>div.test after subject: FAIL (Chrome: PASS)
    • add the class 'test' again to the element in the tree inserted after subject: FAIL (Chrome: PASS)
    • add the class 'test' to the element in the tree inserted again after subject: FAIL (Chrome: PASS)
    • insert element div>div[test_attr] after subject: FAIL (Chrome: PASS)
    • insert tree div>div.test after next_sibling: FAIL (Chrome: PASS)
    • add the class 'test' again to the element in the tree inserted after next_sibling: FAIL (Chrome: PASS)
    • add the class 'test' to the element in the tree inserted again after next_sibling: FAIL (Chrome: PASS)
    • insert element div>div[test_attr] after next_sibling: FAIL (Chrome: PASS)
    • insert tree div>div.test after next_sibling_child: FAIL (Chrome: PASS)
    • add the class 'test' again to the element in the tree inserted after next_sibling_child: FAIL (Chrome: PASS)
    • add the class 'test' to the element in the tree inserted again after next_sibling_child: FAIL (Chrome: PASS)
    • insert element div>div[test_attr] after next_sibling_child: FAIL (Chrome: PASS)
    • insert tree div>div.test after next_sibling_descendant: FAIL (Chrome: PASS)
    • add the class 'test' again to the element in the tree inserted after next_sibling_descendant: FAIL (Chrome: PASS)
    • add the class 'test' to the element in the tree inserted again after next_sibling_descendant: FAIL (Chrome: PASS)
    • insert element div>div[test_attr] after next_sibling_descendant: FAIL (Chrome: PASS)
  • /css/selectors/invalidation/has-in-ancestor-position.html [wpt.fyi]
    • add .test to subject_parent: FAIL (Chrome: PASS)
    • add .test to subject: FAIL (Chrome: PASS)
    • add .test to subject_child: FAIL (Chrome: PASS)
    • add .test to subject_descendant: FAIL (Chrome: PASS)
    • add .test to next_sibling: FAIL (Chrome: PASS)
    • add .test to next_sibling_child: FAIL (Chrome: PASS)
    • add .test to next_sibling_descendant: FAIL (Chrome: PASS)
    • insert element div.test before subject_parent: FAIL (Chrome: PASS)
    • add the class 'test' again to the element inserted before subject_parent: FAIL (Chrome: PASS)
    • add the class 'test' to the element inserted again before subject_parent: FAIL (Chrome: PASS)
    • insert element div[test_attr] before subject_parent: FAIL (Chrome: PASS)
    • insert element div.test before subject: FAIL (Chrome: PASS)
    • add the class 'test' again to the element inserted before subject: FAIL (Chrome: PASS)
    • add the class 'test' to the element inserted again before subject: FAIL (Chrome: PASS)
    • insert element div[test_attr] before subject: FAIL (Chrome: PASS)
    • insert element div.test before subject_child: FAIL (Chrome: PASS)
    • add the class 'test' again to the element inserted before subject_child: FAIL (Chrome: PASS)
    • add the class 'test' to the element inserted again before subject_child: FAIL (Chrome: PASS)
    • insert element div[test_attr] before subject_child: FAIL (Chrome: PASS)
    • insert element div.test before subject_descendant: FAIL (Chrome: PASS)
    • add the class 'test' again to the element inserted before subject_descendant: FAIL (Chrome: PASS)
    • add the class 'test' to the element inserted again before subject_descendant: FAIL (Chrome: PASS)
    • insert element div[test_attr] before subject_descendant: FAIL (Chrome: PASS)
    • insert element div.test before next_sibling: FAIL (Chrome: PASS)
    • add the class 'test' again to the element inserted before next_sibling: FAIL (Chrome: PASS)
    • add the class 'test' to the element inserted again before next_sibling: FAIL (Chrome: PASS)
    • insert element div[test_attr] before next_sibling: FAIL (Chrome: PASS)
    • insert element div.test before next_sibling_child: FAIL (Chrome: PASS)
    • add the class 'test' again to the element inserted before next_sibling_child: FAIL (Chrome: PASS)
    • add the class 'test' to the element inserted again before next_sibling_child: FAIL (Chrome: PASS)
    • insert element div[test_attr] before next_sibling_child: FAIL (Chrome: PASS)
    • insert element div.test before next_sibling_descendant: FAIL (Chrome: PASS)
    • add the class 'test' again to the element inserted before next_sibling_descendant: FAIL (Chrome: PASS)
    • add the class 'test' to the element inserted again before next_sibling_descendant: FAIL (Chrome: PASS)
    • insert element div[test_attr] before next_sibling_descendant: FAIL (Chrome: PASS)
    • insert element div.test after subject_ancestor: FAIL (Chrome: PASS)
    • add the class 'test' again to the element inserted after subject_ancestor: FAIL (Chrome: PASS)
    • add the class 'test' to the element inserted again after subject_ancestor: FAIL (Chrome: PASS)
    • insert element div[test_attr] after subject_ancestor: FAIL (Chrome: PASS)
    • insert element div.test after subject_parent: FAIL (Chrome: PASS)
    • add the class 'test' again to the element inserted after subject_parent: FAIL (Chrome: PASS)
    • add the class 'test' to the element inserted again after subject_parent: FAIL (Chrome: PASS)
    • insert element div[test_attr] after subject_parent: FAIL (Chrome: PASS)
    • insert element div.test after subject: FAIL (Chrome: PASS)
    • add the class 'test' again to the element inserted after subject: FAIL (Chrome: PASS)
    • add the class 'test' to the element inserted again after subject: FAIL (Chrome: PASS)
    • insert element div[test_attr] after subject: FAIL (Chrome: PASS)
    • insert element div.test after subject_child: FAIL (Chrome: PASS)
    • add the class 'test' again to the element inserted after subject_child: FAIL (Chrome: PASS)
    • add the class 'test' to the element inserted again after subject_child: FAIL (Chrome: PASS)
    • insert element div[test_attr] after subject_child: FAIL (Chrome: PASS)
    • insert element div.test after subject_descendant: FAIL (Chrome: PASS)
    • add the class 'test' again to the element inserted after subject_descendant: FAIL (Chrome: PASS)
    • add the class 'test' to the element inserted again after subject_descendant: FAIL (Chrome: PASS)
    • insert element div[test_attr] after subject_descendant: FAIL (Chrome: PASS)
    • insert element div.test after next_sibling: FAIL (Chrome: PASS)
    • add the class 'test' again to the element inserted after next_sibling: FAIL (Chrome: PASS)
    • add the class 'test' to the element inserted again after next_sibling: FAIL (Chrome: PASS)
    • insert element div[test_attr] after next_sibling: FAIL (Chrome: PASS)
    • insert element div.test after next_sibling_child: FAIL (Chrome: PASS)
    • add the class 'test' again to the element inserted after next_sibling_child: FAIL (Chrome: PASS)
    • add the class 'test' to the element inserted again after next_sibling_child: FAIL (Chrome: PASS)
    • insert element div[test_attr] after next_sibling_child: FAIL (Chrome: PASS)
    • insert element div.test after next_sibling_descendant: FAIL (Chrome: PASS)
    • add the class 'test' again to the element inserted after next_sibling_descendant: FAIL (Chrome: PASS)
    • add the class 'test' to the element inserted again after next_sibling_descendant: FAIL (Chrome: PASS)
    • insert element div[test_attr] after next_sibling_descendant: FAIL (Chrome: PASS)
    • insert tree div>div.test before subject_parent: FAIL (Chrome: PASS)
    • add the class 'test' again to the element in the tree inserted before subject_parent: FAIL (Chrome: PASS)
    • add the class 'test' to the element in the tree inserted again before subject_parent: FAIL (Chrome: PASS)
    • insert element div>div[test_attr] before subject_parent: FAIL (Chrome: PASS)
    • insert tree div>div.test before subject: FAIL (Chrome: PASS)
    • add the class 'test' again to the element in the tree inserted before subject: FAIL (Chrome: PASS)
    • add the class 'test' to the element in the tree inserted again before subject: FAIL (Chrome: PASS)
    • insert element div>div[test_attr] before subject: FAIL (Chrome: PASS)
    • insert tree div>div.test before subject_child: FAIL (Chrome: PASS)
    • add the class 'test' again to the element in the tree inserted before subject_child: FAIL (Chrome: PASS)
    • add the class 'test' to the element in the tree inserted again before subject_child: FAIL (Chrome: PASS)
    • insert element div>div[test_attr] before subject_child: FAIL (Chrome: PASS)
    • insert tree div>div.test before subject_descendant: FAIL (Chrome: PASS)
    • add the class 'test' again to the element in the tree inserted before subject_descendant: FAIL (Chrome: PASS)
    • add the class 'test' to the element in the tree inserted again before subject_descendant: FAIL (Chrome: PASS)
    • insert element div>div[test_attr] before subject_descendant: FAIL (Chrome: PASS)
    • insert tree div>div.test before next_sibling: FAIL (Chrome: PASS)
    • add the class 'test' again to the element in the tree inserted before next_sibling: FAIL (Chrome: PASS)
    • add the class 'test' to the element in the tree inserted again before next_sibling: FAIL (Chrome: PASS)
    • insert element div>div[test_attr] before next_sibling: FAIL (Chrome: PASS)
    • insert tree div>div.test before next_sibling_child: FAIL (Chrome: PASS)
    • add the class 'test' again to the element in the tree inserted before next_sibling_child: FAIL (Chrome: PASS)
    • add the class 'test' to the element in the tree inserted again before next_sibling_child: FAIL (Chrome: PASS)
    • insert element div>div[test_attr] before next_sibling_child: FAIL (Chrome: PASS)
    • insert tree div>div.test before next_sibling_descendant: FAIL (Chrome: PASS)
    • add the class 'test' again to the element in the tree inserted before next_sibling_descendant: FAIL (Chrome: PASS)
    • add the class 'test' to the element in the tree inserted again before next_sibling_descendant: FAIL (Chrome: PASS)
    • insert element div>div[test_attr] before next_sibling_descendant: FAIL (Chrome: PASS)
    • insert tree div>div.test after subject_ancestor: FAIL (Chrome: PASS)
    • add the class 'test' again to the element in the tree inserted after subject_ancestor: FAIL (Chrome: PASS)
    • add the class 'test' to the element in the tree inserted again after subject_ancestor: FAIL (Chrome: PASS)
    • insert element div>div[test_attr] after subject_ancestor: FAIL (Chrome: PASS)
    • insert tree div>div.test after subject_parent: FAIL (Chrome: PASS)
    • add the class 'test' again to the element in the tree inserted after subject_parent: FAIL (Chrome: PASS)
    • add the class 'test' to the element in the tree inserted again after subject_parent: FAIL (Chrome: PASS)
    • insert element div>div[test_attr] after subject_parent: FAIL (Chrome: PASS)
    • insert tree div>div.test after subject: FAIL (Chrome: PASS)
    • add the class 'test' again to the element in the tree inserted after subject: FAIL (Chrome: PASS)
    • add the class 'test' to the element in the tree inserted again after subject: FAIL (Chrome: PASS)
    • insert element div>div[test_attr] after subject: FAIL (Chrome: PASS)
    • insert tree div>div.test after subject_child: FAIL (Chrome: PASS)
    • add the class 'test' again to the element in the tree inserted after subject_child: FAIL (Chrome: PASS)
    • add the class 'test' to the element in the tree inserted again after subject_child: FAIL (Chrome: PASS)
    • insert element div>div[test_attr] after subject_child: FAIL (Chrome: PASS)
    • insert tree div>div.test after subject_descendant: FAIL (Chrome: PASS)
    • add the class 'test' again to the element in the tree inserted after subject_descendant: FAIL (Chrome: PASS)
    • add the class 'test' to the element in the tree inserted again after subject_descendant: FAIL (Chrome: PASS)
    • insert element div>div[test_attr] after subject_descendant: FAIL (Chrome: PASS)
    • insert tree div>div.test after next_sibling: FAIL (Chrome: PASS)
    • add the class 'test' again to the element in the tree inserted after next_sibling: FAIL (Chrome: PASS)
    • add the class 'test' to the element in the tree inserted again after next_sibling: FAIL (Chrome: PASS)
    • insert element div>div[test_attr] after next_sibling: FAIL (Chrome: PASS)
    • insert tree div>div.test after next_sibling_child: FAIL (Chrome: PASS)
    • add the class 'test' again to the element in the tree inserted after next_sibling_child: FAIL (Chrome: PASS)
    • add the class 'test' to the element in the tree inserted again after next_sibling_child: FAIL (Chrome: PASS)
    • insert element div>div[test_attr] after next_sibling_child: FAIL (Chrome: PASS)
    • insert tree div>div.test after next_sibling_descendant: FAIL (Chrome: PASS)
    • add the class 'test' again to the element in the tree inserted after next_sibling_descendant: FAIL (Chrome: PASS)
    • add the class 'test' to the element in the tree inserted again after next_sibling_descendant: FAIL (Chrome: PASS)
    • insert element div>div[test_attr] after next_sibling_descendant: FAIL (Chrome: PASS)
  • /css/selectors/invalidation/has-in-parent-position.html [wpt.fyi]
    • add .test to subject: FAIL (Chrome: PASS)
    • add .test to subject_child: FAIL (Chrome: PASS)
    • add .test to subject_descendant: FAIL (Chrome: PASS)
    • insert element div.test before subject: FAIL (Chrome: PASS)
    • add the class 'test' again to the element inserted before subject: FAIL (Chrome: PASS)
    • add the class 'test' to the element inserted again before subject: FAIL (Chrome: PASS)
    • insert element div[test_attr] before subject: FAIL (Chrome: PASS)
    • insert element div.test before subject_child: FAIL (Chrome: PASS)
    • add the class 'test' again to the element inserted before subject_child: FAIL (Chrome: PASS)
    • add the class 'test' to the element inserted again before subject_child: FAIL (Chrome: PASS)
    • insert element div[test_attr] before subject_child: FAIL (Chrome: PASS)
    • insert element div.test before subject_descendant: FAIL (Chrome: PASS)
    • add the class 'test' again to the element inserted before subject_descendant: FAIL (Chrome: PASS)
    • add the class 'test' to the element inserted again before subject_descendant: FAIL (Chrome: PASS)
    • insert element div[test_attr] before subject_descendant: FAIL (Chrome: PASS)
    • insert element div.test after subject_parent: FAIL (Chrome: PASS)
    • add the class 'test' again to the element inserted after subject_parent: FAIL (Chrome: PASS)
    • add the class 'test' to the element inserted again after subject_parent: FAIL (Chrome: PASS)
    • insert element div[test_attr] after subject_parent: FAIL (Chrome: PASS)
    • insert element div.test after subject: FAIL (Chrome: PASS)
    • add the class 'test' again to the element inserted after subject: FAIL (Chrome: PASS)
    • add the class 'test' to the element inserted again after subject: FAIL (Chrome: PASS)
    • insert element div[test_attr] after subject: FAIL (Chrome: PASS)
    • insert element div.test after subject_child: FAIL (Chrome: PASS)
    • add the class 'test' again to the element inserted after subject_child: FAIL (Chrome: PASS)
    • add the class 'test' to the element inserted again after subject_child: FAIL (Chrome: PASS)
    • insert element div[test_attr] after subject_child: FAIL (Chrome: PASS)
    • insert element div.test after subject_descendant: FAIL (Chrome: PASS)
    • add the class 'test' again to the element inserted after subject_descendant: FAIL (Chrome: PASS)
    • add the class 'test' to the element inserted again after subject_descendant: FAIL (Chrome: PASS)
    • insert element div[test_attr] after subject_descendant: FAIL (Chrome: PASS)
    • insert tree div>div.test before subject: FAIL (Chrome: PASS)
    • add the class 'test' again to the element in the tree inserted before subject: FAIL (Chrome: PASS)
    • add the class 'test' to the element in the tree inserted again before subject: FAIL (Chrome: PASS)
    • insert element div>div[test_attr] before subject: FAIL (Chrome: PASS)
    • insert tree div>div.test before subject_child: FAIL (Chrome: PASS)
    • add the class 'test' again to the element in the tree inserted before subject_child: FAIL (Chrome: PASS)
    • add the class 'test' to the element in the tree inserted again before subject_child: FAIL (Chrome: PASS)
    • insert element div>div[test_attr] before subject_child: FAIL (Chrome: PASS)
    • insert tree div>div.test before subject_descendant: FAIL (Chrome: PASS)
    • add the class 'test' again to the element in the tree inserted before subject_descendant: FAIL (Chrome: PASS)
    • add the class 'test' to the element in the tree inserted again before subject_descendant: FAIL (Chrome: PASS)
    • insert element div>div[test_attr] before subject_descendant: FAIL (Chrome: PASS)
    • insert tree div>div.test after subject_parent: FAIL (Chrome: PASS)
    • add the class 'test' again to the element in the tree inserted after subject_parent: FAIL (Chrome: PASS)
    • add the class 'test' to the element in the tree inserted again after subject_parent: FAIL (Chrome: PASS)
    • insert element div>div[test_attr] after subject_parent: FAIL (Chrome: PASS)
    • insert tree div>div.test after subject: FAIL (Chrome: PASS)
    • add the class 'test' again to the element in the tree inserted after subject: FAIL (Chrome: PASS)
    • add the class 'test' to the element in the tree inserted again after subject: FAIL (Chrome: PASS)
    • insert element div>div[test_attr] after subject: FAIL (Chrome: PASS)
    • insert tree div>div.test after subject_child: FAIL (Chrome: PASS)
    • add the class 'test' again to the element in the tree inserted after subject_child: FAIL (Chrome: PASS)
    • add the class 'test' to the element in the tree inserted again after subject_child: FAIL (Chrome: PASS)
    • insert element div>div[test_attr] after subject_child: FAIL (Chrome: PASS)
    • insert tree div>div.test after subject_descendant: FAIL (Chrome: PASS)
    • add the class 'test' again to the element in the tree inserted after subject_descendant: FAIL (Chrome: PASS)
    • add the class 'test' to the element in the tree inserted again after subject_descendant: FAIL (Chrome: PASS)
    • insert element div>div[test_attr] after subject_descendant: FAIL (Chrome: PASS)
  • /css/selectors/invalidation/has-in-sibling-position.html [wpt.fyi]
    • add .test to previous_sibling_child: FAIL (Chrome: PASS)
    • add .test to previous_sibling_descendant: FAIL (Chrome: PASS)
    • add .test to subject: FAIL (Chrome: PASS)
    • add .test to next_sibling: FAIL (Chrome: PASS)
    • add .test to next_sibling_child: FAIL (Chrome: PASS)
    • add .test to next_sibling_descendant: FAIL (Chrome: PASS)
    • insert element div.test before previous_sibling_child: FAIL (Chrome: PASS)
    • add the class 'test' again to the element inserted before previous_sibling_child: FAIL (Chrome: PASS)
    • add the class 'test' to the element inserted again before previous_sibling_child: FAIL (Chrome: PASS)
    • insert element div[test_attr] before previous_sibling_child: FAIL (Chrome: PASS)
    • insert element div.test before previous_sibling_descendant: FAIL (Chrome: PASS)
    • add the class 'test' again to the element inserted before previous_sibling_descendant: FAIL (Chrome: PASS)
    • add the class 'test' to the element inserted again before previous_sibling_descendant: FAIL (Chrome: PASS)
    • insert element div[test_attr] before previous_sibling_descendant: FAIL (Chrome: PASS)
    • insert element div.test before subject: FAIL (Chrome: PASS)
    • add the class 'test' again to the element inserted before subject: FAIL (Chrome: PASS)
    • add the class 'test' to the element inserted again before subject: FAIL (Chrome: PASS)
    • insert element div[test_attr] before subject: FAIL (Chrome: PASS)
    • insert element div.test before next_sibling: FAIL (Chrome: PASS)
    • add the class 'test' again to the element inserted before next_sibling: FAIL (Chrome: PASS)
    • add the class 'test' to the element inserted again before next_sibling: FAIL (Chrome: PASS)
    • insert element div[test_attr] before next_sibling: FAIL (Chrome: PASS)
    • insert element div.test before next_sibling_child: FAIL (Chrome: PASS)
    • add the class 'test' again to the element inserted before next_sibling_child: FAIL (Chrome: PASS)
    • add the class 'test' to the element inserted again before next_sibling_child: FAIL (Chrome: PASS)
    • insert element div[test_attr] before next_sibling_child: FAIL (Chrome: PASS)
    • insert element div.test before next_sibling_descendant: FAIL (Chrome: PASS)
    • add the class 'test' again to the element inserted before next_sibling_descendant: FAIL (Chrome: PASS)
    • add the class 'test' to the element inserted again before next_sibling_descendant: FAIL (Chrome: PASS)
    • insert element div[test_attr] before next_sibling_descendant: FAIL (Chrome: PASS)
    • insert element div.test after previous_sibling: FAIL (Chrome: PASS)
    • add the class 'test' again to the element inserted after previous_sibling: FAIL (Chrome: PASS)
    • add the class 'test' to the element inserted again after previous_sibling: FAIL (Chrome: PASS)
    • insert element div[test_attr] after previous_sibling: FAIL (Chrome: PASS)
    • insert element div.test after previous_sibling_child: FAIL (Chrome: PASS)
    • add the class 'test' again to the element inserted after previous_sibling_child: FAIL (Chrome: PASS)
    • add the class 'test' to the element inserted again after previous_sibling_child: FAIL (Chrome: PASS)
    • insert element div[test_attr] after previous_sibling_child: FAIL (Chrome: PASS)
    • insert element div.test after previous_sibling_descendant: FAIL (Chrome: PASS)
    • add the class 'test' again to the element inserted after previous_sibling_descendant: FAIL (Chrome: PASS)
    • add the class 'test' to the element inserted again after previous_sibling_descendant: FAIL (Chrome: PASS)
    • insert element div[test_attr] after previous_sibling_descendant: FAIL (Chrome: PASS)
    • insert element div.test after subject: FAIL (Chrome: PASS)
    • add the class 'test' again to the element inserted after subject: FAIL (Chrome: PASS)
    • add the class 'test' to the element inserted again after subject: FAIL (Chrome: PASS)
    • insert element div[test_attr] after subject: FAIL (Chrome: PASS)
    • insert element div.test after next_sibling: FAIL (Chrome: PASS)
    • add the class 'test' again to the element inserted after next_sibling: FAIL (Chrome: PASS)
    • add the class 'test' to the element inserted again after next_sibling: FAIL (Chrome: PASS)
    • insert element div[test_attr] after next_sibling: FAIL (Chrome: PASS)
    • insert element div.test after next_sibling_child: FAIL (Chrome: PASS)
    • add the class 'test' again to the element inserted after next_sibling_child: FAIL (Chrome: PASS)
    • add the class 'test' to the element inserted again after next_sibling_child: FAIL (Chrome: PASS)
    • insert element div[test_attr] after next_sibling_child: FAIL (Chrome: PASS)
    • insert element div.test after next_sibling_descendant: FAIL (Chrome: PASS)
    • add the class 'test' again to the element inserted after next_sibling_descendant: FAIL (Chrome: PASS)
    • add the class 'test' to the element inserted again after next_sibling_descendant: FAIL (Chrome: PASS)
    • insert element div[test_attr] after next_sibling_descendant: FAIL (Chrome: PASS)
    • insert tree div>div.test before previous_sibling: FAIL (Chrome: PASS)
    • add the class 'test' again to the element in the tree inserted before previous_sibling: FAIL (Chrome: PASS)
    • add the class 'test' to the element in the tree inserted again before previous_sibling: FAIL (Chrome: PASS)
    • insert element div>div[test_attr] before previous_sibling: FAIL (Chrome: PASS)
    • insert tree div>div.test before previous_sibling_child: FAIL (Chrome: PASS)
    • add the class 'test' again to the element in the tree inserted before previous_sibling_child: FAIL (Chrome: PASS)
    • add the class 'test' to the element in the tree inserted again before previous_sibling_child: FAIL (Chrome: PASS)
    • insert element div>div[test_attr] before previous_sibling_child: FAIL (Chrome: PASS)
    • insert tree div>div.test before previous_sibling_descendant: FAIL (Chrome: PASS)
    • add the class 'test' again to the element in the tree inserted before previous_sibling_descendant: FAIL (Chrome: PASS)
    • add the class 'test' to the element in the tree inserted again before previous_sibling_descendant: FAIL (Chrome: PASS)
    • insert element div>div[test_attr] before previous_sibling_descendant: FAIL (Chrome: PASS)
    • insert tree div>div.test before subject: FAIL (Chrome: PASS)
    • add the class 'test' again to the element in the tree inserted before subject: FAIL (Chrome: PASS)
    • add the class 'test' to the element in the tree inserted again before subject: FAIL (Chrome: PASS)
    • insert element div>div[test_attr] before subject: FAIL (Chrome: PASS)
    • insert tree div>div.test before next_sibling: FAIL (Chrome: PASS)
    • add the class 'test' again to the element in the tree inserted before next_sibling: FAIL (Chrome: PASS)
    • add the class 'test' to the element in the tree inserted again before next_sibling: FAIL (Chrome: PASS)
    • insert element div>div[test_attr] before next_sibling: FAIL (Chrome: PASS)
    • insert tree div>div.test before next_sibling_child: FAIL (Chrome: PASS)
    • add the class 'test' again to the element in the tree inserted before next_sibling_child: FAIL (Chrome: PASS)
    • add the class 'test' to the element in the tree inserted again before next_sibling_child: FAIL (Chrome: PASS)
    • insert element div>div[test_attr] before next_sibling_child: FAIL (Chrome: PASS)
    • insert tree div>div.test before next_sibling_descendant: FAIL (Chrome: PASS)
    • add the class 'test' again to the element in the tree inserted before next_sibling_descendant: FAIL (Chrome: PASS)
    • add the class 'test' to the element in the tree inserted again before next_sibling_descendant: FAIL (Chrome: PASS)
    • insert element div>div[test_attr] before next_sibling_descendant: FAIL (Chrome: PASS)
    • insert tree div>div.test after previous_sibling: FAIL (Chrome: PASS)
    • add the class 'test' again to the element in the tree inserted after previous_sibling: FAIL (Chrome: PASS)
    • add the class 'test' to the element in the tree inserted again after previous_sibling: FAIL (Chrome: PASS)
    • insert element div>div[test_attr] after previous_sibling: FAIL (Chrome: PASS)
    • insert tree div>div.test after previous_sibling_child: FAIL (Chrome: PASS)
    • add the class 'test' again to the element in the tree inserted after previous_sibling_child: FAIL (Chrome: PASS)
    • add the class 'test' to the element in the tree inserted again after previous_sibling_child: FAIL (Chrome: PASS)
    • insert element div>div[test_attr] after previous_sibling_child: FAIL (Chrome: PASS)
    • insert tree div>div.test after previous_sibling_descendant: FAIL (Chrome: PASS)
    • add the class 'test' again to the element in the tree inserted after previous_sibling_descendant: FAIL (Chrome: PASS)
    • add the class 'test' to the element in the tree inserted again after previous_sibling_descendant: FAIL (Chrome: PASS)
    • insert element div>div[test_attr] after previous_sibling_descendant: FAIL (Chrome: PASS)
    • insert tree div>div.test after subject: FAIL (Chrome: PASS)
    • add the class 'test' again to the element in the tree inserted after subject: FAIL (Chrome: PASS)
    • add the class 'test' to the element in the tree inserted again after subject: FAIL (Chrome: PASS)
    • insert element div>div[test_attr] after subject: FAIL (Chrome: PASS)
    • insert tree div>div.test after next_sibling: FAIL (Chrome: PASS)
    • add the class 'test' again to the element in the tree inserted after next_sibling: FAIL (Chrome: PASS)
    • add the class 'test' to the element in the tree inserted again after next_sibling: FAIL (Chrome: PASS)
    • insert element div>div[test_attr] after next_sibling: FAIL (Chrome: PASS)
    • insert tree div>div.test after next_sibling_child: FAIL (Chrome: PASS)
    • add the class 'test' again to the element in the tree inserted after next_sibling_child: FAIL (Chrome: PASS)
    • add the class 'test' to the element in the tree inserted again after next_sibling_child: FAIL (Chrome: PASS)
    • insert element div>div[test_attr] after next_sibling_child: FAIL (Chrome: PASS)
    • insert tree div>div.test after next_sibling_descendant: FAIL (Chrome: PASS)
    • add the class 'test' again to the element in the tree inserted after next_sibling_descendant: FAIL (Chrome: PASS)
    • add the class 'test' to the element in the tree inserted again after next_sibling_descendant: FAIL (Chrome: PASS)
    • insert element div>div[test_attr] after next_sibling_descendant: FAIL (Chrome: PASS)
Pushed by wptsync@mozilla.com: https://hg.mozilla.org/integration/autoland/rev/79f535715635 [wpt PR 33712] - Fix :has() invalidation bug on the inserted element/subtree, a=testonly https://hg.mozilla.org/integration/autoland/rev/7c425c99c8f8 [wpt PR 33712] - Update wpt metadata, a=testonly
Status: NEW → RESOLVED
Closed: 3 years ago
Resolution: --- → FIXED
Target Milestone: --- → 102 Branch
You need to log in before you can comment on or make changes to this bug.