Index: Source/core/css/LayoutStyleCSSValueMapping.cpp |
diff --git a/Source/core/css/LayoutStyleCSSValueMapping.cpp b/Source/core/css/LayoutStyleCSSValueMapping.cpp |
deleted file mode 100644 |
index c47287c7fdc23ba411d88908a809859cb0015e4c..0000000000000000000000000000000000000000 |
--- a/Source/core/css/LayoutStyleCSSValueMapping.cpp |
+++ /dev/null |
@@ -1,2581 +0,0 @@ |
-/* |
- * Copyright (C) 2004 Zack Rusin <zack@kde.org> |
- * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc. All rights reserved. |
- * Copyright (C) 2007 Alexey Proskuryakov <ap@webkit.org> |
- * Copyright (C) 2007 Nicholas Shanks <webkit@nickshanks.com> |
- * Copyright (C) 2011 Sencha, Inc. All rights reserved. |
- * Copyright (C) 2015 Google Inc. All rights reserved. |
- * |
- * This library is free software; you can redistribute it and/or |
- * modify it under the terms of the GNU Lesser General Public |
- * License as published by the Free Software Foundation; either |
- * version 2 of the License, or (at your option) any later version. |
- * |
- * This library is distributed in the hope that it will be useful, |
- * but WITHOUT ANY WARRANTY; without even the implied warranty of |
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
- * Lesser General Public License for more details. |
- * |
- * You should have received a copy of the GNU Lesser General Public |
- * License along with this library; if not, write to the Free Software |
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA |
- * 02110-1301 USA |
- */ |
- |
-#include "config.h" |
-#include "core/css/LayoutStyleCSSValueMapping.h" |
- |
-#include "core/StylePropertyShorthand.h" |
-#include "core/css/BasicShapeFunctions.h" |
-#include "core/css/CSSBorderImage.h" |
-#include "core/css/CSSBorderImageSliceValue.h" |
-#include "core/css/CSSFontFeatureValue.h" |
-#include "core/css/CSSFontValue.h" |
-#include "core/css/CSSFunctionValue.h" |
-#include "core/css/CSSGridLineNamesValue.h" |
-#include "core/css/CSSGridTemplateAreasValue.h" |
-#include "core/css/CSSPathValue.h" |
-#include "core/css/CSSPrimitiveValueMappings.h" |
-#include "core/css/CSSReflectValue.h" |
-#include "core/css/CSSShadowValue.h" |
-#include "core/css/CSSTimingFunctionValue.h" |
-#include "core/css/CSSValueList.h" |
-#include "core/css/CSSValuePool.h" |
-#include "core/css/Pair.h" |
-#include "core/css/Rect.h" |
-#include "core/layout/LayoutBlock.h" |
-#include "core/layout/LayoutBox.h" |
-#include "core/layout/LayoutGrid.h" |
-#include "core/layout/LayoutObject.h" |
-#include "core/layout/style/ContentData.h" |
-#include "core/layout/style/LayoutStyle.h" |
-#include "core/layout/style/PathStyleMotionPath.h" |
-#include "core/layout/style/ShadowList.h" |
-#include "platform/LengthFunctions.h" |
- |
-namespace blink { |
- |
-inline static PassRefPtrWillBeRawPtr<CSSPrimitiveValue> zoomAdjustedPixelValue(double value, const LayoutStyle& style) |
-{ |
- return cssValuePool().createValue(adjustFloatForAbsoluteZoom(value, style), CSSPrimitiveValue::CSS_PX); |
-} |
- |
-inline static PassRefPtrWillBeRawPtr<CSSPrimitiveValue> zoomAdjustedNumberValue(double value, const LayoutStyle& style) |
-{ |
- return cssValuePool().createValue(value / style.effectiveZoom(), CSSPrimitiveValue::CSS_NUMBER); |
-} |
- |
-static PassRefPtrWillBeRawPtr<CSSPrimitiveValue> zoomAdjustedPixelValueForLength(const Length& length, const LayoutStyle& style) |
-{ |
- if (length.isFixed()) |
- return zoomAdjustedPixelValue(length.value(), style); |
- return cssValuePool().createValue(length, style); |
-} |
- |
-static PassRefPtrWillBeRawPtr<CSSPrimitiveValue> pixelValueForUnzoomedLength(const UnzoomedLength& unzoomedLength, const LayoutStyle& style) |
-{ |
- const Length& length = unzoomedLength.length(); |
- if (length.isFixed()) |
- return cssValuePool().createValue(length.value(), CSSPrimitiveValue::CSS_PX); |
- return cssValuePool().createValue(length, style); |
-} |
- |
-static PassRefPtrWillBeRawPtr<CSSValueList> createPositionListForLayer(CSSPropertyID propertyID, const FillLayer& layer, const LayoutStyle& style) |
-{ |
- RefPtrWillBeRawPtr<CSSValueList> positionList = CSSValueList::createSpaceSeparated(); |
- if (layer.isBackgroundXOriginSet()) { |
- ASSERT_UNUSED(propertyID, propertyID == CSSPropertyBackgroundPosition || propertyID == CSSPropertyWebkitMaskPosition); |
- positionList->append(cssValuePool().createValue(layer.backgroundXOrigin())); |
- } |
- positionList->append(zoomAdjustedPixelValueForLength(layer.xPosition(), style)); |
- if (layer.isBackgroundYOriginSet()) { |
- ASSERT(propertyID == CSSPropertyBackgroundPosition || propertyID == CSSPropertyWebkitMaskPosition); |
- positionList->append(cssValuePool().createValue(layer.backgroundYOrigin())); |
- } |
- positionList->append(zoomAdjustedPixelValueForLength(layer.yPosition(), style)); |
- return positionList.release(); |
-} |
- |
-PassRefPtrWillBeRawPtr<CSSPrimitiveValue> LayoutStyleCSSValueMapping::currentColorOrValidColor(const LayoutStyle& style, const StyleColor& color) |
-{ |
- // This function does NOT look at visited information, so that computed style doesn't expose that. |
- return cssValuePool().createColorValue(color.resolve(style.color()).rgb()); |
-} |
- |
-static PassRefPtrWillBeRawPtr<CSSValue> valueForFillSize(const FillSize& fillSize, const LayoutStyle& style) |
-{ |
- if (fillSize.type == Contain) |
- return cssValuePool().createIdentifierValue(CSSValueContain); |
- |
- if (fillSize.type == Cover) |
- return cssValuePool().createIdentifierValue(CSSValueCover); |
- |
- if (fillSize.size.height().isAuto()) |
- return zoomAdjustedPixelValueForLength(fillSize.size.width(), style); |
- |
- RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createSpaceSeparated(); |
- list->append(zoomAdjustedPixelValueForLength(fillSize.size.width(), style)); |
- list->append(zoomAdjustedPixelValueForLength(fillSize.size.height(), style)); |
- return list.release(); |
-} |
- |
-static PassRefPtrWillBeRawPtr<CSSValue> valueForFillRepeat(EFillRepeat xRepeat, EFillRepeat yRepeat) |
-{ |
- // For backwards compatibility, if both values are equal, just return one of them. And |
- // if the two values are equivalent to repeat-x or repeat-y, just return the shorthand. |
- if (xRepeat == yRepeat) |
- return cssValuePool().createValue(xRepeat); |
- if (xRepeat == RepeatFill && yRepeat == NoRepeatFill) |
- return cssValuePool().createIdentifierValue(CSSValueRepeatX); |
- if (xRepeat == NoRepeatFill && yRepeat == RepeatFill) |
- return cssValuePool().createIdentifierValue(CSSValueRepeatY); |
- |
- RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createSpaceSeparated(); |
- list->append(cssValuePool().createValue(xRepeat)); |
- list->append(cssValuePool().createValue(yRepeat)); |
- return list.release(); |
-} |
- |
-static PassRefPtrWillBeRawPtr<CSSValue> valueForFillSourceType(EMaskSourceType type) |
-{ |
- switch (type) { |
- case MaskAlpha: |
- return cssValuePool().createValue(CSSValueAlpha); |
- case MaskLuminance: |
- return cssValuePool().createValue(CSSValueLuminance); |
- } |
- |
- ASSERT_NOT_REACHED(); |
- |
- return nullptr; |
-} |
- |
-static PassRefPtrWillBeRawPtr<CSSValue> valueForPositionOffset(const LayoutStyle& style, CSSPropertyID propertyID, const LayoutObject* renderer) |
-{ |
- Length offset; |
- switch (propertyID) { |
- case CSSPropertyLeft: |
- offset = style.left(); |
- break; |
- case CSSPropertyRight: |
- offset = style.right(); |
- break; |
- case CSSPropertyTop: |
- offset = style.top(); |
- break; |
- case CSSPropertyBottom: |
- offset = style.bottom(); |
- break; |
- default: |
- return nullptr; |
- } |
- |
- if (offset.isPercent() && renderer && renderer->isBox()) { |
- LayoutUnit containingBlockSize = (propertyID == CSSPropertyLeft || propertyID == CSSPropertyRight) ? |
- toLayoutBox(renderer)->containingBlockLogicalWidthForContent() : |
- toLayoutBox(renderer)->containingBlockLogicalHeightForContent(ExcludeMarginBorderPadding); |
- return zoomAdjustedPixelValue(valueForLength(offset, containingBlockSize), style); |
- } |
- if (offset.isAuto()) { |
- // FIXME: It's not enough to simply return "auto" values for one offset if the other side is defined. |
- // In other words if left is auto and right is not auto, then left's computed value is negative right(). |
- // So we should get the opposite length unit and see if it is auto. |
- return cssValuePool().createIdentifierValue(CSSValueAuto); |
- } |
- |
- return zoomAdjustedPixelValueForLength(offset, style); |
-} |
- |
-static PassRefPtrWillBeRawPtr<CSSBorderImageSliceValue> valueForNinePieceImageSlice(const NinePieceImage& image) |
-{ |
- // Create the slices. |
- RefPtrWillBeRawPtr<CSSPrimitiveValue> top = nullptr; |
- RefPtrWillBeRawPtr<CSSPrimitiveValue> right = nullptr; |
- RefPtrWillBeRawPtr<CSSPrimitiveValue> bottom = nullptr; |
- RefPtrWillBeRawPtr<CSSPrimitiveValue> left = nullptr; |
- |
- if (image.imageSlices().top().isPercent()) |
- top = cssValuePool().createValue(image.imageSlices().top().value(), CSSPrimitiveValue::CSS_PERCENTAGE); |
- else |
- top = cssValuePool().createValue(image.imageSlices().top().value(), CSSPrimitiveValue::CSS_NUMBER); |
- |
- if (image.imageSlices().right() == image.imageSlices().top() && image.imageSlices().bottom() == image.imageSlices().top() |
- && image.imageSlices().left() == image.imageSlices().top()) { |
- right = top; |
- bottom = top; |
- left = top; |
- } else { |
- if (image.imageSlices().right().isPercent()) |
- right = cssValuePool().createValue(image.imageSlices().right().value(), CSSPrimitiveValue::CSS_PERCENTAGE); |
- else |
- right = cssValuePool().createValue(image.imageSlices().right().value(), CSSPrimitiveValue::CSS_NUMBER); |
- |
- if (image.imageSlices().bottom() == image.imageSlices().top() && image.imageSlices().right() == image.imageSlices().left()) { |
- bottom = top; |
- left = right; |
- } else { |
- if (image.imageSlices().bottom().isPercent()) |
- bottom = cssValuePool().createValue(image.imageSlices().bottom().value(), CSSPrimitiveValue::CSS_PERCENTAGE); |
- else |
- bottom = cssValuePool().createValue(image.imageSlices().bottom().value(), CSSPrimitiveValue::CSS_NUMBER); |
- |
- if (image.imageSlices().left() == image.imageSlices().right()) { |
- left = right; |
- } else { |
- if (image.imageSlices().left().isPercent()) |
- left = cssValuePool().createValue(image.imageSlices().left().value(), CSSPrimitiveValue::CSS_PERCENTAGE); |
- else |
- left = cssValuePool().createValue(image.imageSlices().left().value(), CSSPrimitiveValue::CSS_NUMBER); |
- } |
- } |
- } |
- |
- RefPtrWillBeRawPtr<Quad> quad = Quad::create(); |
- quad->setTop(top); |
- quad->setRight(right); |
- quad->setBottom(bottom); |
- quad->setLeft(left); |
- |
- return CSSBorderImageSliceValue::create(cssValuePool().createValue(quad.release()), image.fill()); |
-} |
- |
-static PassRefPtrWillBeRawPtr<CSSPrimitiveValue> valueForNinePieceImageQuad(const BorderImageLengthBox& box, const LayoutStyle& style) |
-{ |
- // Create the slices. |
- RefPtrWillBeRawPtr<CSSPrimitiveValue> top = nullptr; |
- RefPtrWillBeRawPtr<CSSPrimitiveValue> right = nullptr; |
- RefPtrWillBeRawPtr<CSSPrimitiveValue> bottom = nullptr; |
- RefPtrWillBeRawPtr<CSSPrimitiveValue> left = nullptr; |
- |
- if (box.top().isNumber()) |
- top = cssValuePool().createValue(box.top().number(), CSSPrimitiveValue::CSS_NUMBER); |
- else |
- top = cssValuePool().createValue(box.top().length(), style); |
- |
- if (box.right() == box.top() && box.bottom() == box.top() && box.left() == box.top()) { |
- right = top; |
- bottom = top; |
- left = top; |
- } else { |
- if (box.right().isNumber()) |
- right = cssValuePool().createValue(box.right().number(), CSSPrimitiveValue::CSS_NUMBER); |
- else |
- right = cssValuePool().createValue(box.right().length(), style); |
- |
- if (box.bottom() == box.top() && box.right() == box.left()) { |
- bottom = top; |
- left = right; |
- } else { |
- if (box.bottom().isNumber()) |
- bottom = cssValuePool().createValue(box.bottom().number(), CSSPrimitiveValue::CSS_NUMBER); |
- else |
- bottom = cssValuePool().createValue(box.bottom().length(), style); |
- |
- if (box.left() == box.right()) { |
- left = right; |
- } else { |
- if (box.left().isNumber()) |
- left = cssValuePool().createValue(box.left().number(), CSSPrimitiveValue::CSS_NUMBER); |
- else |
- left = cssValuePool().createValue(box.left().length(), style); |
- } |
- } |
- } |
- |
- RefPtrWillBeRawPtr<Quad> quad = Quad::create(); |
- quad->setTop(top); |
- quad->setRight(right); |
- quad->setBottom(bottom); |
- quad->setLeft(left); |
- |
- return cssValuePool().createValue(quad.release()); |
-} |
- |
-static CSSValueID valueForRepeatRule(int rule) |
-{ |
- switch (rule) { |
- case RepeatImageRule: |
- return CSSValueRepeat; |
- case RoundImageRule: |
- return CSSValueRound; |
- case SpaceImageRule: |
- return CSSValueSpace; |
- default: |
- return CSSValueStretch; |
- } |
-} |
- |
-static PassRefPtrWillBeRawPtr<CSSValue> valueForNinePieceImageRepeat(const NinePieceImage& image) |
-{ |
- RefPtrWillBeRawPtr<CSSPrimitiveValue> horizontalRepeat = nullptr; |
- RefPtrWillBeRawPtr<CSSPrimitiveValue> verticalRepeat = nullptr; |
- |
- horizontalRepeat = cssValuePool().createIdentifierValue(valueForRepeatRule(image.horizontalRule())); |
- if (image.horizontalRule() == image.verticalRule()) |
- verticalRepeat = horizontalRepeat; |
- else |
- verticalRepeat = cssValuePool().createIdentifierValue(valueForRepeatRule(image.verticalRule())); |
- return cssValuePool().createValue(Pair::create(horizontalRepeat.release(), verticalRepeat.release(), Pair::DropIdenticalValues)); |
-} |
- |
-static PassRefPtrWillBeRawPtr<CSSValue> valueForNinePieceImage(const NinePieceImage& image, const LayoutStyle& style) |
-{ |
- if (!image.hasImage()) |
- return cssValuePool().createIdentifierValue(CSSValueNone); |
- |
- // Image first. |
- RefPtrWillBeRawPtr<CSSValue> imageValue = nullptr; |
- if (image.image()) |
- imageValue = image.image()->cssValue(); |
- |
- // Create the image slice. |
- RefPtrWillBeRawPtr<CSSBorderImageSliceValue> imageSlices = valueForNinePieceImageSlice(image); |
- |
- // Create the border area slices. |
- RefPtrWillBeRawPtr<CSSValue> borderSlices = valueForNinePieceImageQuad(image.borderSlices(), style); |
- |
- // Create the border outset. |
- RefPtrWillBeRawPtr<CSSValue> outset = valueForNinePieceImageQuad(image.outset(), style); |
- |
- // Create the repeat rules. |
- RefPtrWillBeRawPtr<CSSValue> repeat = valueForNinePieceImageRepeat(image); |
- |
- return createBorderImageValue(imageValue.release(), imageSlices.release(), borderSlices.release(), outset.release(), repeat.release()); |
-} |
- |
-static PassRefPtrWillBeRawPtr<CSSValue> valueForReflection(const StyleReflection* reflection, const LayoutStyle& style) |
-{ |
- if (!reflection) |
- return cssValuePool().createIdentifierValue(CSSValueNone); |
- |
- RefPtrWillBeRawPtr<CSSPrimitiveValue> offset = nullptr; |
- if (reflection->offset().isPercent()) |
- offset = cssValuePool().createValue(reflection->offset().percent(), CSSPrimitiveValue::CSS_PERCENTAGE); |
- else |
- offset = zoomAdjustedPixelValue(reflection->offset().value(), style); |
- |
- RefPtrWillBeRawPtr<CSSPrimitiveValue> direction = nullptr; |
- switch (reflection->direction()) { |
- case ReflectionBelow: |
- direction = cssValuePool().createIdentifierValue(CSSValueBelow); |
- break; |
- case ReflectionAbove: |
- direction = cssValuePool().createIdentifierValue(CSSValueAbove); |
- break; |
- case ReflectionLeft: |
- direction = cssValuePool().createIdentifierValue(CSSValueLeft); |
- break; |
- case ReflectionRight: |
- direction = cssValuePool().createIdentifierValue(CSSValueRight); |
- break; |
- } |
- |
- return CSSReflectValue::create(direction.release(), offset.release(), valueForNinePieceImage(reflection->mask(), style)); |
-} |
- |
-static ItemPosition resolveAlignmentAuto(ItemPosition position, Node* element) |
-{ |
- if (position != ItemPositionAuto) |
- return position; |
- |
- bool isFlexOrGrid = element && element->computedStyle() |
- && element->computedStyle()->isDisplayFlexibleOrGridBox(); |
- |
- return isFlexOrGrid ? ItemPositionStretch : ItemPositionStart; |
-} |
- |
-static PassRefPtrWillBeRawPtr<CSSValueList> valueForItemPositionWithOverflowAlignment(ItemPosition itemPosition, OverflowAlignment overflowAlignment, ItemPositionType positionType) |
-{ |
- RefPtrWillBeRawPtr<CSSValueList> result = CSSValueList::createSpaceSeparated(); |
- if (positionType == LegacyPosition) |
- result->append(CSSPrimitiveValue::createIdentifier(CSSValueLegacy)); |
- result->append(CSSPrimitiveValue::create(itemPosition)); |
- if (itemPosition >= ItemPositionCenter && overflowAlignment != OverflowAlignmentDefault) |
- result->append(CSSPrimitiveValue::create(overflowAlignment)); |
- ASSERT(result->length() <= 2); |
- return result.release(); |
-} |
- |
-static PassRefPtrWillBeRawPtr<CSSValueList> valuesForGridShorthand(const StylePropertyShorthand& shorthand, const LayoutStyle& style, const LayoutObject* renderer, Node* styledNode, bool allowVisitedStyle) |
-{ |
- RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createSlashSeparated(); |
- for (size_t i = 0; i < shorthand.length(); ++i) { |
- RefPtrWillBeRawPtr<CSSValue> value = LayoutStyleCSSValueMapping::get(shorthand.properties()[i], style, renderer, styledNode, allowVisitedStyle); |
- ASSERT(value); |
- list->append(value.release()); |
- } |
- return list.release(); |
-} |
- |
-static PassRefPtrWillBeRawPtr<CSSValueList> valuesForShorthandProperty(const StylePropertyShorthand& shorthand, const LayoutStyle& style, const LayoutObject* renderer, Node* styledNode, bool allowVisitedStyle) |
-{ |
- RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createSpaceSeparated(); |
- for (size_t i = 0; i < shorthand.length(); ++i) { |
- RefPtrWillBeRawPtr<CSSValue> value = LayoutStyleCSSValueMapping::get(shorthand.properties()[i], style, renderer, styledNode, allowVisitedStyle); |
- ASSERT(value); |
- list->append(value); |
- } |
- return list.release(); |
-} |
- |
-static PassRefPtrWillBeRawPtr<CSSValueList> valuesForBackgroundShorthand(const LayoutStyle& style, const LayoutObject* renderer, Node* styledNode, bool allowVisitedStyle) |
-{ |
- RefPtrWillBeRawPtr<CSSValueList> ret = CSSValueList::createCommaSeparated(); |
- const FillLayer* currLayer = &style.backgroundLayers(); |
- for (; currLayer; currLayer = currLayer->next()) { |
- RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createSlashSeparated(); |
- RefPtrWillBeRawPtr<CSSValueList> beforeSlash = CSSValueList::createSpaceSeparated(); |
- if (!currLayer->next()) { // color only for final layer |
- RefPtrWillBeRawPtr<CSSValue> value = LayoutStyleCSSValueMapping::get(CSSPropertyBackgroundColor, style, renderer, styledNode, allowVisitedStyle); |
- ASSERT(value); |
- beforeSlash->append(value); |
- } |
- beforeSlash->append(currLayer->image() ? currLayer->image()->cssValue() : cssValuePool().createIdentifierValue(CSSValueNone)); |
- beforeSlash->append(valueForFillRepeat(currLayer->repeatX(), currLayer->repeatY())); |
- beforeSlash->append(cssValuePool().createValue(currLayer->attachment())); |
- beforeSlash->append(createPositionListForLayer(CSSPropertyBackgroundPosition, *currLayer, style)); |
- list->append(beforeSlash); |
- RefPtrWillBeRawPtr<CSSValueList> afterSlash = CSSValueList::createSpaceSeparated(); |
- afterSlash->append(valueForFillSize(currLayer->size(), style)); |
- afterSlash->append(cssValuePool().createValue(currLayer->origin())); |
- afterSlash->append(cssValuePool().createValue(currLayer->clip())); |
- list->append(afterSlash); |
- ret->append(list); |
- } |
- return ret.release(); |
-} |
- |
-static ContentPosition resolveContentAlignmentAuto(ContentPosition position, ContentDistributionType distribution, Node* element) |
-{ |
- if (position != ContentPositionAuto || distribution != ContentDistributionDefault) |
- return position; |
- |
- bool isFlex = element && element->computedStyle() |
- && element->computedStyle()->isDisplayFlexibleBox(); |
- |
- return isFlex ? ContentPositionFlexStart : ContentPositionStart; |
-} |
- |
-static PassRefPtrWillBeRawPtr<CSSValueList> valueForContentPositionAndDistributionWithOverflowAlignment(ContentPosition position, OverflowAlignment overflowAlignment, ContentDistributionType distribution) |
-{ |
- RefPtrWillBeRawPtr<CSSValueList> result = CSSValueList::createSpaceSeparated(); |
- if (distribution != ContentDistributionDefault) |
- result->append(CSSPrimitiveValue::create(distribution)); |
- if (distribution == ContentDistributionDefault || position != ContentPositionAuto) |
- result->append(CSSPrimitiveValue::create(position)); |
- if ((position >= ContentPositionCenter || distribution != ContentDistributionDefault) && overflowAlignment != OverflowAlignmentDefault) |
- result->append(CSSPrimitiveValue::create(overflowAlignment)); |
- ASSERT(result->length() > 0); |
- ASSERT(result->length() <= 3); |
- return result.release(); |
-} |
- |
-static PassRefPtrWillBeRawPtr<CSSPrimitiveValue> valueForLineHeight(const LayoutStyle& style) |
-{ |
- Length length = style.lineHeight(); |
- if (length.isNegative()) |
- return cssValuePool().createIdentifierValue(CSSValueNormal); |
- |
- float floatValue = floatValueForLength(length, style.fontDescription().specifiedSize()); |
- if (length.isPercent()) |
- return cssValuePool().createValue(floatValue, CSSPrimitiveValue::CSS_PX); |
- |
- return zoomAdjustedPixelValue(floatValue, style); |
-} |
- |
-static CSSValueID identifierForFamily(const AtomicString& family) |
-{ |
- if (family == FontFamilyNames::webkit_cursive) |
- return CSSValueCursive; |
- if (family == FontFamilyNames::webkit_fantasy) |
- return CSSValueFantasy; |
- if (family == FontFamilyNames::webkit_monospace) |
- return CSSValueMonospace; |
- if (family == FontFamilyNames::webkit_pictograph) |
- return CSSValueWebkitPictograph; |
- if (family == FontFamilyNames::webkit_sans_serif) |
- return CSSValueSansSerif; |
- if (family == FontFamilyNames::webkit_serif) |
- return CSSValueSerif; |
- return CSSValueInvalid; |
-} |
- |
-static PassRefPtrWillBeRawPtr<CSSPrimitiveValue> valueForFamily(const AtomicString& family) |
-{ |
- if (CSSValueID familyIdentifier = identifierForFamily(family)) |
- return cssValuePool().createIdentifierValue(familyIdentifier); |
- return cssValuePool().createValue(family.string(), CSSPrimitiveValue::CSS_CUSTOM_IDENT); |
-} |
- |
-static PassRefPtrWillBeRawPtr<CSSValueList> valueForFontFamily(const LayoutStyle& style) |
-{ |
- const FontFamily& firstFamily = style.fontDescription().family(); |
- RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createCommaSeparated(); |
- for (const FontFamily* family = &firstFamily; family; family = family->next()) |
- list->append(valueForFamily(family->family())); |
- return list.release(); |
-} |
- |
-static PassRefPtrWillBeRawPtr<CSSPrimitiveValue> valueForFontSize(const LayoutStyle& style) |
-{ |
- return zoomAdjustedPixelValue(style.fontDescription().computedSize(), style); |
-} |
- |
-static PassRefPtrWillBeRawPtr<CSSPrimitiveValue> valueForFontStretch(const LayoutStyle& style) |
-{ |
- return cssValuePool().createValue(style.fontDescription().stretch()); |
-} |
- |
-static PassRefPtrWillBeRawPtr<CSSPrimitiveValue> valueForFontStyle(const LayoutStyle& style) |
-{ |
- return cssValuePool().createValue(style.fontDescription().style()); |
-} |
- |
-static PassRefPtrWillBeRawPtr<CSSPrimitiveValue> valueForFontVariant(const LayoutStyle& style) |
-{ |
- return cssValuePool().createValue(style.fontDescription().variant()); |
-} |
- |
-static PassRefPtrWillBeRawPtr<CSSPrimitiveValue> valueForFontWeight(const LayoutStyle& style) |
-{ |
- return cssValuePool().createValue(style.fontDescription().weight()); |
-} |
- |
-static PassRefPtrWillBeRawPtr<CSSValue> specifiedValueForGridTrackBreadth(const GridLength& trackBreadth, const LayoutStyle& style) |
-{ |
- if (!trackBreadth.isLength()) |
- return cssValuePool().createValue(trackBreadth.flex(), CSSPrimitiveValue::CSS_FR); |
- |
- const Length& trackBreadthLength = trackBreadth.length(); |
- if (trackBreadthLength.isAuto()) |
- return cssValuePool().createIdentifierValue(CSSValueAuto); |
- return zoomAdjustedPixelValueForLength(trackBreadthLength, style); |
-} |
- |
-static PassRefPtrWillBeRawPtr<CSSValue> specifiedValueForGridTrackSize(const GridTrackSize& trackSize, const LayoutStyle& style) |
-{ |
- switch (trackSize.type()) { |
- case LengthTrackSizing: |
- return specifiedValueForGridTrackBreadth(trackSize.length(), style); |
- case MinMaxTrackSizing: |
- RefPtrWillBeRawPtr<CSSFunctionValue> minMaxTrackBreadths = CSSFunctionValue::create(CSSValueMinmax); |
- minMaxTrackBreadths->append(specifiedValueForGridTrackBreadth(trackSize.minTrackBreadth(), style)); |
- minMaxTrackBreadths->append(specifiedValueForGridTrackBreadth(trackSize.maxTrackBreadth(), style)); |
- return minMaxTrackBreadths.release(); |
- } |
- ASSERT_NOT_REACHED(); |
- return nullptr; |
-} |
- |
-static void addValuesForNamedGridLinesAtIndex(const OrderedNamedGridLines& orderedNamedGridLines, size_t i, CSSValueList& list) |
-{ |
- const Vector<String>& namedGridLines = orderedNamedGridLines.get(i); |
- if (namedGridLines.isEmpty()) |
- return; |
- |
- RefPtrWillBeRawPtr<CSSGridLineNamesValue> lineNames = CSSGridLineNamesValue::create(); |
- for (size_t j = 0; j < namedGridLines.size(); ++j) |
- lineNames->append(cssValuePool().createValue(namedGridLines[j], CSSPrimitiveValue::CSS_CUSTOM_IDENT)); |
- list.append(lineNames.release()); |
-} |
- |
-static PassRefPtrWillBeRawPtr<CSSValue> valueForGridTrackList(GridTrackSizingDirection direction, const LayoutObject* renderer, const LayoutStyle& style) |
-{ |
- const Vector<GridTrackSize>& trackSizes = direction == ForColumns ? style.gridTemplateColumns() : style.gridTemplateRows(); |
- const OrderedNamedGridLines& orderedNamedGridLines = direction == ForColumns ? style.orderedNamedGridColumnLines() : style.orderedNamedGridRowLines(); |
- bool isLayoutGrid = renderer && renderer->isLayoutGrid(); |
- |
- // Handle the 'none' case. |
- bool trackListIsEmpty = trackSizes.isEmpty(); |
- if (isLayoutGrid && trackListIsEmpty) { |
- // For grids we should consider every listed track, whether implicitly or explicitly created. If we don't have |
- // any explicit track and there are no children then there are no implicit tracks. We cannot simply check the |
- // number of rows/columns in our internal grid representation because it's always at least 1x1 (see r143331). |
- trackListIsEmpty = !toLayoutBlock(renderer)->firstChild(); |
- } |
- |
- if (trackListIsEmpty) { |
- ASSERT(orderedNamedGridLines.isEmpty()); |
- return cssValuePool().createIdentifierValue(CSSValueNone); |
- } |
- |
- RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createSpaceSeparated(); |
- if (isLayoutGrid) { |
- const Vector<LayoutUnit>& trackPositions = direction == ForColumns ? toLayoutGrid(renderer)->columnPositions() : toLayoutGrid(renderer)->rowPositions(); |
- // There are at least #tracks + 1 grid lines (trackPositions). Apart from that, the grid container can generate implicit grid tracks, |
- // so we'll have more trackPositions than trackSizes as the latter only contain the explicit grid. |
- ASSERT(trackPositions.size() - 1 >= trackSizes.size()); |
- |
- for (size_t i = 0; i < trackPositions.size() - 1; ++i) { |
- addValuesForNamedGridLinesAtIndex(orderedNamedGridLines, i, *list); |
- list->append(zoomAdjustedPixelValue(trackPositions[i + 1] - trackPositions[i], style)); |
- } |
- } else { |
- for (size_t i = 0; i < trackSizes.size(); ++i) { |
- addValuesForNamedGridLinesAtIndex(orderedNamedGridLines, i, *list); |
- list->append(specifiedValueForGridTrackSize(trackSizes[i], style)); |
- } |
- } |
- // Those are the trailing <string>* allowed in the syntax. |
- addValuesForNamedGridLinesAtIndex(orderedNamedGridLines, trackSizes.size(), *list); |
- return list.release(); |
-} |
- |
-static PassRefPtrWillBeRawPtr<CSSValue> valueForGridPosition(const GridPosition& position) |
-{ |
- if (position.isAuto()) |
- return cssValuePool().createIdentifierValue(CSSValueAuto); |
- |
- if (position.isNamedGridArea()) |
- return cssValuePool().createValue(position.namedGridLine(), CSSPrimitiveValue::CSS_CUSTOM_IDENT); |
- |
- RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createSpaceSeparated(); |
- if (position.isSpan()) { |
- list->append(cssValuePool().createIdentifierValue(CSSValueSpan)); |
- list->append(cssValuePool().createValue(position.spanPosition(), CSSPrimitiveValue::CSS_NUMBER)); |
- } else { |
- list->append(cssValuePool().createValue(position.integerPosition(), CSSPrimitiveValue::CSS_NUMBER)); |
- } |
- |
- if (!position.namedGridLine().isNull()) |
- list->append(cssValuePool().createValue(position.namedGridLine(), CSSPrimitiveValue::CSS_CUSTOM_IDENT)); |
- return list; |
-} |
- |
-static LayoutRect sizingBox(const LayoutObject* renderer) |
-{ |
- if (!renderer->isBox()) |
- return LayoutRect(); |
- |
- const LayoutBox* box = toLayoutBox(renderer); |
- return box->style()->boxSizing() == BORDER_BOX ? box->borderBoxRect() : box->computedCSSContentBoxRect(); |
-} |
- |
-static PassRefPtrWillBeRawPtr<CSSValue> scrollBlocksOnFlagsToCSSValue(WebScrollBlocksOn scrollBlocksOn) |
-{ |
- RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createSpaceSeparated(); |
- |
- if (scrollBlocksOn == WebScrollBlocksOnNone) |
- return cssValuePool().createIdentifierValue(CSSValueNone); |
- |
- if (scrollBlocksOn & WebScrollBlocksOnStartTouch) |
- list->append(cssValuePool().createIdentifierValue(CSSValueStartTouch)); |
- if (scrollBlocksOn & WebScrollBlocksOnWheelEvent) |
- list->append(cssValuePool().createIdentifierValue(CSSValueWheelEvent)); |
- if (scrollBlocksOn & WebScrollBlocksOnScrollEvent) |
- list->append(cssValuePool().createIdentifierValue(CSSValueScrollEvent)); |
- ASSERT(list->length()); |
- return list.release(); |
-} |
- |
-static PassRefPtrWillBeRawPtr<CSSValue> renderTextDecorationFlagsToCSSValue(int textDecoration) |
-{ |
- // Blink value is ignored. |
- RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createSpaceSeparated(); |
- if (textDecoration & TextDecorationUnderline) |
- list->append(cssValuePool().createIdentifierValue(CSSValueUnderline)); |
- if (textDecoration & TextDecorationOverline) |
- list->append(cssValuePool().createIdentifierValue(CSSValueOverline)); |
- if (textDecoration & TextDecorationLineThrough) |
- list->append(cssValuePool().createIdentifierValue(CSSValueLineThrough)); |
- |
- if (!list->length()) |
- return cssValuePool().createIdentifierValue(CSSValueNone); |
- return list.release(); |
-} |
- |
-static PassRefPtrWillBeRawPtr<CSSValue> valueForTextDecorationStyle(TextDecorationStyle textDecorationStyle) |
-{ |
- switch (textDecorationStyle) { |
- case TextDecorationStyleSolid: |
- return cssValuePool().createIdentifierValue(CSSValueSolid); |
- case TextDecorationStyleDouble: |
- return cssValuePool().createIdentifierValue(CSSValueDouble); |
- case TextDecorationStyleDotted: |
- return cssValuePool().createIdentifierValue(CSSValueDotted); |
- case TextDecorationStyleDashed: |
- return cssValuePool().createIdentifierValue(CSSValueDashed); |
- case TextDecorationStyleWavy: |
- return cssValuePool().createIdentifierValue(CSSValueWavy); |
- } |
- |
- ASSERT_NOT_REACHED(); |
- return cssValuePool().createExplicitInitialValue(); |
-} |
- |
-static PassRefPtrWillBeRawPtr<CSSValue> touchActionFlagsToCSSValue(TouchAction touchAction) |
-{ |
- RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createSpaceSeparated(); |
- if (touchAction == TouchActionAuto) |
- list->append(cssValuePool().createIdentifierValue(CSSValueAuto)); |
- if (touchAction & TouchActionNone) { |
- ASSERT(touchAction == TouchActionNone); |
- list->append(cssValuePool().createIdentifierValue(CSSValueNone)); |
- } |
- if (touchAction == (TouchActionPanX | TouchActionPanY | TouchActionPinchZoom)) { |
- list->append(cssValuePool().createIdentifierValue(CSSValueManipulation)); |
- } else { |
- if (touchAction & TouchActionPanX) |
- list->append(cssValuePool().createIdentifierValue(CSSValuePanX)); |
- if (touchAction & TouchActionPanY) |
- list->append(cssValuePool().createIdentifierValue(CSSValuePanY)); |
- } |
- ASSERT(list->length()); |
- return list.release(); |
-} |
- |
-static PassRefPtrWillBeRawPtr<CSSValue> valueForWillChange(const Vector<CSSPropertyID>& willChangeProperties, bool willChangeContents, bool willChangeScrollPosition) |
-{ |
- RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createCommaSeparated(); |
- if (willChangeContents) |
- list->append(cssValuePool().createIdentifierValue(CSSValueContents)); |
- if (willChangeScrollPosition) |
- list->append(cssValuePool().createIdentifierValue(CSSValueScrollPosition)); |
- for (size_t i = 0; i < willChangeProperties.size(); ++i) |
- list->append(cssValuePool().createIdentifierValue(willChangeProperties[i])); |
- if (!list->length()) |
- list->append(cssValuePool().createIdentifierValue(CSSValueAuto)); |
- return list.release(); |
-} |
- |
-static PassRefPtrWillBeRawPtr<CSSValue> valueForAnimationDelay(const CSSTimingData* timingData) |
-{ |
- RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createCommaSeparated(); |
- if (timingData) { |
- for (size_t i = 0; i < timingData->delayList().size(); ++i) |
- list->append(cssValuePool().createValue(timingData->delayList()[i], CSSPrimitiveValue::CSS_S)); |
- } else { |
- list->append(cssValuePool().createValue(CSSTimingData::initialDelay(), CSSPrimitiveValue::CSS_S)); |
- } |
- return list.release(); |
-} |
- |
-static PassRefPtrWillBeRawPtr<CSSValue> valueForAnimationDirection(Timing::PlaybackDirection direction) |
-{ |
- switch (direction) { |
- case Timing::PlaybackDirectionNormal: |
- return cssValuePool().createIdentifierValue(CSSValueNormal); |
- case Timing::PlaybackDirectionAlternate: |
- return cssValuePool().createIdentifierValue(CSSValueAlternate); |
- case Timing::PlaybackDirectionReverse: |
- return cssValuePool().createIdentifierValue(CSSValueReverse); |
- case Timing::PlaybackDirectionAlternateReverse: |
- return cssValuePool().createIdentifierValue(CSSValueAlternateReverse); |
- default: |
- ASSERT_NOT_REACHED(); |
- return nullptr; |
- } |
-} |
- |
-static PassRefPtrWillBeRawPtr<CSSValue> valueForAnimationDuration(const CSSTimingData* timingData) |
-{ |
- RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createCommaSeparated(); |
- if (timingData) { |
- for (size_t i = 0; i < timingData->durationList().size(); ++i) |
- list->append(cssValuePool().createValue(timingData->durationList()[i], CSSPrimitiveValue::CSS_S)); |
- } else { |
- list->append(cssValuePool().createValue(CSSTimingData::initialDuration(), CSSPrimitiveValue::CSS_S)); |
- } |
- return list.release(); |
-} |
- |
-static PassRefPtrWillBeRawPtr<CSSValue> valueForAnimationFillMode(Timing::FillMode fillMode) |
-{ |
- switch (fillMode) { |
- case Timing::FillModeNone: |
- return cssValuePool().createIdentifierValue(CSSValueNone); |
- case Timing::FillModeForwards: |
- return cssValuePool().createIdentifierValue(CSSValueForwards); |
- case Timing::FillModeBackwards: |
- return cssValuePool().createIdentifierValue(CSSValueBackwards); |
- case Timing::FillModeBoth: |
- return cssValuePool().createIdentifierValue(CSSValueBoth); |
- default: |
- ASSERT_NOT_REACHED(); |
- return nullptr; |
- } |
-} |
- |
-static PassRefPtrWillBeRawPtr<CSSValue> valueForAnimationIterationCount(double iterationCount) |
-{ |
- if (iterationCount == std::numeric_limits<double>::infinity()) |
- return cssValuePool().createIdentifierValue(CSSValueInfinite); |
- return cssValuePool().createValue(iterationCount, CSSPrimitiveValue::CSS_NUMBER); |
-} |
- |
-static PassRefPtrWillBeRawPtr<CSSValue> valueForAnimationPlayState(EAnimPlayState playState) |
-{ |
- if (playState == AnimPlayStatePlaying) |
- return cssValuePool().createIdentifierValue(CSSValueRunning); |
- ASSERT(playState == AnimPlayStatePaused); |
- return cssValuePool().createIdentifierValue(CSSValuePaused); |
-} |
- |
-static PassRefPtrWillBeRawPtr<CSSValue> createTimingFunctionValue(const TimingFunction* timingFunction) |
-{ |
- switch (timingFunction->type()) { |
- case TimingFunction::CubicBezierFunction: |
- { |
- const CubicBezierTimingFunction* bezierTimingFunction = toCubicBezierTimingFunction(timingFunction); |
- if (bezierTimingFunction->subType() != CubicBezierTimingFunction::Custom) { |
- CSSValueID valueId = CSSValueInvalid; |
- switch (bezierTimingFunction->subType()) { |
- case CubicBezierTimingFunction::Ease: |
- valueId = CSSValueEase; |
- break; |
- case CubicBezierTimingFunction::EaseIn: |
- valueId = CSSValueEaseIn; |
- break; |
- case CubicBezierTimingFunction::EaseOut: |
- valueId = CSSValueEaseOut; |
- break; |
- case CubicBezierTimingFunction::EaseInOut: |
- valueId = CSSValueEaseInOut; |
- break; |
- default: |
- ASSERT_NOT_REACHED(); |
- return nullptr; |
- } |
- return cssValuePool().createIdentifierValue(valueId); |
- } |
- return CSSCubicBezierTimingFunctionValue::create(bezierTimingFunction->x1(), bezierTimingFunction->y1(), bezierTimingFunction->x2(), bezierTimingFunction->y2()); |
- } |
- |
- case TimingFunction::StepsFunction: |
- { |
- const StepsTimingFunction* stepsTimingFunction = toStepsTimingFunction(timingFunction); |
- StepsTimingFunction::StepAtPosition position = stepsTimingFunction->stepAtPosition(); |
- int steps = stepsTimingFunction->numberOfSteps(); |
- ASSERT(position == StepsTimingFunction::Start || position == StepsTimingFunction::End); |
- |
- if (steps > 1) |
- return CSSStepsTimingFunctionValue::create(steps, position); |
- CSSValueID valueId = position == StepsTimingFunction::Start ? CSSValueStepStart : CSSValueStepEnd; |
- return cssValuePool().createIdentifierValue(valueId); |
- } |
- |
- default: |
- return cssValuePool().createIdentifierValue(CSSValueLinear); |
- } |
-} |
- |
-static PassRefPtrWillBeRawPtr<CSSValue> valueForAnimationTimingFunction(const CSSTimingData* timingData) |
-{ |
- RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createCommaSeparated(); |
- if (timingData) { |
- for (size_t i = 0; i < timingData->timingFunctionList().size(); ++i) |
- list->append(createTimingFunctionValue(timingData->timingFunctionList()[i].get())); |
- } else { |
- list->append(createTimingFunctionValue(CSSTimingData::initialTimingFunction().get())); |
- } |
- return list.release(); |
-} |
- |
-static PassRefPtrWillBeRawPtr<CSSValueList> valuesForBorderRadiusCorner(LengthSize radius, const LayoutStyle& style) |
-{ |
- RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createSpaceSeparated(); |
- if (radius.width().type() == Percent) |
- list->append(cssValuePool().createValue(radius.width().percent(), CSSPrimitiveValue::CSS_PERCENTAGE)); |
- else |
- list->append(zoomAdjustedPixelValueForLength(radius.width(), style)); |
- if (radius.height().type() == Percent) |
- list->append(cssValuePool().createValue(radius.height().percent(), CSSPrimitiveValue::CSS_PERCENTAGE)); |
- else |
- list->append(zoomAdjustedPixelValueForLength(radius.height(), style)); |
- return list.release(); |
-} |
- |
-static PassRefPtrWillBeRawPtr<CSSValue> valueForBorderRadiusCorner(LengthSize radius, const LayoutStyle& style) |
-{ |
- RefPtrWillBeRawPtr<CSSValueList> list = valuesForBorderRadiusCorner(radius, style); |
- if (list->item(0)->equals(*list->item(1))) |
- return list->item(0); |
- return list.release(); |
-} |
- |
-static PassRefPtrWillBeRawPtr<CSSFunctionValue> valueForMatrixTransform(const TransformationMatrix& transform, const LayoutStyle& style) |
-{ |
- RefPtrWillBeRawPtr<CSSFunctionValue> transformValue = nullptr; |
- if (transform.isAffine()) { |
- transformValue = CSSFunctionValue::create(CSSValueMatrix); |
- |
- transformValue->append(cssValuePool().createValue(transform.a(), CSSPrimitiveValue::CSS_NUMBER)); |
- transformValue->append(cssValuePool().createValue(transform.b(), CSSPrimitiveValue::CSS_NUMBER)); |
- transformValue->append(cssValuePool().createValue(transform.c(), CSSPrimitiveValue::CSS_NUMBER)); |
- transformValue->append(cssValuePool().createValue(transform.d(), CSSPrimitiveValue::CSS_NUMBER)); |
- transformValue->append(zoomAdjustedNumberValue(transform.e(), style)); |
- transformValue->append(zoomAdjustedNumberValue(transform.f(), style)); |
- } else { |
- transformValue = CSSFunctionValue::create(CSSValueMatrix3d); |
- |
- transformValue->append(cssValuePool().createValue(transform.m11(), CSSPrimitiveValue::CSS_NUMBER)); |
- transformValue->append(cssValuePool().createValue(transform.m12(), CSSPrimitiveValue::CSS_NUMBER)); |
- transformValue->append(cssValuePool().createValue(transform.m13(), CSSPrimitiveValue::CSS_NUMBER)); |
- transformValue->append(cssValuePool().createValue(transform.m14(), CSSPrimitiveValue::CSS_NUMBER)); |
- |
- transformValue->append(cssValuePool().createValue(transform.m21(), CSSPrimitiveValue::CSS_NUMBER)); |
- transformValue->append(cssValuePool().createValue(transform.m22(), CSSPrimitiveValue::CSS_NUMBER)); |
- transformValue->append(cssValuePool().createValue(transform.m23(), CSSPrimitiveValue::CSS_NUMBER)); |
- transformValue->append(cssValuePool().createValue(transform.m24(), CSSPrimitiveValue::CSS_NUMBER)); |
- |
- transformValue->append(cssValuePool().createValue(transform.m31(), CSSPrimitiveValue::CSS_NUMBER)); |
- transformValue->append(cssValuePool().createValue(transform.m32(), CSSPrimitiveValue::CSS_NUMBER)); |
- transformValue->append(cssValuePool().createValue(transform.m33(), CSSPrimitiveValue::CSS_NUMBER)); |
- transformValue->append(cssValuePool().createValue(transform.m34(), CSSPrimitiveValue::CSS_NUMBER)); |
- |
- transformValue->append(zoomAdjustedNumberValue(transform.m41(), style)); |
- transformValue->append(zoomAdjustedNumberValue(transform.m42(), style)); |
- transformValue->append(zoomAdjustedNumberValue(transform.m43(), style)); |
- transformValue->append(cssValuePool().createValue(transform.m44(), CSSPrimitiveValue::CSS_NUMBER)); |
- } |
- |
- return transformValue.release(); |
-} |
- |
-static PassRefPtrWillBeRawPtr<CSSValue> computedTransform(const LayoutObject* renderer, const LayoutStyle& style) |
-{ |
- if (!renderer || !renderer->hasTransformRelatedProperty() || !style.hasTransform()) |
- return cssValuePool().createIdentifierValue(CSSValueNone); |
- |
- IntRect box; |
- if (renderer->isBox()) |
- box = pixelSnappedIntRect(toLayoutBox(renderer)->borderBoxRect()); |
- |
- TransformationMatrix transform; |
- style.applyTransform(transform, LayoutSize(box.size()), LayoutStyle::ExcludeTransformOrigin, LayoutStyle::ExcludeMotionPath); |
- |
- // FIXME: Need to print out individual functions (https://bugs.webkit.org/show_bug.cgi?id=23924) |
- RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createSpaceSeparated(); |
- list->append(valueForMatrixTransform(transform, style)); |
- |
- return list.release(); |
-} |
- |
-static PassRefPtrWillBeRawPtr<CSSValue> createTransitionPropertyValue(const CSSTransitionData::TransitionProperty& property) |
-{ |
- if (property.propertyType == CSSTransitionData::TransitionNone) |
- return cssValuePool().createIdentifierValue(CSSValueNone); |
- if (property.propertyType == CSSTransitionData::TransitionAll) |
- return cssValuePool().createIdentifierValue(CSSValueAll); |
- if (property.propertyType == CSSTransitionData::TransitionUnknown) |
- return cssValuePool().createValue(property.propertyString, CSSPrimitiveValue::CSS_CUSTOM_IDENT); |
- ASSERT(property.propertyType == CSSTransitionData::TransitionSingleProperty); |
- return cssValuePool().createValue(getPropertyNameString(property.propertyId), CSSPrimitiveValue::CSS_CUSTOM_IDENT); |
-} |
- |
-static PassRefPtrWillBeRawPtr<CSSValue> valueForTransitionProperty(const CSSTransitionData* transitionData) |
-{ |
- RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createCommaSeparated(); |
- if (transitionData) { |
- for (size_t i = 0; i < transitionData->propertyList().size(); ++i) |
- list->append(createTransitionPropertyValue(transitionData->propertyList()[i])); |
- } else { |
- list->append(cssValuePool().createIdentifierValue(CSSValueAll)); |
- } |
- return list.release(); |
-} |
- |
-static PassRefPtrWillBeRawPtr<CSSValue> createLineBoxContainValue(unsigned lineBoxContain) |
-{ |
- if (!lineBoxContain) |
- return cssValuePool().createIdentifierValue(CSSValueNone); |
- return CSSLineBoxContainValue::create(lineBoxContain); |
-} |
- |
-static PassRefPtrWillBeRawPtr<CSSValue> valueForContentData(const LayoutStyle& style) |
-{ |
- RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createSpaceSeparated(); |
- for (const ContentData* contentData = style.contentData(); contentData; contentData = contentData->next()) { |
- if (contentData->isCounter()) { |
- const CounterContent* counter = toCounterContentData(contentData)->counter(); |
- ASSERT(counter); |
- list->append(cssValuePool().createValue(counter->identifier(), CSSPrimitiveValue::CSS_COUNTER_NAME)); |
- } else if (contentData->isImage()) { |
- const StyleImage* image = toImageContentData(contentData)->image(); |
- ASSERT(image); |
- list->append(image->cssValue()); |
- } else if (contentData->isText()) { |
- list->append(cssValuePool().createValue(toTextContentData(contentData)->text(), CSSPrimitiveValue::CSS_STRING)); |
- } |
- } |
- return list.release(); |
-} |
- |
-static PassRefPtrWillBeRawPtr<CSSValue> valueForCounterDirectives(const LayoutStyle& style, CSSPropertyID propertyID) |
-{ |
- const CounterDirectiveMap* map = style.counterDirectives(); |
- if (!map) |
- return cssValuePool().createIdentifierValue(CSSValueNone); |
- |
- RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createSpaceSeparated(); |
- for (const auto& item : *map) { |
- bool isValidCounterValue = propertyID == CSSPropertyCounterIncrement ? item.value.isIncrement() : item.value.isReset(); |
- if (!isValidCounterValue) |
- continue; |
- |
- list->append(cssValuePool().createValue(item.key, CSSPrimitiveValue::CSS_CUSTOM_IDENT)); |
- short number = propertyID == CSSPropertyCounterIncrement ? item.value.incrementValue() : item.value.resetValue(); |
- list->append(cssValuePool().createValue((double)number, CSSPrimitiveValue::CSS_NUMBER)); |
- } |
- |
- if (!list->length()) |
- return cssValuePool().createIdentifierValue(CSSValueNone); |
- |
- return list.release(); |
-} |
- |
-static PassRefPtrWillBeRawPtr<CSSValue> valueForShape(const LayoutStyle& style, ShapeValue* shapeValue) |
-{ |
- if (!shapeValue) |
- return cssValuePool().createIdentifierValue(CSSValueNone); |
- if (shapeValue->type() == ShapeValue::Box) |
- return cssValuePool().createValue(shapeValue->cssBox()); |
- if (shapeValue->type() == ShapeValue::Image) { |
- if (shapeValue->image()) |
- return shapeValue->image()->cssValue(); |
- return cssValuePool().createIdentifierValue(CSSValueNone); |
- } |
- |
- ASSERT(shapeValue->type() == ShapeValue::Shape); |
- |
- RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createSpaceSeparated(); |
- list->append(valueForBasicShape(style, shapeValue->shape())); |
- if (shapeValue->cssBox() != BoxMissing) |
- list->append(cssValuePool().createValue(shapeValue->cssBox())); |
- return list.release(); |
-} |
- |
-static PassRefPtrWillBeRawPtr<CSSValueList> valuesForSidesShorthand(const StylePropertyShorthand& shorthand, const LayoutStyle& style, const LayoutObject* renderer, Node* styledNode, bool allowVisitedStyle) |
-{ |
- RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createSpaceSeparated(); |
- // Assume the properties are in the usual order top, right, bottom, left. |
- RefPtrWillBeRawPtr<CSSValue> topValue = LayoutStyleCSSValueMapping::get(shorthand.properties()[0], style, renderer, styledNode, allowVisitedStyle); |
- RefPtrWillBeRawPtr<CSSValue> rightValue = LayoutStyleCSSValueMapping::get(shorthand.properties()[1], style, renderer, styledNode, allowVisitedStyle); |
- RefPtrWillBeRawPtr<CSSValue> bottomValue = LayoutStyleCSSValueMapping::get(shorthand.properties()[2], style, renderer, styledNode, allowVisitedStyle); |
- RefPtrWillBeRawPtr<CSSValue> leftValue = LayoutStyleCSSValueMapping::get(shorthand.properties()[3], style, renderer, styledNode, allowVisitedStyle); |
- |
- // All 4 properties must be specified. |
- if (!topValue || !rightValue || !bottomValue || !leftValue) |
- return nullptr; |
- |
- bool showLeft = !compareCSSValuePtr(rightValue, leftValue); |
- bool showBottom = !compareCSSValuePtr(topValue, bottomValue) || showLeft; |
- bool showRight = !compareCSSValuePtr(topValue, rightValue) || showBottom; |
- |
- list->append(topValue.release()); |
- if (showRight) |
- list->append(rightValue.release()); |
- if (showBottom) |
- list->append(bottomValue.release()); |
- if (showLeft) |
- list->append(leftValue.release()); |
- |
- return list.release(); |
-} |
- |
-static PassRefPtrWillBeRawPtr<CSSValueList> valueForBorderRadiusShorthand(const LayoutStyle& style) |
-{ |
- RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createSlashSeparated(); |
- |
- bool showHorizontalBottomLeft = style.borderTopRightRadius().width() != style.borderBottomLeftRadius().width(); |
- bool showHorizontalBottomRight = showHorizontalBottomLeft || (style.borderBottomRightRadius().width() != style.borderTopLeftRadius().width()); |
- bool showHorizontalTopRight = showHorizontalBottomRight || (style.borderTopRightRadius().width() != style.borderTopLeftRadius().width()); |
- |
- bool showVerticalBottomLeft = style.borderTopRightRadius().height() != style.borderBottomLeftRadius().height(); |
- bool showVerticalBottomRight = showVerticalBottomLeft || (style.borderBottomRightRadius().height() != style.borderTopLeftRadius().height()); |
- bool showVerticalTopRight = showVerticalBottomRight || (style.borderTopRightRadius().height() != style.borderTopLeftRadius().height()); |
- |
- RefPtrWillBeRawPtr<CSSValueList> topLeftRadius = valuesForBorderRadiusCorner(style.borderTopLeftRadius(), style); |
- RefPtrWillBeRawPtr<CSSValueList> topRightRadius = valuesForBorderRadiusCorner(style.borderTopRightRadius(), style); |
- RefPtrWillBeRawPtr<CSSValueList> bottomRightRadius = valuesForBorderRadiusCorner(style.borderBottomRightRadius(), style); |
- RefPtrWillBeRawPtr<CSSValueList> bottomLeftRadius = valuesForBorderRadiusCorner(style.borderBottomLeftRadius(), style); |
- |
- RefPtrWillBeRawPtr<CSSValueList> horizontalRadii = CSSValueList::createSpaceSeparated(); |
- horizontalRadii->append(topLeftRadius->item(0)); |
- if (showHorizontalTopRight) |
- horizontalRadii->append(topRightRadius->item(0)); |
- if (showHorizontalBottomRight) |
- horizontalRadii->append(bottomRightRadius->item(0)); |
- if (showHorizontalBottomLeft) |
- horizontalRadii->append(bottomLeftRadius->item(0)); |
- |
- list->append(horizontalRadii.release()); |
- |
- RefPtrWillBeRawPtr<CSSValueList> verticalRadii = CSSValueList::createSpaceSeparated(); |
- verticalRadii->append(topLeftRadius->item(1)); |
- if (showVerticalTopRight) |
- verticalRadii->append(topRightRadius->item(1)); |
- if (showVerticalBottomRight) |
- verticalRadii->append(bottomRightRadius->item(1)); |
- if (showVerticalBottomLeft) |
- verticalRadii->append(bottomLeftRadius->item(1)); |
- |
- if (!verticalRadii->equals(*toCSSValueList(list->item(0)))) |
- list->append(verticalRadii.release()); |
- |
- return list.release(); |
-} |
- |
-static PassRefPtrWillBeRawPtr<CSSPrimitiveValue> glyphOrientationToCSSPrimitiveValue(EGlyphOrientation orientation) |
-{ |
- switch (orientation) { |
- case GO_0DEG: |
- return CSSPrimitiveValue::create(0.0f, CSSPrimitiveValue::CSS_DEG); |
- case GO_90DEG: |
- return CSSPrimitiveValue::create(90.0f, CSSPrimitiveValue::CSS_DEG); |
- case GO_180DEG: |
- return CSSPrimitiveValue::create(180.0f, CSSPrimitiveValue::CSS_DEG); |
- case GO_270DEG: |
- return CSSPrimitiveValue::create(270.0f, CSSPrimitiveValue::CSS_DEG); |
- default: |
- return nullptr; |
- } |
-} |
- |
-static PassRefPtrWillBeRawPtr<CSSValue> strokeDashArrayToCSSValueList(const SVGDashArray& dashes, const LayoutStyle& style) |
-{ |
- if (dashes.isEmpty()) |
- return CSSPrimitiveValue::createIdentifier(CSSValueNone); |
- |
- RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createCommaSeparated(); |
- for (const Length& dashLength : dashes.vector()) |
- list->append(zoomAdjustedPixelValueForLength(dashLength, style)); |
- |
- return list.release(); |
-} |
- |
-static PassRefPtrWillBeRawPtr<CSSValue> paintOrderToCSSValueList(EPaintOrder paintorder) |
-{ |
- RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createSpaceSeparated(); |
- do { |
- EPaintOrderType paintOrderType = (EPaintOrderType)(paintorder & ((1 << kPaintOrderBitwidth) - 1)); |
- switch (paintOrderType) { |
- case PT_FILL: |
- case PT_STROKE: |
- case PT_MARKERS: |
- list->append(CSSPrimitiveValue::create(paintOrderType)); |
- break; |
- case PT_NONE: |
- default: |
- ASSERT_NOT_REACHED(); |
- break; |
- } |
- } while (paintorder >>= kPaintOrderBitwidth); |
- |
- return list.release(); |
-} |
- |
-static PassRefPtrWillBeRawPtr<CSSValue> adjustSVGPaintForCurrentColor(SVGPaintType paintType, const String& url, const Color& color, const Color& currentColor) |
-{ |
- if (paintType >= SVG_PAINTTYPE_URI_NONE) { |
- RefPtrWillBeRawPtr<CSSValueList> values = CSSValueList::createSpaceSeparated(); |
- values->append(CSSPrimitiveValue::create(url, CSSPrimitiveValue::CSS_URI)); |
- if (paintType == SVG_PAINTTYPE_URI_NONE) |
- values->append(CSSPrimitiveValue::create(CSSValueNone)); |
- else if (paintType == SVG_PAINTTYPE_URI_CURRENTCOLOR) |
- values->append(CSSPrimitiveValue::createColor(currentColor.rgb())); |
- else if (paintType == SVG_PAINTTYPE_URI_RGBCOLOR) |
- values->append(CSSPrimitiveValue::createColor(color.rgb())); |
- return values.release(); |
- } |
- if (paintType == SVG_PAINTTYPE_NONE) |
- return CSSPrimitiveValue::create(CSSValueNone); |
- if (paintType == SVG_PAINTTYPE_CURRENTCOLOR) |
- return CSSPrimitiveValue::createColor(currentColor.rgb()); |
- |
- return CSSPrimitiveValue::createColor(color.rgb()); |
-} |
- |
-static inline String serializeAsFragmentIdentifier(const AtomicString& resource) |
-{ |
- return "#" + resource; |
-} |
- |
-PassRefPtrWillBeRawPtr<CSSValue> LayoutStyleCSSValueMapping::valueForShadowData(const ShadowData& shadow, const LayoutStyle& style, bool useSpread) |
-{ |
- RefPtrWillBeRawPtr<CSSPrimitiveValue> x = zoomAdjustedPixelValue(shadow.x(), style); |
- RefPtrWillBeRawPtr<CSSPrimitiveValue> y = zoomAdjustedPixelValue(shadow.y(), style); |
- RefPtrWillBeRawPtr<CSSPrimitiveValue> blur = zoomAdjustedPixelValue(shadow.blur(), style); |
- RefPtrWillBeRawPtr<CSSPrimitiveValue> spread = useSpread ? zoomAdjustedPixelValue(shadow.spread(), style) : PassRefPtrWillBeRawPtr<CSSPrimitiveValue>(nullptr); |
- RefPtrWillBeRawPtr<CSSPrimitiveValue> shadowStyle = shadow.style() == Normal ? PassRefPtrWillBeRawPtr<CSSPrimitiveValue>(nullptr) : cssValuePool().createIdentifierValue(CSSValueInset); |
- RefPtrWillBeRawPtr<CSSPrimitiveValue> color = currentColorOrValidColor(style, shadow.color()); |
- return CSSShadowValue::create(x.release(), y.release(), blur.release(), spread.release(), shadowStyle.release(), color.release()); |
-} |
- |
-PassRefPtrWillBeRawPtr<CSSValue> LayoutStyleCSSValueMapping::valueForShadowList(const ShadowList* shadowList, const LayoutStyle& style, bool useSpread) |
-{ |
- if (!shadowList) |
- return cssValuePool().createIdentifierValue(CSSValueNone); |
- |
- RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createCommaSeparated(); |
- size_t shadowCount = shadowList->shadows().size(); |
- for (size_t i = 0; i < shadowCount; ++i) |
- list->append(valueForShadowData(shadowList->shadows()[i], style, useSpread)); |
- return list.release(); |
-} |
- |
-PassRefPtrWillBeRawPtr<CSSValue> LayoutStyleCSSValueMapping::valueForFilter(const LayoutStyle& style) |
-{ |
- if (style.filter().operations().isEmpty()) |
- return cssValuePool().createIdentifierValue(CSSValueNone); |
- |
- RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createSpaceSeparated(); |
- |
- RefPtrWillBeRawPtr<CSSFunctionValue> filterValue = nullptr; |
- |
- for (const auto& operation : style.filter().operations()) { |
- FilterOperation* filterOperation = operation.get(); |
- switch (filterOperation->type()) { |
- case FilterOperation::REFERENCE: |
- filterValue = CSSFunctionValue::create(CSSValueUrl); |
- filterValue->append(cssValuePool().createValue(toReferenceFilterOperation(filterOperation)->url(), CSSPrimitiveValue::CSS_CUSTOM_IDENT)); |
- break; |
- case FilterOperation::GRAYSCALE: |
- filterValue = CSSFunctionValue::create(CSSValueGrayscale); |
- filterValue->append(cssValuePool().createValue(toBasicColorMatrixFilterOperation(filterOperation)->amount(), CSSPrimitiveValue::CSS_NUMBER)); |
- break; |
- case FilterOperation::SEPIA: |
- filterValue = CSSFunctionValue::create(CSSValueSepia); |
- filterValue->append(cssValuePool().createValue(toBasicColorMatrixFilterOperation(filterOperation)->amount(), CSSPrimitiveValue::CSS_NUMBER)); |
- break; |
- case FilterOperation::SATURATE: |
- filterValue = CSSFunctionValue::create(CSSValueSaturate); |
- filterValue->append(cssValuePool().createValue(toBasicColorMatrixFilterOperation(filterOperation)->amount(), CSSPrimitiveValue::CSS_NUMBER)); |
- break; |
- case FilterOperation::HUE_ROTATE: |
- filterValue = CSSFunctionValue::create(CSSValueHueRotate); |
- filterValue->append(cssValuePool().createValue(toBasicColorMatrixFilterOperation(filterOperation)->amount(), CSSPrimitiveValue::CSS_DEG)); |
- break; |
- case FilterOperation::INVERT: |
- filterValue = CSSFunctionValue::create(CSSValueInvert); |
- filterValue->append(cssValuePool().createValue(toBasicComponentTransferFilterOperation(filterOperation)->amount(), CSSPrimitiveValue::CSS_NUMBER)); |
- break; |
- case FilterOperation::OPACITY: |
- filterValue = CSSFunctionValue::create(CSSValueOpacity); |
- filterValue->append(cssValuePool().createValue(toBasicComponentTransferFilterOperation(filterOperation)->amount(), CSSPrimitiveValue::CSS_NUMBER)); |
- break; |
- case FilterOperation::BRIGHTNESS: |
- filterValue = CSSFunctionValue::create(CSSValueBrightness); |
- filterValue->append(cssValuePool().createValue(toBasicComponentTransferFilterOperation(filterOperation)->amount(), CSSPrimitiveValue::CSS_NUMBER)); |
- break; |
- case FilterOperation::CONTRAST: |
- filterValue = CSSFunctionValue::create(CSSValueContrast); |
- filterValue->append(cssValuePool().createValue(toBasicComponentTransferFilterOperation(filterOperation)->amount(), CSSPrimitiveValue::CSS_NUMBER)); |
- break; |
- case FilterOperation::BLUR: |
- filterValue = CSSFunctionValue::create(CSSValueBlur); |
- filterValue->append(zoomAdjustedPixelValue(toBlurFilterOperation(filterOperation)->stdDeviation().value(), style)); |
- break; |
- case FilterOperation::DROP_SHADOW: { |
- DropShadowFilterOperation* dropShadowOperation = toDropShadowFilterOperation(filterOperation); |
- filterValue = CSSFunctionValue::create(CSSValueDropShadow); |
- // We want our computed style to look like that of a text shadow (has neither spread nor inset style). |
- ShadowData shadow(dropShadowOperation->location(), dropShadowOperation->stdDeviation(), 0, Normal, dropShadowOperation->color()); |
- filterValue->append(valueForShadowData(shadow, style, false)); |
- break; |
- } |
- default: |
- ASSERT_NOT_REACHED(); |
- break; |
- } |
- list->append(filterValue.release()); |
- } |
- |
- return list.release(); |
-} |
- |
-PassRefPtrWillBeRawPtr<CSSValue> LayoutStyleCSSValueMapping::get(CSSPropertyID propertyID, const LayoutStyle& style, const LayoutObject* renderer, Node* styledNode, bool allowVisitedStyle) |
-{ |
- const SVGLayoutStyle& svgStyle = style.svgStyle(); |
- propertyID = CSSProperty::resolveDirectionAwareProperty(propertyID, style.direction(), style.writingMode()); |
- switch (propertyID) { |
- case CSSPropertyInvalid: |
- return nullptr; |
- |
- case CSSPropertyBackgroundColor: |
- return allowVisitedStyle ? cssValuePool().createColorValue(style.visitedDependentColor(CSSPropertyBackgroundColor).rgb()) : currentColorOrValidColor(style, style.backgroundColor()); |
- case CSSPropertyBackgroundImage: |
- case CSSPropertyWebkitMaskImage: { |
- RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createCommaSeparated(); |
- const FillLayer* currLayer = propertyID == CSSPropertyWebkitMaskImage ? &style.maskLayers() : &style.backgroundLayers(); |
- for (; currLayer; currLayer = currLayer->next()) { |
- if (currLayer->image()) |
- list->append(currLayer->image()->cssValue()); |
- else |
- list->append(cssValuePool().createIdentifierValue(CSSValueNone)); |
- } |
- return list.release(); |
- } |
- case CSSPropertyBackgroundSize: |
- case CSSPropertyWebkitBackgroundSize: |
- case CSSPropertyWebkitMaskSize: { |
- RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createCommaSeparated(); |
- const FillLayer* currLayer = propertyID == CSSPropertyWebkitMaskSize ? &style.maskLayers() : &style.backgroundLayers(); |
- for (; currLayer; currLayer = currLayer->next()) |
- list->append(valueForFillSize(currLayer->size(), style)); |
- return list.release(); |
- } |
- case CSSPropertyBackgroundRepeat: |
- case CSSPropertyWebkitMaskRepeat: { |
- RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createCommaSeparated(); |
- const FillLayer* currLayer = propertyID == CSSPropertyWebkitMaskRepeat ? &style.maskLayers() : &style.backgroundLayers(); |
- for (; currLayer; currLayer = currLayer->next()) |
- list->append(valueForFillRepeat(currLayer->repeatX(), currLayer->repeatY())); |
- return list.release(); |
- } |
- case CSSPropertyMaskSourceType: { |
- RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createCommaSeparated(); |
- for (const FillLayer* currLayer = &style.maskLayers(); currLayer; currLayer = currLayer->next()) |
- list->append(valueForFillSourceType(currLayer->maskSourceType())); |
- return list.release(); |
- } |
- case CSSPropertyWebkitBackgroundComposite: |
- case CSSPropertyWebkitMaskComposite: { |
- RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createCommaSeparated(); |
- const FillLayer* currLayer = propertyID == CSSPropertyWebkitMaskComposite ? &style.maskLayers() : &style.backgroundLayers(); |
- for (; currLayer; currLayer = currLayer->next()) |
- list->append(cssValuePool().createValue(currLayer->composite())); |
- return list.release(); |
- } |
- case CSSPropertyBackgroundAttachment: { |
- RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createCommaSeparated(); |
- for (const FillLayer* currLayer = &style.backgroundLayers(); currLayer; currLayer = currLayer->next()) |
- list->append(cssValuePool().createValue(currLayer->attachment())); |
- return list.release(); |
- } |
- case CSSPropertyBackgroundClip: |
- case CSSPropertyBackgroundOrigin: |
- case CSSPropertyWebkitBackgroundClip: |
- case CSSPropertyWebkitBackgroundOrigin: |
- case CSSPropertyWebkitMaskClip: |
- case CSSPropertyWebkitMaskOrigin: { |
- bool isClip = propertyID == CSSPropertyBackgroundClip || propertyID == CSSPropertyWebkitBackgroundClip || propertyID == CSSPropertyWebkitMaskClip; |
- RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createCommaSeparated(); |
- const FillLayer* currLayer = (propertyID == CSSPropertyWebkitMaskClip || propertyID == CSSPropertyWebkitMaskOrigin) ? &style.maskLayers() : &style.backgroundLayers(); |
- for (; currLayer; currLayer = currLayer->next()) { |
- EFillBox box = isClip ? currLayer->clip() : currLayer->origin(); |
- list->append(cssValuePool().createValue(box)); |
- } |
- return list.release(); |
- } |
- case CSSPropertyBackgroundPosition: |
- case CSSPropertyWebkitMaskPosition: { |
- RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createCommaSeparated(); |
- const FillLayer* currLayer = propertyID == CSSPropertyWebkitMaskPosition ? &style.maskLayers() : &style.backgroundLayers(); |
- for (; currLayer; currLayer = currLayer->next()) |
- list->append(createPositionListForLayer(propertyID, *currLayer, style)); |
- return list.release(); |
- } |
- case CSSPropertyBackgroundPositionX: |
- case CSSPropertyWebkitMaskPositionX: { |
- RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createCommaSeparated(); |
- const FillLayer* currLayer = propertyID == CSSPropertyWebkitMaskPositionX ? &style.maskLayers() : &style.backgroundLayers(); |
- for (; currLayer; currLayer = currLayer->next()) |
- list->append(zoomAdjustedPixelValueForLength(currLayer->xPosition(), style)); |
- return list.release(); |
- } |
- case CSSPropertyBackgroundPositionY: |
- case CSSPropertyWebkitMaskPositionY: { |
- RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createCommaSeparated(); |
- const FillLayer* currLayer = propertyID == CSSPropertyWebkitMaskPositionY ? &style.maskLayers() : &style.backgroundLayers(); |
- for (; currLayer; currLayer = currLayer->next()) |
- list->append(zoomAdjustedPixelValueForLength(currLayer->yPosition(), style)); |
- return list.release(); |
- } |
- case CSSPropertyBorderCollapse: |
- if (style.borderCollapse()) |
- return cssValuePool().createIdentifierValue(CSSValueCollapse); |
- return cssValuePool().createIdentifierValue(CSSValueSeparate); |
- case CSSPropertyBorderSpacing: { |
- RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createSpaceSeparated(); |
- list->append(zoomAdjustedPixelValue(style.horizontalBorderSpacing(), style)); |
- list->append(zoomAdjustedPixelValue(style.verticalBorderSpacing(), style)); |
- return list.release(); |
- } |
- case CSSPropertyWebkitBorderHorizontalSpacing: |
- return zoomAdjustedPixelValue(style.horizontalBorderSpacing(), style); |
- case CSSPropertyWebkitBorderVerticalSpacing: |
- return zoomAdjustedPixelValue(style.verticalBorderSpacing(), style); |
- case CSSPropertyBorderImageSource: |
- if (style.borderImageSource()) |
- return style.borderImageSource()->cssValue(); |
- return cssValuePool().createIdentifierValue(CSSValueNone); |
- case CSSPropertyBorderTopColor: |
- return allowVisitedStyle ? cssValuePool().createColorValue(style.visitedDependentColor(CSSPropertyBorderTopColor).rgb()) : currentColorOrValidColor(style, style.borderTopColor()); |
- case CSSPropertyBorderRightColor: |
- return allowVisitedStyle ? cssValuePool().createColorValue(style.visitedDependentColor(CSSPropertyBorderRightColor).rgb()) : currentColorOrValidColor(style, style.borderRightColor()); |
- case CSSPropertyBorderBottomColor: |
- return allowVisitedStyle ? cssValuePool().createColorValue(style.visitedDependentColor(CSSPropertyBorderBottomColor).rgb()) : currentColorOrValidColor(style, style.borderBottomColor()); |
- case CSSPropertyBorderLeftColor: |
- return allowVisitedStyle ? cssValuePool().createColorValue(style.visitedDependentColor(CSSPropertyBorderLeftColor).rgb()) : currentColorOrValidColor(style, style.borderLeftColor()); |
- case CSSPropertyBorderTopStyle: |
- return cssValuePool().createValue(style.borderTopStyle()); |
- case CSSPropertyBorderRightStyle: |
- return cssValuePool().createValue(style.borderRightStyle()); |
- case CSSPropertyBorderBottomStyle: |
- return cssValuePool().createValue(style.borderBottomStyle()); |
- case CSSPropertyBorderLeftStyle: |
- return cssValuePool().createValue(style.borderLeftStyle()); |
- case CSSPropertyBorderTopWidth: |
- return zoomAdjustedPixelValue(style.borderTopWidth(), style); |
- case CSSPropertyBorderRightWidth: |
- return zoomAdjustedPixelValue(style.borderRightWidth(), style); |
- case CSSPropertyBorderBottomWidth: |
- return zoomAdjustedPixelValue(style.borderBottomWidth(), style); |
- case CSSPropertyBorderLeftWidth: |
- return zoomAdjustedPixelValue(style.borderLeftWidth(), style); |
- case CSSPropertyBottom: |
- return valueForPositionOffset(style, CSSPropertyBottom, renderer); |
- case CSSPropertyWebkitBoxAlign: |
- return cssValuePool().createValue(style.boxAlign()); |
- case CSSPropertyWebkitBoxDecorationBreak: |
- if (style.boxDecorationBreak() == DSLICE) |
- return cssValuePool().createIdentifierValue(CSSValueSlice); |
- return cssValuePool().createIdentifierValue(CSSValueClone); |
- case CSSPropertyWebkitBoxDirection: |
- return cssValuePool().createValue(style.boxDirection()); |
- case CSSPropertyWebkitBoxFlex: |
- return cssValuePool().createValue(style.boxFlex(), CSSPrimitiveValue::CSS_NUMBER); |
- case CSSPropertyWebkitBoxFlexGroup: |
- return cssValuePool().createValue(style.boxFlexGroup(), CSSPrimitiveValue::CSS_NUMBER); |
- case CSSPropertyWebkitBoxLines: |
- return cssValuePool().createValue(style.boxLines()); |
- case CSSPropertyWebkitBoxOrdinalGroup: |
- return cssValuePool().createValue(style.boxOrdinalGroup(), CSSPrimitiveValue::CSS_NUMBER); |
- case CSSPropertyWebkitBoxOrient: |
- return cssValuePool().createValue(style.boxOrient()); |
- case CSSPropertyWebkitBoxPack: |
- return cssValuePool().createValue(style.boxPack()); |
- case CSSPropertyWebkitBoxReflect: |
- return valueForReflection(style.boxReflect(), style); |
- case CSSPropertyBoxShadow: |
- case CSSPropertyWebkitBoxShadow: |
- return valueForShadowList(style.boxShadow(), style, true); |
- case CSSPropertyCaptionSide: |
- return cssValuePool().createValue(style.captionSide()); |
- case CSSPropertyClear: |
- return cssValuePool().createValue(style.clear()); |
- case CSSPropertyColor: |
- return cssValuePool().createColorValue(allowVisitedStyle ? style.visitedDependentColor(CSSPropertyColor).rgb() : style.color().rgb()); |
- case CSSPropertyWebkitPrintColorAdjust: |
- return cssValuePool().createValue(style.printColorAdjust()); |
- case CSSPropertyWebkitColumnCount: |
- if (style.hasAutoColumnCount()) |
- return cssValuePool().createIdentifierValue(CSSValueAuto); |
- return cssValuePool().createValue(style.columnCount(), CSSPrimitiveValue::CSS_NUMBER); |
- case CSSPropertyColumnFill: |
- ASSERT(RuntimeEnabledFeatures::regionBasedColumnsEnabled()); |
- return cssValuePool().createValue(style.columnFill()); |
- case CSSPropertyWebkitColumnGap: |
- if (style.hasNormalColumnGap()) |
- return cssValuePool().createIdentifierValue(CSSValueNormal); |
- return zoomAdjustedPixelValue(style.columnGap(), style); |
- case CSSPropertyWebkitColumnRuleColor: |
- return allowVisitedStyle ? cssValuePool().createColorValue(style.visitedDependentColor(CSSPropertyOutlineColor).rgb()) : currentColorOrValidColor(style, style.columnRuleColor()); |
- case CSSPropertyWebkitColumnRuleStyle: |
- return cssValuePool().createValue(style.columnRuleStyle()); |
- case CSSPropertyWebkitColumnRuleWidth: |
- return zoomAdjustedPixelValue(style.columnRuleWidth(), style); |
- case CSSPropertyWebkitColumnSpan: |
- return cssValuePool().createIdentifierValue(style.columnSpan() ? CSSValueAll : CSSValueNone); |
- case CSSPropertyWebkitColumnBreakAfter: |
- return cssValuePool().createValue(style.columnBreakAfter()); |
- case CSSPropertyWebkitColumnBreakBefore: |
- return cssValuePool().createValue(style.columnBreakBefore()); |
- case CSSPropertyWebkitColumnBreakInside: |
- return cssValuePool().createValue(style.columnBreakInside()); |
- case CSSPropertyWebkitColumnWidth: |
- if (style.hasAutoColumnWidth()) |
- return cssValuePool().createIdentifierValue(CSSValueAuto); |
- return zoomAdjustedPixelValue(style.columnWidth(), style); |
- case CSSPropertyTabSize: |
- return cssValuePool().createValue( |
- style.tabSize().getPixelSize(1.0), style.tabSize().isSpaces() ? CSSPrimitiveValue::CSS_NUMBER : CSSPrimitiveValue::CSS_PX); |
- case CSSPropertyCursor: { |
- RefPtrWillBeRawPtr<CSSValueList> list = nullptr; |
- CursorList* cursors = style.cursors(); |
- if (cursors && cursors->size() > 0) { |
- list = CSSValueList::createCommaSeparated(); |
- for (unsigned i = 0; i < cursors->size(); ++i) { |
- if (StyleImage* image = cursors->at(i).image()) |
- list->append(image->cssValue()); |
- } |
- } |
- RefPtrWillBeRawPtr<CSSValue> value = cssValuePool().createValue(style.cursor()); |
- if (list) { |
- list->append(value.release()); |
- return list.release(); |
- } |
- return value.release(); |
- } |
- case CSSPropertyDirection: |
- return cssValuePool().createValue(style.direction()); |
- case CSSPropertyDisplay: |
- return cssValuePool().createValue(style.display()); |
- case CSSPropertyEmptyCells: |
- return cssValuePool().createValue(style.emptyCells()); |
- case CSSPropertyAlignContent: |
- return valueForContentPositionAndDistributionWithOverflowAlignment(resolveContentAlignmentAuto(style.alignContent(), style.alignContentDistribution(), styledNode), style.alignContentOverflowAlignment(), style.alignContentDistribution()); |
- case CSSPropertyAlignItems: |
- return valueForItemPositionWithOverflowAlignment(resolveAlignmentAuto(style.alignItems(), styledNode), style.alignItemsOverflowAlignment(), NonLegacyPosition); |
- case CSSPropertyAlignSelf: |
- return valueForItemPositionWithOverflowAlignment(resolveAlignmentAuto(style.alignSelf(), styledNode->parentNode()), style.alignSelfOverflowAlignment(), NonLegacyPosition); |
- case CSSPropertyFlex: |
- return valuesForShorthandProperty(flexShorthand(), style, renderer, styledNode, allowVisitedStyle); |
- case CSSPropertyFlexBasis: |
- return zoomAdjustedPixelValueForLength(style.flexBasis(), style); |
- case CSSPropertyFlexDirection: |
- return cssValuePool().createValue(style.flexDirection()); |
- case CSSPropertyFlexFlow: |
- return valuesForShorthandProperty(flexFlowShorthand(), style, renderer, styledNode, allowVisitedStyle); |
- case CSSPropertyFlexGrow: |
- return cssValuePool().createValue(style.flexGrow()); |
- case CSSPropertyFlexShrink: |
- return cssValuePool().createValue(style.flexShrink()); |
- case CSSPropertyFlexWrap: |
- return cssValuePool().createValue(style.flexWrap()); |
- case CSSPropertyJustifyContent: |
- return valueForContentPositionAndDistributionWithOverflowAlignment(resolveContentAlignmentAuto(style.justifyContent(), style.justifyContentDistribution(), styledNode), style.justifyContentOverflowAlignment(), style.justifyContentDistribution()); |
- case CSSPropertyOrder: |
- return cssValuePool().createValue(style.order(), CSSPrimitiveValue::CSS_NUMBER); |
- case CSSPropertyFloat: |
- if (style.display() != NONE && style.hasOutOfFlowPosition()) |
- return cssValuePool().createIdentifierValue(CSSValueNone); |
- return cssValuePool().createValue(style.floating()); |
- case CSSPropertyFont: { |
- RefPtrWillBeRawPtr<CSSFontValue> computedFont = CSSFontValue::create(); |
- computedFont->style = valueForFontStyle(style); |
- computedFont->variant = valueForFontVariant(style); |
- computedFont->weight = valueForFontWeight(style); |
- computedFont->stretch = valueForFontStretch(style); |
- computedFont->size = valueForFontSize(style); |
- computedFont->lineHeight = valueForLineHeight(style); |
- computedFont->family = valueForFontFamily(style); |
- return computedFont.release(); |
- } |
- case CSSPropertyFontFamily: |
- return valueForFontFamily(style); |
- case CSSPropertyFontSize: |
- return valueForFontSize(style); |
- case CSSPropertyFontSizeAdjust: |
- if (style.hasFontSizeAdjust()) |
- return cssValuePool().createValue(style.fontSizeAdjust(), CSSPrimitiveValue::CSS_NUMBER); |
- return cssValuePool().createIdentifierValue(CSSValueNone); |
- case CSSPropertyFontStretch: |
- return valueForFontStretch(style); |
- case CSSPropertyFontStyle: |
- return valueForFontStyle(style); |
- case CSSPropertyFontVariant: |
- return valueForFontVariant(style); |
- case CSSPropertyFontWeight: |
- return valueForFontWeight(style); |
- case CSSPropertyWebkitFontFeatureSettings: { |
- const FontFeatureSettings* featureSettings = style.fontDescription().featureSettings(); |
- if (!featureSettings || !featureSettings->size()) |
- return cssValuePool().createIdentifierValue(CSSValueNormal); |
- RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createCommaSeparated(); |
- for (unsigned i = 0; i < featureSettings->size(); ++i) { |
- const FontFeature& feature = featureSettings->at(i); |
- RefPtrWillBeRawPtr<CSSFontFeatureValue> featureValue = CSSFontFeatureValue::create(feature.tag(), feature.value()); |
- list->append(featureValue.release()); |
- } |
- return list.release(); |
- } |
- case CSSPropertyGridAutoFlow: { |
- RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createSpaceSeparated(); |
- switch (style.gridAutoFlow()) { |
- case AutoFlowRow: |
- case AutoFlowRowDense: |
- list->append(cssValuePool().createIdentifierValue(CSSValueRow)); |
- break; |
- case AutoFlowColumn: |
- case AutoFlowColumnDense: |
- list->append(cssValuePool().createIdentifierValue(CSSValueColumn)); |
- break; |
- default: |
- ASSERT_NOT_REACHED(); |
- } |
- |
- switch (style.gridAutoFlow()) { |
- case AutoFlowRowDense: |
- case AutoFlowColumnDense: |
- list->append(cssValuePool().createIdentifierValue(CSSValueDense)); |
- break; |
- default: |
- // Do nothing. |
- break; |
- } |
- |
- return list.release(); |
- } |
- // Specs mention that getComputedStyle() should return the used value of the property instead of the computed |
- // one for grid-definition-{rows|columns} but not for the grid-auto-{rows|columns} as things like |
- // grid-auto-columns: 2fr; cannot be resolved to a value in pixels as the '2fr' means very different things |
- // depending on the size of the explicit grid or the number of implicit tracks added to the grid. See |
- // http://lists.w3.org/Archives/Public/www-style/2013Nov/0014.html |
- case CSSPropertyGridAutoColumns: |
- return specifiedValueForGridTrackSize(style.gridAutoColumns(), style); |
- case CSSPropertyGridAutoRows: |
- return specifiedValueForGridTrackSize(style.gridAutoRows(), style); |
- |
- case CSSPropertyGridTemplateColumns: |
- return valueForGridTrackList(ForColumns, renderer, style); |
- case CSSPropertyGridTemplateRows: |
- return valueForGridTrackList(ForRows, renderer, style); |
- |
- case CSSPropertyGridColumnStart: |
- return valueForGridPosition(style.gridColumnStart()); |
- case CSSPropertyGridColumnEnd: |
- return valueForGridPosition(style.gridColumnEnd()); |
- case CSSPropertyGridRowStart: |
- return valueForGridPosition(style.gridRowStart()); |
- case CSSPropertyGridRowEnd: |
- return valueForGridPosition(style.gridRowEnd()); |
- case CSSPropertyGridColumn: |
- return valuesForGridShorthand(gridColumnShorthand(), style, renderer, styledNode, allowVisitedStyle); |
- case CSSPropertyGridRow: |
- return valuesForGridShorthand(gridRowShorthand(), style, renderer, styledNode, allowVisitedStyle); |
- case CSSPropertyGridArea: |
- return valuesForGridShorthand(gridAreaShorthand(), style, renderer, styledNode, allowVisitedStyle); |
- case CSSPropertyGridTemplate: |
- return valuesForGridShorthand(gridTemplateShorthand(), style, renderer, styledNode, allowVisitedStyle); |
- case CSSPropertyGrid: |
- return valuesForGridShorthand(gridShorthand(), style, renderer, styledNode, allowVisitedStyle); |
- case CSSPropertyGridTemplateAreas: |
- if (!style.namedGridAreaRowCount()) { |
- ASSERT(!style.namedGridAreaColumnCount()); |
- return cssValuePool().createIdentifierValue(CSSValueNone); |
- } |
- |
- return CSSGridTemplateAreasValue::create(style.namedGridArea(), style.namedGridAreaRowCount(), style.namedGridAreaColumnCount()); |
- |
- case CSSPropertyHeight: |
- if (renderer) { |
- // According to http://www.w3.org/TR/CSS2/visudet.html#the-height-property, |
- // the "height" property does not apply for non-replaced inline elements. |
- if (!renderer->isReplaced() && renderer->isInline()) |
- return cssValuePool().createIdentifierValue(CSSValueAuto); |
- return zoomAdjustedPixelValue(sizingBox(renderer).height(), style); |
- } |
- return zoomAdjustedPixelValueForLength(style.height(), style); |
- case CSSPropertyWebkitHighlight: |
- if (style.highlight() == nullAtom) |
- return cssValuePool().createIdentifierValue(CSSValueNone); |
- return cssValuePool().createValue(style.highlight(), CSSPrimitiveValue::CSS_STRING); |
- case CSSPropertyWebkitHyphenateCharacter: |
- if (style.hyphenationString().isNull()) |
- return cssValuePool().createIdentifierValue(CSSValueAuto); |
- return cssValuePool().createValue(style.hyphenationString(), CSSPrimitiveValue::CSS_STRING); |
- case CSSPropertyImageRendering: |
- return CSSPrimitiveValue::create(style.imageRendering()); |
- case CSSPropertyIsolation: |
- return cssValuePool().createValue(style.isolation()); |
- case CSSPropertyJustifyItems: |
- return valueForItemPositionWithOverflowAlignment(resolveAlignmentAuto(style.justifyItems(), styledNode), style.justifyItemsOverflowAlignment(), style.justifyItemsPositionType()); |
- case CSSPropertyJustifySelf: |
- return valueForItemPositionWithOverflowAlignment(resolveAlignmentAuto(style.justifySelf(), styledNode->parentNode()), style.justifySelfOverflowAlignment(), NonLegacyPosition); |
- case CSSPropertyLeft: |
- return valueForPositionOffset(style, CSSPropertyLeft, renderer); |
- case CSSPropertyLetterSpacing: |
- if (!style.letterSpacing()) |
- return cssValuePool().createIdentifierValue(CSSValueNormal); |
- return zoomAdjustedPixelValue(style.letterSpacing(), style); |
- case CSSPropertyWebkitLineClamp: |
- if (style.lineClamp().isNone()) |
- return cssValuePool().createIdentifierValue(CSSValueNone); |
- return cssValuePool().createValue(style.lineClamp().value(), style.lineClamp().isPercentage() ? CSSPrimitiveValue::CSS_PERCENTAGE : CSSPrimitiveValue::CSS_NUMBER); |
- case CSSPropertyLineHeight: |
- return valueForLineHeight(style); |
- case CSSPropertyListStyleImage: |
- if (style.listStyleImage()) |
- return style.listStyleImage()->cssValue(); |
- return cssValuePool().createIdentifierValue(CSSValueNone); |
- case CSSPropertyListStylePosition: |
- return cssValuePool().createValue(style.listStylePosition()); |
- case CSSPropertyListStyleType: |
- return cssValuePool().createValue(style.listStyleType()); |
- case CSSPropertyWebkitLocale: |
- if (style.locale().isNull()) |
- return cssValuePool().createIdentifierValue(CSSValueAuto); |
- return cssValuePool().createValue(style.locale(), CSSPrimitiveValue::CSS_STRING); |
- case CSSPropertyMarginTop: { |
- Length marginTop = style.marginTop(); |
- if (marginTop.isFixed() || !renderer || !renderer->isBox()) |
- return zoomAdjustedPixelValueForLength(marginTop, style); |
- return zoomAdjustedPixelValue(toLayoutBox(renderer)->marginTop(), style); |
- } |
- case CSSPropertyMarginRight: { |
- Length marginRight = style.marginRight(); |
- if (marginRight.isFixed() || !renderer || !renderer->isBox()) |
- return zoomAdjustedPixelValueForLength(marginRight, style); |
- float value; |
- if (marginRight.isPercent()) { |
- // LayoutBox gives a marginRight() that is the distance between the right-edge of the child box |
- // and the right-edge of the containing box, when display == BLOCK. Let's calculate the absolute |
- // value of the specified margin-right % instead of relying on LayoutBox's marginRight() value. |
- value = minimumValueForLength(marginRight, toLayoutBox(renderer)->containingBlockLogicalWidthForContent()).toFloat(); |
- } else { |
- value = toLayoutBox(renderer)->marginRight().toFloat(); |
- } |
- return zoomAdjustedPixelValue(value, style); |
- } |
- case CSSPropertyMarginBottom: { |
- Length marginBottom = style.marginBottom(); |
- if (marginBottom.isFixed() || !renderer || !renderer->isBox()) |
- return zoomAdjustedPixelValueForLength(marginBottom, style); |
- return zoomAdjustedPixelValue(toLayoutBox(renderer)->marginBottom(), style); |
- } |
- case CSSPropertyMarginLeft: { |
- Length marginLeft = style.marginLeft(); |
- if (marginLeft.isFixed() || !renderer || !renderer->isBox()) |
- return zoomAdjustedPixelValueForLength(marginLeft, style); |
- return zoomAdjustedPixelValue(toLayoutBox(renderer)->marginLeft(), style); |
- } |
- case CSSPropertyWebkitUserModify: |
- return cssValuePool().createValue(style.userModify()); |
- case CSSPropertyMaxHeight: { |
- const Length& maxHeight = style.maxHeight(); |
- if (maxHeight.isMaxSizeNone()) |
- return cssValuePool().createIdentifierValue(CSSValueNone); |
- return zoomAdjustedPixelValueForLength(maxHeight, style); |
- } |
- case CSSPropertyMaxWidth: { |
- const Length& maxWidth = style.maxWidth(); |
- if (maxWidth.isMaxSizeNone()) |
- return cssValuePool().createIdentifierValue(CSSValueNone); |
- return zoomAdjustedPixelValueForLength(maxWidth, style); |
- } |
- case CSSPropertyMinHeight: |
- // FIXME: For flex-items, min-height:auto should compute to min-content. |
- if (style.minHeight().isAuto()) |
- return zoomAdjustedPixelValue(0, style); |
- return zoomAdjustedPixelValueForLength(style.minHeight(), style); |
- case CSSPropertyMinWidth: |
- // FIXME: For flex-items, min-width:auto should compute to min-content. |
- if (style.minWidth().isAuto()) |
- return zoomAdjustedPixelValue(0, style); |
- return zoomAdjustedPixelValueForLength(style.minWidth(), style); |
- case CSSPropertyObjectFit: |
- return cssValuePool().createValue(style.objectFit()); |
- case CSSPropertyObjectPosition: |
- return cssValuePool().createValue( |
- Pair::create( |
- zoomAdjustedPixelValueForLength(style.objectPosition().x(), style), |
- zoomAdjustedPixelValueForLength(style.objectPosition().y(), style), |
- Pair::KeepIdenticalValues)); |
- case CSSPropertyOpacity: |
- return cssValuePool().createValue(style.opacity(), CSSPrimitiveValue::CSS_NUMBER); |
- case CSSPropertyOrphans: |
- if (style.hasAutoOrphans()) |
- return cssValuePool().createIdentifierValue(CSSValueAuto); |
- return cssValuePool().createValue(style.orphans(), CSSPrimitiveValue::CSS_NUMBER); |
- case CSSPropertyOutlineColor: |
- return allowVisitedStyle ? cssValuePool().createColorValue(style.visitedDependentColor(CSSPropertyOutlineColor).rgb()) : currentColorOrValidColor(style, style.outlineColor()); |
- case CSSPropertyOutlineOffset: |
- return zoomAdjustedPixelValue(style.outlineOffset(), style); |
- case CSSPropertyOutlineStyle: |
- if (style.outlineStyleIsAuto()) |
- return cssValuePool().createIdentifierValue(CSSValueAuto); |
- return cssValuePool().createValue(style.outlineStyle()); |
- case CSSPropertyOutlineWidth: |
- return zoomAdjustedPixelValue(style.outlineWidth(), style); |
- case CSSPropertyOverflow: |
- return cssValuePool().createValue(max(style.overflowX(), style.overflowY())); |
- case CSSPropertyOverflowWrap: |
- return cssValuePool().createValue(style.overflowWrap()); |
- case CSSPropertyOverflowX: |
- return cssValuePool().createValue(style.overflowX()); |
- case CSSPropertyOverflowY: |
- return cssValuePool().createValue(style.overflowY()); |
- case CSSPropertyPaddingTop: { |
- Length paddingTop = style.paddingTop(); |
- if (paddingTop.isFixed() || !renderer || !renderer->isBox()) |
- return zoomAdjustedPixelValueForLength(paddingTop, style); |
- return zoomAdjustedPixelValue(toLayoutBox(renderer)->computedCSSPaddingTop(), style); |
- } |
- case CSSPropertyPaddingRight: { |
- Length paddingRight = style.paddingRight(); |
- if (paddingRight.isFixed() || !renderer || !renderer->isBox()) |
- return zoomAdjustedPixelValueForLength(paddingRight, style); |
- return zoomAdjustedPixelValue(toLayoutBox(renderer)->computedCSSPaddingRight(), style); |
- } |
- case CSSPropertyPaddingBottom: { |
- Length paddingBottom = style.paddingBottom(); |
- if (paddingBottom.isFixed() || !renderer || !renderer->isBox()) |
- return zoomAdjustedPixelValueForLength(paddingBottom, style); |
- return zoomAdjustedPixelValue(toLayoutBox(renderer)->computedCSSPaddingBottom(), style); |
- } |
- case CSSPropertyPaddingLeft: { |
- Length paddingLeft = style.paddingLeft(); |
- if (paddingLeft.isFixed() || !renderer || !renderer->isBox()) |
- return zoomAdjustedPixelValueForLength(paddingLeft, style); |
- return zoomAdjustedPixelValue(toLayoutBox(renderer)->computedCSSPaddingLeft(), style); |
- } |
- case CSSPropertyPageBreakAfter: |
- return cssValuePool().createValue(style.pageBreakAfter()); |
- case CSSPropertyPageBreakBefore: |
- return cssValuePool().createValue(style.pageBreakBefore()); |
- case CSSPropertyPageBreakInside: { |
- EPageBreak pageBreak = style.pageBreakInside(); |
- ASSERT(pageBreak != PBALWAYS); |
- if (pageBreak == PBALWAYS) |
- return nullptr; |
- return cssValuePool().createValue(style.pageBreakInside()); |
- } |
- case CSSPropertyPosition: |
- return cssValuePool().createValue(style.position()); |
- case CSSPropertyRight: |
- return valueForPositionOffset(style, CSSPropertyRight, renderer); |
- case CSSPropertyWebkitRubyPosition: |
- return cssValuePool().createValue(style.rubyPosition()); |
- case CSSPropertyScrollBehavior: |
- return cssValuePool().createValue(style.scrollBehavior()); |
- case CSSPropertyScrollBlocksOn: |
- return scrollBlocksOnFlagsToCSSValue(style.scrollBlocksOn()); |
- case CSSPropertyTableLayout: |
- return cssValuePool().createValue(style.tableLayout()); |
- case CSSPropertyTextAlign: |
- return cssValuePool().createValue(style.textAlign()); |
- case CSSPropertyTextAlignLast: |
- return cssValuePool().createValue(style.textAlignLast()); |
- case CSSPropertyTextDecoration: |
- if (RuntimeEnabledFeatures::css3TextDecorationsEnabled()) |
- return valuesForShorthandProperty(textDecorationShorthand(), style, renderer, styledNode, allowVisitedStyle); |
- // Fall through. |
- case CSSPropertyTextDecorationLine: |
- return renderTextDecorationFlagsToCSSValue(style.textDecoration()); |
- case CSSPropertyTextDecorationStyle: |
- return valueForTextDecorationStyle(style.textDecorationStyle()); |
- case CSSPropertyTextDecorationColor: |
- return currentColorOrValidColor(style, style.textDecorationColor()); |
- case CSSPropertyTextJustify: |
- return cssValuePool().createValue(style.textJustify()); |
- case CSSPropertyTextUnderlinePosition: |
- return cssValuePool().createValue(style.textUnderlinePosition()); |
- case CSSPropertyWebkitTextDecorationsInEffect: |
- return renderTextDecorationFlagsToCSSValue(style.textDecorationsInEffect()); |
- case CSSPropertyWebkitTextFillColor: |
- return currentColorOrValidColor(style, style.textFillColor()); |
- case CSSPropertyWebkitTextEmphasisColor: |
- return currentColorOrValidColor(style, style.textEmphasisColor()); |
- case CSSPropertyWebkitTextEmphasisPosition: |
- return cssValuePool().createValue(style.textEmphasisPosition()); |
- case CSSPropertyWebkitTextEmphasisStyle: |
- switch (style.textEmphasisMark()) { |
- case TextEmphasisMarkNone: |
- return cssValuePool().createIdentifierValue(CSSValueNone); |
- case TextEmphasisMarkCustom: |
- return cssValuePool().createValue(style.textEmphasisCustomMark(), CSSPrimitiveValue::CSS_STRING); |
- case TextEmphasisMarkAuto: |
- ASSERT_NOT_REACHED(); |
- // Fall through |
- case TextEmphasisMarkDot: |
- case TextEmphasisMarkCircle: |
- case TextEmphasisMarkDoubleCircle: |
- case TextEmphasisMarkTriangle: |
- case TextEmphasisMarkSesame: { |
- RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createSpaceSeparated(); |
- list->append(cssValuePool().createValue(style.textEmphasisFill())); |
- list->append(cssValuePool().createValue(style.textEmphasisMark())); |
- return list.release(); |
- } |
- } |
- case CSSPropertyTextIndent: { |
- RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createSpaceSeparated(); |
- list->append(zoomAdjustedPixelValueForLength(style.textIndent(), style)); |
- if (RuntimeEnabledFeatures::css3TextEnabled() && (style.textIndentLine() == TextIndentEachLine || style.textIndentType() == TextIndentHanging)) { |
- if (style.textIndentLine() == TextIndentEachLine) |
- list->append(cssValuePool().createIdentifierValue(CSSValueEachLine)); |
- if (style.textIndentType() == TextIndentHanging) |
- list->append(cssValuePool().createIdentifierValue(CSSValueHanging)); |
- } |
- return list.release(); |
- } |
- case CSSPropertyTextShadow: |
- return valueForShadowList(style.textShadow(), style, false); |
- case CSSPropertyTextRendering: |
- return cssValuePool().createValue(style.fontDescription().textRendering()); |
- case CSSPropertyTextOverflow: |
- if (style.textOverflow()) |
- return cssValuePool().createIdentifierValue(CSSValueEllipsis); |
- return cssValuePool().createIdentifierValue(CSSValueClip); |
- case CSSPropertyWebkitTextSecurity: |
- return cssValuePool().createValue(style.textSecurity()); |
- case CSSPropertyWebkitTextStrokeColor: |
- return currentColorOrValidColor(style, style.textStrokeColor()); |
- case CSSPropertyWebkitTextStrokeWidth: |
- return zoomAdjustedPixelValue(style.textStrokeWidth(), style); |
- case CSSPropertyTextTransform: |
- return cssValuePool().createValue(style.textTransform()); |
- case CSSPropertyTop: |
- return valueForPositionOffset(style, CSSPropertyTop, renderer); |
- case CSSPropertyTouchAction: |
- return touchActionFlagsToCSSValue(style.touchAction()); |
- case CSSPropertyUnicodeBidi: |
- return cssValuePool().createValue(style.unicodeBidi()); |
- case CSSPropertyVerticalAlign: |
- switch (style.verticalAlign()) { |
- case BASELINE: |
- return cssValuePool().createIdentifierValue(CSSValueBaseline); |
- case MIDDLE: |
- return cssValuePool().createIdentifierValue(CSSValueMiddle); |
- case SUB: |
- return cssValuePool().createIdentifierValue(CSSValueSub); |
- case SUPER: |
- return cssValuePool().createIdentifierValue(CSSValueSuper); |
- case TEXT_TOP: |
- return cssValuePool().createIdentifierValue(CSSValueTextTop); |
- case TEXT_BOTTOM: |
- return cssValuePool().createIdentifierValue(CSSValueTextBottom); |
- case TOP: |
- return cssValuePool().createIdentifierValue(CSSValueTop); |
- case BOTTOM: |
- return cssValuePool().createIdentifierValue(CSSValueBottom); |
- case BASELINE_MIDDLE: |
- return cssValuePool().createIdentifierValue(CSSValueWebkitBaselineMiddle); |
- case LENGTH: |
- return zoomAdjustedPixelValueForLength(style.verticalAlignLength(), style); |
- } |
- ASSERT_NOT_REACHED(); |
- return nullptr; |
- case CSSPropertyVisibility: |
- return cssValuePool().createValue(style.visibility()); |
- case CSSPropertyWhiteSpace: |
- return cssValuePool().createValue(style.whiteSpace()); |
- case CSSPropertyWidows: |
- return cssValuePool().createValue(style.widows(), CSSPrimitiveValue::CSS_NUMBER); |
- case CSSPropertyWidth: |
- if (renderer) { |
- // According to http://www.w3.org/TR/CSS2/visudet.html#the-width-property, |
- // the "width" property does not apply for non-replaced inline elements. |
- if (!renderer->isReplaced() && renderer->isInline()) |
- return cssValuePool().createIdentifierValue(CSSValueAuto); |
- return zoomAdjustedPixelValue(sizingBox(renderer).width(), style); |
- } |
- return zoomAdjustedPixelValueForLength(style.width(), style); |
- case CSSPropertyWillChange: |
- return valueForWillChange(style.willChangeProperties(), style.willChangeContents(), style.willChangeScrollPosition()); |
- case CSSPropertyWordBreak: |
- return cssValuePool().createValue(style.wordBreak()); |
- case CSSPropertyWordSpacing: |
- return zoomAdjustedPixelValue(style.wordSpacing(), style); |
- case CSSPropertyWordWrap: |
- return cssValuePool().createValue(style.overflowWrap()); |
- case CSSPropertyWebkitLineBreak: |
- return cssValuePool().createValue(style.lineBreak()); |
- case CSSPropertyResize: |
- return cssValuePool().createValue(style.resize()); |
- case CSSPropertyFontKerning: |
- return cssValuePool().createValue(style.fontDescription().kerning()); |
- case CSSPropertyWebkitFontSmoothing: |
- return cssValuePool().createValue(style.fontDescription().fontSmoothing()); |
- case CSSPropertyFontVariantLigatures: { |
- FontDescription::LigaturesState commonLigaturesState = style.fontDescription().commonLigaturesState(); |
- FontDescription::LigaturesState discretionaryLigaturesState = style.fontDescription().discretionaryLigaturesState(); |
- FontDescription::LigaturesState historicalLigaturesState = style.fontDescription().historicalLigaturesState(); |
- FontDescription::LigaturesState contextualLigaturesState = style.fontDescription().contextualLigaturesState(); |
- if (commonLigaturesState == FontDescription::NormalLigaturesState && discretionaryLigaturesState == FontDescription::NormalLigaturesState |
- && historicalLigaturesState == FontDescription::NormalLigaturesState && contextualLigaturesState == FontDescription::NormalLigaturesState) |
- return cssValuePool().createIdentifierValue(CSSValueNormal); |
- |
- RefPtrWillBeRawPtr<CSSValueList> valueList = CSSValueList::createSpaceSeparated(); |
- if (commonLigaturesState != FontDescription::NormalLigaturesState) |
- valueList->append(cssValuePool().createIdentifierValue(commonLigaturesState == FontDescription::DisabledLigaturesState ? CSSValueNoCommonLigatures : CSSValueCommonLigatures)); |
- if (discretionaryLigaturesState != FontDescription::NormalLigaturesState) |
- valueList->append(cssValuePool().createIdentifierValue(discretionaryLigaturesState == FontDescription::DisabledLigaturesState ? CSSValueNoDiscretionaryLigatures : CSSValueDiscretionaryLigatures)); |
- if (historicalLigaturesState != FontDescription::NormalLigaturesState) |
- valueList->append(cssValuePool().createIdentifierValue(historicalLigaturesState == FontDescription::DisabledLigaturesState ? CSSValueNoHistoricalLigatures : CSSValueHistoricalLigatures)); |
- if (contextualLigaturesState != FontDescription::NormalLigaturesState) |
- valueList->append(cssValuePool().createIdentifierValue(contextualLigaturesState == FontDescription::DisabledLigaturesState ? CSSValueNoContextual : CSSValueContextual)); |
- return valueList; |
- } |
- case CSSPropertyZIndex: |
- if (style.hasAutoZIndex()) |
- return cssValuePool().createIdentifierValue(CSSValueAuto); |
- return cssValuePool().createValue(style.zIndex(), CSSPrimitiveValue::CSS_NUMBER); |
- case CSSPropertyZoom: |
- return cssValuePool().createValue(style.zoom(), CSSPrimitiveValue::CSS_NUMBER); |
- case CSSPropertyBoxSizing: |
- if (style.boxSizing() == CONTENT_BOX) |
- return cssValuePool().createIdentifierValue(CSSValueContentBox); |
- return cssValuePool().createIdentifierValue(CSSValueBorderBox); |
- case CSSPropertyWebkitAppRegion: |
- return cssValuePool().createIdentifierValue(style.getDraggableRegionMode() == DraggableRegionDrag ? CSSValueDrag : CSSValueNoDrag); |
- case CSSPropertyAnimationDelay: |
- ASSERT(RuntimeEnabledFeatures::cssAnimationUnprefixedEnabled()); |
- case CSSPropertyWebkitAnimationDelay: |
- return valueForAnimationDelay(style.animations()); |
- case CSSPropertyAnimationDirection: |
- ASSERT(RuntimeEnabledFeatures::cssAnimationUnprefixedEnabled()); |
- case CSSPropertyWebkitAnimationDirection: { |
- RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createCommaSeparated(); |
- const CSSAnimationData* animationData = style.animations(); |
- if (animationData) { |
- for (size_t i = 0; i < animationData->directionList().size(); ++i) |
- list->append(valueForAnimationDirection(animationData->directionList()[i])); |
- } else { |
- list->append(cssValuePool().createIdentifierValue(CSSValueNormal)); |
- } |
- return list.release(); |
- } |
- case CSSPropertyAnimationDuration: |
- ASSERT(RuntimeEnabledFeatures::cssAnimationUnprefixedEnabled()); |
- case CSSPropertyWebkitAnimationDuration: |
- return valueForAnimationDuration(style.animations()); |
- case CSSPropertyAnimationFillMode: |
- ASSERT(RuntimeEnabledFeatures::cssAnimationUnprefixedEnabled()); |
- case CSSPropertyWebkitAnimationFillMode: { |
- RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createCommaSeparated(); |
- const CSSAnimationData* animationData = style.animations(); |
- if (animationData) { |
- for (size_t i = 0; i < animationData->fillModeList().size(); ++i) |
- list->append(valueForAnimationFillMode(animationData->fillModeList()[i])); |
- } else { |
- list->append(cssValuePool().createIdentifierValue(CSSValueNone)); |
- } |
- return list.release(); |
- } |
- case CSSPropertyAnimationIterationCount: |
- ASSERT(RuntimeEnabledFeatures::cssAnimationUnprefixedEnabled()); |
- case CSSPropertyWebkitAnimationIterationCount: { |
- RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createCommaSeparated(); |
- const CSSAnimationData* animationData = style.animations(); |
- if (animationData) { |
- for (size_t i = 0; i < animationData->iterationCountList().size(); ++i) |
- list->append(valueForAnimationIterationCount(animationData->iterationCountList()[i])); |
- } else { |
- list->append(cssValuePool().createValue(CSSAnimationData::initialIterationCount(), CSSPrimitiveValue::CSS_NUMBER)); |
- } |
- return list.release(); |
- } |
- case CSSPropertyAnimationName: |
- ASSERT(RuntimeEnabledFeatures::cssAnimationUnprefixedEnabled()); |
- case CSSPropertyWebkitAnimationName: { |
- RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createCommaSeparated(); |
- const CSSAnimationData* animationData = style.animations(); |
- if (animationData) { |
- for (size_t i = 0; i < animationData->nameList().size(); ++i) |
- list->append(cssValuePool().createValue(animationData->nameList()[i], CSSPrimitiveValue::CSS_CUSTOM_IDENT)); |
- } else { |
- list->append(cssValuePool().createIdentifierValue(CSSValueNone)); |
- } |
- return list.release(); |
- } |
- case CSSPropertyAnimationPlayState: |
- ASSERT(RuntimeEnabledFeatures::cssAnimationUnprefixedEnabled()); |
- case CSSPropertyWebkitAnimationPlayState: { |
- RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createCommaSeparated(); |
- const CSSAnimationData* animationData = style.animations(); |
- if (animationData) { |
- for (size_t i = 0; i < animationData->playStateList().size(); ++i) |
- list->append(valueForAnimationPlayState(animationData->playStateList()[i])); |
- } else { |
- list->append(cssValuePool().createIdentifierValue(CSSValueRunning)); |
- } |
- return list.release(); |
- } |
- case CSSPropertyAnimationTimingFunction: |
- ASSERT(RuntimeEnabledFeatures::cssAnimationUnprefixedEnabled()); |
- case CSSPropertyWebkitAnimationTimingFunction: |
- return valueForAnimationTimingFunction(style.animations()); |
- case CSSPropertyAnimation: |
- case CSSPropertyWebkitAnimation: { |
- const CSSAnimationData* animationData = style.animations(); |
- if (animationData) { |
- RefPtrWillBeRawPtr<CSSValueList> animationsList = CSSValueList::createCommaSeparated(); |
- for (size_t i = 0; i < animationData->nameList().size(); ++i) { |
- RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createSpaceSeparated(); |
- list->append(cssValuePool().createValue(animationData->nameList()[i], CSSPrimitiveValue::CSS_CUSTOM_IDENT)); |
- list->append(cssValuePool().createValue(CSSTimingData::getRepeated(animationData->durationList(), i), CSSPrimitiveValue::CSS_S)); |
- list->append(createTimingFunctionValue(CSSTimingData::getRepeated(animationData->timingFunctionList(), i).get())); |
- list->append(cssValuePool().createValue(CSSTimingData::getRepeated(animationData->delayList(), i), CSSPrimitiveValue::CSS_S)); |
- list->append(valueForAnimationIterationCount(CSSTimingData::getRepeated(animationData->iterationCountList(), i))); |
- list->append(valueForAnimationDirection(CSSTimingData::getRepeated(animationData->directionList(), i))); |
- list->append(valueForAnimationFillMode(CSSTimingData::getRepeated(animationData->fillModeList(), i))); |
- list->append(valueForAnimationPlayState(CSSTimingData::getRepeated(animationData->playStateList(), i))); |
- animationsList->append(list); |
- } |
- return animationsList.release(); |
- } |
- |
- RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createSpaceSeparated(); |
- // animation-name default value. |
- list->append(cssValuePool().createIdentifierValue(CSSValueNone)); |
- list->append(cssValuePool().createValue(CSSAnimationData::initialDuration(), CSSPrimitiveValue::CSS_S)); |
- list->append(createTimingFunctionValue(CSSAnimationData::initialTimingFunction().get())); |
- list->append(cssValuePool().createValue(CSSAnimationData::initialDelay(), CSSPrimitiveValue::CSS_S)); |
- list->append(cssValuePool().createValue(CSSAnimationData::initialIterationCount(), CSSPrimitiveValue::CSS_NUMBER)); |
- list->append(valueForAnimationDirection(CSSAnimationData::initialDirection())); |
- list->append(valueForAnimationFillMode(CSSAnimationData::initialFillMode())); |
- // Initial animation-play-state. |
- list->append(cssValuePool().createIdentifierValue(CSSValueRunning)); |
- return list.release(); |
- } |
- case CSSPropertyWebkitAppearance: |
- return cssValuePool().createValue(style.appearance()); |
- case CSSPropertyBackfaceVisibility: |
- case CSSPropertyWebkitBackfaceVisibility: |
- return cssValuePool().createIdentifierValue((style.backfaceVisibility() == BackfaceVisibilityHidden) ? CSSValueHidden : CSSValueVisible); |
- case CSSPropertyWebkitBorderImage: |
- return valueForNinePieceImage(style.borderImage(), style); |
- case CSSPropertyBorderImageOutset: |
- return valueForNinePieceImageQuad(style.borderImage().outset(), style); |
- case CSSPropertyBorderImageRepeat: |
- return valueForNinePieceImageRepeat(style.borderImage()); |
- case CSSPropertyBorderImageSlice: |
- return valueForNinePieceImageSlice(style.borderImage()); |
- case CSSPropertyBorderImageWidth: |
- return valueForNinePieceImageQuad(style.borderImage().borderSlices(), style); |
- case CSSPropertyWebkitMaskBoxImage: |
- return valueForNinePieceImage(style.maskBoxImage(), style); |
- case CSSPropertyWebkitMaskBoxImageOutset: |
- return valueForNinePieceImageQuad(style.maskBoxImage().outset(), style); |
- case CSSPropertyWebkitMaskBoxImageRepeat: |
- return valueForNinePieceImageRepeat(style.maskBoxImage()); |
- case CSSPropertyWebkitMaskBoxImageSlice: |
- return valueForNinePieceImageSlice(style.maskBoxImage()); |
- case CSSPropertyWebkitMaskBoxImageWidth: |
- return valueForNinePieceImageQuad(style.maskBoxImage().borderSlices(), style); |
- case CSSPropertyWebkitMaskBoxImageSource: |
- if (style.maskBoxImageSource()) |
- return style.maskBoxImageSource()->cssValue(); |
- return cssValuePool().createIdentifierValue(CSSValueNone); |
- case CSSPropertyWebkitFontSizeDelta: |
- // Not a real style property -- used by the editing engine -- so has no computed value. |
- return nullptr; |
- case CSSPropertyWebkitMarginBottomCollapse: |
- case CSSPropertyWebkitMarginAfterCollapse: |
- return cssValuePool().createValue(style.marginAfterCollapse()); |
- case CSSPropertyWebkitMarginTopCollapse: |
- case CSSPropertyWebkitMarginBeforeCollapse: |
- return cssValuePool().createValue(style.marginBeforeCollapse()); |
- case CSSPropertyPerspective: |
- case CSSPropertyWebkitPerspective: |
- if (!style.hasPerspective()) |
- return cssValuePool().createIdentifierValue(CSSValueNone); |
- return zoomAdjustedPixelValue(style.perspective(), style); |
- case CSSPropertyPerspectiveOrigin: |
- case CSSPropertyWebkitPerspectiveOrigin: { |
- RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createSpaceSeparated(); |
- if (renderer) { |
- LayoutRect box; |
- if (renderer->isBox()) |
- box = toLayoutBox(renderer)->borderBoxRect(); |
- |
- list->append(zoomAdjustedPixelValue(minimumValueForLength(style.perspectiveOriginX(), box.width()), style)); |
- list->append(zoomAdjustedPixelValue(minimumValueForLength(style.perspectiveOriginY(), box.height()), style)); |
- } else { |
- list->append(zoomAdjustedPixelValueForLength(style.perspectiveOriginX(), style)); |
- list->append(zoomAdjustedPixelValueForLength(style.perspectiveOriginY(), style)); |
- } |
- return list.release(); |
- } |
- case CSSPropertyWebkitRtlOrdering: |
- return cssValuePool().createIdentifierValue(style.rtlOrdering() ? CSSValueVisual : CSSValueLogical); |
- case CSSPropertyWebkitTapHighlightColor: |
- return currentColorOrValidColor(style, style.tapHighlightColor()); |
- case CSSPropertyWebkitUserDrag: |
- return cssValuePool().createValue(style.userDrag()); |
- case CSSPropertyWebkitUserSelect: |
- return cssValuePool().createValue(style.userSelect()); |
- case CSSPropertyBorderBottomLeftRadius: |
- return valueForBorderRadiusCorner(style.borderBottomLeftRadius(), style); |
- case CSSPropertyBorderBottomRightRadius: |
- return valueForBorderRadiusCorner(style.borderBottomRightRadius(), style); |
- case CSSPropertyBorderTopLeftRadius: |
- return valueForBorderRadiusCorner(style.borderTopLeftRadius(), style); |
- case CSSPropertyBorderTopRightRadius: |
- return valueForBorderRadiusCorner(style.borderTopRightRadius(), style); |
- case CSSPropertyClip: { |
- if (style.hasAutoClip()) |
- return cssValuePool().createIdentifierValue(CSSValueAuto); |
- RefPtrWillBeRawPtr<Rect> rect = Rect::create(); |
- rect->setTop(zoomAdjustedPixelValue(style.clip().top().value(), style)); |
- rect->setRight(zoomAdjustedPixelValue(style.clip().right().value(), style)); |
- rect->setBottom(zoomAdjustedPixelValue(style.clip().bottom().value(), style)); |
- rect->setLeft(zoomAdjustedPixelValue(style.clip().left().value(), style)); |
- return cssValuePool().createValue(rect.release()); |
- } |
- case CSSPropertySpeak: |
- return cssValuePool().createValue(style.speak()); |
- case CSSPropertyTransform: |
- case CSSPropertyWebkitTransform: |
- return computedTransform(renderer, style); |
- case CSSPropertyTransformOrigin: |
- case CSSPropertyWebkitTransformOrigin: { |
- RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createSpaceSeparated(); |
- if (renderer) { |
- LayoutRect box; |
- if (renderer->isBox()) |
- box = toLayoutBox(renderer)->borderBoxRect(); |
- |
- list->append(zoomAdjustedPixelValue(minimumValueForLength(style.transformOriginX(), box.width()), style)); |
- list->append(zoomAdjustedPixelValue(minimumValueForLength(style.transformOriginY(), box.height()), style)); |
- if (style.transformOriginZ() != 0) |
- list->append(zoomAdjustedPixelValue(style.transformOriginZ(), style)); |
- } else { |
- list->append(zoomAdjustedPixelValueForLength(style.transformOriginX(), style)); |
- list->append(zoomAdjustedPixelValueForLength(style.transformOriginY(), style)); |
- if (style.transformOriginZ() != 0) |
- list->append(zoomAdjustedPixelValue(style.transformOriginZ(), style)); |
- } |
- return list.release(); |
- } |
- case CSSPropertyTransformStyle: |
- case CSSPropertyWebkitTransformStyle: |
- return cssValuePool().createIdentifierValue((style.transformStyle3D() == TransformStyle3DPreserve3D) ? CSSValuePreserve3d : CSSValueFlat); |
- case CSSPropertyTransitionDelay: |
- case CSSPropertyWebkitTransitionDelay: |
- return valueForAnimationDelay(style.transitions()); |
- case CSSPropertyTransitionDuration: |
- case CSSPropertyWebkitTransitionDuration: |
- return valueForAnimationDuration(style.transitions()); |
- case CSSPropertyTransitionProperty: |
- case CSSPropertyWebkitTransitionProperty: |
- return valueForTransitionProperty(style.transitions()); |
- case CSSPropertyTransitionTimingFunction: |
- case CSSPropertyWebkitTransitionTimingFunction: |
- return valueForAnimationTimingFunction(style.transitions()); |
- case CSSPropertyTransition: |
- case CSSPropertyWebkitTransition: { |
- const CSSTransitionData* transitionData = style.transitions(); |
- if (transitionData) { |
- RefPtrWillBeRawPtr<CSSValueList> transitionsList = CSSValueList::createCommaSeparated(); |
- for (size_t i = 0; i < transitionData->propertyList().size(); ++i) { |
- RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createSpaceSeparated(); |
- list->append(createTransitionPropertyValue(transitionData->propertyList()[i])); |
- list->append(cssValuePool().createValue(CSSTimingData::getRepeated(transitionData->durationList(), i), CSSPrimitiveValue::CSS_S)); |
- list->append(createTimingFunctionValue(CSSTimingData::getRepeated(transitionData->timingFunctionList(), i).get())); |
- list->append(cssValuePool().createValue(CSSTimingData::getRepeated(transitionData->delayList(), i), CSSPrimitiveValue::CSS_S)); |
- transitionsList->append(list); |
- } |
- return transitionsList.release(); |
- } |
- |
- RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createSpaceSeparated(); |
- // transition-property default value. |
- list->append(cssValuePool().createIdentifierValue(CSSValueAll)); |
- list->append(cssValuePool().createValue(CSSTransitionData::initialDuration(), CSSPrimitiveValue::CSS_S)); |
- list->append(createTimingFunctionValue(CSSTransitionData::initialTimingFunction().get())); |
- list->append(cssValuePool().createValue(CSSTransitionData::initialDelay(), CSSPrimitiveValue::CSS_S)); |
- return list.release(); |
- } |
- case CSSPropertyPointerEvents: |
- return cssValuePool().createValue(style.pointerEvents()); |
- case CSSPropertyWebkitWritingMode: |
- return cssValuePool().createValue(style.writingMode()); |
- case CSSPropertyWebkitTextCombine: |
- return cssValuePool().createValue(style.textCombine()); |
- case CSSPropertyWebkitTextOrientation: |
- return CSSPrimitiveValue::create(style.textOrientation()); |
- case CSSPropertyWebkitLineBoxContain: |
- return createLineBoxContainValue(style.lineBoxContain()); |
- case CSSPropertyContent: |
- return valueForContentData(style); |
- case CSSPropertyCounterIncrement: |
- return valueForCounterDirectives(style, propertyID); |
- case CSSPropertyCounterReset: |
- return valueForCounterDirectives(style, propertyID); |
- case CSSPropertyWebkitClipPath: |
- if (ClipPathOperation* operation = style.clipPath()) { |
- if (operation->type() == ClipPathOperation::SHAPE) |
- return valueForBasicShape(style, toShapeClipPathOperation(operation)->basicShape()); |
- if (operation->type() == ClipPathOperation::REFERENCE) |
- return CSSPrimitiveValue::create(toReferenceClipPathOperation(operation)->url(), CSSPrimitiveValue::CSS_URI); |
- } |
- return cssValuePool().createIdentifierValue(CSSValueNone); |
- case CSSPropertyShapeMargin: |
- return cssValuePool().createValue(style.shapeMargin(), style); |
- case CSSPropertyShapeImageThreshold: |
- return cssValuePool().createValue(style.shapeImageThreshold(), CSSPrimitiveValue::CSS_NUMBER); |
- case CSSPropertyShapeOutside: |
- return valueForShape(style, style.shapeOutside()); |
- case CSSPropertyWebkitFilter: |
- return valueForFilter(style); |
- case CSSPropertyMixBlendMode: |
- return cssValuePool().createValue(style.blendMode()); |
- |
- case CSSPropertyBackgroundBlendMode: { |
- RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createCommaSeparated(); |
- for (const FillLayer* currLayer = &style.backgroundLayers(); currLayer; currLayer = currLayer->next()) |
- list->append(cssValuePool().createValue(currLayer->blendMode())); |
- return list.release(); |
- } |
- case CSSPropertyBackground: |
- return valuesForBackgroundShorthand(style, renderer, styledNode, allowVisitedStyle); |
- case CSSPropertyBorder: { |
- RefPtrWillBeRawPtr<CSSValue> value = get(CSSPropertyBorderTop, style, renderer, styledNode, allowVisitedStyle); |
- const CSSPropertyID properties[] = { |
- CSSPropertyBorderRight, |
- CSSPropertyBorderBottom, |
- CSSPropertyBorderLeft |
- }; |
- for (size_t i = 0; i < WTF_ARRAY_LENGTH(properties); ++i) { |
- if (!compareCSSValuePtr<CSSValue>(value, get(properties[i], style, renderer, styledNode, allowVisitedStyle))) |
- return nullptr; |
- } |
- return value.release(); |
- } |
- case CSSPropertyBorderBottom: |
- return valuesForShorthandProperty(borderBottomShorthand(), style, renderer, styledNode, allowVisitedStyle); |
- case CSSPropertyBorderColor: |
- return valuesForSidesShorthand(borderColorShorthand(), style, renderer, styledNode, allowVisitedStyle); |
- case CSSPropertyBorderLeft: |
- return valuesForShorthandProperty(borderLeftShorthand(), style, renderer, styledNode, allowVisitedStyle); |
- case CSSPropertyBorderImage: |
- return valueForNinePieceImage(style.borderImage(), style); |
- case CSSPropertyBorderRadius: |
- return valueForBorderRadiusShorthand(style); |
- case CSSPropertyBorderRight: |
- return valuesForShorthandProperty(borderRightShorthand(), style, renderer, styledNode, allowVisitedStyle); |
- case CSSPropertyBorderStyle: |
- return valuesForSidesShorthand(borderStyleShorthand(), style, renderer, styledNode, allowVisitedStyle); |
- case CSSPropertyBorderTop: |
- return valuesForShorthandProperty(borderTopShorthand(), style, renderer, styledNode, allowVisitedStyle); |
- case CSSPropertyBorderWidth: |
- return valuesForSidesShorthand(borderWidthShorthand(), style, renderer, styledNode, allowVisitedStyle); |
- case CSSPropertyWebkitColumnRule: |
- return valuesForShorthandProperty(webkitColumnRuleShorthand(), style, renderer, styledNode, allowVisitedStyle); |
- case CSSPropertyWebkitColumns: |
- return valuesForShorthandProperty(webkitColumnsShorthand(), style, renderer, styledNode, allowVisitedStyle); |
- case CSSPropertyListStyle: |
- return valuesForShorthandProperty(listStyleShorthand(), style, renderer, styledNode, allowVisitedStyle); |
- case CSSPropertyMargin: |
- return valuesForSidesShorthand(marginShorthand(), style, renderer, styledNode, allowVisitedStyle); |
- case CSSPropertyOutline: |
- return valuesForShorthandProperty(outlineShorthand(), style, renderer, styledNode, allowVisitedStyle); |
- case CSSPropertyPadding: |
- return valuesForSidesShorthand(paddingShorthand(), style, renderer, styledNode, allowVisitedStyle); |
- // Individual properties not part of the spec. |
- case CSSPropertyBackgroundRepeatX: |
- case CSSPropertyBackgroundRepeatY: |
- return nullptr; |
- |
- case CSSPropertyMotion: |
- ASSERT(RuntimeEnabledFeatures::cssMotionPathEnabled()); |
- return valuesForShorthandProperty(motionShorthand(), style, renderer, styledNode, allowVisitedStyle); |
- |
- case CSSPropertyMotionPath: { |
- ASSERT(RuntimeEnabledFeatures::cssMotionPathEnabled()); |
- const StyleMotionPath* styleMotionPath = style.motionPath(); |
- if (!styleMotionPath) |
- return cssValuePool().createIdentifierValue(CSSValueNone); |
- |
- ASSERT(styleMotionPath->isPathStyleMotionPath()); |
- return CSSPathValue::create(toPathStyleMotionPath(styleMotionPath)->pathString()); |
- } |
- |
- case CSSPropertyMotionOffset: |
- ASSERT(RuntimeEnabledFeatures::cssMotionPathEnabled()); |
- return zoomAdjustedPixelValueForLength(style.motionOffset(), style); |
- |
- case CSSPropertyMotionRotation: { |
- ASSERT(RuntimeEnabledFeatures::cssMotionPathEnabled()); |
- RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createSpaceSeparated(); |
- if (style.motionRotationType() == MotionRotationAuto) |
- list->append(cssValuePool().createIdentifierValue(CSSValueAuto)); |
- list->append(cssValuePool().createValue(style.motionRotation(), CSSPrimitiveValue::CSS_DEG)); |
- return list.release(); |
- } |
- |
- // Unimplemented CSS 3 properties (including CSS3 shorthand properties). |
- case CSSPropertyWebkitTextEmphasis: |
- return nullptr; |
- |
- // Directional properties are resolved by resolveDirectionAwareProperty() before the switch. |
- case CSSPropertyWebkitBorderEnd: |
- case CSSPropertyWebkitBorderEndColor: |
- case CSSPropertyWebkitBorderEndStyle: |
- case CSSPropertyWebkitBorderEndWidth: |
- case CSSPropertyWebkitBorderStart: |
- case CSSPropertyWebkitBorderStartColor: |
- case CSSPropertyWebkitBorderStartStyle: |
- case CSSPropertyWebkitBorderStartWidth: |
- case CSSPropertyWebkitBorderAfter: |
- case CSSPropertyWebkitBorderAfterColor: |
- case CSSPropertyWebkitBorderAfterStyle: |
- case CSSPropertyWebkitBorderAfterWidth: |
- case CSSPropertyWebkitBorderBefore: |
- case CSSPropertyWebkitBorderBeforeColor: |
- case CSSPropertyWebkitBorderBeforeStyle: |
- case CSSPropertyWebkitBorderBeforeWidth: |
- case CSSPropertyWebkitMarginEnd: |
- case CSSPropertyWebkitMarginStart: |
- case CSSPropertyWebkitMarginAfter: |
- case CSSPropertyWebkitMarginBefore: |
- case CSSPropertyWebkitPaddingEnd: |
- case CSSPropertyWebkitPaddingStart: |
- case CSSPropertyWebkitPaddingAfter: |
- case CSSPropertyWebkitPaddingBefore: |
- case CSSPropertyWebkitLogicalWidth: |
- case CSSPropertyWebkitLogicalHeight: |
- case CSSPropertyWebkitMinLogicalWidth: |
- case CSSPropertyWebkitMinLogicalHeight: |
- case CSSPropertyWebkitMaxLogicalWidth: |
- case CSSPropertyWebkitMaxLogicalHeight: |
- ASSERT_NOT_REACHED(); |
- return nullptr; |
- |
- // Unimplemented @font-face properties. |
- case CSSPropertySrc: |
- case CSSPropertyUnicodeRange: |
- return nullptr; |
- |
- // Other unimplemented properties. |
- case CSSPropertyPage: // for @page |
- case CSSPropertyQuotes: // FIXME: needs implementation |
- case CSSPropertySize: // for @page |
- return nullptr; |
- |
- // Unimplemented -webkit- properties. |
- case CSSPropertyWebkitBorderRadius: |
- case CSSPropertyWebkitMarginCollapse: |
- case CSSPropertyWebkitMask: |
- case CSSPropertyWebkitMaskRepeatX: |
- case CSSPropertyWebkitMaskRepeatY: |
- case CSSPropertyWebkitPerspectiveOriginX: |
- case CSSPropertyWebkitPerspectiveOriginY: |
- case CSSPropertyWebkitTextStroke: |
- case CSSPropertyWebkitTransformOriginX: |
- case CSSPropertyWebkitTransformOriginY: |
- case CSSPropertyWebkitTransformOriginZ: |
- return nullptr; |
- |
- // @viewport rule properties. |
- case CSSPropertyMaxZoom: |
- case CSSPropertyMinZoom: |
- case CSSPropertyOrientation: |
- case CSSPropertyUserZoom: |
- return nullptr; |
- |
- // SVG properties. |
- case CSSPropertyClipRule: |
- return CSSPrimitiveValue::create(svgStyle.clipRule()); |
- case CSSPropertyFloodOpacity: |
- return CSSPrimitiveValue::create(svgStyle.floodOpacity(), CSSPrimitiveValue::CSS_NUMBER); |
- case CSSPropertyStopOpacity: |
- return CSSPrimitiveValue::create(svgStyle.stopOpacity(), CSSPrimitiveValue::CSS_NUMBER); |
- case CSSPropertyColorInterpolation: |
- return CSSPrimitiveValue::create(svgStyle.colorInterpolation()); |
- case CSSPropertyColorInterpolationFilters: |
- return CSSPrimitiveValue::create(svgStyle.colorInterpolationFilters()); |
- case CSSPropertyFillOpacity: |
- return CSSPrimitiveValue::create(svgStyle.fillOpacity(), CSSPrimitiveValue::CSS_NUMBER); |
- case CSSPropertyFillRule: |
- return CSSPrimitiveValue::create(svgStyle.fillRule()); |
- case CSSPropertyColorRendering: |
- return CSSPrimitiveValue::create(svgStyle.colorRendering()); |
- case CSSPropertyShapeRendering: |
- return CSSPrimitiveValue::create(svgStyle.shapeRendering()); |
- case CSSPropertyStrokeLinecap: |
- return CSSPrimitiveValue::create(svgStyle.capStyle()); |
- case CSSPropertyStrokeLinejoin: |
- return CSSPrimitiveValue::create(svgStyle.joinStyle()); |
- case CSSPropertyStrokeMiterlimit: |
- return CSSPrimitiveValue::create(svgStyle.strokeMiterLimit(), CSSPrimitiveValue::CSS_NUMBER); |
- case CSSPropertyStrokeOpacity: |
- return CSSPrimitiveValue::create(svgStyle.strokeOpacity(), CSSPrimitiveValue::CSS_NUMBER); |
- case CSSPropertyAlignmentBaseline: |
- return CSSPrimitiveValue::create(svgStyle.alignmentBaseline()); |
- case CSSPropertyDominantBaseline: |
- return CSSPrimitiveValue::create(svgStyle.dominantBaseline()); |
- case CSSPropertyTextAnchor: |
- return CSSPrimitiveValue::create(svgStyle.textAnchor()); |
- case CSSPropertyWritingMode: |
- return CSSPrimitiveValue::create(svgStyle.writingMode()); |
- case CSSPropertyClipPath: |
- if (!svgStyle.clipperResource().isEmpty()) |
- return CSSPrimitiveValue::create(serializeAsFragmentIdentifier(svgStyle.clipperResource()), CSSPrimitiveValue::CSS_URI); |
- return CSSPrimitiveValue::createIdentifier(CSSValueNone); |
- case CSSPropertyMask: |
- if (!svgStyle.maskerResource().isEmpty()) |
- return CSSPrimitiveValue::create(serializeAsFragmentIdentifier(svgStyle.maskerResource()), CSSPrimitiveValue::CSS_URI); |
- return CSSPrimitiveValue::createIdentifier(CSSValueNone); |
- case CSSPropertyFilter: |
- if (!svgStyle.filterResource().isEmpty()) |
- return CSSPrimitiveValue::create(serializeAsFragmentIdentifier(svgStyle.filterResource()), CSSPrimitiveValue::CSS_URI); |
- return CSSPrimitiveValue::createIdentifier(CSSValueNone); |
- case CSSPropertyFloodColor: |
- return currentColorOrValidColor(style, svgStyle.floodColor()); |
- case CSSPropertyLightingColor: |
- return currentColorOrValidColor(style, svgStyle.lightingColor()); |
- case CSSPropertyStopColor: |
- return currentColorOrValidColor(style, svgStyle.stopColor()); |
- case CSSPropertyFill: |
- return adjustSVGPaintForCurrentColor(svgStyle.fillPaintType(), svgStyle.fillPaintUri(), svgStyle.fillPaintColor(), style.color()); |
- case CSSPropertyMarkerEnd: |
- if (!svgStyle.markerEndResource().isEmpty()) |
- return CSSPrimitiveValue::create(serializeAsFragmentIdentifier(svgStyle.markerEndResource()), CSSPrimitiveValue::CSS_URI); |
- return CSSPrimitiveValue::createIdentifier(CSSValueNone); |
- case CSSPropertyMarkerMid: |
- if (!svgStyle.markerMidResource().isEmpty()) |
- return CSSPrimitiveValue::create(serializeAsFragmentIdentifier(svgStyle.markerMidResource()), CSSPrimitiveValue::CSS_URI); |
- return CSSPrimitiveValue::createIdentifier(CSSValueNone); |
- case CSSPropertyMarkerStart: |
- if (!svgStyle.markerStartResource().isEmpty()) |
- return CSSPrimitiveValue::create(serializeAsFragmentIdentifier(svgStyle.markerStartResource()), CSSPrimitiveValue::CSS_URI); |
- return CSSPrimitiveValue::createIdentifier(CSSValueNone); |
- case CSSPropertyStroke: |
- return adjustSVGPaintForCurrentColor(svgStyle.strokePaintType(), svgStyle.strokePaintUri(), svgStyle.strokePaintColor(), style.color()); |
- case CSSPropertyStrokeDasharray: |
- return strokeDashArrayToCSSValueList(*svgStyle.strokeDashArray(), style); |
- case CSSPropertyStrokeDashoffset: |
- return zoomAdjustedPixelValueForLength(svgStyle.strokeDashOffset(), style); |
- case CSSPropertyStrokeWidth: |
- return pixelValueForUnzoomedLength(svgStyle.strokeWidth(), style); |
- case CSSPropertyBaselineShift: { |
- switch (svgStyle.baselineShift()) { |
- case BS_SUPER: |
- return CSSPrimitiveValue::createIdentifier(CSSValueSuper); |
- case BS_SUB: |
- return CSSPrimitiveValue::createIdentifier(CSSValueSub); |
- case BS_LENGTH: |
- return zoomAdjustedPixelValueForLength(svgStyle.baselineShiftValue(), style); |
- } |
- ASSERT_NOT_REACHED(); |
- return nullptr; |
- } |
- case CSSPropertyBufferedRendering: |
- return CSSPrimitiveValue::create(svgStyle.bufferedRendering()); |
- case CSSPropertyGlyphOrientationHorizontal: |
- return glyphOrientationToCSSPrimitiveValue(svgStyle.glyphOrientationHorizontal()); |
- case CSSPropertyGlyphOrientationVertical: { |
- if (RefPtrWillBeRawPtr<CSSPrimitiveValue> value = glyphOrientationToCSSPrimitiveValue(svgStyle.glyphOrientationVertical())) |
- return value.release(); |
- if (svgStyle.glyphOrientationVertical() == GO_AUTO) |
- return CSSPrimitiveValue::createIdentifier(CSSValueAuto); |
- return nullptr; |
- } |
- case CSSPropertyPaintOrder: |
- return paintOrderToCSSValueList(svgStyle.paintOrder()); |
- case CSSPropertyVectorEffect: |
- return CSSPrimitiveValue::create(svgStyle.vectorEffect()); |
- case CSSPropertyMaskType: |
- return CSSPrimitiveValue::create(svgStyle.maskType()); |
- case CSSPropertyMarker: |
- case CSSPropertyEnableBackground: |
- // the above properties are not yet implemented in the engine |
- return nullptr; |
- case CSSPropertyCx: |
- return zoomAdjustedPixelValueForLength(svgStyle.cx(), style); |
- case CSSPropertyCy: |
- return zoomAdjustedPixelValueForLength(svgStyle.cy(), style); |
- case CSSPropertyX: |
- return zoomAdjustedPixelValueForLength(svgStyle.x(), style); |
- case CSSPropertyY: |
- return zoomAdjustedPixelValueForLength(svgStyle.y(), style); |
- case CSSPropertyR: |
- return zoomAdjustedPixelValueForLength(svgStyle.r(), style); |
- case CSSPropertyRx: |
- return zoomAdjustedPixelValueForLength(svgStyle.rx(), style); |
- case CSSPropertyRy: |
- return zoomAdjustedPixelValueForLength(svgStyle.ry(), style); |
- |
- case CSSPropertyAll: |
- return nullptr; |
- } |
- ASSERT_NOT_REACHED(); |
- return nullptr; |
-} |
- |
-} |