diff --git a/core/fpdfapi/edit/cpdf_pagecontentgenerator_unittest.cpp b/core/fpdfapi/edit/cpdf_pagecontentgenerator_unittest.cpp
index 96bf30b..62c3df5 100644
--- a/core/fpdfapi/edit/cpdf_pagecontentgenerator_unittest.cpp
+++ b/core/fpdfapi/edit/cpdf_pagecontentgenerator_unittest.cpp
@@ -211,9 +211,9 @@
 
   // Color RGB values used are integers divided by 255.
   EXPECT_EQ("q 0.501961 0.701961 0.34902 rg 1 0.901961 0 RG /",
-            pathString.Left(48));
+            pathString.First(48));
   EXPECT_EQ(" gs 1 0 0 1 0 0 cm 1 2 m 3 4 l 5 6 l h B Q\n",
-            pathString.Right(43));
+            pathString.Last(43));
   ASSERT_GT(pathString.GetLength(), 91U);
   CPDF_Dictionary* externalGS =
       TestGetResource(&generator, "ExtGState",
@@ -228,9 +228,9 @@
   TestProcessPath(&generator, &buf, pPathObj.get());
   ByteString pathString2(buf);
   EXPECT_EQ("q 0.501961 0.701961 0.34902 rg 1 0.901961 0 RG 10.5 w /",
-            pathString2.Left(55));
+            pathString2.First(55));
   EXPECT_EQ(" gs 1 0 0 1 0 0 cm 1 2 m 3 4 l 5 6 l h B Q\n",
-            pathString2.Right(43));
+            pathString2.Last(43));
 
   // Compare with the previous (should use same dictionary for gs)
   EXPECT_EQ(pathString.GetLength() + 7, pathString2.GetLength());
@@ -273,12 +273,12 @@
   auto secondResourceAt = textString.ReverseFind('/');
   ASSERT_TRUE(secondResourceAt.has_value());
   secondResourceAt = secondResourceAt.value() + 1;
-  ByteString firstString = textString.Left(firstResourceAt.value());
+  ByteString firstString = textString.First(firstResourceAt.value());
   ByteString midString =
       textString.Substr(firstResourceAt.value(),
                         secondResourceAt.value() - firstResourceAt.value());
   ByteString lastString =
-      textString.Right(textString.GetLength() - secondResourceAt.value());
+      textString.Last(textString.GetLength() - secondResourceAt.value());
   // q and Q must be outside the BT .. ET operations
   ByteString compareString1 =
       "q 0.501961 0.701961 0.34902 rg 1 0.901961 0 RG /";
@@ -288,18 +288,18 @@
   EXPECT_LT(compareString1.GetLength() + compareString2.GetLength() +
                 compareString3.GetLength(),
             textString.GetLength());
-  EXPECT_EQ(compareString1, firstString.Left(compareString1.GetLength()));
-  EXPECT_EQ(compareString2, midString.Right(compareString2.GetLength()));
-  EXPECT_EQ(compareString3, lastString.Right(compareString3.GetLength()));
+  EXPECT_EQ(compareString1, firstString.First(compareString1.GetLength()));
+  EXPECT_EQ(compareString2, midString.Last(compareString2.GetLength()));
+  EXPECT_EQ(compareString3, lastString.Last(compareString3.GetLength()));
   CPDF_Dictionary* externalGS = TestGetResource(
       &generator, "ExtGState",
-      midString.Left(midString.GetLength() - compareString2.GetLength()));
+      midString.First(midString.GetLength() - compareString2.GetLength()));
   ASSERT_TRUE(externalGS);
   EXPECT_EQ(0.5f, externalGS->GetNumberFor("ca"));
   EXPECT_EQ(0.8f, externalGS->GetNumberFor("CA"));
   CPDF_Dictionary* fontDict = TestGetResource(
       &generator, "Font",
-      lastString.Left(lastString.GetLength() - compareString3.GetLength()));
+      lastString.First(lastString.GetLength() - compareString3.GetLength()));
   ASSERT_TRUE(fontDict);
   EXPECT_EQ("Font", fontDict->GetStringFor("Type"));
   EXPECT_EQ("Type1", fontDict->GetStringFor("Subtype"));
@@ -346,16 +346,16 @@
   auto firstResourceAt = textString.Find('/');
   ASSERT_TRUE(firstResourceAt.has_value());
   firstResourceAt = firstResourceAt.value() + 1;
-  ByteString firstString = textString.Left(firstResourceAt.value());
+  ByteString firstString = textString.First(firstResourceAt.value());
   ByteString lastString =
-      textString.Right(textString.GetLength() - firstResourceAt.value());
+      textString.Last(textString.GetLength() - firstResourceAt.value());
   // q and Q must be outside the BT .. ET operations
   ByteString compareString1 = "q BT 1 0 0 1 0 0 Tm /";
   ByteString compareString2 = " 15.5 Tf <4920616D20696E646972656374> Tj ET Q\n";
   EXPECT_LT(compareString1.GetLength() + compareString2.GetLength(),
             textString.GetLength());
