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)