diff --git a/core/fxcrt/css/cfx_csssyntaxparser.cpp b/core/fxcrt/css/cfx_csssyntaxparser.cpp
index ab03e8c..869da99 100644
--- a/core/fxcrt/css/cfx_csssyntaxparser.cpp
+++ b/core/fxcrt/css/cfx_csssyntaxparser.cpp
@@ -27,7 +27,6 @@
 CFX_CSSSyntaxParser::CFX_CSSSyntaxParser(const wchar_t* pBuffer,
                                          int32_t iBufferSize) {
   ASSERT(pBuffer);
-  m_Output.InitWithSize(32);
   m_Input.AttachBuffer(pBuffer, iBufferSize);
 }
 
@@ -75,27 +74,25 @@
           case ',':
             m_Input.MoveNext();
             SwitchMode(SyntaxMode::kSelector);
-            if (m_Output.GetLength() > 0)
+            if (!m_Output.IsEmpty())
               return CFX_CSSSyntaxStatus::kSelector;
             break;
           case '{':
-            if (m_Output.GetLength() > 0) {
-              SaveTextData();
+            if (!m_Output.IsEmpty())
               return CFX_CSSSyntaxStatus::kSelector;
-            }
             m_Input.MoveNext();
             m_ModeStack.push(SyntaxMode::kRuleSet);
             SwitchMode(SyntaxMode::kPropertyName);
             return CFX_CSSSyntaxStatus::kDeclOpen;
           case '/':
             if (m_Input.GetNextChar() == '*') {
-              if (SwitchToComment() > 0)
+              if (SwitchToComment())
                 return CFX_CSSSyntaxStatus::kSelector;
               break;
             }
             FALLTHROUGH;
           default:
-            AppendCharIfNotLeadingBlank(wch);
+            m_Output.AppendCharIfNotLeadingBlank(wch);
             m_Input.MoveNext();
             break;
         }
@@ -115,13 +112,13 @@
             return CFX_CSSSyntaxStatus::kError;
           case '/':
             if (m_Input.GetNextChar() == '*') {
-              if (SwitchToComment() > 0)
+              if (SwitchToComment())
                 return CFX_CSSSyntaxStatus::kPropertyName;
               break;
             }
             FALLTHROUGH;
           default:
-            AppendCharIfNotLeadingBlank(wch);
+            m_Output.AppendCharIfNotLeadingBlank(wch);
             m_Input.MoveNext();
             break;
         }
@@ -136,13 +133,13 @@
             return CFX_CSSSyntaxStatus::kPropertyValue;
           case '/':
             if (m_Input.GetNextChar() == '*') {
-              if (SwitchToComment() > 0)
+              if (SwitchToComment())
                 return CFX_CSSSyntaxStatus::kPropertyValue;
               break;
             }
             FALLTHROUGH;
           default:
-            AppendCharIfNotLeadingBlank(wch);
+            m_Output.AppendCharIfNotLeadingBlank(wch);
             m_Input.MoveNext();
             break;
         }
@@ -159,32 +156,21 @@
         break;
     }
   }
-  if (m_eMode == SyntaxMode::kPropertyValue && m_Output.GetLength() > 0) {
-    SaveTextData();
+  if (m_eMode == SyntaxMode::kPropertyValue && !m_Output.IsEmpty())
     return CFX_CSSSyntaxStatus::kPropertyValue;
-  }
+
   return CFX_CSSSyntaxStatus::kEOS;
 }
 
-void CFX_CSSSyntaxParser::AppendCharIfNotLeadingBlank(wchar_t wch) {
-  if (m_Output.GetLength() > 0 || wch > ' ')
-    m_Output.AppendChar(wch);
-}
-
-void CFX_CSSSyntaxParser::SaveTextData() {
-  m_Output.TrimEnd();
-}
-
 void CFX_CSSSyntaxParser::SwitchMode(SyntaxMode eMode) {
   m_eMode = eMode;
-  SaveTextData();
 }
 
-int32_t CFX_CSSSyntaxParser::SwitchToComment() {
-  int32_t iLength = m_Output.GetLength();
+bool CFX_CSSSyntaxParser::SwitchToComment() {
+  const bool bEmpty = m_Output.IsEmpty();
   m_ModeStack.push(m_eMode);
   SwitchMode(SyntaxMode::kComment);
-  return iLength;
+  return !bEmpty;
 }
 
 bool CFX_CSSSyntaxParser::RestoreMode() {
@@ -197,5 +183,5 @@
 }
 
 WideStringView CFX_CSSSyntaxParser::GetCurrentString() const {
-  return WideStringView(m_Output.GetBuffer(), m_Output.GetLength());
+  return m_Output.GetTrailingBlankTrimmedString();
 }
diff --git a/core/fxcrt/css/cfx_csssyntaxparser.h b/core/fxcrt/css/cfx_csssyntaxparser.h
index 33f3361..361f4ca 100644
--- a/core/fxcrt/css/cfx_csssyntaxparser.h
+++ b/core/fxcrt/css/cfx_csssyntaxparser.h
@@ -47,11 +47,8 @@
   };
 
   void SwitchMode(SyntaxMode eMode);
