diff --git a/core/fxcrt/cfx_decimal.cpp b/core/fxcrt/cfx_decimal.cpp
index 65fed4e..781aff5 100644
--- a/core/fxcrt/cfx_decimal.cpp
+++ b/core/fxcrt/cfx_decimal.cpp
@@ -294,7 +294,7 @@
   m_uFlags = FXMATH_DECIMAL_MAKEFLAGS(val < 0 && IsNotZero(), scale);
 }
 
-CFX_Decimal::CFX_Decimal(const WideStringView& strObj) {
+CFX_Decimal::CFX_Decimal(WideStringView strObj) {
   const wchar_t* str = strObj.unterminated_c_str();
   const wchar_t* strBound = str + strObj.GetLength();
   bool pointmet = false;
diff --git a/core/fxcrt/cfx_decimal.h b/core/fxcrt/cfx_decimal.h
index de6e3de..6542eee 100644
--- a/core/fxcrt/cfx_decimal.h
+++ b/core/fxcrt/cfx_decimal.h
@@ -16,7 +16,7 @@
   explicit CFX_Decimal(uint64_t val);
   explicit CFX_Decimal(int32_t val);
   CFX_Decimal(float val, uint8_t scale);
-  explicit CFX_Decimal(const WideStringView& str);
+  explicit CFX_Decimal(WideStringView str);
 
   operator WideString() const;
   operator double() const;
diff --git a/core/fxcrt/cfx_fileaccess_posix.cpp b/core/fxcrt/cfx_fileaccess_posix.cpp
index fdba53b..6dfb325 100644
--- a/core/fxcrt/cfx_fileaccess_posix.cpp
+++ b/core/fxcrt/cfx_fileaccess_posix.cpp
@@ -65,8 +65,7 @@
   return m_nFD > -1;
 }
 
-bool CFX_FileAccess_Posix::Open(const WideStringView& fileName,
-                                uint32_t dwMode) {
+bool CFX_FileAccess_Posix::Open(WideStringView fileName, uint32_t dwMode) {
   return Open(FX_UTF8Encode(fileName).AsStringView(), dwMode);
 }
 
diff --git a/core/fxcrt/cfx_fileaccess_posix.h b/core/fxcrt/cfx_fileaccess_posix.h
index c759d8c..cc05a5d 100644
--- a/core/fxcrt/cfx_fileaccess_posix.h
+++ b/core/fxcrt/cfx_fileaccess_posix.h
@@ -23,7 +23,7 @@
 
   // FileAccessIface:
   bool Open(const ByteStringView& fileName, uint32_t dwMode) override;
-  bool Open(const WideStringView& fileName, uint32_t dwMode) override;
+  bool Open(WideStringView fileName, uint32_t dwMode) override;
   void Close() override;
   FX_FILESIZE GetSize() const override;
   FX_FILESIZE GetPosition() const override;
diff --git a/core/fxcrt/cfx_fileaccess_windows.cpp b/core/fxcrt/cfx_fileaccess_windows.cpp
index 242c202..236dc7e 100644
--- a/core/fxcrt/cfx_fileaccess_windows.cpp
+++ b/core/fxcrt/cfx_fileaccess_windows.cpp
@@ -55,8 +55,7 @@
   return !!m_hFile;
 }
 
-bool CFX_FileAccess_Windows::Open(const WideStringView& fileName,
-                                  uint32_t dwMode) {
+bool CFX_FileAccess_Windows::Open(WideStringView fileName, uint32_t dwMode) {
   if (m_hFile)
     return false;
 
diff --git a/core/fxcrt/cfx_fileaccess_windows.h b/core/fxcrt/cfx_fileaccess_windows.h
index 6d58409..175fb7e 100644
--- a/core/fxcrt/cfx_fileaccess_windows.h
+++ b/core/fxcrt/cfx_fileaccess_windows.h
@@ -21,7 +21,7 @@
 
   // FileAccessIface
   bool Open(const ByteStringView& fileName, uint32_t dwMode) override;
-  bool Open(const WideStringView& fileName, uint32_t dwMode) override;
+  bool Open(WideStringView fileName, uint32_t dwMode) override;
   void Close() override;
   FX_FILESIZE GetSize() const override;
   FX_FILESIZE GetPosition() const override;
diff --git a/core/fxcrt/cfx_widetextbuf.cpp b/core/fxcrt/cfx_widetextbuf.cpp
index c2af175..61e2a8d 100644
--- a/core/fxcrt/cfx_widetextbuf.cpp
+++ b/core/fxcrt/cfx_widetextbuf.cpp
@@ -25,7 +25,7 @@
   return *this;
 }
 
-CFX_WideTextBuf& CFX_WideTextBuf::operator<<(const WideStringView& str) {
+CFX_WideTextBuf& CFX_WideTextBuf::operator<<(WideStringView str) {
   AppendBlock(str.unterminated_c_str(), str.GetLength() * sizeof(wchar_t));
   return *this;
 }
diff --git a/core/fxcrt/cfx_widetextbuf.h b/core/fxcrt/cfx_widetextbuf.h
index c4de5d3..6eaef95 100644
--- a/core/fxcrt/cfx_widetextbuf.h
+++ b/core/fxcrt/cfx_widetextbuf.h
@@ -37,7 +37,7 @@
   CFX_WideTextBuf& operator<<(double f);
   CFX_WideTextBuf& operator<<(const ByteStringView& ascii);
   CFX_WideTextBuf& operator<<(const wchar_t* lpsz);
-  CFX_WideTextBuf& operator<<(const WideStringView& str);
+  CFX_WideTextBuf& operator<<(WideStringView str);
   CFX_WideTextBuf& operator<<(const WideString& str);
   CFX_WideTextBuf& operator<<(const CFX_WideTextBuf& buf);
 };
diff --git a/core/fxcrt/css/cfx_cssdeclaration.cpp b/core/fxcrt/css/cfx_cssdeclaration.cpp
index b2187ac..9f24019 100644
--- a/core/fxcrt/css/cfx_cssdeclaration.cpp
+++ b/core/fxcrt/css/cfx_cssdeclaration.cpp
@@ -164,7 +164,7 @@
 }
 
 void CFX_CSSDeclaration::AddProperty(const CFX_CSSData::Property* property,
-                                     const WideStringView& value) {
+                                     WideStringView value) {
   ASSERT(!value.IsEmpty());
 
   const wchar_t* pszValue = value.unterminated_c_str();
diff --git a/core/fxcrt/css/cfx_cssdeclaration.h b/core/fxcrt/css/cfx_cssdeclaration.h
index 5092da4..f3d87cc 100644
--- a/core/fxcrt/css/cfx_cssdeclaration.h
+++ b/core/fxcrt/css/cfx_cssdeclaration.h
@@ -46,8 +46,7 @@
 
   bool empty() const { return properties_.empty(); }
 
-  void AddProperty(const CFX_CSSData::Property* property,
-                   const WideStringView& value);
+  void AddProperty(const CFX_CSSData::Property* property, WideStringView value);
   void AddProperty(const WideString& prop, const WideString& value);
 
   size_t PropertyCountForTesting() const;
diff --git a/core/fxcrt/css/cfx_cssselector.cpp b/core/fxcrt/css/cfx_cssselector.cpp
index 510114f..cd90f62 100644
--- a/core/fxcrt/css/cfx_cssselector.cpp
+++ b/core/fxcrt/css/cfx_cssselector.cpp
@@ -49,7 +49,7 @@
 
 // static.
 std::unique_ptr<CFX_CSSSelector> CFX_CSSSelector::FromString(
-    const WideStringView& str) {
+    WideStringView str) {
   ASSERT(!str.IsEmpty());
 
   const wchar_t* psz = str.unterminated_c_str();
diff --git a/core/fxcrt/css/cfx_cssselector.h b/core/fxcrt/css/cfx_cssselector.h
index 62f8b16..14b61ee 100644
--- a/core/fxcrt/css/cfx_cssselector.h
+++ b/core/fxcrt/css/cfx_cssselector.h
@@ -15,7 +15,7 @@
 
 class CFX_CSSSelector {
  public:
-  static std::unique_ptr<CFX_CSSSelector> FromString(const WideStringView& str);
+  static std::unique_ptr<CFX_CSSSelector> FromString(WideStringView str);
 
   CFX_CSSSelector(CFX_CSSSelectorType eType,
                   const wchar_t* psz,
diff --git a/core/fxcrt/fileaccess_iface.h b/core/fxcrt/fileaccess_iface.h
index fdabc74..180462b 100644
--- a/core/fxcrt/fileaccess_iface.h
+++ b/core/fxcrt/fileaccess_iface.h
@@ -19,7 +19,7 @@
   virtual ~FileAccessIface() = default;
 
   virtual bool Open(const ByteStringView& fileName, uint32_t dwMode) = 0;
-  virtual bool Open(const WideStringView& fileName, uint32_t dwMode) = 0;
+  virtual bool Open(WideStringView fileName, uint32_t dwMode) = 0;
   virtual void Close() = 0;
   virtual FX_FILESIZE GetSize() const = 0;
   virtual FX_FILESIZE GetPosition() const = 0;
diff --git a/core/fxcrt/fx_string.cpp b/core/fxcrt/fx_string.cpp
index 64bcd77..58284ab 100644
--- a/core/fxcrt/fx_string.cpp
+++ b/core/fxcrt/fx_string.cpp
@@ -14,7 +14,7 @@
 #include "core/fxcrt/fx_extension.h"
 #include "third_party/base/compiler_specific.h"
 
-ByteString FX_UTF8Encode(const WideStringView& wsStr) {
+ByteString FX_UTF8Encode(WideStringView wsStr) {
   size_t len = wsStr.GetLength();
   const wchar_t* pStr = wsStr.unterminated_c_str();
   CFX_UTF8Encoder encoder;
@@ -87,7 +87,7 @@
   return bNegative ? -value : value;
 }
 
-float StringToFloat(const WideStringView& wsStr) {
+float StringToFloat(WideStringView wsStr) {
   return StringToFloat(FX_UTF8Encode(wsStr).c_str());
 }
 
diff --git a/core/fxcrt/fx_string.h b/core/fxcrt/fx_string.h
index 8d93150..8854ec7 100644
--- a/core/fxcrt/fx_string.h
+++ b/core/fxcrt/fx_string.h
@@ -16,11 +16,11 @@
   (((uint32_t)c1 << 24) | ((uint32_t)c2 << 16) | ((uint32_t)c3 << 8) | \
    ((uint32_t)c4))
 
-ByteString FX_UTF8Encode(const WideStringView& wsStr);
+ByteString FX_UTF8Encode(WideStringView wsStr);
 WideString FX_UTF8Decode(const ByteStringView& bsStr);
 
 float StringToFloat(const ByteStringView& str);
-float StringToFloat(const WideStringView& wsStr);
+float StringToFloat(WideStringView wsStr);
 size_t FloatToString(float f, char* buf);
 
 #endif  // CORE_FXCRT_FX_STRING_H_
diff --git a/core/fxcrt/widestring.cpp b/core/fxcrt/widestring.cpp
index 1ba0011..5c9f0fa 100644
--- a/core/fxcrt/widestring.cpp
+++ b/core/fxcrt/widestring.cpp
@@ -343,14 +343,14 @@
 WideString::WideString(const wchar_t* ptr)
     : WideString(ptr, ptr ? wcslen(ptr) : 0) {}
 
-WideString::WideString(const WideStringView& stringSrc) {
+WideString::WideString(WideStringView stringSrc) {
   if (!stringSrc.IsEmpty()) {
     m_pData.Reset(StringData::Create(stringSrc.unterminated_c_str(),
                                      stringSrc.GetLength()));
   }
 }
 
-WideString::WideString(const WideStringView& str1, const WideStringView& str2) {
+WideString::WideString(WideStringView str1, WideStringView str2) {
   FX_SAFE_SIZE_T nSafeLen = str1.GetLength();
   nSafeLen += str2.GetLength();
 
@@ -394,7 +394,7 @@
   return *this;
 }
 
-const WideString& WideString::operator=(const WideStringView& stringSrc) {
+const WideString& WideString::operator=(WideStringView stringSrc) {
   if (stringSrc.IsEmpty())
     clear();
   else
@@ -436,7 +436,7 @@
   return *this;
 }
 
-const WideString& WideString::operator+=(const WideStringView& str) {
+const WideString& WideString::operator+=(WideStringView str) {
   if (!str.IsEmpty())
     Concat(str.unterminated_c_str(), str.GetLength());
 
@@ -454,7 +454,7 @@
          wmemcmp(ptr, m_pData->m_String, m_pData->m_nDataLength) == 0;
 }
 
-bool WideString::operator==(const WideStringView& str) const {
+bool WideString::operator==(WideStringView str) const {
   if (!m_pData)
     return str.IsEmpty();
 
@@ -482,7 +482,7 @@
   return Compare(ptr) < 0;
 }
 
-bool WideString::operator<(const WideStringView& str) const {
+bool WideString::operator<(WideStringView str) const {
   if (!m_pData && !str.unterminated_c_str())
     return false;
   if (c_str() == str.unterminated_c_str())
@@ -757,8 +757,7 @@
               : Optional<size_t>();
 }
 
-Optional<size_t> WideString::Find(const WideStringView& subStr,
-                                  size_t start) const {
+Optional<size_t> WideString::Find(WideStringView subStr, size_t start) const {
   if (!m_pData)
     return Optional<size_t>();
 
@@ -822,8 +821,7 @@
   return count;
 }
 
-size_t WideString::Replace(const WideStringView& pOld,
-                           const WideStringView& pNew) {
+size_t WideString::Replace(WideStringView pOld, WideStringView pNew) {
   if (!m_pData || pOld.IsEmpty())
     return 0;
 
@@ -974,7 +972,7 @@
   TrimLeft(str);
 }
 
-void WideString::Trim(const WideStringView& targets) {
+void WideString::Trim(WideStringView targets) {
   TrimRight(targets);
   TrimLeft(targets);
 }
@@ -988,7 +986,7 @@
   TrimLeft(str);
 }
 
-void WideString::TrimLeft(const WideStringView& targets) {
+void WideString::TrimLeft(WideStringView targets) {
   if (!m_pData || targets.IsEmpty())
     return;
 
@@ -1026,7 +1024,7 @@
   TrimRight(str);
 }
 
-void WideString::TrimRight(const WideStringView& targets) {
+void WideString::TrimRight(WideStringView targets) {
   if (IsEmpty() || targets.IsEmpty())
     return;
 
@@ -1054,18 +1052,18 @@
   return os;
 }
 
-std::wostream& operator<<(std::wostream& os, const WideStringView& str) {
+std::wostream& operator<<(std::wostream& os, WideStringView str) {
   return os.write(str.unterminated_c_str(), str.GetLength());
 }
 
-std::ostream& operator<<(std::ostream& os, const WideStringView& str) {
+std::ostream& operator<<(std::ostream& os, WideStringView str) {
   os << FX_UTF8Encode(str);
   return os;
 }
 
 }  // namespace fxcrt
 
-uint32_t FX_HashCode_GetW(const WideStringView& str, bool bIgnoreCase) {
+uint32_t FX_HashCode_GetW(WideStringView str, bool bIgnoreCase) {
   uint32_t dwHashCode = 0;
   if (bIgnoreCase) {
     for (wchar_t c : str)  // match FXSYS_towlower() arg type.
diff --git a/core/fxcrt/widestring.h b/core/fxcrt/widestring.h
index d77ba03..3cc2f9a 100644
--- a/core/fxcrt/widestring.h
+++ b/core/fxcrt/widestring.h
@@ -53,8 +53,8 @@
 
   WideString(const wchar_t* ptr, size_t len);
 
-  explicit WideString(const WideStringView& str);
-  WideString(const WideStringView& str1, const WideStringView& str2);
+  explicit WideString(WideStringView str);
+  WideString(WideStringView str1, WideStringView str2);
   WideString(const std::initializer_list<WideStringView>& list);
 
   ~WideString();
@@ -109,25 +109,25 @@
   bool IsValidLength(size_t length) const { return length <= GetLength(); }
 
   const WideString& operator=(const wchar_t* str);
-  const WideString& operator=(const WideStringView& stringSrc);
+  const WideString& operator=(WideStringView stringSrc);
   const WideString& operator=(const WideString& that);
   const WideString& operator=(WideString&& that);
 
   const WideString& operator+=(const wchar_t* str);
   const WideString& operator+=(wchar_t ch);
   const WideString& operator+=(const WideString& str);
-  const WideString& operator+=(const WideStringView& str);
+  const WideString& operator+=(WideStringView str);
 
   bool operator==(const wchar_t* ptr) const;
-  bool operator==(const WideStringView& str) const;
+  bool operator==(WideStringView str) const;
   bool operator==(const WideString& other) const;
 
   bool operator!=(const wchar_t* ptr) const { return !(*this == ptr); }
-  bool operator!=(const WideStringView& str) const { return !(*this == str); }
+  bool operator!=(WideStringView str) const { return !(*this == str); }
   bool operator!=(const WideString& other) const { return !(*this == other); }
 
   bool operator<(const wchar_t* ptr) const;
-  bool operator<(const WideStringView& str) const;
+  bool operator<(WideStringView str) const;
   bool operator<(const WideString& other) const;
 
   CharType operator[](const size_t index) const {
@@ -158,15 +158,15 @@
 
   void Trim();
   void Trim(wchar_t target);
-  void Trim(const WideStringView& targets);
+  void Trim(WideStringView targets);
 
   void TrimLeft();
   void TrimLeft(wchar_t target);
-  void TrimLeft(const WideStringView& targets);
+  void TrimLeft(WideStringView targets);
 
   void TrimRight();
   void TrimRight(wchar_t target);
-  void TrimRight(const WideStringView& targets);
+  void TrimRight(WideStringView targets);
 
   void Reserve(size_t len);
 
@@ -177,10 +177,10 @@
 
   int GetInteger() const;
 
-  Optional<size_t> Find(const WideStringView& pSub, size_t start = 0) const;
+  Optional<size_t> Find(WideStringView pSub, size_t start = 0) const;
   Optional<size_t> Find(wchar_t ch, size_t start = 0) const;
 
-  bool Contains(const WideStringView& lpszSub, size_t start = 0) const {
+  bool Contains(WideStringView lpszSub, size_t start = 0) const {
     return Find(lpszSub, start).has_value();
   }
 
@@ -188,7 +188,7 @@
     return Find(ch, start).has_value();
   }
 
-  size_t Replace(const WideStringView& pOld, const WideStringView& pNew);
+  size_t Replace(WideStringView pOld, WideStringView pNew);
   size_t Remove(wchar_t ch);
 
   bool IsASCII() const { return AsStringView().IsASCII(); }
@@ -225,20 +225,19 @@
   friend StringPool_WideString_Test;
 };
 
-inline WideString operator+(const WideStringView& str1,
-                            const WideStringView& str2) {
+inline WideString operator+(WideStringView str1, WideStringView str2) {
   return WideString(str1, str2);
 }
-inline WideString operator+(const WideStringView& str1, const wchar_t* str2) {
+inline WideString operator+(WideStringView str1, const wchar_t* str2) {
   return WideString(str1, str2);
 }
-inline WideString operator+(const wchar_t* str1, const WideStringView& str2) {
+inline WideString operator+(const wchar_t* str1, WideStringView str2) {
   return WideString(str1, str2);
 }
-inline WideString operator+(const WideStringView& str1, wchar_t ch) {
+inline WideString operator+(WideStringView str1, wchar_t ch) {
   return WideString(str1, WideStringView(ch));
 }
-inline WideString operator+(wchar_t ch, const WideStringView& str2) {
+inline WideString operator+(wchar_t ch, WideStringView str2) {
   return WideString(ch, str2);
 }
 inline WideString operator+(const WideString& str1, const WideString& str2) {
@@ -256,24 +255,22 @@
 inline WideString operator+(const wchar_t* str1, const WideString& str2) {
   return WideString(str1, str2.AsStringView());
 }
-inline WideString operator+(const WideString& str1,
-                            const WideStringView& str2) {
+inline WideString operator+(const WideString& str1, WideStringView str2) {
   return WideString(str1.AsStringView(), str2);
 }
-inline WideString operator+(const WideStringView& str1,
-                            const WideString& str2) {
+inline WideString operator+(WideStringView str1, const WideString& str2) {
   return WideString(str1, str2.AsStringView());
 }
 inline bool operator==(const wchar_t* lhs, const WideString& rhs) {
   return rhs == lhs;
 }
-inline bool operator==(const WideStringView& lhs, const WideString& rhs) {
+inline bool operator==(WideStringView lhs, const WideString& rhs) {
   return rhs == lhs;
 }
 inline bool operator!=(const wchar_t* lhs, const WideString& rhs) {
   return rhs != lhs;
 }
-inline bool operator!=(const WideStringView& lhs, const WideString& rhs) {
+inline bool operator!=(WideStringView lhs, const WideString& rhs) {
   return rhs != lhs;
 }
 inline bool operator<(const wchar_t* lhs, const WideString& rhs) {
@@ -282,14 +279,14 @@
 
 std::wostream& operator<<(std::wostream& os, const WideString& str);
 std::ostream& operator<<(std::ostream& os, const WideString& str);
-std::wostream& operator<<(std::wostream& os, const WideStringView& str);
-std::ostream& operator<<(std::ostream& os, const WideStringView& str);
+std::wostream& operator<<(std::wostream& os, WideStringView str);
+std::ostream& operator<<(std::ostream& os, WideStringView str);
 
 }  // namespace fxcrt
 
 using WideString = fxcrt::WideString;
 
-uint32_t FX_HashCode_GetW(const WideStringView& str, bool bIgnoreCase);
+uint32_t FX_HashCode_GetW(WideStringView str, bool bIgnoreCase);
 
 namespace std {
 
diff --git a/core/fxcrt/xml/cfx_xmlelement.cpp b/core/fxcrt/xml/cfx_xmlelement.cpp
index e09fc57..6508262 100644
--- a/core/fxcrt/xml/cfx_xmlelement.cpp
+++ b/core/fxcrt/xml/cfx_xmlelement.cpp
@@ -112,12 +112,11 @@
   pXMLStream->WriteString(">\n");
 }
 
-CFX_XMLElement* CFX_XMLElement::GetFirstChildNamed(
-    const WideStringView& name) const {
+CFX_XMLElement* CFX_XMLElement::GetFirstChildNamed(WideStringView name) const {
   return GetNthChildNamed(name, 0);
 }
 
-CFX_XMLElement* CFX_XMLElement::GetNthChildNamed(const WideStringView& name,
+CFX_XMLElement* CFX_XMLElement::GetNthChildNamed(WideStringView name,
                                                  size_t idx) const {
   for (auto* child = GetFirstChild(); child; child = child->GetNextSibling()) {
     CFX_XMLElement* elem = ToXMLElement(child);
diff --git a/core/fxcrt/xml/cfx_xmlelement.h b/core/fxcrt/xml/cfx_xmlelement.h
index 822f5ec..7ebd584 100644
--- a/core/fxcrt/xml/cfx_xmlelement.h
+++ b/core/fxcrt/xml/cfx_xmlelement.h
@@ -35,9 +35,8 @@
 
   void RemoveAttribute(const WideString& name);
 
-  CFX_XMLElement* GetFirstChildNamed(const WideStringView& name) const;
-  CFX_XMLElement* GetNthChildNamed(const WideStringView& name,
-                                   size_t idx) const;
+  CFX_XMLElement* GetFirstChildNamed(WideStringView name) const;
+  CFX_XMLElement* GetNthChildNamed(WideStringView name, size_t idx) const;
 
   WideString GetLocalTagName() const;
   WideString GetNamespacePrefix() const;
diff --git a/core/fxge/dib/fx_dib_main.cpp b/core/fxge/dib/fx_dib_main.cpp
index 0cf0cba..63b757e 100644
--- a/core/fxge/dib/fx_dib_main.cpp
+++ b/core/fxge/dib/fx_dib_main.cpp
@@ -119,7 +119,7 @@
                     FXSYS_GetBValue(colorref));
 }
 
-FX_ARGB StringToFXARGB(const WideStringView& wsValue) {
+FX_ARGB StringToFXARGB(WideStringView wsValue) {
   static constexpr FX_ARGB kDefaultValue = 0xff000000;
   if (wsValue.GetLength() == 0)
     return kDefaultValue;
diff --git a/core/fxge/fx_dib.h b/core/fxge/fx_dib.h
index 8cb7040..86173e2 100644
--- a/core/fxge/fx_dib.h
+++ b/core/fxge/fx_dib.h
@@ -138,7 +138,7 @@
 
 FX_ARGB AlphaAndColorRefToArgb(int a, FX_COLORREF colorref);
 
-FX_ARGB StringToFXARGB(const WideStringView& view);
+FX_ARGB StringToFXARGB(WideStringView view);
 
 #define FXARGB_A(argb) ((uint8_t)((argb) >> 24))
 #define FXARGB_R(argb) ((uint8_t)((argb) >> 16))
diff --git a/fpdfsdk/fpdf_formfill_embeddertest.cpp b/fpdfsdk/fpdf_formfill_embeddertest.cpp
index b54fa62..8b6023a 100644
--- a/fpdfsdk/fpdf_formfill_embeddertest.cpp
+++ b/fpdfsdk/fpdf_formfill_embeddertest.cpp
@@ -113,7 +113,7 @@
     FORM_OnLButtonUp(form_handle(), page_, 0, end.x, end.y);
   }
 
-  void CheckSelection(const WideStringView& expected_string) {
+  void CheckSelection(WideStringView expected_string) {
     unsigned long actual_len =
         FORM_GetSelectedText(form_handle(), page_, nullptr, 0);
     ASSERT_NE(actual_len, 0U);
@@ -127,7 +127,7 @@
     EXPECT_EQ(expected_string, WideString::FromUTF16LE(buf.data(), num_chars));
   }
 
-  void CheckFocusedFieldText(const WideStringView& expected_string) {
+  void CheckFocusedFieldText(WideStringView expected_string) {
     unsigned long actual_len =
         FORM_GetFocusedText(form_handle(), page_, nullptr, 0);
     ASSERT_NE(actual_len, 0U);
diff --git a/fxbarcode/cbc_codabar.cpp b/fxbarcode/cbc_codabar.cpp
index 1aace5e..5822cbe 100644
--- a/fxbarcode/cbc_codabar.cpp
+++ b/fxbarcode/cbc_codabar.cpp
@@ -31,7 +31,7 @@
 
 CBC_Codabar::~CBC_Codabar() {}
 
-bool CBC_Codabar::Encode(const WideStringView& contents) {
+bool CBC_Codabar::Encode(WideStringView contents) {
   if (contents.IsEmpty())
     return false;
 
diff --git a/fxbarcode/cbc_codabar.h b/fxbarcode/cbc_codabar.h
index 3e2bc6f..a3e1df4 100644
--- a/fxbarcode/cbc_codabar.h
+++ b/fxbarcode/cbc_codabar.h
@@ -20,7 +20,7 @@
 
   // CBC_OneCode:
   BC_TYPE GetType() override;
-  bool Encode(const WideStringView& contents) override;
+  bool Encode(WideStringView contents) override;
   bool RenderDevice(CFX_RenderDevice* device,
                     const CFX_Matrix* matrix) override;
 
diff --git a/fxbarcode/cbc_code128.cpp b/fxbarcode/cbc_code128.cpp
index 237ac57..712c1f7 100644
--- a/fxbarcode/cbc_code128.cpp
+++ b/fxbarcode/cbc_code128.cpp
@@ -31,7 +31,7 @@
 
 CBC_Code128::~CBC_Code128() {}
 
-bool CBC_Code128::Encode(const WideStringView& contents) {
+bool CBC_Code128::Encode(WideStringView contents) {
   if (contents.IsEmpty())
     return false;
 
diff --git a/fxbarcode/cbc_code128.h b/fxbarcode/cbc_code128.h
index 606b36e..2ccf07d 100644
--- a/fxbarcode/cbc_code128.h
+++ b/fxbarcode/cbc_code128.h
@@ -20,7 +20,7 @@
 
   // CBC_OneCode:
   BC_TYPE GetType() override;
-  bool Encode(const WideStringView& contents) override;
+  bool Encode(WideStringView contents) override;
   bool RenderDevice(CFX_RenderDevice* device,
                     const CFX_Matrix* matrix) override;
 
diff --git a/fxbarcode/cbc_code39.cpp b/fxbarcode/cbc_code39.cpp
index 00c4bc0..63a3c56 100644
--- a/fxbarcode/cbc_code39.cpp
+++ b/fxbarcode/cbc_code39.cpp
@@ -31,7 +31,7 @@
 
 CBC_Code39::~CBC_Code39() {}
 
-bool CBC_Code39::Encode(const WideStringView& contents) {
+bool CBC_Code39::Encode(WideStringView contents) {
   if (contents.IsEmpty())
     return false;
 
diff --git a/fxbarcode/cbc_code39.h b/fxbarcode/cbc_code39.h
index d129fa4..ab48292 100644
--- a/fxbarcode/cbc_code39.h
+++ b/fxbarcode/cbc_code39.h
@@ -21,7 +21,7 @@
 
   // CBC_OneCode:
   BC_TYPE GetType() override;
-  bool Encode(const WideStringView& contents) override;
+  bool Encode(WideStringView contents) override;
   bool RenderDevice(CFX_RenderDevice* device,
                     const CFX_Matrix* matrix) override;
 
diff --git a/fxbarcode/cbc_codebase.h b/fxbarcode/cbc_codebase.h
index 86d10c3..75070fa 100644
--- a/fxbarcode/cbc_codebase.h
+++ b/fxbarcode/cbc_codebase.h
@@ -26,7 +26,7 @@
   virtual ~CBC_CodeBase();
 
   virtual BC_TYPE GetType() = 0;
-  virtual bool Encode(const WideStringView& contents) = 0;
+  virtual bool Encode(WideStringView contents) = 0;
   virtual bool RenderDevice(CFX_RenderDevice* device,
                             const CFX_Matrix* matrix) = 0;
 
diff --git a/fxbarcode/cbc_datamatrix.cpp b/fxbarcode/cbc_datamatrix.cpp
index bebff2d..e8695d2 100644
--- a/fxbarcode/cbc_datamatrix.cpp
+++ b/fxbarcode/cbc_datamatrix.cpp
@@ -31,7 +31,7 @@
 
 CBC_DataMatrix::~CBC_DataMatrix() = default;
 
-bool CBC_DataMatrix::Encode(const WideStringView& contents) {
+bool CBC_DataMatrix::Encode(WideStringView contents) {
   int32_t width;
   int32_t height;
   auto* pWriter = GetDataMatrixWriter();
diff --git a/fxbarcode/cbc_datamatrix.h b/fxbarcode/cbc_datamatrix.h
index f28e762..c504c95 100644
--- a/fxbarcode/cbc_datamatrix.h
+++ b/fxbarcode/cbc_datamatrix.h
@@ -19,7 +19,7 @@
   ~CBC_DataMatrix() override;
 
   // CBC_OneCode:
-  bool Encode(const WideStringView& contents) override;
+  bool Encode(WideStringView contents) override;
   bool RenderDevice(CFX_RenderDevice* device,
                     const CFX_Matrix* matrix) override;
   BC_TYPE GetType() override;
diff --git a/fxbarcode/cbc_eancode.cpp b/fxbarcode/cbc_eancode.cpp
index 6325b85..ffb116e 100644
--- a/fxbarcode/cbc_eancode.cpp
+++ b/fxbarcode/cbc_eancode.cpp
@@ -19,7 +19,7 @@
   return static_cast<CBC_OneDimEANWriter*>(m_pBCWriter.get());
 }
 
-bool CBC_EANCode::Encode(const WideStringView& contents) {
+bool CBC_EANCode::Encode(WideStringView contents) {
   if (contents.IsEmpty())
     return false;
 
@@ -42,7 +42,7 @@
       device, matrix, m_renderContents.AsStringView());
 }
 
-WideString CBC_EANCode::Preprocess(const WideStringView& contents) {
+WideString CBC_EANCode::Preprocess(WideStringView contents) {
   auto* pWriter = GetOneDimEANWriter();
   WideString encoded_contents = pWriter->FilterContents(contents);
   size_t length = encoded_contents.GetLength();
diff --git a/fxbarcode/cbc_eancode.h b/fxbarcode/cbc_eancode.h
index 5c2e737..572bb42 100644
--- a/fxbarcode/cbc_eancode.h
+++ b/fxbarcode/cbc_eancode.h
@@ -24,13 +24,13 @@
   virtual size_t GetMaxLength() const = 0;
 
   // CBC_EANCode:
-  bool Encode(const WideStringView& contents) override;
+  bool Encode(WideStringView contents) override;
   bool RenderDevice(CFX_RenderDevice* device,
                     const CFX_Matrix* matrix) override;
 
  protected:
   CBC_OneDimEANWriter* GetOneDimEANWriter();
-  WideString Preprocess(const WideStringView& contents);
+  WideString Preprocess(WideStringView contents);
 
   WideString m_renderContents;
 };
diff --git a/fxbarcode/cbc_onecode.cpp b/fxbarcode/cbc_onecode.cpp
index fb8cb05..05501bd 100644
--- a/fxbarcode/cbc_onecode.cpp
+++ b/fxbarcode/cbc_onecode.cpp
@@ -30,11 +30,11 @@
 
 CBC_OneCode::~CBC_OneCode() {}
 
-bool CBC_OneCode::CheckContentValidity(const WideStringView& contents) {
+bool CBC_OneCode::CheckContentValidity(WideStringView contents) {
   return GetOneDimWriter()->CheckContentValidity(contents);
 }
 
-WideString CBC_OneCode::FilterContents(const WideStringView& contents) {
+WideString CBC_OneCode::FilterContents(WideStringView contents) {
   return GetOneDimWriter()->FilterContents(contents);
 }
 
diff --git a/fxbarcode/cbc_onecode.h b/fxbarcode/cbc_onecode.h
index 946911c..4470ad8 100644
--- a/fxbarcode/cbc_onecode.h
+++ b/fxbarcode/cbc_onecode.h
@@ -21,8 +21,8 @@
   explicit CBC_OneCode(std::unique_ptr<CBC_Writer> pWriter);
   ~CBC_OneCode() override;
 
-  virtual bool CheckContentValidity(const WideStringView& contents);
-  virtual WideString FilterContents(const WideStringView& contents);
+  virtual bool CheckContentValidity(WideStringView contents);
+  virtual WideString FilterContents(WideStringView contents);
 
   void SetPrintChecksum(bool checksum);
   void SetDataLength(int32_t length);
diff --git a/fxbarcode/cbc_pdf417i.cpp b/fxbarcode/cbc_pdf417i.cpp
index 321468b..c3e165b 100644
--- a/fxbarcode/cbc_pdf417i.cpp
+++ b/fxbarcode/cbc_pdf417i.cpp
@@ -31,7 +31,7 @@
 
 CBC_PDF417I::~CBC_PDF417I() {}
 
-bool CBC_PDF417I::Encode(const WideStringView& contents) {
+bool CBC_PDF417I::Encode(WideStringView contents) {
   int32_t width;
   int32_t height;
   auto* pWriter = GetPDF417Writer();
diff --git a/fxbarcode/cbc_pdf417i.h b/fxbarcode/cbc_pdf417i.h
index 9649010..ab773f9 100644
--- a/fxbarcode/cbc_pdf417i.h
+++ b/fxbarcode/cbc_pdf417i.h
@@ -19,7 +19,7 @@
   ~CBC_PDF417I() override;
 
   // CBC_CodeBase:
-  bool Encode(const WideStringView& contents) override;
+  bool Encode(WideStringView contents) override;
   bool RenderDevice(CFX_RenderDevice* device,
                     const CFX_Matrix* matrix) override;
   BC_TYPE GetType() override;
diff --git a/fxbarcode/cbc_qrcode.cpp b/fxbarcode/cbc_qrcode.cpp
index c89387b..5e60fa3 100644
--- a/fxbarcode/cbc_qrcode.cpp
+++ b/fxbarcode/cbc_qrcode.cpp
@@ -31,7 +31,7 @@
 
 CBC_QRCode::~CBC_QRCode() = default;
 
-bool CBC_QRCode::Encode(const WideStringView& contents) {
+bool CBC_QRCode::Encode(WideStringView contents) {
   int32_t width;
   int32_t height;
   CBC_QRCodeWriter* pWriter = GetQRCodeWriter();
diff --git a/fxbarcode/cbc_qrcode.h b/fxbarcode/cbc_qrcode.h
index 428d615..c541b7e 100644
--- a/fxbarcode/cbc_qrcode.h
+++ b/fxbarcode/cbc_qrcode.h
@@ -19,7 +19,7 @@
   ~CBC_QRCode() override;
 
   // CBC_CodeBase:
-  bool Encode(const WideStringView& contents) override;
+  bool Encode(WideStringView contents) override;
   bool RenderDevice(CFX_RenderDevice* device,
                     const CFX_Matrix* matrix) override;
   BC_TYPE GetType() override;
diff --git a/fxbarcode/oned/BC_OneDimWriter.cpp b/fxbarcode/oned/BC_OneDimWriter.cpp
index cd01697..7a343f6 100644
--- a/fxbarcode/oned/BC_OneDimWriter.cpp
+++ b/fxbarcode/oned/BC_OneDimWriter.cpp
@@ -175,7 +175,7 @@
                          m_fontColor, FXTEXT_CLEARTYPE);
 }
 
-bool CBC_OneDimWriter::ShowChars(const WideStringView& contents,
+bool CBC_OneDimWriter::ShowChars(WideStringView contents,
                                  CFX_RenderDevice* device,
                                  const CFX_Matrix* matrix,
                                  int32_t barWidth,
@@ -233,7 +233,7 @@
 
 bool CBC_OneDimWriter::RenderDeviceResult(CFX_RenderDevice* device,
                                           const CFX_Matrix* matrix,
-                                          const WideStringView& contents) {
+                                          WideStringView contents) {
   if (m_output.empty())
     return false;
 
@@ -256,7 +256,7 @@
          ShowChars(contents, device, matrix, m_barWidth, m_multiple);
 }
 
-bool CBC_OneDimWriter::RenderResult(const WideStringView& contents,
+bool CBC_OneDimWriter::RenderResult(WideStringView contents,
                                     uint8_t* code,
                                     int32_t codeLength) {
   if (codeLength < 1)
@@ -306,7 +306,6 @@
   }
 }
 
-WideString CBC_OneDimWriter::RenderTextContents(
-    const WideStringView& contents) {
+WideString CBC_OneDimWriter::RenderTextContents(WideStringView contents) {
   return WideString();
 }
diff --git a/fxbarcode/oned/BC_OneDimWriter.h b/fxbarcode/oned/BC_OneDimWriter.h
index c910cd6..b73e492 100644
--- a/fxbarcode/oned/BC_OneDimWriter.h
+++ b/fxbarcode/oned/BC_OneDimWriter.h
@@ -25,12 +25,12 @@
   CBC_OneDimWriter();
   ~CBC_OneDimWriter() override;
 
-  virtual bool RenderResult(const WideStringView& contents,
+  virtual bool RenderResult(WideStringView contents,
                             uint8_t* code,
                             int32_t codeLength);
-  virtual bool CheckContentValidity(const WideStringView& contents) = 0;
-  virtual WideString FilterContents(const WideStringView& contents) = 0;
-  virtual WideString RenderTextContents(const WideStringView& contents);
+  virtual bool CheckContentValidity(WideStringView contents) = 0;
+  virtual WideString FilterContents(WideStringView contents) = 0;
+  virtual WideString RenderTextContents(WideStringView contents);
   virtual void SetPrintChecksum(bool checksum);
   virtual void SetDataLength(int32_t length);
   virtual void SetCalcChecksum(bool state);
@@ -44,7 +44,7 @@
                   int32_t& outHeight);
   bool RenderDeviceResult(CFX_RenderDevice* device,
                           const CFX_Matrix* matrix,
-                          const WideStringView& contents);
+                          WideStringView contents);
   bool SetFont(CFX_Font* cFont);
 
  protected:
@@ -55,7 +55,7 @@
                                   int32_t hints);
   virtual uint8_t* EncodeImpl(const ByteString& contents,
                               int32_t& outLength) = 0;
-  virtual bool ShowChars(const WideStringView& contents,
+  virtual bool ShowChars(WideStringView contents,
                          CFX_RenderDevice* device,
                          const CFX_Matrix* matrix,
                          int32_t barWidth,
diff --git a/fxbarcode/oned/BC_OnedCodaBarWriter.cpp b/fxbarcode/oned/BC_OnedCodaBarWriter.cpp
index 786f82b..c4334c6 100644
--- a/fxbarcode/oned/BC_OnedCodaBarWriter.cpp
+++ b/fxbarcode/oned/BC_OnedCodaBarWriter.cpp
@@ -97,15 +97,13 @@
          (isContent && pdfium::ContainsValue(kStartEndChars, narrow_ch));
 }
 
-bool CBC_OnedCodaBarWriter::CheckContentValidity(
-    const WideStringView& contents) {
+bool CBC_OnedCodaBarWriter::CheckContentValidity(WideStringView contents) {
   return std::all_of(
       contents.begin(), contents.end(),
       [this](const wchar_t& ch) { return this->FindChar(ch, false); });
 }
 
-WideString CBC_OnedCodaBarWriter::FilterContents(
-    const WideStringView& contents) {
+WideString CBC_OnedCodaBarWriter::FilterContents(WideStringView contents) {
   WideString filtercontents;
   filtercontents.Reserve(contents.GetLength());
   wchar_t ch;
@@ -191,14 +189,13 @@
   return result;
 }
 
-WideString CBC_OnedCodaBarWriter::encodedContents(
-    const WideStringView& contents) {
+WideString CBC_OnedCodaBarWriter::encodedContents(WideStringView contents) {
   WideString strStart(static_cast<wchar_t>(m_chStart));
   WideString strEnd(static_cast<wchar_t>(m_chEnd));
   return strStart + contents + strEnd;
 }
 
-bool CBC_OnedCodaBarWriter::RenderResult(const WideStringView& contents,
+bool CBC_OnedCodaBarWriter::RenderResult(WideStringView contents,
                                          uint8_t* code,
                                          int32_t codeLength) {
   return CBC_OneDimWriter::RenderResult(
diff --git a/fxbarcode/oned/BC_OnedCodaBarWriter.h b/fxbarcode/oned/BC_OnedCodaBarWriter.h
index 8147e04..6feb380 100644
--- a/fxbarcode/oned/BC_OnedCodaBarWriter.h
+++ b/fxbarcode/oned/BC_OnedCodaBarWriter.h
@@ -24,11 +24,11 @@
                           int32_t& outWidth,
                           int32_t& outHeight,
                           int32_t hints) override;
-  bool RenderResult(const WideStringView& contents,
+  bool RenderResult(WideStringView contents,
                     uint8_t* code,
                     int32_t codeLength) override;
-  bool CheckContentValidity(const WideStringView& contents) override;
-  WideString FilterContents(const WideStringView& contents) override;
+  bool CheckContentValidity(WideStringView contents) override;
+  WideString FilterContents(WideStringView contents) override;
   void SetDataLength(int32_t length) override;
   bool SetTextLocation(BC_TEXT_LOC location) override;
   bool SetWideNarrowRatio(int8_t ratio) override;
@@ -37,7 +37,7 @@
 
   virtual bool FindChar(wchar_t ch, bool isContent);
 
-  WideString encodedContents(const WideStringView& contents);
+  WideString encodedContents(WideStringView contents);
 
  private:
   char m_chStart = 'A';
diff --git a/fxbarcode/oned/BC_OnedCode128Writer.cpp b/fxbarcode/oned/BC_OnedCode128Writer.cpp
index c8d1128..1a3995a 100644
--- a/fxbarcode/oned/BC_OnedCode128Writer.cpp
+++ b/fxbarcode/oned/BC_OnedCode128Writer.cpp
@@ -83,8 +83,7 @@
 
 CBC_OnedCode128Writer::~CBC_OnedCode128Writer() = default;
 
-bool CBC_OnedCode128Writer::CheckContentValidity(
-    const WideStringView& contents) {
+bool CBC_OnedCode128Writer::CheckContentValidity(WideStringView contents) {
   for (const auto& ch : contents) {
     int32_t patternIndex = static_cast<int32_t>(ch);
     if (patternIndex < 32 || patternIndex > 126 || patternIndex == 34)
@@ -93,8 +92,7 @@
   return true;
 }
 
-WideString CBC_OnedCode128Writer::FilterContents(
-    const WideStringView& contents) {
+WideString CBC_OnedCode128Writer::FilterContents(WideStringView contents) {
   const wchar_t limit = m_codeFormat == BC_CODE128_B ? 126 : 106;
 
   WideString filtered;
diff --git a/fxbarcode/oned/BC_OnedCode128Writer.h b/fxbarcode/oned/BC_OnedCode128Writer.h
index 3a834e8..370c025 100644
--- a/fxbarcode/oned/BC_OnedCode128Writer.h
+++ b/fxbarcode/oned/BC_OnedCode128Writer.h
@@ -31,8 +31,8 @@
                           int32_t& outHeight,
                           int32_t hints) override;
   uint8_t* EncodeImpl(const ByteString& contents, int32_t& outLength) override;
-  bool CheckContentValidity(const WideStringView& contents) override;
-  WideString FilterContents(const WideStringView& contents) override;
+  bool CheckContentValidity(WideStringView contents) override;
+  WideString FilterContents(WideStringView contents) override;
   bool SetTextLocation(BC_TEXT_LOC location) override;
 
   BC_TYPE GetType() const { return m_codeFormat; }
diff --git a/fxbarcode/oned/BC_OnedCode39Writer.cpp b/fxbarcode/oned/BC_OnedCode39Writer.cpp
index 4fa2fb5..89decab 100644
--- a/fxbarcode/oned/BC_OnedCode39Writer.cpp
+++ b/fxbarcode/oned/BC_OnedCode39Writer.cpp
@@ -64,13 +64,11 @@
 
 CBC_OnedCode39Writer::~CBC_OnedCode39Writer() = default;
 
-bool CBC_OnedCode39Writer::CheckContentValidity(
-    const WideStringView& contents) {
+bool CBC_OnedCode39Writer::CheckContentValidity(WideStringView contents) {
   return std::all_of(contents.begin(), contents.end(), IsInOnedCode39Alphabet);
 }
 
-WideString CBC_OnedCode39Writer::FilterContents(
-    const WideStringView& contents) {
+WideString CBC_OnedCode39Writer::FilterContents(WideStringView contents) {
   WideString filtercontents;
   filtercontents.Reserve(contents.GetLength());
   for (size_t i = 0; i < contents.GetLength(); i++) {
@@ -89,8 +87,7 @@
   return filtercontents;
 }
 
-WideString CBC_OnedCode39Writer::RenderTextContents(
-    const WideStringView& contents) {
+WideString CBC_OnedCode39Writer::RenderTextContents(WideStringView contents) {
   WideString renderContents;
   for (size_t i = 0; i < contents.GetLength(); i++) {
     wchar_t ch = contents[i];
@@ -214,7 +211,7 @@
   return result.release();
 }
 
-bool CBC_OnedCode39Writer::encodedContents(const WideStringView& contents,
+bool CBC_OnedCode39Writer::encodedContents(WideStringView contents,
                                            WideString* result) {
   *result = WideString(contents);
   if (m_bCalcChecksum && m_bPrintChecksum) {
@@ -230,7 +227,7 @@
   return true;
 }
 
-bool CBC_OnedCode39Writer::RenderResult(const WideStringView& contents,
+bool CBC_OnedCode39Writer::RenderResult(WideStringView contents,
                                         uint8_t* code,
                                         int32_t codeLength) {
   WideString encodedCon;
diff --git a/fxbarcode/oned/BC_OnedCode39Writer.h b/fxbarcode/oned/BC_OnedCode39Writer.h
index b6102bc..945099c 100644
--- a/fxbarcode/oned/BC_OnedCode39Writer.h
+++ b/fxbarcode/oned/BC_OnedCode39Writer.h
@@ -22,16 +22,16 @@
                           int32_t& outHeight,
                           int32_t hints) override;
   uint8_t* EncodeImpl(const ByteString& contents, int32_t& outLength) override;
-  bool RenderResult(const WideStringView& contents,
+  bool RenderResult(WideStringView contents,
                     uint8_t* code,
                     int32_t codeLength) override;
-  bool CheckContentValidity(const WideStringView& contents) override;
-  WideString FilterContents(const WideStringView& contents) override;
-  WideString RenderTextContents(const WideStringView& contents) override;
+  bool CheckContentValidity(WideStringView contents) override;
+  WideString FilterContents(WideStringView contents) override;
+  WideString RenderTextContents(WideStringView contents) override;
   bool SetTextLocation(BC_TEXT_LOC location) override;
   bool SetWideNarrowRatio(int8_t ratio) override;
 
-  bool encodedContents(const WideStringView& contents, WideString* result);
+  bool encodedContents(WideStringView contents, WideString* result);
 
  private:
   void ToIntArray(int16_t a, int8_t* toReturn);
diff --git a/fxbarcode/oned/BC_OnedEAN13Writer.cpp b/fxbarcode/oned/BC_OnedEAN13Writer.cpp
index f958868..f302f40 100644
--- a/fxbarcode/oned/BC_OnedEAN13Writer.cpp
+++ b/fxbarcode/oned/BC_OnedEAN13Writer.cpp
@@ -56,12 +56,12 @@
 }
 CBC_OnedEAN13Writer::~CBC_OnedEAN13Writer() {}
 
-bool CBC_OnedEAN13Writer::CheckContentValidity(const WideStringView& contents) {
+bool CBC_OnedEAN13Writer::CheckContentValidity(WideStringView contents) {
   return std::all_of(contents.begin(), contents.end(),
                      [](wchar_t c) { return FXSYS_IsDecimalDigit(c); });
 }
 
-WideString CBC_OnedEAN13Writer::FilterContents(const WideStringView& contents) {
+WideString CBC_OnedEAN13Writer::FilterContents(WideStringView contents) {
   WideString filtercontents;
   filtercontents.Reserve(contents.GetLength());
   wchar_t ch;
@@ -124,7 +124,7 @@
   return result.release();
 }
 
-bool CBC_OnedEAN13Writer::ShowChars(const WideStringView& contents,
+bool CBC_OnedEAN13Writer::ShowChars(WideStringView contents,
                                     CFX_RenderDevice* device,
                                     const CFX_Matrix* matrix,
                                     int32_t barWidth,
diff --git a/fxbarcode/oned/BC_OnedEAN13Writer.h b/fxbarcode/oned/BC_OnedEAN13Writer.h
index 8436a4f..88fa9cb 100644
--- a/fxbarcode/oned/BC_OnedEAN13Writer.h
+++ b/fxbarcode/oned/BC_OnedEAN13Writer.h
@@ -26,12 +26,12 @@
                           int32_t& outHeight,
                           int32_t hints) override;
   uint8_t* EncodeImpl(const ByteString& contents, int32_t& outLength) override;
-  bool CheckContentValidity(const WideStringView& contents) override;
-  WideString FilterContents(const WideStringView& contents) override;
+  bool CheckContentValidity(WideStringView contents) override;
+  WideString FilterContents(WideStringView contents) override;
   int32_t CalcChecksum(const ByteString& contents) override;
 
  private:
-  bool ShowChars(const WideStringView& contents,
+  bool ShowChars(WideStringView contents,
                  CFX_RenderDevice* device,
                  const CFX_Matrix* matrix,
                  int32_t barWidth,
diff --git a/fxbarcode/oned/BC_OnedEAN8Writer.cpp b/fxbarcode/oned/BC_OnedEAN8Writer.cpp
index 51876af..9e15157 100644
--- a/fxbarcode/oned/BC_OnedEAN8Writer.cpp
+++ b/fxbarcode/oned/BC_OnedEAN8Writer.cpp
@@ -62,12 +62,12 @@
   return false;
 }
 
-bool CBC_OnedEAN8Writer::CheckContentValidity(const WideStringView& contents) {
+bool CBC_OnedEAN8Writer::CheckContentValidity(WideStringView contents) {
   return std::all_of(contents.begin(), contents.end(),
                      [](wchar_t c) { return FXSYS_IsDecimalDigit(c); });
 }
 
-WideString CBC_OnedEAN8Writer::FilterContents(const WideStringView& contents) {
+WideString CBC_OnedEAN8Writer::FilterContents(WideStringView contents) {
   WideString filtercontents;
   filtercontents.Reserve(contents.GetLength());
   wchar_t ch;
@@ -124,7 +124,7 @@
   return result.release();
 }
 
-bool CBC_OnedEAN8Writer::ShowChars(const WideStringView& contents,
+bool CBC_OnedEAN8Writer::ShowChars(WideStringView contents,
                                    CFX_RenderDevice* device,
                                    const CFX_Matrix* matrix,
                                    int32_t barWidth,
diff --git a/fxbarcode/oned/BC_OnedEAN8Writer.h b/fxbarcode/oned/BC_OnedEAN8Writer.h
index 9d107b9..b71dbb9 100644
--- a/fxbarcode/oned/BC_OnedEAN8Writer.h
+++ b/fxbarcode/oned/BC_OnedEAN8Writer.h
@@ -27,14 +27,14 @@
                           int32_t& outHeight,
                           int32_t hints) override;
   uint8_t* EncodeImpl(const ByteString& contents, int32_t& outLength) override;
-  bool CheckContentValidity(const WideStringView& contents) override;
-  WideString FilterContents(const WideStringView& contents) override;
+  bool CheckContentValidity(WideStringView contents) override;
+  WideString FilterContents(WideStringView contents) override;
   void SetDataLength(int32_t length) override;
   bool SetTextLocation(BC_TEXT_LOC location) override;
   int32_t CalcChecksum(const ByteString& contents) override;
 
  private:
-  bool ShowChars(const WideStringView& contents,
+  bool ShowChars(WideStringView contents,
                  CFX_RenderDevice* device,
                  const CFX_Matrix* matrix,
                  int32_t barWidth,
diff --git a/fxbarcode/oned/BC_OnedUPCAWriter.cpp b/fxbarcode/oned/BC_OnedUPCAWriter.cpp
index d3b9226..36ce028 100644
--- a/fxbarcode/oned/BC_OnedUPCAWriter.cpp
+++ b/fxbarcode/oned/BC_OnedUPCAWriter.cpp
@@ -38,7 +38,7 @@
 
 CBC_OnedUPCAWriter::~CBC_OnedUPCAWriter() {}
 
-bool CBC_OnedUPCAWriter::CheckContentValidity(const WideStringView& contents) {
+bool CBC_OnedUPCAWriter::CheckContentValidity(WideStringView contents) {
   for (size_t i = 0; i < contents.GetLength(); ++i) {
     if (contents[i] < '0' || contents[i] > '9')
       return false;
@@ -46,7 +46,7 @@
   return true;
 }
 
-WideString CBC_OnedUPCAWriter::FilterContents(const WideStringView& contents) {
+WideString CBC_OnedUPCAWriter::FilterContents(WideStringView contents) {
   WideString filtercontents;
   filtercontents.Reserve(contents.GetLength());
   wchar_t ch;
@@ -102,7 +102,7 @@
   return nullptr;
 }
 
-bool CBC_OnedUPCAWriter::ShowChars(const WideStringView& contents,
+bool CBC_OnedUPCAWriter::ShowChars(WideStringView contents,
                                    CFX_RenderDevice* device,
                                    const CFX_Matrix* matrix,
                                    int32_t barWidth,
diff --git a/fxbarcode/oned/BC_OnedUPCAWriter.h b/fxbarcode/oned/BC_OnedUPCAWriter.h
index 8e2f770..991dfe6 100644
--- a/fxbarcode/oned/BC_OnedUPCAWriter.h
+++ b/fxbarcode/oned/BC_OnedUPCAWriter.h
@@ -30,13 +30,13 @@
                           int32_t& outHeight,
                           int32_t hints) override;
   uint8_t* EncodeImpl(const ByteString& contents, int32_t& outLength) override;
-  bool CheckContentValidity(const WideStringView& contents) override;
-  WideString FilterContents(const WideStringView& contents) override;
+  bool CheckContentValidity(WideStringView contents) override;
+  WideString FilterContents(WideStringView contents) override;
   void InitEANWriter() override;
   int32_t CalcChecksum(const ByteString& contents) override;
 
  private:
-  bool ShowChars(const WideStringView& contents,
+  bool ShowChars(WideStringView contents,
                  CFX_RenderDevice* device,
                  const CFX_Matrix* matrix,
                  int32_t barWidth,
diff --git a/fxbarcode/pdf417/BC_PDF417.cpp b/fxbarcode/pdf417/BC_PDF417.cpp
index abf9448..b9ba390 100644
--- a/fxbarcode/pdf417/BC_PDF417.cpp
+++ b/fxbarcode/pdf417/BC_PDF417.cpp
@@ -357,7 +357,7 @@
   return m_barcodeMatrix.get();
 }
 
-bool CBC_PDF417::GenerateBarcodeLogic(const WideStringView& msg,
+bool CBC_PDF417::GenerateBarcodeLogic(WideStringView msg,
                                       int32_t errorCorrectionLevel) {
   int32_t errorCorrectionCodeWords =
       CBC_PDF417ErrorCorrection::GetErrorCorrectionCodewordCount(
diff --git a/fxbarcode/pdf417/BC_PDF417.h b/fxbarcode/pdf417/BC_PDF417.h
index 33129b0..b445ede 100644
--- a/fxbarcode/pdf417/BC_PDF417.h
+++ b/fxbarcode/pdf417/BC_PDF417.h
@@ -21,8 +21,7 @@
   ~CBC_PDF417();
 
   CBC_BarcodeMatrix* getBarcodeMatrix();
-  bool GenerateBarcodeLogic(const WideStringView& msg,
-                            int32_t errorCorrectionLevel);
+  bool GenerateBarcodeLogic(WideStringView msg, int32_t errorCorrectionLevel);
   void setDimensions(int32_t maxCols,
                      int32_t minCols,
                      int32_t maxRows,
diff --git a/fxbarcode/pdf417/BC_PDF417HighLevelEncoder.cpp b/fxbarcode/pdf417/BC_PDF417HighLevelEncoder.cpp
index 6010b92..ad07f79 100644
--- a/fxbarcode/pdf417/BC_PDF417HighLevelEncoder.cpp
+++ b/fxbarcode/pdf417/BC_PDF417HighLevelEncoder.cpp
@@ -77,7 +77,7 @@
 
 // static
 Optional<WideString> CBC_PDF417HighLevelEncoder::EncodeHighLevel(
-    const WideStringView& msg) {
+    WideStringView msg) {
   ByteString bytes = FX_UTF8Encode(msg);
   size_t len = bytes.GetLength();
   WideString result;
diff --git a/fxbarcode/pdf417/BC_PDF417HighLevelEncoder.h b/fxbarcode/pdf417/BC_PDF417HighLevelEncoder.h
index 9f65ca6..eb2d30f 100644
--- a/fxbarcode/pdf417/BC_PDF417HighLevelEncoder.h
+++ b/fxbarcode/pdf417/BC_PDF417HighLevelEncoder.h
@@ -19,7 +19,7 @@
   CBC_PDF417HighLevelEncoder() = delete;
   ~CBC_PDF417HighLevelEncoder() = delete;
 
-  static Optional<WideString> EncodeHighLevel(const WideStringView& msg);
+  static Optional<WideString> EncodeHighLevel(WideStringView msg);
 
  private:
   enum class EncodingMode { kUnknown = 0, kText, kByte, kNumeric };
diff --git a/fxbarcode/pdf417/BC_PDF417Writer.cpp b/fxbarcode/pdf417/BC_PDF417Writer.cpp
index 71509ff..f9f3624 100644
--- a/fxbarcode/pdf417/BC_PDF417Writer.cpp
+++ b/fxbarcode/pdf417/BC_PDF417Writer.cpp
@@ -43,7 +43,7 @@
   return true;
 }
 
-std::vector<uint8_t> CBC_PDF417Writer::Encode(const WideStringView& contents,
+std::vector<uint8_t> CBC_PDF417Writer::Encode(WideStringView contents,
                                               int32_t* pOutWidth,
                                               int32_t* pOutHeight) {
   std::vector<uint8_t> results;
diff --git a/fxbarcode/pdf417/BC_PDF417Writer.h b/fxbarcode/pdf417/BC_PDF417Writer.h
index c32508b..10f069a 100644
--- a/fxbarcode/pdf417/BC_PDF417Writer.h
+++ b/fxbarcode/pdf417/BC_PDF417Writer.h
@@ -18,7 +18,7 @@
   CBC_PDF417Writer();
   ~CBC_PDF417Writer() override;
 
-  std::vector<uint8_t> Encode(const WideStringView& contents,
+  std::vector<uint8_t> Encode(WideStringView contents,
                               int32_t* pOutWidth,
                               int32_t* pOutHeight);
 
diff --git a/fxbarcode/qrcode/BC_QRCodeWriter.cpp b/fxbarcode/qrcode/BC_QRCodeWriter.cpp
index 495d7b1..1eead62 100644
--- a/fxbarcode/qrcode/BC_QRCodeWriter.cpp
+++ b/fxbarcode/qrcode/BC_QRCodeWriter.cpp
@@ -43,7 +43,7 @@
   return true;
 }
 
-std::vector<uint8_t> CBC_QRCodeWriter::Encode(const WideStringView& contents,
+std::vector<uint8_t> CBC_QRCodeWriter::Encode(WideStringView contents,
                                               int32_t ecLevel,
                                               int32_t* pOutWidth,
                                               int32_t* pOutHeight) {
diff --git a/fxbarcode/qrcode/BC_QRCodeWriter.h b/fxbarcode/qrcode/BC_QRCodeWriter.h
index ade5cb7..3f2cca0 100644
--- a/fxbarcode/qrcode/BC_QRCodeWriter.h
+++ b/fxbarcode/qrcode/BC_QRCodeWriter.h
@@ -16,7 +16,7 @@
   CBC_QRCodeWriter();
   ~CBC_QRCodeWriter() override;
 
-  std::vector<uint8_t> Encode(const WideStringView& contents,
+  std::vector<uint8_t> Encode(WideStringView contents,
                               int32_t ecLevel,
                               int32_t* pOutWidth,
                               int32_t* pOutHeight);
diff --git a/fxbarcode/qrcode/BC_QRCoderEncoder.cpp b/fxbarcode/qrcode/BC_QRCoderEncoder.cpp
index 34971e3..02f42bf 100644
--- a/fxbarcode/qrcode/BC_QRCoderEncoder.cpp
+++ b/fxbarcode/qrcode/BC_QRCoderEncoder.cpp
@@ -400,7 +400,7 @@
 }  // namespace
 
 // static
-bool CBC_QRCoderEncoder::Encode(const WideStringView& content,
+bool CBC_QRCoderEncoder::Encode(WideStringView content,
                                 const CBC_QRCoderErrorCorrectionLevel* ecLevel,
                                 CBC_QRCoder* qrCode) {
   ByteString encoding = "utf8";
diff --git a/fxbarcode/qrcode/BC_QRCoderEncoder.h b/fxbarcode/qrcode/BC_QRCoderEncoder.h
index 9be00c1..75fd2e5 100644
--- a/fxbarcode/qrcode/BC_QRCoderEncoder.h
+++ b/fxbarcode/qrcode/BC_QRCoderEncoder.h
@@ -17,7 +17,7 @@
   CBC_QRCoderEncoder() = delete;
   ~CBC_QRCoderEncoder() = delete;
 
-  static bool Encode(const WideStringView& content,
+  static bool Encode(WideStringView content,
                      const CBC_QRCoderErrorCorrectionLevel* ecLevel,
                      CBC_QRCoder* qrCode);
 };
diff --git a/fxjs/cfx_v8.cpp b/fxjs/cfx_v8.cpp
index 58b30e5..7f2ce62 100644
--- a/fxjs/cfx_v8.cpp
+++ b/fxjs/cfx_v8.cpp
@@ -115,7 +115,7 @@
       .ToLocalChecked();
 }
 
-v8::Local<v8::String> CFX_V8::NewString(const WideStringView& str) {
+v8::Local<v8::String> CFX_V8::NewString(WideStringView str) {
   // Conversion from pdfium's wchar_t wide-strings to v8's uint16_t
   // wide-strings isn't handled by v8, so use UTF8 as a common
   // intermediate format.
diff --git a/fxjs/cfx_v8.h b/fxjs/cfx_v8.h
index 73fb3ac..1310b8f 100644
--- a/fxjs/cfx_v8.h
+++ b/fxjs/cfx_v8.h
@@ -29,7 +29,7 @@
   v8::Local<v8::Number> NewNumber(float number);
   v8::Local<v8::Boolean> NewBoolean(bool b);
   v8::Local<v8::String> NewString(const ByteStringView& str);
-  v8::Local<v8::String> NewString(const WideStringView& str);
+  v8::Local<v8::String> NewString(WideStringView str);
   v8::Local<v8::Date> NewDate(double d);
 
   int ToInt32(v8::Local<v8::Value> pValue);
diff --git a/fxjs/xfa/cfxjse_engine.cpp b/fxjs/xfa/cfxjse_engine.cpp
index 5b50bf8..33c8b5b 100644
--- a/fxjs/xfa/cfxjse_engine.cpp
+++ b/fxjs/xfa/cfxjse_engine.cpp
@@ -121,7 +121,7 @@
 }
 
 bool CFXJSE_Engine::RunScript(CXFA_Script::Type eScriptType,
-                              const WideStringView& wsScript,
+                              WideStringView wsScript,
                               CFXJSE_Value* hRetValue,
                               CXFA_Object* pThisObject) {
   ByteString btScript;
@@ -150,7 +150,7 @@
 }
 
 bool CFXJSE_Engine::QueryNodeByFlag(CXFA_Node* refNode,
-                                    const WideStringView& propname,
+                                    WideStringView propname,
                                     CFXJSE_Value* pValue,
                                     uint32_t dwFlag,
                                     bool bSetting) {
@@ -563,7 +563,7 @@
 }
 
 bool CFXJSE_Engine::ResolveObjects(CXFA_Object* refObject,
-                                   const WideStringView& wsExpression,
+                                   WideStringView wsExpression,
                                    XFA_RESOLVENODE_RS* resolveNodeRS,
                                    uint32_t dwStyles,
                                    CXFA_Node* bindNode) {
diff --git a/fxjs/xfa/cfxjse_engine.h b/fxjs/xfa/cfxjse_engine.h
index dc71fcb..3e5e6c7 100644
--- a/fxjs/xfa/cfxjse_engine.h
+++ b/fxjs/xfa/cfxjse_engine.h
@@ -71,12 +71,12 @@
   void SetEventParam(CXFA_EventParam* param) { m_eventParam = param; }
   CXFA_EventParam* GetEventParam() const { return m_eventParam.Get(); }
   bool RunScript(CXFA_Script::Type eScriptType,
-                 const WideStringView& wsScript,
+                 WideStringView wsScript,
                  CFXJSE_Value* pRetValue,
                  CXFA_Object* pThisObject);
 
   bool ResolveObjects(CXFA_Object* refObject,
-                      const WideStringView& wsExpression,
+                      WideStringView wsExpression,
                       XFA_RESOLVENODE_RS* resolveNodeRS,
                       uint32_t dwStyles,
                       CXFA_Node* bindNode);
@@ -108,7 +108,7 @@
                                          CXFA_Node* pSubform);
   void RemoveBuiltInObjs(CFXJSE_Context* pContext) const;
   bool QueryNodeByFlag(CXFA_Node* refNode,
-                       const WideStringView& propname,
+                       WideStringView propname,
                        CFXJSE_Value* pValue,
                        uint32_t dwFlag,
                        bool bSetting);
diff --git a/fxjs/xfa/cfxjse_formcalc_context.cpp b/fxjs/xfa/cfxjse_formcalc_context.cpp
index 45a1a65..08348e8 100644
--- a/fxjs/xfa/cfxjse_formcalc_context.cpp
+++ b/fxjs/xfa/cfxjse_formcalc_context.cpp
@@ -5938,7 +5938,7 @@
 }
 
 // static.
-bool CFXJSE_FormCalcContext::Translate(const WideStringView& wsFormcalc,
+bool CFXJSE_FormCalcContext::Translate(WideStringView wsFormcalc,
                                        CFX_WideTextBuf* wsJavascript) {
   if (wsFormcalc.IsEmpty()) {
     wsJavascript->Clear();
diff --git a/fxjs/xfa/cfxjse_formcalc_context.h b/fxjs/xfa/cfxjse_formcalc_context.h
index fcc223d..7c06a58 100644
--- a/fxjs/xfa/cfxjse_formcalc_context.h
+++ b/fxjs/xfa/cfxjse_formcalc_context.h
@@ -383,7 +383,7 @@
                               CFXJSE_Value* src,
                               bool* ret);
 
-  static bool Translate(const WideStringView& wsFormcalc,
+  static bool Translate(WideStringView wsFormcalc,
                         CFX_WideTextBuf* wsJavascript);
 
   void GlobalPropertyGetter(CFXJSE_Value* pValue);
diff --git a/fxjs/xfa/cfxjse_resolveprocessor.cpp b/fxjs/xfa/cfxjse_resolveprocessor.cpp
index 1a89c5b..29bb17c 100644
--- a/fxjs/xfa/cfxjse_resolveprocessor.cpp
+++ b/fxjs/xfa/cfxjse_resolveprocessor.cpp
@@ -199,10 +199,9 @@
   return !rnd.m_Objects.empty();
 }
 
-bool CFXJSE_ResolveProcessor::ResolveForAttributeRs(
-    CXFA_Object* curNode,
-    CFXJSE_ResolveNodeData& rnd,
-    const WideStringView& strAttr) {
+bool CFXJSE_ResolveProcessor::ResolveForAttributeRs(CXFA_Object* curNode,
+                                                    CFXJSE_ResolveNodeData& rnd,
+                                                    WideStringView strAttr) {
   Optional<XFA_SCRIPTATTRIBUTEINFO> info =
       XFA_GetScriptAttributeByName(curNode->GetElementType(), strAttr);
   if (!info.has_value())
@@ -483,7 +482,7 @@
   return !rnd.m_Objects.empty();
 }
 
-int32_t CFXJSE_ResolveProcessor::GetFilter(const WideStringView& wsExpression,
+int32_t CFXJSE_ResolveProcessor::GetFilter(WideStringView wsExpression,
                                            int32_t nStart,
                                            CFXJSE_ResolveNodeData& rnd) {
   ASSERT(nStart > -1);
diff --git a/fxjs/xfa/cfxjse_resolveprocessor.h b/fxjs/xfa/cfxjse_resolveprocessor.h
index 36e3a1c..e3c4ee0 100644
--- a/fxjs/xfa/cfxjse_resolveprocessor.h
+++ b/fxjs/xfa/cfxjse_resolveprocessor.h
@@ -41,7 +41,7 @@
   ~CFXJSE_ResolveProcessor();
 
   bool Resolve(CFXJSE_ResolveNodeData& rnd);
-  int32_t GetFilter(const WideStringView& wsExpression,
+  int32_t GetFilter(WideStringView wsExpression,
                     int32_t nStart,
                     CFXJSE_ResolveNodeData& rnd);
   void SetIndexDataBind(WideString& wsNextCondition,
@@ -54,7 +54,7 @@
  private:
   bool ResolveForAttributeRs(CXFA_Object* curNode,
                              CFXJSE_ResolveNodeData& rnd,
-                             const WideStringView& strAttr);
+                             WideStringView strAttr);
   bool ResolveAnyChild(CFXJSE_ResolveNodeData& rnd);
   bool ResolveDollar(CFXJSE_ResolveNodeData& rnd);
   bool ResolveExcalmatory(CFXJSE_ResolveNodeData& rnd);
diff --git a/fxjs/xfa/cjx_hostpseudomodel.cpp b/fxjs/xfa/cjx_hostpseudomodel.cpp
index 84e84b6..1eeaffa 100644
--- a/fxjs/xfa/cjx_hostpseudomodel.cpp
+++ b/fxjs/xfa/cjx_hostpseudomodel.cpp
@@ -21,7 +21,7 @@
 
 namespace {
 
-int32_t FilterName(const WideStringView& wsExpression,
+int32_t FilterName(WideStringView wsExpression,
                    int32_t nStart,
                    WideString& wsFilter) {
   ASSERT(nStart > -1);
diff --git a/fxjs/xfa/cjx_node.cpp b/fxjs/xfa/cjx_node.cpp
index d44bf63..bce17f0 100644
--- a/fxjs/xfa/cjx_node.cpp
+++ b/fxjs/xfa/cjx_node.cpp
@@ -500,7 +500,7 @@
   }
 }
 
-int32_t CJX_Node::execSingleEventByName(const WideStringView& wsEventName,
+int32_t CJX_Node::execSingleEventByName(WideStringView wsEventName,
                                         XFA_Element eType) {
   CXFA_FFNotify* pNotify = GetDocument()->GetNotify();
   if (!pNotify)
diff --git a/fxjs/xfa/cjx_node.h b/fxjs/xfa/cjx_node.h
index 948ec85..4b026b4 100644
--- a/fxjs/xfa/cjx_node.h
+++ b/fxjs/xfa/cjx_node.h
@@ -39,8 +39,7 @@
   CXFA_Node* GetXFANode() const;
 
  protected:
-  int32_t execSingleEventByName(const WideStringView& wsEventName,
-                                XFA_Element eType);
+  int32_t execSingleEventByName(WideStringView wsEventName, XFA_Element eType);
 
  private:
   static const CJX_MethodSpec MethodSpecs[];
diff --git a/fxjs/xfa/cjx_object.cpp b/fxjs/xfa/cjx_object.cpp
index faaa0ec..4f28096 100644
--- a/fxjs/xfa/cjx_object.cpp
+++ b/fxjs/xfa/cjx_object.cpp
@@ -62,7 +62,7 @@
   XFA_KEYTYPE_Element,
 };
 
-void* GetMapKey_Custom(const WideStringView& wsKey) {
+void* GetMapKey_Custom(WideStringView wsKey) {
   uint32_t dwKey = FX_HashCode_GetW(wsKey, false);
   return (void*)(uintptr_t)((dwKey << 1) | XFA_KEYTYPE_Custom);
 }
@@ -216,7 +216,7 @@
 }
 
 void CJX_Object::SetAttribute(XFA_Attribute eAttr,
-                              const WideStringView& wsValue,
+                              WideStringView wsValue,
                               bool bNotify) {
   switch (ToNode(GetXFAObject())->GetAttributeType(eAttr)) {
     case XFA_AttributeType::Enum: {
@@ -246,13 +246,13 @@
   }
 }
 
-void CJX_Object::SetMapModuleString(void* pKey, const WideStringView& wsValue) {
+void CJX_Object::SetMapModuleString(void* pKey, WideStringView wsValue) {
   SetMapModuleBuffer(pKey, const_cast<wchar_t*>(wsValue.unterminated_c_str()),
                      wsValue.GetLength() * sizeof(wchar_t), nullptr);
 }
 
-void CJX_Object::SetAttribute(const WideStringView& wsAttr,
-                              const WideStringView& wsValue,
+void CJX_Object::SetAttribute(WideStringView wsAttr,
+                              WideStringView wsValue,
                               bool bNotify) {
   Optional<XFA_ATTRIBUTEINFO> attr = XFA_GetAttributeByName(wsValue);
   if (!attr.has_value()) {
@@ -263,7 +263,7 @@
   SetMapModuleString(pKey, wsValue);
 }
 
-WideString CJX_Object::GetAttribute(const WideStringView& attr) {
+WideString CJX_Object::GetAttribute(WideStringView attr) {
   return TryAttribute(attr, true).value_or(WideString());
 }
 
@@ -309,7 +309,7 @@
   return {};
 }
 
-Optional<WideString> CJX_Object::TryAttribute(const WideStringView& wsAttr,
+Optional<WideString> CJX_Object::TryAttribute(WideStringView wsAttr,
                                               bool bUseDefault) {
   Optional<XFA_ATTRIBUTEINFO> attr = XFA_GetAttributeByName(wsAttr);
   if (attr.has_value())
@@ -323,7 +323,7 @@
   return {WideString(wsValueC)};
 }
 
-void CJX_Object::RemoveAttribute(const WideStringView& wsAttr) {
+void CJX_Object::RemoveAttribute(WideStringView wsAttr) {
   void* pKey = GetMapKey_Custom(wsAttr);
   if (pKey)
     RemoveMapModuleKey(pKey);
diff --git a/fxjs/xfa/cjx_object.h b/fxjs/xfa/cjx_object.h
index 7c4a1ee..5e3025f 100644
--- a/fxjs/xfa/cjx_object.h
+++ b/fxjs/xfa/cjx_object.h
@@ -75,17 +75,14 @@
                        const std::vector<v8::Local<v8::Value>>& params);
 
   bool HasAttribute(XFA_Attribute eAttr);
-  void SetAttribute(XFA_Attribute eAttr,
-                    const WideStringView& wsValue,
+  void SetAttribute(XFA_Attribute eAttr, WideStringView wsValue, bool bNotify);
+  void SetAttribute(WideStringView wsAttr,
+                    WideStringView wsValue,
                     bool bNotify);
-  void SetAttribute(const WideStringView& wsAttr,
-                    const WideStringView& wsValue,
-                    bool bNotify);
-  void RemoveAttribute(const WideStringView& wsAttr);
-  WideString GetAttribute(const WideStringView& attr);
+  void RemoveAttribute(WideStringView wsAttr);
+  WideString GetAttribute(WideStringView attr);
   WideString GetAttribute(XFA_Attribute attr);
-  Optional<WideString> TryAttribute(const WideStringView& wsAttr,
-                                    bool bUseDefault);
+  Optional<WideString> TryAttribute(WideStringView wsAttr, bool bUseDefault);
   Optional<WideString> TryAttribute(XFA_Attribute eAttr, bool bUseDefault);
 
   Optional<WideString> TryContent(bool bScriptModify, bool bProto);
@@ -221,7 +218,7 @@
  protected:
   void DefineMethods(pdfium::span<const CJX_MethodSpec> methods);
   void MoveBufferMapData(CXFA_Object* pSrcModule, CXFA_Object* pDstModule);
-  void SetMapModuleString(void* pKey, const WideStringView& wsValue);
+  void SetMapModuleString(void* pKey, WideStringView wsValue);
   void ThrowException(const WideString& str) const;
 
  private:
diff --git a/xfa/fde/cfde_textout.cpp b/xfa/fde/cfde_textout.cpp
index 6d7aaea..46527f5 100644
--- a/xfa/fde/cfde_textout.cpp
+++ b/xfa/fde/cfde_textout.cpp
@@ -284,7 +284,7 @@
 }
 
 void CFDE_TextOut::DrawLogicText(CFX_RenderDevice* device,
-                                 const WideStringView& str,
+                                 WideStringView str,
                                  const CFX_RectF& rect) {
   ASSERT(m_pFont);
   ASSERT(m_fFontSize >= 1.0f);
diff --git a/xfa/fde/cfde_textout.h b/xfa/fde/cfde_textout.h
index 4db7faf..153f3f5 100644
--- a/xfa/fde/cfde_textout.h
+++ b/xfa/fde/cfde_textout.h
@@ -57,7 +57,7 @@
   void CalcLogicSize(const WideString& str, CFX_SizeF* pSize);
   void CalcLogicSize(const WideString& str, CFX_RectF* pRect);
   void DrawLogicText(CFX_RenderDevice* device,
-                     const WideStringView& str,
+                     WideStringView str,
                      const CFX_RectF& rect);
   int32_t GetTotalLines() const { return m_iTotalLines; }
 
diff --git a/xfa/fgas/crt/cfgas_formatstring.cpp b/xfa/fgas/crt/cfgas_formatstring.cpp
index 6cbd7b2..f0adc7f 100644
--- a/xfa/fgas/crt/cfgas_formatstring.cpp
+++ b/xfa/fgas/crt/cfgas_formatstring.cpp
@@ -767,7 +767,7 @@
   return true;
 }
 
-bool FX_TimeFromCanonical(const WideStringView& wsTime,
+bool FX_TimeFromCanonical(WideStringView wsTime,
                           CFX_DateTime* datetime,
                           LocaleIface* pLocale) {
   if (wsTime.GetLength() == 0)
@@ -922,9 +922,8 @@
   return eCategory;
 }
 
-WideString CFGAS_FormatString::GetTextFormat(
-    const WideString& wsPattern,
-    const WideStringView& wsCategory) const {
+WideString CFGAS_FormatString::GetTextFormat(const WideString& wsPattern,
+                                             WideStringView wsCategory) const {
   int32_t ccf = 0;
   int32_t iLenf = wsPattern.GetLength();
   const wchar_t* pStr = wsPattern.c_str();
@@ -1854,7 +1853,7 @@
   return iText == iLenText;
 }
 
-bool CFGAS_FormatString::FormatStrNum(const WideStringView& wsInputNum,
+bool CFGAS_FormatString::FormatStrNum(WideStringView wsInputNum,
                                       const WideString& wsPattern,
                                       WideString* wsOutput) const {
   if (wsInputNum.IsEmpty() || wsPattern.IsEmpty())
diff --git a/xfa/fgas/crt/cfgas_formatstring.h b/xfa/fgas/crt/cfgas_formatstring.h
index 0c51ef3..c581dda 100644
--- a/xfa/fgas/crt/cfgas_formatstring.h
+++ b/xfa/fgas/crt/cfgas_formatstring.h
@@ -15,7 +15,7 @@
 class CXFA_LocaleMgr;
 
 bool FX_DateFromCanonical(const WideString& wsDate, CFX_DateTime* datetime);
-bool FX_TimeFromCanonical(const WideStringView& wsTime,
+bool FX_TimeFromCanonical(WideStringView wsTime,
                           CFX_DateTime* datetime,
                           LocaleIface* pLocale);
 
@@ -58,12 +58,12 @@
 
  private:
   WideString GetTextFormat(const WideString& wsPattern,
-                           const WideStringView& wsCategory) const;
+                           WideStringView wsCategory) const;
   LocaleIface* GetNumericFormat(const WideString& wsPattern,
                                 int32_t* iDotIndex,
                                 uint32_t* dwStyle,
                                 WideString* wsPurgePattern) const;
-  bool FormatStrNum(const WideStringView& wsInputNum,
+  bool FormatStrNum(WideStringView wsInputNum,
                     const WideString& wsPattern,
                     WideString* wsOutput) const;
   FX_DATETIMETYPE GetDateTimeFormat(const WideString& wsPattern,
diff --git a/xfa/fgas/font/cfgas_defaultfontmanager.cpp b/xfa/fgas/font/cfgas_defaultfontmanager.cpp
index 6d97b6a..829c2d3 100644
--- a/xfa/fgas/font/cfgas_defaultfontmanager.cpp
+++ b/xfa/fgas/font/cfgas_defaultfontmanager.cpp
@@ -12,7 +12,7 @@
 // static
 RetainPtr<CFGAS_GEFont> CFGAS_DefaultFontManager::GetFont(
     CFGAS_FontMgr* pFontMgr,
-    const WideStringView& wsFontFamily,
+    WideStringView wsFontFamily,
     uint32_t dwFontStyles) {
   WideString wsFontName(wsFontFamily);
   RetainPtr<CFGAS_GEFont> pFont =
@@ -56,7 +56,7 @@
 // static
 RetainPtr<CFGAS_GEFont> CFGAS_DefaultFontManager::GetDefaultFont(
     CFGAS_FontMgr* pFontMgr,
-    const WideStringView& wsFontFamily,
+    WideStringView wsFontFamily,
     uint32_t dwFontStyles) {
   RetainPtr<CFGAS_GEFont> pFont =
       pFontMgr->LoadFont(L"Arial Narrow", dwFontStyles, 0xFFFF);
diff --git a/xfa/fgas/font/cfgas_defaultfontmanager.h b/xfa/fgas/font/cfgas_defaultfontmanager.h
index e1b36be..ebf2f3c 100644
--- a/xfa/fgas/font/cfgas_defaultfontmanager.h
+++ b/xfa/fgas/font/cfgas_defaultfontmanager.h
@@ -16,12 +16,11 @@
 class CFGAS_DefaultFontManager {
  public:
   static RetainPtr<CFGAS_GEFont> GetFont(CFGAS_FontMgr* pFontMgr,
-                                         const WideStringView& wsFontFamily,
+                                         WideStringView wsFontFamily,
                                          uint32_t dwFontStyles);
-  static RetainPtr<CFGAS_GEFont> GetDefaultFont(
-      CFGAS_FontMgr* pFontMgr,
-      const WideStringView& wsFontFamily,
-      uint32_t dwFontStyles);
+  static RetainPtr<CFGAS_GEFont> GetDefaultFont(CFGAS_FontMgr* pFontMgr,
+                                                WideStringView wsFontFamily,
+                                                uint32_t dwFontStyles);
 
   CFGAS_DefaultFontManager() = delete;
   CFGAS_DefaultFontManager(const CFGAS_DefaultFontManager&) = delete;
diff --git a/xfa/fgas/font/cfgas_pdffontmgr.cpp b/xfa/fgas/font/cfgas_pdffontmgr.cpp
index c1d6ada..ee18aa4 100644
--- a/xfa/fgas/font/cfgas_pdffontmgr.cpp
+++ b/xfa/fgas/font/cfgas_pdffontmgr.cpp
@@ -73,10 +73,9 @@
   return nullptr;
 }
 
-RetainPtr<CFGAS_GEFont> CFGAS_PDFFontMgr::GetFont(
-    const WideStringView& wsFontFamily,
-    uint32_t dwFontStyles,
-    bool bStrictMatch) {
+RetainPtr<CFGAS_GEFont> CFGAS_PDFFontMgr::GetFont(WideStringView wsFontFamily,
+                                                  uint32_t dwFontStyles,
+                                                  bool bStrictMatch) {
   uint32_t dwHashCode = FX_HashCode_GetW(wsFontFamily, false);
   ByteString strKey = ByteString::Format("%u%u", dwHashCode, dwFontStyles);
   auto it = m_FontMap.find(strKey);
diff --git a/xfa/fgas/font/cfgas_pdffontmgr.h b/xfa/fgas/font/cfgas_pdffontmgr.h
index 08d91c8..38fdd92 100644
--- a/xfa/fgas/font/cfgas_pdffontmgr.h
+++ b/xfa/fgas/font/cfgas_pdffontmgr.h
@@ -22,7 +22,7 @@
   explicit CFGAS_PDFFontMgr(CPDF_Document* pDoc, CFGAS_FontMgr* pFontMgr);
   ~CFGAS_PDFFontMgr();
 
-  RetainPtr<CFGAS_GEFont> GetFont(const WideStringView& wsFontFamily,
+  RetainPtr<CFGAS_GEFont> GetFont(WideStringView wsFontFamily,
                                   uint32_t dwFontStyles,
                                   bool bStrictMatch);
 
diff --git a/xfa/fgas/font/fgas_fontutils.cpp b/xfa/fgas/font/fgas_fontutils.cpp
index ef3f6d1..3087309 100644
--- a/xfa/fgas/font/fgas_fontutils.cpp
+++ b/xfa/fgas/font/fgas_fontutils.cpp
@@ -1868,7 +1868,7 @@
   return nullptr;
 }
 
-WideString FGAS_FontNameToEnglishName(const WideStringView& wsLocalName) {
+WideString FGAS_FontNameToEnglishName(WideStringView wsLocalName) {
   uint32_t dwLocalNameHash = FX_HashCode_GetW(wsLocalName, true);
   const FGAS_FontInfo* pEnd = g_XFAFontsMap + FX_ArraySize(g_XFAFontsMap);
   const FGAS_FontInfo* pFontInfo =
@@ -1881,7 +1881,7 @@
   return WideString(wsLocalName);
 }
 
-const FGAS_FontInfo* FGAS_FontInfoByFontName(const WideStringView& wsFontName) {
+const FGAS_FontInfo* FGAS_FontInfoByFontName(WideStringView wsFontName) {
   WideString wsFontNameTemp(wsFontName);
   wsFontNameTemp.Remove(L' ');
   uint32_t dwCurFontNameHash =
diff --git a/xfa/fgas/font/fgas_fontutils.h b/xfa/fgas/font/fgas_fontutils.h
index 93e5a01..ecdcd87 100644
--- a/xfa/fgas/font/fgas_fontutils.h
+++ b/xfa/fgas/font/fgas_fontutils.h
@@ -26,8 +26,8 @@
   uint16_t wCodePage;
 };
 
-WideString FGAS_FontNameToEnglishName(const WideStringView& wsLocalName);
+WideString FGAS_FontNameToEnglishName(WideStringView wsLocalName);
 
-const FGAS_FontInfo* FGAS_FontInfoByFontName(const WideStringView& wsFontName);
+const FGAS_FontInfo* FGAS_FontInfoByFontName(WideStringView wsFontName);
 
 #endif  // XFA_FGAS_FONT_FGAS_FONTUTILS_H_
diff --git a/xfa/fwl/cfwl_combobox.cpp b/xfa/fwl/cfwl_combobox.cpp
index b4a79fe..a835528 100644
--- a/xfa/fwl/cfwl_combobox.cpp
+++ b/xfa/fwl/cfwl_combobox.cpp
@@ -42,7 +42,7 @@
   return FWL_Type::ComboBox;
 }
 
-void CFWL_ComboBox::AddString(const WideStringView& wsText) {
+void CFWL_ComboBox::AddString(WideStringView wsText) {
   m_pListBox->AddString(wsText);
 }
 
diff --git a/xfa/fwl/cfwl_combobox.h b/xfa/fwl/cfwl_combobox.h
index c136ab5..b7350b0 100644
--- a/xfa/fwl/cfwl_combobox.h
+++ b/xfa/fwl/cfwl_combobox.h
@@ -60,7 +60,7 @@
   int32_t GetCurSel() const { return m_iCurSel; }
   void SetCurSel(int32_t iSel);
 
-  void AddString(const WideStringView& wsText);
+  void AddString(WideStringView wsText);
   void RemoveAt(int32_t iIndex);
   void RemoveAll();
 
diff --git a/xfa/fwl/cfwl_listbox.cpp b/xfa/fwl/cfwl_listbox.cpp
index e652ef9..68dfec6 100644
--- a/xfa/fwl/cfwl_listbox.cpp
+++ b/xfa/fwl/cfwl_listbox.cpp
@@ -907,7 +907,7 @@
   return it != m_ItemArray.end() ? it - m_ItemArray.begin() : -1;
 }
 
-CFWL_ListItem* CFWL_ListBox::AddString(const WideStringView& wsAdd) {
+CFWL_ListItem* CFWL_ListBox::AddString(WideStringView wsAdd) {
   m_ItemArray.emplace_back(
       pdfium::MakeUnique<CFWL_ListItem>(WideString(wsAdd)));
   return m_ItemArray.back().get();
diff --git a/xfa/fwl/cfwl_listbox.h b/xfa/fwl/cfwl_listbox.h
index 4a7818c..6b0c012 100644
--- a/xfa/fwl/cfwl_listbox.h
+++ b/xfa/fwl/cfwl_listbox.h
@@ -53,7 +53,7 @@
   CFWL_ListItem* GetItem(const CFWL_Widget* pWidget, int32_t nIndex) const;
   int32_t GetItemIndex(CFWL_Widget* pWidget, CFWL_ListItem* pItem);
 
-  CFWL_ListItem* AddString(const WideStringView& wsAdd);
+  CFWL_ListItem* AddString(WideStringView wsAdd);
   void RemoveAt(int32_t iIndex);
   void DeleteString(CFWL_ListItem* pItem);
   void DeleteAll();
diff --git a/xfa/fwl/cfx_barcode.cpp b/xfa/fwl/cfx_barcode.cpp
index ebb3ef1..47ad6f4 100644
--- a/xfa/fwl/cfx_barcode.cpp
+++ b/xfa/fwl/cfx_barcode.cpp
@@ -222,7 +222,7 @@
   return m_pBCEngine && m_pBCEngine->SetErrorCorrectionLevel(level);
 }
 
-bool CFX_Barcode::Encode(const WideStringView& contents) {
+bool CFX_Barcode::Encode(WideStringView contents) {
   return m_pBCEngine && m_pBCEngine->Encode(contents);
 }
 
diff --git a/xfa/fwl/cfx_barcode.h b/xfa/fwl/cfx_barcode.h
index 488af04..d387671 100644
--- a/xfa/fwl/cfx_barcode.h
+++ b/xfa/fwl/cfx_barcode.h
@@ -26,7 +26,7 @@
 
   static std::unique_ptr<CFX_Barcode> Create(BC_TYPE type);
   BC_TYPE GetType();
-  bool Encode(const WideStringView& contents);
+  bool Encode(WideStringView contents);
 
   bool RenderDevice(CFX_RenderDevice* device, const CFX_Matrix* matrix);
 
diff --git a/xfa/fwl/theme/cfwl_widgettp.cpp b/xfa/fwl/theme/cfwl_widgettp.cpp
index 49365ac..bea8b3b 100644
--- a/xfa/fwl/theme/cfwl_widgettp.cpp
+++ b/xfa/fwl/theme/cfwl_widgettp.cpp
@@ -237,14 +237,14 @@
 
 CFWL_FontData::~CFWL_FontData() {}
 
-bool CFWL_FontData::Equal(const WideStringView& wsFontFamily,
+bool CFWL_FontData::Equal(WideStringView wsFontFamily,
                           uint32_t dwFontStyles,
                           uint16_t wCodePage) {
   return m_wsFamily == wsFontFamily && m_dwStyles == dwFontStyles &&
          m_dwCodePage == wCodePage;
 }
 
-bool CFWL_FontData::LoadFont(const WideStringView& wsFontFamily,
+bool CFWL_FontData::LoadFont(WideStringView wsFontFamily,
                              uint32_t dwFontStyles,
                              uint16_t dwCodePage) {
   m_wsFamily = wsFontFamily;
@@ -282,10 +282,9 @@
 
 CFWL_FontManager::~CFWL_FontManager() {}
 
-RetainPtr<CFGAS_GEFont> CFWL_FontManager::FindFont(
-    const WideStringView& wsFontFamily,
-    uint32_t dwFontStyles,
-    uint16_t wCodePage) {
+RetainPtr<CFGAS_GEFont> CFWL_FontManager::FindFont(WideStringView wsFontFamily,
+                                                   uint32_t dwFontStyles,
+                                                   uint16_t wCodePage) {
   for (const auto& pData : m_FontsArray) {
     if (pData->Equal(wsFontFamily, dwFontStyles, wCodePage))
       return pData->GetFont();
diff --git a/xfa/fwl/theme/cfwl_widgettp.h b/xfa/fwl/theme/cfwl_widgettp.h
index 9871298..05f7174 100644
--- a/xfa/fwl/theme/cfwl_widgettp.h
+++ b/xfa/fwl/theme/cfwl_widgettp.h
@@ -89,10 +89,10 @@
   CFWL_FontData();
   virtual ~CFWL_FontData();
 
-  bool Equal(const WideStringView& wsFontFamily,
+  bool Equal(WideStringView wsFontFamily,
              uint32_t dwFontStyles,
              uint16_t wCodePage);
-  bool LoadFont(const WideStringView& wsFontFamily,
+  bool LoadFont(WideStringView wsFontFamily,
                 uint32_t dwFontStyles,
                 uint16_t wCodePage);
   RetainPtr<CFGAS_GEFont> GetFont() const;
@@ -110,7 +110,7 @@
   static CFWL_FontManager* GetInstance();
   static void DestroyInstance();
 
-  RetainPtr<CFGAS_GEFont> FindFont(const WideStringView& wsFontFamily,
+  RetainPtr<CFGAS_GEFont> FindFont(WideStringView wsFontFamily,
                                    uint32_t dwFontStyles,
                                    uint16_t dwCodePage);
 
diff --git a/xfa/fxfa/cxfa_ffcombobox.cpp b/xfa/fxfa/cxfa_ffcombobox.cpp
index 51d9536..dd74856 100644
--- a/xfa/fxfa/cxfa_ffcombobox.cpp
+++ b/xfa/fxfa/cxfa_ffcombobox.cpp
@@ -281,8 +281,7 @@
   InvalidateRect();
 }
 
-void CXFA_FFComboBox::InsertItem(const WideStringView& wsLabel,
-                                 int32_t nIndex) {
+void CXFA_FFComboBox::InsertItem(WideStringView wsLabel, int32_t nIndex) {
   ToComboBox(m_pNormalWidget.get())->AddString(wsLabel);
   m_pNormalWidget->Update();
   InvalidateRect();
diff --git a/xfa/fxfa/cxfa_ffcombobox.h b/xfa/fxfa/cxfa_ffcombobox.h
index 9ed8c40..d68b61c 100644
--- a/xfa/fxfa/cxfa_ffcombobox.h
+++ b/xfa/fxfa/cxfa_ffcombobox.h
@@ -48,7 +48,7 @@
                     const CFX_Matrix& matrix) override;
 
   // CXFA_FFDropDown
-  void InsertItem(const WideStringView& wsLabel, int32_t nIndex) override;
+  void InsertItem(WideStringView wsLabel, int32_t nIndex) override;
   void DeleteItem(int32_t nIndex) override;
 
   void OpenDropDownList();
diff --git a/xfa/fxfa/cxfa_ffdoc.cpp b/xfa/fxfa/cxfa_ffdoc.cpp
index e032d22..c2e10f6 100644
--- a/xfa/fxfa/cxfa_ffdoc.cpp
+++ b/xfa/fxfa/cxfa_ffdoc.cpp
@@ -180,10 +180,9 @@
   m_pApp->ClearEventTargets();
 }
 
-RetainPtr<CFX_DIBitmap> CXFA_FFDoc::GetPDFNamedImage(
-    const WideStringView& wsName,
-    int32_t& iImageXDpi,
-    int32_t& iImageYDpi) {
+RetainPtr<CFX_DIBitmap> CXFA_FFDoc::GetPDFNamedImage(WideStringView wsName,
+                                                     int32_t& iImageXDpi,
+                                                     int32_t& iImageYDpi) {
   if (!m_pPDFDoc)
     return nullptr;
 
diff --git a/xfa/fxfa/cxfa_ffdoc.h b/xfa/fxfa/cxfa_ffdoc.h
index d2aa74b..73e8d1b 100644
--- a/xfa/fxfa/cxfa_ffdoc.h
+++ b/xfa/fxfa/cxfa_ffdoc.h
@@ -60,7 +60,7 @@
   CPDF_Document* GetPDFDoc() const { return m_pPDFDoc.Get(); }
   CXFA_FFDocView* GetDocView(CXFA_LayoutProcessor* pLayout);
   CXFA_FFDocView* GetDocView();
-  RetainPtr<CFX_DIBitmap> GetPDFNamedImage(const WideStringView& wsName,
+  RetainPtr<CFX_DIBitmap> GetPDFNamedImage(WideStringView wsName,
                                            int32_t& iImageXDpi,
                                            int32_t& iImageYDpi);
   CFGAS_PDFFontMgr* GetPDFFontMgr() const { return m_pPDFFontMgr.get(); }
diff --git a/xfa/fxfa/cxfa_ffdropdown.h b/xfa/fxfa/cxfa_ffdropdown.h
index 20ed766..f2288df 100644
--- a/xfa/fxfa/cxfa_ffdropdown.h
+++ b/xfa/fxfa/cxfa_ffdropdown.h
@@ -13,7 +13,7 @@
  public:
   ~CXFA_FFDropDown() override;
 
-  virtual void InsertItem(const WideStringView& wsLabel, int32_t nIndex) = 0;
+  virtual void InsertItem(WideStringView wsLabel, int32_t nIndex) = 0;
   virtual void DeleteItem(int32_t nIndex) = 0;
 
  protected:
diff --git a/xfa/fxfa/cxfa_fflistbox.cpp b/xfa/fxfa/cxfa_fflistbox.cpp
index 09845e8..b778b72 100644
--- a/xfa/fxfa/cxfa_fflistbox.cpp
+++ b/xfa/fxfa/cxfa_fflistbox.cpp
@@ -165,7 +165,7 @@
   InvalidateRect();
 }
 
-void CXFA_FFListBox::InsertItem(const WideStringView& wsLabel, int32_t nIndex) {
+void CXFA_FFListBox::InsertItem(WideStringView wsLabel, int32_t nIndex) {
   WideString wsTemp(wsLabel);
   ToListBox(m_pNormalWidget.get())->AddString(wsTemp.AsStringView());
   m_pNormalWidget->Update();
diff --git a/xfa/fxfa/cxfa_fflistbox.h b/xfa/fxfa/cxfa_fflistbox.h
index d65dd8f..47d87d9 100644
--- a/xfa/fxfa/cxfa_fflistbox.h
+++ b/xfa/fxfa/cxfa_fflistbox.h
@@ -25,7 +25,7 @@
   FormFieldType GetFormFieldType() override;
 
   // CXFA_FFDropDown
-  void InsertItem(const WideStringView& wsLabel, int32_t nIndex) override;
+  void InsertItem(WideStringView wsLabel, int32_t nIndex) override;
   void DeleteItem(int32_t nIndex) override;
 
   void OnSelectChanged(CFWL_Widget* pWidget);
diff --git a/xfa/fxfa/cxfa_fontmgr.cpp b/xfa/fxfa/cxfa_fontmgr.cpp
index 62c3e86..2aadb40 100644
--- a/xfa/fxfa/cxfa_fontmgr.cpp
+++ b/xfa/fxfa/cxfa_fontmgr.cpp
@@ -25,10 +25,9 @@
 
 CXFA_FontMgr::~CXFA_FontMgr() = default;
 
-RetainPtr<CFGAS_GEFont> CXFA_FontMgr::GetFont(
-    CXFA_FFDoc* hDoc,
-    const WideStringView& wsFontFamily,
-    uint32_t dwFontStyles) {
+RetainPtr<CFGAS_GEFont> CXFA_FontMgr::GetFont(CXFA_FFDoc* hDoc,
+                                              WideStringView wsFontFamily,
+                                              uint32_t dwFontStyles) {
   uint32_t dwHash = FX_HashCode_GetW(wsFontFamily, false);
   ByteString bsKey = ByteString::Format("%u%u%u", dwHash, dwFontStyles, 0xFFFF);
   auto iter = m_FontMap.find(bsKey);
diff --git a/xfa/fxfa/cxfa_fontmgr.h b/xfa/fxfa/cxfa_fontmgr.h
index 082c064..2ad45dc 100644
--- a/xfa/fxfa/cxfa_fontmgr.h
+++ b/xfa/fxfa/cxfa_fontmgr.h
@@ -20,7 +20,7 @@
   ~CXFA_FontMgr();
 
   RetainPtr<CFGAS_GEFont> GetFont(CXFA_FFDoc* hDoc,
-                                  const WideStringView& wsFontFamily,
+                                  WideStringView wsFontFamily,
                                   uint32_t dwFontStyles);
 
  private:
diff --git a/xfa/fxfa/fm2js/cxfa_fmexpression.cpp b/xfa/fxfa/fm2js/cxfa_fmexpression.cpp
index 3027dea..6fbe21d 100644
--- a/xfa/fxfa/fm2js/cxfa_fmexpression.cpp
+++ b/xfa/fxfa/fm2js/cxfa_fmexpression.cpp
@@ -32,7 +32,7 @@
 CXFA_FMExpression::CXFA_FMExpression() = default;
 
 CXFA_FMFunctionDefinition::CXFA_FMFunctionDefinition(
-    const WideStringView& wsName,
+    WideStringView wsName,
     std::vector<WideStringView>&& arguments,
     std::vector<std::unique_ptr<CXFA_FMExpression>>&& expressions)
     : CXFA_FMExpression(),
@@ -114,7 +114,7 @@
 }
 
 CXFA_FMVarExpression::CXFA_FMVarExpression(
-    const WideStringView& wsName,
+    WideStringView wsName,
     std::unique_ptr<CXFA_FMSimpleExpression> pInit)
     : CXFA_FMExpression(), m_wsName(wsName), m_pInit(std::move(pInit)) {}
 
@@ -343,7 +343,7 @@
 }
 
 CXFA_FMForExpression::CXFA_FMForExpression(
-    const WideStringView& wsVariant,
+    WideStringView wsVariant,
     std::unique_ptr<CXFA_FMSimpleExpression> pAssignment,
     std::unique_ptr<CXFA_FMSimpleExpression> pAccessor,
     int32_t iDirection,
@@ -404,7 +404,7 @@
 }
 
 CXFA_FMForeachExpression::CXFA_FMForeachExpression(
-    const WideStringView& wsIdentifier,
+    WideStringView wsIdentifier,
     std::vector<std::unique_ptr<CXFA_FMSimpleExpression>>&& pAccessors,
     std::unique_ptr<CXFA_FMExpression> pList)
     : CXFA_FMExpression(),
diff --git a/xfa/fxfa/fm2js/cxfa_fmexpression.h b/xfa/fxfa/fm2js/cxfa_fmexpression.h
index 37999a1..2761ef5 100644
--- a/xfa/fxfa/fm2js/cxfa_fmexpression.h
+++ b/xfa/fxfa/fm2js/cxfa_fmexpression.h
@@ -26,7 +26,7 @@
 class CXFA_FMFunctionDefinition final : public CXFA_FMExpression {
  public:
   CXFA_FMFunctionDefinition(
-      const WideStringView& wsName,
+      WideStringView wsName,
       std::vector<WideStringView>&& arguments,
       std::vector<std::unique_ptr<CXFA_FMExpression>>&& expressions);
   ~CXFA_FMFunctionDefinition() override;
@@ -53,7 +53,7 @@
 
 class CXFA_FMVarExpression final : public CXFA_FMExpression {
  public:
-  CXFA_FMVarExpression(const WideStringView& wsName,
+  CXFA_FMVarExpression(WideStringView wsName,
                        std::unique_ptr<CXFA_FMSimpleExpression> pInit);
   ~CXFA_FMVarExpression() override;
 
@@ -148,7 +148,7 @@
 
 class CXFA_FMForExpression final : public CXFA_FMExpression {
  public:
-  CXFA_FMForExpression(const WideStringView& wsVariant,
+  CXFA_FMForExpression(WideStringView wsVariant,
                        std::unique_ptr<CXFA_FMSimpleExpression> pAssignment,
                        std::unique_ptr<CXFA_FMSimpleExpression> pAccessor,
                        int32_t iDirection,
@@ -171,7 +171,7 @@
  public:
   // Takes ownership of |pAccessors|.
   CXFA_FMForeachExpression(
-      const WideStringView& wsIdentifier,
+      WideStringView wsIdentifier,
       std::vector<std::unique_ptr<CXFA_FMSimpleExpression>>&& pAccessors,
       std::unique_ptr<CXFA_FMExpression> pList);
   ~CXFA_FMForeachExpression() override;
diff --git a/xfa/fxfa/fm2js/cxfa_fmlexer.cpp b/xfa/fxfa/fm2js/cxfa_fmlexer.cpp
index c5aa36e..000a683 100644
--- a/xfa/fxfa/fm2js/cxfa_fmlexer.cpp
+++ b/xfa/fxfa/fm2js/cxfa_fmlexer.cpp
@@ -98,7 +98,7 @@
 };
 #endif  // NDEBUG
 
-XFA_FM_TOKEN TokenizeIdentifier(const WideStringView& str) {
+XFA_FM_TOKEN TokenizeIdentifier(WideStringView str) {
   const XFA_FMKeyword* result =
       std::find_if(std::begin(keyWords), std::end(keyWords),
                    [str](const XFA_FMKeyword& iter) {
@@ -129,7 +129,7 @@
 }
 #endif  // NDEBUG
 
-CXFA_FMLexer::CXFA_FMLexer(const WideStringView& wsFormCalc)
+CXFA_FMLexer::CXFA_FMLexer(WideStringView wsFormCalc)
     : m_cursor(wsFormCalc.unterminated_c_str()),
       m_end(m_cursor + wsFormCalc.GetLength()),
       m_lexer_error(false) {}
diff --git a/xfa/fxfa/fm2js/cxfa_fmlexer.h b/xfa/fxfa/fm2js/cxfa_fmlexer.h
index 2bea518..bc87898 100644
--- a/xfa/fxfa/fm2js/cxfa_fmlexer.h
+++ b/xfa/fxfa/fm2js/cxfa_fmlexer.h
@@ -102,7 +102,7 @@
 
 class CXFA_FMLexer {
  public:
-  explicit CXFA_FMLexer(const WideStringView& wsFormcalc);
+  explicit CXFA_FMLexer(WideStringView wsFormcalc);
   ~CXFA_FMLexer();
 
   CXFA_FMToken NextToken();
diff --git a/xfa/fxfa/fm2js/cxfa_fmparser.cpp b/xfa/fxfa/fm2js/cxfa_fmparser.cpp
index 1de6a04..152b5a1 100644
--- a/xfa/fxfa/fm2js/cxfa_fmparser.cpp
+++ b/xfa/fxfa/fm2js/cxfa_fmparser.cpp
@@ -21,7 +21,7 @@
 
 }  // namespace
 
-CXFA_FMParser::CXFA_FMParser(const WideStringView& wsFormcalc)
+CXFA_FMParser::CXFA_FMParser(WideStringView wsFormcalc)
     : m_lexer(pdfium::MakeUnique<CXFA_FMLexer>(wsFormcalc)),
       m_error(false),
       m_parse_depth(0),
diff --git a/xfa/fxfa/fm2js/cxfa_fmparser.h b/xfa/fxfa/fm2js/cxfa_fmparser.h
index bd66aa7..ad2b367 100644
--- a/xfa/fxfa/fm2js/cxfa_fmparser.h
+++ b/xfa/fxfa/fm2js/cxfa_fmparser.h
@@ -15,7 +15,7 @@
 
 class CXFA_FMParser {
  public:
-  explicit CXFA_FMParser(const WideStringView& wsFormcalc);
+  explicit CXFA_FMParser(WideStringView wsFormcalc);
   ~CXFA_FMParser();
 
   std::unique_ptr<CXFA_FMAST> Parse();
diff --git a/xfa/fxfa/parser/cxfa_document.cpp b/xfa/fxfa/parser/cxfa_document.cpp
index 052a316..5d94efc 100644
--- a/xfa/fxfa/parser/cxfa_document.cpp
+++ b/xfa/fxfa/parser/cxfa_document.cpp
@@ -1478,7 +1478,7 @@
 }
 
 CXFA_Node* CXFA_Document::GetNodeByID(CXFA_Node* pRoot,
-                                      const WideStringView& wsID) const {
+                                      WideStringView wsID) const {
   if (!pRoot || wsID.IsEmpty())
     return nullptr;
 
diff --git a/xfa/fxfa/parser/cxfa_document.h b/xfa/fxfa/parser/cxfa_document.h
index 0449f06..39e3422 100644
--- a/xfa/fxfa/parser/cxfa_document.h
+++ b/xfa/fxfa/parser/cxfa_document.h
@@ -65,7 +65,7 @@
   CXFA_FFNotify* GetNotify() const { return notify_.Get(); }
   CXFA_LocaleMgr* GetLocaleMgr();
   CXFA_Object* GetXFAObject(XFA_HashCode wsNodeNameHash);
-  CXFA_Node* GetNodeByID(CXFA_Node* pRoot, const WideStringView& wsID) const;
+  CXFA_Node* GetNodeByID(CXFA_Node* pRoot, WideStringView wsID) const;
   CXFA_Node* GetNotBindNode(
       const std::vector<UnownedPtr<CXFA_Object>>& arrayNodes) const;
   CXFA_LayoutProcessor* GetLayoutProcessor();
diff --git a/xfa/fxfa/parser/cxfa_document_parser.cpp b/xfa/fxfa/parser/cxfa_document_parser.cpp
index 861a789..2264217 100644
--- a/xfa/fxfa/parser/cxfa_document_parser.cpp
+++ b/xfa/fxfa/parser/cxfa_document_parser.cpp
@@ -45,8 +45,8 @@
 }
 
 bool MatchNodeName(CFX_XMLNode* pNode,
-                   const WideStringView& wsLocalTagName,
-                   const WideStringView& wsNamespaceURIPrefix,
+                   WideStringView wsLocalTagName,
+                   WideStringView wsNamespaceURIPrefix,
                    uint32_t eMatchFlags = XFA_XDPPACKET_FLAGS_NOMATCH) {
   CFX_XMLElement* pElement = ToXMLElement(pNode);
   if (!pElement)
@@ -67,7 +67,7 @@
   return wsNodeStr == wsNamespaceURIPrefix;
 }
 
-bool GetAttributeLocalName(const WideStringView& wsAttributeName,
+bool GetAttributeLocalName(WideStringView wsAttributeName,
                            WideString& wsLocalAttrName) {
   WideString wsAttrName(wsAttributeName);
   auto pos = wsAttrName.Find(L':', 0);
@@ -101,8 +101,8 @@
 }
 
 bool FindAttributeWithNS(CFX_XMLElement* pElement,
-                         const WideStringView& wsLocalAttributeName,
-                         const WideStringView& wsNamespaceURIPrefix,
+                         WideStringView wsLocalAttributeName,
+                         WideStringView wsNamespaceURIPrefix,
                          WideString& wsValue,
                          bool bMatchNSAsPrefix = false) {
   if (!pElement)
diff --git a/xfa/fxfa/parser/cxfa_measurement.cpp b/xfa/fxfa/parser/cxfa_measurement.cpp
index 05089c7..bb1987a 100644
--- a/xfa/fxfa/parser/cxfa_measurement.cpp
+++ b/xfa/fxfa/parser/cxfa_measurement.cpp
@@ -18,7 +18,7 @@
 
 }  // namespace
 
-CXFA_Measurement::CXFA_Measurement(const WideStringView& wsMeasure) {
+CXFA_Measurement::CXFA_Measurement(WideStringView wsMeasure) {
   SetString(wsMeasure);
 }
 
@@ -30,7 +30,7 @@
   Set(fValue, eUnit);
 }
 
-void CXFA_Measurement::SetString(const WideStringView& wsMeasure) {
+void CXFA_Measurement::SetString(WideStringView wsMeasure) {
   if (wsMeasure.IsEmpty()) {
     m_fValue = 0;
     m_eUnit = XFA_Unit::Unknown;
@@ -128,7 +128,7 @@
 }
 
 // static
-XFA_Unit CXFA_Measurement::GetUnitFromString(const WideStringView& wsUnit) {
+XFA_Unit CXFA_Measurement::GetUnitFromString(WideStringView wsUnit) {
   if (wsUnit.EqualsASCII("mm"))
     return XFA_Unit::Mm;
   if (wsUnit.EqualsASCII("pt"))
diff --git a/xfa/fxfa/parser/cxfa_measurement.h b/xfa/fxfa/parser/cxfa_measurement.h
index d83af24..b2cf2d5 100644
--- a/xfa/fxfa/parser/cxfa_measurement.h
+++ b/xfa/fxfa/parser/cxfa_measurement.h
@@ -13,11 +13,11 @@
 
 class CXFA_Measurement {
  public:
-  explicit CXFA_Measurement(const WideStringView& wsMeasure);
+  explicit CXFA_Measurement(WideStringView wsMeasure);
   CXFA_Measurement();
   CXFA_Measurement(float fValue, XFA_Unit eUnit);
 
-  static XFA_Unit GetUnitFromString(const WideStringView& wsUnit);
+  static XFA_Unit GetUnitFromString(WideStringView wsUnit);
 
   void Set(float fValue, XFA_Unit eUnit) {
     m_fValue = fValue;
@@ -31,7 +31,7 @@
   float ToUnit(XFA_Unit eUnit) const;
 
  private:
-  void SetString(const WideStringView& wsMeasure);
+  void SetString(WideStringView wsMeasure);
   bool ToUnitInternal(XFA_Unit eUnit, float* fValue) const;
 
   float m_fValue;
diff --git a/xfa/fxfa/parser/cxfa_node.cpp b/xfa/fxfa/parser/cxfa_node.cpp
index 200e296..bbb6c42 100644
--- a/xfa/fxfa/parser/cxfa_node.cpp
+++ b/xfa/fxfa/parser/cxfa_node.cpp
@@ -1548,7 +1548,7 @@
                              XFA_AttributeValue::Unknown, false);
 }
 
-CXFA_Node* CXFA_Node::GetFirstChildByName(const WideStringView& wsName) const {
+CXFA_Node* CXFA_Node::GetFirstChildByName(WideStringView wsName) const {
   return GetFirstChildByName(FX_HashCode_GetW(wsName, false));
 }
 
@@ -1580,7 +1580,7 @@
 }
 
 CXFA_Node* CXFA_Node::GetNextSameNameSiblingInternal(
-    const WideStringView& wsNodeName) const {
+    WideStringView wsNodeName) const {
   return GetNextSameNameSibling(FX_HashCode_GetW(wsNodeName, false));
 }
 
@@ -3969,8 +3969,7 @@
   return pSelectedMember;
 }
 
-CXFA_Node* CXFA_Node::SetSelectedMember(const WideStringView& wsName,
-                                        bool bNotify) {
+CXFA_Node* CXFA_Node::SetSelectedMember(WideStringView wsName, bool bNotify) {
   uint32_t nameHash = FX_HashCode_GetW(wsName, false);
   for (CXFA_Node* pNode = ToNode(GetFirstChild()); pNode;
        pNode = pNode->GetNextSibling()) {
@@ -3982,7 +3981,7 @@
   return nullptr;
 }
 
-void CXFA_Node::SetSelectedMemberByValue(const WideStringView& wsValue,
+void CXFA_Node::SetSelectedMemberByValue(WideStringView wsValue,
                                          bool bNotify,
                                          bool bScriptModify,
                                          bool bSyncData) {
@@ -4378,7 +4377,7 @@
                                                     wsValue.c_str(), nIndex);
 }
 
-WideString CXFA_Node::GetItemLabel(const WideStringView& wsValue) const {
+WideString CXFA_Node::GetItemLabel(WideStringView wsValue) const {
   std::vector<CXFA_Node*> listitems;
   CXFA_Node* pItems = GetFirstChild();
   for (; pItems; pItems = pItems->GetNextSibling()) {
@@ -4418,7 +4417,7 @@
   return pText ? pText->JSObject()->GetContent(false) : WideString();
 }
 
-WideString CXFA_Node::GetItemValue(const WideStringView& wsLabel) {
+WideString CXFA_Node::GetItemValue(WideStringView wsLabel) {
   int32_t iCount = 0;
   std::vector<CXFA_Node*> listitems;
   for (CXFA_Node* pItems = GetFirstChild(); pItems;
diff --git a/xfa/fxfa/parser/cxfa_node.h b/xfa/fxfa/parser/cxfa_node.h
index 8e3cac2..d02835c 100644
--- a/xfa/fxfa/parser/cxfa_node.h
+++ b/xfa/fxfa/parser/cxfa_node.h
@@ -195,7 +195,7 @@
   Optional<WideString> GetLocaleName();
   XFA_AttributeValue GetIntact();
 
-  CXFA_Node* GetFirstChildByName(const WideStringView& wsNodeName) const;
+  CXFA_Node* GetFirstChildByName(WideStringView wsNodeName) const;
   CXFA_Node* GetFirstChildByName(uint32_t dwNodeNameHash) const;
   template <typename T>
   T* GetFirstChildByClass(XFA_Element eType) const {
@@ -203,7 +203,7 @@
   }
   CXFA_Node* GetNextSameNameSibling(uint32_t dwNodeNameHash) const;
   template <typename T>
-  T* GetNextSameNameSibling(const WideStringView& wsNodeName) const {
+  T* GetNextSameNameSibling(WideStringView wsNodeName) const {
     return static_cast<T*>(GetNextSameNameSiblingInternal(wsNodeName));
   }
   template <typename T>
@@ -313,8 +313,8 @@
   void SetCheckState(XFA_CHECKSTATE eCheckState, bool bNotify);
 
   CXFA_Node* GetSelectedMember();
-  CXFA_Node* SetSelectedMember(const WideStringView& wsName, bool bNotify);
-  void SetSelectedMemberByValue(const WideStringView& wsValue,
+  CXFA_Node* SetSelectedMember(WideStringView wsName, bool bNotify);
+  void SetSelectedMemberByValue(WideStringView wsValue,
                                 bool bNotify,
                                 bool bScriptModify,
                                 bool bSyncData);
@@ -350,7 +350,7 @@
                     bool bScriptModify,
                     bool bSyncData);
 
-  WideString GetItemValue(const WideStringView& wsLabel);
+  WideString GetItemValue(WideStringView wsLabel);
 
   bool IsHorizontalScrollPolicyOff();
   bool IsVerticalScrollPolicyOff();
@@ -416,8 +416,7 @@
                                   XFA_AttributeType eType) const;
   CXFA_Node* GetChildInternal(size_t index, XFA_Element eType, bool bOnlyChild);
   CXFA_Node* GetFirstChildByClassInternal(XFA_Element eType) const;
-  CXFA_Node* GetNextSameNameSiblingInternal(
-      const WideStringView& wsNodeName) const;
+  CXFA_Node* GetNextSameNameSiblingInternal(WideStringView wsNodeName) const;
   CXFA_Node* GetNextSameClassSiblingInternal(XFA_Element eType) const;
   void CalcCaptionSize(CXFA_FFDoc* doc, CFX_SizeF* pszCap);
   bool CalculateFieldAutoSize(CXFA_FFDoc* doc, CFX_SizeF* pSize);
@@ -442,7 +441,7 @@
   void InsertListTextItem(CXFA_Node* pItems,
                           const WideString& wsText,
                           int32_t nIndex);
-  WideString GetItemLabel(const WideStringView& wsValue) const;
+  WideString GetItemLabel(WideStringView wsValue) const;
 
   std::pair<XFA_FFWidgetType, CXFA_Ui*> CreateChildUIAndValueNodesIfNeeded();
   void CreateValueNodeIfNeeded(CXFA_Value* value, CXFA_Node* pUIChild);
diff --git a/xfa/fxfa/parser/cxfa_nodelocale.cpp b/xfa/fxfa/parser/cxfa_nodelocale.cpp
index 9d495f4..01d2dc5 100644
--- a/xfa/fxfa/parser/cxfa_nodelocale.cpp
+++ b/xfa/fxfa/parser/cxfa_nodelocale.cpp
@@ -135,7 +135,7 @@
 }
 
 CXFA_Node* CXFA_NodeLocale::GetNodeByName(CXFA_Node* pParent,
-                                          const WideStringView& wsName) const {
+                                          WideStringView wsName) const {
   CXFA_Node* pChild = pParent ? pParent->GetFirstChild() : nullptr;
   while (pChild) {
     if (pChild->JSObject()->GetAttribute(XFA_Attribute::Name) == wsName)
@@ -147,7 +147,7 @@
 }
 
 WideString CXFA_NodeLocale::GetSymbol(XFA_Element eElement,
-                                      const WideStringView& symbol_type) const {
+                                      WideStringView symbol_type) const {
   CXFA_Node* pSymbols =
       m_pLocale ? m_pLocale->GetChild<CXFA_Node>(0, eElement, false) : nullptr;
   CXFA_Node* pSymbol = GetNodeByName(pSymbols, symbol_type);
diff --git a/xfa/fxfa/parser/cxfa_nodelocale.h b/xfa/fxfa/parser/cxfa_nodelocale.h
index 8ce70d3..b30decf 100644
--- a/xfa/fxfa/parser/cxfa_nodelocale.h
+++ b/xfa/fxfa/parser/cxfa_nodelocale.h
@@ -38,10 +38,8 @@
   WideString GetNumPattern(FX_LOCALENUMSUBCATEGORY eType) const override;
 
  private:
-  CXFA_Node* GetNodeByName(CXFA_Node* pParent,
-                           const WideStringView& wsName) const;
-  WideString GetSymbol(XFA_Element eElement,
-                       const WideStringView& symbol_type) const;
+  CXFA_Node* GetNodeByName(CXFA_Node* pParent, WideStringView wsName) const;
+  WideString GetSymbol(XFA_Element eElement, WideStringView symbol_type) const;
   WideString GetCalendarSymbol(XFA_Element eElement,
                                int index,
                                bool bAbbr) const;
diff --git a/xfa/fxfa/parser/cxfa_treelist.cpp b/xfa/fxfa/parser/cxfa_treelist.cpp
index 3d0f748..2dbec60 100644
--- a/xfa/fxfa/parser/cxfa_treelist.cpp
+++ b/xfa/fxfa/parser/cxfa_treelist.cpp
@@ -21,7 +21,7 @@
 
 CXFA_TreeList::~CXFA_TreeList() = default;
 
-CXFA_Node* CXFA_TreeList::NamedItem(const WideStringView& wsName) {
+CXFA_Node* CXFA_TreeList::NamedItem(WideStringView wsName) {
   uint32_t dwHashCode = FX_HashCode_GetW(wsName, false);
   size_t count = GetLength();
   for (size_t i = 0; i < count; i++) {
diff --git a/xfa/fxfa/parser/cxfa_treelist.h b/xfa/fxfa/parser/cxfa_treelist.h
index 997c763..a194e32 100644
--- a/xfa/fxfa/parser/cxfa_treelist.h
+++ b/xfa/fxfa/parser/cxfa_treelist.h
@@ -17,7 +17,7 @@
   explicit CXFA_TreeList(CXFA_Document* pDocument);
   ~CXFA_TreeList() override;
 
-  CXFA_Node* NamedItem(const WideStringView& wsName);
+  CXFA_Node* NamedItem(WideStringView wsName);
 };
 
 #endif  // XFA_FXFA_PARSER_CXFA_TREELIST_H_
diff --git a/xfa/fxfa/parser/cxfa_xmllocale.cpp b/xfa/fxfa/parser/cxfa_xmllocale.cpp
index 0b7da69..c7a6f47 100644
--- a/xfa/fxfa/parser/cxfa_xmllocale.cpp
+++ b/xfa/fxfa/parser/cxfa_xmllocale.cpp
@@ -121,7 +121,7 @@
   return GetCalendarSymbol(L"era", bAD ? 1 : 0, false);
 }
 
-WideString CXFA_XMLLocale::GetCalendarSymbol(const WideStringView& symbol,
+WideString CXFA_XMLLocale::GetCalendarSymbol(WideStringView symbol,
                                              size_t index,
                                              bool bAbbr) const {
   CFX_XMLElement* child = locale_->GetFirstChildNamed(L"calendarSymbols");
@@ -209,8 +209,8 @@
 }
 
 WideString CXFA_XMLLocale::GetPattern(CFX_XMLElement* patterns,
-                                      const WideStringView& bsTag,
-                                      const WideStringView& wsName) const {
+                                      WideStringView bsTag,
+                                      WideStringView wsName) const {
   for (auto* child = patterns->GetFirstChild(); child;
        child = child->GetNextSibling()) {
     CFX_XMLElement* pattern = ToXMLElement(child);
diff --git a/xfa/fxfa/parser/cxfa_xmllocale.h b/xfa/fxfa/parser/cxfa_xmllocale.h
index e0e165b..cacbddc 100644
--- a/xfa/fxfa/parser/cxfa_xmllocale.h
+++ b/xfa/fxfa/parser/cxfa_xmllocale.h
@@ -43,9 +43,9 @@
 
  private:
   WideString GetPattern(CFX_XMLElement* pElement,
-                        const WideStringView& bsTag,
-                        const WideStringView& wsName) const;
-  WideString GetCalendarSymbol(const WideStringView& symbol,
+                        WideStringView bsTag,
+                        WideStringView wsName) const;
+  WideString GetCalendarSymbol(WideStringView symbol,
                                size_t index,
                                bool bAbbr) const;
 
diff --git a/xfa/fxfa/parser/xfa_basic_data.cpp b/xfa/fxfa/parser/xfa_basic_data.cpp
index 655c11f..72c8790 100644
--- a/xfa/fxfa/parser/xfa_basic_data.cpp
+++ b/xfa/fxfa/parser/xfa_basic_data.cpp
@@ -233,7 +233,7 @@
   return {pRecord->name, pRecord->packet_type, pRecord->uri, pRecord->flags};
 }
 
-Optional<XFA_PACKETINFO> XFA_GetPacketByName(const WideStringView& wsName) {
+Optional<XFA_PACKETINFO> XFA_GetPacketByName(WideStringView wsName) {
   uint32_t hash = FX_HashCode_GetW(wsName, false);
   auto* elem = std::lower_bound(
       std::begin(g_PacketTable), std::end(g_PacketTable), hash,
@@ -261,7 +261,7 @@
   return g_AttributeTable[static_cast<size_t>(attr)].name;
 }
 
-Optional<XFA_ATTRIBUTEINFO> XFA_GetAttributeByName(const WideStringView& name) {
+Optional<XFA_ATTRIBUTEINFO> XFA_GetAttributeByName(WideStringView name) {
   uint32_t hash = FX_HashCode_GetW(name, false);
   auto* elem = std::lower_bound(
       std::begin(g_AttributeTable), std::end(g_AttributeTable), hash,
@@ -279,8 +279,7 @@
   return g_AttributeValueTable[static_cast<int32_t>(item)].pName;
 }
 
-Optional<XFA_AttributeValue> XFA_GetAttributeValueByName(
-    const WideStringView& name) {
+Optional<XFA_AttributeValue> XFA_GetAttributeValueByName(WideStringView name) {
   auto* it = std::lower_bound(std::begin(g_AttributeValueTable),
                               std::end(g_AttributeValueTable),
                               FX_HashCode_GetW(name, false),
diff --git a/xfa/fxfa/parser/xfa_basic_data.h b/xfa/fxfa/parser/xfa_basic_data.h
index da892d6..c6ce222 100644
--- a/xfa/fxfa/parser/xfa_basic_data.h
+++ b/xfa/fxfa/parser/xfa_basic_data.h
@@ -33,17 +33,16 @@
 };
 
 XFA_PACKETINFO XFA_GetPacketByIndex(XFA_PacketType ePacket);
-Optional<XFA_PACKETINFO> XFA_GetPacketByName(const WideStringView& wsName);
+Optional<XFA_PACKETINFO> XFA_GetPacketByName(WideStringView wsName);
 
 ByteStringView XFA_ElementToName(XFA_Element elem);
 XFA_Element XFA_GetElementByName(const WideString& name);
 
 ByteStringView XFA_AttributeToName(XFA_Attribute attr);
-Optional<XFA_ATTRIBUTEINFO> XFA_GetAttributeByName(const WideStringView& name);
+Optional<XFA_ATTRIBUTEINFO> XFA_GetAttributeByName(WideStringView name);
 
 ByteStringView XFA_AttributeValueToName(XFA_AttributeValue item);
-Optional<XFA_AttributeValue> XFA_GetAttributeValueByName(
-    const WideStringView& name);
+Optional<XFA_AttributeValue> XFA_GetAttributeValueByName(WideStringView name);
 
 Optional<XFA_SCRIPTATTRIBUTEINFO> XFA_GetScriptAttributeByName(
     XFA_Element eElement,
