Skip to content

Commit

Permalink
:empty selector with animation not working properly
Browse files Browse the repository at this point in the history
https://bugs.webkit.org/show_bug.cgi?id=269051
rdar://122838142

Reviewed by Antti Koivisto.

If an element is targeted by an animation, it may cause style updates with an `AnimationOnly` resolution type.
When `Style::TreeResolver::resolveElement()` is called for that element, `resetStyleRelations()` is called on
that element first under `Style::TreeResolver::resolveComposedTree()` while iterating through the composed tree.

If an `:empty` pseudo-class rule matches that element, that call to `resetStyleRelations()` will remove the
`StyleAffectedByEmpty` flag on that element, but it will not be recomputed under `resolveElement()` because when
`styleForStyleable()` is called the `AnimationOnly` resolution type will mean that we clone the cached last style
resolution style to return the `ResolvedStyle` value, clear of any relations.

We now avoid calling `resetStyleRelations()` if the resolution type is `AnimationOnly`, ensuring that relations
are preserved throughout animation updates.

* LayoutTests/imported/w3c/web-platform-tests/css/css-animations/empty-pseudo-class-with-animation-expected.txt: Added.
* LayoutTests/imported/w3c/web-platform-tests/css/css-animations/empty-pseudo-class-with-animation.html: Added.
* Source/WebCore/style/StyleTreeResolver.cpp:
(WebCore::Style::TreeResolver::resolveComposedTree):

Canonical link: https://commits.webkit.org/275832@main
  • Loading branch information
graouts committed Mar 8, 2024
1 parent eaa411f commit 319ecb9
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 1 deletion.
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@

PASS Setting an "animation" style property on an element does not interfere with the :empty pseudo-class.

Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
<!DOCTYPE html>
<link rel="author" href="mailto:graouts@apple.com">
<link rel="help" href="https://drafts.csswg.org/css-animations/">
<link rel="help" href="https://drafts.csswg.org/selectors/#the-empty-pseudo">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/css/css-animations/support/testcommon.js"></script>

<div class="container"></div>

<style>

.container {
width: 100px;
height: 100px;
background-color: rgb(0, 255, 0);
}

.container:empty {
background-color: rgb(255, 0, 0);
animation: anim 1s;
}

@keyframes anim { }

</style>

<script>

promise_test(async () => {
const container = document.querySelector(".container");
const computedStyle = getComputedStyle(container);

// Check that the :empty rule applies initially.
assert_equals(computedStyle.backgroundColor, 'rgb(255, 0, 0)',
'The initial background-color matches the value set by the :empty rule.');

// Await a couple of frames to let any animation-related style updates happen.
await waitForAnimationFrames(2);

// Append a child which should no longer let the :empty rule apply.
container.appendChild(document.createElement("span"));
assert_equals(computedStyle.backgroundColor, 'rgb(0, 255, 0)',
'The background-color after inserting a child into the container no longer matches the value set by the :empty rule.');
}, 'Setting an "animation" style property on an element does not interfere with the :empty pseudo-class.');

</script>
4 changes: 3 additions & 1 deletion Source/WebCore/style/StyleTreeResolver.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -999,7 +999,9 @@ void TreeResolver::resolveComposedTree()
auto resolutionType = determineResolutionType(element, style, parent.descendantsToResolve, parent.change);
if (resolutionType) {
element.resetComputedStyle();
element.resetStyleRelations();

if (*resolutionType != ResolutionType::AnimationOnly)
element.resetStyleRelations();

if (element.hasCustomStyleResolveCallbacks())
element.willRecalcStyle(parent.change);
Expand Down

0 comments on commit 319ecb9

Please sign in to comment.