// Copyright 2015 The Cobalt Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#include "cobalt/cssom/property_definitions.h"

#include <algorithm>
#include <memory>
#include <vector>

#include "base/bind.h"
#include "base/lazy_instance.h"
#include "base/memory/ptr_util.h"
#include "base/strings/string_util.h"
#include "cobalt/cssom/calc_value.h"
#include "cobalt/cssom/font_style_value.h"
#include "cobalt/cssom/font_weight_value.h"
#include "cobalt/cssom/integer_value.h"
#include "cobalt/cssom/keyword_value.h"
#include "cobalt/cssom/length_value.h"
#include "cobalt/cssom/number_value.h"
#include "cobalt/cssom/percentage_value.h"
#include "cobalt/cssom/property_key_list_value.h"
#include "cobalt/cssom/property_list_value.h"
#include "cobalt/cssom/rgba_color_value.h"
#include "cobalt/cssom/string_value.h"
#include "cobalt/cssom/time_list_value.h"
#include "cobalt/cssom/timing_function.h"
#include "cobalt/cssom/timing_function_list_value.h"
#include "cobalt/cssom/unicode_range_value.h"

namespace cobalt {
namespace cssom {

namespace {

struct PropertyDefinition {
  PropertyDefinition()
      : name(NULL),
        inherited(kInheritedNo),
        animatable(kAnimatableNo),
        impacts_child_computed_style(kImpactsChildComputedStyleNo),
        impacts_box_generation(kImpactsBoxGenerationNo),
        impacts_box_sizes(kImpactsBoxSizesNo),
        impacts_box_cross_references(kImpactsBoxCrossReferencesNo) {}

  const char* name;
  Inherited inherited;
  Animatable animatable;
  ImpactsChildComputedStyle impacts_child_computed_style;
  ImpactsBoxGeneration impacts_box_generation;
  ImpactsBoxSizes impacts_box_sizes;
  ImpactsBoxCrossReferences impacts_box_cross_references;
  scoped_refptr<PropertyValue> initial_value;
  LonghandPropertySet longhand_properties;
};

struct NonTrivialGlobalVariables {
  NonTrivialGlobalVariables();

  std::vector<PropertyKey> lexicographical_longhand_keys;
  PropertyDefinition properties[kMaxEveryPropertyKey + 1];
  PropertyKeyVector animatable_properties;
  PropertyKeyVector inherited_animatable_properties;

  void SetPropertyDefinition(
      PropertyKey key, const char* name, Inherited inherited,
      Animatable animatable,
      ImpactsChildComputedStyle impacts_child_computed_style,
      ImpactsBoxGeneration impacts_box_generation,
      ImpactsBoxSizes impacts_box_sizes,
      ImpactsBoxCrossReferences impacts_box_cross_references,
      const scoped_refptr<PropertyValue>& initial_value) {
    DCHECK_LT(kNoneProperty, key);
    PropertyDefinition& definition = properties[key];
    DCHECK(!definition.name) << "Properties can only be defined once.";
    definition.name = name;
    definition.inherited = inherited;
    definition.animatable = animatable;
    definition.impacts_child_computed_style = impacts_child_computed_style;
    definition.impacts_box_generation = impacts_box_generation;
    definition.impacts_box_sizes = impacts_box_sizes;
    definition.impacts_box_cross_references = impacts_box_cross_references;
    definition.initial_value = initial_value;
  }

  void SetShorthandPropertyDefinition(
      PropertyKey key, const char* name,
      const LonghandPropertySet& longhand_properties) {
    DCHECK_LE(kFirstShorthandPropertyKey, key);
    DCHECK_GE(kMaxShorthandPropertyKey, key);
    PropertyDefinition& definition = properties[key];
    DCHECK(!definition.name) << "Properties can only be defined once.";
    definition.name = name;
    definition.longhand_properties = longhand_properties;
  }

  // Computes a set of animatable property to allow fast iteration through
  // only animatable properties.
  void CompileSetOfAnimatableProperties();

  // Computes a lexicographically sorted list of longhand properties for
  // serialization of computed styles.
  void CompileSortedLonghandProperties();

  // Helper functor for sorting property definitions by name.
  struct NameLess {
    explicit NameLess(const NonTrivialGlobalVariables& variables)
        : non_trivial_global_variables(variables) {}
    bool operator()(const PropertyKey& a, const PropertyKey& b) {
      return strcmp(non_trivial_global_variables.properties[a].name,
                    non_trivial_global_variables.properties[b].name) < 0;
    }

