Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: 9b67f95c4810d05d68b047eb9e84b48f7826783d
      
https://github.com/WebKit/WebKit/commit/9b67f95c4810d05d68b047eb9e84b48f7826783d
  Author: Antti Koivisto <[email protected]>
  Date:   2024-01-04 (Thu, 04 Jan 2024)

  Changed paths:
    M Source/WebCore/css/SelectorChecker.cpp
    M Source/WebCore/dom/Element.cpp
    M Source/WebCore/dom/Element.h
    M Source/WebCore/dom/Node.cpp
    M Source/WebCore/dom/Node.h
    M Source/WebCore/style/ChildChangeInvalidation.cpp
    M Source/WebCore/style/ChildChangeInvalidation.h
    M Source/WebCore/style/RuleFeature.cpp
    M Source/WebCore/style/StyleRelations.cpp
    M Source/WebCore/style/StyleRelations.h

  Log Message:
  -----------
  REGRESSION(268038@main): poor performance with :has(+ :not(.class)) 
pseudo-class selector
https://bugs.webkit.org/show_bug.cgi?id=267078
rdar://119819247

Reviewed by Cameron McCormack.

The selector gets misclassified as scope breaking.
Fixing the issue reveals it was hiding other invalidation bugs.

* Source/WebCore/css/SelectorChecker.cpp:
(WebCore::SelectorChecker::matchHasPseudoClass const):

Add a new flag for the case where element is affected by :has() containing 
:nth-child() and similar.
The use of existing flags didn't work correctly in all situations because they 
would get wiped at
wrong time.

* Source/WebCore/dom/Element.cpp:
(WebCore::Element::resetStyleRelations):
* Source/WebCore/dom/Element.h:
(WebCore::Element::affectedByHasWithPositionalPseudoClass const):
(WebCore::Element::setAffectedByHasWithPositionalPseudoClass):
* Source/WebCore/dom/Node.cpp:
(WebCore::Node::adjustStyleValidity):
* Source/WebCore/dom/Node.h:
(WebCore::Node::hasInvalidRenderer const):
(WebCore::Node::setHasValidStyle):

Juggle the flags around to make space.

* Source/WebCore/style/ChildChangeInvalidation.cpp:
(WebCore::Style::ChildChangeInvalidation::invalidateForHasBeforeMutation):
(WebCore::Style::ChildChangeInvalidation::invalidateForHasAfterMutation):

Handle text node insertions and removals since they may affect :empty state 
within :has().
Test for the new :nth-child() flag instead of the old ones.

* Source/WebCore/style/ChildChangeInvalidation.h:
(WebCore::Style::ChildChangeInvalidation::ChildChangeInvalidation):
* Source/WebCore/style/RuleFeature.cpp:
(WebCore::Style::RuleFeatureSet::recursivelyCollectFeaturesFromSelector):

Break out of the loop if the current selector is the leftmost one before 
computing
MatchElement/IsScopeBreaking. Selector :not(.class) would get computed as scope 
breaking
even though there is nothing on the left of .class. Also stop 
CanBreakScope::Yes from affecting
subsequent selectors after the one that can actually leak the scope.

* Source/WebCore/style/StyleRelations.cpp:
(WebCore::Style::commitRelationsToRenderStyle):
(WebCore::Style::commitRelations):
* Source/WebCore/style/StyleRelations.h:

Canonical link: https://commits.webkit.org/272678@main


_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to