diff --git a/core/fxcrt/bytestring.cpp b/core/fxcrt/bytestring.cpp
index 716620f..c07218a 100644
--- a/core/fxcrt/bytestring.cpp
+++ b/core/fxcrt/bytestring.cpp
@@ -354,87 +354,18 @@
   return this_len < that_len ? -1 : 1;
 }
 
-void ByteString::Trim() {
-  TrimRight(kTrimChars);
+void ByteString::TrimWhitespace() {
+  TrimWhitespaceRight();
+  TrimWhitespaceLeft();
+}
+
+void ByteString::TrimWhitespaceLeft() {
   TrimLeft(kTrimChars);
 }
 
-void ByteString::Trim(char target) {
-  ByteStringView targets(target);
-  TrimRight(targets);
-  TrimLeft(targets);
-}
-
-void ByteString::Trim(ByteStringView targets) {
-  TrimRight(targets);
-  TrimLeft(targets);
-}
-
-void ByteString::TrimLeft() {
-  TrimLeft(kTrimChars);
-}
-
-void ByteString::TrimLeft(char target) {
-  TrimLeft(ByteStringView(target));
-}
-
-void ByteString::TrimLeft(ByteStringView targets) {
-  if (!m_pData || targets.IsEmpty())
-    return;
-
-  size_t len = GetLength();
-  if (len == 0)
-    return;
-
-  size_t pos = 0;
-  while (pos < len) {
-    size_t i = 0;
-    while (i < targets.GetLength() && targets[i] != m_pData->m_String[pos])
-      i++;
-    if (i == targets.GetLength())
-      break;
-    pos++;
-  }
-  if (pos) {
-    ReallocBeforeWrite(len);
-    size_t nDataLength = len - pos;
-    FXSYS_memmove(m_pData->m_String, m_pData->m_String + pos,
-                  (nDataLength + 1) * sizeof(char));
-    m_pData->m_nDataLength = nDataLength;
-  }
-}
-
-void ByteString::TrimRight() {
+void ByteString::TrimWhitespaceRight() {
   TrimRight(kTrimChars);
 }
-
-void ByteString::TrimRight(char target) {
-  TrimRight(ByteStringView(target));
-}
-
-void ByteString::TrimRight(ByteStringView targets) {
-  if (!m_pData || targets.IsEmpty())
-    return;
-
-  size_t pos = GetLength();
-  if (pos == 0)
-    return;
-
-  while (pos) {
-    size_t i = 0;
-    while (i < targets.GetLength() && targets[i] != m_pData->m_String[pos - 1])
-      i++;
-    if (i == targets.GetLength())
-      break;
-    pos--;
-  }
-  if (pos < m_pData->m_nDataLength) {
-    ReallocBeforeWrite(m_pData->m_nDataLength);
-    m_pData->m_String[pos] = 0;
-    m_pData->m_nDataLength = pos;
-  }
-}
-
 std::ostream& operator<<(std::ostream& os, const ByteString& str) {
   return os.write(str.c_str(), str.GetLength());
 }
diff --git a/core/fxcrt/bytestring.h b/core/fxcrt/bytestring.h
index d6867be..027d1d0 100644
--- a/core/fxcrt/bytestring.h
+++ b/core/fxcrt/bytestring.h
@@ -108,17 +108,10 @@
   void MakeLower();
   void MakeUpper();
 
-  void Trim();
-  void Trim(char target);
-  void Trim(ByteStringView targets);
-
-  void TrimLeft();
-  void TrimLeft(char target);
-  void TrimLeft(ByteStringView targets);
-
-  void TrimRight();
-  void TrimRight(char target);
-  void TrimRight(ByteStringView targets);
+  // Remove a canonical set of characters from the string.
+  void TrimWhitespace();
+  void TrimWhitespaceRight();
+  void TrimWhitespaceLeft();
 
   uint32_t GetID() const { return AsStringView().GetID(); }
 
diff --git a/core/fxcrt/bytestring_unittest.cpp b/core/fxcrt/bytestring_unittest.cpp
index 7b086f0..b7bfd4e 100644
--- a/core/fxcrt/bytestring_unittest.cpp
+++ b/core/fxcrt/bytestring_unittest.cpp
@@ -833,7 +833,7 @@
 
 TEST(ByteString, Trim) {
   ByteString fred("  FRED  ");
-  fred.Trim();
+  fred.TrimWhitespace();
   EXPECT_EQ("FRED", fred);
   fred.Trim('E');
   EXPECT_EQ("FRED", fred);
@@ -847,7 +847,7 @@
   EXPECT_EQ("   ", blank);
   blank.Trim('E');
   EXPECT_EQ("   ", blank);
-  blank.Trim();
+  blank.TrimWhitespace();
   EXPECT_EQ("", blank);
 
   ByteString empty;
@@ -855,7 +855,7 @@
   EXPECT_EQ("", empty);
   empty.Trim('E');
   EXPECT_EQ("", empty);
-  empty.Trim();
+  empty.TrimWhitespace();
   EXPECT_EQ("", empty);
 
   ByteString abc("  ABCCBA  ");
@@ -867,7 +867,7 @@
 
 TEST(ByteString, TrimLeft) {
   ByteString fred("  FRED  ");
-  fred.TrimLeft();
+  fred.TrimWhitespaceLeft();
   EXPECT_EQ("FRED  ", fred);
   fred.TrimLeft('E');
   EXPECT_EQ("FRED  ", fred);
@@ -881,7 +881,7 @@
   EXPECT_EQ("   ", blank);
   blank.TrimLeft('E');
   EXPECT_EQ("   ", blank);
-  blank.TrimLeft();
+  blank.TrimWhitespaceLeft();
   EXPECT_EQ("", blank);
 
   ByteString empty;
@@ -889,7 +889,7 @@
   EXPECT_EQ("", empty);
   empty.TrimLeft('E');
   EXPECT_EQ("", empty);
-  empty.TrimLeft();
+  empty.TrimWhitespaceLeft();
   EXPECT_EQ("", empty);
 }
 
@@ -898,7 +898,7 @@
     // With a single reference, no copy takes place.
     ByteString fred("  FRED  ");
     const char* old_buffer = fred.c_str();
-    fred.TrimLeft();
+    fred.TrimWhitespaceLeft();
     EXPECT_EQ("FRED  ", fred);
     EXPECT_EQ(old_buffer, fred.c_str());
   }
@@ -907,7 +907,7 @@
     ByteString fred("  FRED  ");
     ByteString other_fred = fred;
     const char* old_buffer = fred.c_str();
-    fred.TrimLeft();
+    fred.TrimWhitespaceLeft();
     EXPECT_EQ("FRED  ", fred);
     EXPECT_EQ("  FRED  ", other_fred);
     EXPECT_NE(old_buffer, fred.c_str());
@@ -917,7 +917,7 @@
     ByteString fred("FRED");
     ByteString other_fred = fred;
     const char* old_buffer = fred.c_str();
-    fred.TrimLeft();
+    fred.TrimWhitespaceLeft();
     EXPECT_EQ("FRED", fred);
     EXPECT_EQ("FRED", other_fred);
     EXPECT_EQ(old_buffer, fred.c_str());
@@ -926,7 +926,7 @@
 
 TEST(ByteString, TrimRight) {
   ByteString fred("  FRED  ");
-  fred.TrimRight();
+  fred.TrimWhitespaceRight();
   EXPECT_EQ("  FRED", fred);
   fred.TrimRight('E');
   EXPECT_EQ("  FRED", fred);
@@ -940,7 +940,7 @@
   EXPECT_EQ("   ", blank);
   blank.TrimRight('E');
   EXPECT_EQ("   ", blank);
-  blank.TrimRight();
+  blank.TrimWhitespaceRight();
   EXPECT_EQ("", blank);
 
   ByteString empty;
@@ -948,7 +948,7 @@
   EXPECT_EQ("", empty);
   empty.TrimRight('E');
   EXPECT_EQ("", empty);
-  empty.TrimRight();
+  empty.TrimWhitespaceRight();
   EXPECT_EQ("", empty);
 }
 
@@ -957,7 +957,7 @@
     // With a single reference, no copy takes place.
     ByteString fred("  FRED  ");
     const char* old_buffer = fred.c_str();
-    fred.TrimRight();
+    fred.TrimWhitespaceRight();
     EXPECT_EQ("  FRED", fred);
     EXPECT_EQ(old_buffer, fred.c_str());
   }
@@ -966,7 +966,7 @@
     ByteString fred("  FRED  ");
     ByteString other_fred = fred;
     const char* old_buffer = fred.c_str();
-    fred.TrimRight();
+    fred.TrimWhitespaceRight();
     EXPECT_EQ("  FRED", fred);
     EXPECT_EQ("  FRED  ", other_fred);
     EXPECT_NE(old_buffer, fred.c_str());
@@ -976,7 +976,7 @@
     ByteString fred("FRED");
     ByteString other_fred = fred;
     const char* old_buffer = fred.c_str();
-    fred.TrimRight();
+    fred.TrimWhitespaceRight();
     EXPECT_EQ("FRED", fred);
     EXPECT_EQ("FRED", other_fred);
     EXPECT_EQ(old_buffer, fred.c_str());
diff --git a/core/fxcrt/string_template.cpp b/core/fxcrt/string_template.cpp
index 7d22f46..5915315 100644
--- a/core/fxcrt/string_template.cpp
+++ b/core/fxcrt/string_template.cpp
@@ -227,6 +227,92 @@
 }
 
 template <typename T>
