blob: 2b78a53fb3fb0cd686a8b492223a5c4c63bd71d1 [file] [log] [blame]
// 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