| // Copyright 2015 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "third_party/blink/renderer/core/animation/length_property_functions.h" |
| |
| #include "third_party/blink/renderer/core/style/computed_style.h" |
| |
| namespace blink { |
| |
| ValueRange LengthPropertyFunctions::GetValueRange(const CSSProperty& property) { |
| switch (property.PropertyID()) { |
| case CSSPropertyID::kBorderBottomWidth: |
| case CSSPropertyID::kBorderLeftWidth: |
| case CSSPropertyID::kBorderRightWidth: |
| case CSSPropertyID::kBorderTopWidth: |
| case CSSPropertyID::kFlexBasis: |
| case CSSPropertyID::kHeight: |
| case CSSPropertyID::kLineHeight: |
| case CSSPropertyID::kMaxHeight: |
| case CSSPropertyID::kMaxWidth: |
| case CSSPropertyID::kMinHeight: |
| case CSSPropertyID::kMinWidth: |
| case CSSPropertyID::kOutlineWidth: |
| case CSSPropertyID::kPaddingBottom: |
| case CSSPropertyID::kPaddingLeft: |
| case CSSPropertyID::kPaddingRight: |
| case CSSPropertyID::kPaddingTop: |
| case CSSPropertyID::kPerspective: |
| case CSSPropertyID::kR: |
| case CSSPropertyID::kRx: |
| case CSSPropertyID::kRy: |
| case CSSPropertyID::kShapeMargin: |
| case CSSPropertyID::kStrokeWidth: |
| case CSSPropertyID::kWebkitBorderHorizontalSpacing: |
| case CSSPropertyID::kWebkitBorderVerticalSpacing: |
| case CSSPropertyID::kColumnGap: |
| case CSSPropertyID::kRowGap: |
| case CSSPropertyID::kColumnWidth: |
| case CSSPropertyID::kWidth: |
| case CSSPropertyID::kTabSize: |
| return kValueRangeNonNegative; |
| default: |
| return kValueRangeAll; |
| } |
| } |
| |
| bool LengthPropertyFunctions::IsZoomedLength(const CSSProperty& property) { |
| return property.PropertyID() != CSSPropertyID::kStrokeWidth; |
| } |
| |
| bool LengthPropertyFunctions::GetPixelsForKeyword(const CSSProperty& property, |
| CSSValueID value_id, |
| double& result) { |
| switch (property.PropertyID()) { |
| case CSSPropertyID::kBaselineShift: |
| if (value_id == CSSValueID::kBaseline) { |
| result = 0; |
| return true; |
| } |
| return false; |
| case CSSPropertyID::kBorderBottomWidth: |
| case CSSPropertyID::kBorderLeftWidth: |
| case CSSPropertyID::kBorderRightWidth: |
| case CSSPropertyID::kBorderTopWidth: |
| case CSSPropertyID::kColumnRuleWidth: |
| case CSSPropertyID::kOutlineWidth: |
| if (value_id == CSSValueID::kThin) { |
| result = 1; |
| return true; |
| } |
| if (value_id == CSSValueID::kMedium) { |
| result = 3; |
| return true; |
| } |
| if (value_id == CSSValueID::kThick) { |
| result = 5; |
| return true; |
| } |
| return false; |
| case CSSPropertyID::kLetterSpacing: |
| case CSSPropertyID::kWordSpacing: |
| if (value_id == CSSValueID::kNormal) { |
| result = 0; |
| return true; |
| } |
| return false; |
| default: |
| return false; |
| } |
| } |
| |
| bool LengthPropertyFunctions::GetInitialLength(const CSSProperty& property, |
| Length& result) { |
| switch (property.PropertyID()) { |
| // 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 |
| // - 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 CSSPropertyID::kBorderBottomWidth: |
| case CSSPropertyID::kBorderLeftWidth: |
| case CSSPropertyID::kBorderRightWidth: |
| case CSSPropertyID::kBorderTopWidth: |
| result = Length::Fixed(ComputedStyleInitialValues::InitialBorderWidth()); |
| return true; |
| case CSSPropertyID::kOutlineWidth: |
| result = Length::Fixed(ComputedStyleInitialValues::InitialOutlineWidth()); |
| return true; |
| case CSSPropertyID::kColumnRuleWidth: |
| result = |
| Length::Fixed(ComputedStyleInitialValues::InitialColumnRuleWidth()); |
| return true; |
| |
| default: |
| return GetLength(property, ComputedStyle::InitialStyle(), result); |
| } |
| } |
| |
| bool LengthPropertyFunctions::GetLength(const CSSProperty& property, |
| const ComputedStyle& style, |
| Length& result) { |
| switch (property.PropertyID()) { |
| case CSSPropertyID::kBottom: |
| result = style.Bottom(); |
| return true; |
| case CSSPropertyID::kCx: |
| result = style.Cx(); |
| return true; |
| case CSSPropertyID::kCy: |
| result = style.Cy(); |
| return true; |
| case CSSPropertyID::kFlexBasis: |
| result = style.FlexBasis(); |
| return true; |
| case CSSPropertyID::kHeight: |
| result = style.Height(); |
| return true; |
| case CSSPropertyID::kLeft: |
| result = style.Left(); |
| return true; |
| case CSSPropertyID::kMarginBottom: |
| result = style.MarginBottom(); |
| return true; |
| case CSSPropertyID::kMarginLeft: |
| result = style.MarginLeft(); |
| return true; |
| case CSSPropertyID::kMarginRight: |
| result = style.MarginRight(); |
| return true; |
| case CSSPropertyID::kMarginTop: |
| result = style.MarginTop(); |
| return true; |
| case CSSPropertyID::kMaxHeight: |
| result = style.MaxHeight(); |
| return true; |
| case CSSPropertyID::kMaxWidth: |
| result = style.MaxWidth(); |
| return true; |
| case CSSPropertyID::kMinHeight: |
| result = style.MinHeight(); |
| return true; |
| case CSSPropertyID::kMinWidth: |
| result = style.MinWidth(); |
| return true; |
| case CSSPropertyID::kOffsetDistance: |
| result = style.OffsetDistance(); |
| return true; |
| case CSSPropertyID::kPaddingBottom: |
| result = style.PaddingBottom(); |
| return true; |
| case CSSPropertyID::kPaddingLeft: |
| result = style.PaddingLeft(); |
| return true; |
| case CSSPropertyID::kPaddingRight: |
| result = style.PaddingRight(); |
| return true; |
| case CSSPropertyID::kPaddingTop: |
| result = style.PaddingTop(); |
| return true; |
| case CSSPropertyID::kR: |
| result = style.R(); |
| return true; |
| case CSSPropertyID::kRight: |
| result = style.Right(); |
| return true; |
| case CSSPropertyID::kRx: |
| result = style.Rx(); |
| return true; |
| case CSSPropertyID::kRy: |
| result = style.Ry(); |
| return true; |
| case CSSPropertyID::kShapeMargin: |
| result = style.ShapeMargin(); |
| return true; |
| case CSSPropertyID::kStrokeDashoffset: |
| result = style.StrokeDashOffset(); |
| return true; |
| case CSSPropertyID::kTextIndent: |
| result = style.TextIndent(); |
| return true; |
| case CSSPropertyID::kTop: |
| result = style.Top(); |
| return true; |
| case CSSPropertyID::kWebkitPerspectiveOriginX: |
| result = style.PerspectiveOriginX(); |
| return true; |
| case CSSPropertyID::kWebkitPerspectiveOriginY: |
| result = style.PerspectiveOriginY(); |
| return true; |
| case CSSPropertyID::kWebkitTransformOriginX: |
| result = style.TransformOriginX(); |
| return true; |
| case CSSPropertyID::kWebkitTransformOriginY: |
| result = style.TransformOriginY(); |
| return true; |
| case CSSPropertyID::kWidth: |
| result = style.Width(); |
| return true; |
| case CSSPropertyID::kX: |
| result = style.X(); |
| return true; |
| case CSSPropertyID::kY: |
| result = style.Y(); |
| return true; |
| |
| case CSSPropertyID::kBorderBottomWidth: |
| result = Length::Fixed(style.BorderBottomWidth()); |
| return true; |
| case CSSPropertyID::kBorderLeftWidth: |
| result = Length::Fixed(style.BorderLeftWidth()); |
| return true; |
| case CSSPropertyID::kBorderRightWidth: |
| result = Length::Fixed(style.BorderRightWidth()); |
| return true; |
| case CSSPropertyID::kBorderTopWidth: |
| result = Length::Fixed(style.BorderTopWidth()); |
| return true; |
| case CSSPropertyID::kLetterSpacing: |
| result = Length::Fixed(style.LetterSpacing()); |
| return true; |
| case CSSPropertyID::kOutlineOffset: |
| result = Length::Fixed(style.OutlineOffset()); |
| return true; |
| case CSSPropertyID::kOutlineWidth: |
| result = Length::Fixed(style.OutlineWidth()); |
| return true; |
| case CSSPropertyID::kWebkitBorderHorizontalSpacing: |
| result = Length::Fixed(style.HorizontalBorderSpacing()); |
| return true; |
| case CSSPropertyID::kWebkitBorderVerticalSpacing: |
| result = Length::Fixed(style.VerticalBorderSpacing()); |
| return true; |
| case CSSPropertyID::kRowGap: |
| if (!style.RowGap()) |
| return false; |
| result = *style.RowGap(); |
| return true; |
| case CSSPropertyID::kColumnGap: |
| if (!style.ColumnGap()) |
| return false; |
| result = *style.ColumnGap(); |
| return true; |
| case CSSPropertyID::kColumnRuleWidth: |
| result = Length::Fixed(style.ColumnRuleWidth()); |
| return true; |
| case CSSPropertyID::kWebkitTransformOriginZ: |
| result = Length::Fixed(style.TransformOriginZ()); |
| return true; |
| case CSSPropertyID::kWordSpacing: |
| result = Length::Fixed(style.WordSpacing()); |
| return true; |
| |
| case CSSPropertyID::kBaselineShift: |
| if (style.BaselineShiftType() != EBaselineShiftType::kLength) |
| return false; |
| result = style.BaselineShift(); |
| return true; |
| case CSSPropertyID::kLineHeight: |
| // Percent Lengths are used to represent numbers on line-height. |
| if (style.SpecifiedLineHeight().IsPercentOrCalc()) |
| return false; |
| result = style.SpecifiedLineHeight(); |
| return true; |
| case CSSPropertyID::kTabSize: |
| if (style.GetTabSize().IsSpaces()) |
| return false; |
| result = Length::Fixed(style.GetTabSize().float_value_); |
| return true; |
| case CSSPropertyID::kPerspective: |
| if (!style.HasPerspective()) |
| return false; |
| result = Length::Fixed(style.Perspective()); |
| return true; |
| case CSSPropertyID::kStrokeWidth: |
| DCHECK(!IsZoomedLength(CSSProperty::Get(CSSPropertyID::kStrokeWidth))); |
| result = style.StrokeWidth().length(); |
| return true; |
| case CSSPropertyID::kVerticalAlign: |
| if (style.VerticalAlign() != EVerticalAlign::kLength) |
| return false; |
| result = style.GetVerticalAlignLength(); |
| return true; |
| case CSSPropertyID::kColumnWidth: |
| if (style.HasAutoColumnWidth()) |
| return false; |
| result = Length::Fixed(style.ColumnWidth()); |
| return true; |
| default: |
| return false; |
| } |
| } |
| |
| bool LengthPropertyFunctions::SetLength(const CSSProperty& property, |
| ComputedStyle& style, |
| const Length& value) { |
| switch (property.PropertyID()) { |
| // Setters that take a Length value. |
| case CSSPropertyID::kBaselineShift: |
| style.SetBaselineShiftType(EBaselineShiftType::kLength); |
| style.SetBaselineShift(value); |
| return true; |
| case CSSPropertyID::kBottom: |
| style.SetBottom(value); |
| return true; |
| case CSSPropertyID::kCx: |
| style.SetCx(value); |
| return true; |
| case CSSPropertyID::kCy: |
| style.SetCy(value); |
| return true; |
| case CSSPropertyID::kFlexBasis: |
| style.SetFlexBasis(value); |
| return true; |
| case CSSPropertyID::kHeight: |
| style.SetHeight(value); |
| return true; |
| case CSSPropertyID::kLeft: |
| style.SetLeft(value); |
| return true; |
| case CSSPropertyID::kMarginBottom: |
| style.SetMarginBottom(value); |
| return true; |
| case CSSPropertyID::kMarginLeft: |
| style.SetMarginLeft(value); |
| return true; |
| case CSSPropertyID::kMarginRight: |
| style.SetMarginRight(value); |
| return true; |
| case CSSPropertyID::kMarginTop: |
| style.SetMarginTop(value); |
| return true; |
| case CSSPropertyID::kMaxHeight: |
| style.SetMaxHeight(value); |
| return true; |
| case CSSPropertyID::kMaxWidth: |
| style.SetMaxWidth(value); |
| return true; |
| case CSSPropertyID::kMinHeight: |
| style.SetMinHeight(value); |
| return true; |
| case CSSPropertyID::kMinWidth: |
| style.SetMinWidth(value); |
| return true; |
| case CSSPropertyID::kOffsetDistance: |
| style.SetOffsetDistance(value); |
| return true; |
| case CSSPropertyID::kPaddingBottom: |
| style.SetPaddingBottom(value); |
| return true; |
| case CSSPropertyID::kPaddingLeft: |
| style.SetPaddingLeft(value); |
| return true; |
| case CSSPropertyID::kPaddingRight: |
| style.SetPaddingRight(value); |
| return true; |
| case CSSPropertyID::kPaddingTop: |
| style.SetPaddingTop(value); |
| return true; |
| case CSSPropertyID::kR: |
| style.SetR(value); |
| return true; |
| case CSSPropertyID::kRx: |
| style.SetRx(value); |
| return true; |
| case CSSPropertyID::kRy: |
| style.SetRy(value); |
| return true; |
| case CSSPropertyID::kRight: |
| style.SetRight(value); |
| return true; |
| case CSSPropertyID::kShapeMargin: |
| style.SetShapeMargin(value); |
| return true; |
| case CSSPropertyID::kStrokeDashoffset: |
| style.SetStrokeDashOffset(value); |
| return true; |
| case CSSPropertyID::kTop: |
| style.SetTop(value); |
| return true; |
| case CSSPropertyID::kWidth: |
| style.SetWidth(value); |
| return true; |
| case CSSPropertyID::kWebkitPerspectiveOriginX: |
| style.SetPerspectiveOriginX(value); |
| return true; |
| case CSSPropertyID::kWebkitPerspectiveOriginY: |
| style.SetPerspectiveOriginY(value); |
| return true; |
| case CSSPropertyID::kWebkitTransformOriginX: |
| style.SetTransformOriginX(value); |
| return true; |
| case CSSPropertyID::kWebkitTransformOriginY: |
| style.SetTransformOriginY(value); |
| return true; |
| case CSSPropertyID::kX: |
| style.SetX(value); |
| return true; |
| case CSSPropertyID::kY: |
| style.SetY(value); |
| return true; |
| |
| case CSSPropertyID::kLineHeight: |
| // Percent Lengths are used to represent numbers on line-height. |
| if (value.IsPercentOrCalc()) |
| return false; |
| style.SetLineHeight(value); |
| return true; |
| |
| // TODO(alancutter): Support setters that take a numeric value (need to |
| // resolve percentages). |
| case CSSPropertyID::kBorderBottomWidth: |
| case CSSPropertyID::kBorderLeftWidth: |
| case CSSPropertyID::kBorderRightWidth: |
| case CSSPropertyID::kBorderTopWidth: |
| case CSSPropertyID::kLetterSpacing: |
| case CSSPropertyID::kOutlineOffset: |
| case CSSPropertyID::kOutlineWidth: |
| case CSSPropertyID::kPerspective: |
| case CSSPropertyID::kStrokeWidth: |
| case CSSPropertyID::kVerticalAlign: |
| case CSSPropertyID::kWebkitBorderHorizontalSpacing: |
| case CSSPropertyID::kWebkitBorderVerticalSpacing: |
| case CSSPropertyID::kColumnGap: |
| case CSSPropertyID::kRowGap: |
| case CSSPropertyID::kColumnRuleWidth: |
| case CSSPropertyID::kColumnWidth: |
| case CSSPropertyID::kWebkitTransformOriginZ: |
| case CSSPropertyID::kWordSpacing: |
| case CSSPropertyID::kTabSize: |
| return false; |
| |
| return false; |
| |
| default: |
| return false; |
| } |
| } |
| |
| } // namespace blink |