+void StringTemplate<T>::Trim(T ch) {
+  TrimLeft(ch);
+  TrimRight(ch);
+}
+
+template <typename T>
+void StringTemplate<T>::TrimLeft(T ch) {
+  TrimLeft(StringView(ch));
+}
+
+template <typename T>
+void StringTemplate<T>::TrimRight(T ch) {
+  TrimRight(StringView(ch));
+}
+
+template <typename T>
+void StringTemplate<T>::Trim(StringView targets) {
+  TrimLeft(targets);
+  TrimRight(targets);
+}
+
+template <typename T>
+void StringTemplate<T>::TrimLeft(StringView targets) {
+  if (!m_pData || targets.IsEmpty()) {
+    return;
+  }
+
+  size_t len = GetLength();
+  if (len == 0) {
+    return;
+  }
+
+  size_t pos = 0;
+  while (pos < len) {
+    size_t i = 0;
+    while (i < targets.GetLength() &&
+           targets.CharAt(i) != m_pData->m_String[pos]) {
+      i++;
+    }
+    if (i == targets.GetLength()) {
+      break;
+    }
+    pos++;
+  }
+  if (!pos) {
+    return;
+  }
+
+  ReallocBeforeWrite(len);
+  size_t nDataLength = len - pos;
+  // Move the terminating NUL as well.
+  fxcrt::spanmove(m_pData->capacity_span(),
+                  m_pData->capacity_span().subspan(pos, nDataLength + 1));
+  m_pData->m_nDataLength = nDataLength;
+}
+
+template <typename T>
+void StringTemplate<T>::TrimRight(StringView targets) {
+  if (!m_pData || targets.IsEmpty()) {
+    return;
+  }
+
+  size_t pos = GetLength();
+  if (pos == 0) {
+    return;
+  }
+
+  while (pos) {
+    size_t i = 0;
+    while (i < targets.GetLength() &&
+           targets.CharAt(i) != m_pData->m_String[pos - 1]) {
+      i++;
+    }
+    if (i == targets.GetLength()) {
+      break;
+    }
+    pos--;
+  }
+  if (pos < m_pData->m_nDataLength) {
+    ReallocBeforeWrite(m_pData->m_nDataLength);
+    m_pData->m_String[pos] = 0;
+    m_pData->m_nDataLength = pos;
+  }
+}
+
+template <typename T>
 void StringTemplate<T>::ReallocBeforeWrite(size_t nNewLength) {
   if (m_pData && m_pData->CanOperateInPlace(nNewLength)) {
     return;
diff --git a/core/fxcrt/string_template.h b/core/fxcrt/string_template.h
index 0e1af03..1923c87 100644
--- a/core/fxcrt/string_template.h
+++ b/core/fxcrt/string_template.h
@@ -134,6 +134,16 @@
 
   void Reserve(size_t len) { GetBuffer(len); }
 
+  // Remove character `ch` from  both/front/back of string.
+  void Trim(T ch);
+  void TrimLeft(T ch);
+  void TrimRight(T ch);
+
+  // Remove all characters in `targets` from both/front/back of string.
+  void Trim(StringView targets);
+  void TrimLeft(StringView targets);
+  void TrimRight(StringView targets);
+
  protected:
   using StringData = StringDataTemplate<T>;
 
diff --git a/core/fxcrt/widestring.cpp b/core/fxcrt/widestring.cpp
index dfbae22..8af383b 100644
--- a/core/fxcrt/widestring.cpp
+++ b/core/fxcrt/widestring.cpp
@@ -772,84 +772,18 @@
   return (!str || str[0] == 0) ? 0 : -1;
 }
 
-void WideString::Trim() {
-  TrimRight(kWideTrimChars);
+void WideString::TrimWhitespace() {
+  TrimWhitespaceRight();
+  TrimWhitespaceLeft();
+}
+
+void WideString::TrimWhitespaceLeft() {
   TrimLeft(kWideTrimChars);
 }
 
-void WideString::Trim(wchar_t target) {
-  wchar_t str[2] = {target, 0};
-  TrimRight(str);
-  TrimLeft(str);
-}
-
-void WideString::Trim(WideStringView targets) {
-  TrimRight(targets);
-  TrimLeft(targets);
-}
-
-void WideString::TrimLeft() {
-  TrimLeft(kWideTrimChars);
-}
-
-void WideString::TrimLeft(wchar_t target) {
-  wchar_t str[2] = {target, 0};
-  TrimLeft(str);
-}
-
-void WideString::TrimLeft(WideStringView targets) {
-  if (!m_pData || targets.IsEmpty())
-    return;
-
-  size_t len = GetLength();
-  if (len == 0)
-    return;
-
-  size_t pos = 0;
-  while (pos < len) {
-    size_t i = 0;
-    while (i < targets.GetLength() &&
-           targets.CharAt(i) != m_pData->m_String[pos]) {
-      i++;
-    }
-    if (i == targets.GetLength())
-      break;
-    pos++;
-  }
-  if (!pos)
-    return;
-
-  ReallocBeforeWrite(len);
-  size_t nDataLength = len - pos;
-  memmove(m_pData->m_String, m_pData->m_String + pos,
-          (nDataLength + 1) * sizeof(wchar_t));
-  m_pData->m_nDataLength = nDataLength;
-}
-
-void WideString::TrimRight() {
+void WideString::TrimWhitespaceRight() {
   TrimRight(kWideTrimChars);
 }
-
-void WideString::TrimRight(wchar_t target) {
-  wchar_t str[2] = {target, 0};
-  TrimRight(str);
-}
-
-void WideString::TrimRight(WideStringView targets) {
-  if (IsEmpty() || targets.IsEmpty())
-    return;
-
-  size_t pos = GetLength();
-  while (pos && targets.Contains(m_pData->m_String[pos - 1]))
-    pos--;
-
-  if (pos < m_pData->m_nDataLength) {
-    ReallocBeforeWrite(m_pData->m_nDataLength);
-    m_pData->m_String[pos] = 0;
-    m_pData->m_nDataLength = pos;
-  }
-}
-
 int WideString::GetInteger() const {
   return m_pData ? FXSYS_wtoi(m_pData->m_String) : 0;
 }
diff --git a/core/fxcrt/widestring.h b/core/fxcrt/widestring.h
index 22a821f..9a2e231 100644
--- a/core/fxcrt/widestring.h
+++ b/core/fxcrt/widestring.h
@@ -117,17 +117,10 @@
   void MakeLower();
   void MakeUpper();
 
-  void Trim();
-  void Trim(wchar_t target);
-  void Trim(WideStringView targets);
-
-  void TrimLeft();
-  void TrimLeft(wchar_t target);
-  void TrimLeft(WideStringView targets);
-
-  void TrimRight();
-  void TrimRight(wchar_t target);
-  void TrimRight(WideStringView targets);
+  // Trim a canonical set of characters from the widestring.
+  void TrimWhitespace();
+  void TrimWhitespaceLeft();
+  void TrimWhitespaceRight();
 
   int GetInteger() const;
 
diff --git a/core/fxcrt/widestring_unittest.cpp b/core/fxcrt/widestring_unittest.cpp
index f077516..8749eae 100644
--- a/core/fxcrt/widestring_unittest.cpp
+++ b/core/fxcrt/widestring_unittest.cpp
@@ -824,7 +824,7 @@
 
 TEST(WideString, Trim) {
   WideString fred(L"  FRED  ");
-  fred.Trim();
+  fred.TrimWhitespace();
   EXPECT_EQ(L"FRED", fred);
   fred.Trim(L'E');
   EXPECT_EQ(L"FRED", fred);
@@ -838,7 +838,7 @@
   EXPECT_EQ(L"   ", blank);
   blank.Trim(L'E');
   EXPECT_EQ(L"   ", blank);
-  blank.Trim();
+  blank.TrimWhitespace();
   EXPECT_EQ(L"", blank);
 
   WideString empty;
@@ -846,7 +846,7 @@
   EXPECT_EQ(L"", empty);
   empty.Trim(L'E');
   EXPECT_EQ(L"", empty);
-  empty.Trim();
+  empty.TrimWhitespace();
   EXPECT_EQ(L"", empty);
 
   WideString abc(L"  ABCCBA  ");
@@ -858,7 +858,7 @@
 
 TEST(WideString, TrimLeft) {
   WideString fred(L"  FRED  ");
-  fred.TrimLeft();
+  fred.TrimWhitespaceLeft();
   EXPECT_EQ(L"FRED  ", fred);
   fred.TrimLeft(L'E');
   EXPECT_EQ(L"FRED  ", fred);
@@ -872,7 +872,7 @@
   EXPECT_EQ(L"   ", blank);
   blank.TrimLeft(L'E');
   EXPECT_EQ(L"   ", blank);
-  blank.TrimLeft();
+  blank.TrimWhitespaceLeft();
   EXPECT_EQ(L"", blank);
 
   WideString empty;
@@ -880,7 +880,7 @@
   EXPECT_EQ(L"", empty);
   empty.TrimLeft(L'E');
   EXPECT_EQ(L"", empty);
-  empty.TrimLeft();
+  empty.TrimWhitespaceLeft();
   EXPECT_EQ(L"", empty);
 }
 
@@ -889,7 +889,7 @@
     // With a single reference, no copy takes place.
     WideString fred(L"  FRED  ");
     const wchar_t* old_buffer = fred.c_str();
-    fred.TrimLeft();
+    fred.TrimWhitespaceLeft();
     EXPECT_EQ(L"FRED  ", fred);
     EXPECT_EQ(old_buffer, fred.c_str());
   }
@@ -898,7 +898,7 @@
     WideString fred(L"  FRED  ");
     WideString other_fred = fred;
     const wchar_t* old_buffer = fred.c_str();
-    fred.TrimLeft();
+    fred.TrimWhitespaceLeft();
     EXPECT_EQ(L"FRED  ", fred);
     EXPECT_EQ(L"  FRED  ", other_fred);
     EXPECT_NE(old_buffer, fred.c_str());
@@ -908,7 +908,7 @@
     WideString fred(L"FRED");
     WideString other_fred = fred;
     const wchar_t* old_buffer = fred.c_str();
-    fred.TrimLeft();
+    fred.TrimWhitespaceLeft();
     EXPECT_EQ(L"FRED", fred);
     EXPECT_EQ(L"FRED", other_fred);
     EXPECT_EQ(old_buffer, fred.c_str());
@@ -917,7 +917,7 @@
 
 TEST(WideString, TrimRight) {
   WideString fred(L"  FRED  ");
-  fred.TrimRight();
+  fred.TrimWhitespaceRight();
   EXPECT_EQ(L"  FRED", fred);
   fred.TrimRight(L'E');
   EXPECT_EQ(L"  FRED", fred);
@@ -931,7 +931,7 @@
   EXPECT_EQ(L"   ", blank);
   blank.TrimRight(L'E');
   EXPECT_EQ(L"   ", blank);
-  blank.TrimRight();
+  blank.TrimWhitespaceRight();
   EXPECT_EQ(L"", blank);
 
   WideString empty;
@@ -939,7 +939,7 @@
   EXPECT_EQ(L"", empty);
   empty.TrimRight(L'E');
   EXPECT_EQ(L"", empty);
-  empty.TrimRight();
+  empty.TrimWhitespaceRight();
   EXPECT_EQ(L"", empty);
 }
 
@@ -948,7 +948,7 @@
     // With a single reference, no copy takes place.
     WideString fred(L"  FRED  ");
     const wchar_t* old_buffer = fred.c_str();
-    fred.TrimRight();
+    fred.TrimWhitespaceRight();
     EXPECT_EQ(L"  FRED", fred);
     EXPECT_EQ(old_buffer, fred.c_str());
   }
@@ -957,7 +957,7 @@
     WideString fred(L"  FRED  ");
     WideString other_fred = fred;
     const wchar_t* old_buffer = fred.c_str();
-    fred.TrimRight();
+    fred.TrimWhitespaceRight();
     EXPECT_EQ(L"  FRED", fred);
     EXPECT_EQ(L"  FRED  ", other_fred);
     EXPECT_NE(old_buffer, fred.c_str());
@@ -967,7 +967,7 @@
     WideString fred(L"FRED");
     WideString other_fred = fred;
     const wchar_t* old_buffer = fred.c_str();
-    fred.TrimRight();
+    fred.TrimWhitespaceRight();
     EXPECT_EQ(L"FRED", fred);
     EXPECT_EQ(L"FRED", other_fred);
     EXPECT_EQ(old_buffer, fred.c_str());
diff --git a/fpdfsdk/fpdfxfa/cpdfxfa_docenvironment.cpp b/fpdfsdk/fpdfxfa/cpdfxfa_docenvironment.cpp
index 8800a0c..f6c5cab 100644
--- a/fpdfsdk/fpdfxfa/cpdfxfa_docenvironment.cpp
+++ b/fpdfsdk/fpdfxfa/cpdfxfa_docenvironment.cpp
@@ -659,7 +659,7 @@
                                         WideString& csSubject,
                                         WideString& csMsg) {
   WideString srcURL = csURL;
-  srcURL.TrimLeft();
+  srcURL.TrimWhitespaceLeft();
   if (srcURL.Left(7).CompareNoCase(L"mailto:") != 0)
     return false;
 
@@ -677,16 +677,16 @@
       tmp = srcURL.Left(pos.value());
       tmp = tmp.Right(tmp.GetLength() - 7);
     }
-    tmp.Trim();
+    tmp.TrimWhitespace();
     csToAddress = std::move(tmp);
   }
 
   srcURL = srcURL.Right(srcURL.GetLength() - (pos.value() + 1));
   while (!srcURL.IsEmpty()) {
-    srcURL.Trim();
+    srcURL.TrimWhitespace();
     pos = srcURL.Find(L'&');
     WideString tmp = (!pos.has_value()) ? srcURL : srcURL.Left(pos.value());
-    tmp.Trim();
+    tmp.TrimWhitespace();
     if (tmp.GetLength() >= 3 && tmp.Left(3).CompareNoCase(L"cc=") == 0) {
       tmp = tmp.Right(tmp.GetLength() - 3);
       if (!csCCAddress.IsEmpty())
@@ -920,7 +920,7 @@
   switch (submit->GetSubmitFormat()) {
     case XFA_AttributeValue::Xdp: {
       WideString csContent = submit->GetSubmitXDPContent();
-      csContent.Trim();
+      csContent.TrimWhitespace();
 
       WideString space = WideString::FromDefANSI(" ");
       csContent = space + csContent + space;
diff --git a/fxjs/cfx_globaldata.cpp b/fxjs/cfx_globaldata.cpp
index b07974e..99bb689 100644
--- a/fxjs/cfx_globaldata.cpp
+++ b/fxjs/cfx_globaldata.cpp
@@ -34,7 +34,7 @@
 
 // Returns true if non-empty, setting sPropName
 bool TrimPropName(ByteString* sPropName) {
-  sPropName->Trim();
+  sPropName->TrimWhitespace();
   return sPropName->GetLength() != 0;
 }
 
diff --git a/fxjs/cjs_document.cpp b/fxjs/cjs_document.cpp
index 93591b0..f5fab08 100644
--- a/fxjs/cjs_document.cpp
+++ b/fxjs/cjs_document.cpp
@@ -1246,7 +1246,7 @@
   }
 
   if (bStrip)
-    swRet.Trim();
+    swRet.TrimWhitespace();
   return CJS_Result::Success(pRuntime->NewString(swRet.AsStringView()));
 }
 
diff --git a/fxjs/cjs_publicmethods.cpp b/fxjs/cjs_publicmethods.cpp
index fb8c8af..6576821 100644
--- a/fxjs/cjs_publicmethods.cpp
+++ b/fxjs/cjs_publicmethods.cpp
@@ -1316,8 +1316,8 @@
         case FormFieldType::kTextField:
         case FormFieldType::kComboBox: {
           WideString trimmed = pFormField->GetValue();
-          trimmed.TrimRight();
-          trimmed.TrimLeft();
+          trimmed.TrimWhitespaceRight();
+          trimmed.TrimWhitespaceLeft();
           dTemp = StringToDouble(trimmed.AsStringView());
           break;
         }
@@ -1331,8 +1331,8 @@
               continue;
 
             WideString trimmed = pFormCtrl->GetExportValue();
-            trimmed.TrimRight();
-            trimmed.TrimLeft();
+            trimmed.TrimWhitespaceRight();
+            trimmed.TrimWhitespaceLeft();
             dTemp = StringToFloat(trimmed.AsStringView());
             break;
           }
@@ -1340,8 +1340,8 @@
         case FormFieldType::kListBox:
           if (pFormField->CountSelectedItems() <= 1) {
             WideString trimmed = pFormField->GetValue();
-            trimmed.TrimRight();
-            trimmed.TrimLeft();
+            trimmed.TrimWhitespaceRight();
+            trimmed.TrimWhitespaceLeft();
             dTemp = StringToFloat(trimmed.AsStringView());
           }
           break;
diff --git a/fxjs/xfa/cfxjse_formcalc_context.cpp b/fxjs/xfa/cfxjse_formcalc_context.cpp
index 6dc2975..39bd24a 100644
--- a/fxjs/xfa/cfxjse_formcalc_context.cpp
+++ b/fxjs/xfa/cfxjse_formcalc_context.cpp
@@ -2892,7 +2892,7 @@
 
   ByteString bsValue =
       fxv8::ReentrantToByteStringHelper(info.GetIsolate(), argOne);
-  bsValue.TrimLeft();
+  bsValue.TrimWhitespaceLeft();
   info.GetReturnValue().Set(static_cast<int>(!bsValue.IsEmpty()));
 }
 
