Show file tree
Hide file tree
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
font shorthand should reset more longhands
https://bugs.webkit.org/show_bug.cgi?id=246912 rdar://101486558 Reviewed by Tim Nguyen. https://drafts.csswg.org/css-fonts/#font-prop "All subproperties of the font property are first reset to their initial values" There are multiple things done here: 1) Add more longhands to font shorthand for all "subproperties of font property" listed. 2) Change style building code to reset them to initial values. 3) Change computed style code to make an empty font shorthand when any of these have non-initial values. 4) Use CSSPrimitiveValue for font-style keywords without angles, rather than CSSFontStyleValue. 5) Renamed CSSFontStyleValue to CSSFontStyleWithAngleValue. The change (4) simplifies some code. The legacy CSS object model doesn't otherwise represent a simple keyword as a CSSValue subclass. In an earlier version of this work, the rest of the changes depended on this, but at this point it's just a separate improvement. * LayoutTests/fast/css/font-shorthand-expected.txt: Updated since many more properties are set to initial by the font shorthand now. * LayoutTests/fast/css/font-systemFontID-parsing-expected.txt: Updated since the test is changed, but also to expect a wrong result due to a bug we haven't fixed: "font: caption" does not serialize. * LayoutTests/fast/css/font-systemFontID-parsing.html: Updated to match what's specified, where font-family and other font subproperties do not reflect system fonts, which can only be specified with the font shorthand (which makes it not quite a shorthand). * LayoutTests/fast/inspector-support/style-expected.txt: Updated since many more properties are set to initial by the font shorthand now. * LayoutTests/fast/text/font-stretch-parse-expected.txt: Updated. * LayoutTests/fast/text/font-stretch-parse.html: Updated to expect font shorthand to serialize as empty string when font-stretch is set to a value font shorthand can't express. * LayoutTests/fast/text/font-style-parse-expected.txt: Updated. * LayoutTests/fast/text/font-style-parse.html: Updated to expect font shorthand to serialize as empty string when font-stretch is set to a value font shorthand can't express. Also took out "window." so test is slightly less wordy. * LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/font-palette-vs-shorthand-expected.txt: Expect all PASS instead of FAIL. * LayoutTests/imported/w3c/web-platform-tests/css/css-fonts/system-fonts-serialization.tentative-expected.txt: Expect a different failure; this test expects all subproperties of font to serialize as the empty string when the font property is set to a system font. This change doesn't do that for all of them, so the test doesn't pass yet, but it fails later. * LayoutTests/imported/w3c/web-platform-tests/css/cssom/font-shorthand-serialization-expected.txt: Updated since the font shorthand now affects so many more font subproperties. The test is still failing because we haven't added the font shorthand to the StyleProperties::asTextInternal function, and this will need to remain until we revise editing code to not depend on current behavior. * LayoutTests/platform/win/fast/css/font-shorthand-expected.txt: Added. This is different because PLATFORM(WIN) doesn't yet support variation fonts. * LayoutTests/platform/win/fast/inspector-support/style-expected.txt: Added. Ditto. * LayoutTests/svg/css/getComputedStyle-basic-expected.txt: Updated since font-style is now a CSSPrimitiveValue instead of a CSSFontStyleValue, web-exposed in the legacy CSS object model. * Source/WebCore/Sources.txt: Renamed to CSSFontStyleWithAngleValue. * Source/WebCore/WebCore.xcodeproj/project.pbxproj: Ditto. * Source/WebCore/css/CSSFontFace.cpp: (WebCore::calculateItalicRange): Instead of explicitly checking for CSSFontStyleValue, just call BuilderConverter::convertFontStyleFromValue on anything other than a CSSFontStyleRangeValue. This makes this function work with CSSPrimitiveValue, and it's nicer for encapsulation since this already needs to know about the CSSFontStyleRangeValue class. * Source/WebCore/css/CSSFontFaceSet.cpp: Removed include of CSSFontStyleValue.h. * Source/WebCore/css/CSSFontStyleWithAngleValue.cpp: Renamed from Source/WebCore/css/CSSFontStyleValue.cpp. (WebCore::CSSFontStyleValue::CSSFontStyleValue): Moved out of header. Also only take a single primitive value for oblique angle. (WebCore::CSSFontStyleValue::create): Ditto. (WebCore::CSSFontStyleValue::customCSSText const): Updated since this class is now only used for oblique with an angle. Also use makeString instead of StringBuilder. (WebCore::CSSFontStyleValue::equals const): Updated since class is now only used for oblique with an angle. * Source/WebCore/css/CSSFontStyleWithAngleValue.h: Renamed from Source/WebCore/css/CSSFontStyleValue.h. Changed this to a class that just stores oblique with a non-optional angle since we now use CSSPrimitiveValue directly for keywords without angles. Also removed isItalicOrOblique function, since this is an editing heuristic that should have been using italicThreshold, not italicValue anyway. Moved logic into editing code. For coding style reasons, added an obliqueAngle getter and made data members private. * Source/WebCore/css/CSSFontValue.cpp: Updated include for CSSFontStyleWithAngleValue change. * Source/WebCore/css/CSSFontValue.h: Changed style member to CSSValue since it can now be either a CSSPrimitiveValue or a CSSFontStyleValue. * Source/WebCore/css/CSSProperties.json: Added all new longhands for all subproperties of the font shorthand. Used an order that seems logical. Strangely, the order of longhands is web-exposed so should probably be standardized and tested. * Source/WebCore/css/CSSValue.cpp: Updated for CSSFontStyleWithAngleValue change. * Source/WebCore/css/CSSValue.h: Ditto. * Source/WebCore/css/ComputedStyleExtractor.cpp: (WebCore::fontStyle): Changed return type to CSSValue since this can return a primitive value. Revised to only return a CSSFontStyleValue when an angle is specified. (WebCore::fontShorthandValueForSelectionProperties): Deleted. Merged into new fontShorthandValue. (WebCore::fontShorthandValue): Added. Implements rule for when to compute as empty, when any longhand property is not expressible by shorthand. This separates those rules from actual code that builds serializable value, which can now be more straightforward. (WebCore::ComputedStyleExtractor::valueForPropertyInStyle): Call fontShorthandValue for CSSPropertFont. * Source/WebCore/css/StyleProperties.cpp: (WebCore::StyleProperties::fontValue const): Added a FIXME because while there are no tests covering it, there may need to be some additional work here to make sure that font is serialized as empty string in specified style in case where font subproperties other than the ones checked here are set. (WebCore::StyleProperties::getPropertyCSSValue const): Added code to return nullptr for system font shorthands. A better solution is likely to use a different CSSValue class for these, but that will require changes in many other places. (WebCore::StyleProperties::asTextInternal const): Added more font subproperty longhands and revise the comment to make it more clear that we do indeed want to support the font shorthand once we make it so the editing code no longer relies on it. * Source/WebCore/css/makeprop.pl: Support properties that are not enabled, but are shorthands for a longhand that is enabled. The example of this right now is font-optical-sizing. * Source/WebCore/css/parser/CSSPropertyParser.cpp: (WebCore::CSSPropertyParser::consumeSystemFont): Deleted. Merged into consumeFont. (WebCore::CSSPropertyParser::consumeFont): Rearranged this function so all parsing comes first, then all properties are added in a single block at the end. Added some local lambdas so that code is shorter and much easier to read. Made this single function handle system fonts too so more code can be shared, including all the new font subproperties. (WebCore::CSSPropertyParser::parseShorthand): Updated to remove call to consumeSystemFont. * Source/WebCore/css/parser/CSSPropertyParser.h: Removed consumeSystemFont. * Source/WebCore/css/parser/CSSPropertyParserWorkerSafe.cpp: (WebCore::CSSPropertyParserHelpersWorkerSafe::consumeFontStyle): Changed return type to CSSValue since this can return a primitive value. Revised to only return a CSSFontStyleWithAngleValue when an angle is specified. * Source/WebCore/css/parser/CSSPropertyParserWorkerSafe.h: Updated return type of consumeFontStyle. * Source/WebCore/editing/EditingStyle.cpp: (WebCore::identifierForStyleProperty): Moved italic threshold logic out of CSSFontStyleValue into this function, where it can be alongside similar bold threshold logic. Rearranged the code a bit to be tighter, and added a comment. (WebCore::StyleChange::extractTextStyles): Removed check for CSSValueOblique because identifierForStyleProperty can never return CSSValueOblique. That was true before these changes and remains true. * Source/WebCore/style/StyleBuilderConverter.h: (WebCore::Style::BuilderConverter::convertFontStretchFromValue): Updated to handle system font keyword. Turns out the correct code path was already there and only an assertion needed to be changed. (WebCore::Style::BuilderConverter::convertFontStyleFromValue): Updated to handle keywords specified as CSSPrimitiveValue. * Source/WebCore/style/StyleBuilderCustom.h: (WebCore::Style::applyFontStyle): Added. Helper so we don't copy the entire FontDescription if we aren't changing it. (WebCore::Style::BuilderCustom::applyInitialFontStyle): Use applyFontStyle. (WebCore::Style::BuilderCustom::applyValueFontStyle): Ditto. (WebCore::Style::BuilderCustom::applyValueFontStyle): Updated to handle keywords specified as CSSPrimitiveValue, retaining support for system font shorthands. Use applyFontStyle. * Tools/Scripts/do-webcore-rename: Used this for renaming. Canonical link: https://commits.webkit.org/256349@main
- Loading branch information
Showing 36 changed files with 759 additions and 399 deletions.