// 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 <vector>

#include "base/bind.h"
#include "base/lazy_instance.h"
#include "base/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_declared_style(kImpactsChildDeclaredStyleNo),
        impacts_box_generation(kImpactsBoxGenerationNo),
        impacts_box_sizes(kImpactsBoxSizesNo),
        impacts_box_cross_references(kImpactsBoxCrossReferencesNo) {}

  const char* name;
  Inherited inherited;
  Animatable animatable;
  ImpactsChildDeclaredStyle impacts_child_declared_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,
      ImpactsChildDeclaredStyle impacts_child_declared_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_declared_style = impacts_child_declared_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() {
  scoped_ptr<TimeListValue::Builder> time_list(new TimeListValue::Builder());
  time_list->push_back(base::TimeDelta());
  return make_scoped_refptr(new TimeListValue(time_list.Pass()));
}

scoped_refptr<PropertyKeyListValue> CreatePropertyKeyListWithAll() {
  scoped_ptr<PropertyKeyListValue::Builder> property_list(
      new PropertyKeyListValue::Builder());
  property_list->push_back(kAllProperty);
  return make_scoped_refptr(new PropertyKeyListValue(property_list.Pass()));
}

scoped_refptr<TimingFunctionListValue>
CreateTransitionTimingFunctionListWithEase() {
  scoped_ptr<TimingFunctionListValue::Builder> timing_function_list(
      new TimingFunctionListValue::Builder());
  timing_function_list->push_back(TimingFunction::GetEase());
  return make_scoped_refptr(
      new TimingFunctionListValue(timing_function_list.Pass()));
}

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

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

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

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

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

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

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

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

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

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

  // https://www.w3.org/TR/css3-background/#the-background-position
  scoped_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(background_position_builder.Pass()));
  SetPropertyDefinition(kBackgroundPositionProperty, "background-position",
                        kInheritedNo, kAnimatableNo,
                        kImpactsChildDeclaredStyleNo, 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
  scoped_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(background_repeat_builder.Pass()));
  SetPropertyDefinition(
      kBackgroundRepeatProperty, "background-repeat", kInheritedNo,
      kAnimatableNo, kImpactsChildDeclaredStyleNo, 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/css3-background/#background-size
  scoped_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(background_size_builder.Pass()));
  SetPropertyDefinition(
      kBackgroundSizeProperty, "background-size", kInheritedNo, kAnimatableNo,
      kImpactsChildDeclaredStyleNo, 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,
      kImpactsChildDeclaredStyleNo, kImpactsBoxGenerationNo, kImpactsBoxSizesNo,
      kImpactsBoxCrossReferencesNo, KeywordValue::GetCurrentColor());

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

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

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

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

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

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

  SetPropertyDefinition(kBorderLeftStyleProperty, "border-left-style",
                        kInheritedNo, kAnimatableNo,
                        kImpactsChildDeclaredStyleNo, 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,
                        kImpactsChildDeclaredStyleNo, kImpactsBoxGenerationNo,
                        kImpactsBoxSizesYes, kImpactsBoxCrossReferencesNo,
                        new LengthValue(3, kPixelsUnit));

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

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

  SetPropertyDefinition(kBorderLeftWidthProperty, "border-left-width",
                        kInheritedNo, kAnimatableNo,
                        kImpactsChildDeclaredStyleNo, 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,
                        kImpactsChildDeclaredStyleNo, kImpactsBoxGenerationNo,
                        kImpactsBoxSizesNo, kImpactsBoxCrossReferencesNo,
                        new LengthValue(0, kPixelsUnit));

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

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

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

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

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

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

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

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

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

  // Varies by platform in Chromium, Roboto in Cobalt.
  //   https://www.w3.org/TR/css3-fonts/#font-family-prop
  SetPropertyDefinition(
      kFontFamilyProperty, "font-family", kInheritedYes, kAnimatableNo,
      kImpactsChildDeclaredStyleNo, 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, kImpactsChildDeclaredStyleYes,
                        kImpactsBoxGenerationYes, kImpactsBoxSizesYes,
                        kImpactsBoxCrossReferencesNo,
                        new LengthValue(16, kPixelsUnit));

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  // https://www.w3.org/TR/CSS21/box.html#padding-properties
  SetPropertyDefinition(kPaddingTopProperty, "padding-top", kInheritedNo,
                        kAnimatableNo, kImpactsChildDeclaredStyleNo,
                        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, kImpactsChildDeclaredStyleNo,
                        kImpactsBoxGenerationNo, kImpactsBoxSizesNo,
                        kImpactsBoxCrossReferencesNo, KeywordValue::GetAuto());

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

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

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

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

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

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

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

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

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

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

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

  // https://www.w3.org/TR/css3-transforms/#propdef-transform-origin
  scoped_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(transform_origin_builder.Pass()));
  SetPropertyDefinition(
      kTransformOriginProperty, "transform-origin", kInheritedNo, kAnimatableNo,
      kImpactsChildDeclaredStyleNo, kImpactsBoxGenerationNo, kImpactsBoxSizesNo,
      kImpactsBoxCrossReferencesNo, transform_origin_list);

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

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

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

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

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

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

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

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

  // https://www.w3.org/TR/CSS21/visuren.html#z-index
  SetPropertyDefinition(kZIndexProperty, "z-index", kInheritedNo, kAnimatableNo,
                        kImpactsChildDeclaredStyleNo, 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,
                        kImpactsChildDeclaredStyleNo, 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,
                        kImpactsChildDeclaredStyleNo, kImpactsBoxGenerationNo,
                        kImpactsBoxSizesNo, kImpactsBoxCrossReferencesNo, NULL);

  //   https://www.w3.org/TR/css3-fonts/#unicode-range-desc
  SetPropertyDefinition(
      kUnicodeRangeProperty, "unicode-range", kInheritedNo, kAnimatableNo,
      kImpactsChildDeclaredStyleNo, 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, kImpactsChildDeclaredStyleNo,
                        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);

  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/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> 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;
}

ImpactsChildDeclaredStyle GetPropertyImpactsChildDeclaredStyle(
    PropertyKey key) {
  DCHECK(!IsShorthandProperty(key));
  DCHECK_GT(key, kNoneProperty);
  DCHECK_LE(key, kMaxEveryPropertyKey);
  return non_trivial_global_variables.Get()
      .properties[key]
      .impacts_child_declared_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 (LowerCaseEqualsASCII(property_name, GetPropertyName(kTopProperty))) {
        return kTopProperty;
      }
      return kNoneProperty;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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