Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: 66b28324b8b97037caca3b9f1c9d2f724abaaf7d
      
https://github.com/WebKit/WebKit/commit/66b28324b8b97037caca3b9f1c9d2f724abaaf7d
  Author: Darin Adler <da...@apple.com>
  Date:   2023-01-23 (Mon, 23 Jan 2023)

  Changed paths:
    M Source/WebCore/css/CSSProperties.json
    M Source/WebCore/css/StyleProperties.cpp
    M Source/WebCore/css/StyleProperties.h
    M Source/WebCore/css/StylePropertyShorthand.h
    M Source/WebCore/css/parser/CSSPropertyParser.cpp

  Log Message:
  -----------
  Factor out shorthand serialization into its own class
https://bugs.webkit.org/show_bug.cgi?id=250953
rdar://problem/104517006

Reviewed by Oriol Brufau.

Factoring out shorthand serialization into a separate class and breaking it out 
of StyleProperties
has a few benefits:

- Moves details of shorthand serialization out of StyleProperties.h; these are 
no longer private
members of StyleProperties class.
- Reorganizes shorthand serialization so longhand property values are gathered 
during the common
checks. This means we won't repeatedly search style properties for the same 
properties.
- Prepares for moving shorthand serialization into a separate file, making 
StyleProperties.cpp
a more manageable size.
- Prepares for sharing shorthand serialization with computed style. We don't 
need to repeat all
this logic twice the way we do today. However, computed style has a WebKit-only 
feature where it
will produce CSS values for shorthands; we have to decide whether to remove 
that entirely or at
least remove if for most shorthand properties. Shorthands don't need to be 
expressible as CSS
values; they are a parsing and serialization format and don't have a specified 
object model.

Also made a small number of other minor improvements to StyleProperties.

* Source/WebCore/css/CSSProperties.json: Reordered the longhands in border, 
border-block, and
border-inline so they are in serialization order: width, style, color. The new 
serialization code
depends on this, and it's also a logical order.