@@ -3617,7 +3617,7 @@
   }
 
   ByteString bsSource = ValueToUTF8String(info.GetIsolate(), argOne);
-  bsSource.TrimLeft();
+  bsSource.TrimWhitespaceLeft();
   info.GetReturnValue().Set(
       fxv8::NewStringHelper(info.GetIsolate(), bsSource.AsStringView()));
 }
@@ -3836,7 +3836,7 @@
   }
 
   ByteString bsSource = ValueToUTF8String(info.GetIsolate(), argOne);
-  bsSource.TrimRight();
+  bsSource.TrimWhitespaceRight();
   info.GetReturnValue().Set(
       fxv8::NewStringHelper(info.GetIsolate(), bsSource.AsStringView()));
 }
diff --git a/fxjs/xfa/cfxjse_resolveprocessor.cpp b/fxjs/xfa/cfxjse_resolveprocessor.cpp
index fad97d3..0535845 100644
--- a/fxjs/xfa/cfxjse_resolveprocessor.cpp
+++ b/fxjs/xfa/cfxjse_resolveprocessor.cpp
@@ -573,8 +573,8 @@
   }
   wsName.ReleaseBuffer(nNameCount);
   wsCondition.ReleaseBuffer(nConditionCount);
-  wsName.Trim();
-  wsCondition.Trim();
+  wsName.TrimWhitespace();
+  wsCondition.TrimWhitespace();
   rnd.m_uHashName =
       static_cast<XFA_HashCode>(FX_HashCode_GetW(wsName.AsStringView()));
   return nStart;
@@ -650,7 +650,7 @@
   }
 
   size_t iFoundCount = pRnd->m_Result.objects.size();
-  wsCondition.Trim();
+  wsCondition.TrimWhitespace();
 
   const size_t nLen = wsCondition.GetLength();
   if (nLen == 0) {
diff --git a/fxjs/xfa/cjx_hostpseudomodel.cpp b/fxjs/xfa/cjx_hostpseudomodel.cpp
index 656e997..21843b7 100644
--- a/fxjs/xfa/cjx_hostpseudomodel.cpp
+++ b/fxjs/xfa/cjx_hostpseudomodel.cpp
@@ -42,7 +42,7 @@
     }
   }
   wsFilter.ReleaseBuffer(nCount);
-  wsFilter.Trim();
+  wsFilter.TrimWhitespace();
   return nStart;
 }
 
diff --git a/xfa/fxfa/layout/cxfa_viewlayoutprocessor.cpp b/xfa/fxfa/layout/cxfa_viewlayoutprocessor.cpp
index e3c30ed..f61924f 100644
--- a/xfa/fxfa/layout/cxfa_viewlayoutprocessor.cpp
+++ b/xfa/fxfa/layout/cxfa_viewlayoutprocessor.cpp
@@ -171,7 +171,7 @@
   if (pTargetAll->IsEmpty())
     return nullptr;
 
-  pTargetAll->Trim();
+  pTargetAll->TrimWhitespace();
   size_t iSplitIndex = 0;
   bool bTargetAllFind = true;
   while (true) {
