diff --git a/core/fxcrt/css/cfx_css.h b/core/fxcrt/css/cfx_css.h
index 1c21586..534ed1f 100644
--- a/core/fxcrt/css/cfx_css.h
+++ b/core/fxcrt/css/cfx_css.h
@@ -20,16 +20,6 @@
   CFX_CSSVALUETYPE_MaybeColor = 1 << 8
 };
 
-enum class CFX_CSSPrimitiveType : uint8_t {
-  Unknown = 0,
-  Number,
-  String,
-  RGB,
-  Enum,
-  Function,
-  List,
-};
-
 // 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 {
diff --git a/core/fxcrt/css/cfx_csscolorvalue.cpp b/core/fxcrt/css/cfx_csscolorvalue.cpp
index 587ee5b..990ba4f 100644
--- a/core/fxcrt/css/cfx_csscolorvalue.cpp
+++ b/core/fxcrt/css/cfx_csscolorvalue.cpp
@@ -7,6 +7,6 @@
 #include "core/fxcrt/css/cfx_csscolorvalue.h"
 
 CFX_CSSColorValue::CFX_CSSColorValue(FX_ARGB value)
-    : CFX_CSSValue(CFX_CSSPrimitiveType::RGB), value_(value) {}
+    : CFX_CSSValue(PrimitiveType::kRGB), value_(value) {}
 
 CFX_CSSColorValue::~CFX_CSSColorValue() = default;
diff --git a/core/fxcrt/css/cfx_cssdeclaration.cpp b/core/fxcrt/css/cfx_cssdeclaration.cpp
index 35bf63e..823659d 100644
--- a/core/fxcrt/css/cfx_cssdeclaration.cpp
+++ b/core/fxcrt/css/cfx_cssdeclaration.cpp
@@ -111,12 +111,12 @@
 
     uint8_t rgb[3] = {0};
     float fValue;