-  int32_t SwitchToComment();
-
+  bool SwitchToComment();
   bool RestoreMode();
-  void AppendCharIfNotLeadingBlank(wchar_t wch);
-  void SaveTextData();
 
   bool m_bError = false;
   SyntaxMode m_eMode = SyntaxMode::kRuleSet;
diff --git a/core/fxcrt/css/cfx_csstextbuf.cpp b/core/fxcrt/css/cfx_csstextbuf.cpp
index f2f3b94..f907f94 100644
--- a/core/fxcrt/css/cfx_csstextbuf.cpp
+++ b/core/fxcrt/css/cfx_csstextbuf.cpp
@@ -6,44 +6,23 @@
 
 #include "core/fxcrt/css/cfx_csstextbuf.h"
 
-#include "core/fxcrt/fx_memory.h"
-
-CFX_CSSTextBuf::CFX_CSSTextBuf()
-    : m_pBuffer(nullptr), m_iBufLen(0), m_iDatLen(0) {}
-
-CFX_CSSTextBuf::~CFX_CSSTextBuf() {
-  FX_Free(m_pBuffer);
-  m_pBuffer = nullptr;
-  m_iDatLen = m_iBufLen;
+CFX_CSSTextBuf::CFX_CSSTextBuf() {
+  m_Buffer.reserve(32);
 }
 
-void CFX_CSSTextBuf::InitWithSize(int32_t iAllocSize) {
-  ExpandBuf(iAllocSize);
-}
+CFX_CSSTextBuf::~CFX_CSSTextBuf() = default;
 
-void CFX_CSSTextBuf::AppendChar(wchar_t wch) {
-  if (m_iDatLen >= m_iBufLen)
-    ExpandBuf(m_iBufLen * 2);
-
-  m_pBuffer[m_iDatLen++] = wch;
-}
-
-int32_t CFX_CSSTextBuf::TrimEnd() {
-  while (m_iDatLen > 0 && m_pBuffer[m_iDatLen - 1] <= ' ')
-    --m_iDatLen;
-  AppendChar(0);
-  return --m_iDatLen;
-}
-
-void CFX_CSSTextBuf::ExpandBuf(int32_t iDesiredSize) {
-  ASSERT(iDesiredSize > 0);
-  if (m_pBuffer && m_iBufLen == iDesiredSize)
+void CFX_CSSTextBuf::AppendCharIfNotLeadingBlank(wchar_t wch) {
+  if (m_Buffer.empty() && wch <= ' ')
     return;
 
-  if (m_pBuffer)
-    m_pBuffer = FX_Realloc(wchar_t, m_pBuffer, iDesiredSize);
-  else
-    m_pBuffer = FX_Alloc(wchar_t, iDesiredSize);
+  m_Buffer.push_back(wch);
+}
 
-  m_iBufLen = iDesiredSize;
+WideStringView CFX_CSSTextBuf::GetTrailingBlankTrimmedString() const {
+  WideStringView result(m_Buffer);
+  while (!result.IsEmpty() && result.Back() <= ' ')
+    result = result.First(result.GetLength() - 1);
+
+  return result;
 }
diff --git a/core/fxcrt/css/cfx_csstextbuf.h b/core/fxcrt/css/cfx_csstextbuf.h
index e1b9c64..c504fa7 100644
--- a/core/fxcrt/css/cfx_csstextbuf.h
+++ b/core/fxcrt/css/cfx_csstextbuf.h
@@ -7,29 +7,22 @@
 #ifndef CORE_FXCRT_CSS_CFX_CSSTEXTBUF_H_
 #define CORE_FXCRT_CSS_CFX_CSSTEXTBUF_H_
 
-#include "core/fxcrt/fx_system.h"
+#include <vector>
+
+#include "core/fxcrt/fx_string.h"
 
 class CFX_CSSTextBuf {
  public:
   CFX_CSSTextBuf();
   ~CFX_CSSTextBuf();
 
-  void InitWithSize(int32_t iAllocSize);
-  void AppendChar(wchar_t wch);
-
-  void Clear() { m_iDatLen = 0; }
-
-  int32_t TrimEnd();
-
-  int32_t GetLength() const { return m_iDatLen; }
-  const wchar_t* GetBuffer() const { return m_pBuffer; }
+  void Clear() { m_Buffer.clear(); }
+  bool IsEmpty() const { return m_Buffer.empty(); }
+  void AppendCharIfNotLeadingBlank(wchar_t wch);
+  WideStringView GetTrailingBlankTrimmedString() const;
 
  protected:
-  void ExpandBuf(int32_t iDesiredSize);
-
-  wchar_t* m_pBuffer;
-  int32_t m_iBufLen;
-  int32_t m_iDatLen;
+  std::vector<wchar_t> m_Buffer;
 };
 
 #endif  // CORE_FXCRT_CSS_CFX_CSSTEXTBUF_H_
