Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: 1ba3350f1da84f9d4232c4a9d9bf420945aa31b7
      
https://github.com/WebKit/WebKit/commit/1ba3350f1da84f9d4232c4a9d9bf420945aa31b7
  Author: Cole Carley <[email protected]>
  Date:   2026-10-12 (Mon, 12 Oct 2026)

  Changed paths:
    M Source/WebCore/CMakeLists.txt
    M Source/WebCore/DerivedSources-input.xcfilelist
    M Source/WebCore/DerivedSources-output.xcfilelist
    M Source/WebCore/DerivedSources.make
    M Source/WebCore/Scripts/GenerateQuirkBehaviors.rb
    A 
Source/WebCore/Scripts/QuirkBehaviorsTemplates/QuirkBehaviorDeclarations.cpp.erb
    A 
Source/WebCore/Scripts/QuirkBehaviorsTemplates/QuirkBehaviorDeclarations.h.erb
    M Source/WebCore/Scripts/QuirkBehaviorsTemplates/QuirkBehaviorID.h.erb
    A Source/WebCore/Scripts/validate-quirk-table.py
    M Source/WebCore/Sources.txt
    M Source/WebCore/WebCore.xcodeproj/project.pbxproj
    M Source/WebCore/page/QuirkBehaviors.h
    M Source/WebCore/page/QuirkBehaviors.yaml
    A Source/WebCore/page/QuirkBuildConditions.yaml
    M Source/WebCore/page/QuirkTable.cpp
    M Source/WebCore/page/Quirks.cpp
    M Source/WebCore/page/RuntimeQuirkTable.cpp
    M Source/WebCore/page/RuntimeQuirkTable.h
    M Tools/Scripts/webkitpy/style/checkers/jsonchecker.py
    M Tools/Scripts/webkitpy/style/checkers/jsonchecker_unittest.py
    M Tools/TestWebKitAPI/PlatformCocoa.cmake
    M Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj
    M Tools/TestWebKitAPI/Tests/WebCore/Quirks.cpp

  Log Message:
  -----------
  [Quirks] Add a runtime parser for the JSON quirk table
https://bugs.webkit.org/show_bug.cgi?id=326908
rdar://189569070

Reviewed by Brent Fulgham.

Add parseQuirkTable(), which builds a RuntimeQuirkTable from QuirkTable.json. 
This is a step
toward loading site-specific quirks at runtime instead of only from the 
constexpr table. The
parser validates each row and behavior. It drops a row that has an error, 
records a
QuirkTableParseError saying what went wrong and where, and keeps parsing the 
remaining rows.
A row or behavior whose "available" expression is false in this build is 
dropped without an
error.

The build conditions that "available" expressions can name now live in a new 
file,
QuirkBuildConditions.yaml, and GenerateQuirkBehaviors.rb reads it and generates 
the
BuildCondition constants, a BuildConditionID enum and 
isEnabled(BuildConditionID) into
QuirkBehaviorID.h

I also pulled the quirk table validator into its own script that the style 
checker now relies
on, so the script can be run on its own.

Test: Tools/TestWebKitAPI/Tests/WebCore/Quirks.cpp

* Source/WebCore/CMakeLists.txt:
* Source/WebCore/DerivedSources-input.xcfilelist:
* Source/WebCore/DerivedSources-output.xcfilelist:
* Source/WebCore/DerivedSources.make:
* Source/WebCore/Scripts/GenerateQuirkBehaviors.rb:
* 
Source/WebCore/Scripts/QuirkBehaviorsTemplates/QuirkBehaviorDeclarations.cpp.erb:
 Copied from 