* Source/WebCore/css/StyleProperties.cpp: Updated the maxShorthandLength 
constant, which was
incorrect. It's still a good idea to generate it and we should do that in a 
future change.
(WebCore::isCSSWideValueKeyword): Deleted.
(WebCore::isValueIDIncludingList): Removed an unused overload.
(WebCore::serializeLonghandValue): Renamed from 
textExpandingInitialValuePlaceholder and moved
the special logic for opacity properties in here. Also added an overload that 
takes a pointer.
(WebCore::ShorthandSerializer::commonSerializationChecks): Renamed from
SyleProperties::commonShorthandChecks. Assert length is not zero since 
ShorthandSerializer must
only be used for shorthands. Use a boolean return value instead of using empty 
string and null
string to express the two different outcomes. Store all the values in 
m_longhandValues as we check
them. Also added the m_gridTemplateAreasWasSetFromShorthand logic.
(WebCore::StyleProperties::serializeLonghandValue const): Added. Uses 
serializeLonghandValue and
getPropertyCSSValue.
(WebCore::StyleProperties::serializeShorthandValue const): Added. Uses 
ShorthandSerializer.
(WebCore::StyleProperties::getPropertyValue const): Use serializeLonghandValue 
and
serializeShorthandValue.
(WebCore::ShorthandSerializer::ShorthandSerializer): Added.
(WebCore::ShorthandSerializer::longhandProperty const): Added.
(WebCore::ShorthandSerializer::longhandValue const): Added.
(WebCore::ShorthandSerializer::serializeValue): Added.
(WebCore::ShorthandSerializer::isInitialValue): Added.
(WebCore::ShorthandSerializer::longhandIndex const): Added.
(WebCore::ShorthandSerializer::longhandValueID const): Added.
(WebCore::ShorthandSerializer::serializeLonghandValue const): Added.
(WebCore::ShorthandSerializer::serialize): Added. Moved the large switch 
statment from
StyleProperties::getPropertyValue in here. Besides name changes, changed 
serialization specifics:
for "all", don't try to find a common value, since the only ones are the 
CSS-wide keywords already
handled by the common serialization checks. For border, border-block, and 
border-inline, pass in
the size of each section of the shorthand, allowing us to simplify the shared 
code. For container,
use serializeLonghandsOmittingTrailingInitialValue. For flex and 
perspective-origin, use
serializeLonghands. for transform-origin, use 
serializeLonghandsOmittingTrailingInitialValue.
(WebCore::StyleProperties::propertyAsColor const): Use serializeLonghandValue.
(WebCore::ShorthandSerializer::serializeFont const): Get longhand values by 
index. Use makeString.
(WebCore::ShorthandSerializer::serializeOffset const): Ditto.
(WebCore::ShorthandSerializer::serializeFontVariant const): Use
serializeLonghandsOmittingInitialValues after doing some additional needed 
checks.
(WebCore::ShorthandSerializer::serializeFontSynthesis const): Get longhand 
values by index.
Use ASCII literals instead of StringBuilder.
(WebCore::ShorthandSerializer::serializePair const): Get longhand values by 
index.
(WebCore::ShorthandSerializer::serializeQuad const): Ditto.
(WebCore::LayerValues::serialize const): Use serializeLonghandValue.
(WebCore::ShorthandSerializer::serializeLayered const): Get longhand values by 
index.
(WebCore::ShorthandSerializer::serializeGridTemplate const): Ditto.
(WebCore::gridAutoFlowContains): Argument type is now CSSValue&.
(WebCore::ShorthandSerializer::serializeGrid const): Get longhand values by 
index. Use makeString.
(WebCore::ShorthandSerializer::serializeGridRowColumn const): Use 
serializeLonghands.
(WebCore::ShorthandSerializer::serializeGridArea const): Ditto.
(WebCore::ShorthandSerializer::serializeLonghands const): Added. This is like
StyleProperties::getShorthandValue was, but does not omit initial values and is 
more versatile
since it can be used to serialize only some properties up to a limit. Also use 
makeString for
common short lengths.
(WebCore::ShorthandSerializer::serializeLonghandsOmittingInitialValues const): 
This is the new
name for StyleProperties::getShorthandValue.
(WebCore::ShorthandSerializer::serializeLonghandsOmittingTrailingInitialValue 
const): Added.
Convenient for cases where the last value is optional, but other values are not.
(WebCore::ShorthandSerializer::serializeCommonValue const): Removed unneeded 
code to handle
missing longhands; that's checked by commonSerializationChecks. Refactored into 
two functions,
so this can be used on a subset of the shorthand or the whole thing.
(WebCore::ShorthandSerializer::serializeBorderImage const): Get longhand values 
by index.
(WebCore::ShorthandSerializer::serializeBorderRadius const): Ditto.
(WebCore::ShorthandSerializer::serializeBorder const): Use a new approach where 
we serialize
these border-related shorthands by section. Get longhand values by index. Use
serializeCommonValue and subsequentLonghandsHaveInitialValues.
(WebCore::ShorthandSerializer::serializeBreakInside const): Use longhandValueID.
(WebCore::ShorthandSerializer::serializePageBreak const): Ditto.
(WebCore::ShorthandSerializer::serializeColumnBreak const): Ditto.
(WebCore::ShorthandSerializer::subsequentLonghandsHaveInitialValues const): 
Replaces
hasAllInitialValues.
(WebCore::MutableStyleProperties::removeShorthandProperty): Added a returnText 
argument so we can
implement the return value for shorthands here. Still using a FIXME for this 
for now, we'll make
that change separately.
(WebCore::MutableStyleProperties::removePropertyAtIndex): Added. Helps factor 
out common
code and give us slightly better efficiency. Also use null string to mean no 
result rather
than empty string.
(WebCore::MutableStyleProperties::removeLonghandProperty): Added. Calls 
findPropertyIndex and
removePropertyAtIndex.
(WebCore::MutableStyleProperties::removeProperty): Call removeShorthandProperty 
and
removeLonghandProperty.
(WebCore::MutableStyleProperties::removeCustomProperty): Call 
removePropertyAtIndex.
(WebCore::MutableStyleProperties::setProperty): Removed the unneeded overload 
for the case where
the property's value is a property ID. Removed the unneeded call to 
removeShorthandProperty
in the overload that takes a CSSProperty that is never called for shorthands, 
adding an
assertion to check that invariant.
(WebCore::StyleProperties::asTextInternal const): Use serializeShorthandValue 
and
serializeLonghandValue.
(WebCore::MutableStyleProperties::removePropertiesInSet): Use the HashSet::add 
function that
takes iterators.
(WebCore::ImmutableStyleProperties::findCustomPropertyIndex const): Take a 
StringView instead
of a const String&.
(WebCore::MutableStyleProperties::findCustomPropertyIndex const): Ditto.
(WebCore::MutableStyleProperties::findCSSPropertyWithID): Use nullptr.
(WebCore::MutableStyleProperties::findCustomCSSPropertyWithName): Ditto.
(WebCore::StyleProperties::PropertyReference::cssText const): Use 
serializeLonghandValue.

* Source/WebCore/css/StyleProperties.h: Made findPropertyIndex and 
findCustomPropertyIndex
public in StyleProperties. There are other functions that work based on the 
index in the
interface. Doing this allows ShorthandSerializer to work using only public 
functions.
Initialize m_arraySize to 0. Removed unneeded default constructor, most private 
functions,
and friend relationship with PropertySetCSSStyleDeclaration. Updated 
MutableStyleProperties
functions for changes above.

* Source/WebCore/css/StylePropertyShorthand.h: Removed unneeded
fontShorthandSubpropertiesResetToInitialValues; we now base this on 
CSSProperties.json.
Added functions mentioned above.

* Source/WebCore/css/parser/CSSPropertyParser.cpp:
(WebCore::CSSPropertyParser::consumeFont): Set to initial values intead of 
explicitly
allocating CSSValueNormal. This may be slightly more efficient and it's 
consistent with
other property parsing. Set all properties in a loop, takes care of the 
properties
reset to initial values without fontShorthandSubpropertiesResetToInitialValues.

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


_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to