-    CFX_CSSPrimitiveType eType;
+    CFX_CSSValue::PrimitiveType eType;
     CFX_CSSValueListParser list(pszValue + 4, iValueLen - 5, ',');
     for (int32_t i = 0; i < 3; ++i) {
       if (!list.NextValue(&eType, &pszValue, &iValueLen))
         return false;
-      if (eType != CFX_CSSPrimitiveType::Number)
+      if (eType != CFX_CSSValue::PrimitiveType::kNumber)
         return false;
       CFX_CSSNumberValue::Unit eNumType;
       if (!ParseCSSNumber(pszValue, iValueLen, &fValue, &eNumType))
@@ -333,11 +333,11 @@
   CFX_CSSValueListParser parser(pszValue, iValueLen, separator);
 
   const uint32_t dwType = pProperty->dwType;
-  CFX_CSSPrimitiveType eType;
+  CFX_CSSValue::PrimitiveType eType;
   std::vector<RetainPtr<CFX_CSSValue>> list;
   while (parser.NextValue(&eType, &pszValue, &iValueLen)) {
     switch (eType) {
-      case CFX_CSSPrimitiveType::Number:
+      case CFX_CSSValue::PrimitiveType::kNumber:
         if (dwType & CFX_CSSVALUETYPE_MaybeNumber) {
           float fValue;
           CFX_CSSNumberValue::Unit eNumType;
@@ -346,7 +346,7 @@
                 pdfium::MakeRetain<CFX_CSSNumberValue>(eNumType, fValue));
         }
         break;
-      case CFX_CSSPrimitiveType::String:
+      case CFX_CSSValue::PrimitiveType::kString:
         if (dwType & CFX_CSSVALUETYPE_MaybeColor) {
           FX_ARGB dwColor;
           if (ParseCSSColor(pszValue, iValueLen, &dwColor)) {
@@ -368,7 +368,7 @@
               WideString(pszValue, iValueLen)));
         }
         break;
-      case CFX_CSSPrimitiveType::RGB:
+      case CFX_CSSValue::PrimitiveType::kRGB:
         if (dwType & CFX_CSSVALUETYPE_MaybeColor) {
           FX_ARGB dwColor;
           if (ParseCSSColor(pszValue, iValueLen, &dwColor)) {
@@ -453,11 +453,11 @@
     RetainPtr<CFX_CSSValue>& pWidth) const {
   pWidth.Reset(nullptr);
 
+  CFX_CSSValue::PrimitiveType eType;
   CFX_CSSValueListParser parser(pszValue, iValueLen, ' ');
-  CFX_CSSPrimitiveType eType;
   while (parser.NextValue(&eType, &pszValue, &iValueLen)) {
     switch (eType) {
-      case CFX_CSSPrimitiveType::Number: {
+      case CFX_CSSValue::PrimitiveType::kNumber: {
         if (pWidth)
           continue;
 
@@ -467,7 +467,7 @@
           pWidth = pdfium::MakeRetain<CFX_CSSNumberValue>(eNumType, fValue);
         break;
       }
-      case CFX_CSSPrimitiveType::String: {
+      case CFX_CSSValue::PrimitiveType::kString: {
         const CFX_CSSData::Color* pColorItem =
             CFX_CSSData::GetColorByName(WideStringView(pszValue, iValueLen));
         if (pColorItem)
@@ -512,10 +512,10 @@
   RetainPtr<CFX_CSSValue> pFontSize;
   RetainPtr<CFX_CSSValue> pLineHeight;
   std::vector<RetainPtr<CFX_CSSValue>> family_list;
-  CFX_CSSPrimitiveType eType;
+  CFX_CSSValue::PrimitiveType eType;
   while (parser.NextValue(&eType, &pszValue, &iValueLen)) {
     switch (eType) {
-      case CFX_CSSPrimitiveType::String: {
+      case CFX_CSSValue::PrimitiveType::kString: {
         const CFX_CSSData::PropertyValue* pValue =
             CFX_CSSData::GetPropertyValueByName(
                 WideStringView(pszValue, iValueLen));
@@ -572,12 +572,12 @@
         parser.UseCommaSeparator();
         break;
       }
-      case CFX_CSSPrimitiveType::Number: {
+      case CFX_CSSValue::PrimitiveType::kNumber: {
         float fValue;
         CFX_CSSNumberValue::Unit eNumType;
         if (!ParseCSSNumber(pszValue, iValueLen, &fValue, &eNumType))
           break;
-        if (eType == CFX_CSSPrimitiveType::Number) {
+        if (eType == CFX_CSSValue::PrimitiveType::kNumber) {
           switch (static_cast<int32_t>(fValue)) {
             case 100:
             case 200:
diff --git a/core/fxcrt/css/cfx_cssenumvalue.cpp b/core/fxcrt/css/cfx_cssenumvalue.cpp
index f45a605..8127227 100644
--- a/core/fxcrt/css/cfx_cssenumvalue.cpp
+++ b/core/fxcrt/css/cfx_cssenumvalue.cpp
@@ -7,6 +7,6 @@
 #include "core/fxcrt/css/cfx_cssenumvalue.h"
 
 CFX_CSSEnumValue::CFX_CSSEnumValue(CFX_CSSPropertyValue value)
-    : CFX_CSSValue(CFX_CSSPrimitiveType::Enum), value_(value) {}
+    : CFX_CSSValue(PrimitiveType::kEnum), value_(value) {}
 
 CFX_CSSEnumValue::~CFX_CSSEnumValue() = default;
diff --git a/core/fxcrt/css/cfx_cssnumbervalue.cpp b/core/fxcrt/css/cfx_cssnumbervalue.cpp
index abb9901..78d53ea 100644
--- a/core/fxcrt/css/cfx_cssnumbervalue.cpp
+++ b/core/fxcrt/css/cfx_cssnumbervalue.cpp
@@ -7,7 +7,7 @@
 #include "core/fxcrt/css/cfx_cssnumbervalue.h"
 
 CFX_CSSNumberValue::CFX_CSSNumberValue(Unit unit, float value)
-    : CFX_CSSValue(CFX_CSSPrimitiveType::Number), unit_(unit), value_(value) {
+    : CFX_CSSValue(PrimitiveType::kNumber), unit_(unit), value_(value) {
   if (unit_ == Unit::kNumber && fabs(value_) < 0.001f)
     value_ = 0.0f;
 }
diff --git a/core/fxcrt/css/cfx_cssstringvalue.cpp b/core/fxcrt/css/cfx_cssstringvalue.cpp
index 1c8fb5d..edb1486 100644
--- a/core/fxcrt/css/cfx_cssstringvalue.cpp
+++ b/core/fxcrt/css/cfx_cssstringvalue.cpp
@@ -7,6 +7,6 @@
 #include "core/fxcrt/css/cfx_cssstringvalue.h"
 
 CFX_CSSStringValue::CFX_CSSStringValue(const WideString& value)
-    : CFX_CSSValue(CFX_CSSPrimitiveType::String), value_(value) {}
+    : CFX_CSSValue(PrimitiveType::kString), value_(value) {}
 
 CFX_CSSStringValue::~CFX_CSSStringValue() = default;
diff --git a/core/fxcrt/css/cfx_cssstyleselector.cpp b/core/fxcrt/css/cfx_cssstyleselector.cpp
index 772407c..78ad2da 100644
--- a/core/fxcrt/css/cfx_cssstyleselector.cpp
+++ b/core/fxcrt/css/cfx_cssstyleselector.cpp
@@ -173,26 +173,26 @@
 void CFX_CSSStyleSelector::ApplyProperty(CFX_CSSProperty eProperty,
                                          const RetainPtr<CFX_CSSValue>& pValue,
                                          CFX_CSSComputedStyle* pComputedStyle) {
-  if (pValue->GetType() != CFX_CSSPrimitiveType::List) {
-    CFX_CSSPrimitiveType eType = pValue->GetType();
+  if (pValue->GetType() != CFX_CSSValue::PrimitiveType::kList) {
+    CFX_CSSValue::PrimitiveType eType = pValue->GetType();
     switch (eProperty) {
       case CFX_CSSProperty::Display:
-        if (eType == CFX_CSSPrimitiveType::Enum) {
+        if (eType == CFX_CSSValue::PrimitiveType::kEnum) {
           pComputedStyle->m_NonInheritedData.m_eDisplay =
               ToDisplay(pValue.As<CFX_CSSEnumValue>()->Value());
         }
         break;
       case CFX_CSSProperty::FontSize: {
         float& fFontSize = pComputedStyle->m_InheritedData.m_fFontSize;
-        if (eType == CFX_CSSPrimitiveType::Number) {
+        if (eType == CFX_CSSValue::PrimitiveType::kNumber) {
           fFontSize = pValue.As<CFX_CSSNumberValue>()->Apply(fFontSize);
-        } else if (eType == CFX_CSSPrimitiveType::Enum) {
+        } else if (eType == CFX_CSSValue::PrimitiveType::kEnum) {
           fFontSize =
               ToFontSize(pValue.As<CFX_CSSEnumValue>()->Value(), fFontSize);
         }
       } break;
       case CFX_CSSProperty::LineHeight:
-        if (eType == CFX_CSSPrimitiveType::Number) {
+        if (eType == CFX_CSSValue::PrimitiveType::kNumber) {
           RetainPtr<CFX_CSSNumberValue> v = pValue.As<CFX_CSSNumberValue>();
           if (v->unit() == CFX_CSSNumberValue::Unit::kNumber) {
             pComputedStyle->m_InheritedData.m_fLineHeight =
@@ -204,7 +204,7 @@
         }
         break;
       case CFX_CSSProperty::TextAlign:
-        if (eType == CFX_CSSPrimitiveType::Enum) {
+        if (eType == CFX_CSSValue::PrimitiveType::kEnum) {
           pComputedStyle->m_InheritedData.m_eTextAlign =
               ToTextAlign(pValue.As<CFX_CSSEnumValue>()->Value());
         }
@@ -215,10 +215,10 @@
                              pComputedStyle->m_InheritedData.m_fFontSize);
         break;
       case CFX_CSSProperty::FontWeight:
-        if (eType == CFX_CSSPrimitiveType::Enum) {
+        if (eType == CFX_CSSValue::PrimitiveType::kEnum) {
           pComputedStyle->m_InheritedData.m_wFontWeight =
               ToFontWeight(pValue.As<CFX_CSSEnumValue>()->Value());
-        } else if (eType == CFX_CSSPrimitiveType::Number) {
+        } else if (eType == CFX_CSSValue::PrimitiveType::kNumber) {
           int32_t iValue =
               static_cast<int32_t>(pValue.As<CFX_CSSNumberValue>()->value()) /
               100;
@@ -228,13 +228,13 @@
         }
         break;
       case CFX_CSSProperty::FontStyle:
-        if (eType == CFX_CSSPrimitiveType::Enum) {
+        if (eType == CFX_CSSValue::PrimitiveType::kEnum) {
           pComputedStyle->m_InheritedData.m_eFontStyle =
               ToFontStyle(pValue.As<CFX_CSSEnumValue>()->Value());
         }
         break;
       case CFX_CSSProperty::Color:
-        if (eType == CFX_CSSPrimitiveType::RGB) {
+        if (eType == CFX_CSSValue::PrimitiveType::kRGB) {
           pComputedStyle->m_InheritedData.m_dwFontColor =
               pValue.As<CFX_CSSColorValue>()->Value();
         }
@@ -324,10 +324,10 @@
         }
         break;
       case CFX_CSSProperty::VerticalAlign:
-        if (eType == CFX_CSSPrimitiveType::Enum) {
+        if (eType == CFX_CSSValue::PrimitiveType::kEnum) {
           pComputedStyle->m_NonInheritedData.m_eVerticalAlignType =
               ToVerticalAlign(pValue.As<CFX_CSSEnumValue>()->Value());
-        } else if (eType == CFX_CSSPrimitiveType::Number) {
+        } else if (eType == CFX_CSSValue::PrimitiveType::kNumber) {
           pComputedStyle->m_NonInheritedData.m_eVerticalAlignType =
               CFX_CSSVerticalAlign::Number;
           pComputedStyle->m_NonInheritedData.m_fVerticalAlign =
@@ -336,16 +336,16 @@
         }
         break;
       case CFX_CSSProperty::FontVariant:
-        if (eType == CFX_CSSPrimitiveType::Enum) {
+        if (eType == CFX_CSSValue::PrimitiveType::kEnum) {
           pComputedStyle->m_InheritedData.m_eFontVariant =
               ToFontVariant(pValue.As<CFX_CSSEnumValue>()->Value());
         }
         break;
       case CFX_CSSProperty::LetterSpacing:
-        if (eType == CFX_CSSPrimitiveType::Enum) {
+        if (eType == CFX_CSSValue::PrimitiveType::kEnum) {
           pComputedStyle->m_InheritedData.m_LetterSpacing.Set(
               CFX_CSSLengthUnit::Normal);
-        } else if (eType == CFX_CSSPrimitiveType::Number) {
+        } else if (eType == CFX_CSSValue::PrimitiveType::kNumber) {
           if (pValue.As<CFX_CSSNumberValue>()->unit() ==
               CFX_CSSNumberValue::Unit::kPercent) {
             break;
@@ -357,10 +357,10 @@
         }
         break;
       case CFX_CSSProperty::WordSpacing:
-        if (eType == CFX_CSSPrimitiveType::Enum) {
+        if (eType == CFX_CSSValue::PrimitiveType::kEnum) {
           pComputedStyle->m_InheritedData.m_WordSpacing.Set(
               CFX_CSSLengthUnit::Normal);
-        } else if (eType == CFX_CSSPrimitiveType::Number) {
+        } else if (eType == CFX_CSSValue::PrimitiveType::kNumber) {
           if (pValue.As<CFX_CSSNumberValue>()->unit() ==
               CFX_CSSNumberValue::Unit::kPercent) {
             break;
@@ -393,7 +393,7 @@
       default:
         break;
     }
-  } else if (pValue->GetType() == CFX_CSSPrimitiveType::List) {
+  } else if (pValue->GetType() == CFX_CSSValue::PrimitiveType::kList) {
     RetainPtr<CFX_CSSValueList> value_list = pValue.As<CFX_CSSValueList>();
     if (!value_list->values().empty()) {
       switch (eProperty) {
@@ -473,10 +473,10 @@
 
 bool CFX_CSSStyleSelector::SetLengthWithPercent(
     CFX_CSSLength& width,
-    CFX_CSSPrimitiveType eType,
+    CFX_CSSValue::PrimitiveType eType,
     const RetainPtr<CFX_CSSValue>& pValue,
     float fFontSize) {
-  if (eType == CFX_CSSPrimitiveType::Number) {
+  if (eType == CFX_CSSValue::PrimitiveType::kNumber) {
     RetainPtr<CFX_CSSNumberValue> v = pValue.As<CFX_CSSNumberValue>();
     if (v->unit() == CFX_CSSNumberValue::Unit::kPercent) {
       width.Set(CFX_CSSLengthUnit::Percent,
@@ -487,7 +487,7 @@
     float fValue = v->Apply(fFontSize);
     width.Set(CFX_CSSLengthUnit::Point, fValue);
     return width.NonZero();
-  } else if (eType == CFX_CSSPrimitiveType::Enum) {
+  } else if (eType == CFX_CSSValue::PrimitiveType::kEnum) {
     switch (pValue.As<CFX_CSSEnumValue>()->Value()) {
       case CFX_CSSPropertyValue::Auto:
         width.Set(CFX_CSSLengthUnit::Auto);
@@ -565,7 +565,7 @@
   uint32_t dwDecoration = 0;
   for (const RetainPtr<CFX_CSSValue>& val :
        pdfium::base::Reversed(pValue->values())) {
-    if (val->GetType() != CFX_CSSPrimitiveType::Enum)
+    if (val->GetType() != CFX_CSSValue::PrimitiveType::kEnum)
       continue;
 
     switch (val.As<CFX_CSSEnumValue>()->Value()) {
diff --git a/core/fxcrt/css/cfx_cssstyleselector.h b/core/fxcrt/css/cfx_cssstyleselector.h
index e0e6861..00d4de8 100644
--- a/core/fxcrt/css/cfx_cssstyleselector.h
+++ b/core/fxcrt/css/cfx_cssstyleselector.h
@@ -12,6 +12,7 @@
 
 #include "core/fxcrt/css/cfx_css.h"
 #include "core/fxcrt/css/cfx_cssrulecollection.h"
+#include "core/fxcrt/css/cfx_cssvalue.h"
 #include "core/fxcrt/fx_system.h"
 #include "core/fxcrt/retain_ptr.h"
 
@@ -21,7 +22,6 @@
 class CFX_CSSPropertyHolder;
 class CFX_CSSSelector;
 class CFX_CSSStyleSheet;
-class CFX_CSSValue;
 class CFX_CSSValueList;
 
 class CFX_CSSStyleSelector {
@@ -64,7 +64,7 @@
                      std::vector<const CFX_CSSCustomProperty*>* custom);
 
   bool SetLengthWithPercent(CFX_CSSLength& width,
-                            CFX_CSSPrimitiveType eType,
+                            CFX_CSSValue::PrimitiveType eType,
                             const RetainPtr<CFX_CSSValue>& pValue,
                             float fFontSize);
   float ToFontSize(CFX_CSSPropertyValue eValue, float fCurFontSize);
diff --git a/core/fxcrt/css/cfx_cssstylesheet_unittest.cpp b/core/fxcrt/css/cfx_cssstylesheet_unittest.cpp
index f470295..315c245 100644
--- a/core/fxcrt/css/cfx_cssstylesheet_unittest.cpp
+++ b/core/fxcrt/css/cfx_cssstylesheet_unittest.cpp
@@ -62,7 +62,7 @@
 
     bool important;
     RetainPtr<CFX_CSSValue> v = decl_->GetProperty(prop, &important);
-    EXPECT_EQ(v->GetType(), CFX_CSSPrimitiveType::Number);
+    EXPECT_EQ(v->GetType(), CFX_CSSValue::PrimitiveType::kNumber);
     EXPECT_EQ(v.As<CFX_CSSNumberValue>()->unit(), unit);
     EXPECT_EQ(v.As<CFX_CSSNumberValue>()->value(), val);
   }
@@ -72,7 +72,7 @@
 
     bool important;
     RetainPtr<CFX_CSSValue> v = decl_->GetProperty(prop, &important);
-    EXPECT_EQ(v->GetType(), CFX_CSSPrimitiveType::Enum);
+    EXPECT_EQ(v->GetType(), CFX_CSSValue::PrimitiveType::kEnum);
     EXPECT_EQ(v.As<CFX_CSSEnumValue>()->Value(), val);
   }
 
@@ -89,7 +89,7 @@
 
     for (size_t i = 0; i < expected_values.size(); ++i) {
       const auto& val = values[i];
-      EXPECT_EQ(val->GetType(), CFX_CSSPrimitiveType::Enum);
+      EXPECT_EQ(val->GetType(), CFX_CSSValue::PrimitiveType::kEnum);
       EXPECT_EQ(val.As<CFX_CSSEnumValue>()->Value(), expected_values[i]);
     }
   }
diff --git a/core/fxcrt/css/cfx_cssvalue.cpp b/core/fxcrt/css/cfx_cssvalue.cpp
index a55fc74..1ffabf5 100644
--- a/core/fxcrt/css/cfx_cssvalue.cpp
+++ b/core/fxcrt/css/cfx_cssvalue.cpp
@@ -6,4 +6,6 @@
 
 #include "core/fxcrt/css/cfx_cssvalue.h"
 
-CFX_CSSValue::CFX_CSSValue(CFX_CSSPrimitiveType type) : m_value(type) {}
+CFX_CSSValue::CFX_CSSValue(PrimitiveType type) : m_value(type) {}
+
+CFX_CSSValue::~CFX_CSSValue() = default;
diff --git a/core/fxcrt/css/cfx_cssvalue.h b/core/fxcrt/css/cfx_cssvalue.h
index 30aace2..b6f7130 100644
--- a/core/fxcrt/css/cfx_cssvalue.h
+++ b/core/fxcrt/css/cfx_cssvalue.h
@@ -12,13 +12,24 @@
 
 class CFX_CSSValue : public Retainable {
  public:
-  CFX_CSSPrimitiveType GetType() const { return m_value; }
+  enum class PrimitiveType : uint8_t {
+    kUnknown = 0,
+    kNumber,
+    kString,
+    kRGB,
+    kEnum,
+    kFunction,
+    kList,
+  };
+
+  PrimitiveType GetType() const { return m_value; }
 
  protected:
-  explicit CFX_CSSValue(CFX_CSSPrimitiveType type);
+  explicit CFX_CSSValue(PrimitiveType type);
+  ~CFX_CSSValue() override;
 
  private:
-  CFX_CSSPrimitiveType m_value;
+  const PrimitiveType m_value;
 };
 
 #endif  // CORE_FXCRT_CSS_CFX_CSSVALUE_H_
diff --git a/core/fxcrt/css/cfx_cssvaluelist.cpp b/core/fxcrt/css/cfx_cssvaluelist.cpp
index 2f34ecc..0c2f0c6 100644
--- a/core/fxcrt/css/cfx_cssvaluelist.cpp
+++ b/core/fxcrt/css/cfx_cssvaluelist.cpp
@@ -11,6 +11,6 @@
 #include "core/fxcrt/css/cfx_css.h"
 
 CFX_CSSValueList::CFX_CSSValueList(std::vector<RetainPtr<CFX_CSSValue>> list)
-    : CFX_CSSValue(CFX_CSSPrimitiveType::List), list_(std::move(list)) {}
+    : CFX_CSSValue(PrimitiveType::kList), list_(std::move(list)) {}
 
 CFX_CSSValueList::~CFX_CSSValueList() = default;
diff --git a/core/fxcrt/css/cfx_cssvaluelistparser.cpp b/core/fxcrt/css/cfx_cssvaluelistparser.cpp
index 8fb10ac..af6aa3c 100644
--- a/core/fxcrt/css/cfx_cssvaluelistparser.cpp
+++ b/core/fxcrt/css/cfx_cssvaluelistparser.cpp
@@ -17,7 +17,7 @@
   DCHECK(iLen > 0);
 }
 
-bool CFX_CSSValueListParser::NextValue(CFX_CSSPrimitiveType* eType,
+bool CFX_CSSValueListParser::NextValue(CFX_CSSValue::PrimitiveType* eType,
                                        const wchar_t** pStart,
                                        int32_t* iLength) {
   while (m_pCur < m_pEnd && (*m_pCur <= ' ' || *m_pCur == m_Separator))
@@ -26,36 +26,36 @@
   if (m_pCur >= m_pEnd)
     return false;
 
-  *eType = CFX_CSSPrimitiveType::Unknown;
+  *eType = CFX_CSSValue::PrimitiveType::kUnknown;
   *pStart = m_pCur;
   *iLength = 0;
   wchar_t wch = *m_pCur;
   if (wch == '#') {
     *iLength = SkipTo(' ', false, false);
     if (*iLength == 4 || *iLength == 7)
-      *eType = CFX_CSSPrimitiveType::RGB;
+      *eType = CFX_CSSValue::PrimitiveType::kRGB;
   } else if (FXSYS_IsDecimalDigit(wch) || wch == '.' || wch == '-' ||
              wch == '+') {
     while (m_pCur < m_pEnd && (*m_pCur > ' ' && *m_pCur != m_Separator))
       ++m_pCur;
 
     *iLength = m_pCur - *pStart;
-    *eType = CFX_CSSPrimitiveType::Number;
+    *eType = CFX_CSSValue::PrimitiveType::kNumber;
   } else if (wch == '\"' || wch == '\'') {
     ++(*pStart);
     m_pCur++;
     *iLength = SkipTo(wch, false, false);
     m_pCur++;
-    *eType = CFX_CSSPrimitiveType::String;
+    *eType = CFX_CSSValue::PrimitiveType::kString;
   } else if (m_pEnd - m_pCur > 5 && m_pCur[3] == '(') {
     if (FXSYS_wcsnicmp(L"rgb", m_pCur, 3) == 0) {
       *iLength = SkipTo(')', false, false) + 1;
       m_pCur++;
-      *eType = CFX_CSSPrimitiveType::RGB;
+      *eType = CFX_CSSValue::PrimitiveType::kRGB;
     }
   } else {
     *iLength = SkipTo(m_Separator, true, true);
-    *eType = CFX_CSSPrimitiveType::String;
+    *eType = CFX_CSSValue::PrimitiveType::kString;
   }
   return m_pCur <= m_pEnd && *iLength > 0;
 }
diff --git a/core/fxcrt/css/cfx_cssvaluelistparser.h b/core/fxcrt/css/cfx_cssvaluelistparser.h
index 6872ee2..a47d065 100644
--- a/core/fxcrt/css/cfx_cssvaluelistparser.h
+++ b/core/fxcrt/css/cfx_cssvaluelistparser.h
@@ -7,14 +7,14 @@
 #ifndef CORE_FXCRT_CSS_CFX_CSSVALUELISTPARSER_H_
 #define CORE_FXCRT_CSS_CFX_CSSVALUELISTPARSER_H_
 
-#include "core/fxcrt/css/cfx_css.h"
+#include "core/fxcrt/css/cfx_cssvalue.h"
 #include "core/fxcrt/fx_system.h"
 
 class CFX_CSSValueListParser {
  public:
   CFX_CSSValueListParser(const wchar_t* psz, int32_t iLen, wchar_t separator);
 
-  bool NextValue(CFX_CSSPrimitiveType* eType,
+  bool NextValue(CFX_CSSValue::PrimitiveType* eType,
                  const wchar_t** pStart,
                  int32_t* iLength);
   void UseCommaSeparator() { m_Separator = ','; }
diff --git a/core/fxcrt/css/cfx_cssvaluelistparser_unittest.cpp b/core/fxcrt/css/cfx_cssvaluelistparser_unittest.cpp
index 12765ef..3754247 100644
--- a/core/fxcrt/css/cfx_cssvaluelistparser_unittest.cpp
+++ b/core/fxcrt/css/cfx_cssvaluelistparser_unittest.cpp
@@ -12,115 +12,115 @@
 #include "testing/gtest/include/gtest/gtest.h"
 
 TEST(CFX_CSSValueListParserTest, rgb_short) {
-  CFX_CSSPrimitiveType type;
+  CFX_CSSValue::PrimitiveType type;
   const wchar_t* start;
   int32_t len;
 
   auto parser = std::make_unique<CFX_CSSValueListParser>(L"#abc", 4, L' ');
   EXPECT_TRUE(parser->NextValue(&type, &start, &len));
-  EXPECT_EQ(CFX_CSSPrimitiveType::RGB, type);
+  EXPECT_EQ(CFX_CSSValue::PrimitiveType::kRGB, type);
   EXPECT_EQ(L"#abc", WideString(start, len));
   EXPECT_FALSE(parser->NextValue(&type, &start, &len));
 
   parser = std::make_unique<CFX_CSSValueListParser>(L"#abcdef", 7, L' ');
   EXPECT_TRUE(parser->NextValue(&type, &start, &len));
-  EXPECT_EQ(CFX_CSSPrimitiveType::RGB, type);
+  EXPECT_EQ(CFX_CSSValue::PrimitiveType::kRGB, type);
   EXPECT_EQ(L"#abcdef", WideString(start, len));
   EXPECT_FALSE(parser->NextValue(&type, &start, &len));
 
   parser =
       std::make_unique<CFX_CSSValueListParser>(L"rgb(1, 255, 4)", 14, L' ');
   EXPECT_TRUE(parser->NextValue(&type, &start, &len));
-  EXPECT_EQ(CFX_CSSPrimitiveType::RGB, type);
+  EXPECT_EQ(CFX_CSSValue::PrimitiveType::kRGB, type);
   EXPECT_EQ(L"rgb(1, 255, 4)", WideString(start, len));
 
   parser = std::make_unique<CFX_CSSValueListParser>(L"#abcdefghij", 11, L' ');
   EXPECT_TRUE(parser->NextValue(&type, &start, &len));
-  EXPECT_EQ(CFX_CSSPrimitiveType::Unknown, type);
+  EXPECT_EQ(CFX_CSSValue::PrimitiveType::kUnknown, type);
   EXPECT_EQ(L"#abcdefghij", WideString(start, len));
   EXPECT_FALSE(parser->NextValue(&type, &start, &len));
 }
 
 TEST(CFX_CSSValueListParserTest, number_parsing) {
-  CFX_CSSPrimitiveType type;
+  CFX_CSSValue::PrimitiveType type;
   const wchar_t* start;
   int32_t len;
 
   auto parser = std::make_unique<CFX_CSSValueListParser>(L"1234", 4, L' ');
   EXPECT_TRUE(parser->NextValue(&type, &start, &len));
-  EXPECT_EQ(CFX_CSSPrimitiveType::Number, type);
+  EXPECT_EQ(CFX_CSSValue::PrimitiveType::kNumber, type);
   EXPECT_EQ(L"1234", WideString(start, len));
 
   parser = std::make_unique<CFX_CSSValueListParser>(L"-1234", 5, L' ');
   EXPECT_TRUE(parser->NextValue(&type, &start, &len));
-  EXPECT_EQ(CFX_CSSPrimitiveType::Number, type);
+  EXPECT_EQ(CFX_CSSValue::PrimitiveType::kNumber, type);
   EXPECT_EQ(L"-1234", WideString(start, len));
 
   parser = std::make_unique<CFX_CSSValueListParser>(L"+1234", 5, L' ');
   EXPECT_TRUE(parser->NextValue(&type, &start, &len));
-  EXPECT_EQ(CFX_CSSPrimitiveType::Number, type);
+  EXPECT_EQ(CFX_CSSValue::PrimitiveType::kNumber, type);
   EXPECT_EQ(L"+1234", WideString(start, len));
 
   parser = std::make_unique<CFX_CSSValueListParser>(L".1234", 5, L' ');
   EXPECT_TRUE(parser->NextValue(&type, &start, &len));
-  EXPECT_EQ(CFX_CSSPrimitiveType::Number, type);
+  EXPECT_EQ(CFX_CSSValue::PrimitiveType::kNumber, type);
   EXPECT_EQ(L".1234", WideString(start, len));
 
   parser = std::make_unique<CFX_CSSValueListParser>(L"4321.1234", 9, L' ');
   EXPECT_TRUE(parser->NextValue(&type, &start, &len));
-  EXPECT_EQ(CFX_CSSPrimitiveType::Number, type);
+  EXPECT_EQ(CFX_CSSValue::PrimitiveType::kNumber, type);
   EXPECT_EQ(L"4321.1234", WideString(start, len));
 
   // TODO(dsinclair): These should probably fail but currently don't.
   parser = std::make_unique<CFX_CSSValueListParser>(L"4321.12.34", 10, L' ');
   EXPECT_TRUE(parser->NextValue(&type, &start, &len));
-  EXPECT_EQ(CFX_CSSPrimitiveType::Number, type);
+  EXPECT_EQ(CFX_CSSValue::PrimitiveType::kNumber, type);
   EXPECT_EQ(L"4321.12.34", WideString(start, len));
 
   parser = std::make_unique<CFX_CSSValueListParser>(L"43a1.12.34", 10, L' ');
   EXPECT_TRUE(parser->NextValue(&type, &start, &len));
-  EXPECT_EQ(CFX_CSSPrimitiveType::Number, type);
+  EXPECT_EQ(CFX_CSSValue::PrimitiveType::kNumber, type);
   EXPECT_EQ(L"43a1.12.34", WideString(start, len));
 }
 
 TEST(CFX_CSSValueListParserTest, string_parsing) {
-  CFX_CSSPrimitiveType type;
+  CFX_CSSValue::PrimitiveType type;
   const wchar_t* start;
   int32_t len;
 
   auto parser = std::make_unique<CFX_CSSValueListParser>(L"'string'", 8, L' ');
   EXPECT_TRUE(parser->NextValue(&type, &start, &len));
-  EXPECT_EQ(CFX_CSSPrimitiveType::String, type);
+  EXPECT_EQ(CFX_CSSValue::PrimitiveType::kString, type);
   EXPECT_EQ(L"string", WideString(start, len));
 
   parser =
       std::make_unique<CFX_CSSValueListParser>(L"\"another string\"", 16, L' ');
   EXPECT_TRUE(parser->NextValue(&type, &start, &len));
-  EXPECT_EQ(CFX_CSSPrimitiveType::String, type);
+  EXPECT_EQ(CFX_CSSValue::PrimitiveType::kString, type);
   EXPECT_EQ(L"another string", WideString(start, len));
 
   parser = std::make_unique<CFX_CSSValueListParser>(L"standalone", 10, L' ');
   EXPECT_TRUE(parser->NextValue(&type, &start, &len));
-  EXPECT_EQ(CFX_CSSPrimitiveType::String, type);
+  EXPECT_EQ(CFX_CSSValue::PrimitiveType::kString, type);
   EXPECT_EQ(L"standalone", WideString(start, len));
 }
 
 TEST(CFX_CSSValueListParserTest, multiparsing) {
-  CFX_CSSPrimitiveType type;
+  CFX_CSSValue::PrimitiveType type;
   const wchar_t* start;
   int32_t len;
 
   auto parser = std::make_unique<CFX_CSSValueListParser>(L"1, 2, 3", 7, L',');
   EXPECT_TRUE(parser->NextValue(&type, &start, &len));
-  EXPECT_EQ(CFX_CSSPrimitiveType::Number, type);
+  EXPECT_EQ(CFX_CSSValue::PrimitiveType::kNumber, type);
   EXPECT_EQ(L"1", WideString(start, len));
 
   EXPECT_TRUE(parser->NextValue(&type, &start, &len));
-  EXPECT_EQ(CFX_CSSPrimitiveType::Number, type);
+  EXPECT_EQ(CFX_CSSValue::PrimitiveType::kNumber, type);
   EXPECT_EQ(L"2", WideString(start, len));
 
   EXPECT_TRUE(parser->NextValue(&type, &start, &len));
-  EXPECT_EQ(CFX_CSSPrimitiveType::Number, type);
+  EXPECT_EQ(CFX_CSSValue::PrimitiveType::kNumber, type);
   EXPECT_EQ(L"3", WideString(start, len));
 
   EXPECT_FALSE(parser->NextValue(&type, &start, &len));
@@ -128,14 +128,14 @@
   parser = std::make_unique<CFX_CSSValueListParser>(L"'str', rgb(1, 2, 3), 4",
                                                     22, L',');
   EXPECT_TRUE(parser->NextValue(&type, &start, &len));
-  EXPECT_EQ(CFX_CSSPrimitiveType::String, type);
+  EXPECT_EQ(CFX_CSSValue::PrimitiveType::kString, type);
   EXPECT_EQ(L"str", WideString(start, len));
 
   EXPECT_TRUE(parser->NextValue(&type, &start, &len));
-  EXPECT_EQ(CFX_CSSPrimitiveType::RGB, type);
+  EXPECT_EQ(CFX_CSSValue::PrimitiveType::kRGB, type);
   EXPECT_EQ(L"rgb(1, 2, 3)", WideString(start, len));
 
   EXPECT_TRUE(parser->NextValue(&type, &start, &len));
-  EXPECT_EQ(CFX_CSSPrimitiveType::Number, type);
+  EXPECT_EQ(CFX_CSSValue::PrimitiveType::kNumber, type);
   EXPECT_EQ(L"4", WideString(start, len));
 }