    const NonTrivialGlobalVariables& non_trivial_global_variables;
  };
};

scoped_refptr<TimeListValue> CreateTimeListWithZeroSeconds() {
  std::unique_ptr<TimeListValue::Builder> time_list(
      new TimeListValue::Builder());
  time_list->push_back(base::TimeDelta());
  return base::WrapRefCounted(new TimeListValue(std::move(time_list)));
}

scoped_refptr<PropertyKeyListValue> CreatePropertyKeyListWithAll() {
  std::unique_ptr<PropertyKeyListValue::Builder> property_list(
      new PropertyKeyListValue::Builder());
  property_list->push_back(kAllProperty);
  return base::WrapRefCounted(
      new PropertyKeyListValue(std::move(property_list)));
}

scoped_refptr<TimingFunctionListValue>
CreateTransitionTimingFunctionListWithEase() {
  std::unique_ptr<TimingFunctionListValue::Builder> timing_function_list(
      new TimingFunctionListValue::Builder());
  timing_function_list->push_back(TimingFunction::GetEase());
  return base::WrapRefCounted(
      new TimingFunctionListValue(std::move(timing_function_list)));
}

// Returns a PropertyListValue with only the single specified value.
scoped_refptr<PropertyListValue> CreateSinglePropertyListWithValue(
    const scoped_refptr<PropertyValue>& value) {
  return new PropertyListValue(
      base::WrapUnique(new PropertyListValue::Builder(1, value)));
}

NonTrivialGlobalVariables::NonTrivialGlobalVariables() {
  // https://www.w3.org/TR/css-flexbox-1/#align-content-property
  SetPropertyDefinition(kAlignContentProperty, "align-content", kInheritedNo,
                        kAnimatableNo, kImpactsChildComputedStyleNo,
                        kImpactsBoxGenerationNo, kImpactsBoxSizesYes,
                        kImpactsBoxCrossReferencesNo,
                        KeywordValue::GetStretch());

  // https://www.w3.org/TR/css-flexbox-1/#align-items-property
  SetPropertyDefinition(kAlignItemsProperty, "align-items", kInheritedNo,
                        kAnimatableNo, kImpactsChildComputedStyleNo,
                        kImpactsBoxGenerationNo, kImpactsBoxSizesYes,
                        kImpactsBoxCrossReferencesNo,
                        KeywordValue::GetStretch());

  // https://www.w3.org/TR/css-flexbox-1/#propdef-align-self
  SetPropertyDefinition(kAlignSelfProperty, "align-self", kInheritedNo,
                        kAnimatableNo, kImpactsChildComputedStyleNo,
                        kImpactsBoxGenerationNo, kImpactsBoxSizesYes,
                        kImpactsBoxCrossReferencesNo, KeywordValue::GetAuto());

  // https://www.w3.org/TR/css3-animations/#animation-delay-property
  SetPropertyDefinition(
      kAnimationDelayProperty, "animation-delay", kInheritedNo, kAnimatableNo,
      kImpactsChildComputedStyleNo, kImpactsBoxGenerationNo, kImpactsBoxSizesNo,
      kImpactsBoxCrossReferencesNo, CreateTimeListWithZeroSeconds());

  // https://www.w3.org/TR/css3-animations/#animation-direction-property
  SetPropertyDefinition(
      kAnimationDirectionProperty, "animation-direction", kInheritedNo,
      kAnimatableNo, kImpactsChildComputedStyleNo, kImpactsBoxGenerationNo,
      kImpactsBoxSizesNo, kImpactsBoxCrossReferencesNo,
      CreateSinglePropertyListWithValue(KeywordValue::GetNormal()));

  // https://www.w3.org/TR/css3-animations/#animation-duration-property
  SetPropertyDefinition(kAnimationDurationProperty, "animation-duration",
                        kInheritedNo, kAnimatableNo,
                        kImpactsChildComputedStyleNo, kImpactsBoxGenerationNo,
                        kImpactsBoxSizesNo, kImpactsBoxCrossReferencesNo,
                        CreateTimeListWithZeroSeconds());

  // https://www.w3.org/TR/css3-animations/#animation-fill-mode-property
  SetPropertyDefinition(
      kAnimationFillModeProperty, "animation-fill-mode", kInheritedNo,
      kAnimatableNo, kImpactsChildComputedStyleNo, kImpactsBoxGenerationNo,
      kImpactsBoxSizesNo, kImpactsBoxCrossReferencesNo,
      CreateSinglePropertyListWithValue(KeywordValue::GetNone()));

  // https://www.w3.org/TR/css3-animations/#animation-iteration-count-property
  SetPropertyDefinition(
      kAnimationIterationCountProperty, "animation-iteration-count",
      kInheritedNo, kAnimatableNo, kImpactsChildComputedStyleNo,
      kImpactsBoxGenerationNo, kImpactsBoxSizesNo, kImpactsBoxCrossReferencesNo,
      CreateSinglePropertyListWithValue(new NumberValue(1.0f)));

  // https://www.w3.org/TR/css3-animations/#animation-name-property
  SetPropertyDefinition(
      kAnimationNameProperty, "animation-name", kInheritedNo, kAnimatableNo,
      kImpactsChildComputedStyleNo, kImpactsBoxGenerationNo, kImpactsBoxSizesNo,
      kImpactsBoxCrossReferencesNo,
      CreateSinglePropertyListWithValue(KeywordValue::GetNone()));

  // https://www.w3.org/TR/css3-animations/#animation-timing-function-property
  SetPropertyDefinition(
      kAnimationTimingFunctionProperty, "animation-timing-function",
      kInheritedNo, kAnimatableNo, kImpactsChildComputedStyleNo,
      kImpactsBoxGenerationNo, kImpactsBoxSizesNo, kImpactsBoxCrossReferencesNo,
      CreateTransitionTimingFunctionListWithEase());

  // https://www.w3.org/TR/css3-background/#the-background-color
  SetPropertyDefinition(kBackgroundColorProperty, "background-color",
                        kInheritedNo, kAnimatableYes,
                        kImpactsChildComputedStyleNo, kImpactsBoxGenerationNo,
                        kImpactsBoxSizesNo, kImpactsBoxCrossReferencesNo,
                        new RGBAColorValue(0x00000000));

  // https://www.w3.org/TR/css3-background/#background-image
  SetPropertyDefinition(
      kBackgroundImageProperty, "background-image", kInheritedNo, kAnimatableNo,
      kImpactsChildComputedStyleNo, kImpactsBoxGenerationNo, kImpactsBoxSizesNo,
      kImpactsBoxCrossReferencesNo,
      CreateSinglePropertyListWithValue(KeywordValue::GetNone()));

  // https://www.w3.org/TR/css3-background/#the-background-position
  std::unique_ptr<PropertyListValue::Builder> background_position_builder(
      new PropertyListValue::Builder());
  background_position_builder->reserve(2);
  background_position_builder->push_back(
      new CalcValue(new PercentageValue(0.0f)));
  background_position_builder->push_back(
      new CalcValue(new PercentageValue(0.0f)));
  scoped_refptr<PropertyListValue> background_position_list(
      new PropertyListValue(std::move(background_position_builder)));
  SetPropertyDefinition(kBackgroundPositionProperty, "background-position",
                        kInheritedNo, kAnimatableNo,
                        kImpactsChildComputedStyleNo, kImpactsBoxGenerationNo,
                        kImpactsBoxSizesNo, kImpactsBoxCrossReferencesNo,
                        background_position_list);

  // The first value is for the horizontal direction, and the second for the
  // vertical one. If only one 'repeat' is given, the second is assumed to be
  // 'repeat'.
  //   https://www.w3.org/TR/css3-background/#the-background-repeat
  std::unique_ptr<PropertyListValue::Builder> background_repeat_builder(
      new PropertyListValue::Builder());
  background_repeat_builder->reserve(2);
  background_repeat_builder->push_back(KeywordValue::GetRepeat());
  background_repeat_builder->push_back(KeywordValue::GetRepeat());
  scoped_refptr<PropertyListValue> background_repeat_list(
      new PropertyListValue(std::move(background_repeat_builder)));
  SetPropertyDefinition(
      kBackgroundRepeatProperty, "background-repeat", kInheritedNo,
      kAnimatableNo, kImpactsChildComputedStyleNo, kImpactsBoxGenerationNo,
      kImpactsBoxSizesNo, kImpactsBoxCrossReferencesNo, background_repeat_list);

  // The first value gives the width of the corresponding image, and the second
  // value gives its height. If only one value is given, the second is assumed
  // to be 'auto'.
  //   https://www.w3.org/TR/css-backgrounds-3/#the-background-size
  std::unique_ptr<PropertyListValue::Builder> background_size_builder(
      new PropertyListValue::Builder());
  background_size_builder->reserve(2);
  background_size_builder->push_back(KeywordValue::GetAuto());
  background_size_builder->push_back(KeywordValue::GetAuto());
  scoped_refptr<PropertyListValue> background_size_list(
      new PropertyListValue(std::move(background_size_builder)));
  SetPropertyDefinition(
      kBackgroundSizeProperty, "background-size", kInheritedNo, kAnimatableNo,
      kImpactsChildComputedStyleNo, kImpactsBoxGenerationNo, kImpactsBoxSizesNo,
      kImpactsBoxCrossReferencesNo, background_size_list);

  // This sets the foreground color of the border specified by the border-style
  // property.
  //   https://www.w3.org/TR/css3-background/#border-color
  SetPropertyDefinition(
      kBorderTopColorProperty, "border-top-color", kInheritedNo, kAnimatableYes,
      kImpactsChildComputedStyleNo, kImpactsBoxGenerationNo, kImpactsBoxSizesNo,
      kImpactsBoxCrossReferencesNo, KeywordValue::GetCurrentColor());

  SetPropertyDefinition(kBorderRightColorProperty, "border-right-color",
                        kInheritedNo, kAnimatableYes,
                        kImpactsChildComputedStyleNo, kImpactsBoxGenerationNo,
                        kImpactsBoxSizesNo, kImpactsBoxCrossReferencesNo,
                        KeywordValue::GetCurrentColor());

  SetPropertyDefinition(kBorderBottomColorProperty, "border-bottom-color",
                        kInheritedNo, kAnimatableYes,
                        kImpactsChildComputedStyleNo, kImpactsBoxGenerationNo,
                        kImpactsBoxSizesNo, kImpactsBoxCrossReferencesNo,
                        KeywordValue::GetCurrentColor());

  SetPropertyDefinition(kBorderLeftColorProperty, "border-left-color",
                        kInheritedNo, kAnimatableYes,
                        kImpactsChildComputedStyleNo, kImpactsBoxGenerationNo,
                        kImpactsBoxSizesNo, kImpactsBoxCrossReferencesNo,
                        KeywordValue::GetCurrentColor());

  // https://www.w3.org/TR/css3-background/#border-style
  SetPropertyDefinition(kBorderTopStyleProperty, "border-top-style",
                        kInheritedNo, kAnimatableNo,
                        kImpactsChildComputedStyleNo, kImpactsBoxGenerationNo,
                        kImpactsBoxSizesYes, kImpactsBoxCrossReferencesNo,
                        KeywordValue::GetNone());

  SetPropertyDefinition(kBorderRightStyleProperty, "border-right-style",
                        kInheritedNo, kAnimatableNo,
                        kImpactsChildComputedStyleNo, kImpactsBoxGenerationNo,
                        kImpactsBoxSizesYes, kImpactsBoxCrossReferencesNo,
                        KeywordValue::GetNone());

  SetPropertyDefinition(kBorderBottomStyleProperty, "border-bottom-style",
                        kInheritedNo, kAnimatableNo,
                        kImpactsChildComputedStyleNo, kImpactsBoxGenerationNo,
                        kImpactsBoxSizesYes, kImpactsBoxCrossReferencesNo,
                        KeywordValue::GetNone());

  SetPropertyDefinition(kBorderLeftStyleProperty, "border-left-style",
                        kInheritedNo, kAnimatableNo,
                        kImpactsChildComputedStyleNo, kImpactsBoxGenerationNo,
                        kImpactsBoxSizesYes, kImpactsBoxCrossReferencesNo,
                        KeywordValue::GetNone());

  //  Initial: medium.
  // According to the spec., make the thickness depend on the 'medium' font
  // size: one choice might be 1, 3, & 5px (thin, medium, and thick) when the
  // 'medium' font size is 17 px or less.
  //   https://www.w3.org/TR/css3-background/#border-width
  SetPropertyDefinition(kBorderTopWidthProperty, "border-top-width",
                        kInheritedNo, kAnimatableNo,
                        kImpactsChildComputedStyleNo, kImpactsBoxGenerationNo,
                        kImpactsBoxSizesYes, kImpactsBoxCrossReferencesNo,
                        new LengthValue(3, kPixelsUnit));

  SetPropertyDefinition(kBorderRightWidthProperty, "border-right-width",
                        kInheritedNo, kAnimatableNo,
                        kImpactsChildComputedStyleNo, kImpactsBoxGenerationNo,
                        kImpactsBoxSizesYes, kImpactsBoxCrossReferencesNo,
                        new LengthValue(3, kPixelsUnit));

  SetPropertyDefinition(kBorderBottomWidthProperty, "border-bottom-width",
                        kInheritedNo, kAnimatableNo,
                        kImpactsChildComputedStyleNo, kImpactsBoxGenerationNo,
                        kImpactsBoxSizesYes, kImpactsBoxCrossReferencesNo,
                        new LengthValue(3, kPixelsUnit));

  SetPropertyDefinition(kBorderLeftWidthProperty, "border-left-width",
                        kInheritedNo, kAnimatableNo,
                        kImpactsChildComputedStyleNo, kImpactsBoxGenerationNo,
                        kImpactsBoxSizesYes, kImpactsBoxCrossReferencesNo,
                        new LengthValue(3, kPixelsUnit));

  //   https://www.w3.org/TR/css3-background/#the-border-radius
  SetPropertyDefinition(kBorderTopLeftRadiusProperty, "border-top-left-radius",
                        kInheritedNo, kAnimatableNo,
                        kImpactsChildComputedStyleNo, kImpactsBoxGenerationNo,
                        kImpactsBoxSizesNo, kImpactsBoxCrossReferencesNo,
                        new LengthValue(0, kPixelsUnit));

  SetPropertyDefinition(kBorderTopRightRadiusProperty,
                        "border-top-right-radius", kInheritedNo, kAnimatableNo,
                        kImpactsChildComputedStyleNo, kImpactsBoxGenerationNo,
                        kImpactsBoxSizesNo, kImpactsBoxCrossReferencesNo,
                        new LengthValue(0, kPixelsUnit));

  SetPropertyDefinition(
      kBorderBottomRightRadiusProperty, "border-bottom-right-radius",
      kInheritedNo, kAnimatableNo, kImpactsChildComputedStyleNo,
      kImpactsBoxGenerationNo, kImpactsBoxSizesNo, kImpactsBoxCrossReferencesNo,
      new LengthValue(0, kPixelsUnit));

  SetPropertyDefinition(
      kBorderBottomLeftRadiusProperty, "border-bottom-left-radius",
      kInheritedNo, kAnimatableNo, kImpactsChildComputedStyleNo,
      kImpactsBoxGenerationNo, kImpactsBoxSizesNo, kImpactsBoxCrossReferencesNo,
      new LengthValue(0, kPixelsUnit));

  // https://www.w3.org/TR/CSS2/visuren.html#propdef-bottom
  SetPropertyDefinition(kBottomProperty, "bottom", kInheritedNo, kAnimatableNo,
                        kImpactsChildComputedStyleYes, kImpactsBoxGenerationNo,
                        kImpactsBoxSizesYes, kImpactsBoxCrossReferencesNo,
                        KeywordValue::GetAuto());

  // https://www.w3.org/TR/css3-background/#the-box-shadow
  SetPropertyDefinition(kBoxShadowProperty, "box-shadow", kInheritedNo,
                        kAnimatableNo, kImpactsChildComputedStyleNo,
                        kImpactsBoxGenerationNo, kImpactsBoxSizesNo,
                        kImpactsBoxCrossReferencesNo, KeywordValue::GetNone());

  // Opaque black in Chromium and Cobalt.
  //   https://www.w3.org/TR/css3-color/#foreground
  SetPropertyDefinition(kColorProperty, "color", kInheritedYes, kAnimatableYes,
                        kImpactsChildComputedStyleYes, kImpactsBoxGenerationYes,
                        kImpactsBoxSizesNo, kImpactsBoxCrossReferencesNo,
                        new RGBAColorValue(0x000000ff));

  // https://www.w3.org/TR/CSS21/generate.html#content
  SetPropertyDefinition(kContentProperty, "content", kInheritedNo,
                        kAnimatableNo, kImpactsChildComputedStyleNo,
                        kImpactsBoxGenerationYes, kImpactsBoxSizesNo,
                        kImpactsBoxCrossReferencesNo,
                        KeywordValue::GetNormal());

  // https://www.w3.org/TR/CSS21/visuren.html#display-prop
  SetPropertyDefinition(kDisplayProperty, "display", kInheritedNo,
                        kAnimatableNo, kImpactsChildComputedStyleNo,
                        kImpactsBoxGenerationYes, kImpactsBoxSizesNo,
                        kImpactsBoxCrossReferencesNo,
                        KeywordValue::GetInline());

  // https://www.w3.org/TR/filter-effects-1/#FilterProperty
  SetPropertyDefinition(kFilterProperty, "filter", kInheritedNo, kAnimatableNo,
                        kImpactsChildComputedStyleNo, kImpactsBoxGenerationNo,
                        kImpactsBoxSizesNo, kImpactsBoxCrossReferencesNo,
                        KeywordValue::GetNone());

  // https://www.w3.org/TR/css-flexbox-1/#flex-basis-property
  SetPropertyDefinition(kFlexBasisProperty, "flex-basis", kInheritedNo,
                        kAnimatableNo, kImpactsChildComputedStyleNo,
                        kImpactsBoxGenerationNo, kImpactsBoxSizesYes,
                        kImpactsBoxCrossReferencesNo, KeywordValue::GetAuto());

  // https://www.w3.org/TR/css-flexbox-1/#flex-direction-property
  SetPropertyDefinition(kFlexDirectionProperty, "flex-direction", kInheritedNo,
                        kAnimatableNo, kImpactsChildComputedStyleNo,
                        kImpactsBoxGenerationNo, kImpactsBoxSizesYes,
                        kImpactsBoxCrossReferencesNo, KeywordValue::GetRow());

  // https://www.w3.org/TR/css-flexbox-1/#flex-grow-property
  SetPropertyDefinition(kFlexGrowProperty, "flex-grow", kInheritedNo,
                        kAnimatableNo, kImpactsChildComputedStyleNo,
                        kImpactsBoxGenerationNo, kImpactsBoxSizesYes,
                        kImpactsBoxCrossReferencesNo, new NumberValue(0));

  // https://www.w3.org/TR/css-flexbox-1/#flex-shrink-property
  SetPropertyDefinition(kFlexShrinkProperty, "flex-shrink", kInheritedNo,
                        kAnimatableNo, kImpactsChildComputedStyleNo,
                        kImpactsBoxGenerationNo, kImpactsBoxSizesYes,
                        kImpactsBoxCrossReferencesNo, new NumberValue(1));

  // https://www.w3.org/TR/css-flexbox-1/#flex-wrap-property
  SetPropertyDefinition(kFlexWrapProperty, "flex-wrap", kInheritedNo,
                        kAnimatableNo, kImpactsChildComputedStyleNo,
                        kImpactsBoxGenerationNo, kImpactsBoxSizesYes,
                        kImpactsBoxCrossReferencesNo,
                        KeywordValue::GetNowrap());

  // Varies by platform in Chromium, Roboto in Cobalt.
  //   https://www.w3.org/TR/css3-fonts/#font-family-prop
  SetPropertyDefinition(
      kFontFamilyProperty, "font-family", kInheritedYes, kAnimatableNo,
      kImpactsChildComputedStyleNo, kImpactsBoxGenerationYes,
      kImpactsBoxSizesYes, kImpactsBoxCrossReferencesNo,
      CreateSinglePropertyListWithValue(new StringValue("Roboto")));

  // "medium" translates to 16px in Chromium.
  // Cobalt does not support keyword sizes, so we simply hardcode 16px.
  //   https://www.w3.org/TR/css3-fonts/#font-size-prop
  SetPropertyDefinition(kFontSizeProperty, "font-size", kInheritedYes,
                        kAnimatableNo, kImpactsChildComputedStyleYes,
                        kImpactsBoxGenerationYes, kImpactsBoxSizesYes,
                        kImpactsBoxCrossReferencesNo,
                        new LengthValue(16, kPixelsUnit));

  // https://www.w3.org/TR/css3-fonts/#font-style-prop
  SetPropertyDefinition(kFontStyleProperty, "font-style", kInheritedYes,
                        kAnimatableNo, kImpactsChildComputedStyleNo,
                        kImpactsBoxGenerationYes, kImpactsBoxSizesYes,
                        kImpactsBoxCrossReferencesNo,
                        FontStyleValue::GetNormal());

  // https://www.w3.org/TR/css3-fonts/#font-weight-prop
  SetPropertyDefinition(kFontWeightProperty, "font-weight", kInheritedYes,
                        kAnimatableNo, kImpactsChildComputedStyleNo,
                        kImpactsBoxGenerationYes, kImpactsBoxSizesYes,
                        kImpactsBoxCrossReferencesNo,
                        FontWeightValue::GetNormalAka400());

  // https://www.w3.org/TR/CSS21/visudet.html#the-height-property
  SetPropertyDefinition(kHeightProperty, "height", kInheritedNo, kAnimatableNo,
                        kImpactsChildComputedStyleYes, kImpactsBoxGenerationNo,
                        kImpactsBoxSizesYes, kImpactsBoxCrossReferencesNo,
                        KeywordValue::GetAuto());

  // https://www.w3.org/TR/intersection-observer/#parse-a-root-margin
  // Not actually a new CSS property but we need it to parse an
  // IntersectionObserver's root margin
  SetPropertyDefinition(kIntersectionObserverRootMarginProperty,
                        "intersection-observer-root-margin", kInheritedNo,
                        kAnimatableNo, kImpactsChildComputedStyleNo,
                        kImpactsBoxGenerationNo, kImpactsBoxSizesNo,
                        kImpactsBoxCrossReferencesNo, KeywordValue::GetAuto());

  // https://www.w3.org/TR/css-flexbox-1/#justify-content-property
  SetPropertyDefinition(kJustifyContentProperty, "justify-content",
                        kInheritedNo, kAnimatableNo,
                        kImpactsChildComputedStyleNo, kImpactsBoxGenerationNo,
                        kImpactsBoxSizesYes, kImpactsBoxCrossReferencesNo,
                        KeywordValue::GetFlexStart());

  // https://www.w3.org/TR/CSS2/visuren.html#propdef-left
  SetPropertyDefinition(kLeftProperty, "left", kInheritedNo, kAnimatableNo,
                        kImpactsChildComputedStyleNo, kImpactsBoxGenerationNo,
                        kImpactsBoxSizesYes, kImpactsBoxCrossReferencesNo,
                        KeywordValue::GetAuto());

  // https://www.w3.org/TR/CSS21/visudet.html#line-height
  SetPropertyDefinition(kLineHeightProperty, "line-height", kInheritedYes,
                        kAnimatableNo, kImpactsChildComputedStyleNo,
                        kImpactsBoxGenerationNo, kImpactsBoxSizesYes,
                        kImpactsBoxCrossReferencesNo,
                        KeywordValue::GetNormal());

  // https://www.w3.org/TR/CSS21/box.html#margin-properties
  SetPropertyDefinition(kMarginBottomProperty, "margin-bottom", kInheritedNo,
                        kAnimatableNo, kImpactsChildComputedStyleNo,
                        kImpactsBoxGenerationNo, kImpactsBoxSizesYes,
                        kImpactsBoxCrossReferencesNo,
                        new LengthValue(0, kPixelsUnit));

  // https://www.w3.org/TR/CSS21/box.html#margin-properties
  SetPropertyDefinition(kMarginLeftProperty, "margin-left", kInheritedNo,
                        kAnimatableNo, kImpactsChildComputedStyleNo,
                        kImpactsBoxGenerationNo, kImpactsBoxSizesYes,
                        kImpactsBoxCrossReferencesNo,
                        new LengthValue(0, kPixelsUnit));

  // https://www.w3.org/TR/CSS21/box.html#margin-properties
  SetPropertyDefinition(kMarginRightProperty, "margin-right", kInheritedNo,
                        kAnimatableNo, kImpactsChildComputedStyleNo,
                        kImpactsBoxGenerationNo, kImpactsBoxSizesYes,
                        kImpactsBoxCrossReferencesNo,
                        new LengthValue(0, kPixelsUnit));

  // https://www.w3.org/TR/CSS21/box.html#margin-properties
  SetPropertyDefinition(kMarginTopProperty, "margin-top", kInheritedNo,
                        kAnimatableNo, kImpactsChildComputedStyleNo,
                        kImpactsBoxGenerationNo, kImpactsBoxSizesYes,
                        kImpactsBoxCrossReferencesNo,
                        new LengthValue(0, kPixelsUnit));

  // https://www.w3.org/TR/CSS2/visudet.html#propdef-max-height
  SetPropertyDefinition(kMaxHeightProperty, "max-height", kInheritedNo,
                        kAnimatableNo, kImpactsChildComputedStyleNo,
                        kImpactsBoxGenerationNo, kImpactsBoxSizesYes,
                        kImpactsBoxCrossReferencesNo, KeywordValue::GetNone());

  // https://www.w3.org/TR/CSS2/visudet.html#propdef-max-width
  SetPropertyDefinition(kMaxWidthProperty, "max-width", kInheritedNo,
                        kAnimatableNo, kImpactsChildComputedStyleNo,
                        kImpactsBoxGenerationNo, kImpactsBoxSizesYes,
                        kImpactsBoxCrossReferencesNo, KeywordValue::GetNone());

  // https://www.w3.org/TR/CSS2/visudet.html#propdef-min-height
  SetPropertyDefinition(kMinHeightProperty, "min-height", kInheritedNo,
                        kAnimatableNo, kImpactsChildComputedStyleNo,
                        kImpactsBoxGenerationNo, kImpactsBoxSizesYes,
                        kImpactsBoxCrossReferencesNo,
                        new LengthValue(0, kPixelsUnit));

  // https://www.w3.org/TR/CSS2/visudet.html#propdef-min-width
  SetPropertyDefinition(kMinWidthProperty, "min-width", kInheritedNo,
                        kAnimatableNo, kImpactsChildComputedStyleNo,
                        kImpactsBoxGenerationNo, kImpactsBoxSizesYes,
                        kImpactsBoxCrossReferencesNo,
                        new LengthValue(0, kPixelsUnit));

  // https://www.w3.org/TR/css3-color/#opacity
  SetPropertyDefinition(kOpacityProperty, "opacity", kInheritedNo,
                        kAnimatableYes, kImpactsChildComputedStyleNo,
                        kImpactsBoxGenerationNo, kImpactsBoxSizesNo,
                        kImpactsBoxCrossReferencesYes, new NumberValue(1.0f));

  // https://www.w3.org/TR/css-flexbox-1/#order-property
  SetPropertyDefinition(kOrderProperty, "order", kInheritedNo, kAnimatableNo,
                        kImpactsChildComputedStyleNo, kImpactsBoxGenerationNo,
                        kImpactsBoxSizesYes, kImpactsBoxCrossReferencesNo,
                        new IntegerValue(0));

  // https://www.w3.org/TR/CSS21/ui.html#propdef-outline-color
  SetPropertyDefinition(
      kOutlineColorProperty, "outline-color", kInheritedNo, kAnimatableYes,
      kImpactsChildComputedStyleNo, kImpactsBoxGenerationNo, kImpactsBoxSizesNo,
      kImpactsBoxCrossReferencesNo, KeywordValue::GetCurrentColor());

  // https://www.w3.org/TR/CSS21/ui.html#propdef-outline-style
  SetPropertyDefinition(kOutlineStyleProperty, "outline-style", kInheritedNo,
                        kAnimatableNo, kImpactsChildComputedStyleNo,
                        kImpactsBoxGenerationNo, kImpactsBoxSizesYes,
                        kImpactsBoxCrossReferencesNo, KeywordValue::GetNone());

  // https://www.w3.org/TR/CSS21/ui.html#propdef-outline-width
  SetPropertyDefinition(kOutlineWidthProperty, "outline-width", kInheritedNo,
                        kAnimatableYes, kImpactsChildComputedStyleNo,
                        kImpactsBoxGenerationNo, kImpactsBoxSizesYes,
                        kImpactsBoxCrossReferencesNo,
                        new LengthValue(3, kPixelsUnit));

  // https://www.w3.org/TR/css-overflow-3/#overflow-properties
  SetPropertyDefinition(kOverflowProperty, "overflow", kInheritedNo,
                        kAnimatableNo, kImpactsChildComputedStyleNo,
                        kImpactsBoxGenerationNo, kImpactsBoxSizesYes,
                        kImpactsBoxCrossReferencesYes,
                        KeywordValue::GetVisible());

  // https://www.w3.org/TR/css-text-3/#overflow-wrap
  SetPropertyDefinition(kOverflowWrapProperty, "overflow-wrap", kInheritedYes,
                        kAnimatableNo, kImpactsChildComputedStyleNo,
                        kImpactsBoxGenerationNo, kImpactsBoxSizesYes,
                        kImpactsBoxCrossReferencesNo,
                        KeywordValue::GetNormal());

  // https://www.w3.org/TR/CSS21/box.html#padding-properties
  SetPropertyDefinition(kPaddingBottomProperty, "padding-bottom", kInheritedNo,
                        kAnimatableNo, kImpactsChildComputedStyleNo,
                        kImpactsBoxGenerationNo, kImpactsBoxSizesYes,
                        kImpactsBoxCrossReferencesNo,
                        new LengthValue(0, kPixelsUnit));

  // https://www.w3.org/TR/CSS21/box.html#padding-properties
  SetPropertyDefinition(kPaddingLeftProperty, "padding-left", kInheritedNo,
                        kAnimatableNo, kImpactsChildComputedStyleNo,
                        kImpactsBoxGenerationNo, kImpactsBoxSizesYes,
                        kImpactsBoxCrossReferencesNo,
                        new LengthValue(0, kPixelsUnit));

  // https://www.w3.org/TR/CSS21/box.html#padding-properties
  SetPropertyDefinition(kPaddingRightProperty, "padding-right", kInheritedNo,
                        kAnimatableNo, kImpactsChildComputedStyleNo,
                        kImpactsBoxGenerationNo, kImpactsBoxSizesYes,
                        kImpactsBoxCrossReferencesNo,
                        new LengthValue(0, kPixelsUnit));

  // https://www.w3.org/TR/CSS21/box.html#padding-properties
  SetPropertyDefinition(kPaddingTopProperty, "padding-top", kInheritedNo,
                        kAnimatableNo, kImpactsChildComputedStyleNo,
                        kImpactsBoxGenerationNo, kImpactsBoxSizesYes,
                        kImpactsBoxCrossReferencesNo,
                        new LengthValue(0, kPixelsUnit));

  // While only defined in the SVG spec, the pointer-events property has been
  // proposed an commonly implemented to also apply to HTML elements for
  // values of 'none' (element can not be indicated by a pointer) and 'auto'
  // (element can be indicated by a pointer if the element has 'visibility' set
  // to 'visible').
  //   https://www.w3.org/TR/SVG11/interact.html#PointerEventsProperty
  SetPropertyDefinition(kPointerEventsProperty, "pointer-events", kInheritedYes,
                        kAnimatableNo, kImpactsChildComputedStyleNo,
                        kImpactsBoxGenerationNo, kImpactsBoxSizesNo,
                        kImpactsBoxCrossReferencesNo, KeywordValue::GetAuto());

  // https://www.w3.org/TR/css3-positioning/#position-property
  SetPropertyDefinition(kPositionProperty, "position", kInheritedNo,
                        kAnimatableNo, kImpactsChildComputedStyleNo,
                        kImpactsBoxGenerationYes, kImpactsBoxSizesYes,
                        kImpactsBoxCrossReferencesYes,
                        KeywordValue::GetStatic());

  // https://www.w3.org/TR/CSS2/visuren.html#propdef-right
  SetPropertyDefinition(kRightProperty, "right", kInheritedNo, kAnimatableNo,
                        kImpactsChildComputedStyleNo, kImpactsBoxGenerationNo,
                        kImpactsBoxSizesYes, kImpactsBoxCrossReferencesNo,
                        KeywordValue::GetAuto());

  //   https://www.w3.org/TR/css-text-3/#text-align-property
  SetPropertyDefinition(kTextAlignProperty, "text-align", kInheritedYes,
                        kAnimatableNo, kImpactsChildComputedStyleNo,
                        kImpactsBoxGenerationNo, kImpactsBoxSizesYes,
                        kImpactsBoxCrossReferencesNo, KeywordValue::GetStart());

  //   https://www.w3.org/TR/css-text-decor-3/#text-decoration-color
  SetPropertyDefinition(kTextDecorationColorProperty, "text-decoration-color",
                        kInheritedNo, kAnimatableYes,
                        kImpactsChildComputedStyleNo, kImpactsBoxGenerationNo,
                        kImpactsBoxSizesNo, kImpactsBoxCrossReferencesNo,
                        KeywordValue::GetCurrentColor());

  //   https://www.w3.org/TR/css-text-decor-3/#text-decoration-line
  SetPropertyDefinition(kTextDecorationLineProperty, "text-decoration-line",
                        kInheritedNo, kAnimatableNo,
                        kImpactsChildComputedStyleNo, kImpactsBoxGenerationNo,
                        kImpactsBoxSizesNo, kImpactsBoxCrossReferencesNo,
                        KeywordValue::GetNone());

  // https://www.w3.org/TR/CSS21/text.html#propdef-text-indent
  SetPropertyDefinition(kTextIndentProperty, "text-indent", kInheritedYes,
                        kAnimatableNo, kImpactsChildComputedStyleNo,
                        kImpactsBoxGenerationNo, kImpactsBoxSizesYes,
                        kImpactsBoxCrossReferencesNo,
                        new LengthValue(0, kPixelsUnit));

  // https://www.w3.org/TR/css3-ui/#propdef-text-overflow
  SetPropertyDefinition(kTextOverflowProperty, "text-overflow", kInheritedNo,
                        kAnimatableNo, kImpactsChildComputedStyleNo,
                        kImpactsBoxGenerationNo, kImpactsBoxSizesYes,
                        kImpactsBoxCrossReferencesNo, KeywordValue::GetClip());

  // https://www.w3.org/TR/css-text-decor-3/#text-shadow-property
  SetPropertyDefinition(kTextShadowProperty, "text-shadow", kInheritedYes,
                        kAnimatableNo, kImpactsChildComputedStyleNo,
                        kImpactsBoxGenerationNo, kImpactsBoxSizesNo,
                        kImpactsBoxCrossReferencesNo, KeywordValue::GetNone());

  // https://www.w3.org/TR/css3-text/#text-transform-property
  SetPropertyDefinition(kTextTransformProperty, "text-transform", kInheritedYes,
                        kAnimatableNo, kImpactsChildComputedStyleNo,
                        kImpactsBoxGenerationYes, kImpactsBoxSizesNo,
                        kImpactsBoxCrossReferencesNo, KeywordValue::GetNone());

  // https://www.w3.org/TR/CSS2/visuren.html#propdef-top
  SetPropertyDefinition(kTopProperty, "top", kInheritedNo, kAnimatableNo,
                        kImpactsChildComputedStyleYes, kImpactsBoxGenerationNo,
                        kImpactsBoxSizesYes, kImpactsBoxCrossReferencesNo,
                        KeywordValue::GetAuto());

  // https://www.w3.org/TR/css3-transforms/#transform-property
  SetPropertyDefinition(kTransformProperty, "transform", kInheritedNo,
                        kAnimatableYes, kImpactsChildComputedStyleNo,
                        kImpactsBoxGenerationNo, kImpactsBoxSizesYes,
                        kImpactsBoxCrossReferencesYes, KeywordValue::GetNone());

  // https://www.w3.org/TR/css3-transforms/#propdef-transform-origin
  std::unique_ptr<PropertyListValue::Builder> transform_origin_builder(
      new PropertyListValue::Builder());
  transform_origin_builder->reserve(3);
  transform_origin_builder->push_back(new CalcValue(new PercentageValue(0.5f)));
  transform_origin_builder->push_back(new CalcValue(new PercentageValue(0.5f)));
  transform_origin_builder->push_back(new LengthValue(0.0f, kPixelsUnit));
  scoped_refptr<PropertyListValue> transform_origin_list(
      new PropertyListValue(std::move(transform_origin_builder)));
  SetPropertyDefinition(
      kTransformOriginProperty, "transform-origin", kInheritedNo, kAnimatableNo,
      kImpactsChildComputedStyleNo, kImpactsBoxGenerationNo, kImpactsBoxSizesNo,
      kImpactsBoxCrossReferencesNo, transform_origin_list);

  // https://www.w3.org/TR/css3-transitions/#transition-delay-property
  SetPropertyDefinition(
      kTransitionDelayProperty, "transition-delay", kInheritedNo, kAnimatableNo,
      kImpactsChildComputedStyleNo, kImpactsBoxGenerationNo, kImpactsBoxSizesNo,
      kImpactsBoxCrossReferencesNo, CreateTimeListWithZeroSeconds());

  // https://www.w3.org/TR/css3-transitions/#transition-duration-property
  SetPropertyDefinition(kTransitionDurationProperty, "transition-duration",
                        kInheritedNo, kAnimatableNo,
                        kImpactsChildComputedStyleNo, kImpactsBoxGenerationNo,
                        kImpactsBoxSizesNo, kImpactsBoxCrossReferencesNo,
                        CreateTimeListWithZeroSeconds());

  // https://www.w3.org/TR/css3-transitions/#transition-property-property
  SetPropertyDefinition(kTransitionPropertyProperty, "transition-property",
                        kInheritedNo, kAnimatableNo,
                        kImpactsChildComputedStyleNo, kImpactsBoxGenerationNo,
                        kImpactsBoxSizesNo, kImpactsBoxCrossReferencesNo,
                        CreatePropertyKeyListWithAll());

  // https://www.w3.org/TR/css3-transitions/#transition-timing-function-property
  SetPropertyDefinition(
      kTransitionTimingFunctionProperty, "transition-timing-function",
      kInheritedNo, kAnimatableNo, kImpactsChildComputedStyleNo,
      kImpactsBoxGenerationNo, kImpactsBoxSizesNo, kImpactsBoxCrossReferencesNo,
      CreateTransitionTimingFunctionListWithEase());

  // https://www.w3.org/TR/CSS21/visudet.html#propdef-vertical-align
  SetPropertyDefinition(
      kVerticalAlignProperty, "vertical-align", kInheritedNo, kAnimatableNo,
      kImpactsChildComputedStyleNo, kImpactsBoxGenerationNo, kImpactsBoxSizesNo,
      kImpactsBoxCrossReferencesNo, KeywordValue::GetBaseline());

  // https://www.w3.org/TR/CSS21/visufx.html#propdef-visibility
  SetPropertyDefinition(
      kVisibilityProperty, "visibility", kInheritedYes, kAnimatableNo,
      kImpactsChildComputedStyleNo, kImpactsBoxGenerationNo, kImpactsBoxSizesNo,
      kImpactsBoxCrossReferencesNo, KeywordValue::GetVisible());

  // https://www.w3.org/TR/css3-text/#white-space-property
  SetPropertyDefinition(kWhiteSpaceProperty, "white-space", kInheritedYes,
                        kAnimatableNo, kImpactsChildComputedStyleNo,
                        kImpactsBoxGenerationYes, kImpactsBoxSizesYes,
                        kImpactsBoxCrossReferencesNo,
                        KeywordValue::GetNormal());

  // https://www.w3.org/TR/CSS21/visudet.html#the-width-property
  SetPropertyDefinition(kWidthProperty, "width", kInheritedNo, kAnimatableNo,
                        kImpactsChildComputedStyleYes, kImpactsBoxGenerationNo,
                        kImpactsBoxSizesYes, kImpactsBoxCrossReferencesNo,
                        KeywordValue::GetAuto());

  // https://www.w3.org/TR/CSS21/visuren.html#z-index
  SetPropertyDefinition(kZIndexProperty, "z-index", kInheritedNo, kAnimatableNo,
                        kImpactsChildComputedStyleNo, kImpactsBoxGenerationNo,
                        kImpactsBoxSizesNo, kImpactsBoxCrossReferencesYes,
                        KeywordValue::GetAuto());

  // This property name can appear as a keyword for the transition-property
  // property.
  //   https://www.w3.org/TR/2013/WD-css3-transitions-20131119/#transition-property-property
  SetPropertyDefinition(kAllProperty, "all", kInheritedNo, kAnimatableNo,
                        kImpactsChildComputedStyleNo, kImpactsBoxGenerationNo,
                        kImpactsBoxSizesNo, kImpactsBoxCrossReferencesNo, NULL);

  // This is a descriptor for @font-face at-rules.
  //   https://www.w3.org/TR/css3-fonts/#descdef-src
  SetPropertyDefinition(kSrcProperty, "src", kInheritedNo, kAnimatableNo,
                        kImpactsChildComputedStyleNo, kImpactsBoxGenerationNo,
                        kImpactsBoxSizesNo, kImpactsBoxCrossReferencesNo, NULL);

  //   https://www.w3.org/TR/css3-fonts/#unicode-range-desc
  SetPropertyDefinition(
      kUnicodeRangeProperty, "unicode-range", kInheritedNo, kAnimatableNo,
      kImpactsChildComputedStyleNo, kImpactsBoxGenerationNo, kImpactsBoxSizesNo,
      kImpactsBoxCrossReferencesNo, new UnicodeRangeValue(0, 0x10FFFF));

  // This is an alias for kOverflowWrap
  //   https://www.w3.org/TR/css-text-3/#overflow-wrap
  SetPropertyDefinition(kWordWrapProperty, "word-wrap", kInheritedYes,
                        kAnimatableNo, kImpactsChildComputedStyleNo,
                        kImpactsBoxGenerationNo, kImpactsBoxSizesYes,
                        kImpactsBoxCrossReferencesNo,
                        KeywordValue::GetNormal());

  // Shorthand properties.

  //   https://www.w3.org/TR/css3-background/#the-background
  LonghandPropertySet background_longhand_properties;
  background_longhand_properties.insert(kBackgroundColorProperty);
  background_longhand_properties.insert(kBackgroundImageProperty);
  background_longhand_properties.insert(kBackgroundPositionProperty);
  background_longhand_properties.insert(kBackgroundRepeatProperty);
  background_longhand_properties.insert(kBackgroundSizeProperty);
  SetShorthandPropertyDefinition(kBackgroundProperty, "background",
                                 background_longhand_properties);

  //    https://www.w3.org/TR/css3-background/#border-color
  LonghandPropertySet border_color_longhand_properties;
  border_color_longhand_properties.insert(kBorderTopColorProperty);
  border_color_longhand_properties.insert(kBorderRightColorProperty);
  border_color_longhand_properties.insert(kBorderBottomColorProperty);
  border_color_longhand_properties.insert(kBorderLeftColorProperty);
  SetShorthandPropertyDefinition(kBorderColorProperty, "border-color",
                                 border_color_longhand_properties);

  //    https://www.w3.org/TR/css3-background/#border-style
  LonghandPropertySet border_style_longhand_properties;
  border_style_longhand_properties.insert(kBorderTopStyleProperty);
  border_style_longhand_properties.insert(kBorderRightStyleProperty);
  border_style_longhand_properties.insert(kBorderBottomStyleProperty);
  border_style_longhand_properties.insert(kBorderLeftStyleProperty);
  SetShorthandPropertyDefinition(kBorderStyleProperty, "border-style",
                                 border_style_longhand_properties);

  //   https://www.w3.org/TR/css3-background/#border-width
  LonghandPropertySet border_width_longhand_properties;
  border_width_longhand_properties.insert(kBorderTopWidthProperty);
  border_width_longhand_properties.insert(kBorderRightWidthProperty);
  border_width_longhand_properties.insert(kBorderBottomWidthProperty);
  border_width_longhand_properties.insert(kBorderLeftWidthProperty);
  SetShorthandPropertyDefinition(kBorderWidthProperty, "border-width",
                                 border_width_longhand_properties);

  //   https://www.w3.org/TR/css3-background/#border-radius
  LonghandPropertySet border_radius_longhand_properties;
  border_radius_longhand_properties.insert(kBorderTopLeftRadiusProperty);
  border_radius_longhand_properties.insert(kBorderTopRightRadiusProperty);
  border_radius_longhand_properties.insert(kBorderBottomRightRadiusProperty);
  border_radius_longhand_properties.insert(kBorderBottomLeftRadiusProperty);
  SetShorthandPropertyDefinition(kBorderRadiusProperty, "border-radius",
                                 border_radius_longhand_properties);

  //   https://www.w3.org/TR/css3-background/#border
  LonghandPropertySet border_longhand_properties;
  border_longhand_properties.insert(kBorderColorProperty);
  border_longhand_properties.insert(kBorderStyleProperty);
  border_longhand_properties.insert(kBorderWidthProperty);
  SetShorthandPropertyDefinition(kBorderProperty, "border",
                                 border_longhand_properties);

  // Border shorthand properties.
  //  https://www.w3.org/TR/css-backgrounds-3/#the-border-shorthands
  LonghandPropertySet border_top_longhand_properties;
  border_top_longhand_properties.insert(kBorderTopColorProperty);
  border_top_longhand_properties.insert(kBorderTopStyleProperty);
  border_top_longhand_properties.insert(kBorderTopWidthProperty);
  SetShorthandPropertyDefinition(kBorderTopProperty, "border-top",
                                 border_top_longhand_properties);

  LonghandPropertySet border_right_longhand_properties;
  border_right_longhand_properties.insert(kBorderRightColorProperty);
  border_right_longhand_properties.insert(kBorderRightStyleProperty);
  border_right_longhand_properties.insert(kBorderRightWidthProperty);
  SetShorthandPropertyDefinition(kBorderRightProperty, "border-right",
                                 border_right_longhand_properties);

  LonghandPropertySet border_bottom_longhand_properties;
  border_bottom_longhand_properties.insert(kBorderBottomColorProperty);
  border_bottom_longhand_properties.insert(kBorderBottomStyleProperty);
  border_bottom_longhand_properties.insert(kBorderBottomWidthProperty);
  SetShorthandPropertyDefinition(kBorderBottomProperty, "border-bottom",
                                 border_bottom_longhand_properties);

  LonghandPropertySet border_left_longhand_properties;
  border_left_longhand_properties.insert(kBorderLeftColorProperty);
  border_left_longhand_properties.insert(kBorderLeftStyleProperty);
  border_left_longhand_properties.insert(kBorderLeftWidthProperty);
  SetShorthandPropertyDefinition(kBorderLeftProperty, "border-left",
                                 border_left_longhand_properties);

  // https://www.w3.org/TR/css-flexbox-1/#flex-property
  LonghandPropertySet flex_longhand_properties;
  flex_longhand_properties.insert(kFlexGrowProperty);
  flex_longhand_properties.insert(kFlexShrinkProperty);
  flex_longhand_properties.insert(kFlexBasisProperty);
  SetShorthandPropertyDefinition(kFlexProperty, "flex",
                                 flex_longhand_properties);

  // https://www.w3.org/TR/css-flexbox-1/#flex-flow-property
  LonghandPropertySet flex_flow_longhand_properties;
  flex_flow_longhand_properties.insert(kFlexDirectionProperty);
  flex_flow_longhand_properties.insert(kFlexWrapProperty);
  SetShorthandPropertyDefinition(kFlexFlowProperty, "flex-flow",
                                 flex_flow_longhand_properties);

  //   https://www.w3.org/TR/css3-fonts/#font-prop
  LonghandPropertySet font_longhand_properties;
  font_longhand_properties.insert(kFontStyleProperty);
  font_longhand_properties.insert(kFontWeightProperty);
  font_longhand_properties.insert(kFontSizeProperty);
  font_longhand_properties.insert(kFontFamilyProperty);
  SetShorthandPropertyDefinition(kFontProperty, "font",
                                 font_longhand_properties);

  //   https://www.w3.org/TR/CSS21/box.html#propdef-margin
  LonghandPropertySet margin_longhand_properties;
  margin_longhand_properties.insert(kMarginBottomProperty);
  margin_longhand_properties.insert(kMarginLeftProperty);
  margin_longhand_properties.insert(kMarginRightProperty);
  margin_longhand_properties.insert(kMarginTopProperty);
  SetShorthandPropertyDefinition(kMarginProperty, "margin",
                                 margin_longhand_properties);

  //   https://www.w3.org/TR/CSS21/ui.html#propdef-outline
  LonghandPropertySet outline_longhand_properties;
  outline_longhand_properties.insert(kOutlineColorProperty);
  outline_longhand_properties.insert(kOutlineStyleProperty);
  outline_longhand_properties.insert(kOutlineWidthProperty);
  SetShorthandPropertyDefinition(kOutlineProperty, "outline",
                                 outline_longhand_properties);

  //   https://www.w3.org/TR/CSS21/box.html#propdef-padding
  LonghandPropertySet padding_longhand_properties;
  padding_longhand_properties.insert(kPaddingBottomProperty);
  padding_longhand_properties.insert(kPaddingLeftProperty);
  padding_longhand_properties.insert(kPaddingRightProperty);
  padding_longhand_properties.insert(kPaddingTopProperty);
  SetShorthandPropertyDefinition(kPaddingProperty, "padding",
                                 padding_longhand_properties);

  //   https://www.w3.org/TR/css-text-decor-3/#text-decoration
  LonghandPropertySet text_decoration_longhand_properties;
  text_decoration_longhand_properties.insert(kTextDecorationColorProperty);
  text_decoration_longhand_properties.insert(kTextDecorationLineProperty);
  SetShorthandPropertyDefinition(kTextDecorationProperty, "text-decoration",
                                 text_decoration_longhand_properties);

  //   https://www.w3.org/TR/2013/WD-css3-animations-20130219/#animation-shorthand-property
  LonghandPropertySet animation_longhand_properties;
  animation_longhand_properties.insert(kAnimationDelayProperty);
  animation_longhand_properties.insert(kAnimationDirectionProperty);
  animation_longhand_properties.insert(kAnimationDurationProperty);
  animation_longhand_properties.insert(kAnimationFillModeProperty);
  animation_longhand_properties.insert(kAnimationIterationCountProperty);
  animation_longhand_properties.insert(kAnimationNameProperty);
  animation_longhand_properties.insert(kAnimationTimingFunctionProperty);
  SetShorthandPropertyDefinition(kAnimationProperty, "animation",
                                 animation_longhand_properties);

  //   https://www.w3.org/TR/css3-transitions/#transition-shorthand-property
  LonghandPropertySet transition_longhand_properties;
  transition_longhand_properties.insert(kTransitionDelayProperty);
  transition_longhand_properties.insert(kTransitionDurationProperty);
  transition_longhand_properties.insert(kTransitionPropertyProperty);
  transition_longhand_properties.insert(kTransitionTimingFunctionProperty);
  SetShorthandPropertyDefinition(kTransitionProperty, "transition",
                                 transition_longhand_properties);

  CompileSetOfAnimatableProperties();
  CompileSortedLonghandProperties();
}  // NOLINT(readability/fn_size)

void NonTrivialGlobalVariables::CompileSetOfAnimatableProperties() {
  for (int i = 0; i < kMaxEveryPropertyKey + 1; ++i) {
    if (properties[i].animatable == kAnimatableYes) {
      animatable_properties.push_back(static_cast<PropertyKey>(i));
      if (properties[i].inherited == kInheritedYes) {
        inherited_animatable_properties.push_back(static_cast<PropertyKey>(i));
      }
    }
  }
}

void NonTrivialGlobalVariables::CompileSortedLonghandProperties() {
  // When serializing the CSS Declaration block returned by getComputedStyle,
  // all supported longhand CSS Properties must be listed in lexicographical
  // order. This prepares the lexicographical_longhand_keys array to contain
  // PropertyKeys in lexicographical order. See
  // https://www.w3.org/TR/2013/WD-cssom-20131205/#dom-window-getcomputedstyle.
  lexicographical_longhand_keys.resize(kMaxLonghandPropertyKey + 1);
  for (size_t i = 0; i < lexicographical_longhand_keys.size(); ++i) {
    lexicographical_longhand_keys[i] = static_cast<PropertyKey>(i);
  }
  std::sort(lexicographical_longhand_keys.begin(),
            lexicographical_longhand_keys.end(), NameLess(*this));
}

base::LazyInstance<NonTrivialGlobalVariables>::DestructorAtExit
    non_trivial_global_variables = LAZY_INSTANCE_INITIALIZER;
}  // namespace

const char* GetPropertyName(PropertyKey key) {
  DCHECK_GT(key, kNoneProperty);
  DCHECK_LE(key, kMaxEveryPropertyKey);
  const char* name = non_trivial_global_variables.Get().properties[key].name;
  return name;
}

const scoped_refptr<PropertyValue>& GetPropertyInitialValue(PropertyKey key) {
  DCHECK(!IsShorthandProperty(key));
  DCHECK_GT(key, kNoneProperty);
  DCHECK_LE(key, kMaxEveryPropertyKey);
  const scoped_refptr<PropertyValue>& initial_value =
      non_trivial_global_variables.Get().properties[key].initial_value;
  return initial_value;
}

Inherited GetPropertyInheritance(PropertyKey key) {
  DCHECK(!IsShorthandProperty(key));
  DCHECK_GT(key, kNoneProperty);
  DCHECK_LE(key, kMaxEveryPropertyKey);
  return non_trivial_global_variables.Get().properties[key].inherited;
}

Animatable GetPropertyAnimatable(PropertyKey key) {
  DCHECK(!IsShorthandProperty(key));
  DCHECK_GT(key, kNoneProperty);
  DCHECK_LE(key, kMaxEveryPropertyKey);
  return non_trivial_global_variables.Get().properties[key].animatable;
}

ImpactsChildComputedStyle GetPropertyImpactsChildComputedStyle(
    PropertyKey key) {
  DCHECK(!IsShorthandProperty(key));
  DCHECK_GT(key, kNoneProperty);
  DCHECK_LE(key, kMaxEveryPropertyKey);
  return non_trivial_global_variables.Get()
      .properties[key]
      .impacts_child_computed_style;
}

ImpactsBoxGeneration GetPropertyImpactsBoxGeneration(PropertyKey key) {
  DCHECK(!IsShorthandProperty(key));
  DCHECK_GT(key, kNoneProperty);
  DCHECK_LE(key, kMaxEveryPropertyKey);
  return non_trivial_global_variables.Get()
      .properties[key]
      .impacts_box_generation;
}

ImpactsBoxSizes GetPropertyImpactsBoxSizes(PropertyKey key) {
  DCHECK(!IsShorthandProperty(key));
  DCHECK_GT(key, kNoneProperty);
  DCHECK_LE(key, kMaxEveryPropertyKey);
  return non_trivial_global_variables.Get().properties[key].impacts_box_sizes;
}

ImpactsBoxCrossReferences GetPropertyImpactsBoxCrossReferences(
    PropertyKey key) {
  DCHECK(!IsShorthandProperty(key));
  DCHECK_GT(key, kNoneProperty);
  DCHECK_LE(key, kMaxEveryPropertyKey);
  return non_trivial_global_variables.Get()
      .properties[key]
      .impacts_box_cross_references;
}

bool IsShorthandProperty(PropertyKey key) {
  return key >= kFirstShorthandPropertyKey && key <= kMaxShorthandPropertyKey;
}

const LonghandPropertySet& ExpandShorthandProperty(PropertyKey key) {
  DCHECK(IsShorthandProperty(key));
  return non_trivial_global_variables.Get().properties[key].longhand_properties;
}

const PropertyKeyVector& GetAnimatableProperties() {
  return non_trivial_global_variables.Get().animatable_properties;
}

const PropertyKeyVector& GetInheritedAnimatableProperties() {
  return non_trivial_global_variables.Get().inherited_animatable_properties;
}

PropertyKey GetLexicographicalLonghandPropertyKey(const size_t index) {
  DCHECK_LE(
      index,
      non_trivial_global_variables.Get().lexicographical_longhand_keys.size());
  return non_trivial_global_variables.Get()
      .lexicographical_longhand_keys[index];
}

PropertyKey GetPropertyKey(const std::string& property_name) {
  switch (property_name.size()) {
    case 3:
      if (base::LowerCaseEqualsASCII(property_name,
                                     GetPropertyName(kTopProperty))) {
        return kTopProperty;
      }
      return kNoneProperty;

    case 4:
      if (base::LowerCaseEqualsASCII(property_name,
                                     GetPropertyName(kFlexProperty))) {
        return kFlexProperty;
      }
      if (base::LowerCaseEqualsASCII(property_name,
                                     GetPropertyName(kFontProperty))) {
        return kFontProperty;
      }
      if (base::LowerCaseEqualsASCII(property_name,
                                     GetPropertyName(kLeftProperty))) {
        return kLeftProperty;
      }
      return kNoneProperty;

    case 5:
      if (base::LowerCaseEqualsASCII(property_name,
                                     GetPropertyName(kColorProperty))) {
        return kColorProperty;
      }
      if (base::LowerCaseEqualsASCII(property_name,
                                     GetPropertyName(kOrderProperty))) {
        return kOrderProperty;
      }
      if (base::LowerCaseEqualsASCII(property_name,
                                     GetPropertyName(kRightProperty))) {
        return kRightProperty;
      }
      if (base::LowerCaseEqualsASCII(property_name,
                                     GetPropertyName(kWidthProperty))) {
        return kWidthProperty;
      }
      return kNoneProperty;

    case 6:
      if (base::LowerCaseEqualsASCII(property_name,
                                     GetPropertyName(kBorderProperty))) {
        return kBorderProperty;
      }
      if (base::LowerCaseEqualsASCII(property_name,
                                     GetPropertyName(kBottomProperty))) {
        return kBottomProperty;
      }
      if (base::LowerCaseEqualsASCII(property_name,
                                     GetPropertyName(kFilterProperty))) {
        return kFilterProperty;
      }
      if (base::LowerCaseEqualsASCII(property_name,
                                     GetPropertyName(kHeightProperty))) {
        return kHeightProperty;
      }
      if (base::LowerCaseEqualsASCII(property_name,
                                     GetPropertyName(kMarginProperty))) {
        return kMarginProperty;
      }
      return kNoneProperty;

    case 7:
      if (base::LowerCaseEqualsASCII(property_name,
                                     GetPropertyName(kContentProperty))) {
        return kContentProperty;
      }
      if (base::LowerCaseEqualsASCII(property_name,
                                     GetPropertyName(kDisplayProperty))) {
        return kDisplayProperty;
      }
      if (base::LowerCaseEqualsASCII(property_name,
                                     GetPropertyName(kOpacityProperty))) {
        return kOpacityProperty;
      }
      if (base::LowerCaseEqualsASCII(property_name,
                                     GetPropertyName(kOutlineProperty))) {
        return kOutlineProperty;
      }
      if (base::LowerCaseEqualsASCII(property_name,
                                     GetPropertyName(kPaddingProperty))) {
        return kPaddingProperty;
      }
      if (base::LowerCaseEqualsASCII(property_name,
                                     GetPropertyName(kZIndexProperty))) {
        return kZIndexProperty;
      }
      return kNoneProperty;

    case 8:
      if (base::LowerCaseEqualsASCII(property_name,
                                     GetPropertyName(kOverflowProperty))) {
        return kOverflowProperty;
      }
      if (base::LowerCaseEqualsASCII(property_name,
                                     GetPropertyName(kPositionProperty))) {
        return kPositionProperty;
      }
      return kNoneProperty;

    case 9:
      if (base::LowerCaseEqualsASCII(property_name,
                                     GetPropertyName(kAnimationProperty))) {
        return kAnimationProperty;
      }
      if (base::LowerCaseEqualsASCII(property_name,
                                     GetPropertyName(kFlexFlowProperty))) {
        return kFlexFlowProperty;
      }
      if (base::LowerCaseEqualsASCII(property_name,
                                     GetPropertyName(kFlexGrowProperty))) {
        return kFlexGrowProperty;
      }
      if (base::LowerCaseEqualsASCII(property_name,
                                     GetPropertyName(kFlexWrapProperty))) {
        return kFlexWrapProperty;
      }
      if (base::LowerCaseEqualsASCII(property_name,
                                     GetPropertyName(kFontSizeProperty))) {
        return kFontSizeProperty;
      }
      if (base::LowerCaseEqualsASCII(property_name,
                                     GetPropertyName(kMaxWidthProperty))) {
        return kMaxWidthProperty;
      }
      if (base::LowerCaseEqualsASCII(property_name,
                                     GetPropertyName(kMinWidthProperty))) {
        return kMinWidthProperty;
      }
      if (base::LowerCaseEqualsASCII(property_name,
                                     GetPropertyName(kTransformProperty))) {
        return kTransformProperty;
      }
      return kNoneProperty;

    case 10:
      if (base::LowerCaseEqualsASCII(property_name,
                                     GetPropertyName(kAlignSelfProperty))) {
        return kAlignSelfProperty;
      }
      if (base::LowerCaseEqualsASCII(property_name,
                                     GetPropertyName(kBackgroundProperty))) {
        return kBackgroundProperty;
      }
      if (base::LowerCaseEqualsASCII(property_name,
                                     GetPropertyName(kBorderTopProperty))) {
        return kBorderTopProperty;
      }
      if (base::LowerCaseEqualsASCII(property_name,
                                     GetPropertyName(kBoxShadowProperty))) {
        return kBoxShadowProperty;
      }
      if (base::LowerCaseEqualsASCII(property_name,
                                     GetPropertyName(kFlexBasisProperty))) {
        return kFlexBasisProperty;
      }
      if (base::LowerCaseEqualsASCII(property_name,
                                     GetPropertyName(kFontStyleProperty))) {
        return kFontStyleProperty;
      }
      if (base::LowerCaseEqualsASCII(property_name,
                                     GetPropertyName(kMarginTopProperty))) {
        return kMarginTopProperty;
      }
      if (base::LowerCaseEqualsASCII(property_name,
                                     GetPropertyName(kMaxHeightProperty))) {
        return kMaxHeightProperty;
      }
      if (base::LowerCaseEqualsASCII(property_name,
                                     GetPropertyName(kMinHeightProperty))) {
        return kMinHeightProperty;
      }
      if (base::LowerCaseEqualsASCII(property_name,
                                     GetPropertyName(kTextAlignProperty))) {
        return kTextAlignProperty;
      }
      if (base::LowerCaseEqualsASCII(property_name,
                                     GetPropertyName(kTransitionProperty))) {
        return kTransitionProperty;
      }
      if (base::LowerCaseEqualsASCII(property_name,
                                     GetPropertyName(kVisibilityProperty))) {
        return kVisibilityProperty;
      }
      return kNoneProperty;

    case 11:
      if (base::LowerCaseEqualsASCII(property_name,
                                     GetPropertyName(kAlignItemsProperty))) {
        return kAlignItemsProperty;
      }
      if (base::LowerCaseEqualsASCII(property_name,
                                     GetPropertyName(kBorderLeftProperty))) {
        return kBorderLeftProperty;
      }
      if (base::LowerCaseEqualsASCII(property_name,
                                     GetPropertyName(kFlexShrinkProperty))) {
        return kFlexShrinkProperty;
      }
      if (base::LowerCaseEqualsASCII(property_name,
                                     GetPropertyName(kFontFamilyProperty))) {
        return kFontFamilyProperty;
      }
      if (base::LowerCaseEqualsASCII(property_name,
                                     GetPropertyName(kFontWeightProperty))) {
        return kFontWeightProperty;
      }
      if (base::LowerCaseEqualsASCII(property_name,
                                     GetPropertyName(kLineHeightProperty))) {
        return kLineHeightProperty;
      }
      if (base::LowerCaseEqualsASCII(property_name,
                                     GetPropertyName(kMarginLeftProperty))) {
        return kMarginLeftProperty;
      }
      if (base::LowerCaseEqualsASCII(property_name,
                                     GetPropertyName(kPaddingTopProperty))) {
        return kPaddingTopProperty;
      }
      if (base::LowerCaseEqualsASCII(property_name,
                                     GetPropertyName(kTextIndentProperty))) {
        return kTextIndentProperty;
      }
      if (base::LowerCaseEqualsASCII(property_name,
                                     GetPropertyName(kTextShadowProperty))) {
        return kTextShadowProperty;
      }
      if (base::LowerCaseEqualsASCII(property_name,
                                     GetPropertyName(kWhiteSpaceProperty))) {
        return kWhiteSpaceProperty;
      }
      return kNoneProperty;

    case 12:
      if (base::LowerCaseEqualsASCII(property_name,
                                     GetPropertyName(kBorderColorProperty))) {
        return kBorderColorProperty;
      }
      if (base::LowerCaseEqualsASCII(property_name,
                                     GetPropertyName(kBorderRightProperty))) {
        return kBorderRightProperty;
      }
      if (base::LowerCaseEqualsASCII(property_name,
                                     GetPropertyName(kBorderStyleProperty))) {
        return kBorderStyleProperty;
      }
      if (base::LowerCaseEqualsASCII(property_name,
                                     GetPropertyName(kBorderWidthProperty))) {
        return kBorderWidthProperty;
      }
      if (base::LowerCaseEqualsASCII(property_name,
                                     GetPropertyName(kMarginRightProperty))) {
        return kMarginRightProperty;
      }
      if (base::LowerCaseEqualsASCII(property_name,
                                     GetPropertyName(kPaddingLeftProperty))) {
        return kPaddingLeftProperty;
      }
      return kNoneProperty;

    case 13:
      if (base::LowerCaseEqualsASCII(property_name,
                                     GetPropertyName(kAlignContentProperty))) {
        return kAlignContentProperty;
      }
      if (base::LowerCaseEqualsASCII(property_name,
                                     GetPropertyName(kBorderBottomProperty))) {
        return kBorderBottomProperty;
      }
      if (base::LowerCaseEqualsASCII(property_name,
                                     GetPropertyName(kBorderRadiusProperty))) {
        return kBorderRadiusProperty;
      }
      if (base::LowerCaseEqualsASCII(property_name,
                                     GetPropertyName(kMarginBottomProperty))) {
        return kMarginBottomProperty;
      }
      if (base::LowerCaseEqualsASCII(property_name,
                                     GetPropertyName(kOutlineColorProperty))) {
        return kOutlineColorProperty;
      }
      if (base::LowerCaseEqualsASCII(property_name,
                                     GetPropertyName(kOutlineStyleProperty))) {
        return kOutlineStyleProperty;
      }
      if (base::LowerCaseEqualsASCII(property_name,
                                     GetPropertyName(kOutlineWidthProperty))) {
        return kOutlineWidthProperty;
      }
      if (base::LowerCaseEqualsASCII(property_name,
                                     GetPropertyName(kOverflowWrapProperty))) {
        return kOverflowWrapProperty;
      }
      if (base::LowerCaseEqualsASCII(property_name,
                                     GetPropertyName(kPaddingRightProperty))) {
        return kPaddingRightProperty;
      }
      if (base::LowerCaseEqualsASCII(property_name,
                                     GetPropertyName(kTextOverflowProperty))) {
        return kTextOverflowProperty;
      }
      return kNoneProperty;

    case 14:
      if (base::LowerCaseEqualsASCII(property_name,
                                     GetPropertyName(kAnimationNameProperty))) {
        return kAnimationNameProperty;
      }
      if (base::LowerCaseEqualsASCII(property_name,
                                     GetPropertyName(kFlexDirectionProperty))) {
        return kFlexDirectionProperty;
      }
      if (base::LowerCaseEqualsASCII(property_name,
                                     GetPropertyName(kPaddingBottomProperty))) {
        return kPaddingBottomProperty;
      }
      if (base::LowerCaseEqualsASCII(property_name,
                                     GetPropertyName(kPointerEventsProperty))) {
        return kPointerEventsProperty;
      }
      if (base::LowerCaseEqualsASCII(property_name,
                                     GetPropertyName(kTextTransformProperty))) {
        return kTextTransformProperty;
      }
      if (base::LowerCaseEqualsASCII(property_name,
                                     GetPropertyName(kVerticalAlignProperty))) {
        return kVerticalAlignProperty;
      }
      return kNoneProperty;

    case 15:
      if (base::LowerCaseEqualsASCII(
              property_name, GetPropertyName(kAnimationDelayProperty))) {
        return kAnimationDelayProperty;
      }
      if (base::LowerCaseEqualsASCII(
              property_name, GetPropertyName(kBackgroundSizeProperty))) {
        return kBackgroundSizeProperty;
      }
      if (base::LowerCaseEqualsASCII(
              property_name, GetPropertyName(kJustifyContentProperty))) {
        return kJustifyContentProperty;
      }
      if (base::LowerCaseEqualsASCII(
              property_name, GetPropertyName(kTextDecorationProperty))) {
        return kTextDecorationProperty;
      }
      return kNoneProperty;

    case 16:
      if (base::LowerCaseEqualsASCII(
              property_name, GetPropertyName(kBackgroundColorProperty))) {
        return kBackgroundColorProperty;
      }
      if (base::LowerCaseEqualsASCII(
              property_name, GetPropertyName(kBorderTopColorProperty))) {
        return kBorderTopColorProperty;
      }
      if (base::LowerCaseEqualsASCII(
              property_name, GetPropertyName(kBorderTopStyleProperty))) {
        return kBorderTopStyleProperty;
      }
      if (base::LowerCaseEqualsASCII(
              property_name, GetPropertyName(kBorderTopWidthProperty))) {
        return kBorderTopWidthProperty;
      }
      if (base::LowerCaseEqualsASCII(
              property_name, GetPropertyName(kBackgroundImageProperty))) {
        return kBackgroundImageProperty;
      }
      if (base::LowerCaseEqualsASCII(
              property_name, GetPropertyName(kTransformOriginProperty))) {
        return kTransformOriginProperty;
      }
      if (base::LowerCaseEqualsASCII(
              property_name, GetPropertyName(kTransitionDelayProperty))) {
        return kTransitionDelayProperty;
      }
      return kNoneProperty;

    case 17:
      if (base::LowerCaseEqualsASCII(
              property_name, GetPropertyName(kBackgroundRepeatProperty))) {
        return kBackgroundRepeatProperty;
      }
      if (base::LowerCaseEqualsASCII(
              property_name, GetPropertyName(kBorderLeftColorProperty))) {
        return kBorderLeftColorProperty;
      }
      if (base::LowerCaseEqualsASCII(
              property_name, GetPropertyName(kBorderLeftStyleProperty))) {
        return kBorderLeftStyleProperty;
      }
      if (base::LowerCaseEqualsASCII(
              property_name, GetPropertyName(kBorderLeftWidthProperty))) {
        return kBorderLeftWidthProperty;
      }
      return kNoneProperty;

    case 18:
      if (base::LowerCaseEqualsASCII(
              property_name, GetPropertyName(kAnimationDurationProperty))) {
        return kAnimationDurationProperty;
      }
      if (base::LowerCaseEqualsASCII(
              property_name, GetPropertyName(kBorderRightColorProperty))) {
        return kBorderRightColorProperty;
      }
      if (base::LowerCaseEqualsASCII(
              property_name, GetPropertyName(kBorderRightStyleProperty))) {
        return kBorderRightStyleProperty;
      }
      if (base::LowerCaseEqualsASCII(
              property_name, GetPropertyName(kBorderRightWidthProperty))) {
        return kBorderRightWidthProperty;
      }
      return kNoneProperty;

    case 19:
      if (base::LowerCaseEqualsASCII(
              property_name, GetPropertyName(kAnimationDirectionProperty))) {
        return kAnimationDirectionProperty;
      }
      if (base::LowerCaseEqualsASCII(
              property_name, GetPropertyName(kAnimationFillModeProperty))) {
        return kAnimationFillModeProperty;
      }
      if (base::LowerCaseEqualsASCII(
              property_name, GetPropertyName(kBackgroundPositionProperty))) {
        return kBackgroundPositionProperty;
      }
      if (base::LowerCaseEqualsASCII(
              property_name, GetPropertyName(kBorderBottomColorProperty))) {
        return kBorderBottomColorProperty;
      }
      if (base::LowerCaseEqualsASCII(
              property_name, GetPropertyName(kBorderBottomStyleProperty))) {
        return kBorderBottomStyleProperty;
      }
      if (base::LowerCaseEqualsASCII(
              property_name, GetPropertyName(kBorderBottomWidthProperty))) {
        return kBorderBottomWidthProperty;
      }
      if (base::LowerCaseEqualsASCII(
              property_name, GetPropertyName(kTransitionDurationProperty))) {
        return kTransitionDurationProperty;
      }
      if (base::LowerCaseEqualsASCII(
              property_name, GetPropertyName(kTransitionPropertyProperty))) {
        return kTransitionPropertyProperty;
      }
      return kNoneProperty;

    case 20:
      if (base::LowerCaseEqualsASCII(
              property_name, GetPropertyName(kTextDecorationLineProperty))) {
        return kTextDecorationLineProperty;
      }
      return kNoneProperty;

    case 21:
      if (base::LowerCaseEqualsASCII(
              property_name, GetPropertyName(kTextDecorationColorProperty))) {
        return kTextDecorationColorProperty;
      }
      return kNoneProperty;

    case 22:
      if (base::LowerCaseEqualsASCII(
              property_name, GetPropertyName(kBorderTopLeftRadiusProperty))) {
        return kBorderTopLeftRadiusProperty;
      }
      return kNoneProperty;

    case 23:
      if (base::LowerCaseEqualsASCII(
              property_name, GetPropertyName(kBorderTopRightRadiusProperty))) {
        return kBorderTopRightRadiusProperty;
      }
      return kNoneProperty;

    case 25:
      if (base::LowerCaseEqualsASCII(
              property_name,
              GetPropertyName(kAnimationIterationCountProperty))) {
        return kAnimationIterationCountProperty;
      }
      if (base::LowerCaseEqualsASCII(
              property_name,
              GetPropertyName(kAnimationTimingFunctionProperty))) {
        return kAnimationTimingFunctionProperty;
      }
      if (base::LowerCaseEqualsASCII(
              property_name,
              GetPropertyName(kBorderBottomLeftRadiusProperty))) {
        return kBorderBottomLeftRadiusProperty;
      }
      return kNoneProperty;

    case 26:
      if (base::LowerCaseEqualsASCII(
              property_name,
              GetPropertyName(kBorderBottomRightRadiusProperty))) {
        return kBorderBottomRightRadiusProperty;
      }
      if (base::LowerCaseEqualsASCII(
              property_name,
              GetPropertyName(kTransitionTimingFunctionProperty))) {
        return kTransitionTimingFunctionProperty;
      }
      return kNoneProperty;

    case 33:
      if (base::LowerCaseEqualsASCII(
              property_name,
              GetPropertyName(kIntersectionObserverRootMarginProperty))) {
        return kIntersectionObserverRootMarginProperty;
      }
      return kNoneProperty;

    default:
      return kNoneProperty;
  }
}  // NOLINT(readability/fn_size)

// NOLINTNEXTLINE(readability/fn_size)
}  // namespace cssom
// NOLINTNEXTLINE(readability/fn_size)
}  // namespace cobalt