Source/WebCore/Scripts/QuirkBehaviorsTemplates/QuirkBehaviorID.h.erb.
* 
Source/WebCore/Scripts/QuirkBehaviorsTemplates/QuirkBehaviorDeclarations.h.erb: 
Copied from 
Source/WebCore/Scripts/QuirkBehaviorsTemplates/QuirkBehaviorID.h.erb.
* Source/WebCore/Scripts/QuirkBehaviorsTemplates/QuirkBehaviorID.h.erb:
* Source/WebCore/Sources.txt:
* Source/WebCore/WebCore.xcodeproj/project.pbxproj:
* Source/WebCore/page/QuirkBehaviors.h:
* Source/WebCore/page/QuirkBehaviors.yaml:
* Source/WebCore/page/QuirkBuildConditions.yaml: Added.
* Source/WebCore/page/QuirkTable.cpp:
* Source/WebCore/page/Quirks.cpp:
* Source/WebCore/page/RuntimeQuirkTable.cpp:
(WebCore::nonEmptyString):
(WebCore::nonEmptyStrings):
(WebCore::enumeratorFromName):
(WebCore::isBugReference):
(WebCore::parseQuirkTable):
(WebCore::message):
(WebCore::QuirkTableParseError::description const):
* Source/WebCore/page/RuntimeQuirkTable.h:
* Tools/Scripts/webkitpy/style/checkers/jsonchecker.py:
(JSONQuirkTableChecker):
(JSONQuirkTableChecker.check):
(JSONQuirkTableChecker._read_build_conditions):
(JSONQuirkTableChecker._read_enumerators):
(JSONQuirkTableChecker._is_available_expression):
(JSONQuirkTableChecker._is_available_expression.take):
(JSONQuirkTableChecker._is_available_expression.parse_or):
(JSONQuirkTableChecker._is_available_expression.parse_and):
(JSONQuirkTableChecker._is_available_expression.parse_unary):
(JSONQuirkTableChecker._check_row):
(JSONQuirkTableChecker._check_behavior):
(JSONQuirkTableChecker.URLEnvironment): Deleted.
(JSONQuirkTableChecker._read_environments): Deleted.
(_load_quirk_table_validator):
(JSONQuirkTableChecker._error): Deleted.
(JSONQuirkTableChecker._read_file): Deleted.
(JSONQuirkTableChecker._read_behaviors): Deleted.
(JSONQuirkTableChecker._is_non_empty_string): Deleted.
(JSONQuirkTableChecker._is_non_empty_string_list): Deleted.
(JSONQuirkTableChecker._describe): Deleted.
(JSONQuirkTableChecker._check_notes): Deleted.
* Tools/Scripts/webkitpy/style/checkers/jsonchecker_unittest.py:
* Tools/TestWebKitAPI/PlatformCocoa.cmake:
* Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
* Tools/TestWebKitAPI/Tests/WebCore/Quirks.cpp:
(TestWebKitAPI::shippedQuirkTableJSON):
(TestWebKitAPI::describe):
(TestWebKitAPI::TEST_F(QuirksTest, ParsedQuirkTableMatchesCompiledTable)):
(TestWebKitAPI::TEST_F(QuirksTest, ShippedQuirkTableParsesWithoutErrors)):
(TestWebKitAPI::parseRow):
(TestWebKitAPI::describeErrors):
(TestWebKitAPI::expectRowRejected):
(TestWebKitAPI::rowIsKept):
(TestWebKitAPI::TEST_F(QuirksTest, MalformedQuirkTablesAreRejected)):
(TestWebKitAPI::TEST_F(QuirksTest, RowsWithStructuralErrorsAreRejected)):
(TestWebKitAPI::(QuirksTest, RowsWithBehaviorErrorsAreRejected)):
(TestWebKitAPI::(QuirksTest, ParseErrorsDescribeWhereTheyAre)):
(TestWebKitAPI::(QuirksTest, BugsAndCommentsAreAcceptedOnRowsAndBehaviors)):
((QuirksTest, ABadRowDoesNotAffectTheOtherRows)):
((QuirksTest, BehaviorsUnavailableInThisBuildAreDroppedWithoutAnError)):
(TestWebKitAPI::TEST_F(QuirksTest, SiteSpecificQuirksResolveWithoutADocument)): 
Deleted.
(TestWebKitAPI::scriptsForScriptURL): Deleted.
(TestWebKitAPI::TEST_F(QuirksTest, 
ScriptQuirkWithoutAScriptURLMatchAppliesToEveryScript)): Deleted.
(TestWebKitAPI::TEST_F(QuirksTest, 
ScriptQuirkWithAScriptURLMatchAppliesOnlyToMatchingScripts)): Deleted.
(TestWebKitAPI::TEST_F(QuirksTest, 
DocumentsWithoutAScriptQuirkGetNoParameters)): Deleted.
(TestWebKitAPI::TEST_F(QuirksTest, 
ParametersAreOnlyReturnedForTheBehaviorThatSuppliedThem)): Deleted.
(TestWebKitAPI::TEST_F(QuirksTest, 
OneQuirkCanCarryDifferentParametersForDifferentScriptURLs)): Deleted.
(TestWebKitAPI::TEST_F(QuirksTest, 
EveryMatchingRowContributesWhenSeveralSupplyTheSameBehavior)): Deleted.
(TestWebKitAPI::TEST_F(QuirksTest, 
IdenticalBehaviorsWithParametersAreRecordedOnce)): Deleted.
(TestWebKitAPI::TEST_F(QuirksTest, RowsSplitAcrossPathAndFragmentEachApply)): 
Deleted.
(TestWebKitAPI::TEST_F(QuirksTest, 
AnIdenticalBehaviorFromSeveralRowsIsRecordedOnce)): Deleted.
(TestWebKitAPI::elementSelectorsFor): Deleted.
(TestWebKitAPI::TEST_F(QuirksTest, 
AnElementSelectorConditionIsRecordedOnTheBehavior)): Deleted.
(TestWebKitAPI::TEST_F(QuirksTest, 
ASecondaryURLConditionIsRecordedOnTheBehavior)): Deleted.
(TestWebKitAPI::TEST_F(QuirksTest, 
BehaviorAppliesToURLRequiresTheBehaviorToBeEnabled)): Deleted.
(TestWebKitAPI::TEST_F(QuirksTest, 
MediaRangeRewriteAppliesOnlyToBingRequestURLs)): Deleted.
(TestWebKitAPI::TEST_F(QuirksTest, 
FacebookStoriesCreationFormAppliesOnlyToTheStoriesCreationPath)): Deleted.
(TestWebKitAPI::TEST_F(QuirksTest, 
LogoutCookieCleanupAppliesOnlyToTheLogoutEndpoint)): Deleted.
(TestWebKitAPI::TEST_F(QuirksTest, 
LogoutCookieCleanupCarriesTheCookiesToDelete)): Deleted.
(TestWebKitAPI::TEST_F(QuirksTest, 
OneDrivePopupBypassRequiresAOneDriveTarget)): Deleted.
(TestWebKitAPI::TEST_F(QuirksTest, 
ChromeOSUserAgentAppliesOnlyToTheWordEditorScriptInItsFrame)): Deleted.
(TestWebKitAPI::TEST_F(QuirksTest, 
AddingAndRemovingBehaviorsKeepsTheEnabledFlagInSync)): Deleted.
(TestWebKitAPI::TEST_F(QuirksTest, MergeUnionsFlagsAndConcatenatesBehaviors)): 
Deleted.
(TestWebKitAPI::TEST_F(QuirksTest, 
SitesThatOnlyNeedSimulatedMouseEventsOnSomeElementsCarryASelector)): Deleted.
(TestWebKitAPI::TEST_F(QuirksTest, 
SitesThatNeedSimulatedMouseEventsEverywhereCarryNoSelector)): Deleted.
(TestWebKitAPI::matchesSelector): Deleted.
(TestWebKitAPI::TEST_F(QuirksTest, 
ATargetThatIsNotAnElementAndHasNoParentElementNeverMatches)): Deleted.
(TestWebKitAPI::TEST_F(QuirksTest, 
AnElementTargetIsMatchedAgainstTheSelectorItself)): Deleted.
(TestWebKitAPI::TEST_F(QuirksTest, 
DescendantsMatchOnlyBecauseTheSelectorReachesDownToThem)): Deleted.
(TestWebKitAPI::TEST_F(QuirksTest, 
TextNodeTargetsResolveToTheirParentElement)): Deleted.
(TestWebKitAPI::TEST_F(QuirksTest, 
DetachedTargetsAreStillMatchedAgainstTheirOwnSubtree)): Deleted.
(TestWebKitAPI::TEST_F(QuirksTest, 
MixedCaseClassSelectorMatchesInEitherDocumentMode)): Deleted.
(TestWebKitAPI::TEST_F(QuirksTest, 
ConditionsSupportTheSelectorShapesAQuirkMightNeed)): Deleted.
(TestWebKitAPI::TEST_F(QuirksTest, TheSameSelectorIsEvaluatedPerDocument)): 
Deleted.
(TestWebKitAPI::documentSelectorsFor): Deleted.
(TestWebKitAPI::TEST_F(QuirksTest, 
BackForwardCacheBypassSitesCarryTheirDocumentSelector)): Deleted.
(TestWebKitAPI::TEST_F(QuirksTest, 
OnlyRedditScopesScrollAnchoringToADocumentSelector)): Deleted.
(TestWebKitAPI::TEST_F(QuirksTest, 
DocumentSelectorsFindElementsAnywhereInTheDocument)): Deleted.
(TestWebKitAPI::TEST_F(QuirksTest, 
GoogleDocsOverlaySelectorRequiresTheFirstElementInTheBody)): Deleted.
(TestWebKitAPI::selectorsFor): Deleted.
(TestWebKitAPI::TEST_F(QuirksTest, 
SitesThatAssumeDefaultPreventedScopeItToTheTargetElement)): Deleted.
(TestWebKitAPI::TEST_F(QuirksTest, 
ContentObservationSelectorsAreScopedPerSite)): Deleted.
(TestWebKitAPI::TEST_F(QuirksTest, 
OutlookSwatchPickerSelectorMatchesTheIDPrefix)): Deleted.
(TestWebKitAPI::TEST_F(QuirksTest, SingleSiteSelectorConditions)): Deleted.
(TestWebKitAPI::TEST_F(QuirksTest, SingleSiteSelectorConditionsOnIOS)): Deleted.
(TestWebKitAPI::TEST_F(QuirksTest, StorageAccessQuirksCarrySignInSelectors)): 
Deleted.
(TestWebKitAPI::TEST_F(QuirksTest, 
YouTubeWatchLaterStorageAccessIsEmbeddedOnly)): Deleted.
(TestWebKitAPI::TEST_F(QuirksTest, 
MigratedSelectorsMatchWhatTheHandWrittenChecksDid)): Deleted.
(TestWebKitAPI::TEST_F(QuirksTest, 
GoogleDocsPromotionSelectorStopsAtTheGrandparent)): Deleted.
(TestWebKitAPI::TEST_F(QuirksTest, 
ExpediaMenuSelectorMatchesInEitherDocumentMode)): Deleted.
(TestWebKitAPI::TEST_F(QuirksTest, 
KinjaAvatarSelectorCoversTheSVGAndItsDirectPath)): Deleted.
(TestWebKitAPI::TEST_F(QuirksTest, NeedsIPadMiniUserAgent)): Deleted.
(TestWebKitAPI::TEST_F(QuirksTest, NeedsIPhoneUserAgent)): Deleted.
(TestWebKitAPI::TEST_F(QuirksTest, ShouldTranscodeHeicImagesForURL)): Deleted.
(TestWebKitAPI::TEST_F(QuirksTest, IsMicrosoftTeamsRedirectURL)): Deleted.
(TestWebKitAPI::TEST_F(QuirksTest, 
ShouldAllowNavigationToCustomProtocolWithoutUserGesture)): Deleted.
(TestWebKitAPI::TEST_F(QuirksTest, NeedsPartitionedCookies)): Deleted.
(TestWebKitAPI::TEST_F(QuirksTest, 
ShouldOmitTouchEventDOMAttributesForDesktopWebsite)): Deleted.
(TestWebKitAPI::TEST_F(QuirksTest, NeedsCustomUserAgentOverrideNotAffected)): 
Deleted.
(TestWebKitAPI::TEST_F(QuirksTest, NeedsCustomUserAgentOverrideOutlook)): 
Deleted.
(TestWebKitAPI::TEST_F(QuirksTest, NeedsCustomUserAgentOverrideGroupCall)): 
Deleted.
(TestWebKitAPI::TEST_F(QuirksTest, 
NeedsCustomUserAgentOverrideIsRegistrableDomainGranularity)): Deleted.
(TestWebKitAPI::TEST_F(QuirksTest, 
NeedsCustomUserAgentOverrideRewritesBaseAgent)): Deleted.
(TestWebKitAPI::TEST_F(QuirksTest, 
NeedsCustomUserAgentOverrideLayersChromeCompatibilityOnUserAgentOverride)): 
Deleted.
(TestWebKitAPI::TEST_F(QuirksTest, NeedsCustomUserAgentOverrideSafari18_6)): 
Deleted.
(TestWebKitAPI::TEST_F(QuirksTest, NeedsCustomUserAgentOverrideChrome152)): 
Deleted.
(TestWebKitAPI::TEST_F(QuirksTest, NeedsCustomUserAgentOverrideHSBC)): Deleted.
(TestWebKitAPI::TEST_F(QuirksTest, 
NeedsCustomUserAgentOverrideInstacartSafariWebApp)): Deleted.
(TestWebKitAPI::TEST_F(QuirksTest, 
NeedsCustomUserAgentOverrideInstacartOutsideSafariWebApp)): Deleted.
(TestWebKitAPI::TEST_F(QuirksTest, 
NeedsCustomUserAgentOverrideAmazonPrimeVideo)): Deleted.
(TestWebKitAPI::TEST_F(QuirksTest, 
OnlyGoogleSearchLimitsMouseFocusableAnchorsToTheExpandablePanel)): Deleted.
(TestWebKitAPI::TEST_F(QuirksTest, 
ExpandablePanelSelectorMatchesThePanelAndAnythingInsideIt)): Deleted.
(TestWebKitAPI::TEST_F(QuirksTest, 
ClaudeSidebarQuirkCarriesTheSidebarSelector)): Deleted.
(TestWebKitAPI::TEST_F(QuirksTest, OnlyGoogleDocsOpensAboutURLsAsAboutBlank)): 
Deleted.
(TestWebKitAPI::TEST_F(QuirksTest, 
ClaudeSidebarSelectorMatchesTheAriaLabelExactly)): Deleted.
(TestWebKitAPI::TEST_F(QuirksTest, 
TikTokCarriesSeparateSelectorsForTheCommentsAndVideoContainers)): Deleted.
(TestWebKitAPI::TEST_F(QuirksTest, 
TikTokSelectorsMatchClassNameSubstringsUnderTheBrowserModeContainer)): Deleted.
(TestWebKitAPI::TEST_F(QuirksTest, 
EachSiteThatPreventsTouchDispatchCarriesOnlyItsOwnSelector)): Deleted.
(TestWebKitAPI::TEST_F(QuirksTest, 
TouchDispatchSelectorsRequireEveryClassInThePair)): Deleted.
(TestWebKitAPI::TEST_F(QuirksTest, 
InstagramReelsQuirkOnlyAppliesToElementsContainingAVideo)): Deleted.
(TestWebKitAPI::reelWidthsForTopURL): Deleted.
(TestWebKitAPI::TEST_F(QuirksTest, 
InstagramReelsGrowToFillTheirFlexContainerOnlyWhenTheyContainAVideo)): Deleted.
(TestWebKitAPI::hasActiveQuirk): Deleted.
(TestWebKitAPI::createPageWithQuirksEnabled): Deleted.
(TestWebKitAPI::TEST_F(QuirksTest, SameDocumentNavigationReresolvesQuirks)): 
Deleted.
* Source/WebCore/Scripts/validate-quirk-table.py: Added.
(QuirkTableValidator):
(QuirkTableValidator.__init__):
(QuirkTableValidator.validate):
(QuirkTableValidator._error):
(QuirkTableValidator._read_file):
(QuirkTableValidator._reject_line):
(QuirkTableValidator._content_lines):
(QuirkTableValidator._read_behaviors):
(QuirkTableValidator._read_build_conditions):
(QuirkTableValidator._read_enumerators):
(QuirkTableValidator._is_available_expression):
(QuirkTableValidator._is_available_expression.take):
(QuirkTableValidator._is_available_expression.parse_or):
(QuirkTableValidator._is_available_expression.parse_and):
(QuirkTableValidator._is_available_expression.parse_unary):
(QuirkTableValidator._is_non_empty_string):
(QuirkTableValidator._is_non_empty_string_list):
(QuirkTableValidator._describe):
(QuirkTableValidator._check_notes):
(QuirkTableValidator._check_row):
(QuirkTableValidator._check_behavior):
(main):

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



To unsubscribe from these emails, change your notification settings at 
https://github.com/WebKit/WebKit/settings/notifications

Reply via email to