Skip to content

Conversation

@anttijk
Copy link
Contributor

@anttijk anttijk commented Oct 15, 2025

3ec44e3

Replace PseudoIdSet with EnumSet<PseudoId>
https://bugs.webkit.org/show_bug.cgi?id=300396
rdar://162214153

Reviewed by Sam Weinig.

Add a generic EnumSet class and use it for PseudoIds.

EnumSet has the same interface as OptionSet but does not require using bitmask style enum.
This makes it more convenient to use especially when compact storage for individual values is also important.

Tests: Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj
       Tools/TestWebKitAPI/Tests/WTF/EnumSet.cpp
* Source/WTF/WTF.xcodeproj/project.pbxproj:
* Source/WTF/wtf/EnumSet.h: Added.
(WTF::requires):
(WTF::EnumSet::storageSize):
(WTF::EnumSet::Iterator::operator* const):
(WTF::EnumSet::Iterator::operator++):
(WTF::EnumSet::Iterator::Iterator):
(WTF::EnumSet::fromRaw):
(WTF::EnumSet::EnumSet):
(WTF::EnumSet::toRaw const):
(WTF::EnumSet::isEmpty const):
(WTF::EnumSet::begin const):
(WTF::EnumSet::end const):
(WTF::EnumSet::operator bool const):
(WTF::EnumSet::contains const):
(WTF::EnumSet::containsAny const):
(WTF::EnumSet::containsAll const):
(WTF::EnumSet::containsOnly const):
(WTF::EnumSet::add):
(WTF::EnumSet::remove):
(WTF::EnumSet::set):
(WTF::EnumSet::hasExactlyOneBitSet const):
(WTF::EnumSet::toSingleValue const):
(WTF::EnumSet::operator|):
(WTF::EnumSet::operator|=):
(WTF::EnumSet::operator&):
(WTF::EnumSet::operator-):
(WTF::EnumSet::operator^):
(WTF::EnumSet::storageMemoryOffset):
(WTF::EnumSet::get const):
* Source/WTF/wtf/Forward.h:
* Source/WebCore/animation/WebAnimationUtilities.h:
* Source/WebCore/css/SelectorChecker.cpp:
(WebCore::SelectorChecker::match const):
(WebCore::SelectorChecker::matchHostPseudoClass const):
(WebCore::hasViewTransitionPseudoElement):
(WebCore::hasScrollbarPseudoElement):
(WebCore::SelectorChecker::matchRecursively const):
(WebCore::SelectorChecker::checkOne const):
(WebCore::SelectorChecker::matchSelectorList const):
(WebCore::SelectorChecker::matchHasPseudoClass const):
* Source/WebCore/css/SelectorChecker.h:
* Source/WebCore/cssjit/SelectorCompiler.cpp:
(WebCore::SelectorCompiler::SelectorCodeGenerator::generateRequestedPseudoElementEqualsToSelectorPseudoElement):
(WebCore::SelectorCompiler::SelectorCodeGenerator::generateMarkPseudoStyleForPseudoElement):
* Source/WebCore/inspector/agents/InspectorCSSAgent.cpp:
(WebCore::InspectorCSSAgent::getMatchedStylesForNode):
* Source/WebCore/inspector/agents/InspectorDOMAgent.cpp:
(WebCore::InspectorDOMAgent::highlightSelector):
* Source/WebCore/rendering/RenderElement.cpp:
(WebCore::RenderElement::getCachedPseudoStyle const):
(WebCore::RenderElement::getUncachedPseudoStyle const):
* Source/WebCore/rendering/style/RenderStyle.cpp:
(WebCore::RenderStyle::RenderStyle):
* Source/WebCore/rendering/style/RenderStyle.h:
* Source/WebCore/rendering/style/RenderStyleConstants.h:
(WebCore::PseudoIdSet::PseudoIdSet): Deleted.
(WebCore::PseudoIdSet::fromMask): Deleted.
(WebCore::PseudoIdSet::has const): Deleted.
(WebCore::PseudoIdSet::add): Deleted.
(WebCore::PseudoIdSet::remove): Deleted.
(WebCore::PseudoIdSet::merge): Deleted.
(WebCore::PseudoIdSet::operator & const): Deleted.
(WebCore::PseudoIdSet::operator | const): Deleted.
(WebCore::PseudoIdSet::operator bool const): Deleted.
(WebCore::PseudoIdSet::data const): Deleted.
(WebCore::PseudoIdSet::dataMemoryOffset): Deleted.
* Source/WebCore/rendering/style/RenderStyleInlines.h:
(WebCore::RenderStyle::pseudoElementType const):
(WebCore::RenderStyle::NonInheritedFlags::hasPseudoStyle const):
(WebCore::RenderStyle::NonInheritedFlags::hasAnyPublicPseudoStyles const):
* Source/WebCore/rendering/style/RenderStyleSetters.h:
(WebCore::RenderStyle::setHasPseudoStyles):
(WebCore::RenderStyle::NonInheritedFlags::setHasPseudoStyles):
(WebCore::RenderStyle::setPseudoElementType):
* Source/WebCore/style/ElementRuleCollector.cpp:
(WebCore::Style::ElementRuleCollector::ruleMatches):
* Source/WebCore/style/ElementRuleCollector.h:
(WebCore::Style::ElementRuleCollector::matchedPseudoElementIds const):
* Source/WebCore/style/PseudoElementIdentifier.h:
(WTF::HashTraits<WebCore::Style::PseudoElementIdentifier>::emptyValue):
(WTF::HashTraits<WebCore::Style::PseudoElementIdentifier>::constructDeletedValue):
(WTF::HashTraits<WebCore::Style::PseudoElementIdentifier>::isDeletedValue):
(WTF::HashTraits<std::optional<WebCore::Style::PseudoElementIdentifier>>::emptyValue):
(WTF::HashTraits<std::optional<WebCore::Style::PseudoElementIdentifier>>::constructDeletedValue):
(WTF::HashTraits<std::optional<WebCore::Style::PseudoElementIdentifier>>::isDeletedValue):
* Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
* Tools/TestWebKitAPI/Tests/WTF/EnumSet.cpp: Added.
(TestWebKitAPI::TEST(WTF_EnumSet, EmptySet)):
(TestWebKitAPI::TEST(WTF_EnumSet, StorageSize)):
(TestWebKitAPI::TEST(WTF_EnumSet, ContainsOneFlag)):
(TestWebKitAPI::TEST(WTF_EnumSet, Equal)):
(TestWebKitAPI::TEST(WTF_EnumSet, NotEqual)):
(TestWebKitAPI::TEST(WTF_EnumSet, Or)):
(TestWebKitAPI::TEST(WTF_EnumSet, OrAssignment)):
(TestWebKitAPI::TEST(WTF_EnumSet, Minus)):
(TestWebKitAPI::TEST(WTF_EnumSet, AddAndRemove)):
(TestWebKitAPI::TEST(WTF_EnumSet, Set)):
(TestWebKitAPI::TEST(WTF_EnumSet, ContainsTwoFlags)):
(TestWebKitAPI::TEST(WTF_EnumSet, ContainsTwoFlags2)):
(TestWebKitAPI::TEST(WTF_EnumSet, ContainsTwoFlags3)):
(TestWebKitAPI::TEST(WTF_EnumSet, EmptyEnumSetToRawValueToEnumSet)):
(TestWebKitAPI::TEST(WTF_EnumSet, EnumSetThatContainsOneFlagToRawValueToEnumSet)):
(TestWebKitAPI::TEST(WTF_EnumSet, EnumSetThatContainsOneFlagToRawValueToEnumSet2)):
(TestWebKitAPI::TEST(WTF_EnumSet, EnumSetThatContainsTwoFlagsToRawValueToEnumSet)):
(TestWebKitAPI::TEST(WTF_EnumSet, EnumSetThatContainsTwoFlagsToRawValueToEnumSet2)):
(TestWebKitAPI::TEST(WTF_EnumSet, TwoIteratorsIntoSameEnumSet)):
(TestWebKitAPI::TEST(WTF_EnumSet, IterateOverEnumSetThatContainsTwoFlags)):
(TestWebKitAPI::TEST(WTF_EnumSet, IterateOverEnumSetThatContainsFlags2)):
(TestWebKitAPI::TEST(WTF_EnumSet, NextItemAfterLargestIn32BitFlagSet)):
(TestWebKitAPI::TEST(WTF_EnumSet, NextItemAfterLargestIn64BitFlagSet)):
(TestWebKitAPI::TEST(WTF_EnumSet, IterationOrderTheSameRegardlessOfInsertionOrder)):
(TestWebKitAPI::TEST(WTF_EnumSet, OperatorAnd)):
(TestWebKitAPI::TEST(WTF_EnumSet, OperatorXor)):
(TestWebKitAPI::TEST(WTF_EnumSet, ContainsAny)):
(TestWebKitAPI::TEST(WTF_EnumSet, ContainsAll)):
(TestWebKitAPI::TEST(WTF_EnumSet, ToSingleValue)):

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

