Ignore:
Timestamp:
Jun 17, 2021, 6:13:49 AM (4 years ago)
Author:
Oriol Brufau
Message:

[css-logical] Implement logical property groups
https://bugs.webkit.org/show_bug.cgi?id=226878

Reviewed by Antti Koivisto.

Source/WebCore:

In order to have proper CSSOM support for logical properties, we will
need to determine whether two properties belong to the same logical
property group but with a different mapping logic.

Before this patch, we only knew the physical properties belonging to the
same logical property group as a given logical property. But given a
physical property, we didn't know if there were logical properties that
could map to it.

Therefore this patch changes CSSProperties.json so that both logical and
physical properties specify their logical property group.

The code for resolving a logical property into its physical equivalent
is now automatically generated.

The CSSOM fix will be done in a follow-up (bug 226461).

This patch introduces no behavior changes.

  • css/CSSProperties.json:
  • css/CSSProperty.cpp:
  • css/makeprop.pl:

(nameToId):
(addProperty):

  • platform/RectEdges.h:

(WebCore::RectEdges::before):
(WebCore::RectEdges::after):
(WebCore::RectEdges::start):
(WebCore::RectEdges::end):
(WebCore::RectEdges::before const):
(WebCore::RectEdges::after const):
(WebCore::RectEdges::start const):
(WebCore::RectEdges::end const):

  • platform/text/WritingMode.h:

(WebCore::mapLogicalAxisToPhysicalAxis):

Tools:

Add validator for new codegen property "logical-property-group",
replacing the old "direction-aware-property".

  • Scripts/webkitpy/style/checkers/jsonchecker.py:

