Ignore:
Timestamp:
Jun 20, 2012, 12:28:50 PM (13 years ago)
Author:
[email protected]
Message:

Add support for fit-content etc
https://bugs.webkit.org/show_bug.cgi?id=38919

Patch by Elliott Sprehn <Elliott Sprehn> on 2012-06-20
Reviewed by Tony Chang.

Source/WebCore:

Implement the CSS3 intrinsic dimension keywords for width properties and
add most of the plumbing for height properties but don't expose them
yet since this patch doesn't enforce them (matching current Gecko).
http://dev.w3.org/csswg/css3-writing-modes/#intrinsic-sizing

This patch implements -webkit-min-content, -webkit-max-content,
-webkit-fill-available and -webkit-fit-content for all width
properties.

Tests: fast/css-intrinsic-dimensions/height-dynamic-property-value.html

fast/css-intrinsic-dimensions/height-property-value.html
fast/css-intrinsic-dimensions/max-width-constrained.html
fast/css-intrinsic-dimensions/max-width-unconstrained.html
fast/css-intrinsic-dimensions/min-width.html
fast/css-intrinsic-dimensions/width-avoid-floats.html
fast/css-intrinsic-dimensions/width-dynamic-property-value.html
fast/css-intrinsic-dimensions/width-property-value.html
fast/css-intrinsic-dimensions/width.html

  • css/CSSParser.cpp: Add parser support for the new keywords.

(WebCore::CSSParser::parseValue):

  • css/CSSPrimitiveValue.cpp:

(WebCore):
(WebCore::CSSPrimitiveValue::CSSPrimitiveValue):

  • css/CSSValueKeywords.in:
  • css/LengthFunctions.cpp: Implement conversion functions.

(WebCore::minimumValueForLength):
(WebCore::valueForLength):
(WebCore::floatValueForLength):

  • css/StyleBuilder.cpp:

(WebCore::ApplyPropertyLength::applyValue):
(WebCore::StyleBuilder::StyleBuilder): Clean up the template for old

intrinsic values and add new values. Rename old intrinsic to
LegacyIntrinsic and add support for the new dimension keywords as
Intrinsic.

  • platform/Length.h:

(WebCore::Length::isIntrinsicOrAuto):
(WebCore::Length::isLegacyIntrinsic): New method to check for old

min-intrinsic and intrinsic keywords.

(WebCore::Length::isIntrinsic): New method to check for CSS3 intrinsic

dimension keywords like min-content.

  • rendering/RenderBox.cpp:

(WebCore::RenderBox::computeLogicalWidthInRegionUsing): Expose the max

and min logical preferred widths as the new keywords.

(WebCore::RenderBox::sizesLogicalWidthToFitContent): Renamed method to

be more consistent with the new MinContent naming in the spec.

  • rendering/RenderBox.h:

(RenderBox):

LayoutTests:

Tests for CSS3 intrinsic dimension keywords as defined in the
writing modes spec. This tests the implementation for width and
ensures that height properties don't allow the new keywords yet
since they're not implemented by this patch.

  • fast/css-intrinsic-dimensions/height-dynamic-property-value-expected.txt: Added.
  • fast/css-intrinsic-dimensions/height-dynamic-property-value.html: Added.
  • fast/css-intrinsic-dimensions/height-property-value-expected.txt: Added.
  • fast/css-intrinsic-dimensions/height-property-value.html: Added.
  • fast/css-intrinsic-dimensions/max-width-constrained-expected.html: Added.
  • fast/css-intrinsic-dimensions/max-width-constrained.html: Added.
  • fast/css-intrinsic-dimensions/max-width-unconstrained-expected.html: Added.
  • fast/css-intrinsic-dimensions/max-width-unconstrained.html: Added.
  • fast/css-intrinsic-dimensions/min-width-expected.html: Added.
  • fast/css-intrinsic-dimensions/min-width.html: Added.
  • fast/css-intrinsic-dimensions/width-avoid-floats-expected.html: Added.
  • fast/css-intrinsic-dimensions/width-avoid-floats.html: Added.
  • fast/css-intrinsic-dimensions/width-dynamic-property-value-expected.txt: Added.
  • fast/css-intrinsic-dimensions/width-dynamic-property-value.html: Added.
  • fast/css-intrinsic-dimensions/width-expected.html: Added.
  • fast/css-intrinsic-dimensions/width-keyword-classes.css: Added.

(.min-content):
(.max-content):
(.fill-available):
(.fit-content):
(.max-width-min-content):
(.max-width-max-content):
(.max-width-fill-available):
(.max-width-fit-content):
(.min-width-min-content):
(.min-width-max-content):
(.min-width-fill-available):
(.min-width-fit-content):

  • fast/css-intrinsic-dimensions/width-property-value-expected.txt: Added.
  • fast/css-intrinsic-dimensions/width-property-value.html: Added.
  • fast/css-intrinsic-dimensions/width.html: Added.
File:
1 edited

Legend:

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

    r120780 r120849  
    332332
    333333enum LengthAuto { AutoDisabled = 0, AutoEnabled };
     334enum LengthLegacyIntrinsic { LegacyIntrinsicDisabled = 0, LegacyIntrinsicEnabled };
    334335enum LengthIntrinsic { IntrinsicDisabled = 0, IntrinsicEnabled };
    335 enum LengthMinIntrinsic { MinIntrinsicDisabled = 0, MinIntrinsicEnabled };
    336336enum LengthNone { NoneDisabled = 0, NoneEnabled };
    337337enum LengthUndefined { UndefinedDisabled = 0, UndefinedEnabled };
     
    340340          Length (*initialFunction)(),
    341341          LengthAuto autoEnabled = AutoDisabled,
     342          LengthLegacyIntrinsic legacyIntrinsicEnabled = LegacyIntrinsicDisabled,
    342343          LengthIntrinsic intrinsicEnabled = IntrinsicDisabled,
    343           LengthMinIntrinsic minIntrinsicEnabled = MinIntrinsicDisabled,
    344344          LengthNone noneEnabled = NoneDisabled,
    345345          LengthUndefined noneUndefined = UndefinedDisabled>
     
    353353
    354354        CSSPrimitiveValue* primitiveValue = static_cast<CSSPrimitiveValue*>(value);
    355         if (noneEnabled && primitiveValue->getIdent() == CSSValueNone)
     355        if (noneEnabled && primitiveValue->getIdent() == CSSValueNone) {
    356356            if (noneUndefined)
    357357                setValue(styleResolver->style(), Length(Undefined));
    358358            else
    359359                setValue(styleResolver->style(), Length());
    360         else if (intrinsicEnabled && primitiveValue->getIdent() == CSSValueIntrinsic)
    361             setValue(styleResolver->style(), Length(Intrinsic));
    362         else if (minIntrinsicEnabled && primitiveValue->getIdent() == CSSValueMinIntrinsic)
    363             setValue(styleResolver->style(), Length(MinIntrinsic));
    364         else if (autoEnabled && primitiveValue->getIdent() == CSSValueAuto)
     360        }
     361        if (legacyIntrinsicEnabled) {
     362            if (primitiveValue->getIdent() == CSSValueIntrinsic)
     363                setValue(styleResolver->style(), Length(Intrinsic));
     364            else if (primitiveValue->getIdent() == CSSValueMinIntrinsic)
     365                setValue(styleResolver->style(), Length(MinIntrinsic));
     366        }
     367        if (intrinsicEnabled) {
     368            if (primitiveValue->getIdent() == CSSValueWebkitMinContent)
     369                setValue(styleResolver->style(), Length(MinContent));
     370            else if (primitiveValue->getIdent() == CSSValueWebkitMaxContent)
     371                setValue(styleResolver->style(), Length(MaxContent));
     372            else if (primitiveValue->getIdent() == CSSValueWebkitFillAvailable)
     373                setValue(styleResolver->style(), Length(FillAvailable));
     374            else if (primitiveValue->getIdent() == CSSValueWebkitFitContent)
     375                setValue(styleResolver->style(), Length(FitContent));
     376        }
     377
     378        if (autoEnabled && primitiveValue->getIdent() == CSSValueAuto)
    365379            setValue(styleResolver->style(), Length());
    366         else {
    367             if (primitiveValue->isLength()) {
    368                 Length length = primitiveValue->computeLength<Length>(styleResolver->style(), styleResolver->rootElementStyle(), styleResolver->style()->effectiveZoom());
    369                 length.setQuirk(primitiveValue->isQuirkValue());
    370                 setValue(styleResolver->style(), length);
    371             } else if (primitiveValue->isPercentage())
    372                 setValue(styleResolver->style(), Length(primitiveValue->getDoubleValue(), Percent));
    373             else if (primitiveValue->isCalculatedPercentageWithLength())
    374                 setValue(styleResolver->style(), Length(primitiveValue->cssCalcValue()->toCalcValue(styleResolver->style(), styleResolver->rootElementStyle(), styleResolver->style()->effectiveZoom())));
    375             else if (primitiveValue->isViewportPercentageLength())
    376                 setValue(styleResolver->style(), primitiveValue->viewportPercentageLength());
    377         }
     380        else if (primitiveValue->isLength()) {
     381            Length length = primitiveValue->computeLength<Length>(styleResolver->style(), styleResolver->rootElementStyle(), styleResolver->style()->effectiveZoom());
     382            length.setQuirk(primitiveValue->isQuirkValue());
     383            setValue(styleResolver->style(), length);
     384        } else if (primitiveValue->isPercentage())
     385            setValue(styleResolver->style(), Length(primitiveValue->getDoubleValue(), Percent));
     386        else if (primitiveValue->isCalculatedPercentageWithLength())
     387            setValue(styleResolver->style(), Length(primitiveValue->cssCalcValue()->toCalcValue(styleResolver->style(), styleResolver->rootElementStyle(), styleResolver->style()->effectiveZoom())));
     388        else if (primitiveValue->isViewportPercentageLength())
     389            setValue(styleResolver->style(), primitiveValue->viewportPercentageLength());
    378390    }
    379391
     
    18851897    setPropertyHandler(CSSPropertyFontVariant, ApplyPropertyFont<FontSmallCaps, &FontDescription::smallCaps, &FontDescription::setSmallCaps, FontSmallCapsOff>::createHandler());
    18861898    setPropertyHandler(CSSPropertyFontWeight, ApplyPropertyFontWeight::createHandler());
    1887     setPropertyHandler(CSSPropertyHeight, ApplyPropertyLength<&RenderStyle::height, &RenderStyle::setHeight, &RenderStyle::initialSize, AutoEnabled, IntrinsicEnabled, MinIntrinsicEnabled, NoneDisabled, UndefinedDisabled>::createHandler());
     1899    setPropertyHandler(CSSPropertyHeight, ApplyPropertyLength<&RenderStyle::height, &RenderStyle::setHeight, &RenderStyle::initialSize, AutoEnabled, LegacyIntrinsicEnabled, IntrinsicDisabled, NoneDisabled, UndefinedDisabled>::createHandler());
    18881900    setPropertyHandler(CSSPropertyImageRendering, ApplyPropertyDefault<EImageRendering, &RenderStyle::imageRendering, EImageRendering, &RenderStyle::setImageRendering, EImageRendering, &RenderStyle::initialImageRendering>::createHandler());
    18891901#if ENABLE(CSS_IMAGE_RESOLUTION)
     
    19021914    setPropertyHandler(CSSPropertyMarginRight, ApplyPropertyLength<&RenderStyle::marginRight, &RenderStyle::setMarginRight, &RenderStyle::initialMargin, AutoEnabled>::createHandler());
    19031915    setPropertyHandler(CSSPropertyMarginTop, ApplyPropertyLength<&RenderStyle::marginTop, &RenderStyle::setMarginTop, &RenderStyle::initialMargin, AutoEnabled>::createHandler());
    1904     setPropertyHandler(CSSPropertyMaxHeight, ApplyPropertyLength<&RenderStyle::maxHeight, &RenderStyle::setMaxHeight, &RenderStyle::initialMaxSize, AutoEnabled, IntrinsicEnabled, MinIntrinsicEnabled, NoneEnabled, UndefinedEnabled>::createHandler());
    1905     setPropertyHandler(CSSPropertyMaxWidth, ApplyPropertyLength<&RenderStyle::maxWidth, &RenderStyle::setMaxWidth, &RenderStyle::initialMaxSize, AutoEnabled, IntrinsicEnabled, MinIntrinsicEnabled, NoneEnabled, UndefinedEnabled>::createHandler());
    1906     setPropertyHandler(CSSPropertyMinHeight, ApplyPropertyLength<&RenderStyle::minHeight, &RenderStyle::setMinHeight, &RenderStyle::initialMinSize, AutoEnabled, IntrinsicEnabled, MinIntrinsicEnabled>::createHandler());
    1907     setPropertyHandler(CSSPropertyMinWidth, ApplyPropertyLength<&RenderStyle::minWidth, &RenderStyle::setMinWidth, &RenderStyle::initialMinSize, AutoEnabled, IntrinsicEnabled, MinIntrinsicEnabled>::createHandler());
     1916    setPropertyHandler(CSSPropertyMaxHeight, ApplyPropertyLength<&RenderStyle::maxHeight, &RenderStyle::setMaxHeight, &RenderStyle::initialMaxSize, AutoEnabled, LegacyIntrinsicEnabled, IntrinsicDisabled, NoneEnabled, UndefinedEnabled>::createHandler());
     1917    setPropertyHandler(CSSPropertyMaxWidth, ApplyPropertyLength<&RenderStyle::maxWidth, &RenderStyle::setMaxWidth, &RenderStyle::initialMaxSize, AutoEnabled, LegacyIntrinsicEnabled, IntrinsicEnabled, NoneEnabled, UndefinedEnabled>::createHandler());
     1918    setPropertyHandler(CSSPropertyMinHeight, ApplyPropertyLength<&RenderStyle::minHeight, &RenderStyle::setMinHeight, &RenderStyle::initialMinSize, AutoEnabled, LegacyIntrinsicEnabled, IntrinsicDisabled>::createHandler());
     1919    setPropertyHandler(CSSPropertyMinWidth, ApplyPropertyLength<&RenderStyle::minWidth, &RenderStyle::setMinWidth, &RenderStyle::initialMinSize, AutoEnabled, LegacyIntrinsicEnabled, IntrinsicEnabled>::createHandler());
    19081920    setPropertyHandler(CSSPropertyOrphans, ApplyPropertyDefault<short, &RenderStyle::orphans, short, &RenderStyle::setOrphans, short, &RenderStyle::initialOrphans>::createHandler());
    19091921    setPropertyHandler(CSSPropertyOutline, ApplyPropertyExpanding<SuppressValue, CSSPropertyOutlineWidth, CSSPropertyOutlineColor, CSSPropertyOutlineStyle>::createHandler());
     
    20792091    setPropertyHandler(CSSPropertyWhiteSpace, ApplyPropertyDefault<EWhiteSpace, &RenderStyle::whiteSpace, EWhiteSpace, &RenderStyle::setWhiteSpace, EWhiteSpace, &RenderStyle::initialWhiteSpace>::createHandler());
    20802092    setPropertyHandler(CSSPropertyWidows, ApplyPropertyDefault<short, &RenderStyle::widows, short, &RenderStyle::setWidows, short, &RenderStyle::initialWidows>::createHandler());
    2081     setPropertyHandler(CSSPropertyWidth, ApplyPropertyLength<&RenderStyle::width, &RenderStyle::setWidth, &RenderStyle::initialSize, AutoEnabled, IntrinsicEnabled, MinIntrinsicEnabled, NoneDisabled, UndefinedDisabled>::createHandler());
     2093    setPropertyHandler(CSSPropertyWidth, ApplyPropertyLength<&RenderStyle::width, &RenderStyle::setWidth, &RenderStyle::initialSize, AutoEnabled, LegacyIntrinsicEnabled, IntrinsicEnabled, NoneDisabled, UndefinedDisabled>::createHandler());
    20822094    setPropertyHandler(CSSPropertyWordBreak, ApplyPropertyDefault<EWordBreak, &RenderStyle::wordBreak, EWordBreak, &RenderStyle::setWordBreak, EWordBreak, &RenderStyle::initialWordBreak>::createHandler());
    20832095    setPropertyHandler(CSSPropertyWordSpacing, ApplyPropertyComputeLength<int, &RenderStyle::wordSpacing, &RenderStyle::setWordSpacing, &RenderStyle::initialLetterWordSpacing, NormalEnabled, ThicknessDisabled, SVGZoomEnabled>::createHandler());
Note: See TracChangeset for help on using the changeset viewer.