4c343ed

Misc iOS, visionOS, tvOS & watchOS macOS Linux Windows Apple Internal
❌ 🧪 style ✅ 🛠 ios ✅ 🛠 mac ✅ 🛠 wpe ✅ 🛠 win loading 🛠 ios-apple
✅ 🧪 bindings ✅ 🛠 ios-sim ✅ 🛠 mac-AS-debug ✅ 🧪 wpe-wk2 🧪 win-tests ✅ 🛠 mac-apple
✅ 🧪 webkitperl ✅ 🧪 ios-wk2 ✅ 🧪 api-mac ❌ 🧪 api-wpe ✅ 🛠 vision-apple
✅ 🧪 ios-wk2-wpt ✅ 🧪 mac-wk1 ✅ 🛠 wpe-cairo
✅ 🛠 🧪 jsc ✅ 🧪 api-ios ✅ 🧪 mac-wk2 ✅ 🛠 gtk
✅ 🛠 🧪 jsc-arm64 ✅ 🛠 vision ✅ 🧪 mac-AS-debug-wk2 🧪 gtk-wk2
✅ 🛠 vision-sim ✅ 🧪 mac-wk2-stress ❌ 🧪 api-gtk
✅ 🛠 🧪 merge ✅ 🧪 vision-wk2 ✅ 🧪 mac-intel-wk2 ✅ 🛠 playstation
✅ 🛠 tv ✅ 🛠 mac-safer-cpp ✅ 🛠 jsc-armv7
✅ 🛠 tv-sim ✅ 🧪 jsc-armv7-tests
✅ 🛠 watch
✅ 🛠 watch-sim