(JSONCSSPropertiesChecker.validate_logical_property_group):
(JSONCSSPropertiesChecker.check_codegen_properties):

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/css/CSSProperty.cpp

    r278611 r278985  
    2424#include "CSSValueList.h"
    2525#include "StylePropertyShorthand.h"
    26 #include "StylePropertyShorthandFunctions.h"
    2726#include <wtf/NeverDestroyed.h>
    2827
     
    5352}
    5453
    55 static CSSPropertyID resolveToPhysicalProperty(TextDirection direction, WritingMode writingMode, LogicalBoxSide logicalSide, const StylePropertyShorthand& shorthand)
    56 {
    57     RELEASE_ASSERT(shorthand.length() == 4);
    58     return shorthand.properties()[static_cast<size_t>(mapLogicalSideToPhysicalSide(makeTextFlow(writingMode, direction), logicalSide))];
    59 }
    60 
    61 static CSSPropertyID resolveToPhysicalProperty(TextDirection direction, WritingMode writingMode, LogicalBoxCorner logicalBoxCorner, const StylePropertyShorthand& shorthand)
    62 {
    63     RELEASE_ASSERT(shorthand.length() == 4);
    64     return shorthand.properties()[static_cast<size_t>(mapLogicalCornerToPhysicalCorner(makeTextFlow(writingMode, direction), logicalBoxCorner))];
    65 }
    66 
    67 enum LogicalExtent { LogicalWidth, LogicalHeight };
    68 
    69 static CSSPropertyID resolveToPhysicalProperty(WritingMode writingMode, LogicalExtent logicalSide, const CSSPropertyID (&properties)[2])
    70 {
    71     if (writingMode == WritingMode::TopToBottom || writingMode == WritingMode::BottomToTop)
    72         return properties[logicalSide];
    73     return logicalSide == LogicalWidth ? properties[1] : properties[0];
    74 }
    75 
    76 static const StylePropertyShorthand& borderDirections()
    77 {
    78     static const CSSPropertyID properties[4] = { CSSPropertyBorderTop, CSSPropertyBorderRight, CSSPropertyBorderBottom, CSSPropertyBorderLeft };
    79     static const StylePropertyShorthand borderDirections(CSSPropertyBorder, properties);
    80     return borderDirections;
    81 }
    82 
    83 CSSPropertyID CSSProperty::resolveDirectionAwareProperty(CSSPropertyID propertyID, TextDirection direction, WritingMode writingMode)
    84 {
    85     switch (propertyID) {
    86     case CSSPropertyInsetInlineEnd:
    87         return resolveToPhysicalProperty(direction, writingMode, LogicalBoxSide::End, insetShorthand());
    88     case CSSPropertyInsetInlineStart:
    89         return resolveToPhysicalProperty(direction, writingMode, LogicalBoxSide::Start, insetShorthand());
    90     case CSSPropertyInsetBlockStart:
    91         return resolveToPhysicalProperty(direction, writingMode, LogicalBoxSide::Before, insetShorthand());
    92     case CSSPropertyInsetBlockEnd:
    93         return resolveToPhysicalProperty(direction, writingMode, LogicalBoxSide::After, insetShorthand());
    94     case CSSPropertyMarginInlineEnd:
    95         return resolveToPhysicalProperty(direction, writingMode, LogicalBoxSide::End, marginShorthand());
    96     case CSSPropertyMarginInlineStart:
    97         return resolveToPhysicalProperty(direction, writingMode, LogicalBoxSide::Start, marginShorthand());
    98     case CSSPropertyMarginBlockStart:
    99         return resolveToPhysicalProperty(direction, writingMode, LogicalBoxSide::Before, marginShorthand());
    100     case CSSPropertyMarginBlockEnd:
    101         return resolveToPhysicalProperty(direction, writingMode, LogicalBoxSide::After, marginShorthand());
    102     case CSSPropertyPaddingInlineEnd:
    103         return resolveToPhysicalProperty(direction, writingMode, LogicalBoxSide::End, paddingShorthand());
    104     case CSSPropertyPaddingInlineStart:
    105         return resolveToPhysicalProperty(direction, writingMode, LogicalBoxSide::Start, paddingShorthand());
    106     case CSSPropertyPaddingBlockStart:
    107         return resolveToPhysicalProperty(direction, writingMode, LogicalBoxSide::Before, paddingShorthand());
    108     case CSSPropertyPaddingBlockEnd:
    109         return resolveToPhysicalProperty(direction, writingMode, LogicalBoxSide::After, paddingShorthand());
    110     case CSSPropertyBorderInlineEnd:
    111         return resolveToPhysicalProperty(direction, writingMode, LogicalBoxSide::End, borderDirections());
    112     case CSSPropertyBorderInlineStart:
    113         return resolveToPhysicalProperty(direction, writingMode, LogicalBoxSide::Start, borderDirections());
    114     case CSSPropertyBorderBlockStart:
    115         return resolveToPhysicalProperty(direction, writingMode, LogicalBoxSide::Before, borderDirections());
    116     case CSSPropertyBorderBlockEnd:
    117         return resolveToPhysicalProperty(direction, writingMode, LogicalBoxSide::After, borderDirections());
    118     case CSSPropertyBorderInlineEndColor:
    119         return resolveToPhysicalProperty(direction, writingMode, LogicalBoxSide::End, borderColorShorthand());
    120     case CSSPropertyBorderInlineStartColor:
    121         return resolveToPhysicalProperty(direction, writingMode, LogicalBoxSide::Start, borderColorShorthand());
    122     case CSSPropertyBorderBlockStartColor:
    123         return resolveToPhysicalProperty(direction, writingMode, LogicalBoxSide::Before, borderColorShorthand());
    124     case CSSPropertyBorderBlockEndColor:
    125         return resolveToPhysicalProperty(direction, writingMode, LogicalBoxSide::After, borderColorShorthand());
    126     case CSSPropertyBorderInlineEndStyle:
    127         return resolveToPhysicalProperty(direction, writingMode, LogicalBoxSide::End, borderStyleShorthand());
    128     case CSSPropertyBorderInlineStartStyle:
    129         return resolveToPhysicalProperty(direction, writingMode, LogicalBoxSide::Start, borderStyleShorthand());
    130     case CSSPropertyBorderBlockStartStyle:
    131         return resolveToPhysicalProperty(direction, writingMode, LogicalBoxSide::Before, borderStyleShorthand());
    132     case CSSPropertyBorderBlockEndStyle:
    133         return resolveToPhysicalProperty(direction, writingMode, LogicalBoxSide::After, borderStyleShorthand());
    134     case CSSPropertyBorderInlineEndWidth:
    135         return resolveToPhysicalProperty(direction, writingMode, LogicalBoxSide::End, borderWidthShorthand());
    136     case CSSPropertyBorderInlineStartWidth:
    137         return resolveToPhysicalProperty(direction, writingMode, LogicalBoxSide::Start, borderWidthShorthand());
    138     case CSSPropertyBorderBlockStartWidth:
    139         return resolveToPhysicalProperty(direction, writingMode, LogicalBoxSide::Before, borderWidthShorthand());
    140     case CSSPropertyBorderBlockEndWidth:
    141         return resolveToPhysicalProperty(direction, writingMode, LogicalBoxSide::After, borderWidthShorthand());
    142     case CSSPropertyInlineSize: {
    143         const CSSPropertyID properties[2] = { CSSPropertyWidth, CSSPropertyHeight };
    144         return resolveToPhysicalProperty(writingMode, LogicalWidth, properties);
    145     }
    146     case CSSPropertyBlockSize: {
    147         const CSSPropertyID properties[2] = { CSSPropertyWidth, CSSPropertyHeight };
    148         return resolveToPhysicalProperty(writingMode, LogicalHeight, properties);
    149     }
    150     case CSSPropertyMinInlineSize: {
    151         const CSSPropertyID properties[2] = { CSSPropertyMinWidth, CSSPropertyMinHeight };
    152         return resolveToPhysicalProperty(writingMode, LogicalWidth, properties);
    153     }
    154     case CSSPropertyMinBlockSize: {
    155         const CSSPropertyID properties[2] = { CSSPropertyMinWidth, CSSPropertyMinHeight };
    156         return resolveToPhysicalProperty(writingMode, LogicalHeight, properties);
    157     }
    158     case CSSPropertyMaxInlineSize: {
    159         const CSSPropertyID properties[2] = { CSSPropertyMaxWidth, CSSPropertyMaxHeight };
    160         return resolveToPhysicalProperty(writingMode, LogicalWidth, properties);
    161     }
    162     case CSSPropertyMaxBlockSize: {
    163         const CSSPropertyID properties[2] = { CSSPropertyMaxWidth, CSSPropertyMaxHeight };
    164         return resolveToPhysicalProperty(writingMode, LogicalHeight, properties);
    165     }
    166     case CSSPropertyBorderStartStartRadius:
    167         return resolveToPhysicalProperty(direction, writingMode, LogicalBoxCorner::StartStart, borderRadiusShorthand());
    168     case CSSPropertyBorderStartEndRadius:
    169         return resolveToPhysicalProperty(direction, writingMode, LogicalBoxCorner::StartEnd, borderRadiusShorthand());
    170     case CSSPropertyBorderEndStartRadius:
    171         return resolveToPhysicalProperty(direction, writingMode, LogicalBoxCorner::EndStart, borderRadiusShorthand());
    172     case CSSPropertyBorderEndEndRadius:
    173         return resolveToPhysicalProperty(direction, writingMode, LogicalBoxCorner::EndEnd, borderRadiusShorthand());
    174     case CSSPropertyScrollMarginInlineStart:
    175         return resolveToPhysicalProperty(direction, writingMode, LogicalBoxSide::Start, scrollMarginShorthand());
    176     case CSSPropertyScrollMarginInlineEnd:
    177         return resolveToPhysicalProperty(direction, writingMode, LogicalBoxSide::End, scrollMarginShorthand());
    178     case CSSPropertyScrollMarginBlockStart:
    179         return resolveToPhysicalProperty(direction, writingMode, LogicalBoxSide::Before, scrollMarginShorthand());
    180     case CSSPropertyScrollMarginBlockEnd:
    181         return resolveToPhysicalProperty(direction, writingMode, LogicalBoxSide::After, scrollMarginShorthand());
    182     case CSSPropertyScrollPaddingInlineStart:
    183         return resolveToPhysicalProperty(direction, writingMode, LogicalBoxSide::Start, scrollPaddingShorthand());
    184     case CSSPropertyScrollPaddingInlineEnd:
    185         return resolveToPhysicalProperty(direction, writingMode, LogicalBoxSide::End, scrollPaddingShorthand());
    186     case CSSPropertyScrollPaddingBlockStart:
    187         return resolveToPhysicalProperty(direction, writingMode, LogicalBoxSide::Before, scrollPaddingShorthand());
    188     case CSSPropertyScrollPaddingBlockEnd:
    189         return resolveToPhysicalProperty(direction, writingMode, LogicalBoxSide::After, scrollPaddingShorthand());
    190     default:
    191         return propertyID;
    192     }
    193 }
    194 
    19554} // namespace WebCore
Note: See TracChangeset for help on using the changeset viewer.