Title: [287540] trunk/Source/WebCore
Revision
287540
Author
[email protected]
Date
2022-01-03 07:43:51 -0800 (Mon, 03 Jan 2022)

Log Message

PseudoClassChangeInvalidation should allow multiple pseudo classes as argument
https://bugs.webkit.org/show_bug.cgi?id=234810

Reviewed by Alan Bujtas.

It is common to invalidate multiple pseudo-classes together (say :disabled and :enabled).

* dom/Element.cpp:
(WebCore::Element::setFocus):
* html/HTMLFormControlElement.cpp:
(WebCore::HTMLFormControlElement::setAncestorDisabled):
(WebCore::HTMLFormControlElement::parseAttribute):
* html/HTMLOptGroupElement.cpp:
(WebCore::HTMLOptGroupElement::parseAttribute):
* html/HTMLOptionElement.cpp:
(WebCore::HTMLOptionElement::parseAttribute):
* style/PseudoClassChangeInvalidation.h:
(WebCore::Style::PseudoClassChangeInvalidation::PseudoClassChangeInvalidation):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (287539 => 287540)


--- trunk/Source/WebCore/ChangeLog	2022-01-03 14:54:54 UTC (rev 287539)
+++ trunk/Source/WebCore/ChangeLog	2022-01-03 15:43:51 UTC (rev 287540)
@@ -1,3 +1,24 @@
+2022-01-03  Antti Koivisto  <[email protected]>
+
+        PseudoClassChangeInvalidation should allow multiple pseudo classes as argument
+        https://bugs.webkit.org/show_bug.cgi?id=234810
+
+        Reviewed by Alan Bujtas.
+
+        It is common to invalidate multiple pseudo-classes together (say :disabled and :enabled).
+
+        * dom/Element.cpp:
+        (WebCore::Element::setFocus):
+        * html/HTMLFormControlElement.cpp:
+        (WebCore::HTMLFormControlElement::setAncestorDisabled):
+        (WebCore::HTMLFormControlElement::parseAttribute):
+        * html/HTMLOptGroupElement.cpp:
+        (WebCore::HTMLOptGroupElement::parseAttribute):
+        * html/HTMLOptionElement.cpp:
+        (WebCore::HTMLOptionElement::parseAttribute):
+        * style/PseudoClassChangeInvalidation.h:
+        (WebCore::Style::PseudoClassChangeInvalidation::PseudoClassChangeInvalidation):
+
 2022-01-03  Alan Bujtas  <[email protected]>
 
         [LFC][IFC] Take grapheme clusters into account at TextUtil::breakWord

Modified: trunk/Source/WebCore/dom/Element.cpp (287539 => 287540)


--- trunk/Source/WebCore/dom/Element.cpp	2022-01-03 14:54:54 UTC (rev 287539)
+++ trunk/Source/WebCore/dom/Element.cpp	2022-01-03 15:43:51 UTC (rev 287540)
@@ -847,22 +847,20 @@
 {
     if (flag == focused())
         return;
-    {
-        Style::PseudoClassChangeInvalidation focusStyleInvalidation(*this, CSSSelector::PseudoClassFocus);
-        Style::PseudoClassChangeInvalidation focusVisibleStyleInvalidation(*this, CSSSelector::PseudoClassFocusVisible);
-        document().userActionElements().setFocused(*this, flag);
+    
+    Style::PseudoClassChangeInvalidation focusStyleInvalidation(*this, { CSSSelector::PseudoClassFocus, CSSSelector::PseudoClassFocusVisible });
+    document().userActionElements().setFocused(*this, flag);
 
-        // Shadow host with a slot that contain focused element is not considered focused.
-        for (auto* root = containingShadowRoot(); root; root = root->host()->containingShadowRoot()) {
-            root->setContainsFocusedElement(flag);
-            root->host()->invalidateStyle();
-        }
+    // Shadow host with a slot that contain focused element is not considered focused.
+    for (auto* root = containingShadowRoot(); root; root = root->host()->containingShadowRoot()) {
+        root->setContainsFocusedElement(flag);
+        root->host()->invalidateStyle();
+    }
 
-        for (auto* element = this; element; element = element->parentElementInComposedTree())
-            element->setHasFocusWithin(flag);
+    for (auto* element = this; element; element = element->parentElementInComposedTree())
+        element->setHasFocusWithin(flag);
 
-        setHasFocusVisible(flag && (visibility == FocusVisibility::Visible || shouldAlwaysHaveFocusVisibleWhenFocused(*this)));
-    }
+    setHasFocusVisible(flag && (visibility == FocusVisibility::Visible || shouldAlwaysHaveFocusVisibleWhenFocused(*this)));
 }
 
 void Element::setHasFocusVisible(bool flag)

Modified: trunk/Source/WebCore/html/HTMLFormControlElement.cpp (287539 => 287540)


--- trunk/Source/WebCore/html/HTMLFormControlElement.cpp	2022-01-03 14:54:54 UTC (rev 287539)
+++ trunk/Source/WebCore/html/HTMLFormControlElement.cpp	2022-01-03 15:43:51 UTC (rev 287540)
@@ -147,8 +147,7 @@
     if (m_disabledByAncestorFieldset == isDisabled)
         return;
 