@anttijk anttijk self-assigned this Oct 15, 2025
@anttijk anttijk added the CSS Cascading Style Sheets implementation label Oct 15, 2025
@anttijk anttijk force-pushed the pseudoid-enumset-2 branch from fd77271 to 4c343ed Compare October 15, 2025 08:11
@anttijk anttijk added the safe-merge-queue Applied to automatically send a pull-request to merge-queue after passing EWS checks label Oct 15, 2025
@anttijk anttijk added merge-queue Applied to send a pull request to merge-queue and removed safe-merge-queue Applied to automatically send a pull-request to merge-queue after passing EWS checks labels Oct 15, 2025
https://bugs.webkit.org/show_bug.cgi?id=300396
rdar://162214153

Reviewed by Sam Weinig.

Add a generic EnumSet class and use it for PseudoIds.

EnumSet has the same interface as OptionSet but does not require using bitmask style enum.
This makes it more convenient to use especially when compact storage for individual values is also important.

Tests: Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj
       Tools/TestWebKitAPI/Tests/WTF/EnumSet.cpp
* Source/WTF/WTF.xcodeproj/project.pbxproj:
* Source/WTF/wtf/EnumSet.h: Added.
(WTF::requires):
(WTF::EnumSet::storageSize):
(WTF::EnumSet::Iterator::operator* const):
(WTF::EnumSet::Iterator::operator++):
(WTF::EnumSet::Iterator::Iterator):
(WTF::EnumSet::fromRaw):
(WTF::EnumSet::EnumSet):
(WTF::EnumSet::toRaw const):
(WTF::EnumSet::isEmpty const):
(WTF::EnumSet::begin const):
(WTF::EnumSet::end const):
(WTF::EnumSet::operator bool const):
(WTF::EnumSet::contains const):
(WTF::EnumSet::containsAny const):
(WTF::EnumSet::containsAll const):
(WTF::EnumSet::containsOnly const):
(WTF::EnumSet::add):
(WTF::EnumSet::remove):
(WTF::EnumSet::set):
(WTF::EnumSet::hasExactlyOneBitSet const):
(WTF::EnumSet::toSingleValue const):
(WTF::EnumSet::operator|):
(WTF::EnumSet::operator|=):
(WTF::EnumSet::operator&):
(WTF::EnumSet::operator-):
(WTF::EnumSet::operator^):
(WTF::EnumSet::storageMemoryOffset):
(WTF::EnumSet::get const):
* Source/WTF/wtf/Forward.h:
* Source/WebCore/animation/WebAnimationUtilities.h:
* Source/WebCore/css/SelectorChecker.cpp:
(WebCore::SelectorChecker::match const):
(WebCore::SelectorChecker::matchHostPseudoClass const):
(WebCore::hasViewTransitionPseudoElement):
(WebCore::hasScrollbarPseudoElement):
(WebCore::SelectorChecker::matchRecursively const):
(WebCore::SelectorChecker::checkOne const):
(WebCore::SelectorChecker::matchSelectorList const):
(WebCore::SelectorChecker::matchHasPseudoClass const):
* Source/WebCore/css/SelectorChecker.h:
* Source/WebCore/cssjit/SelectorCompiler.cpp:
(WebCore::SelectorCompiler::SelectorCodeGenerator::generateRequestedPseudoElementEqualsToSelectorPseudoElement):
(WebCore::SelectorCompiler::SelectorCodeGenerator::generateMarkPseudoStyleForPseudoElement):
* Source/WebCore/inspector/agents/InspectorCSSAgent.cpp:
(WebCore::InspectorCSSAgent::getMatchedStylesForNode):
* Source/WebCore/inspector/agents/InspectorDOMAgent.cpp:
(WebCore::InspectorDOMAgent::highlightSelector):
* Source/WebCore/rendering/RenderElement.cpp:
(WebCore::RenderElement::getCachedPseudoStyle const):
(WebCore::RenderElement::getUncachedPseudoStyle const):
* Source/WebCore/rendering/style/RenderStyle.cpp:
(WebCore::RenderStyle::RenderStyle):
* Source/WebCore/rendering/style/RenderStyle.h:
* Source/WebCore/rendering/style/RenderStyleConstants.h:
(WebCore::PseudoIdSet::PseudoIdSet): Deleted.
(WebCore::PseudoIdSet::fromMask): Deleted.
(WebCore::PseudoIdSet::has const): Deleted.
(WebCore::PseudoIdSet::add): Deleted.
(WebCore::PseudoIdSet::remove): Deleted.
(WebCore::PseudoIdSet::merge): Deleted.
(WebCore::PseudoIdSet::operator & const): Deleted.
(WebCore::PseudoIdSet::operator | const): Deleted.
(WebCore::PseudoIdSet::operator bool const): Deleted.
(WebCore::PseudoIdSet::data const): Deleted.
(WebCore::PseudoIdSet::dataMemoryOffset): Deleted.
* Source/WebCore/rendering/style/RenderStyleInlines.h:
(WebCore::RenderStyle::pseudoElementType const):
(WebCore::RenderStyle::NonInheritedFlags::hasPseudoStyle const):
(WebCore::RenderStyle::NonInheritedFlags::hasAnyPublicPseudoStyles const):
* Source/WebCore/rendering/style/RenderStyleSetters.h:
(WebCore::RenderStyle::setHasPseudoStyles):
(WebCore::RenderStyle::NonInheritedFlags::setHasPseudoStyles):
(WebCore::RenderStyle::setPseudoElementType):
* Source/WebCore/style/ElementRuleCollector.cpp:
(WebCore::Style::ElementRuleCollector::ruleMatches):
* Source/WebCore/style/ElementRuleCollector.h:
(WebCore::Style::ElementRuleCollector::matchedPseudoElementIds const):
* Source/WebCore/style/PseudoElementIdentifier.h:
(WTF::HashTraits<WebCore::Style::PseudoElementIdentifier>::emptyValue):
(WTF::HashTraits<WebCore::Style::PseudoElementIdentifier>::constructDeletedValue):
(WTF::HashTraits<WebCore::Style::PseudoElementIdentifier>::isDeletedValue):
(WTF::HashTraits<std::optional<WebCore::Style::PseudoElementIdentifier>>::emptyValue):
(WTF::HashTraits<std::optional<WebCore::Style::PseudoElementIdentifier>>::constructDeletedValue):
(WTF::HashTraits<std::optional<WebCore::Style::PseudoElementIdentifier>>::isDeletedValue):
* Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
* Tools/TestWebKitAPI/Tests/WTF/EnumSet.cpp: Added.
(TestWebKitAPI::TEST(WTF_EnumSet, EmptySet)):
(TestWebKitAPI::TEST(WTF_EnumSet, StorageSize)):
(TestWebKitAPI::TEST(WTF_EnumSet, ContainsOneFlag)):
(TestWebKitAPI::TEST(WTF_EnumSet, Equal)):
(TestWebKitAPI::TEST(WTF_EnumSet, NotEqual)):
(TestWebKitAPI::TEST(WTF_EnumSet, Or)):
(TestWebKitAPI::TEST(WTF_EnumSet, OrAssignment)):
(TestWebKitAPI::TEST(WTF_EnumSet, Minus)):
(TestWebKitAPI::TEST(WTF_EnumSet, AddAndRemove)):
(TestWebKitAPI::TEST(WTF_EnumSet, Set)):
(TestWebKitAPI::TEST(WTF_EnumSet, ContainsTwoFlags)):
(TestWebKitAPI::TEST(WTF_EnumSet, ContainsTwoFlags2)):
(TestWebKitAPI::TEST(WTF_EnumSet, ContainsTwoFlags3)):
(TestWebKitAPI::TEST(WTF_EnumSet, EmptyEnumSetToRawValueToEnumSet)):
(TestWebKitAPI::TEST(WTF_EnumSet, EnumSetThatContainsOneFlagToRawValueToEnumSet)):
(TestWebKitAPI::TEST(WTF_EnumSet, EnumSetThatContainsOneFlagToRawValueToEnumSet2)):
(TestWebKitAPI::TEST(WTF_EnumSet, EnumSetThatContainsTwoFlagsToRawValueToEnumSet)):
(TestWebKitAPI::TEST(WTF_EnumSet, EnumSetThatContainsTwoFlagsToRawValueToEnumSet2)):
(TestWebKitAPI::TEST(WTF_EnumSet, TwoIteratorsIntoSameEnumSet)):
(TestWebKitAPI::TEST(WTF_EnumSet, IterateOverEnumSetThatContainsTwoFlags)):
(TestWebKitAPI::TEST(WTF_EnumSet, IterateOverEnumSetThatContainsFlags2)):
(TestWebKitAPI::TEST(WTF_EnumSet, NextItemAfterLargestIn32BitFlagSet)):
(TestWebKitAPI::TEST(WTF_EnumSet, NextItemAfterLargestIn64BitFlagSet)):
(TestWebKitAPI::TEST(WTF_EnumSet, IterationOrderTheSameRegardlessOfInsertionOrder)):
(TestWebKitAPI::TEST(WTF_EnumSet, OperatorAnd)):
(TestWebKitAPI::TEST(WTF_EnumSet, OperatorXor)):
(TestWebKitAPI::TEST(WTF_EnumSet, ContainsAny)):
(TestWebKitAPI::TEST(WTF_EnumSet, ContainsAll)):
(TestWebKitAPI::TEST(WTF_EnumSet, ToSingleValue)):

Canonical link: https://commits.webkit.org/301557@main
@webkit-commit-queue
Copy link
Collaborator

Committed 301557@main (3ec44e3): https://commits.webkit.org/301557@main

Reviewed commits have been landed. Closing PR #52373 and removing active labels.

@webkit-commit-queue webkit-commit-queue merged commit 3ec44e3 into WebKit:main Oct 15, 2025
@webkit-commit-queue webkit-commit-queue removed the merge-queue Applied to send a pull request to merge-queue label Oct 15, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CSS Cascading Style Sheets implementation

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants