Index: Source/core/animation/LengthPropertyFunctions.cpp |
diff --git a/Source/core/animation/LengthPropertyFunctions.cpp b/Source/core/animation/LengthPropertyFunctions.cpp |
index 64d133fc49981883a37d3538c6b4642ae0973772..b1368a8516b304f50d662120ea71848981ddec81 100644 |
--- a/Source/core/animation/LengthPropertyFunctions.cpp |
+++ b/Source/core/animation/LengthPropertyFunctions.cpp |
@@ -13,26 +13,426 @@ namespace blink { |
ValueRange LengthPropertyFunctions::valueRange(CSSPropertyID property) |
{ |
- ASSERT(property == CSSPropertyLeft); |
- return ValueRangeAll; |
+ switch (property) { |
+ case CSSPropertyBorderBottomWidth: |
+ case CSSPropertyBorderLeftWidth: |
+ case CSSPropertyBorderRightWidth: |
+ case CSSPropertyBorderTopWidth: |
+ case CSSPropertyFlexBasis: |
+ case CSSPropertyHeight: |
+ case CSSPropertyLineHeight: |
+ case CSSPropertyMaxHeight: |
+ case CSSPropertyMaxWidth: |
+ case CSSPropertyMinHeight: |
+ case CSSPropertyMinWidth: |
+ case CSSPropertyOutlineWidth: |
+ case CSSPropertyPaddingBottom: |
+ case CSSPropertyPaddingLeft: |
+ case CSSPropertyPaddingRight: |
+ case CSSPropertyPaddingTop: |
+ case CSSPropertyPerspective: |
+ case CSSPropertyR: |
+ case CSSPropertyRx: |
+ case CSSPropertyRy: |
+ case CSSPropertyShapeMargin: |
+ case CSSPropertyStrokeWidth: |
+ case CSSPropertyWebkitBorderHorizontalSpacing: |
+ case CSSPropertyWebkitBorderVerticalSpacing: |
+ case CSSPropertyWebkitColumnGap: |
+ case CSSPropertyWebkitColumnWidth: |
+ case CSSPropertyWidth: |
+ return ValueRangeNonNegative; |
+ default: |
+ return ValueRangeAll; |
+ } |
+} |
+ |
+bool LengthPropertyFunctions::isZoomedLength(CSSPropertyID property) |
+{ |
+ return property != CSSPropertyStrokeWidth; |
} |
bool LengthPropertyFunctions::getPixelsForKeyword(CSSPropertyID property, CSSValueID valueID, double& result) |
{ |
- ASSERT(property == CSSPropertyLeft); |
- return false; |
+ switch (property) { |
+ case CSSPropertyBaselineShift: |
+ if (valueID == CSSValueBaseline) { |
+ result = 0; |
+ return true; |
+ } |
+ return false; |
+ case CSSPropertyBorderBottomWidth: |
+ case CSSPropertyBorderLeftWidth: |
+ case CSSPropertyBorderRightWidth: |
+ case CSSPropertyBorderTopWidth: |
+ case CSSPropertyWebkitColumnRuleWidth: |
+ case CSSPropertyOutlineWidth: |
+ if (valueID == CSSValueThin) { |
+ result = 1; |
+ return true; |
+ } |
+ if (valueID == CSSValueMedium) { |
+ result = 3; |
+ return true; |
+ } |
+ if (valueID == CSSValueThick) { |
+ result = 5; |
+ return true; |
+ } |
+ return false; |
+ case CSSPropertyLetterSpacing: |
+ case CSSPropertyWordSpacing: |
+ if (valueID == CSSValueNormal) { |
+ result = 0; |
+ return true; |
+ } |
+ return false; |
+ default: |
+ return false; |
+ } |
} |
-bool LengthPropertyFunctions::getLength(CSSPropertyID property, const ComputedStyle& style, Length& result) |
+static Length lengthFromUnsigned(unsigned short value) |
{ |
- ASSERT(property == CSSPropertyLeft); |
- result = style.left(); |
- return true; |
+ return Length(static_cast<float>(value), Fixed); |
} |
bool LengthPropertyFunctions::getInitialLength(CSSPropertyID property, Length& result) |
{ |
- return getLength(property, *ComputedStyle::initialStyle(), result); |
+ switch (property) { |
+ // The computed value of "initial" for the following properties is 0px if the associated *-style property resolves to "none" or "hidden". |
+ // border-width: https://drafts.csswg.org/css-backgrounds-3/#the-border-width |
+ // outline-width: https://drafts.csswg.org/css-ui-3/#outline-width |
+ // -webkit-column-rule-width: https://drafts.csswg.org/css-multicol-1/#crw |
+ // We ignore this value adjustment for animations and use the wrong value for hidden widths to avoid |
+ // having to restart our animations based on the computed *-style values. |
+ // This is acceptable since animations running on hidden widths are unobservable to the user, even via getComputedStyle(). |
+ case CSSPropertyBorderBottomWidth: |
+ case CSSPropertyBorderLeftWidth: |
+ case CSSPropertyBorderRightWidth: |
+ case CSSPropertyBorderTopWidth: |
+ result = lengthFromUnsigned(ComputedStyle::initialBorderWidth()); |
+ return true; |
+ case CSSPropertyOutlineWidth: |
+ result = lengthFromUnsigned(ComputedStyle::initialOutlineWidth()); |
+ return true; |
+ case CSSPropertyWebkitColumnRuleWidth: |
+ result = lengthFromUnsigned(ComputedStyle::initialColumnRuleWidth()); |
+ return true; |
+ |
+ default: |
+ return getLength(property, *ComputedStyle::initialStyle(), result); |
+ } |
+} |
+ |
+bool LengthPropertyFunctions::getLength(CSSPropertyID property, const ComputedStyle& style, Length& result) |
+{ |
+ switch (property) { |
+ case CSSPropertyBottom: |
+ result = style.bottom(); |
+ return true; |
+ case CSSPropertyCx: |
+ result = style.svgStyle().cx(); |
+ return true; |
+ case CSSPropertyCy: |
+ result = style.svgStyle().cy(); |
+ return true; |
+ case CSSPropertyFlexBasis: |
+ result = style.flexBasis(); |
+ return true; |
+ case CSSPropertyHeight: |
+ result = style.height(); |
+ return true; |
+ case CSSPropertyLeft: |
+ result = style.left(); |
+ return true; |
+ case CSSPropertyMarginBottom: |
+ result = style.marginBottom(); |
+ return true; |
+ case CSSPropertyMarginLeft: |
+ result = style.marginLeft(); |
+ return true; |
+ case CSSPropertyMarginRight: |
+ result = style.marginRight(); |
+ return true; |
+ case CSSPropertyMarginTop: |
+ result = style.marginTop(); |
+ return true; |
+ case CSSPropertyMaxHeight: |
+ result = style.maxHeight(); |
+ return true; |
+ case CSSPropertyMaxWidth: |
+ result = style.maxWidth(); |
+ return true; |
+ case CSSPropertyMinHeight: |
+ result = style.minHeight(); |
+ return true; |
+ case CSSPropertyMinWidth: |
+ result = style.minWidth(); |
+ return true; |
+ case CSSPropertyMotionOffset: |
+ result = style.motionOffset(); |
+ return true; |
+ case CSSPropertyPaddingBottom: |
+ result = style.paddingBottom(); |
+ return true; |
+ case CSSPropertyPaddingLeft: |
+ result = style.paddingLeft(); |
+ return true; |
+ case CSSPropertyPaddingRight: |
+ result = style.paddingRight(); |
+ return true; |
+ case CSSPropertyPaddingTop: |
+ result = style.paddingTop(); |
+ return true; |
+ case CSSPropertyR: |
+ result = style.svgStyle().r(); |
+ return true; |
+ case CSSPropertyRight: |
+ result = style.right(); |
+ return true; |
+ case CSSPropertyRx: |
+ result = style.svgStyle().rx(); |
+ return true; |
+ case CSSPropertyRy: |
+ result = style.svgStyle().ry(); |
+ return true; |
+ case CSSPropertyShapeMargin: |
+ result = style.shapeMargin(); |
+ return true; |
+ case CSSPropertyStrokeDashoffset: |
+ result = style.strokeDashOffset(); |
+ return true; |
+ case CSSPropertyTextIndent: |
+ result = style.textIndent(); |
+ return true; |
+ case CSSPropertyTop: |
+ result = style.top(); |
+ return true; |
+ case CSSPropertyWebkitPerspectiveOriginX: |
+ result = style.perspectiveOriginX(); |
+ return true; |
+ case CSSPropertyWebkitPerspectiveOriginY: |
+ result = style.perspectiveOriginY(); |
+ return true; |
+ case CSSPropertyWebkitTransformOriginX: |
+ result = style.transformOriginX(); |
+ return true; |
+ case CSSPropertyWebkitTransformOriginY: |
+ result = style.transformOriginY(); |
+ return true; |
+ case CSSPropertyWidth: |
+ result = style.width(); |
+ return true; |
+ case CSSPropertyX: |
+ result = style.svgStyle().x(); |
+ return true; |
+ case CSSPropertyY: |
+ result = style.svgStyle().y(); |
+ return true; |
+ |
+ case CSSPropertyBorderBottomWidth: |
+ result = Length(style.borderBottomWidth(), Fixed); |
+ return true; |
+ case CSSPropertyBorderLeftWidth: |
+ result = Length(style.borderLeftWidth(), Fixed); |
+ return true; |
+ case CSSPropertyBorderRightWidth: |
+ result = Length(style.borderRightWidth(), Fixed); |
+ return true; |
+ case CSSPropertyBorderTopWidth: |
+ result = Length(style.borderTopWidth(), Fixed); |
+ return true; |
+ case CSSPropertyLetterSpacing: |
+ result = Length(style.letterSpacing(), Fixed); |
+ return true; |
+ case CSSPropertyOutlineOffset: |
+ result = Length(style.outlineOffset(), Fixed); |
+ return true; |
+ case CSSPropertyOutlineWidth: |
+ result = Length(style.outlineWidth(), Fixed); |
+ return true; |
+ case CSSPropertyWebkitBorderHorizontalSpacing: |
+ result = Length(style.horizontalBorderSpacing(), Fixed); |
+ return true; |
+ case CSSPropertyWebkitBorderVerticalSpacing: |
+ result = Length(style.verticalBorderSpacing(), Fixed); |
+ return true; |
+ case CSSPropertyWebkitColumnGap: |
+ result = Length(style.columnGap(), Fixed); |
+ return true; |
+ case CSSPropertyWebkitColumnRuleWidth: |
+ result = Length(style.columnRuleWidth(), Fixed); |
+ return true; |
+ case CSSPropertyWebkitTransformOriginZ: |
+ result = Length(style.transformOriginZ(), Fixed); |
+ return true; |
+ case CSSPropertyWordSpacing: |
+ result = Length(style.wordSpacing(), Fixed); |
+ return true; |
+ |
+ case CSSPropertyBaselineShift: |
+ if (style.baselineShift() != BS_LENGTH) |
+ return false; |
+ result = style.baselineShiftValue(); |
+ return true; |
+ case CSSPropertyPerspective: |
+ if (!style.hasPerspective()) |
+ return false; |
+ result = Length(style.perspective(), Fixed); |
+ return true; |
+ case CSSPropertyStrokeWidth: |
+ ASSERT(!isZoomedLength(CSSPropertyStrokeWidth)); |
+ result = style.strokeWidth().length(); |
+ return true; |
+ case CSSPropertyVerticalAlign: |
+ if (style.verticalAlign() != LENGTH) |
+ return false; |
+ result = style.verticalAlignLength(); |
+ return true; |
+ case CSSPropertyWebkitColumnWidth: |
+ if (style.hasAutoColumnWidth()) |
+ return false; |
+ result = Length(style.columnWidth(), Fixed); |
+ return true; |
+ default: |
+ return false; |
+ } |
+} |
+ |
+bool LengthPropertyFunctions::setLength(CSSPropertyID property, ComputedStyle& style, const Length& value) |
+{ |
+ switch (property) { |
+ // Setters that take a Length value. |
+ case CSSPropertyBaselineShift: |
+ style.setBaselineShiftValue(value); |
+ return true; |
+ case CSSPropertyBottom: |
+ style.setBottom(value); |
+ return true; |
+ case CSSPropertyCx: |
+ style.setCx(value); |
+ return true; |
+ case CSSPropertyCy: |
+ style.setCy(value); |
+ return true; |
+ case CSSPropertyFlexBasis: |
+ style.setFlexBasis(value); |
+ return true; |
+ case CSSPropertyHeight: |
+ style.setHeight(value); |
+ return true; |
+ case CSSPropertyLeft: |
+ style.setLeft(value); |
+ return true; |
+ case CSSPropertyLineHeight: |
+ style.setLineHeight(value); |
+ return true; |
+ case CSSPropertyMarginBottom: |
+ style.setMarginBottom(value); |
+ return true; |
+ case CSSPropertyMarginLeft: |
+ style.setMarginLeft(value); |
+ return true; |
+ case CSSPropertyMarginRight: |
+ style.setMarginRight(value); |
+ return true; |
+ case CSSPropertyMarginTop: |
+ style.setMarginTop(value); |
+ return true; |
+ case CSSPropertyMaxHeight: |
+ style.setMaxHeight(value); |
+ return true; |
+ case CSSPropertyMaxWidth: |
+ style.setMaxWidth(value); |
+ return true; |
+ case CSSPropertyMinHeight: |
+ style.setMinHeight(value); |
+ return true; |
+ case CSSPropertyMinWidth: |
+ style.setMinWidth(value); |
+ return true; |
+ case CSSPropertyMotionOffset: |
+ style.setMotionOffset(value); |
+ return true; |
+ case CSSPropertyPaddingBottom: |
+ style.setPaddingBottom(value); |
+ return true; |
+ case CSSPropertyPaddingLeft: |
+ style.setPaddingLeft(value); |
+ return true; |
+ case CSSPropertyPaddingRight: |
+ style.setPaddingRight(value); |
+ return true; |
+ case CSSPropertyPaddingTop: |
+ style.setPaddingTop(value); |
+ return true; |
+ case CSSPropertyR: |
+ style.setR(value); |
+ return true; |
+ case CSSPropertyRx: |
+ style.setRx(value); |
+ return true; |
+ case CSSPropertyRy: |
+ style.setRy(value); |
+ return true; |
+ case CSSPropertyRight: |
+ style.setRight(value); |
+ return true; |
+ case CSSPropertyShapeMargin: |
+ style.setShapeMargin(value); |
+ return true; |
+ case CSSPropertyStrokeDashoffset: |
+ style.setStrokeDashOffset(value); |
+ return true; |
+ case CSSPropertyTop: |
+ style.setTop(value); |
+ return true; |
+ case CSSPropertyWidth: |
+ style.setWidth(value); |
+ return true; |
+ case CSSPropertyWebkitPerspectiveOriginX: |
+ style.setPerspectiveOriginX(value); |
+ return true; |
+ case CSSPropertyWebkitPerspectiveOriginY: |
+ style.setPerspectiveOriginY(value); |
+ return true; |
+ case CSSPropertyWebkitTransformOriginX: |
+ style.setTransformOriginX(value); |
+ return true; |
+ case CSSPropertyWebkitTransformOriginY: |
+ style.setTransformOriginY(value); |
+ return true; |
+ case CSSPropertyX: |
+ style.setX(value); |
+ return true; |
+ case CSSPropertyY: |
+ style.setY(value); |
+ return true; |
+ |
+ // TODO(alancutter): Support setters that take a numeric value (need to resolve percentages). |
+ case CSSPropertyBorderBottomWidth: |
+ case CSSPropertyBorderLeftWidth: |
+ case CSSPropertyBorderRightWidth: |
+ case CSSPropertyBorderTopWidth: |
+ case CSSPropertyLetterSpacing: |
+ case CSSPropertyOutlineOffset: |
+ case CSSPropertyOutlineWidth: |
+ case CSSPropertyPerspective: |
+ case CSSPropertyStrokeWidth: |
+ case CSSPropertyVerticalAlign: |
+ case CSSPropertyWebkitBorderHorizontalSpacing: |
+ case CSSPropertyWebkitBorderVerticalSpacing: |
+ case CSSPropertyWebkitColumnGap: |
+ case CSSPropertyWebkitColumnRuleWidth: |
+ case CSSPropertyWebkitColumnWidth: |
+ case CSSPropertyWebkitTransformOriginZ: |
+ case CSSPropertyWordSpacing: |
+ return false; |
+ |
+ default: |
+ return false; |
+ } |
} |
} // namespace blink |