Generate CSS property tables via macros

Avoid requirement to manually keep enums in sync.

-- Test that ordering requirements are obeyed.

Change-Id: Icedd93f7dd2d4883edd97531fe4230668a377f52
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/93130
Reviewed-by: Lei Zhang <thestig@chromium.org>
Commit-Queue: Tom Sepez <tsepez@chromium.org>
diff --git a/core/fxcrt/css/BUILD.gn b/core/fxcrt/css/BUILD.gn
index 26903f9..9e6dbf2 100644
--- a/core/fxcrt/css/BUILD.gn
+++ b/core/fxcrt/css/BUILD.gn
@@ -64,6 +64,7 @@
 
 pdfium_unittest_source_set("unittests") {
   sources = [
+    "cfx_cssdata_unittest.cpp",
     "cfx_cssdeclaration_unittest.cpp",
     "cfx_cssstylesheet_unittest.cpp",
     "cfx_csssyntaxparser_unittest.cpp",
diff --git a/core/fxcrt/css/cfx_css.h b/core/fxcrt/css/cfx_css.h
index a6e3109..243b523 100644
--- a/core/fxcrt/css/cfx_css.h
+++ b/core/fxcrt/css/cfx_css.h
@@ -23,99 +23,19 @@
 };
 using CFX_CSSValueTypeMask = std::underlying_type<CFX_CSSVALUETYPE>::type;
 
-// Any entries added/removed here, will need to be mirrored in
-// propertyValueTable, in core/fxcrt/css/cfx_cssdata.cpp.
-enum class CFX_CSSPropertyValue : uint8_t {
-  Bolder = 0,
-  None,
-  Dot,
-  Sub,
-  Top,
-  Right,
-  Normal,
-  Auto,
-  Text,
-  XSmall,
-  Thin,
-  Small,
-  Bottom,
-  Underline,
-  Double,
-  Lighter,
-  Oblique,
-  Super,
-  Center,
-  XxLarge,
-  Smaller,
-  Baseline,
-  Thick,
-  Justify,
-  Middle,
-  Medium,
-  ListItem,
-  XxSmall,
-  Bold,
-  SmallCaps,
-  Inline,
-  Overline,
-  TextBottom,
-  Larger,
-  InlineTable,
-  InlineBlock,
-  Blink,
-  Block,
-  Italic,
-  LineThrough,
-  XLarge,
-  Large,
-  Left,
-  TextTop,
-};
-
-// Any entries added/removed here, will need to be mirrored in
-// propertyTable, in core/fxcrt/css/cfx_cssdata.cpp.
+#undef CSS_PROP____
+#define CSS_PROP____(a, b, c, d) a,
 enum class CFX_CSSProperty : uint8_t {
-  BorderLeft = 0,
-  Top,
-  Margin,
-  TextIndent,
-  Right,
-  PaddingLeft,
-  MarginLeft,
-  Border,
-  BorderTop,
-  Bottom,
-  PaddingRight,
-  BorderBottom,
-  FontFamily,
-  FontWeight,
-  Color,
-  LetterSpacing,
-  TextAlign,
-  BorderRightWidth,
-  VerticalAlign,
-  PaddingTop,
-  FontVariant,
-  BorderWidth,
-  BorderBottomWidth,
-  BorderRight,
-  FontSize,
-  BorderSpacing,
-  FontStyle,
-  Font,
-  LineHeight,
-  MarginRight,
-  BorderLeftWidth,
-  Display,
-  PaddingBottom,
-  BorderTopWidth,
-  WordSpacing,
-  Left,
-  TextDecoration,
-  Padding,
-  MarginBottom,
-  MarginTop,
+#include "core/fxcrt/css/properties.inc"
 };
+#undef CSS_PROP____
+
+#undef CSS_PROP_VALUE____
+#define CSS_PROP_VALUE____(a, b, c) a,
+enum class CFX_CSSPropertyValue : uint8_t {
+#include "core/fxcrt/css/property_values.inc"
+};
+#undef CSS_PROP_VALUE____
 
 enum class CFX_CSSLengthUnit : uint8_t {
   Auto,
diff --git a/core/fxcrt/css/cfx_cssdata.cpp b/core/fxcrt/css/cfx_cssdata.cpp
index dca0719..5789b09 100644
--- a/core/fxcrt/css/cfx_cssdata.cpp
+++ b/core/fxcrt/css/cfx_cssdata.cpp
@@ -16,246 +16,19 @@
 
 namespace {
 
-#undef PROP
-#define PROP(a, b, c, d) a, c, d
-
+#undef CSS_PROP____
+#define CSS_PROP____(a, b, c, d) {CFX_CSSProperty::a, c, d},
 const CFX_CSSData::Property propertyTable[] = {
-    {PROP(CFX_CSSProperty::BorderLeft,
-          "border-left",
-          0x04080036,
-          CFX_CSSVALUETYPE_Shorthand)},
-    {PROP(CFX_CSSProperty::Top,
-          "top",
-          0x0BEDAF33,
-          CFX_CSSVALUETYPE_Primitive | CFX_CSSVALUETYPE_MaybeEnum |
-              CFX_CSSVALUETYPE_MaybeNumber)},
-    {PROP(CFX_CSSProperty::Margin,
-          "margin",
-          0x0CB016BE,
-          CFX_CSSVALUETYPE_List | CFX_CSSVALUETYPE_MaybeEnum |
-              CFX_CSSVALUETYPE_MaybeNumber)},
-    {PROP(CFX_CSSProperty::TextIndent,
-          "text-indent",
-          0x169ADB74,
-          CFX_CSSVALUETYPE_Primitive | CFX_CSSVALUETYPE_MaybeNumber)},
-    {PROP(CFX_CSSProperty::Right,
-          "right",
-          0x193ADE3E,
-          CFX_CSSVALUETYPE_Primitive | CFX_CSSVALUETYPE_MaybeEnum |
-              CFX_CSSVALUETYPE_MaybeNumber)},
-    {PROP(CFX_CSSProperty::PaddingLeft,
-          "padding-left",
-          0x228CF02F,
-          CFX_CSSVALUETYPE_Primitive | CFX_CSSVALUETYPE_MaybeNumber)},
-    {PROP(CFX_CSSProperty::MarginLeft,
-          "margin-left",
-          0x297C5656,
-          CFX_CSSVALUETYPE_Primitive | CFX_CSSVALUETYPE_MaybeNumber |
-              CFX_CSSVALUETYPE_MaybeEnum)},
-    {PROP(CFX_CSSProperty::Border,
-          "border",
-          0x2A23349E,
-          CFX_CSSVALUETYPE_Shorthand)},
-    {PROP(CFX_CSSProperty::BorderTop,
-          "border-top",
-          0x2B866ADE,
-          CFX_CSSVALUETYPE_Shorthand)},
-    {PROP(CFX_CSSProperty::Bottom,
-          "bottom",
-          0x399F02B5,
-          CFX_CSSVALUETYPE_Primitive | CFX_CSSVALUETYPE_MaybeEnum |
-              CFX_CSSVALUETYPE_MaybeNumber)},
-    {PROP(CFX_CSSProperty::PaddingRight,
-          "padding-right",
-          0x3F616AC2,
-          CFX_CSSVALUETYPE_Primitive | CFX_CSSVALUETYPE_MaybeNumber)},
-    {PROP(CFX_CSSProperty::BorderBottom,
-          "border-bottom",
-          0x452CE780,
-          CFX_CSSVALUETYPE_Shorthand)},
-    {PROP(CFX_CSSProperty::FontFamily,
-          "font-family",
-          0x574686E6,
-          CFX_CSSVALUETYPE_List | CFX_CSSVALUETYPE_MaybeString)},
-    {PROP(CFX_CSSProperty::FontWeight,
-          "font-weight",
-          0x6692F60C,
-          CFX_CSSVALUETYPE_Primitive | CFX_CSSVALUETYPE_MaybeEnum |
-              CFX_CSSVALUETYPE_MaybeNumber)},
-    {PROP(CFX_CSSProperty::Color,
-          "color",
-          0x6E67921F,
-          CFX_CSSVALUETYPE_Primitive | CFX_CSSVALUETYPE_MaybeEnum |
-              CFX_CSSVALUETYPE_MaybeColor)},
-    {PROP(CFX_CSSProperty::LetterSpacing,
-          "letter-spacing",
-          0x70536102,
-          CFX_CSSVALUETYPE_Primitive | CFX_CSSVALUETYPE_MaybeEnum |
-              CFX_CSSVALUETYPE_MaybeNumber)},
-    {PROP(CFX_CSSProperty::TextAlign,
-          "text-align",
-          0x7553F1BD,
-          CFX_CSSVALUETYPE_Primitive | CFX_CSSVALUETYPE_MaybeEnum)},
-    {PROP(CFX_CSSProperty::BorderRightWidth,
-          "border-right-width",
-          0x8F5A6036,
-          CFX_CSSVALUETYPE_Primitive | CFX_CSSVALUETYPE_MaybeEnum |
-              CFX_CSSVALUETYPE_MaybeNumber)},
-    {PROP(CFX_CSSProperty::VerticalAlign,
-          "vertical-align",
-          0x934A87D2,
-          CFX_CSSVALUETYPE_Primitive | CFX_CSSVALUETYPE_MaybeEnum |
-              CFX_CSSVALUETYPE_MaybeNumber)},
-    {PROP(CFX_CSSProperty::PaddingTop,
-          "padding-top",
-          0x959D22B7,
-          CFX_CSSVALUETYPE_Primitive | CFX_CSSVALUETYPE_MaybeNumber)},
-    {PROP(CFX_CSSProperty::FontVariant,
-          "font-variant",
-          0x9C785779,
-          CFX_CSSVALUETYPE_Primitive | CFX_CSSVALUETYPE_MaybeEnum)},
-    {PROP(CFX_CSSProperty::BorderWidth,
-          "border-width",
-          0xA8DE4FEB,
-          CFX_CSSVALUETYPE_List | CFX_CSSVALUETYPE_MaybeEnum |
-              CFX_CSSVALUETYPE_MaybeNumber)},
-    {PROP(CFX_CSSProperty::BorderBottomWidth,
-          "border-bottom-width",
-          0xAE41204D,
-          CFX_CSSVALUETYPE_Primitive | CFX_CSSVALUETYPE_MaybeEnum |
-              CFX_CSSVALUETYPE_MaybeNumber)},
-    {PROP(CFX_CSSProperty::BorderRight,
-          "border-right",
-          0xB78E9EA9,
-          CFX_CSSVALUETYPE_Shorthand)},
-    {PROP(CFX_CSSProperty::FontSize,
-          "font-size",
-          0xB93956DF,
-          CFX_CSSVALUETYPE_Primitive | CFX_CSSVALUETYPE_MaybeEnum |
-              CFX_CSSVALUETYPE_MaybeNumber)},
-    {PROP(CFX_CSSProperty::BorderSpacing,
-          "border-spacing",
-          0xC72030F0,
-          CFX_CSSVALUETYPE_List | CFX_CSSVALUETYPE_MaybeNumber)},
-    {PROP(CFX_CSSProperty::FontStyle,
-          "font-style",
-          0xCB1950F5,
-          CFX_CSSVALUETYPE_Primitive | CFX_CSSVALUETYPE_MaybeEnum)},
-    {PROP(CFX_CSSProperty::Font,
-          "font",
-          0xCD308B77,
-          CFX_CSSVALUETYPE_Shorthand)},
-    {PROP(CFX_CSSProperty::LineHeight,
-          "line-height",
-          0xCFCACE2E,
-          CFX_CSSVALUETYPE_Primitive | CFX_CSSVALUETYPE_MaybeEnum |
-              CFX_CSSVALUETYPE_MaybeNumber)},
-    {PROP(CFX_CSSProperty::MarginRight,
-          "margin-right",
-          0xD13C58C9,
-          CFX_CSSVALUETYPE_Primitive | CFX_CSSVALUETYPE_MaybeNumber |
-              CFX_CSSVALUETYPE_MaybeEnum)},
-    {PROP(CFX_CSSProperty::BorderLeftWidth,
-          "border-left-width",
-          0xD1E93D83,
-          CFX_CSSVALUETYPE_Primitive | CFX_CSSVALUETYPE_MaybeEnum |
-              CFX_CSSVALUETYPE_MaybeNumber)},
-    {PROP(CFX_CSSProperty::Display,
-          "display",
-          0xD4224C36,
-          CFX_CSSVALUETYPE_Primitive | CFX_CSSVALUETYPE_MaybeEnum)},
-    {PROP(CFX_CSSProperty::PaddingBottom,
-          "padding-bottom",
-          0xE555B3B9,
-          CFX_CSSVALUETYPE_Primitive | CFX_CSSVALUETYPE_MaybeNumber)},
-    {PROP(CFX_CSSProperty::BorderTopWidth,
-          "border-top-width",
-          0xED2CB62B,
-          CFX_CSSVALUETYPE_Primitive | CFX_CSSVALUETYPE_MaybeEnum |
-              CFX_CSSVALUETYPE_MaybeNumber)},
-    {PROP(CFX_CSSProperty::WordSpacing,
-          "word-spacing",
-          0xEDA63BAE,
-          CFX_CSSVALUETYPE_Primitive | CFX_CSSVALUETYPE_MaybeEnum |
-              CFX_CSSVALUETYPE_MaybeNumber)},
-    {PROP(CFX_CSSProperty::Left,
-          "left",
-          0xF5AD782B,
-          CFX_CSSVALUETYPE_Primitive | CFX_CSSVALUETYPE_MaybeEnum |
-              CFX_CSSVALUETYPE_MaybeNumber)},
-    {PROP(CFX_CSSProperty::TextDecoration,
-          "text-decoration",
-          0xF7C634BA,
-          CFX_CSSVALUETYPE_List | CFX_CSSVALUETYPE_MaybeEnum)},
-    {PROP(CFX_CSSProperty::Padding,
-          "padding",
-          0xF8C373F7,
-          CFX_CSSVALUETYPE_List | CFX_CSSVALUETYPE_MaybeNumber)},
-    {PROP(CFX_CSSProperty::MarginBottom,
-          "margin-bottom",
-          0xF93485A0,
-          CFX_CSSVALUETYPE_Primitive | CFX_CSSVALUETYPE_MaybeNumber |
-              CFX_CSSVALUETYPE_MaybeEnum)},
-    {PROP(CFX_CSSProperty::MarginTop,
-          "margin-top",
-          0xFE51DCFE,
-          CFX_CSSVALUETYPE_Primitive | CFX_CSSVALUETYPE_MaybeNumber |
-              CFX_CSSVALUETYPE_MaybeEnum)},
+#include "core/fxcrt/css/properties.inc"
 };
+#undef CSS_PROP____
 
-#undef PROP
-
-#undef PVAL
-#define PVAL(a, b, c) a, c
-
+#undef CSS_PROP_VALUE____
+#define CSS_PROP_VALUE____(a, b, c) {CFX_CSSPropertyValue::a, c},
 const CFX_CSSData::PropertyValue propertyValueTable[] = {
-    {PVAL(CFX_CSSPropertyValue::Bolder, "bolder", 0x009F1058)},
-    {PVAL(CFX_CSSPropertyValue::None, "none", 0x048B6670)},
-    {PVAL(CFX_CSSPropertyValue::Dot, "dot", 0x0A48CB27)},
-    {PVAL(CFX_CSSPropertyValue::Sub, "sub", 0x0BD37FAA)},
-    {PVAL(CFX_CSSPropertyValue::Top, "top", 0x0BEDAF33)},
-    {PVAL(CFX_CSSPropertyValue::Right, "right", 0x193ADE3E)},
-    {PVAL(CFX_CSSPropertyValue::Normal, "normal", 0x247CF3E9)},
-    {PVAL(CFX_CSSPropertyValue::Auto, "auto", 0x2B35B6D9)},
-    {PVAL(CFX_CSSPropertyValue::Text, "text", 0x2D08AF85)},
-    {PVAL(CFX_CSSPropertyValue::XSmall, "x-small", 0x2D2FCAFE)},
-    {PVAL(CFX_CSSPropertyValue::Thin, "thin", 0x2D574D53)},
-    {PVAL(CFX_CSSPropertyValue::Small, "small", 0x316A3739)},
-    {PVAL(CFX_CSSPropertyValue::Bottom, "bottom", 0x399F02B5)},
-    {PVAL(CFX_CSSPropertyValue::Underline, "underline", 0x3A0273A6)},
-    {PVAL(CFX_CSSPropertyValue::Double, "double", 0x3D98515B)},
-    {PVAL(CFX_CSSPropertyValue::Lighter, "lighter", 0x45BEB7AF)},
-    {PVAL(CFX_CSSPropertyValue::Oblique, "oblique", 0x53EBDDB1)},
-    {PVAL(CFX_CSSPropertyValue::Super, "super", 0x6A4F842F)},
-    {PVAL(CFX_CSSPropertyValue::Center, "center", 0x6C51AFC1)},
-    {PVAL(CFX_CSSPropertyValue::XxLarge, "xx-large", 0x70BB1508)},
-    {PVAL(CFX_CSSPropertyValue::Smaller, "smaller", 0x849769F0)},
-    {PVAL(CFX_CSSPropertyValue::Baseline, "baseline", 0x87436BA3)},
-    {PVAL(CFX_CSSPropertyValue::Thick, "thick", 0x8CC35EB3)},
-    {PVAL(CFX_CSSPropertyValue::Justify, "justify", 0x8D269CAE)},
-    {PVAL(CFX_CSSPropertyValue::Middle, "middle", 0x947FA00F)},
-    {PVAL(CFX_CSSPropertyValue::Medium, "medium", 0xA084A381)},
-    {PVAL(CFX_CSSPropertyValue::ListItem, "list-item", 0xA32382B8)},
-    {PVAL(CFX_CSSPropertyValue::XxSmall, "xx-small", 0xADE1FC76)},
-    {PVAL(CFX_CSSPropertyValue::Bold, "bold", 0xB18313A1)},
-    {PVAL(CFX_CSSPropertyValue::SmallCaps, "small-caps", 0xB299428D)},
-    {PVAL(CFX_CSSPropertyValue::Inline, "inline", 0xC02D649F)},
-    {PVAL(CFX_CSSPropertyValue::Overline, "overline", 0xC0EC9FA4)},
-    {PVAL(CFX_CSSPropertyValue::TextBottom, "text-bottom", 0xC7D08D87)},
-    {PVAL(CFX_CSSPropertyValue::Larger, "larger", 0xCD3C409D)},
-    {PVAL(CFX_CSSPropertyValue::InlineTable, "inline-table", 0xD131F494)},
-    {PVAL(CFX_CSSPropertyValue::InlineBlock, "inline-block", 0xD26A8BD7)},
-    {PVAL(CFX_CSSPropertyValue::Blink, "blink", 0xDC36E390)},
-    {PVAL(CFX_CSSPropertyValue::Block, "block", 0xDCD480AB)},
-    {PVAL(CFX_CSSPropertyValue::Italic, "italic", 0xE31D5396)},
-    {PVAL(CFX_CSSPropertyValue::LineThrough, "line-through", 0xE4C5A276)},
-    {PVAL(CFX_CSSPropertyValue::XLarge, "x-large", 0xF008E390)},
-    {PVAL(CFX_CSSPropertyValue::Large, "large", 0xF4434FCB)},
-    {PVAL(CFX_CSSPropertyValue::Left, "left", 0xF5AD782B)},
-    {PVAL(CFX_CSSPropertyValue::TextTop, "text-top", 0xFCB58D45)},
+#include "core/fxcrt/css/property_values.inc"
 };
-
-#undef PVAL
+#undef CSS_PROP_VALUE____
 
 const CFX_CSSData::LengthUnit lengthUnitTable[] = {
     {L"cm", CFX_CSSNumberValue::Unit::kCentiMeters},
diff --git a/core/fxcrt/css/cfx_cssdata_unittest.cpp b/core/fxcrt/css/cfx_cssdata_unittest.cpp
new file mode 100644
index 0000000..98a985e
--- /dev/null
+++ b/core/fxcrt/css/cfx_cssdata_unittest.cpp
@@ -0,0 +1,34 @@
+// Copyright 2022 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "core/fxcrt/css/cfx_cssdata.h"
+
+#include "core/fxcrt/bytestring.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+TEST(CSSDataTest, PropertyHashes) {
+  uint32_t max_hash = 0;
+#undef CSS_PROP____
+#define CSS_PROP____(a, b, c, d)                                       \
+  {                                                                    \
+    EXPECT_EQ(FX_HashCode_GetAsIfW(b), static_cast<uint32_t>(c)) << b; \
+    EXPECT_GT(static_cast<uint32_t>(c), max_hash) << b;                \
+    max_hash = c;                                                      \
+  }
+#include "core/fxcrt/css/properties.inc"
+#undef CSS_PROP____
+}
+
+TEST(CSSDataTest, PropertyValueHashes) {
+  uint32_t max_hash = 0;
+#undef CSS_PROP_VALUE____
+#define CSS_PROP_VALUE____(a, b, c)                                    \
+  {                                                                    \
+    EXPECT_EQ(FX_HashCode_GetAsIfW(b), static_cast<uint32_t>(c)) << b; \
+    EXPECT_GT(static_cast<uint32_t>(c), max_hash) << b;                \
+    max_hash = c;                                                      \
+  }
+#include "core/fxcrt/css/property_values.inc"
+#undef CSS_PROP_VALUE____
+}
diff --git a/core/fxcrt/css/properties.inc b/core/fxcrt/css/properties.inc
new file mode 100644
index 0000000..03aa6ad
--- /dev/null
+++ b/core/fxcrt/css/properties.inc
@@ -0,0 +1,188 @@
+// Copyright 2022 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+CSS_PROP____(BorderLeft,
+             "border-left",
+             0x04080036,
+             CFX_CSSVALUETYPE_Shorthand)
+CSS_PROP____(Top,
+             "top",
+             0x0BEDAF33,
+             CFX_CSSVALUETYPE_Primitive | CFX_CSSVALUETYPE_MaybeEnum |
+             CFX_CSSVALUETYPE_MaybeNumber)
+CSS_PROP____(Margin,
+             "margin",
+             0x0CB016BE,
+             CFX_CSSVALUETYPE_List | CFX_CSSVALUETYPE_MaybeEnum |
+             CFX_CSSVALUETYPE_MaybeNumber)
+CSS_PROP____(TextIndent,
+             "text-indent",
+             0x169ADB74,
+             CFX_CSSVALUETYPE_Primitive | CFX_CSSVALUETYPE_MaybeNumber)
+CSS_PROP____(Right,
+             "right",
+             0x193ADE3E,
+             CFX_CSSVALUETYPE_Primitive | CFX_CSSVALUETYPE_MaybeEnum |
+             CFX_CSSVALUETYPE_MaybeNumber)
+CSS_PROP____(PaddingLeft,
+             "padding-left",
+             0x228CF02F,
+             CFX_CSSVALUETYPE_Primitive | CFX_CSSVALUETYPE_MaybeNumber)
+CSS_PROP____(MarginLeft,
+             "margin-left",
+             0x297C5656,
+             CFX_CSSVALUETYPE_Primitive | CFX_CSSVALUETYPE_MaybeNumber |
+             CFX_CSSVALUETYPE_MaybeEnum)
+CSS_PROP____(Border,
+             "border",
+             0x2A23349E,
+             CFX_CSSVALUETYPE_Shorthand)
+CSS_PROP____(BorderTop,
+             "border-top",
+             0x2B866ADE,
+             CFX_CSSVALUETYPE_Shorthand)
+CSS_PROP____(Bottom,
+             "bottom",
+             0x399F02B5,
+             CFX_CSSVALUETYPE_Primitive | CFX_CSSVALUETYPE_MaybeEnum |
+             CFX_CSSVALUETYPE_MaybeNumber)
+CSS_PROP____(PaddingRight,
+             "padding-right",
+             0x3F616AC2,
+             CFX_CSSVALUETYPE_Primitive | CFX_CSSVALUETYPE_MaybeNumber)
+CSS_PROP____(BorderBottom,
+             "border-bottom",
+             0x452CE780,
+             CFX_CSSVALUETYPE_Shorthand)
+CSS_PROP____(FontFamily,
+             "font-family",
+             0x574686E6,
+             CFX_CSSVALUETYPE_List | CFX_CSSVALUETYPE_MaybeString)
+CSS_PROP____(FontWeight,
+             "font-weight",
+             0x6692F60C,
+             CFX_CSSVALUETYPE_Primitive | CFX_CSSVALUETYPE_MaybeEnum |
+             CFX_CSSVALUETYPE_MaybeNumber)
+CSS_PROP____(Color,
+             "color",
+             0x6E67921F,
+             CFX_CSSVALUETYPE_Primitive | CFX_CSSVALUETYPE_MaybeEnum |
+             CFX_CSSVALUETYPE_MaybeColor)
+CSS_PROP____(LetterSpacing,
+             "letter-spacing",
+             0x70536102,
+             CFX_CSSVALUETYPE_Primitive | CFX_CSSVALUETYPE_MaybeEnum |
+             CFX_CSSVALUETYPE_MaybeNumber)
+CSS_PROP____(TextAlign,
+             "text-align",
+             0x7553F1BD,
+             CFX_CSSVALUETYPE_Primitive | CFX_CSSVALUETYPE_MaybeEnum)
+CSS_PROP____(BorderRightWidth,
+             "border-right-width",
+             0x8F5A6036,
+             CFX_CSSVALUETYPE_Primitive | CFX_CSSVALUETYPE_MaybeEnum |
+             CFX_CSSVALUETYPE_MaybeNumber)
+CSS_PROP____(VerticalAlign,
+             "vertical-align",
+             0x934A87D2,
+             CFX_CSSVALUETYPE_Primitive | CFX_CSSVALUETYPE_MaybeEnum |
+             CFX_CSSVALUETYPE_MaybeNumber)
+CSS_PROP____(PaddingTop,
+             "padding-top",
+             0x959D22B7,
+             CFX_CSSVALUETYPE_Primitive | CFX_CSSVALUETYPE_MaybeNumber)
+CSS_PROP____(FontVariant,
+             "font-variant",
+             0x9C785779,
+             CFX_CSSVALUETYPE_Primitive | CFX_CSSVALUETYPE_MaybeEnum)
+CSS_PROP____(BorderWidth,
+             "border-width",
+             0xA8DE4FEB,
+             CFX_CSSVALUETYPE_List | CFX_CSSVALUETYPE_MaybeEnum |
+             CFX_CSSVALUETYPE_MaybeNumber)
+CSS_PROP____(BorderBottomWidth,
+             "border-bottom-width",
+             0xAE41204D,
+             CFX_CSSVALUETYPE_Primitive | CFX_CSSVALUETYPE_MaybeEnum |
+             CFX_CSSVALUETYPE_MaybeNumber)
+CSS_PROP____(BorderRight,
+             "border-right",
+             0xB78E9EA9,
+             CFX_CSSVALUETYPE_Shorthand)
+CSS_PROP____(FontSize,
+             "font-size",
+             0xB93956DF,
+             CFX_CSSVALUETYPE_Primitive | CFX_CSSVALUETYPE_MaybeEnum |
+             CFX_CSSVALUETYPE_MaybeNumber)
+CSS_PROP____(BorderSpacing,
+             "border-spacing",
+             0xC72030F0,
+             CFX_CSSVALUETYPE_List | CFX_CSSVALUETYPE_MaybeNumber)
+CSS_PROP____(FontStyle,
+             "font-style",
+             0xCB1950F5,
+             CFX_CSSVALUETYPE_Primitive | CFX_CSSVALUETYPE_MaybeEnum)
+CSS_PROP____(Font,
+             "font",
+             0xCD308B77,
+             CFX_CSSVALUETYPE_Shorthand)
+CSS_PROP____(LineHeight,
+             "line-height",
+             0xCFCACE2E,
+             CFX_CSSVALUETYPE_Primitive | CFX_CSSVALUETYPE_MaybeEnum |
+             CFX_CSSVALUETYPE_MaybeNumber)
+CSS_PROP____(MarginRight,
+             "margin-right",
+             0xD13C58C9,
+             CFX_CSSVALUETYPE_Primitive | CFX_CSSVALUETYPE_MaybeNumber |
+             CFX_CSSVALUETYPE_MaybeEnum)
+CSS_PROP____(BorderLeftWidth,
+             "border-left-width",
+             0xD1E93D83,
+             CFX_CSSVALUETYPE_Primitive | CFX_CSSVALUETYPE_MaybeEnum |
+             CFX_CSSVALUETYPE_MaybeNumber)
+CSS_PROP____(Display,
+             "display",
+             0xD4224C36,
+             CFX_CSSVALUETYPE_Primitive | CFX_CSSVALUETYPE_MaybeEnum)
+CSS_PROP____(PaddingBottom,
+             "padding-bottom",
+             0xE555B3B9,
+             CFX_CSSVALUETYPE_Primitive | CFX_CSSVALUETYPE_MaybeNumber)
+CSS_PROP____(BorderTopWidth,
+             "border-top-width",
+             0xED2CB62B,
+             CFX_CSSVALUETYPE_Primitive | CFX_CSSVALUETYPE_MaybeEnum |
+             CFX_CSSVALUETYPE_MaybeNumber)
+CSS_PROP____(WordSpacing,
+             "word-spacing",
+             0xEDA63BAE,
+             CFX_CSSVALUETYPE_Primitive | CFX_CSSVALUETYPE_MaybeEnum |
+             CFX_CSSVALUETYPE_MaybeNumber)
+CSS_PROP____(Left,
+             "left",
+             0xF5AD782B,
+             CFX_CSSVALUETYPE_Primitive | CFX_CSSVALUETYPE_MaybeEnum |
+             CFX_CSSVALUETYPE_MaybeNumber)
+CSS_PROP____(TextDecoration,
+             "text-decoration",
+             0xF7C634BA,
+             CFX_CSSVALUETYPE_List | CFX_CSSVALUETYPE_MaybeEnum)
+CSS_PROP____(Padding,
+             "padding",
+             0xF8C373F7,
+             CFX_CSSVALUETYPE_List | CFX_CSSVALUETYPE_MaybeNumber)
+CSS_PROP____(MarginBottom,
+             "margin-bottom",
+             0xF93485A0,
+             CFX_CSSVALUETYPE_Primitive | CFX_CSSVALUETYPE_MaybeNumber |
+             CFX_CSSVALUETYPE_MaybeEnum)
+CSS_PROP____(MarginTop,
+             "margin-top",
+             0xFE51DCFE,
+             CFX_CSSVALUETYPE_Primitive | CFX_CSSVALUETYPE_MaybeNumber |
+             CFX_CSSVALUETYPE_MaybeEnum)
+
diff --git a/core/fxcrt/css/property_values.inc b/core/fxcrt/css/property_values.inc
new file mode 100644
index 0000000..2a5ad01
--- /dev/null
+++ b/core/fxcrt/css/property_values.inc
@@ -0,0 +1,50 @@
+// Copyright 2022 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+CSS_PROP_VALUE____(Bolder, "bolder", 0x009F1058)
+CSS_PROP_VALUE____(None, "none", 0x048B6670)
+CSS_PROP_VALUE____(Dot, "dot", 0x0A48CB27)
+CSS_PROP_VALUE____(Sub, "sub", 0x0BD37FAA)
+CSS_PROP_VALUE____(Top, "top", 0x0BEDAF33)
+CSS_PROP_VALUE____(Right, "right", 0x193ADE3E)
+CSS_PROP_VALUE____(Normal, "normal", 0x247CF3E9)
+CSS_PROP_VALUE____(Auto, "auto", 0x2B35B6D9)
+CSS_PROP_VALUE____(Text, "text", 0x2D08AF85)
+CSS_PROP_VALUE____(XSmall, "x-small", 0x2D2FCAFE)
+CSS_PROP_VALUE____(Thin, "thin", 0x2D574D53)
+CSS_PROP_VALUE____(Small, "small", 0x316A3739)
+CSS_PROP_VALUE____(Bottom, "bottom", 0x399F02B5)
+CSS_PROP_VALUE____(Underline, "underline", 0x3A0273A6)
+CSS_PROP_VALUE____(Double, "double", 0x3D98515B)
+CSS_PROP_VALUE____(Lighter, "lighter", 0x45BEB7AF)
+CSS_PROP_VALUE____(Oblique, "oblique", 0x53EBDDB1)
+CSS_PROP_VALUE____(Super, "super", 0x6A4F842F)
+CSS_PROP_VALUE____(Center, "center", 0x6C51AFC1)
+CSS_PROP_VALUE____(XxLarge, "xx-large", 0x70BB1508)
+CSS_PROP_VALUE____(Smaller, "smaller", 0x849769F0)
+CSS_PROP_VALUE____(Baseline, "baseline", 0x87436BA3)
+CSS_PROP_VALUE____(Thick, "thick", 0x8CC35EB3)
+CSS_PROP_VALUE____(Justify, "justify", 0x8D269CAE)
+CSS_PROP_VALUE____(Middle, "middle", 0x947FA00F)
+CSS_PROP_VALUE____(Medium, "medium", 0xA084A381)
+CSS_PROP_VALUE____(ListItem, "list-item", 0xA32382B8)
+CSS_PROP_VALUE____(XxSmall, "xx-small", 0xADE1FC76)
+CSS_PROP_VALUE____(Bold, "bold", 0xB18313A1)
+CSS_PROP_VALUE____(SmallCaps, "small-caps", 0xB299428D)
+CSS_PROP_VALUE____(Inline, "inline", 0xC02D649F)
+CSS_PROP_VALUE____(Overline, "overline", 0xC0EC9FA4)
+CSS_PROP_VALUE____(TextBottom, "text-bottom", 0xC7D08D87)
+CSS_PROP_VALUE____(Larger, "larger", 0xCD3C409D)
+CSS_PROP_VALUE____(InlineTable, "inline-table", 0xD131F494)
+CSS_PROP_VALUE____(InlineBlock, "inline-block", 0xD26A8BD7)
+CSS_PROP_VALUE____(Blink, "blink", 0xDC36E390)
+CSS_PROP_VALUE____(Block, "block", 0xDCD480AB)
+CSS_PROP_VALUE____(Italic, "italic", 0xE31D5396)
+CSS_PROP_VALUE____(LineThrough, "line-through", 0xE4C5A276)
+CSS_PROP_VALUE____(XLarge, "x-large", 0xF008E390)
+CSS_PROP_VALUE____(Large, "large", 0xF4434FCB)
+CSS_PROP_VALUE____(Left, "left", 0xF5AD782B)
+CSS_PROP_VALUE____(TextTop, "text-top", 0xFCB58D45)