-  EXPECT_EQ(compareString1, textString.Left(compareString1.GetLength()));
-  EXPECT_EQ(compareString2, textString.Right(compareString2.GetLength()));
+  EXPECT_EQ(compareString1, textString.First(compareString1.GetLength()));
+  EXPECT_EQ(compareString2, textString.Last(compareString2.GetLength()));
   CPDF_Dictionary* fontDict = TestGetResource(
       &generator, "Font",
       textString.Substr(compareString1.GetLength(),
diff --git a/core/fpdfapi/font/cpdf_cmap.cpp b/core/fpdfapi/font/cpdf_cmap.cpp
index 35cf8bb..9d1603b 100644
--- a/core/fpdfapi/font/cpdf_cmap.cpp
+++ b/core/fpdfapi/font/cpdf_cmap.cpp
@@ -184,7 +184,7 @@
 const PredefinedCMap* GetPredefinedCMap(const ByteString& bsPredefinedName) {
   ByteString cmapid = bsPredefinedName;
   if (cmapid.GetLength() > 2)
-    cmapid = cmapid.Left(cmapid.GetLength() - 2);
+    cmapid = cmapid.First(cmapid.GetLength() - 2);
   for (const auto& map : kPredefinedCMaps) {
     if (cmapid == ByteStringView(map.m_pName))
       return &map;
diff --git a/core/fpdfapi/font/cpdf_cmapmanager.cpp b/core/fpdfapi/font/cpdf_cmapmanager.cpp
index 653af0c..4129716 100644
--- a/core/fpdfapi/font/cpdf_cmapmanager.cpp
+++ b/core/fpdfapi/font/cpdf_cmapmanager.cpp
@@ -16,7 +16,7 @@
 
 RetainPtr<const CPDF_CMap> LoadPredefinedCMap(ByteString name) {
   if (!name.IsEmpty() && name[0] == '/')
-    name = name.Right(name.GetLength() - 1);
+    name = name.Last(name.GetLength() - 1);
   return pdfium::MakeRetain<CPDF_CMap>(name);
 }
 
diff --git a/core/fpdfapi/font/cpdf_cmapparser.cpp b/core/fpdfapi/font/cpdf_cmapparser.cpp
index 2f44dd9..7407a42 100644
--- a/core/fpdfapi/font/cpdf_cmapparser.cpp
+++ b/core/fpdfapi/font/cpdf_cmapparser.cpp
@@ -21,7 +21,7 @@
 ByteStringView CMap_GetString(ByteStringView word) {
   if (word.GetLength() <= 2)
     return ByteStringView();
-  return word.Right(word.GetLength() - 2);
+  return word.Last(word.GetLength() - 2);
 }
 
 }  // namespace
diff --git a/core/fpdfapi/font/cpdf_font.cpp b/core/fpdfapi/font/cpdf_font.cpp
index 106ab6a..326bc6e 100644
--- a/core/fpdfapi/font/cpdf_font.cpp
+++ b/core/fpdfapi/font/cpdf_font.cpp
@@ -315,7 +315,7 @@
   ByteString type = pFontDict->GetStringFor("Subtype");
   RetainPtr<CPDF_Font> pFont;
   if (type == "TrueType") {
-    ByteString tag = pFontDict->GetStringFor("BaseFont").Left(4);
+    ByteString tag = pFontDict->GetStringFor("BaseFont").First(4);
     for (size_t i = 0; i < FX_ArraySize(kChineseFontNames); ++i) {
       if (tag == ByteString(kChineseFontNames[i], kChineseFontNameSize)) {
         const CPDF_Dictionary* pFontDesc =
diff --git a/core/fpdfapi/font/cpdf_simplefont.cpp b/core/fpdfapi/font/cpdf_simplefont.cpp
index 9371678..c0fd4e0 100644
--- a/core/fpdfapi/font/cpdf_simplefont.cpp
+++ b/core/fpdfapi/font/cpdf_simplefont.cpp
@@ -213,7 +213,7 @@
   }
   if (m_pFontFile) {
     if (m_BaseFontName.GetLength() > 8 && m_BaseFontName[7] == '+')
-      m_BaseFontName = m_BaseFontName.Right(m_BaseFontName.GetLength() - 8);
+      m_BaseFontName = m_BaseFontName.Last(m_BaseFontName.GetLength() - 8);
   } else {
     LoadSubstFont();
   }
diff --git a/core/fpdfapi/page/cpdf_streamcontentparser.cpp b/core/fpdfapi/page/cpdf_streamcontentparser.cpp
index 420bf70..a18bead 100644
--- a/core/fpdfapi/page/cpdf_streamcontentparser.cpp
+++ b/core/fpdfapi/page/cpdf_streamcontentparser.cpp
@@ -612,7 +612,7 @@
       break;
     }
     auto word = m_pSyntax->GetWord();
-    ByteString key(word.Right(word.GetLength() - 1));
+    ByteString key(word.Last(word.GetLength() - 1));
     auto pObj = m_pSyntax->ReadNextObject(false, false, 0);
     if (!key.IsEmpty()) {
       if (pObj && !pObj->IsInline()) {
@@ -1168,7 +1168,7 @@
 
   if (name == "DeviceGray" || name == "DeviceCMYK" || name == "DeviceRGB") {
     ByteString defname = "Default";
-    defname += name.Right(name.GetLength() - 7);
+    defname += name.Last(name.GetLength() - 7);
     const CPDF_Object* pDefObj = FindResourceObj("ColorSpace", defname);
     if (!pDefObj) {
       if (name == "DeviceGray")
@@ -1533,7 +1533,7 @@
         break;
       case CPDF_StreamParser::Name: {
         auto word = syntax.GetWord();
-        AddNameParam(word.Right(word.GetLength() - 1));
+        AddNameParam(word.Last(word.GetLength() - 1));
         break;
       }
       default:
diff --git a/core/fpdfdoc/cpdf_filespec.cpp b/core/fpdfdoc/cpdf_filespec.cpp
index 70d6d5e..506e176 100644
--- a/core/fpdfdoc/cpdf_filespec.cpp
+++ b/core/fpdfdoc/cpdf_filespec.cpp
@@ -70,7 +70,7 @@
     return WideString();
 
 #if defined(OS_MACOSX)
-  if (filepath.Left(sizeof("/Mac") - 1) == WideStringView(L"/Mac"))
+  if (filepath.First(sizeof("/Mac") - 1) == WideStringView(L"/Mac"))
     return ChangeSlashToPlatform(filepath.c_str() + 1);
   return ChangeSlashToPlatform(filepath.c_str());
 #elif defined(OS_WIN)
@@ -191,7 +191,7 @@
     return L'/' + ChangeSlashToPDF(filepath.c_str());
   return ChangeSlashToPDF(filepath.c_str());
 #elif defined(OS_MACOSX)
-  if (filepath.Left(sizeof("Mac") - 1).EqualsASCII("Mac"))
+  if (filepath.First(sizeof("Mac") - 1).EqualsASCII("Mac"))
     return L'/' + ChangeSlashToPDF(filepath.c_str());
   return ChangeSlashToPDF(filepath.c_str());
 #else
diff --git a/core/fpdftext/cpdf_linkextract.cpp b/core/fpdftext/cpdf_linkextract.cpp
index 001ff1d..f822f3b 100644
--- a/core/fpdftext/cpdf_linkextract.cpp
+++ b/core/fpdftext/cpdf_linkextract.cpp
@@ -156,7 +156,7 @@
         if (ch != L')' && ch != L',' && ch != L'>' && ch != L'.')
           break;
 
-        strBeCheck = strBeCheck.Left(strBeCheck.GetLength() - 1);
+        strBeCheck = strBeCheck.First(strBeCheck.GetLength() - 1);
         nCount--;
       }
 
@@ -249,7 +249,7 @@
       // End extracting for other invalid chars, '.' at the beginning, or
       // consecutive '.'.
       size_t removed_len = i == pPos ? i + 1 : i;
-      *str = str->Right(str->GetLength() - removed_len);
+      *str = str->Last(str->GetLength() - removed_len);
       break;
     }
     // Found a valid '.'.
@@ -282,7 +282,7 @@
       size_t host_end = i == pPos + 1 ? i - 2 : i - 1;
       if (pPos > 0 && host_end - aPos.value() >= 3) {
         // Trim the ending invalid chars if there is at least one '.' and name.
-        *str = str->Left(host_end + 1);
+        *str = str->First(host_end + 1);
         break;
       }
       return false;
diff --git a/core/fpdftext/cpdf_textpagefind.cpp b/core/fpdftext/cpdf_textpagefind.cpp
index d409670..3df499f 100644
--- a/core/fpdftext/cpdf_textpagefind.cpp
+++ b/core/fpdftext/cpdf_textpagefind.cpp
@@ -147,13 +147,13 @@
           continue;
         }
         if (pos > 0)
-          findwhat_array.push_back(word->Left(pos));
+          findwhat_array.push_back(word->First(pos));
         findwhat_array.push_back(curStr);
         if (pos == word->GetLength() - 1) {
           word->clear();
           break;
         }
-        word.emplace(word->Right(word->GetLength() - pos - 1));
+        word.emplace(word->Last(word->GetLength() - pos - 1));
         pos = 0;
         continue;
       }
diff --git a/core/fxcrt/bytestring.cpp b/core/fxcrt/bytestring.cpp
index a353064..0778bc2 100644
--- a/core/fxcrt/bytestring.cpp
+++ b/core/fxcrt/bytestring.cpp
@@ -490,13 +490,13 @@
   return dest;
 }
 
-ByteString ByteString::Left(size_t count) const {
+ByteString ByteString::First(size_t count) const {
   if (count == 0 || !IsValidLength(count))
     return ByteString();
   return Substr(0, count);
 }
 
-ByteString ByteString::Right(size_t count) const {
+ByteString ByteString::Last(size_t count) const {
   if (count == 0 || !IsValidLength(count))
     return ByteString();
   return Substr(GetLength() - count, count);
diff --git a/core/fxcrt/bytestring.h b/core/fxcrt/bytestring.h
index c017087..7c7f2ee 100644
--- a/core/fxcrt/bytestring.h
+++ b/core/fxcrt/bytestring.h
@@ -164,8 +164,8 @@
   void ReleaseBuffer(size_t nNewLength);
 
   ByteString Substr(size_t first, size_t count) const;
-  ByteString Left(size_t count) const;
-  ByteString Right(size_t count) const;
+  ByteString First(size_t count) const;
+  ByteString Last(size_t count) const;
 
   Optional<size_t> Find(ByteStringView subStr, size_t start = 0) const;
   Optional<size_t> Find(char ch, size_t start = 0) const;
diff --git a/core/fxcrt/bytestring_unittest.cpp b/core/fxcrt/bytestring_unittest.cpp
index 61b4ae1..e2e87f0 100644
--- a/core/fxcrt/bytestring_unittest.cpp
+++ b/core/fxcrt/bytestring_unittest.cpp
@@ -626,34 +626,34 @@
   EXPECT_EQ("", empty.Substr(0, 0));
 }
 
-TEST(ByteString, Left) {
+TEST(ByteString, First) {
   ByteString fred("FRED");
-  EXPECT_EQ("", fred.Left(0));
-  EXPECT_EQ("F", fred.Left(1));
-  EXPECT_EQ("FR", fred.Left(2));
-  EXPECT_EQ("FRE", fred.Left(3));
-  EXPECT_EQ("FRED", fred.Left(4));
+  EXPECT_EQ("", fred.First(0));
+  EXPECT_EQ("F", fred.First(1));
+  EXPECT_EQ("FR", fred.First(2));
+  EXPECT_EQ("FRE", fred.First(3));
+  EXPECT_EQ("FRED", fred.First(4));
 
-  EXPECT_EQ("", fred.Left(5));
+  EXPECT_EQ("", fred.First(5));
 
   ByteString empty;
-  EXPECT_EQ("", empty.Left(0));
-  EXPECT_EQ("", empty.Left(1));
+  EXPECT_EQ("", empty.First(0));
+  EXPECT_EQ("", empty.First(1));
 }
 
-TEST(ByteString, Right) {
+TEST(ByteString, Last) {
   ByteString fred("FRED");
-  EXPECT_EQ("", fred.Right(0));
-  EXPECT_EQ("D", fred.Right(1));
-  EXPECT_EQ("ED", fred.Right(2));
-  EXPECT_EQ("RED", fred.Right(3));
-  EXPECT_EQ("FRED", fred.Right(4));
+  EXPECT_EQ("", fred.Last(0));
+  EXPECT_EQ("D", fred.Last(1));
+  EXPECT_EQ("ED", fred.Last(2));
+  EXPECT_EQ("RED", fred.Last(3));
+  EXPECT_EQ("FRED", fred.Last(4));
 
-  EXPECT_EQ("", fred.Right(5));
+  EXPECT_EQ("", fred.Last(5));
 
   ByteString empty;
-  EXPECT_EQ("", empty.Right(0));
-  EXPECT_EQ("", empty.Right(1));
+  EXPECT_EQ("", empty.Last(0));
+  EXPECT_EQ("", empty.Last(1));
 }
 
 TEST(ByteString, Find) {
diff --git a/core/fxcrt/fx_string.h b/core/fxcrt/fx_string.h
index 4db1cea..e27f43a 100644
--- a/core/fxcrt/fx_string.h
+++ b/core/fxcrt/fx_string.h
@@ -39,8 +39,8 @@
     Optional<size_t> index = remaining.Find(ch);
     if (!index.has_value())
       break;
-    result.emplace_back(remaining.Left(index.value()));
-    remaining = remaining.Right(remaining.GetLength() - index.value() - 1);
+    result.emplace_back(remaining.First(index.value()));
+    remaining = remaining.Last(remaining.GetLength() - index.value() - 1);
   }
   result.emplace_back(remaining);
   return result;
diff --git a/core/fxcrt/string_view_template.h b/core/fxcrt/string_view_template.h
index f4180f7..e50a71d 100644
--- a/core/fxcrt/string_view_template.h
+++ b/core/fxcrt/string_view_template.h
@@ -21,7 +21,7 @@
 
 // An immutable string with caller-provided storage which must outlive the
 // string itself. These are not necessarily nul-terminated, so that substring
-// extraction (via the Substr(), Left(), and Right() methods) is copy-free.
+// extraction (via the Substr(), First(), and Last() methods) is copy-free.
 //
 // String view arguments should be passed by value, since they are small,
 // rather than const-ref, even if they are not modified.
@@ -213,13 +213,13 @@
     return StringViewTemplate(m_Span.data() + first, count);
   }
 
-  StringViewTemplate Left(size_t count) const {
+  StringViewTemplate First(size_t count) const {
     if (count == 0 || !IsValidLength(count))
       return StringViewTemplate();
     return Substr(0, count);
   }
 
-  StringViewTemplate Right(size_t count) const {
+  StringViewTemplate Last(size_t count) const {
     if (count == 0 || !IsValidLength(count))
       return StringViewTemplate();
     return Substr(GetLength() - count, count);
diff --git a/core/fxcrt/widestring.cpp b/core/fxcrt/widestring.cpp
index 79fe3b0..10a31c3 100644
--- a/core/fxcrt/widestring.cpp
+++ b/core/fxcrt/widestring.cpp
@@ -715,13 +715,13 @@
   return dest;
 }
 
-WideString WideString::Left(size_t count) const {
+WideString WideString::First(size_t count) const {
   if (count == 0 || !IsValidLength(count))
     return WideString();
   return Substr(0, count);
 }
 
-WideString WideString::Right(size_t count) const {
+WideString WideString::Last(size_t count) const {
   if (count == 0 || !IsValidLength(count))
     return WideString();
   return Substr(GetLength() - count, count);
diff --git a/core/fxcrt/widestring.h b/core/fxcrt/widestring.h
index d240a9d..58e7544 100644
--- a/core/fxcrt/widestring.h
+++ b/core/fxcrt/widestring.h
@@ -151,8 +151,8 @@
   int CompareNoCase(const wchar_t* str) const;
 
   WideString Substr(size_t first, size_t count) const;
-  WideString Left(size_t count) const;
-  WideString Right(size_t count) const;
+  WideString First(size_t count) const;
+  WideString Last(size_t count) const;
 
   size_t Insert(size_t index, wchar_t ch);
   size_t InsertAtFront(wchar_t ch) { return Insert(0, ch); }
diff --git a/core/fxcrt/widestring_unittest.cpp b/core/fxcrt/widestring_unittest.cpp
index b71c937..2445a47 100644
--- a/core/fxcrt/widestring_unittest.cpp
+++ b/core/fxcrt/widestring_unittest.cpp
@@ -634,34 +634,34 @@
   EXPECT_EQ(L"", empty.Substr(0, 0));
 }
 
-TEST(WideString, Left) {
+TEST(WideString, First) {
   WideString fred(L"FRED");
-  EXPECT_EQ(L"", fred.Left(0));
-  EXPECT_EQ(L"F", fred.Left(1));
-  EXPECT_EQ(L"FR", fred.Left(2));
-  EXPECT_EQ(L"FRE", fred.Left(3));
-  EXPECT_EQ(L"FRED", fred.Left(4));
+  EXPECT_EQ(L"", fred.First(0));
+  EXPECT_EQ(L"F", fred.First(1));
+  EXPECT_EQ(L"FR", fred.First(2));
+  EXPECT_EQ(L"FRE", fred.First(3));
+  EXPECT_EQ(L"FRED", fred.First(4));
 
-  EXPECT_EQ(L"", fred.Left(5));
+  EXPECT_EQ(L"", fred.First(5));
 
   WideString empty;
-  EXPECT_EQ(L"", empty.Left(0));
-  EXPECT_EQ(L"", empty.Left(1));
+  EXPECT_EQ(L"", empty.First(0));
+  EXPECT_EQ(L"", empty.First(1));
 }
 
-TEST(WideString, Right) {
+TEST(WideString, Last) {
   WideString fred(L"FRED");
-  EXPECT_EQ(L"", fred.Right(0));
-  EXPECT_EQ(L"D", fred.Right(1));
-  EXPECT_EQ(L"ED", fred.Right(2));
-  EXPECT_EQ(L"RED", fred.Right(3));
-  EXPECT_EQ(L"FRED", fred.Right(4));
+  EXPECT_EQ(L"", fred.Last(0));
+  EXPECT_EQ(L"D", fred.Last(1));
+  EXPECT_EQ(L"ED", fred.Last(2));
+  EXPECT_EQ(L"RED", fred.Last(3));
+  EXPECT_EQ(L"FRED", fred.Last(4));
 
-  EXPECT_EQ(L"", fred.Right(5));
+  EXPECT_EQ(L"", fred.Last(5));
 
   WideString empty;
-  EXPECT_EQ(L"", empty.Right(0));
-  EXPECT_EQ(L"", empty.Right(1));
+  EXPECT_EQ(L"", empty.Last(0));
+  EXPECT_EQ(L"", empty.Last(1));
 }
 
 TEST(WideString, Find) {
diff --git a/core/fxcrt/xml/cfx_xmlelement.cpp b/core/fxcrt/xml/cfx_xmlelement.cpp
index a294b5f..b999f5c 100644
--- a/core/fxcrt/xml/cfx_xmlelement.cpp
+++ b/core/fxcrt/xml/cfx_xmlelement.cpp
@@ -40,13 +40,13 @@
 
 WideString CFX_XMLElement::GetLocalTagName() const {
   auto pos = name_.Find(L':');
-  return pos.has_value() ? name_.Right(name_.GetLength() - pos.value() - 1)
+  return pos.has_value() ? name_.Last(name_.GetLength() - pos.value() - 1)
                          : name_;
 }
 
 WideString CFX_XMLElement::GetNamespacePrefix() const {
   auto pos = name_.Find(L':');
-  return pos.has_value() ? name_.Left(pos.value()) : WideString();
+  return pos.has_value() ? name_.First(pos.value()) : WideString();
 }
 
 WideString CFX_XMLElement::GetNamespaceURI() const {
diff --git a/core/fxge/android/cfpf_skiafontmgr.cpp b/core/fxge/android/cfpf_skiafontmgr.cpp
index 2420ea5..b5e7a20 100644
--- a/core/fxge/android/cfpf_skiafontmgr.cpp
+++ b/core/fxge/android/cfpf_skiafontmgr.cpp
@@ -370,7 +370,7 @@
       if (filename == "." || filename == "..")
         continue;
     } else {
-      ByteString ext = filename.Right(4);
+      ByteString ext = filename.Last(4);
       ext.MakeLower();
       if (ext != ".ttf" && ext != ".ttc" && ext != ".otf")
         continue;
diff --git a/core/fxge/cfx_folderfontinfo.cpp b/core/fxge/cfx_folderfontinfo.cpp
index 05d7ec9..032d4de 100644
--- a/core/fxge/cfx_folderfontinfo.cpp
+++ b/core/fxge/cfx_folderfontinfo.cpp
@@ -154,7 +154,7 @@
       if (filename == "." || filename == "..")
         continue;
     } else {
-      ByteString ext = filename.Right(4);
+      ByteString ext = filename.Last(4);
       ext.MakeLower();
       if (ext != ".ttf" && ext != ".ttc" && ext != ".otf")
         continue;
diff --git a/core/fxge/cfx_fontmapper.cpp b/core/fxge/cfx_fontmapper.cpp
index 04fb77d..3b0bcae 100644
--- a/core/fxge/cfx_fontmapper.cpp
+++ b/core/fxge/cfx_fontmapper.cpp
@@ -168,7 +168,7 @@
   norm.Remove(',');
   auto pos = norm.Find('+');
   if (pos.has_value() && pos.value() != 0)
-    norm = norm.Left(pos.value());
+    norm = norm.First(pos.value());
   norm.MakeLower();
   return norm;
 }
@@ -230,10 +230,10 @@
       continue;
 
     if (bReverse) {
-      if (bsStyle.Right(pStyle->len).Compare(pStyle->name) == 0)
+      if (bsStyle.Last(pStyle->len).Compare(pStyle->name) == 0)
         return std::make_tuple(true, pStyle->style, pStyle->len);
     } else {
-      if (bsStyle.Left(pStyle->len).Compare(pStyle->name) == 0)
+      if (bsStyle.First(pStyle->len).Compare(pStyle->name) == 0)
         return std::make_tuple(true, pStyle->style, pStyle->len);
     }
   }
@@ -399,7 +399,7 @@
   ByteString SubstName = name;
   SubstName.Remove(' ');
   if (bTrueType && name.GetLength() > 0 && name[0] == '@')
-    SubstName = name.Right(name.GetLength() - 1);
+    SubstName = name.Last(name.GetLength() - 1);
   GetStandardFontName(&SubstName);
   if (SubstName == "Symbol" && !bTrueType) {
     pSubstFont->m_Family = "Chrome Symbol";
@@ -419,9 +419,9 @@
   {
     Optional<size_t> pos = SubstName.Find(",", 0);
     if (pos.has_value()) {
-      family = SubstName.Left(pos.value());
+      family = SubstName.First(pos.value());
       GetStandardFontName(&family);
-      style = SubstName.Right(SubstName.GetLength() - (pos.value() + 1));
+      style = SubstName.Last(SubstName.GetLength() - (pos.value() + 1));
       bHasComma = true;
     } else {
       family = SubstName;
@@ -448,8 +448,8 @@
     if (!bHasComma) {
       Optional<size_t> pos = family.ReverseFind('-');
       if (pos.has_value()) {
-        style = family.Right(family.GetLength() - (pos.value() + 1));
-        family = family.Left(pos.value());
+        style = family.Last(family.GetLength() - (pos.value() + 1));
+        family = family.First(pos.value());
         bHasHyphen = true;
       }
     }
@@ -460,7 +460,7 @@
       size_t len;
       std::tie(hasStyleType, styleType, len) = GetStyleType(family, true);
       if (hasStyleType) {
-        family = family.Left(nLen - len);
+        family = family.First(nLen - len);
         nStyle |= styleType;
       }
     }
diff --git a/core/fxge/win32/fx_win32_device.cpp b/core/fxge/win32/fx_win32_device.cpp
index 9c38d58..58cb504 100644
--- a/core/fxge/win32/fx_win32_device.cpp
+++ b/core/fxge/win32/fx_win32_device.cpp
@@ -442,12 +442,12 @@
 
   for (size_t i = 0; i < m_pMapper->m_InstalledTTFonts.size(); ++i) {
     ByteString thisname = m_pMapper->m_InstalledTTFonts[i];
-    if (thisname.Left(name.GetLength()) == name)
+    if (thisname.First(name.GetLength()) == name)
       return m_pMapper->m_InstalledTTFonts[i];
   }
   for (size_t i = 0; i < m_pMapper->m_LocalizedTTFonts.size(); ++i) {
     ByteString thisname = m_pMapper->m_LocalizedTTFonts[i].first;
-    if (thisname.Left(name.GetLength()) == name)
+    if (thisname.First(name.GetLength()) == name)
       return m_pMapper->m_LocalizedTTFonts[i].second;
   }
   return ByteString();
diff --git a/fpdfsdk/fpdf_ppo.cpp b/fpdfsdk/fpdf_ppo.cpp
index 3cdf3d5..819ba05 100644
--- a/fpdfsdk/fpdf_ppo.cpp
+++ b/fpdfsdk/fpdf_ppo.cpp
@@ -228,7 +228,7 @@
     if (nDashPosition) {
       size_t nMid = nDashPosition.value();
       uint32_t nStartPageNum = pdfium::base::checked_cast<uint32_t>(
-          atoi(cbMidRange.Left(nMid).c_str()));
+          atoi(cbMidRange.First(nMid).c_str()));
       if (nStartPageNum == 0)
         return false;
 
diff --git a/fpdfsdk/fpdf_text.cpp b/fpdfsdk/fpdf_text.cpp
index 078bc93..5edbf27 100644
--- a/fpdfsdk/fpdf_text.cpp
+++ b/fpdfsdk/fpdf_text.cpp
@@ -351,7 +351,7 @@
   WideString str = textpage->GetPageText(start_index, char_count);
 
   if (str.GetLength() > static_cast<size_t>(char_count))
-    str = str.Left(static_cast<size_t>(char_count));
+    str = str.First(static_cast<size_t>(char_count));
 
   // UFT16LE_Encode doesn't handle surrogate pairs properly, so it is expected
   // the number of items to stay the same.
diff --git a/fxbarcode/cbc_eancode.cpp b/fxbarcode/cbc_eancode.cpp
index f073545..6e44f81 100644
--- a/fxbarcode/cbc_eancode.cpp
+++ b/fxbarcode/cbc_eancode.cpp
@@ -57,7 +57,7 @@
     str += '0' + checksum;
     encoded_contents = WideString::FromUTF8(str.AsStringView());
   } else {
-    encoded_contents = encoded_contents.Left(max_length + 1);
+    encoded_contents = encoded_contents.First(max_length + 1);
   }
 
   return encoded_contents;
diff --git a/fxbarcode/datamatrix/BC_HighLevelEncoder.cpp b/fxbarcode/datamatrix/BC_HighLevelEncoder.cpp
index a0c682d..fbc4262 100644
--- a/fxbarcode/datamatrix/BC_HighLevelEncoder.cpp
+++ b/fxbarcode/datamatrix/BC_HighLevelEncoder.cpp
@@ -132,7 +132,7 @@
     return WideString();
 
   if (msg.Back() == kMacroTrailer) {
-    WideString left = msg.Left(6);
+    WideString left = msg.First(6);
     if (left == kMacro05Header) {
       context.writeCodeword(kMacro05);
       context.setSkipAtEnd(2);
diff --git a/fxbarcode/oned/BC_OnedEAN13Writer.cpp b/fxbarcode/oned/BC_OnedEAN13Writer.cpp
index 2a82a66..f2e88dd 100644
--- a/fxbarcode/oned/BC_OnedEAN13Writer.cpp
+++ b/fxbarcode/oned/BC_OnedEAN13Writer.cpp
@@ -196,7 +196,7 @@
                            static_cast<float>(iFontSize), affine_matrix1,
                            m_fontColor, FXTEXT_CLEARTYPE);
   }
-  tempStr = str.Left(1);
+  tempStr = str.First(1);
   length = tempStr.GetLength();
   strWidth = multiple * 7;
   strWidth = (int32_t)(strWidth * m_outputHScale);
diff --git a/fxbarcode/oned/BC_OnedEAN8Writer.cpp b/fxbarcode/oned/BC_OnedEAN8Writer.cpp
index 0f28bf8..62c760c 100644
--- a/fxbarcode/oned/BC_OnedEAN8Writer.cpp
+++ b/fxbarcode/oned/BC_OnedEAN8Writer.cpp
@@ -138,7 +138,7 @@
   ByteString str = FX_UTF8Encode(contents);
   size_t iLength = str.GetLength();
   std::vector<TextCharPos> charpos(iLength);
-  ByteString tempStr = str.Left(4);
+  ByteString tempStr = str.First(4);
   size_t iLen = tempStr.GetLength();
   int32_t strWidth = 7 * multiple * 4;
   float blank = 0.0;
diff --git a/fxbarcode/oned/BC_OnedUPCAWriter.cpp b/fxbarcode/oned/BC_OnedUPCAWriter.cpp
index cbe0ef6..666b037 100644
--- a/fxbarcode/oned/BC_OnedUPCAWriter.cpp
+++ b/fxbarcode/oned/BC_OnedUPCAWriter.cpp
@@ -180,7 +180,7 @@
                            static_cast<float>(iFontSize), affine_matrix1,
                            m_fontColor, FXTEXT_CLEARTYPE);
   }
-  tempStr = str.Left(1);
+  tempStr = str.First(1);
   length = tempStr.GetLength();
   strWidth = (float)multiple * 7;
   strWidth = strWidth * m_outputHScale;
diff --git a/fxjs/cjs_field.cpp b/fxjs/cjs_field.cpp
index ba0aa1e..b6aa9bb 100644
--- a/fxjs/cjs_field.cpp
+++ b/fxjs/cjs_field.cpp
@@ -148,7 +148,7 @@
     return;
   }
   WideString suffixal =
-      strFieldNameParsed.Right(reverse_it - strFieldNameParsed.rbegin());
+      strFieldNameParsed.Last(reverse_it - strFieldNameParsed.rbegin());
   iControlNo = FXSYS_wtoi(suffixal.c_str());
   if (iControlNo == 0) {
     suffixal.TrimRight(L' ');
@@ -159,7 +159,7 @@
     }
   }
   strFieldName =
-      strFieldNameParsed.Left(strFieldNameParsed.rend() - reverse_it - 1);
+      strFieldNameParsed.First(strFieldNameParsed.rend() - reverse_it - 1);
 }
 
 std::vector<CPDF_FormField*> GetFormFieldsForName(
diff --git a/fxjs/cjs_publicmethods.cpp b/fxjs/cjs_publicmethods.cpp
index 0666a64..8eed97d 100644
--- a/fxjs/cjs_publicmethods.cpp
+++ b/fxjs/cjs_publicmethods.cpp
@@ -124,11 +124,11 @@
 WideString CalcMergedString(const CJS_EventRecorder* event,
                             const WideString& value,
                             const WideString& change) {
-  WideString prefix = value.Left(event->SelStart());
+  WideString prefix = value.First(event->SelStart());
   WideString postfix;
   int end = event->SelEnd();
   if (end >= 0 && static_cast<size_t>(end) < value.GetLength())
-    postfix = value.Right(value.GetLength() - static_cast<size_t>(end));
+    postfix = value.Last(value.GetLength() - static_cast<size_t>(end));
   return prefix + change + postfix;
 }
 
diff --git a/fxjs/cjs_util.cpp b/fxjs/cjs_util.cpp
index 37d3932..1f95c31 100644
--- a/fxjs/cjs_util.cpp
+++ b/fxjs/cjs_util.cpp
@@ -112,7 +112,7 @@
       Optional<size_t> offset_end = unsafe_fmt_string.Find(L"%", offset + 1);
       if (!offset_end.has_value()) {
         unsafe_conversion_specifiers.push_back(
-            unsafe_fmt_string.Right(unsafe_fmt_string.GetLength() - offset));
+            unsafe_fmt_string.Last(unsafe_fmt_string.GetLength() - offset));
         break;
       }
 
@@ -154,7 +154,7 @@
   DCHECK_EQ(L'S', result[0]);
   auto result_view = result.AsStringView();
   return CJS_Result::Success(
-      pRuntime->NewString(result_view.Right(result_view.GetLength() - 1)));
+      pRuntime->NewString(result_view.Last(result_view.GetLength() - 1)));
 }
 
 CJS_Result CJS_Util::printd(CJS_Runtime* pRuntime,
diff --git a/fxjs/xfa/cfxjse_engine.cpp b/fxjs/xfa/cfxjse_engine.cpp
index 7ac440d..9be2498 100644
--- a/fxjs/xfa/cfxjse_engine.cpp
+++ b/fxjs/xfa/cfxjse_engine.cpp
@@ -414,7 +414,7 @@
 
   if (pObject->IsNode()) {
     if (wsPropNameView[0] == '#')
-      wsPropNameView = wsPropNameView.Right(wsPropNameView.GetLength() - 1);
+      wsPropNameView = wsPropNameView.Last(wsPropNameView.GetLength() - 1);
 
     CXFA_Node* pNode = ToNode(pObject);
     CXFA_Node* pPropOrChild = nullptr;
diff --git a/fxjs/xfa/cfxjse_formcalc_context.cpp b/fxjs/xfa/cfxjse_formcalc_context.cpp
index a12736e..7a6796c 100644
--- a/fxjs/xfa/cfxjse_formcalc_context.cpp
+++ b/fxjs/xfa/cfxjse_formcalc_context.cpp
@@ -324,19 +324,19 @@
 
 std::pair<bool, uint32_t> PatternStringType(ByteStringView bsPattern) {
   WideString wsPattern = WideString::FromUTF8(bsPattern);
-  if (L"datetime" == wsPattern.Left(8))
+  if (L"datetime" == wsPattern.First(8))
     return {true, XFA_VT_DATETIME};
-  if (L"date" == wsPattern.Left(4)) {
+  if (L"date" == wsPattern.First(4)) {
     auto pos = wsPattern.Find(L"time");
     uint32_t type =
         pos.has_value() && pos.value() != 0 ? XFA_VT_DATETIME : XFA_VT_DATE;
     return {true, type};
   }
-  if (L"time" == wsPattern.Left(4))
+  if (L"time" == wsPattern.First(4))
     return {true, XFA_VT_TIME};
-  if (L"text" == wsPattern.Left(4))
+  if (L"text" == wsPattern.First(4))
     return {true, XFA_VT_TEXT};
-  if (L"num" == wsPattern.Left(3)) {
+  if (L"num" == wsPattern.First(3)) {
     uint32_t type;
     if (L"integer" == wsPattern.Substr(4, 7)) {
       type = XFA_VT_INTEGER;
@@ -1963,7 +1963,7 @@
     args.GetReturnValue()->SetInteger(0);
     return;
   }
-  bsArg = bsArg.Right(bsArg.GetLength() - (pos.value() + 1));
+  bsArg = bsArg.Last(bsArg.GetLength() - (pos.value() + 1));
 
   CXFA_LocaleValue timeValue(XFA_VT_TIME,
                              WideString::FromUTF8(bsArg.AsStringView()), pMgr);
@@ -3688,12 +3688,11 @@
           return;
         }
         WideString wsDatePattern(L"date{");
-        wsDatePattern += wsPattern.Left(iTChar.value()) + L"} ";
+        wsDatePattern += wsPattern.First(iTChar.value()) + L"} ";
 
         WideString wsTimePattern(L"time{");
         wsTimePattern +=
-            wsPattern.Right(wsPattern.GetLength() - (iTChar.value() + 1)) +
-            L"}";
+            wsPattern.Last(wsPattern.GetLength() - (iTChar.value() + 1)) + L"}";
         wsPattern = wsDatePattern + wsTimePattern;
       } break;
       case XFA_VT_DATE: {
@@ -3753,7 +3752,7 @@
 
   ByteString bsSource = ValueToUTF8String(argOne.get());
   int32_t count = std::max(0, ValueToInteger(pThis, argTwo.get()));
-  args.GetReturnValue()->SetString(bsSource.Left(count).AsStringView());
+  args.GetReturnValue()->SetString(bsSource.First(count).AsStringView());
 }
 
 // static
@@ -3875,11 +3874,11 @@
         args.GetReturnValue()->SetString("");
         return;
       }
-      WideString wsDatePattern(L"date{" + wsPattern.Left(iTChar.value()) +
+      WideString wsDatePattern(L"date{" + wsPattern.First(iTChar.value()) +
                                L"} ");
       WideString wsTimePattern(
           L"time{" +
-          wsPattern.Right(wsPattern.GetLength() - (iTChar.value() + 1)) + L"}");
+          wsPattern.Last(wsPattern.GetLength() - (iTChar.value() + 1)) + L"}");
       wsPattern = wsDatePattern + wsTimePattern;
       CXFA_LocaleValue localeValue(dwPatternType, wsValue, wsPattern, pLocale,
                                    pMgr);
@@ -4043,7 +4042,7 @@
 
   ByteString bsSource = ValueToUTF8String(argOne.get());
   int32_t count = std::max(0, ValueToInteger(pThis, argTwo.get()));
-  args.GetReturnValue()->SetString(bsSource.Right(count).AsStringView());
+  args.GetReturnValue()->SetString(bsSource.Last(count).AsStringView());
 }
 
 // static
diff --git a/fxjs/xfa/cfxjse_resolveprocessor.cpp b/fxjs/xfa/cfxjse_resolveprocessor.cpp
index 31d75be..89883d6 100644
--- a/fxjs/xfa/cfxjse_resolveprocessor.cpp
+++ b/fxjs/xfa/cfxjse_resolveprocessor.cpp
@@ -33,9 +33,9 @@
   ASSERT(iFoundCount == pRnd->m_Objects.size());
   WideString wsExpression;
   CXFA_Script::Type eLangType = CXFA_Script::Type::Unknown;
-  if (wsCondition.Left(2).EqualsASCII(".[") && wsCondition.Back() == L']')
+  if (wsCondition.First(2).EqualsASCII(".[") && wsCondition.Back() == L']')
     eLangType = CXFA_Script::Type::Formcalc;
-  else if (wsCondition.Left(2).EqualsASCII(".(") && wsCondition.Back() == L')')
+  else if (wsCondition.First(2).EqualsASCII(".(") && wsCondition.Back() == L')')
     eLangType = CXFA_Script::Type::Javascript;
   else
     return;
@@ -128,7 +128,7 @@
   const bool bClassName = !wsName.IsEmpty() && wsName[0] == '#';
   CXFA_Node* const pChild =
       bClassName
-          ? pParent->GetOneChildOfClass(wsName.Right(wsName.GetLength() - 1))
+          ? pParent->GetOneChildOfClass(wsName.Last(wsName.GetLength() - 1))
           : pParent->GetOneChildNamed(wsName);
   if (!pChild)
     return false;
@@ -162,7 +162,7 @@
     return false;
 
   XFA_HashCode dwNameHash = static_cast<XFA_HashCode>(
-      FX_HashCode_GetW(wsName.AsStringView().Right(iNameLen - 1), false));
+      FX_HashCode_GetW(wsName.AsStringView().Last(iNameLen - 1), false));
   if (dwNameHash == XFA_HASHCODE_Xfa) {
     rnd.m_Objects.emplace_back(rnd.m_pSC->GetDocument()->GetRoot());
   } else {
@@ -186,7 +186,7 @@
 
   CFXJSE_ResolveNodeData rndFind(rnd.m_pSC.Get());
   rndFind.m_CurObject = datasets;
-  rndFind.m_wsName = rnd.m_wsName.Right(rnd.m_wsName.GetLength() - 1);
+  rndFind.m_wsName = rnd.m_wsName.Last(rnd.m_wsName.GetLength() - 1);
   rndFind.m_uHashName = static_cast<XFA_HashCode>(
       FX_HashCode_GetW(rndFind.m_wsName.AsStringView(), false));
   rndFind.m_nLevel = rnd.m_nLevel + 1;
@@ -200,7 +200,7 @@
 }
 
 bool CFXJSE_ResolveProcessor::ResolveNumberSign(CFXJSE_ResolveNodeData& rnd) {
-  WideString wsName = rnd.m_wsName.Right(rnd.m_wsName.GetLength() - 1);
+  WideString wsName = rnd.m_wsName.Last(rnd.m_wsName.GetLength() - 1);
   WideString wsCondition = rnd.m_wsCondition;
   CXFA_Node* curNode = ToNode(rnd.m_CurObject.Get());
   if (ResolveForAttributeRs(curNode, rnd, wsName.AsStringView()))
diff --git a/fxjs/xfa/cjx_instancemanager.cpp b/fxjs/xfa/cjx_instancemanager.cpp
index 7ea4ba2..160c4a5 100644
--- a/fxjs/xfa/cjx_instancemanager.cpp
+++ b/fxjs/xfa/cjx_instancemanager.cpp
@@ -59,7 +59,7 @@
     WideString wsInstanceName = WideString(
         wsInstManagerName.IsEmpty()
             ? wsInstManagerName
-            : wsInstManagerName.Right(wsInstManagerName.GetLength() - 1));
+            : wsInstManagerName.Last(wsInstManagerName.GetLength() - 1));
     uint32_t dInstanceNameHash =
         FX_HashCode_GetW(wsInstanceName.AsStringView(), false);
     CXFA_Node* pPrevSibling = iDesired == 0
diff --git a/fxjs/xfa/cjx_subform.cpp b/fxjs/xfa/cjx_subform.cpp
index 8dd192a..8a72b5b 100644
--- a/fxjs/xfa/cjx_subform.cpp
+++ b/fxjs/xfa/cjx_subform.cpp
@@ -115,7 +115,7 @@
       WideString wsInstMgrName =
           pNode->JSObject()->GetCData(XFA_Attribute::Name);
       if (wsInstMgrName.GetLength() >= 1 && wsInstMgrName[0] == '_' &&
-          wsInstMgrName.Right(wsInstMgrName.GetLength() - 1) == wsName) {
+          wsInstMgrName.Last(wsInstMgrName.GetLength() - 1) == wsName) {
         pInstanceMgr = pNode;
       }
       break;
diff --git a/xfa/fde/cfde_texteditengine.cpp b/xfa/fde/cfde_texteditengine.cpp
index 281f978..957b6ff 100644
--- a/xfa/fde/cfde_texteditengine.cpp
+++ b/xfa/fde/cfde_texteditengine.cpp
@@ -242,7 +242,7 @@
     ++chars_exceeding_size;
 
     --length;
-    temp = temp.Left(length);
+    temp = temp.First(length);
   }
 
   return chars_exceeding_size;
diff --git a/xfa/fgas/crt/cfgas_decimal_unittest.cpp b/xfa/fgas/crt/cfgas_decimal_unittest.cpp
index 5b714e3..816045e 100644
--- a/xfa/fgas/crt/cfgas_decimal_unittest.cpp
+++ b/xfa/fgas/crt/cfgas_decimal_unittest.cpp
@@ -42,17 +42,17 @@
 
   // Precision may not be the same on all platforms.
   EXPECT_EQ(big_expected.GetLength(), big.GetLength());
-  EXPECT_STREQ(big_expected.Left(8).c_str(), big.Left(8).c_str());
+  EXPECT_STREQ(big_expected.First(8).c_str(), big.First(8).c_str());
 
   WideString tiny = CFGAS_Decimal(1e20f, 0).ToWideString();
   WideString tiny_expected = L"100000000000000000000";
   EXPECT_EQ(tiny_expected.GetLength(), tiny.GetLength());
-  EXPECT_STREQ(tiny_expected.Left(8).c_str(), tiny.Left(8).c_str());
+  EXPECT_STREQ(tiny_expected.First(8).c_str(), tiny.First(8).c_str());
 
   WideString teeny = CFGAS_Decimal(1e14f, 4).ToWideString();
   WideString teeny_expected = L"100000000000000.0000";
   EXPECT_EQ(teeny_expected.GetLength(), teeny.GetLength());
-  EXPECT_STREQ(teeny_expected.Left(8).c_str(), teeny.Left(8).c_str());
+  EXPECT_STREQ(teeny_expected.First(8).c_str(), teeny.First(8).c_str());
 }
 
 TEST(CFGAS_Decimal, FromFloatFractional) {
@@ -61,7 +61,7 @@
 
   // Precision may not be the same on all platforms.
   EXPECT_EQ(case1_expected.GetLength(), case1.GetLength());
-  EXPECT_STREQ(case1_expected.Left(8).c_str(), case1.Left(8).c_str());
+  EXPECT_STREQ(case1_expected.First(8).c_str(), case1.First(8).c_str());
 }
 
 TEST(CFGAS_Decimal, FromString) {
diff --git a/xfa/fgas/crt/cfgas_stringformatter.cpp b/xfa/fgas/crt/cfgas_stringformatter.cpp
index 4344fd5..1c640b9 100644
--- a/xfa/fgas/crt/cfgas_stringformatter.cpp
+++ b/xfa/fgas/crt/cfgas_stringformatter.cpp
@@ -1562,8 +1562,8 @@
       while (ccf < m_spPattern.size() && m_spPattern[ccf] != '{' &&
              m_spPattern[ccf] != '.' && m_spPattern[ccf] != '(') {
         if (m_spPattern[ccf] == 'T') {
-          *wsDatePattern = m_wsPattern.Left(ccf);
-          *wsTimePattern = m_wsPattern.Right(m_wsPattern.GetLength() - ccf);
+          *wsDatePattern = m_wsPattern.First(ccf);
+          *wsTimePattern = m_wsPattern.Last(m_wsPattern.GetLength() - ccf);
           wsTimePattern->SetAt(0, ' ');
           if (!*pLocale)
             *pLocale = m_pLocaleMgr->GetDefLocale();
@@ -2047,7 +2047,7 @@
     }
     if (dot_index.value() < spSrcNum.size()) {
       *wsOutput += pLocale->GetDecimalSymbol();
-      *wsOutput += wsSrcNum.Right(spSrcNum.size() - dot_index.value() - 1);
+      *wsOutput += wsSrcNum.Last(spSrcNum.size() - dot_index.value() - 1);
     }
     if (bNeg)
       *wsOutput = pLocale->GetMinusSymbol() + *wsOutput;
diff --git a/xfa/fgas/font/cfgas_pdffontmgr.cpp b/xfa/fgas/font/cfgas_pdffontmgr.cpp
index b67c449..b342237 100644
--- a/xfa/fgas/font/cfgas_pdffontmgr.cpp
+++ b/xfa/fgas/font/cfgas_pdffontmgr.cpp
@@ -149,7 +149,7 @@
       return false;
 
     if (iDifferLength > 1) {
-      ByteString bsDRTailer = bsDRName.Right(iDifferLength);
+      ByteString bsDRTailer = bsDRName.Last(iDifferLength);
       if (bsDRTailer == "MT" || bsDRTailer == "PSMT" ||
           bsDRTailer == "Regular" || bsDRTailer == "Reg") {
         return true;
@@ -160,17 +160,17 @@
       bool bMatch = false;
       switch (bsPsName[iPsLen - 1]) {
         case 'L':
-          if (bsDRName.Right(5) == "Light")
+          if (bsDRName.Last(5) == "Light")
             bMatch = true;
 
           break;
         case 'R':
-          if (bsDRName.Right(7) == "Regular" || bsDRName.Right(3) == "Reg")
+          if (bsDRName.Last(7) == "Regular" || bsDRName.Last(3) == "Reg")
             bMatch = true;
 
           break;
         case 'M':
-          if (bsDRName.Right(5) == "Medium")
+          if (bsDRName.Last(5) == "Medium")
             bMatch = true;
           break;
         default:
diff --git a/xfa/fwl/cfwl_edit.cpp b/xfa/fwl/cfwl_edit.cpp
index 2a80bd3..1f265b5 100644
--- a/xfa/fwl/cfwl_edit.cpp
+++ b/xfa/fwl/cfwl_edit.cpp
@@ -954,9 +954,9 @@
     return false;
 
   int32_t nLen = wsText.GetLength();
-  WideString l = wsText.Left(m_CursorPosition);
-  WideString r = wsText.Right(nLen - m_CursorPosition);
-  WideString wsNew = l + cNum + r;
+  WideString first = wsText.First(m_CursorPosition);
+  WideString last = wsText.Last(nLen - m_CursorPosition);
+  WideString wsNew = first + cNum + last;
   return wsNew.GetInteger() <= m_iMax;
 }
 
diff --git a/xfa/fxfa/cxfa_eventparam.cpp b/xfa/fxfa/cxfa_eventparam.cpp
index e6eab2c..c3f229d 100644
--- a/xfa/fxfa/cxfa_eventparam.cpp
+++ b/xfa/fxfa/cxfa_eventparam.cpp
@@ -20,6 +20,6 @@
 CXFA_EventParam& CXFA_EventParam::operator=(CXFA_EventParam&& other) = default;
 
 WideString CXFA_EventParam::GetNewText() const {
-  return m_wsPrevText.Left(m_iSelStart) + m_wsChange +
-         m_wsPrevText.Right(m_wsPrevText.GetLength() - m_iSelEnd);
+  return m_wsPrevText.First(m_iSelStart) + m_wsChange +
+         m_wsPrevText.Last(m_wsPrevText.GetLength() - m_iSelEnd);
 }
diff --git a/xfa/fxfa/fm2js/cxfa_fmexpression.cpp b/xfa/fxfa/fm2js/cxfa_fmexpression.cpp
index 6fbe21d..a87ecca 100644
--- a/xfa/fxfa/fm2js/cxfa_fmexpression.cpp
+++ b/xfa/fxfa/fm2js/cxfa_fmexpression.cpp
@@ -24,7 +24,7 @@
     return WideString();
   if (ident[0] != L'!')
     return WideString(ident);
-  return L"pfm__excl__" + ident.Right(ident.GetLength() - 1);
+  return L"pfm__excl__" + ident.Last(ident.GetLength() - 1);
 }
 
 }  // namespace
diff --git a/xfa/fxfa/fm2js/cxfa_fmsimpleexpression.cpp b/xfa/fxfa/fm2js/cxfa_fmsimpleexpression.cpp
index 64b99f1..e94f55a 100644
--- a/xfa/fxfa/fm2js/cxfa_fmsimpleexpression.cpp
+++ b/xfa/fxfa/fm2js/cxfa_fmsimpleexpression.cpp
@@ -171,8 +171,7 @@
   else if (m_wsIdentifier.EqualsASCII("$template"))
     *js << "xfa.template";
   else if (m_wsIdentifier[0] == L'!')
-    *js << "pfm__excl__"
-        << m_wsIdentifier.Right(m_wsIdentifier.GetLength() - 1);
+    *js << "pfm__excl__" << m_wsIdentifier.Last(m_wsIdentifier.GetLength() - 1);
   else
     *js << m_wsIdentifier;
 
diff --git a/xfa/fxfa/layout/cxfa_viewlayoutprocessor.cpp b/xfa/fxfa/layout/cxfa_viewlayoutprocessor.cpp
index 54a9f33..dcfdd47 100644
--- a/xfa/fxfa/layout/cxfa_viewlayoutprocessor.cpp
+++ b/xfa/fxfa/layout/cxfa_viewlayoutprocessor.cpp
@@ -199,12 +199,12 @@
     if (wsExpr[0] == '#') {
       CXFA_Node* pNode = pDocument->GetNodeByID(
           ToNode(pDocument->GetXFAObject(XFA_HASHCODE_Template)),
-          wsExpr.Right(wsExpr.GetLength() - 1).AsStringView());
+          wsExpr.Last(wsExpr.GetLength() - 1).AsStringView());
       if (pNode)
         return pNode;
     } else if (bNewExprStyle) {
       WideString wsProcessedTarget = wsExpr;
-      if (wsExpr.Left(4).EqualsASCII("som(") && wsExpr.Back() == L')')
+      if (wsExpr.First(4).EqualsASCII("som(") && wsExpr.Back() == L')')
         wsProcessedTarget = wsExpr.Substr(4, wsExpr.GetLength() - 5);
 
       XFA_RESOLVENODE_RS rs;
diff --git a/xfa/fxfa/parser/cxfa_barcode.cpp b/xfa/fxfa/parser/cxfa_barcode.cpp
index ae3f9e2..a7dbb71 100644
--- a/xfa/fxfa/parser/cxfa_barcode.cpp
+++ b/xfa/fxfa/parser/cxfa_barcode.cpp
@@ -162,12 +162,12 @@
     return {static_cast<int8_t>(FXSYS_wtoi(wsWideNarrowRatio->c_str()))};
 
   int32_t fB = FXSYS_wtoi(
-      wsWideNarrowRatio->Right(wsWideNarrowRatio->GetLength() - (*ptPos + 1))
+      wsWideNarrowRatio->Last(wsWideNarrowRatio->GetLength() - (*ptPos + 1))
           .c_str());
   if (!fB)
     return {0};
 
-  int32_t fA = FXSYS_wtoi(wsWideNarrowRatio->Left(*ptPos).c_str());
+  int32_t fA = FXSYS_wtoi(wsWideNarrowRatio->First(*ptPos).c_str());
   float result = static_cast<float>(fA) / static_cast<float>(fB);
   return {static_cast<int8_t>(result)};
 }
diff --git a/xfa/fxfa/parser/cxfa_document_parser.cpp b/xfa/fxfa/parser/cxfa_document_parser.cpp
index acefd25..e210b94 100644
--- a/xfa/fxfa/parser/cxfa_document_parser.cpp
+++ b/xfa/fxfa/parser/cxfa_document_parser.cpp
@@ -59,7 +59,7 @@
   if (eMatchFlags & XFA_XDPPACKET_FLAGS_NOMATCH)
     return true;
   if (eMatchFlags & XFA_XDPPACKET_FLAGS_PREFIXMATCH) {
-    return wsNodeStr.Left(wsNamespaceURIPrefix.GetLength()) ==
+    return wsNodeStr.First(wsNamespaceURIPrefix.GetLength()) ==
            wsNamespaceURIPrefix;
   }
 
@@ -74,7 +74,7 @@
     wsLocalAttrName = std::move(wsAttrName);
     return false;
   }
-  wsLocalAttrName = wsAttrName.Right(wsAttrName.GetLength() - pos.value() - 1);
+  wsLocalAttrName = wsAttrName.Last(wsAttrName.GetLength() - pos.value() - 1);
   return true;
 }
 
@@ -84,8 +84,8 @@
                       WideString& wsNamespaceURI) {
   WideString wsNSPrefix;
   if (GetAttributeLocalName(wsAttrName.AsStringView(), wsLocalAttrName)) {
-    wsNSPrefix = wsAttrName.Left(wsAttrName.GetLength() -
-                                 wsLocalAttrName.GetLength() - 1);
+    wsNSPrefix = wsAttrName.First(wsAttrName.GetLength() -
+                                  wsLocalAttrName.GetLength() - 1);
   }
   if (wsLocalAttrName.EqualsASCII("xmlns") || wsNSPrefix.EqualsASCII("xmlns") ||
       wsNSPrefix.EqualsASCII("xml")) {
@@ -111,10 +111,10 @@
         continue;
     } else {
       if (wsLocalAttributeName !=
-          it.first.Right(it.first.GetLength() - pos.value() - 1)) {
+          it.first.Last(it.first.GetLength() - pos.value() - 1)) {
         continue;
       }
-      wsNSPrefix = it.first.Left(pos.value());
+      wsNSPrefix = it.first.First(pos.value());
     }
     if (!XFA_FDEExtension_ResolveNamespaceQualifier(pElement, wsNSPrefix,
                                                     &wsAttrNS) ||
diff --git a/xfa/fxfa/parser/cxfa_localevalue.cpp b/xfa/fxfa/parser/cxfa_localevalue.cpp
index 859e933..0663d38 100644
--- a/xfa/fxfa/parser/cxfa_localevalue.cpp
+++ b/xfa/fxfa/parser/cxfa_localevalue.cpp
@@ -58,8 +58,8 @@
   if (!nSplitIndex.has_value())
     return false;
 
-  wsDate = wsDateTime.Left(nSplitIndex.value());
-  wsTime = wsDateTime.Right(wsDateTime.GetLength() - nSplitIndex.value() - 1);
+  wsDate = wsDateTime.First(nSplitIndex.value());
+  wsTime = wsDateTime.Last(wsDateTime.GetLength() - nSplitIndex.value() - 1);
   return true;
 }
 
diff --git a/xfa/fxfa/parser/cxfa_measurement.cpp b/xfa/fxfa/parser/cxfa_measurement.cpp
index d4e326f..3ce13e6 100644
--- a/xfa/fxfa/parser/cxfa_measurement.cpp
+++ b/xfa/fxfa/parser/cxfa_measurement.cpp
@@ -39,7 +39,7 @@
   }
 
   if (wsMeasure[0] == L'=')
-    wsMeasure = wsMeasure.Right(wsMeasure.GetLength() - 1);
+    wsMeasure = wsMeasure.Last(wsMeasure.GetLength() - 1);
 
   int32_t iUsedLen = 0;
   float fValue = FXSYS_wcstof(wsMeasure.unterminated_c_str(),
@@ -47,7 +47,7 @@
   if (!std::isfinite(fValue))
     fValue = 0.0f;
 
-  wsMeasure = wsMeasure.Right(wsMeasure.GetLength() - iUsedLen);
+  wsMeasure = wsMeasure.Last(wsMeasure.GetLength() - iUsedLen);
   Set(fValue, GetUnitFromString(wsMeasure));
 }
 
diff --git a/xfa/fxfa/parser/cxfa_node.cpp b/xfa/fxfa/parser/cxfa_node.cpp
index a1b2093..05c6061 100644
--- a/xfa/fxfa/parser/cxfa_node.cpp
+++ b/xfa/fxfa/parser/cxfa_node.cpp
@@ -491,8 +491,8 @@
     }
   } else {
     WideString wsURL = wsHref;
-    if (!(wsURL.Left(7).EqualsASCII("http://") ||
-          wsURL.Left(6).EqualsASCII("ftp://"))) {
+    if (!(wsURL.First(7).EqualsASCII("http://") ||
+          wsURL.First(6).EqualsASCII("ftp://"))) {
       RetainPtr<CFX_DIBitmap> pBitmap =
           pDoc->GetPDFNamedImage(wsURL.AsStringView(), iImageXDpi, iImageYDpi);
       if (pBitmap) {
@@ -525,14 +525,14 @@
   if (!nSplitIndex.has_value())
     return false;
 
-  wsDate = wsDateTime.Left(nSplitIndex.value());
+  wsDate = wsDateTime.First(nSplitIndex.value());
   if (!wsDate.IsEmpty()) {
     if (!std::any_of(wsDate.begin(), wsDate.end(),
                      [](wchar_t c) { return FXSYS_IsDecimalDigit(c); })) {
       return false;
     }
   }
-  wsTime = wsDateTime.Right(wsDateTime.GetLength() - nSplitIndex.value() - 1);
+  wsTime = wsDateTime.Last(wsDateTime.GetLength() - nSplitIndex.value() - 1);
   if (!wsTime.IsEmpty()) {
     if (!std::any_of(wsTime.begin(), wsTime.end(),
                      [](wchar_t c) { return FXSYS_IsDecimalDigit(c); })) {
@@ -674,7 +674,7 @@
   }
   if (dot_index.value() < wsSrcNum.GetLength()) {
     wsOutput += pLocale->GetDecimalSymbol();
-    wsOutput += wsSrcNum.Right(wsSrcNum.GetLength() - dot_index.value() - 1);
+    wsOutput += wsSrcNum.Last(wsSrcNum.GetLength() - dot_index.value() - 1);
   }
   if (bNeg)
     return pLocale->GetMinusSymbol() + wsOutput;
@@ -1727,7 +1727,7 @@
         WideString wsInstName =
             pNode->JSObject()->GetCData(XFA_Attribute::Name);
         if (wsInstName.GetLength() > 0 && wsInstName[0] == '_' &&
-            wsInstName.Right(wsInstName.GetLength() - 1) == wsName) {
+            wsInstName.Last(wsInstName.GetLength() - 1) == wsName) {
           pInstanceMgr = pNode;
         }
         break;
@@ -1817,7 +1817,7 @@
       WideString wsName = pNode->JSObject()->GetCData(XFA_Attribute::Name);
       WideString wsInstName = JSObject()->GetCData(XFA_Attribute::Name);
       if (wsInstName.GetLength() < 1 || wsInstName[0] != '_' ||
-          wsInstName.Right(wsInstName.GetLength() - 1) != wsName) {
+          wsInstName.Last(wsInstName.GetLength() - 1) != wsName) {
         return nullptr;
       }
       dwNameHash = pNode->GetNameHash();
@@ -1848,7 +1848,7 @@
       WideString wsName = pNode->JSObject()->GetCData(XFA_Attribute::Name);
       WideString wsInstName = JSObject()->GetCData(XFA_Attribute::Name);
       if (wsInstName.GetLength() < 1 || wsInstName[0] != '_' ||
-          wsInstName.Right(wsInstName.GetLength() - 1) != wsName) {
+          wsInstName.Last(wsInstName.GetLength() - 1) != wsName) {
         return iCount;
       }
       dwNameHash = pNode->GetNameHash();
diff --git a/xfa/fxfa/parser/cxfa_nodehelper.cpp b/xfa/fxfa/parser/cxfa_nodehelper.cpp
index 28d7aff..dde90bc 100644
--- a/xfa/fxfa/parser/cxfa_nodehelper.cpp
+++ b/xfa/fxfa/parser/cxfa_nodehelper.cpp
@@ -69,13 +69,13 @@
   bool bIsClassName = false;
   bool bResult = false;
   if (!wsNameView.IsEmpty() && wsNameView[0] == '!') {
-    wsNameView = wsNameView.Right(wsNameView.GetLength() - 1);
+    wsNameView = wsNameView.Last(wsNameView.GetLength() - 1);
     m_pCreateParent = ToNode(
         pScriptContext->GetDocument()->GetXFAObject(XFA_HASHCODE_Datasets));
   }
   if (!wsNameView.IsEmpty() && wsNameView[0] == '#') {
     bIsClassName = true;
-    wsNameView = wsNameView.Right(wsNameView.GetLength() - 1);
+    wsNameView = wsNameView.Last(wsNameView.GetLength() - 1);
   }
   if (wsNameView.IsEmpty())
     return false;