-    Style::PseudoClassChangeInvalidation disabledInvalidation(*this, CSSSelector::PseudoClassDisabled);
-    Style::PseudoClassChangeInvalidation enabledInvalidation(*this, CSSSelector::PseudoClassEnabled);
+    Style::PseudoClassChangeInvalidation disabledInvalidation(*this, { CSSSelector::PseudoClassDisabled, CSSSelector::PseudoClassEnabled });
 
     m_disabledByAncestorFieldset = isDisabled;
     disabledStateChanged();
@@ -162,8 +161,7 @@
         if (canBeActuallyDisabled()) {
             bool newDisabled = !value.isNull();
             if (m_disabled != newDisabled) {
-                Style::PseudoClassChangeInvalidation disabledInvalidation(*this, CSSSelector::PseudoClassDisabled);
-                Style::PseudoClassChangeInvalidation enabledInvalidation(*this, CSSSelector::PseudoClassEnabled);
+                Style::PseudoClassChangeInvalidation disabledInvalidation(*this, { CSSSelector::PseudoClassDisabled, CSSSelector::PseudoClassEnabled });
                 m_disabled = newDisabled;
                 disabledAttributeChanged();
             }

Modified: trunk/Source/WebCore/html/HTMLOptGroupElement.cpp (287539 => 287540)


--- trunk/Source/WebCore/html/HTMLOptGroupElement.cpp	2022-01-03 14:54:54 UTC (rev 287539)
+++ trunk/Source/WebCore/html/HTMLOptGroupElement.cpp	2022-01-03 15:43:51 UTC (rev 287540)
@@ -89,14 +89,11 @@
     if (name == disabledAttr) {
         bool newDisabled = !value.isNull();
         if (m_isDisabled != newDisabled) {
-            Style::PseudoClassChangeInvalidation disabledInvalidation(*this, CSSSelector::PseudoClassDisabled);
-            Style::PseudoClassChangeInvalidation enabledInvalidation(*this, CSSSelector::PseudoClassEnabled);
+            Style::PseudoClassChangeInvalidation disabledInvalidation(*this, { CSSSelector::PseudoClassDisabled, CSSSelector::PseudoClassEnabled });
 
             Vector<Style::PseudoClassChangeInvalidation> optionInvalidation;
-            for (auto& descendant : descendantsOfType<HTMLOptionElement>(*this)) {
-                optionInvalidation.append({ descendant, CSSSelector::PseudoClassDisabled });
-                optionInvalidation.append({ descendant, CSSSelector::PseudoClassEnabled });
-            }
+            for (auto& descendant : descendantsOfType<HTMLOptionElement>(*this))
+                optionInvalidation.append({ descendant, { CSSSelector::PseudoClassDisabled, CSSSelector::PseudoClassEnabled } });
 
             m_isDisabled = newDisabled;
         }

Modified: trunk/Source/WebCore/html/HTMLOptionElement.cpp (287539 => 287540)


--- trunk/Source/WebCore/html/HTMLOptionElement.cpp	2022-01-03 14:54:54 UTC (rev 287539)
+++ trunk/Source/WebCore/html/HTMLOptionElement.cpp	2022-01-03 15:43:51 UTC (rev 287540)
@@ -178,8 +178,7 @@
     if (name == disabledAttr) {
         bool newDisabled = !value.isNull();
         if (m_disabled != newDisabled) {
-            Style::PseudoClassChangeInvalidation disabledInvalidation(*this, CSSSelector::PseudoClassDisabled);
-            Style::PseudoClassChangeInvalidation enabledInvalidation(*this, CSSSelector::PseudoClassEnabled);
+            Style::PseudoClassChangeInvalidation disabledInvalidation(*this, { CSSSelector::PseudoClassDisabled, CSSSelector::PseudoClassEnabled });
             m_disabled = newDisabled;
             if (renderer() && renderer()->style().hasEffectiveAppearance())
                 renderer()->theme().stateChanged(*renderer(), ControlStates::States::Enabled);

Modified: trunk/Source/WebCore/style/PseudoClassChangeInvalidation.h (287539 => 287540)


--- trunk/Source/WebCore/style/PseudoClassChangeInvalidation.h	2022-01-03 14:54:54 UTC (rev 287539)
+++ trunk/Source/WebCore/style/PseudoClassChangeInvalidation.h	2022-01-03 15:43:51 UTC (rev 287540)
@@ -36,6 +36,8 @@
 class PseudoClassChangeInvalidation {
 public:
     PseudoClassChangeInvalidation(Element&, CSSSelector::PseudoClassType, InvalidationScope = InvalidationScope::All);
+    PseudoClassChangeInvalidation(Element&, std::initializer_list<CSSSelector::PseudoClassType>, InvalidationScope = InvalidationScope::All);
+
     ~PseudoClassChangeInvalidation();
 
 private:
@@ -60,6 +62,17 @@
     invalidateStyleWithRuleSets();
 }
 
+inline PseudoClassChangeInvalidation::PseudoClassChangeInvalidation(Element& element, std::initializer_list<CSSSelector::PseudoClassType> pseudoClasses, Style::InvalidationScope invalidationScope)
+    : m_isEnabled(element.needsStyleInvalidation())
+    , m_element(element)
+{
+    if (!m_isEnabled)
+        return;
+    for (auto pseudoClass : pseudoClasses)
+        computeInvalidation(pseudoClass, invalidationScope);
+    invalidateStyleWithRuleSets();
+}
+
 inline PseudoClassChangeInvalidation::~PseudoClassChangeInvalidation()
 {
     if (!m_isEnabled)
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to