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