diff --git a/base/command_line.cc b/base/command_line.cc
index b2bf5a8..d6695a3 100644
--- a/base/command_line.cc
+++ b/base/command_line.cc
@@ -107,21 +107,21 @@
 
 #if defined(OS_WIN)
 // Quote a string as necessary for CommandLineToArgvW compatiblity *on Windows*.
-string16 QuoteForCommandLineToArgvW(const string16& arg,
-                                    bool quote_placeholders) {
+std::u16string QuoteForCommandLineToArgvW(const std::u16string& arg,
+                                          bool quote_placeholders) {
   // We follow the quoting rules of CommandLineToArgvW.
   // http://msdn.microsoft.com/en-us/library/17w5ykft.aspx
-  string16 quotable_chars(u" \\\"");
+  std::u16string quotable_chars(u" \\\"");
   // We may also be required to quote '%', which is commonly used in a command
   // line as a placeholder. (It may be substituted for a string with spaces.)
   if (quote_placeholders)
     quotable_chars.push_back('%');
-  if (arg.find_first_of(quotable_chars) == string16::npos) {
+  if (arg.find_first_of(quotable_chars) == std::u16string::npos) {
     // No quoting necessary.
     return arg;
   }
 
-  string16 out;
+  std::u16string out;
   out.push_back('"');
   for (size_t i = 0; i < arg.size(); ++i) {
     if (arg[i] == '\\') {
@@ -195,7 +195,7 @@
 void CommandLine::InitUsingArgvForTesting(int argc, const char* const* argv) {
   DCHECK(!current_process_commandline_);
   current_process_commandline_ = new CommandLine(NO_PROGRAM);
-  // On Windows we need to convert the command line arguments to string16.
+  // On Windows we need to convert the command line arguments to std::u16string.
   base::CommandLine::StringVector argv_vector;
   for (int i = 0; i < argc; ++i)
     argv_vector.push_back(UTF8ToUTF16(argv[i]));
@@ -245,7 +245,7 @@
 
 #if defined(OS_WIN)
 // static
-CommandLine CommandLine::FromString(const string16& command_line) {
+CommandLine CommandLine::FromString(const std::u16string& command_line) {
   CommandLine cmd(NO_PROGRAM);
   cmd.ParseFromString(command_line);
   return cmd;
@@ -282,17 +282,17 @@
 #endif
 }
 
-bool CommandLine::HasSwitch(const base::StringPiece& switch_string) const {
+bool CommandLine::HasSwitch(const std::string_view& switch_string) const {
   DCHECK_EQ(ToLowerASCII(switch_string), switch_string);
   return ContainsKey(switches_, switch_string);
 }
 
 bool CommandLine::HasSwitch(const char switch_constant[]) const {
-  return HasSwitch(base::StringPiece(switch_constant));
+  return HasSwitch(std::string_view(switch_constant));
 }
 
 std::string CommandLine::GetSwitchValueASCII(
-    const base::StringPiece& switch_string) const {
+    const std::string_view& switch_string) const {
   StringType value = GetSwitchValueNative(switch_string);
   if (!IsStringASCII(value)) {
     DLOG(WARNING) << "Value of switch (" << switch_string << ") must be ASCII.";
@@ -306,12 +306,12 @@
 }
 
 FilePath CommandLine::GetSwitchValuePath(
-    const base::StringPiece& switch_string) const {
+    const std::string_view& switch_string) const {
   return FilePath(GetSwitchValueNative(switch_string));
 }
 
 CommandLine::StringType CommandLine::GetSwitchValueNative(
-    const base::StringPiece& switch_string) const {
+    const std::string_view& switch_string) const {
   DCHECK_EQ(ToLowerASCII(switch_string), switch_string);
   auto result = switches_.find(switch_string);
   return result == switches_.end() ? StringType() : result->second;
@@ -424,8 +424,8 @@
 }
 
 #if defined(OS_WIN)
-void CommandLine::ParseFromString(const string16& command_line) {
-  string16 command_line_string;
+void CommandLine::ParseFromString(const std::u16string& command_line) {
+  std::u16string command_line_string;
   TrimWhitespace(command_line, TRIM_ALL, &command_line_string);
   if (command_line_string.empty())
     return;
diff --git a/base/command_line.h b/base/command_line.h
index 0161457..46c1fcc 100644
--- a/base/command_line.h
+++ b/base/command_line.h
@@ -18,10 +18,9 @@
 #include <stddef.h>
 #include <map>
 #include <string>
+#include <string_view>
 #include <vector>
 
-#include "base/strings/string16.h"
-#include "base/strings/string_piece.h"
 #include "util/build_config.h"
 
 namespace base {
@@ -32,7 +31,7 @@
  public:
 #if defined(OS_WIN)
   // The native command line string type.
-  using StringType = string16;
+  using StringType = std::u16string;
 #elif defined(OS_POSIX) || defined(OS_FUCHSIA)
   using StringType = std::string;
 #endif
@@ -100,7 +99,7 @@
   static bool InitializedForCurrentProcess();
 
 #if defined(OS_WIN)
-  static CommandLine FromString(const string16& command_line);
+  static CommandLine FromString(const std::u16string& command_line);
 #endif
 
   // Initialize from an argv vector.
@@ -164,16 +163,16 @@
   // Switch names must be lowercase.
   // The second override provides an optimized version to avoid inlining codegen
   // at every callsite to find the length of the constant and construct a
-  // StringPiece.
-  bool HasSwitch(const StringPiece& switch_string) const;
+  // std::string_view.
+  bool HasSwitch(const std::string_view& switch_string) const;
   bool HasSwitch(const char switch_constant[]) const;
 
   // Returns the value associated with the given switch. If the switch has no
   // value or isn't present, this method returns the empty string.
   // Switch names must be lowercase.
-  std::string GetSwitchValueASCII(const StringPiece& switch_string) const;
-  FilePath GetSwitchValuePath(const StringPiece& switch_string) const;
-  StringType GetSwitchValueNative(const StringPiece& switch_string) const;
+  std::string GetSwitchValueASCII(const std::string_view& switch_string) const;
+  FilePath GetSwitchValuePath(const std::string_view& switch_string) const;
+  StringType GetSwitchValueNative(const std::string_view& switch_string) const;
 
   // Get a copy of all switches, along with their values.
   const SwitchMap& GetSwitches() const { return switches_; }
@@ -215,7 +214,7 @@
 #if defined(OS_WIN)
   // Initialize by parsing the given command line string.
   // The program name is assumed to be the first item in the string.
-  void ParseFromString(const string16& command_line);
+  void ParseFromString(const std::u16string& command_line);
 #endif
 
  private:
diff --git a/base/containers/span.h b/base/containers/span.h
index c971861..20c7f15 100644
--- a/base/containers/span.h
+++ b/base/containers/span.h
@@ -88,8 +88,8 @@
 // own the underlying memory, so care must be taken to ensure that a span does
 // not outlive the backing store.
 //
-// span is somewhat analogous to StringPiece, but with arbitrary element types,
-// allowing mutation if T is non-const.
+// span is somewhat analogous to std::string_view, but with arbitrary element
+// types, allowing mutation if T is non-const.
 //
 // span is implicitly convertible from C++ arrays, as well as most [1]
 // container-like types that provide a data() and size() method (such as
diff --git a/base/environment.cc b/base/environment.cc
index 41951b7..427e3e5 100644
--- a/base/environment.cc
+++ b/base/environment.cc
@@ -6,10 +6,10 @@
 
 #include <stddef.h>
 
+#include <string_view>
 #include <vector>
 
 #include "base/memory/ptr_util.h"
-#include "base/strings/string_piece.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "util/build_config.h"
@@ -26,7 +26,7 @@
 
 class EnvironmentImpl : public Environment {
  public:
-  bool GetVar(StringPiece variable_name, std::string* result) override {
+  bool GetVar(std::string_view variable_name, std::string* result) override {
     if (GetVarImpl(variable_name, result))
       return true;
 
@@ -45,17 +45,17 @@
     return GetVarImpl(alternate_case_var, result);
   }
 
-  bool SetVar(StringPiece variable_name,
+  bool SetVar(std::string_view variable_name,
               const std::string& new_value) override {
     return SetVarImpl(variable_name, new_value);
   }
 
-  bool UnSetVar(StringPiece variable_name) override {
+  bool UnSetVar(std::string_view variable_name) override {
     return UnSetVarImpl(variable_name);
   }
 
  private:
-  bool GetVarImpl(StringPiece variable_name, std::string* result) {
+  bool GetVarImpl(std::string_view variable_name, std::string* result) {
 #if defined(OS_WIN)
     DWORD value_length = ::GetEnvironmentVariable(
         reinterpret_cast<LPCWSTR>(UTF8ToUTF16(variable_name).c_str()), nullptr,
@@ -81,7 +81,8 @@
 #endif
   }
 
-  bool SetVarImpl(StringPiece variable_name, const std::string& new_value) {
+  bool SetVarImpl(std::string_view variable_name,
+                  const std::string& new_value) {
 #if defined(OS_WIN)
     // On success, a nonzero value is returned.
     return !!SetEnvironmentVariable(
@@ -93,7 +94,7 @@
 #endif
   }
 
-  bool UnSetVarImpl(StringPiece variable_name) {
+  bool UnSetVarImpl(std::string_view variable_name) {
 #if defined(OS_WIN)
     // On success, a nonzero value is returned.
     return !!SetEnvironmentVariable(
@@ -141,18 +142,19 @@
   return std::make_unique<EnvironmentImpl>();
 }
 
-bool Environment::HasVar(StringPiece variable_name) {
+bool Environment::HasVar(std::string_view variable_name) {
   return GetVar(variable_name, nullptr);
 }
 
 #if defined(OS_WIN)
 
-string16 AlterEnvironment(const char16_t* env, const EnvironmentMap& changes) {
-  string16 result;
+std::u16string AlterEnvironment(const char16_t* env,
+                                const EnvironmentMap& changes) {
+  std::u16string result;
 
   // First copy all unmodified values to the output.
   size_t cur_env = 0;
-  string16 key;
+  std::u16string key;
   while (env[cur_env]) {
     const char16_t* line = &env[cur_env];
     size_t line_length = ParseEnvLine(line, &key);
diff --git a/base/environment.h b/base/environment.h
index 201b1a8..f9a2f55 100644
--- a/base/environment.h
+++ b/base/environment.h
@@ -8,9 +8,8 @@
 #include <map>
 #include <memory>
 #include <string>
+#include <string_view>
 
-#include "base/strings/string16.h"
-#include "base/strings/string_piece.h"
 #include "util/build_config.h"
 
 namespace base {
@@ -32,22 +31,22 @@
 
   // Gets an environment variable's value and stores it in |result|.
   // Returns false if the key is unset.
-  virtual bool GetVar(StringPiece variable_name, std::string* result) = 0;
+  virtual bool GetVar(std::string_view variable_name, std::string* result) = 0;
 
   // Syntactic sugar for GetVar(variable_name, nullptr);
-  virtual bool HasVar(StringPiece variable_name);
+  virtual bool HasVar(std::string_view variable_name);
 
   // Returns true on success, otherwise returns false.
-  virtual bool SetVar(StringPiece variable_name,
+  virtual bool SetVar(std::string_view variable_name,
                       const std::string& new_value) = 0;
 
   // Returns true on success, otherwise returns false.
-  virtual bool UnSetVar(StringPiece variable_name) = 0;
+  virtual bool UnSetVar(std::string_view variable_name) = 0;
 };
 
 #if defined(OS_WIN)
 
-typedef string16 NativeEnvironmentString;
+typedef std::u16string NativeEnvironmentString;
 typedef std::map<NativeEnvironmentString, NativeEnvironmentString>
     EnvironmentMap;
 
@@ -61,7 +60,8 @@
 // which is a concatenated list of null-terminated 16-bit strings. The end is
 // marked by a double-null terminator. The size of the returned string will
 // include the terminators.
-string16 AlterEnvironment(const char16_t* env, const EnvironmentMap& changes);
+std::u16string AlterEnvironment(const char16_t* env,
+                                const EnvironmentMap& changes);
 
 #elif defined(OS_POSIX) || defined(OS_FUCHSIA)
 
diff --git a/base/files/file_path.cc b/base/files/file_path.cc
index 3ecb009..e546761 100644
--- a/base/files/file_path.cc
+++ b/base/files/file_path.cc
@@ -5,11 +5,12 @@
 #include "base/files/file_path.h"
 
 #include <string.h>
+
 #include <algorithm>
+#include <string_view>
 
 #include "base/logging.h"
 #include "base/macros.h"
-#include "base/strings/string_piece.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "util/build_config.h"
@@ -28,7 +29,7 @@
 namespace base {
 
 using StringType = FilePath::StringType;
-using StringPieceType = FilePath::StringPieceType;
+using StringViewType = FilePath::StringViewType;
 
 namespace {
 
@@ -42,7 +43,7 @@
 // otherwise returns npos.  This can only be true on Windows, when a pathname
 // begins with a letter followed by a colon.  On other platforms, this always
 // returns npos.
-StringPieceType::size_type FindDriveLetter(StringPieceType path) {
+StringViewType::size_type FindDriveLetter(StringViewType path) {
 #if defined(FILE_PATH_USES_DRIVE_LETTERS)
   // This is dependent on an ASCII-based character set, but that's a
   // reasonable assumption.  iswalpha can be too inclusive here.
@@ -56,25 +57,25 @@
 }
 
 #if defined(FILE_PATH_USES_DRIVE_LETTERS)
-bool EqualDriveLetterCaseInsensitive(StringPieceType a, StringPieceType b) {
+bool EqualDriveLetterCaseInsensitive(StringViewType a, StringViewType b) {
   size_t a_letter_pos = FindDriveLetter(a);
   size_t b_letter_pos = FindDriveLetter(b);
 
   if (a_letter_pos == StringType::npos || b_letter_pos == StringType::npos)
     return a == b;
 
-  StringPieceType a_letter(a.substr(0, a_letter_pos + 1));
-  StringPieceType b_letter(b.substr(0, b_letter_pos + 1));
+  StringViewType a_letter(a.substr(0, a_letter_pos + 1));
+  StringViewType b_letter(b.substr(0, b_letter_pos + 1));
   if (!StartsWith(a_letter, b_letter, CompareCase::INSENSITIVE_ASCII))
     return false;
 
-  StringPieceType a_rest(a.substr(a_letter_pos + 1));
-  StringPieceType b_rest(b.substr(b_letter_pos + 1));
+  StringViewType a_rest(a.substr(a_letter_pos + 1));
+  StringViewType b_rest(b.substr(b_letter_pos + 1));
   return a_rest == b_rest;
 }
 #endif  // defined(FILE_PATH_USES_DRIVE_LETTERS)
 
-bool IsPathAbsolute(StringPieceType path) {
+bool IsPathAbsolute(StringViewType path) {
 #if defined(FILE_PATH_USES_DRIVE_LETTERS)
   StringType::size_type letter = FindDriveLetter(path);
   if (letter != StringType::npos) {
@@ -170,7 +171,7 @@
 FilePath::FilePath(const FilePath& that) = default;
 FilePath::FilePath(FilePath&& that) noexcept = default;
 
-FilePath::FilePath(StringPieceType path) {
+FilePath::FilePath(StringViewType path) {
   path_.assign(path);
   StringType::size_type nul_pos = path_.find(kStringTerminator);
   if (nul_pos != StringType::npos)
@@ -392,7 +393,7 @@
   return FilePath(path_.substr(0, dot));
 }
 
-FilePath FilePath::InsertBeforeExtension(StringPieceType suffix) const {
+FilePath FilePath::InsertBeforeExtension(StringViewType suffix) const {
   if (suffix.empty())
     return FilePath(path_);
 
@@ -406,7 +407,7 @@
   return FilePath(ret);
 }
 
-FilePath FilePath::InsertBeforeExtensionASCII(StringPiece suffix) const {
+FilePath FilePath::InsertBeforeExtensionASCII(std::string_view suffix) const {
   DCHECK(IsStringASCII(suffix));
 #if defined(OS_WIN)
   return InsertBeforeExtension(ASCIIToUTF16(suffix));
@@ -415,7 +416,7 @@
 #endif
 }
 
-FilePath FilePath::AddExtension(StringPieceType extension) const {
+FilePath FilePath::AddExtension(StringViewType extension) const {
   if (IsEmptyOrSpecialCase(BaseName().value()))
     return FilePath();
 
@@ -433,7 +434,7 @@
   return FilePath(str);
 }
 
-FilePath FilePath::ReplaceExtension(StringPieceType extension) const {
+FilePath FilePath::ReplaceExtension(StringViewType extension) const {
   if (IsEmptyOrSpecialCase(BaseName().value()))
     return FilePath();
 
@@ -450,14 +451,14 @@
   return FilePath(str);
 }
 
-FilePath FilePath::Append(StringPieceType component) const {
-  StringPieceType appended = component;
+FilePath FilePath::Append(StringViewType component) const {
+  StringViewType appended = component;
   StringType without_nuls;
 
   StringType::size_type nul_pos = component.find(kStringTerminator);
-  if (nul_pos != StringPieceType::npos) {
+  if (nul_pos != StringViewType::npos) {
     without_nuls.assign(component.substr(0, nul_pos));
-    appended = StringPieceType(without_nuls);
+    appended = StringViewType(without_nuls);
   }
 
   DCHECK(!IsPathAbsolute(appended));
@@ -498,7 +499,7 @@
   return Append(component.value());
 }
 
-FilePath FilePath::AppendASCII(StringPiece component) const {
+FilePath FilePath::AppendASCII(std::string_view component) const {
   DCHECK(base::IsStringASCII(component));
 #if defined(OS_WIN)
   return Append(ASCIIToUTF16(component));
@@ -564,7 +565,7 @@
 
 #if defined(OS_WIN)
 
-string16 FilePath::LossyDisplayName() const {
+std::u16string FilePath::LossyDisplayName() const {
   return path_;
 }
 
diff --git a/base/files/file_path.h b/base/files/file_path.h
index a8322c4..74fb674 100644
--- a/base/files/file_path.h
+++ b/base/files/file_path.h
@@ -106,12 +106,11 @@
 
 #include <iosfwd>
 #include <string>
+#include <string_view>
 #include <vector>
 
 #include "base/compiler_specific.h"
 #include "base/macros.h"
-#include "base/strings/string16.h"
-#include "base/strings/string_piece.h"
 #include "util/build_config.h"
 
 // Windows-style drive letter support and pathname separator characters can be
@@ -153,7 +152,7 @@
 #endif  // OS_WIN
 
   using CharType = StringType::value_type;
-  using StringPieceType = std::basic_string_view<CharType>;
+  using StringViewType = std::basic_string_view<CharType>;
 
   // Null-terminated array of separators used to separate components in
   // hierarchical paths.  Each character in this array is a valid separator,
@@ -175,7 +174,7 @@
 
   FilePath();
   FilePath(const FilePath& that);
-  explicit FilePath(StringPieceType path);
+  explicit FilePath(StringViewType path);
   ~FilePath();
   FilePath& operator=(const FilePath& that);
 
@@ -282,20 +281,20 @@
   // path == "jojo.jpg"         suffix == " (1)", returns "jojo (1).jpg"
   // path == "C:\pics\jojo"     suffix == " (1)", returns "C:\pics\jojo (1)"
   // path == "C:\pics.old\jojo" suffix == " (1)", returns "C:\pics.old\jojo (1)"
-  FilePath InsertBeforeExtension(StringPieceType suffix) const
+  FilePath InsertBeforeExtension(StringViewType suffix) const
       WARN_UNUSED_RESULT;
-  FilePath InsertBeforeExtensionASCII(StringPiece suffix) const
+  FilePath InsertBeforeExtensionASCII(std::string_view suffix) const
       WARN_UNUSED_RESULT;
 
   // Adds |extension| to |file_name|. Returns the current FilePath if
   // |extension| is empty. Returns "" if BaseName() == "." or "..".
-  FilePath AddExtension(StringPieceType extension) const WARN_UNUSED_RESULT;
+  FilePath AddExtension(StringViewType extension) const WARN_UNUSED_RESULT;
 
   // Replaces the extension of |file_name| with |extension|.  If |file_name|
   // does not have an extension, then |extension| is added.  If |extension| is
   // empty, then the extension is removed from |file_name|.
   // Returns "" if BaseName() == "." or "..".
-  FilePath ReplaceExtension(StringPieceType extension) const WARN_UNUSED_RESULT;
+  FilePath ReplaceExtension(StringViewType extension) const WARN_UNUSED_RESULT;
 
   // Returns a FilePath by appending a separator and the supplied path
   // component to this object's path.  Append takes care to avoid adding
@@ -303,7 +302,7 @@
   // If this object's path is kCurrentDirectory, a new FilePath corresponding
   // only to |component| is returned.  |component| must be a relative path;
   // it is an error to pass an absolute path.
-  FilePath Append(StringPieceType component) const WARN_UNUSED_RESULT;
+  FilePath Append(StringViewType component) const WARN_UNUSED_RESULT;
   FilePath Append(const FilePath& component) const WARN_UNUSED_RESULT;
 
   // Although Windows StringType is std::u16string, since the encoding it uses
@@ -312,7 +311,7 @@
   // Linux, although it can use any 8-bit encoding for paths, we assume that
   // ASCII is a valid subset, regardless of the encoding, since many operating
   // system paths will always be ASCII.
-  FilePath AppendASCII(StringPiece component) const WARN_UNUSED_RESULT;
+  FilePath AppendASCII(std::string_view component) const WARN_UNUSED_RESULT;
 
   // Returns true if this FilePath contains an absolute path.  On Windows, an
   // absolute path begins with either a drive letter specification followed by
@@ -338,8 +337,8 @@
   // Return a Unicode human-readable version of this path.
   // Warning: you can *not*, in general, go from a display name back to a real
   // path.  Only use this when displaying paths to users, not just when you
-  // want to stuff a string16 into some other API.
-  string16 LossyDisplayName() const;
+  // want to stuff a std::u16string into some other API.
+  std::u16string LossyDisplayName() const;
 
   // Return the path as ASCII, or the empty string if the path is not ASCII.
   // This should only be used for cases where the FilePath is representing a
diff --git a/base/files/file_util.cc b/base/files/file_util.cc
index 25b7aab..7043b75 100644
--- a/base/files/file_util.cc
+++ b/base/files/file_util.cc
@@ -11,11 +11,11 @@
 
 #include <fstream>
 #include <limits>
+#include <string_view>
 
 #include "base/files/file_enumerator.h"
 #include "base/files/file_path.h"
 #include "base/logging.h"
-#include "base/strings/string_piece.h"
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
diff --git a/base/files/file_util.h b/base/files/file_util.h
index e22f40f..0478c91 100644
--- a/base/files/file_util.h
+++ b/base/files/file_util.h
@@ -23,7 +23,6 @@
 
 #include "base/files/file.h"
 #include "base/files/file_path.h"
-#include "base/strings/string16.h"
 #include "util/build_config.h"
 
 #if defined(OS_WIN)
diff --git a/base/files/file_util_posix.cc b/base/files/file_util_posix.cc
index 0749ac9..a5822f1 100644
--- a/base/files/file_util_posix.cc
+++ b/base/files/file_util_posix.cc
@@ -183,7 +183,7 @@
 // Appends |mode_char| to |mode| before the optional character set encoding; see
 // https://www.gnu.org/software/libc/manual/html_node/Opening-Streams.html for
 // details.
-std::string AppendModeCharacter(StringPiece mode, char mode_char) {
+std::string AppendModeCharacter(std::string_view mode, char mode_char) {
   std::string result(mode);
   size_t comma_pos = result.find(',');
   result.insert(comma_pos == std::string::npos ? result.length() : comma_pos, 1,
@@ -394,7 +394,7 @@
     return false;
   }
 
-  for (const StringPiece& cur_path :
+  for (const std::string_view& cur_path :
        SplitStringPiece(path, ":", KEEP_WHITESPACE, SPLIT_WANT_NONEMPTY)) {
     FilePath file(cur_path);
     int permissions;
diff --git a/base/files/file_util_win.cc b/base/files/file_util_win.cc
index 8fba87a..3863f72 100644
--- a/base/files/file_util_win.cc
+++ b/base/files/file_util_win.cc
@@ -18,13 +18,13 @@
 #include <algorithm>
 #include <limits>
 #include <string>
+#include <string_view>
 
 #include "base/files/file_enumerator.h"
 #include "base/files/file_path.h"
 #include "base/logging.h"
 #include "base/macros.h"
 #include "base/strings/string_number_conversions.h"
-#include "base/strings/string_piece.h"
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
@@ -86,9 +86,9 @@
 
 // Appends |mode_char| to |mode| before the optional character set encoding; see
 // https://msdn.microsoft.com/library/yeby3zcb.aspx for details.
-void AppendModeCharacter(base::char16 mode_char, base::string16* mode) {
+void AppendModeCharacter(char16_t mode_char, std::u16string* mode) {
   size_t comma_pos = mode->find(L',');
-  mode->insert(comma_pos == base::string16::npos ? mode->length() : comma_pos,
+  mode->insert(comma_pos == std::u16string::npos ? mode->length() : comma_pos,
                1, mode_char);
 }
 
@@ -195,7 +195,7 @@
 bool DeleteFile(const FilePath& path, bool recursive) {
   static constexpr char kRecursive[] = "DeleteFile.Recursive";
   static constexpr char kNonRecursive[] = "DeleteFile.NonRecursive";
-  const StringPiece operation(recursive ? kRecursive : kNonRecursive);
+  const std::string_view operation(recursive ? kRecursive : kNonRecursive);
 
   // Metrics for delete failures tracked in https://crbug.com/599084. Delete may
   // fail for a number of reasons. Log some metrics relating to failures in the
@@ -359,7 +359,7 @@
   for (int count = 0; count < 50; ++count) {
     // Try create a new temporary directory with random generated name. If
     // the one exists, keep trying another path name until we reach some limit.
-    string16 new_dir_name;
+    std::u16string new_dir_name;
     new_dir_name.assign(prefix);
     new_dir_name.append(IntToString16(::GetCurrentProcessId()));
     new_dir_name.push_back('_');
@@ -578,7 +578,7 @@
   DCHECK(
       strchr(mode, 'N') == nullptr ||
       (strchr(mode, ',') != nullptr && strchr(mode, 'N') > strchr(mode, ',')));
-  string16 w_mode = ASCIIToUTF16(mode);
+  std::u16string w_mode = ASCIIToUTF16(mode);
   AppendModeCharacter(L'N', &w_mode);
   return _wfsopen(ToWCharT(&filename.value()), ToWCharT(&w_mode), _SH_DENYNO);
 }
diff --git a/base/json/json_parser.cc b/base/json/json_parser.cc
index 713f692..eac52a6 100644
--- a/base/json/json_parser.cc
+++ b/base/json/json_parser.cc
@@ -5,6 +5,7 @@
 #include "base/json/json_parser.h"
 
 #include <cmath>
+#include <string_view>
 #include <utility>
 #include <vector>
 
@@ -12,7 +13,6 @@
 #include "base/macros.h"
 #include "base/numerics/safe_conversions.h"
 #include "base/strings/string_number_conversions.h"
-#include "base/strings/string_piece.h"
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversion_utils.h"
@@ -68,7 +68,7 @@
 
 JSONParser::~JSONParser() = default;
 
-Optional<Value> JSONParser::Parse(StringPiece input) {
+Optional<Value> JSONParser::Parse(std::string_view input) {
   input_ = input;
   index_ = 0;
   line_number_ = 1;
@@ -163,30 +163,30 @@
 
 // JSONParser private //////////////////////////////////////////////////////////
 
-Optional<StringPiece> JSONParser::PeekChars(int count) {
+Optional<std::string_view> JSONParser::PeekChars(int count) {
   if (static_cast<size_t>(index_) + count > input_.length())
     return nullopt;
-  // Using StringPiece::substr() is significantly slower (according to
+  // Using std::string_view::substr() is significantly slower (according to
   // base_perftests) than constructing a substring manually.
-  return StringPiece(input_.data() + index_, count);
+  return std::string_view(input_.data() + index_, count);
 }
 
 Optional<char> JSONParser::PeekChar() {
-  Optional<StringPiece> chars = PeekChars(1);
+  Optional<std::string_view> chars = PeekChars(1);
   if (chars)
     return (*chars)[0];
   return nullopt;
 }
 
-Optional<StringPiece> JSONParser::ConsumeChars(int count) {
-  Optional<StringPiece> chars = PeekChars(count);
+Optional<std::string_view> JSONParser::ConsumeChars(int count) {
+  Optional<std::string_view> chars = PeekChars(count);
   if (chars)
     index_ += count;
   return chars;
 }
 
 Optional<char> JSONParser::ConsumeChar() {
-  Optional<StringPiece> chars = ConsumeChars(1);
+  Optional<std::string_view> chars = ConsumeChars(1);
   if (chars)
     return (*chars)[0];
   return nullopt;
@@ -268,7 +268,7 @@
 }
 
 bool JSONParser::EatComment() {
-  Optional<StringPiece> comment_start = ConsumeChars(2);
+  Optional<std::string_view> comment_start = ConsumeChars(2);
   if (!comment_start)
     return false;
 
@@ -444,7 +444,7 @@
     return false;
   }
 
-  // StringBuilder will internally build a StringPiece unless a UTF-16
+  // StringBuilder will internally build a std::string_view unless a UTF-16
   // conversion occurs, at which point it will perform a copy into a
   // std::string.
   StringBuilder string(pos());
@@ -475,12 +475,12 @@
     } else {
       // And if it is an escape sequence, the input string will be adjusted
       // (either by combining the two characters of an encoded escape sequence,
-      // or with a UTF conversion), so using StringPiece isn't possible -- force
-      // a conversion.
+      // or with a UTF conversion), so using std::string_view isn't possible --
+      // force a conversion.
       string.Convert();
 
       // Read past the escape '\' and ensure there's a character following.
-      Optional<StringPiece> escape_sequence = ConsumeChars(2);
+      Optional<std::string_view> escape_sequence = ConsumeChars(2);
       if (!escape_sequence) {
         ReportError(JSONReader::JSON_INVALID_ESCAPE, 0);
         return false;
@@ -558,7 +558,7 @@
 
 // Entry is at the first X in \uXXXX.
 bool JSONParser::DecodeUTF16(uint32_t* out_code_point) {
-  Optional<StringPiece> escape_sequence = ConsumeChars(4);
+  Optional<std::string_view> escape_sequence = ConsumeChars(4);
   if (!escape_sequence)
     return false;
 
@@ -671,7 +671,7 @@
 
   index_ = exit_index;
 
-  StringPiece num_string(num_start, end_index - start_index);
+  std::string_view num_string(num_start, end_index - start_index);
 
   int num_int;
   if (StringToInt(num_string, &num_int))
@@ -717,7 +717,7 @@
   }
 }
 
-bool JSONParser::ConsumeIfMatch(StringPiece match) {
+bool JSONParser::ConsumeIfMatch(std::string_view match) {
   if (match == PeekChars(match.size())) {
     ConsumeChars(match.size());
     return true;
diff --git a/base/json/json_parser.h b/base/json/json_parser.h
index 1289560..6bd61a4 100644
--- a/base/json/json_parser.h
+++ b/base/json/json_parser.h
@@ -10,13 +10,13 @@
 
 #include <memory>
 #include <string>
+#include <string_view>
 
 #include "base/compiler_specific.h"
 #include "base/gtest_prod_util.h"
 #include "base/json/json_reader.h"
 #include "base/macros.h"
 #include "base/optional.h"
-#include "base/strings/string_piece.h"
 
 namespace base {
 
@@ -49,7 +49,7 @@
   // result as a Value.
   // Wrap this in base::FooValue::From() to check the Value is of type Foo and
   // convert to a FooValue at the same time.
-  Optional<Value> Parse(StringPiece input);
+  Optional<Value> Parse(std::string_view input);
 
   // Returns the error code.
   JSONReader::JsonParseError error_code() const;
@@ -83,7 +83,7 @@
   };
 
   // A helper class used for parsing strings. One optimization performed is to
-  // create base::Value with a StringPiece to avoid unnecessary std::string
+  // create base::Value with a std::string_view to avoid unnecessary std::string
   // copies. This is not possible if the input string needs to be decoded from
   // UTF-16 to UTF-8, or if an escape sequence causes characters to be skipped.
   // This class centralizes that logic.
@@ -104,9 +104,9 @@
     // converted, or by appending the UTF8 bytes for the code point.
     void Append(uint32_t point);
 
-    // Converts the builder from its default StringPiece to a full std::string,
-    // performing a copy. Once a builder is converted, it cannot be made a
-    // StringPiece again.
+    // Converts the builder from its default std::string_view to a full
+    // std::string, performing a copy. Once a builder is converted, it cannot be
+    // made a std::string_view again.
     void Convert();
 
     // Returns the builder as a string, invalidating all state. This allows
@@ -128,14 +128,14 @@
 
   // Returns the next |count| bytes of the input stream, or nullopt if fewer
   // than |count| bytes remain.
-  Optional<StringPiece> PeekChars(int count);
+  Optional<std::string_view> PeekChars(int count);
 
   // Calls PeekChars() with a |count| of 1.
   Optional<char> PeekChar();
 
   // Returns the next |count| bytes of the input stream, or nullopt if fewer
   // than |count| bytes remain, and advances the parser position by |count|.
-  Optional<StringPiece> ConsumeChars(int count);
+  Optional<std::string_view> ConsumeChars(int count);
 
   // Calls ConsumeChars() with a |count| of 1.
   Optional<char> ConsumeChar();
@@ -198,7 +198,7 @@
   // consumed at the current parser position. Returns false if there are fewer
   // than |match|-length bytes or if the sequence does not match, and the
   // parser state is unchanged.
-  bool ConsumeIfMatch(StringPiece match);
+  bool ConsumeIfMatch(std::string_view match);
 
   // Sets the error information to |code| at the current column, based on
   // |index_| and |index_last_line_|, with an optional positive/negative
@@ -218,7 +218,7 @@
   const int max_depth_;
 
   // The input stream being parsed. Note: Not guaranteed to NUL-terminated.
-  StringPiece input_;
+  std::string_view input_;
 
   // The index in the input stream to which the parser is wound.
   int index_;
diff --git a/base/json/json_reader.cc b/base/json/json_reader.cc
index 3d5475e..d7eb7d9 100644
--- a/base/json/json_reader.cc
+++ b/base/json/json_reader.cc
@@ -41,7 +41,7 @@
 JSONReader::~JSONReader() = default;
 
 // static
-std::unique_ptr<Value> JSONReader::Read(StringPiece json,
+std::unique_ptr<Value> JSONReader::Read(std::string_view json,
                                         int options,
                                         int max_depth) {
   internal::JSONParser parser(options, max_depth);
@@ -51,7 +51,7 @@
 
 // static
 std::unique_ptr<Value> JSONReader::ReadAndReturnError(
-    StringPiece json,
+    std::string_view json,
     int options,
     int* error_code_out,
     std::string* error_msg_out,
@@ -103,7 +103,7 @@
   return std::string();
 }
 
-std::unique_ptr<Value> JSONReader::ReadToValue(StringPiece json) {
+std::unique_ptr<Value> JSONReader::ReadToValue(std::string_view json) {
   Optional<Value> value = parser_->Parse(json);
   return value ? std::make_unique<Value>(std::move(*value)) : nullptr;
 }
diff --git a/base/json/json_reader.h b/base/json/json_reader.h
index c4f7c8f..c454981 100644
--- a/base/json/json_reader.h
+++ b/base/json/json_reader.h
@@ -30,8 +30,7 @@
 
 #include <memory>
 #include <string>
-
-#include "base/strings/string_piece.h"
+#include <string_view>
 
 namespace base {
 
@@ -94,7 +93,7 @@
   // If |json| is not a properly formed JSON string, returns nullptr.
   // Wrap this in base::FooValue::From() to check the Value is of type Foo and
   // convert to a FooValue at the same time.
-  static std::unique_ptr<Value> Read(StringPiece json,
+  static std::unique_ptr<Value> Read(std::string_view json,
                                      int options = JSON_PARSE_RFC,
                                      int max_depth = kStackMaxDepth);
 
@@ -103,7 +102,7 @@
   // an error code and a formatted error message (including error location if
   // appropriate). Otherwise, they will be unmodified.
   static std::unique_ptr<Value> ReadAndReturnError(
-      StringPiece json,
+      std::string_view json,
       int options,  // JSONParserOptions
       int* error_code_out,
       std::string* error_msg_out,
@@ -115,7 +114,7 @@
   static std::string ErrorCodeToString(JsonParseError error_code);
 
   // Non-static version of Read() above.
-  std::unique_ptr<Value> ReadToValue(StringPiece json);
+  std::unique_ptr<Value> ReadToValue(std::string_view json);
 
   // Returns the error code if the last call to ReadToValue() failed.
   // Returns JSON_NO_ERROR otherwise.
diff --git a/base/json/json_value_converter.cc b/base/json/json_value_converter.cc
index 55506e6..ee7b094 100644
--- a/base/json/json_value_converter.cc
+++ b/base/json/json_value_converter.cc
@@ -17,8 +17,8 @@
   return value.GetAsString(field);
 }
 
-bool BasicValueConverter<string16>::Convert(const base::Value& value,
-                                            string16* field) const {
+bool BasicValueConverter<std::u16string>::Convert(const base::Value& value,
+                                                  std::u16string* field) const {
   return value.GetAsString(field);
 }
 
diff --git a/base/json/json_value_converter.h b/base/json/json_value_converter.h
index d91bead..f3030f2 100644
--- a/base/json/json_value_converter.h
+++ b/base/json/json_value_converter.h
@@ -9,13 +9,12 @@
 
 #include <memory>
 #include <string>
+#include <string_view>
 #include <vector>
 
 #include "base/logging.h"
 #include "base/macros.h"
 #include "base/memory/ptr_util.h"
-#include "base/strings/string16.h"
-#include "base/strings/string_piece.h"
 #include "base/values.h"
 
 // JSONValueConverter converts a JSON value into a C++ struct in a
@@ -70,8 +69,8 @@
 //
 // Sometimes JSON format uses string representations for other types such
 // like enum, timestamp, or URL.  You can use RegisterCustomField method
-// and specify a function to convert a StringPiece to your type.
-//   bool ConvertFunc(StringPiece s, YourEnum* result) {
+// and specify a function to convert a std::string_view to your type.
+//   bool ConvertFunc(std::string_view s, YourEnum* result) {
 //     // do something and return true if succeed...
 //   }
 //   struct Message {
@@ -158,11 +157,12 @@
 };
 
 template <>
-class BasicValueConverter<string16> : public ValueConverter<string16> {
+class BasicValueConverter<std::u16string>
+    : public ValueConverter<std::u16string> {
  public:
   BasicValueConverter() = default;
 
-  bool Convert(const base::Value& value, string16* field) const override;
+  bool Convert(const base::Value& value, std::u16string* field) const override;
 
  private:
   DISALLOW_COPY_AND_ASSIGN(BasicValueConverter);
@@ -211,7 +211,7 @@
 template <typename FieldType>
 class CustomFieldConverter : public ValueConverter<FieldType> {
  public:
-  typedef bool (*ConvertFunc)(StringPiece value, FieldType* field);
+  typedef bool (*ConvertFunc)(std::string_view value, FieldType* field);
 
   explicit CustomFieldConverter(ConvertFunc convert_func)
       : convert_func_(convert_func) {}
@@ -367,10 +367,11 @@
   }
 
   void RegisterStringField(const std::string& field_name,
-                           string16 StructType::*field) {
+                           std::u16string StructType::*field) {
     fields_.push_back(
-        std::make_unique<internal::FieldConverter<StructType, string16>>(
-            field_name, field, new internal::BasicValueConverter<string16>));
+        std::make_unique<internal::FieldConverter<StructType, std::u16string>>(
+            field_name, field,
+            new internal::BasicValueConverter<std::u16string>));
   }
 
   void RegisterBoolField(const std::string& field_name,
@@ -398,7 +399,7 @@
   template <typename FieldType>
   void RegisterCustomField(const std::string& field_name,
                            FieldType StructType::*field,
-                           bool (*convert_func)(StringPiece, FieldType*)) {
+                           bool (*convert_func)(std::string_view, FieldType*)) {
     fields_.push_back(
         std::make_unique<internal::FieldConverter<StructType, FieldType>>(
             field_name, field,
@@ -436,10 +437,12 @@
 
   void RegisterRepeatedString(
       const std::string& field_name,
-      std::vector<std::unique_ptr<string16>> StructType::*field) {
-    fields_.push_back(std::make_unique<internal::FieldConverter<
-                          StructType, std::vector<std::unique_ptr<string16>>>>(
-        field_name, field, new internal::RepeatedValueConverter<string16>));
+      std::vector<std::unique_ptr<std::u16string>> StructType::*field) {
+    fields_.push_back(
+        std::make_unique<internal::FieldConverter<
+            StructType, std::vector<std::unique_ptr<std::u16string>>>>(
+            field_name, field,
+            new internal::RepeatedValueConverter<std::u16string>));
   }
 
   void RegisterRepeatedDouble(
diff --git a/base/json/string_escape.cc b/base/json/string_escape.cc
index 471a9d3..ea674f5 100644
--- a/base/json/string_escape.cc
+++ b/base/json/string_escape.cc
@@ -116,38 +116,41 @@
 
 }  // namespace
 
-bool EscapeJSONString(StringPiece str, bool put_in_quotes, std::string* dest) {
-  return EscapeJSONStringImpl(str, put_in_quotes, dest);
-}
-
-bool EscapeJSONString(StringPiece16 str,
+bool EscapeJSONString(std::string_view str,
                       bool put_in_quotes,
                       std::string* dest) {
   return EscapeJSONStringImpl(str, put_in_quotes, dest);
 }
 
-std::string GetQuotedJSONString(StringPiece str) {
+bool EscapeJSONString(std::u16string_view str,
+                      bool put_in_quotes,
+                      std::string* dest) {
+  return EscapeJSONStringImpl(str, put_in_quotes, dest);
+}
+
+std::string GetQuotedJSONString(std::string_view str) {
   std::string dest;
   bool ok = EscapeJSONStringImpl(str, true, &dest);
   DCHECK(ok);
   return dest;
 }
 
-std::string GetQuotedJSONString(StringPiece16 str) {
+std::string GetQuotedJSONString(std::u16string_view str) {
   std::string dest;
   bool ok = EscapeJSONStringImpl(str, true, &dest);
   DCHECK(ok);
   return dest;
 }
 
-std::string EscapeBytesAsInvalidJSONString(StringPiece str,
+std::string EscapeBytesAsInvalidJSONString(std::string_view str,
                                            bool put_in_quotes) {
   std::string dest;
 
   if (put_in_quotes)
     dest.push_back('"');
 
-  for (StringPiece::const_iterator it = str.begin(); it != str.end(); ++it) {
+  for (std::string_view::const_iterator it = str.begin(); it != str.end();
+       ++it) {
     unsigned char c = *it;
     if (EscapeSpecialCodePoint(c, &dest))
       continue;
diff --git a/base/json/string_escape.h b/base/json/string_escape.h
index d318b6a..ada5179 100644
--- a/base/json/string_escape.h
+++ b/base/json/string_escape.h
@@ -8,8 +8,7 @@
 #define BASE_JSON_STRING_ESCAPE_H_
 
 #include <string>
-
-#include "base/strings/string_piece.h"
+#include <string_view>
 
 namespace base {
 
@@ -25,17 +24,21 @@
 //
 // If |put_in_quotes| is true, then a leading and trailing double-quote mark
 // will be appended to |dest| as well.
-bool EscapeJSONString(StringPiece str, bool put_in_quotes, std::string* dest);
+bool EscapeJSONString(std::string_view str,
+                      bool put_in_quotes,
+                      std::string* dest);
 
-// Performs a similar function to the UTF-8 StringPiece version above,
+// Performs a similar function to the UTF-8 std::string_view version above,
 // converting UTF-16 code units to UTF-8 code units and escaping non-printing
 // control characters. On return, |dest| will contain a valid UTF-8 JSON string.
-bool EscapeJSONString(StringPiece16 str, bool put_in_quotes, std::string* dest);
+bool EscapeJSONString(std::u16string_view str,
+                      bool put_in_quotes,
+                      std::string* dest);
 
 // Helper functions that wrap the above two functions but return the value
 // instead of appending. |put_in_quotes| is always true.
-std::string GetQuotedJSONString(StringPiece str);
-std::string GetQuotedJSONString(StringPiece16 str);
+std::string GetQuotedJSONString(std::string_view str);
+std::string GetQuotedJSONString(std::u16string_view str);
 
 // Given an arbitrary byte string |str|, this will escape all non-ASCII bytes
 // as \uXXXX escape sequences. This function is *NOT* meant to be used with
@@ -48,7 +51,8 @@
 //
 // The output of this function takes the *appearance* of JSON but is not in
 // fact valid according to RFC 4627.
-std::string EscapeBytesAsInvalidJSONString(StringPiece str, bool put_in_quotes);
+std::string EscapeBytesAsInvalidJSONString(std::string_view str,
+                                           bool put_in_quotes);
 
 }  // namespace base
 
diff --git a/base/logging.cc b/base/logging.cc
index 1144d61..16449ee 100644
--- a/base/logging.cc
+++ b/base/logging.cc
@@ -42,12 +42,12 @@
 #include <iomanip>
 #include <ostream>
 #include <string>
+#include <string_view>
 #include <utility>
 
 #include "base/callback.h"
 #include "base/containers/stack.h"
 #include "base/posix/eintr_wrapper.h"
-#include "base/strings/string_piece.h"
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
@@ -188,9 +188,9 @@
 
 // writes the common header info to the stream
 void LogMessage::Init(const char* file, int line) {
-  base::StringPiece filename(file);
+  std::string_view filename(file);
   size_t last_slash_pos = filename.find_last_of("\\/");
-  if (last_slash_pos != base::StringPiece::npos)
+  if (last_slash_pos != std::string_view::npos)
     filename.remove_prefix(last_slash_pos + 1);
 
   // TODO(darin): It might be nice if the columns were fixed width.
diff --git a/base/logging.h b/base/logging.h
index cba1c55..78c0861 100644
--- a/base/logging.h
+++ b/base/logging.h
@@ -11,13 +11,13 @@
 #include <cstring>
 #include <sstream>
 #include <string>
+#include <string_view>
 #include <type_traits>
 #include <utility>
 
 #include "base/callback_forward.h"
 #include "base/compiler_specific.h"
 #include "base/macros.h"
-#include "base/strings/string_piece.h"
 #include "base/template_util.h"
 #include "util/build_config.h"
 
diff --git a/base/md5.cc b/base/md5.cc
index 0b50e56..4fcab55 100644
--- a/base/md5.cc
+++ b/base/md5.cc
@@ -169,7 +169,7 @@
  * Update context to reflect the concatenation of another buffer full
  * of bytes.
  */
-void MD5Update(MD5Context* context, const StringPiece& data) {
+void MD5Update(MD5Context* context, const std::string_view& data) {
   struct Context* ctx = reinterpret_cast<struct Context*>(context);
   const uint8_t* buf = reinterpret_cast<const uint8_t*>(data.data());
   size_t len = data.size();
@@ -287,11 +287,12 @@
 void MD5Sum(const void* data, size_t length, MD5Digest* digest) {
   MD5Context ctx;
   MD5Init(&ctx);
-  MD5Update(&ctx, StringPiece(reinterpret_cast<const char*>(data), length));
+  MD5Update(&ctx,
+            std::string_view(reinterpret_cast<const char*>(data), length));
   MD5Final(digest, &ctx);
 }
 
-std::string MD5String(const StringPiece& str) {
+std::string MD5String(const std::string_view& str) {
   MD5Digest digest;
   MD5Sum(str.data(), str.length(), &digest);
   return MD5DigestToBase16(digest);
diff --git a/base/md5.h b/base/md5.h
index 802645c..d25b2fc 100644
--- a/base/md5.h
+++ b/base/md5.h
@@ -9,8 +9,7 @@
 #include <stdint.h>
 
 #include <string>
-
-#include "base/strings/string_piece.h"
+#include <string_view>
 
 namespace base {
 
@@ -50,10 +49,10 @@
 // MD5Update().
 void MD5Init(MD5Context* context);
 
-// For the given buffer of |data| as a StringPiece, updates the given MD5
+// For the given buffer of |data| as a std::string_view, updates the given MD5
 // context with the sum of the data. You can call this any number of times
 // during the computation, except that MD5Init() must have been called first.
-void MD5Update(MD5Context* context, const StringPiece& data);
+void MD5Update(MD5Context* context, const std::string_view& data);
 
 // Finalizes the MD5 operation and fills the buffer with the digest.
 void MD5Final(MD5Digest* digest, MD5Context* context);
@@ -71,7 +70,7 @@
 void MD5Sum(const void* data, size_t length, MD5Digest* digest);
 
 // Returns the MD5 (in hexadecimal) of a string.
-std::string MD5String(const StringPiece& str);
+std::string MD5String(const std::string_view& str);
 
 }  // namespace base
 
diff --git a/base/strings/char_traits.h b/base/strings/char_traits.h
index b193e21..c432849 100644
--- a/base/strings/char_traits.h
+++ b/base/strings/char_traits.h
@@ -13,7 +13,7 @@
 
 // constexpr version of http://en.cppreference.com/w/cpp/string/char_traits.
 // This currently just implements the bits needed to support a (mostly)
-// constexpr StringPiece.
+// constexpr std::string_view.
 //
 // TODO(dcheng): Once we switch to C++17, most methods will become constexpr and
 // we can switch over to using the one in the standard library.
diff --git a/base/strings/string16.h b/base/strings/string16.h
deleted file mode 100644
index a8e6ae3..0000000
--- a/base/strings/string16.h
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef BASE_STRINGS_STRING16_H_
-#define BASE_STRINGS_STRING16_H_
-
-#include <string>
-
-namespace base {
-
-// Temporary definitions. These should be removed and code using the standard
-// ones.
-using char16 = char16_t;
-using string16 = std::u16string;
-
-}  // namespace base
-
-#endif  // BASE_STRINGS_STRING16_H_
diff --git a/base/strings/string_number_conversions.cc b/base/strings/string_number_conversions.cc
index 5f94a56..9156fa3 100644
--- a/base/strings/string_number_conversions.cc
+++ b/base/strings/string_number_conversions.cc
@@ -270,38 +270,38 @@
 class BaseHexIteratorRangeToUInt64Traits
     : public BaseIteratorRangeToNumberTraits<ITERATOR, uint64_t, 16> {};
 
-typedef BaseHexIteratorRangeToIntTraits<StringPiece::const_iterator>
+typedef BaseHexIteratorRangeToIntTraits<std::string_view::const_iterator>
     HexIteratorRangeToIntTraits;
 
-typedef BaseHexIteratorRangeToUIntTraits<StringPiece::const_iterator>
+typedef BaseHexIteratorRangeToUIntTraits<std::string_view::const_iterator>
     HexIteratorRangeToUIntTraits;
 
-typedef BaseHexIteratorRangeToInt64Traits<StringPiece::const_iterator>
+typedef BaseHexIteratorRangeToInt64Traits<std::string_view::const_iterator>
     HexIteratorRangeToInt64Traits;
 
-typedef BaseHexIteratorRangeToUInt64Traits<StringPiece::const_iterator>
+typedef BaseHexIteratorRangeToUInt64Traits<std::string_view::const_iterator>
     HexIteratorRangeToUInt64Traits;
 
 template <typename VALUE, int BASE>
 class StringPieceToNumberTraits
-    : public BaseIteratorRangeToNumberTraits<StringPiece::const_iterator,
+    : public BaseIteratorRangeToNumberTraits<std::string_view::const_iterator,
                                              VALUE,
                                              BASE> {};
 
 template <typename VALUE>
-bool StringToIntImpl(StringPiece input, VALUE* output) {
+bool StringToIntImpl(std::string_view input, VALUE* output) {
   return IteratorRangeToNumber<StringPieceToNumberTraits<VALUE, 10>>::Invoke(
       input.begin(), input.end(), output);
 }
 
 template <typename VALUE, int BASE>
-class StringPiece16ToNumberTraits
-    : public BaseIteratorRangeToNumberTraits<StringPiece16::const_iterator,
-                                             VALUE,
-                                             BASE> {};
+class StringPiece16ToNumberTraits : public BaseIteratorRangeToNumberTraits<
+                                        std::u16string_view::const_iterator,
+                                        VALUE,
+                                        BASE> {};
 
 template <typename VALUE>
-bool String16ToIntImpl(StringPiece16 input, VALUE* output) {
+bool String16ToIntImpl(std::u16string_view input, VALUE* output) {
   return IteratorRangeToNumber<StringPiece16ToNumberTraits<VALUE, 10>>::Invoke(
       input.begin(), input.end(), output);
 }
@@ -312,87 +312,87 @@
   return IntToStringT<std::string, int>::IntToString(value);
 }
 
-string16 NumberToString16(int value) {
-  return IntToStringT<string16, int>::IntToString(value);
+std::u16string NumberToString16(int value) {
+  return IntToStringT<std::u16string, int>::IntToString(value);
 }
 
 std::string NumberToString(unsigned value) {
   return IntToStringT<std::string, unsigned>::IntToString(value);
 }
 
-string16 NumberToString16(unsigned value) {
-  return IntToStringT<string16, unsigned>::IntToString(value);
+std::u16string NumberToString16(unsigned value) {
+  return IntToStringT<std::u16string, unsigned>::IntToString(value);
 }
 
 std::string NumberToString(long value) {
   return IntToStringT<std::string, long>::IntToString(value);
 }
 
-string16 NumberToString16(long value) {
-  return IntToStringT<string16, long>::IntToString(value);
+std::u16string NumberToString16(long value) {
+  return IntToStringT<std::u16string, long>::IntToString(value);
 }
 
 std::string NumberToString(unsigned long value) {
   return IntToStringT<std::string, unsigned long>::IntToString(value);
 }
 
-string16 NumberToString16(unsigned long value) {
-  return IntToStringT<string16, unsigned long>::IntToString(value);
+std::u16string NumberToString16(unsigned long value) {
+  return IntToStringT<std::u16string, unsigned long>::IntToString(value);
 }
 
 std::string NumberToString(long long value) {
   return IntToStringT<std::string, long long>::IntToString(value);
 }
 
-string16 NumberToString16(long long value) {
-  return IntToStringT<string16, long long>::IntToString(value);
+std::u16string NumberToString16(long long value) {
+  return IntToStringT<std::u16string, long long>::IntToString(value);
 }
 
 std::string NumberToString(unsigned long long value) {
   return IntToStringT<std::string, unsigned long long>::IntToString(value);
 }
 
-string16 NumberToString16(unsigned long long value) {
-  return IntToStringT<string16, unsigned long long>::IntToString(value);
+std::u16string NumberToString16(unsigned long long value) {
+  return IntToStringT<std::u16string, unsigned long long>::IntToString(value);
 }
 
-bool StringToInt(StringPiece input, int* output) {
+bool StringToInt(std::string_view input, int* output) {
   return StringToIntImpl(input, output);
 }
 
-bool StringToInt(StringPiece16 input, int* output) {
+bool StringToInt(std::u16string_view input, int* output) {
   return String16ToIntImpl(input, output);
 }
 
-bool StringToUint(StringPiece input, unsigned* output) {
+bool StringToUint(std::string_view input, unsigned* output) {
   return StringToIntImpl(input, output);
 }
 
-bool StringToUint(StringPiece16 input, unsigned* output) {
+bool StringToUint(std::u16string_view input, unsigned* output) {
   return String16ToIntImpl(input, output);
 }
 
-bool StringToInt64(StringPiece input, int64_t* output) {
+bool StringToInt64(std::string_view input, int64_t* output) {
   return StringToIntImpl(input, output);
 }
 
-bool StringToInt64(StringPiece16 input, int64_t* output) {
+bool StringToInt64(std::u16string_view input, int64_t* output) {
   return String16ToIntImpl(input, output);
 }
 
-bool StringToUint64(StringPiece input, uint64_t* output) {
+bool StringToUint64(std::string_view input, uint64_t* output) {
   return StringToIntImpl(input, output);
 }
 
-bool StringToUint64(StringPiece16 input, uint64_t* output) {
+bool StringToUint64(std::u16string_view input, uint64_t* output) {
   return String16ToIntImpl(input, output);
 }
 
-bool StringToSizeT(StringPiece input, size_t* output) {
+bool StringToSizeT(std::string_view input, size_t* output) {
   return StringToIntImpl(input, output);
 }
 
-bool StringToSizeT(StringPiece16 input, size_t* output) {
+bool StringToSizeT(std::u16string_view input, size_t* output) {
   return String16ToIntImpl(input, output);
 }
 
@@ -418,27 +418,27 @@
   return ret;
 }
 
-bool HexStringToInt(StringPiece input, int* output) {
+bool HexStringToInt(std::string_view input, int* output) {
   return IteratorRangeToNumber<HexIteratorRangeToIntTraits>::Invoke(
       input.begin(), input.end(), output);
 }
 
-bool HexStringToUInt(StringPiece input, uint32_t* output) {
+bool HexStringToUInt(std::string_view input, uint32_t* output) {
   return IteratorRangeToNumber<HexIteratorRangeToUIntTraits>::Invoke(
       input.begin(), input.end(), output);
 }
 
-bool HexStringToInt64(StringPiece input, int64_t* output) {
+bool HexStringToInt64(std::string_view input, int64_t* output) {
   return IteratorRangeToNumber<HexIteratorRangeToInt64Traits>::Invoke(
       input.begin(), input.end(), output);
 }
 
-bool HexStringToUInt64(StringPiece input, uint64_t* output) {
+bool HexStringToUInt64(std::string_view input, uint64_t* output) {
   return IteratorRangeToNumber<HexIteratorRangeToUInt64Traits>::Invoke(
       input.begin(), input.end(), output);
 }
 
-bool HexStringToBytes(StringPiece input, std::vector<uint8_t>* output) {
+bool HexStringToBytes(std::string_view input, std::vector<uint8_t>* output) {
   DCHECK_EQ(output->size(), 0u);
   size_t count = input.size();
   if (count == 0 || (count % 2) != 0)
diff --git a/base/strings/string_number_conversions.h b/base/strings/string_number_conversions.h
index 8ffdd36..81360a0 100644
--- a/base/strings/string_number_conversions.h
+++ b/base/strings/string_number_conversions.h
@@ -9,10 +9,9 @@
 #include <stdint.h>
 
 #include <string>
+#include <string_view>
 #include <vector>
 
-#include "base/strings/string16.h"
-#include "base/strings/string_piece.h"
 #include "util/build_config.h"
 
 namespace base {
@@ -21,17 +20,17 @@
 
 // Ignores locale! see warning above.
 std::string NumberToString(int value);
-string16 NumberToString16(int value);
+std::u16string NumberToString16(int value);
 std::string NumberToString(unsigned int value);
-string16 NumberToString16(unsigned int value);
+std::u16string NumberToString16(unsigned int value);
 std::string NumberToString(long value);
-string16 NumberToString16(long value);
+std::u16string NumberToString16(long value);
 std::string NumberToString(unsigned long value);
-string16 NumberToString16(unsigned long value);
+std::u16string NumberToString16(unsigned long value);
 std::string NumberToString(long long value);
-string16 NumberToString16(long long value);
+std::u16string NumberToString16(long long value);
 std::string NumberToString(unsigned long long value);
-string16 NumberToString16(unsigned long long value);
+std::u16string NumberToString16(unsigned long long value);
 
 // Type-specific naming for backwards compatibility.
 //
@@ -40,19 +39,19 @@
 inline std::string IntToString(int value) {
   return NumberToString(value);
 }
-inline string16 IntToString16(int value) {
+inline std::u16string IntToString16(int value) {
   return NumberToString16(value);
 }
 inline std::string UintToString(unsigned value) {
   return NumberToString(value);
 }
-inline string16 UintToString16(unsigned value) {
+inline std::u16string UintToString16(unsigned value) {
   return NumberToString16(value);
 }
 inline std::string Int64ToString(int64_t value) {
   return NumberToString(value);
 }
-inline string16 Int64ToString16(int64_t value) {
+inline std::u16string Int64ToString16(int64_t value) {
   return NumberToString16(value);
 }
 
@@ -74,20 +73,20 @@
 //  - Empty string.  |*output| will be set to 0.
 // WARNING: Will write to |output| even when returning false.
 //          Read the comments above carefully.
-bool StringToInt(StringPiece input, int* output);
-bool StringToInt(StringPiece16 input, int* output);
+bool StringToInt(std::string_view input, int* output);
+bool StringToInt(std::u16string_view input, int* output);
 
-bool StringToUint(StringPiece input, unsigned* output);
-bool StringToUint(StringPiece16 input, unsigned* output);
+bool StringToUint(std::string_view input, unsigned* output);
+bool StringToUint(std::u16string_view input, unsigned* output);
 
-bool StringToInt64(StringPiece input, int64_t* output);
-bool StringToInt64(StringPiece16 input, int64_t* output);
+bool StringToInt64(std::string_view input, int64_t* output);
+bool StringToInt64(std::u16string_view input, int64_t* output);
 
-bool StringToUint64(StringPiece input, uint64_t* output);
-bool StringToUint64(StringPiece16 input, uint64_t* output);
+bool StringToUint64(std::string_view input, uint64_t* output);
+bool StringToUint64(std::u16string_view input, uint64_t* output);
 
-bool StringToSizeT(StringPiece input, size_t* output);
-bool StringToSizeT(StringPiece16 input, size_t* output);
+bool StringToSizeT(std::string_view input, size_t* output);
+bool StringToSizeT(std::u16string_view input, size_t* output);
 
 // Hex encoding ----------------------------------------------------------------
 
@@ -102,30 +101,30 @@
 // Best effort conversion, see StringToInt above for restrictions.
 // Will only successful parse hex values that will fit into |output|, i.e.
 // -0x80000000 < |input| < 0x7FFFFFFF.
-bool HexStringToInt(StringPiece input, int* output);
+bool HexStringToInt(std::string_view input, int* output);
 
 // Best effort conversion, see StringToInt above for restrictions.
 // Will only successful parse hex values that will fit into |output|, i.e.
 // 0x00000000 < |input| < 0xFFFFFFFF.
 // The string is not required to start with 0x.
-bool HexStringToUInt(StringPiece input, uint32_t* output);
+bool HexStringToUInt(std::string_view input, uint32_t* output);
 
 // Best effort conversion, see StringToInt above for restrictions.
 // Will only successful parse hex values that will fit into |output|, i.e.
 // -0x8000000000000000 < |input| < 0x7FFFFFFFFFFFFFFF.
-bool HexStringToInt64(StringPiece input, int64_t* output);
+bool HexStringToInt64(std::string_view input, int64_t* output);
 
 // Best effort conversion, see StringToInt above for restrictions.
 // Will only successful parse hex values that will fit into |output|, i.e.
 // 0x0000000000000000 < |input| < 0xFFFFFFFFFFFFFFFF.
 // The string is not required to start with 0x.
-bool HexStringToUInt64(StringPiece input, uint64_t* output);
+bool HexStringToUInt64(std::string_view input, uint64_t* output);
 
 // Similar to the previous functions, except that output is a vector of bytes.
 // |*output| will contain as many bytes as were successfully parsed prior to the
 // error.  There is no overflow, but input.size() must be evenly divisible by 2.
 // Leading 0x or +/- are not allowed.
-bool HexStringToBytes(StringPiece input, std::vector<uint8_t>* output);
+bool HexStringToBytes(std::string_view input, std::vector<uint8_t>* output);
 
 }  // namespace base
 
diff --git a/base/strings/string_piece.h b/base/strings/string_piece.h
deleted file mode 100644
index fa215ef..0000000
--- a/base/strings/string_piece.h
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-// Copied from strings/stringpiece.h with modifications
-//
-// A string-like object that points to a sized piece of memory.
-//
-// You can use StringPiece as a function or method parameter.  A StringPiece
-// parameter can receive a double-quoted string literal argument, a "const
-// char*" argument, a string argument, or a StringPiece argument with no data
-// copying.  Systematic use of StringPiece for arguments reduces data
-// copies and strlen() calls.
-//
-// Prefer passing StringPieces by value:
-//   void MyFunction(StringPiece arg);
-// If circumstances require, you may also pass by const reference:
-//   void MyFunction(const StringPiece& arg);  // not preferred
-// Both of these have the same lifetime semantics.  Passing by value
-// generates slightly smaller code.  For more discussion, Googlers can see
-// the thread go/stringpiecebyvalue on c-users.
-
-#ifndef BASE_STRINGS_STRING_PIECE_H_
-#define BASE_STRINGS_STRING_PIECE_H_
-
-#include <string_view>
-
-namespace base {
-
-// Temporary definitions. These should be removed and code using the standard
-// ones.
-using StringPiece = std::string_view;
-using StringPiece16 = std::u16string_view;
-using WStringPiece = std::wstring_view;
-
-}  // namespace base
-
-#endif  // BASE_STRINGS_STRING_PIECE_H_
diff --git a/base/strings/string_split.cc b/base/strings/string_split.cc
index a57d537..f4c7eb2 100644
--- a/base/strings/string_split.cc
+++ b/base/strings/string_split.cc
@@ -18,11 +18,11 @@
 template <typename char_type>
 std::basic_string_view<char_type> WhitespaceForType();
 template <>
-StringPiece16 WhitespaceForType<char16_t>() {
+std::u16string_view WhitespaceForType<char16_t>() {
   return kWhitespaceUTF16;
 }
 template <>
-StringPiece WhitespaceForType<char>() {
+std::string_view WhitespaceForType<char>() {
   return kWhitespaceASCII;
 }
 
@@ -30,29 +30,34 @@
 // since this is the common case and can be made faster. This could have been
 // done with template specialization too, but would have been less clear.
 //
-// There is no corresponding FindFirstNotOf because StringPiece already
+// There is no corresponding FindFirstNotOf because std::string_view already
 // implements these different versions that do the optimized searching.
-size_t FindFirstOf(StringPiece piece, char c, size_t pos) {
+size_t FindFirstOf(std::string_view piece, char c, size_t pos) {
   return piece.find(c, pos);
 }
-size_t FindFirstOf(StringPiece16 piece, char16 c, size_t pos) {
+size_t FindFirstOf(std::u16string_view piece, char16_t c, size_t pos) {
   return piece.find(c, pos);
 }
-size_t FindFirstOf(StringPiece piece, StringPiece one_of, size_t pos) {
+size_t FindFirstOf(std::string_view piece,
+                   std::string_view one_of,
+                   size_t pos) {
   return piece.find_first_of(one_of, pos);
 }
-size_t FindFirstOf(StringPiece16 piece, StringPiece16 one_of, size_t pos) {
+size_t FindFirstOf(std::u16string_view piece,
+                   std::u16string_view one_of,
+                   size_t pos) {
   return piece.find_first_of(one_of, pos);
 }
 
 // General string splitter template. Can take 8- or 16-bit input, can produce
-// the corresponding string or StringPiece output, and can take single- or
+// the corresponding string or std::string_view output, and can take single- or
 // multiple-character delimiters.
 //
 // DelimiterType is either a character (Str::value_type) or a string piece of
-// multiple characters (std::basic_string_view<char>). StringPiece has a version
-// of find for both of these cases, and the single-character version is the most
-// common and can be implemented faster, which is why this is a template.
+// multiple characters (std::basic_string_view<char>). std::string_view has a
+// version of find for both of these cases, and the single-character version is
+// the most common and can be implemented faster, which is why this is a
+// template.
 template <typename char_type, typename OutputStringType, typename DelimiterType>
 static std::vector<OutputStringType> SplitStringT(
     std::basic_string_view<char_type> str,
@@ -87,7 +92,7 @@
   return result;
 }
 
-bool AppendStringKeyValue(StringPiece input,
+bool AppendStringKeyValue(std::string_view input,
                           char delimiter,
                           StringPairs* result) {
   // Always append a new item regardless of success (it might be empty). The
@@ -103,9 +108,10 @@
   result_pair.first.assign(input.substr(0, end_key_pos));
 
   // Find the value string.
-  StringPiece remains = input.substr(end_key_pos, input.size() - end_key_pos);
+  std::string_view remains =
+      input.substr(end_key_pos, input.size() - end_key_pos);
   size_t begin_value_pos = remains.find_first_not_of(delimiter);
-  if (begin_value_pos == StringPiece::npos) {
+  if (begin_value_pos == std::string_view::npos) {
     return false;  // No value.
   }
   result_pair.second.assign(
@@ -141,67 +147,68 @@
 
 }  // namespace
 
-std::vector<std::string> SplitString(StringPiece input,
-                                     StringPiece separators,
+std::vector<std::string> SplitString(std::string_view input,
+                                     std::string_view separators,
                                      WhitespaceHandling whitespace,
                                      SplitResult result_type) {
   if (separators.size() == 1) {
     return SplitStringT<char, std::string, char>(input, separators[0],
                                                  whitespace, result_type);
   }
-  return SplitStringT<char, std::string, StringPiece>(input, separators,
-                                                      whitespace, result_type);
-}
-
-std::vector<string16> SplitString(StringPiece16 input,
-                                  StringPiece16 separators,
-                                  WhitespaceHandling whitespace,
-                                  SplitResult result_type) {
-  if (separators.size() == 1) {
-    return SplitStringT<char16_t, string16, char16>(input, separators[0],
-                                                    whitespace, result_type);
-  }
-  return SplitStringT<char16_t, string16, StringPiece16>(
+  return SplitStringT<char, std::string, std::string_view>(
       input, separators, whitespace, result_type);
 }
 
-std::vector<StringPiece> SplitStringPiece(StringPiece input,
-                                          StringPiece separators,
-                                          WhitespaceHandling whitespace,
-                                          SplitResult result_type) {
+std::vector<std::u16string> SplitString(std::u16string_view input,
+                                        std::u16string_view separators,
+                                        WhitespaceHandling whitespace,
+                                        SplitResult result_type) {
   if (separators.size() == 1) {
-    return SplitStringT<char, StringPiece, char>(input, separators[0],
-                                                 whitespace, result_type);
-  }
-  return SplitStringT<char, StringPiece, StringPiece>(input, separators,
-                                                      whitespace, result_type);
-}
-
-std::vector<StringPiece16> SplitStringPiece(StringPiece16 input,
-                                            StringPiece16 separators,
-                                            WhitespaceHandling whitespace,
-                                            SplitResult result_type) {
-  if (separators.size() == 1) {
-    return SplitStringT<char16_t, StringPiece16, char16>(
+    return SplitStringT<char16_t, std::u16string, char16_t>(
         input, separators[0], whitespace, result_type);
   }
-  return SplitStringT<char16_t, StringPiece16, StringPiece16>(
+  return SplitStringT<char16_t, std::u16string, std::u16string_view>(
       input, separators, whitespace, result_type);
 }
 
-bool SplitStringIntoKeyValuePairs(StringPiece input,
+std::vector<std::string_view> SplitStringPiece(std::string_view input,
+                                               std::string_view separators,
+                                               WhitespaceHandling whitespace,
+                                               SplitResult result_type) {
+  if (separators.size() == 1) {
+    return SplitStringT<char, std::string_view, char>(input, separators[0],
+                                                      whitespace, result_type);
+  }
+  return SplitStringT<char, std::string_view, std::string_view>(
+      input, separators, whitespace, result_type);
+}
+
+std::vector<std::u16string_view> SplitStringPiece(
+    std::u16string_view input,
+    std::u16string_view separators,
+    WhitespaceHandling whitespace,
+    SplitResult result_type) {
+  if (separators.size() == 1) {
+    return SplitStringT<char16_t, std::u16string_view, char16_t>(
+        input, separators[0], whitespace, result_type);
+  }
+  return SplitStringT<char16_t, std::u16string_view, std::u16string_view>(
+      input, separators, whitespace, result_type);
+}
+
+bool SplitStringIntoKeyValuePairs(std::string_view input,
                                   char key_value_delimiter,
                                   char key_value_pair_delimiter,
                                   StringPairs* key_value_pairs) {
   key_value_pairs->clear();
 
-  std::vector<StringPiece> pairs =
+  std::vector<std::string_view> pairs =
       SplitStringPiece(input, std::string(1, key_value_pair_delimiter),
                        TRIM_WHITESPACE, SPLIT_WANT_NONEMPTY);
   key_value_pairs->reserve(pairs.size());
 
   bool success = true;
-  for (const StringPiece& pair : pairs) {
+  for (const std::string_view& pair : pairs) {
     if (!AppendStringKeyValue(pair, key_value_delimiter, key_value_pairs)) {
       // Don't return here, to allow for pairs without associated
       // value or key; just record that the split failed.
@@ -211,17 +218,18 @@
   return success;
 }
 
-std::vector<string16> SplitStringUsingSubstr(StringPiece16 input,
-                                             StringPiece16 delimiter,
-                                             WhitespaceHandling whitespace,
-                                             SplitResult result_type) {
-  std::vector<string16> result;
+std::vector<std::u16string> SplitStringUsingSubstr(
+    std::u16string_view input,
+    std::u16string_view delimiter,
+    WhitespaceHandling whitespace,
+    SplitResult result_type) {
+  std::vector<std::u16string> result;
   SplitStringUsingSubstrT(input, delimiter, whitespace, result_type, &result);
   return result;
 }
 
-std::vector<std::string> SplitStringUsingSubstr(StringPiece input,
-                                                StringPiece delimiter,
+std::vector<std::string> SplitStringUsingSubstr(std::string_view input,
+                                                std::string_view delimiter,
                                                 WhitespaceHandling whitespace,
                                                 SplitResult result_type) {
   std::vector<std::string> result;
@@ -229,22 +237,22 @@
   return result;
 }
 
-std::vector<StringPiece16> SplitStringPieceUsingSubstr(
-    StringPiece16 input,
-    StringPiece16 delimiter,
+std::vector<std::u16string_view> SplitStringPieceUsingSubstr(
+    std::u16string_view input,
+    std::u16string_view delimiter,
     WhitespaceHandling whitespace,
     SplitResult result_type) {
-  std::vector<StringPiece16> result;
+  std::vector<std::u16string_view> result;
   SplitStringUsingSubstrT(input, delimiter, whitespace, result_type, &result);
   return result;
 }
 
-std::vector<StringPiece> SplitStringPieceUsingSubstr(
-    StringPiece input,
-    StringPiece delimiter,
+std::vector<std::string_view> SplitStringPieceUsingSubstr(
+    std::string_view input,
+    std::string_view delimiter,
     WhitespaceHandling whitespace,
     SplitResult result_type) {
-  std::vector<StringPiece> result;
+  std::vector<std::string_view> result;
   SplitStringUsingSubstrT(input, delimiter, whitespace, result_type, &result);
   return result;
 }
diff --git a/base/strings/string_split.h b/base/strings/string_split.h
index 6f8fc7c..7ba14e1 100644
--- a/base/strings/string_split.h
+++ b/base/strings/string_split.h
@@ -6,12 +6,10 @@
 #define BASE_STRINGS_STRING_SPLIT_H_
 
 #include <string>
+#include <string_view>
 #include <utility>
 #include <vector>
 
-#include "base/strings/string16.h"
-#include "base/strings/string_piece.h"
-
 namespace base {
 
 enum WhitespaceHandling {
@@ -42,14 +40,14 @@
 //
 //   std::vector<std::string> tokens = base::SplitString(
 //       input, ",;", base::KEEP_WHITESPACE, base::SPLIT_WANT_ALL);
-std::vector<std::string> SplitString(StringPiece input,
-                                     StringPiece separators,
+std::vector<std::string> SplitString(std::string_view input,
+                                     std::string_view separators,
                                      WhitespaceHandling whitespace,
                                      SplitResult result_type);
-std::vector<string16> SplitString(StringPiece16 input,
-                                  StringPiece16 separators,
-                                  WhitespaceHandling whitespace,
-                                  SplitResult result_type);
+std::vector<std::u16string> SplitString(std::u16string_view input,
+                                        std::u16string_view separators,
+                                        WhitespaceHandling whitespace,
+                                        SplitResult result_type);
 
 // Like SplitString above except it returns a vector of StringPieces which
 // reference the original buffer without copying. Although you have to be
@@ -63,14 +61,15 @@
 //                               base::KEEP_WHITESPACE,
 //                               base::SPLIT_WANT_NONEMPTY)) {
 //     ...
-std::vector<StringPiece> SplitStringPiece(StringPiece input,
-                                          StringPiece separators,
-                                          WhitespaceHandling whitespace,
-                                          SplitResult result_type);
-std::vector<StringPiece16> SplitStringPiece(StringPiece16 input,
-                                            StringPiece16 separators,
-                                            WhitespaceHandling whitespace,
-                                            SplitResult result_type);
+std::vector<std::string_view> SplitStringPiece(std::string_view input,
+                                               std::string_view separators,
+                                               WhitespaceHandling whitespace,
+                                               SplitResult result_type);
+std::vector<std::u16string_view> SplitStringPiece(
+    std::u16string_view input,
+    std::u16string_view separators,
+    WhitespaceHandling whitespace,
+    SplitResult result_type);
 
 using StringPairs = std::vector<std::pair<std::string, std::string>>;
 
@@ -78,19 +77,20 @@
 // removes whitespace leading each key and trailing each value. Returns true
 // only if each pair has a non-empty key and value. |key_value_pairs| will
 // include ("","") pairs for entries without |key_value_delimiter|.
-bool SplitStringIntoKeyValuePairs(StringPiece input,
+bool SplitStringIntoKeyValuePairs(std::string_view input,
                                   char key_value_delimiter,
                                   char key_value_pair_delimiter,
                                   StringPairs* key_value_pairs);
 
 // Similar to SplitString, but use a substring delimiter instead of a list of
 // characters that are all possible delimiters.
-std::vector<string16> SplitStringUsingSubstr(StringPiece16 input,
-                                             StringPiece16 delimiter,
-                                             WhitespaceHandling whitespace,
-                                             SplitResult result_type);
-std::vector<std::string> SplitStringUsingSubstr(StringPiece input,
-                                                StringPiece delimiter,
+std::vector<std::u16string> SplitStringUsingSubstr(
+    std::u16string_view input,
+    std::u16string_view delimiter,
+    WhitespaceHandling whitespace,
+    SplitResult result_type);
+std::vector<std::string> SplitStringUsingSubstr(std::string_view input,
+                                                std::string_view delimiter,
                                                 WhitespaceHandling whitespace,
                                                 SplitResult result_type);
 
@@ -106,14 +106,14 @@
 //                                     base::KEEP_WHITESPACE,
 //                                     base::SPLIT_WANT_NONEMPTY)) {
 //     ...
-std::vector<StringPiece16> SplitStringPieceUsingSubstr(
-    StringPiece16 input,
-    StringPiece16 delimiter,
+std::vector<std::u16string_view> SplitStringPieceUsingSubstr(
+    std::u16string_view input,
+    std::u16string_view delimiter,
     WhitespaceHandling whitespace,
     SplitResult result_type);
-std::vector<StringPiece> SplitStringPieceUsingSubstr(
-    StringPiece input,
-    StringPiece delimiter,
+std::vector<std::string_view> SplitStringPieceUsingSubstr(
+    std::string_view input,
+    std::string_view delimiter,
     WhitespaceHandling whitespace,
     SplitResult result_type);
 
diff --git a/base/strings/string_tokenizer.h b/base/strings/string_tokenizer.h
index 50deb88..fe9401d 100644
--- a/base/strings/string_tokenizer.h
+++ b/base/strings/string_tokenizer.h
@@ -7,8 +7,7 @@
 
 #include <algorithm>
 #include <string>
-
-#include "base/strings/string_piece.h"
+#include <string_view>
 
 namespace base {
 
diff --git a/base/strings/string_util.cc b/base/strings/string_util.cc
index f6ee491..d8f28d4 100644
--- a/base/strings/string_util.cc
+++ b/base/strings/string_util.cc
@@ -67,7 +67,7 @@
 template <size_t size, typename CharacterType>
 struct NonASCIIMask;
 template <>
-struct NonASCIIMask<4, char16> {
+struct NonASCIIMask<4, char16_t> {
   static inline uint32_t value() { return 0xFF80FF80U; }
 };
 template <>
@@ -75,7 +75,7 @@
   static inline uint32_t value() { return 0x80808080U; }
 };
 template <>
-struct NonASCIIMask<8, char16> {
+struct NonASCIIMask<8, char16_t> {
   static inline uint64_t value() { return 0xFF80FF80FF80FF80ULL; }
 };
 template <>
@@ -109,20 +109,20 @@
 
 }  // namespace
 
-std::string ToLowerASCII(StringPiece str) {
+std::string ToLowerASCII(std::string_view str) {
   return ToLowerASCIIImpl<std::string>(str);
 }
 
-string16 ToLowerASCII(StringPiece16 str) {
-  return ToLowerASCIIImpl<string16>(str);
+std::u16string ToLowerASCII(std::u16string_view str) {
+  return ToLowerASCIIImpl<std::u16string>(str);
 }
 
-std::string ToUpperASCII(StringPiece str) {
+std::string ToUpperASCII(std::string_view str) {
   return ToUpperASCIIImpl<std::string>(str);
 }
 
-string16 ToUpperASCII(StringPiece16 str) {
-  return ToUpperASCIIImpl<string16>(str);
+std::u16string ToUpperASCII(std::u16string_view str) {
+  return ToUpperASCIIImpl<std::u16string>(str);
 }
 
 template <class StringType>
@@ -153,24 +153,24 @@
   return 1;
 }
 
-int CompareCaseInsensitiveASCII(StringPiece a, StringPiece b) {
+int CompareCaseInsensitiveASCII(std::string_view a, std::string_view b) {
   return CompareCaseInsensitiveASCIIT<std::string>(a, b);
 }
 
-int CompareCaseInsensitiveASCII(StringPiece16 a, StringPiece16 b) {
-  return CompareCaseInsensitiveASCIIT<string16>(a, b);
+int CompareCaseInsensitiveASCII(std::u16string_view a, std::u16string_view b) {
+  return CompareCaseInsensitiveASCIIT<std::u16string>(a, b);
 }
 
-bool EqualsCaseInsensitiveASCII(StringPiece a, StringPiece b) {
+bool EqualsCaseInsensitiveASCII(std::string_view a, std::string_view b) {
   if (a.length() != b.length())
     return false;
   return CompareCaseInsensitiveASCIIT<std::string>(a, b) == 0;
 }
 
-bool EqualsCaseInsensitiveASCII(StringPiece16 a, StringPiece16 b) {
+bool EqualsCaseInsensitiveASCII(std::u16string_view a, std::u16string_view b) {
   if (a.length() != b.length())
     return false;
-  return CompareCaseInsensitiveASCIIT<string16>(a, b) == 0;
+  return CompareCaseInsensitiveASCIIT<std::u16string>(a, b) == 0;
 }
 
 template <class StringType>
@@ -180,31 +180,32 @@
     std::basic_string_view<typename StringType::value_type> replace_with,
     StringType* output);
 
-bool ReplaceChars(const string16& input,
-                  StringPiece16 replace_chars,
-                  const string16& replace_with,
-                  string16* output) {
-  return ReplaceCharsT(input, replace_chars, StringPiece16(replace_with),
+bool ReplaceChars(const std::u16string& input,
+                  std::u16string_view replace_chars,
+                  const std::u16string& replace_with,
+                  std::u16string* output) {
+  return ReplaceCharsT(input, replace_chars, std::u16string_view(replace_with),
                        output);
 }
 
 bool ReplaceChars(const std::string& input,
-                  StringPiece replace_chars,
+                  std::string_view replace_chars,
                   const std::string& replace_with,
                   std::string* output) {
-  return ReplaceCharsT(input, replace_chars, StringPiece(replace_with), output);
+  return ReplaceCharsT(input, replace_chars, std::string_view(replace_with),
+                       output);
 }
 
-bool RemoveChars(const string16& input,
-                 StringPiece16 remove_chars,
-                 string16* output) {
-  return ReplaceCharsT(input, remove_chars, StringPiece16(), output);
+bool RemoveChars(const std::u16string& input,
+                 std::u16string_view remove_chars,
+                 std::u16string* output) {
+  return ReplaceCharsT(input, remove_chars, std::u16string_view(), output);
 }
 
 bool RemoveChars(const std::string& input,
-                 StringPiece remove_chars,
+                 std::string_view remove_chars,
                  std::string* output) {
-  return ReplaceCharsT(input, remove_chars, StringPiece(), output);
+  return ReplaceCharsT(input, remove_chars, std::string_view(), output);
 }
 
 template <typename Str>
@@ -214,8 +215,8 @@
     TrimPositions positions,
     Str* output) {
   // Find the edges of leading/trailing whitespace as desired. Need to use
-  // a StringPiece version of input to be able to call find* on it with the
-  // StringPiece version of trim_chars (normally the trim_chars will be a
+  // a std::string_view version of input to be able to call find* on it with the
+  // std::string_view version of trim_chars (normally the trim_chars will be a
   // constant so avoid making a copy).
   std::basic_string_view<typename Str::value_type> input_piece(input);
   const size_t last_char = input.length() - 1;
@@ -245,14 +246,14 @@
       ((last_good_char == last_char) ? TRIM_NONE : TRIM_TRAILING));
 }
 
-bool TrimString(const string16& input,
-                StringPiece16 trim_chars,
-                string16* output) {
+bool TrimString(const std::u16string& input,
+                std::u16string_view trim_chars,
+                std::u16string* output) {
   return TrimStringT(input, trim_chars, TRIM_ALL, output) != TRIM_NONE;
 }
 
 bool TrimString(const std::string& input,
-                StringPiece trim_chars,
+                std::string_view trim_chars,
                 std::string* output) {
   return TrimStringT(input, trim_chars, TRIM_ALL, output) != TRIM_NONE;
 }
@@ -273,15 +274,15 @@
   return input.substr(begin, end - begin);
 }
 
-StringPiece16 TrimString(StringPiece16 input,
-                         StringPiece16 trim_chars,
-                         TrimPositions positions) {
+std::u16string_view TrimString(std::u16string_view input,
+                               std::u16string_view trim_chars,
+                               TrimPositions positions) {
   return TrimStringPieceT(input, trim_chars, positions);
 }
 
-StringPiece TrimString(StringPiece input,
-                       StringPiece trim_chars,
-                       TrimPositions positions) {
+std::string_view TrimString(std::string_view input,
+                            std::string_view trim_chars,
+                            TrimPositions positions) {
   return TrimStringPieceT(input, trim_chars, positions);
 }
 
@@ -321,24 +322,29 @@
     output->clear();
 }
 
-TrimPositions TrimWhitespace(const string16& input,
+TrimPositions TrimWhitespace(const std::u16string& input,
                              TrimPositions positions,
-                             string16* output) {
-  return TrimStringT(input, StringPiece16(kWhitespaceUTF16), positions, output);
+                             std::u16string* output) {
+  return TrimStringT(input, std::u16string_view(kWhitespaceUTF16), positions,
+                     output);
 }
 
-StringPiece16 TrimWhitespace(StringPiece16 input, TrimPositions positions) {
-  return TrimStringPieceT(input, StringPiece16(kWhitespaceUTF16), positions);
+std::u16string_view TrimWhitespace(std::u16string_view input,
+                                   TrimPositions positions) {
+  return TrimStringPieceT(input, std::u16string_view(kWhitespaceUTF16),
+                          positions);
 }
 
 TrimPositions TrimWhitespaceASCII(const std::string& input,
                                   TrimPositions positions,
                                   std::string* output) {
-  return TrimStringT(input, StringPiece(kWhitespaceASCII), positions, output);
+  return TrimStringT(input, std::string_view(kWhitespaceASCII), positions,
+                     output);
 }
 
-StringPiece TrimWhitespaceASCII(StringPiece input, TrimPositions positions) {
-  return TrimStringPieceT(input, StringPiece(kWhitespaceASCII), positions);
+std::string_view TrimWhitespaceASCII(std::string_view input,
+                                     TrimPositions positions) {
+  return TrimStringPieceT(input, std::string_view(kWhitespaceASCII), positions);
 }
 
 template <typename STR>
@@ -382,8 +388,8 @@
   return result;
 }
 
-string16 CollapseWhitespace(const string16& text,
-                            bool trim_sequences_with_line_breaks) {
+std::u16string CollapseWhitespace(const std::u16string& text,
+                                  bool trim_sequences_with_line_breaks) {
   return CollapseWhitespaceT(text, trim_sequences_with_line_breaks);
 }
 
@@ -392,12 +398,13 @@
   return CollapseWhitespaceT(text, trim_sequences_with_line_breaks);
 }
 
-bool ContainsOnlyChars(StringPiece input, StringPiece characters) {
-  return input.find_first_not_of(characters) == StringPiece::npos;
+bool ContainsOnlyChars(std::string_view input, std::string_view characters) {
+  return input.find_first_not_of(characters) == std::string_view::npos;
 }
 
-bool ContainsOnlyChars(StringPiece16 input, StringPiece16 characters) {
-  return input.find_first_not_of(characters) == StringPiece16::npos;
+bool ContainsOnlyChars(std::u16string_view input,
+                       std::u16string_view characters) {
+  return input.find_first_not_of(characters) == std::u16string_view::npos;
 }
 
 template <class Char>
@@ -430,15 +437,15 @@
   return !(all_char_bits & non_ascii_bit_mask);
 }
 
-bool IsStringASCII(StringPiece str) {
+bool IsStringASCII(std::string_view str) {
   return DoIsStringASCII(str.data(), str.length());
 }
 
-bool IsStringASCII(StringPiece16 str) {
+bool IsStringASCII(std::u16string_view str) {
   return DoIsStringASCII(str.data(), str.length());
 }
 
-bool IsStringUTF8(StringPiece str) {
+bool IsStringUTF8(std::string_view str) {
   const char* src = str.data();
   int32_t src_len = static_cast<int32_t>(str.length());
   int32_t char_index = 0;
@@ -453,8 +460,8 @@
 }
 
 // Implementation note: Normally this function will be called with a hardcoded
-// constant for the lowercase_ascii parameter. Constructing a StringPiece from
-// a C constant requires running strlen, so the result will be two passes
+// constant for the lowercase_ascii parameter. Constructing a std::string_view
+// from a C constant requires running strlen, so the result will be two passes
 // through the buffers, one to file the length of lowercase_ascii, and one to
 // compare each letter.
 //
@@ -466,11 +473,11 @@
 //
 // The hardcoded strings are typically very short so it doesn't matter, and the
 // string piece gives additional flexibility for the caller (doesn't have to be
-// null terminated) so we choose the StringPiece route.
+// null terminated) so we choose the std::string_view route.
 template <typename Str>
 static inline bool DoLowerCaseEqualsASCII(
     std::basic_string_view<typename Str::value_type> str,
-    StringPiece lowercase_ascii) {
+    std::string_view lowercase_ascii) {
   if (str.size() != lowercase_ascii.size())
     return false;
   for (size_t i = 0; i < str.size(); i++) {
@@ -480,15 +487,17 @@
   return true;
 }
 
-bool LowerCaseEqualsASCII(StringPiece str, StringPiece lowercase_ascii) {
+bool LowerCaseEqualsASCII(std::string_view str,
+                          std::string_view lowercase_ascii) {
   return DoLowerCaseEqualsASCII<std::string>(str, lowercase_ascii);
 }
 
-bool LowerCaseEqualsASCII(StringPiece16 str, StringPiece lowercase_ascii) {
-  return DoLowerCaseEqualsASCII<string16>(str, lowercase_ascii);
+bool LowerCaseEqualsASCII(std::u16string_view str,
+                          std::string_view lowercase_ascii) {
+  return DoLowerCaseEqualsASCII<std::u16string>(str, lowercase_ascii);
 }
 
-bool EqualsASCII(StringPiece16 str, StringPiece ascii) {
+bool EqualsASCII(std::u16string_view str, std::string_view ascii) {
   if (str.length() != ascii.length())
     return false;
   return std::equal(ascii.begin(), ascii.end(), str.begin());
@@ -517,14 +526,14 @@
   }
 }
 
-bool StartsWith(StringPiece str,
-                StringPiece search_for,
+bool StartsWith(std::string_view str,
+                std::string_view search_for,
                 CompareCase case_sensitivity) {
   return StartsWithT(str, search_for, case_sensitivity);
 }
 
-bool StartsWith(StringPiece16 str,
-                StringPiece16 search_for,
+bool StartsWith(std::u16string_view str,
+                std::u16string_view search_for,
                 CompareCase case_sensitivity) {
   return StartsWithT(str, search_for, case_sensitivity);
 }
@@ -554,16 +563,16 @@
   }
 }
 
-bool EndsWith(StringPiece str,
-              StringPiece search_for,
+bool EndsWith(std::string_view str,
+              std::string_view search_for,
               CompareCase case_sensitivity) {
   return EndsWithT<std::string>(str, search_for, case_sensitivity);
 }
 
-bool EndsWith(StringPiece16 str,
-              StringPiece16 search_for,
+bool EndsWith(std::u16string_view str,
+              std::u16string_view search_for,
               CompareCase case_sensitivity) {
-  return EndsWithT<string16>(str, search_for, case_sensitivity);
+  return EndsWithT<std::u16string>(str, search_for, case_sensitivity);
 }
 
 char HexDigitToInt(char16_t c) {
@@ -589,7 +598,7 @@
 static const char* const kByteStringsUnlocalized[] = {" B",  " kB", " MB",
                                                       " GB", " TB", " PB"};
 
-string16 FormatBytesUnlocalized(int64_t bytes) {
+std::u16string FormatBytesUnlocalized(int64_t bytes) {
   double unit_amount = static_cast<double>(bytes);
   size_t dimension = 0;
   const int kKilo = 1024;
@@ -800,37 +809,37 @@
       ReplaceType::REPLACE_ALL);
 }
 
-void ReplaceFirstSubstringAfterOffset(string16* str,
+void ReplaceFirstSubstringAfterOffset(std::u16string* str,
                                       size_t start_offset,
-                                      StringPiece16 find_this,
-                                      StringPiece16 replace_with) {
+                                      std::u16string_view find_this,
+                                      std::u16string_view replace_with) {
   DoReplaceMatchesAfterOffset(str, start_offset,
-                              SubstringMatcher<string16>{find_this},
+                              SubstringMatcher<std::u16string>{find_this},
                               replace_with, ReplaceType::REPLACE_FIRST);
 }
 
 void ReplaceFirstSubstringAfterOffset(std::string* str,
                                       size_t start_offset,
-                                      StringPiece find_this,
-                                      StringPiece replace_with) {
+                                      std::string_view find_this,
+                                      std::string_view replace_with) {
   DoReplaceMatchesAfterOffset(str, start_offset,
                               SubstringMatcher<std::string>{find_this},
                               replace_with, ReplaceType::REPLACE_FIRST);
 }
 
-void ReplaceSubstringsAfterOffset(string16* str,
+void ReplaceSubstringsAfterOffset(std::u16string* str,
                                   size_t start_offset,
-                                  StringPiece16 find_this,
-                                  StringPiece16 replace_with) {
+                                  std::u16string_view find_this,
+                                  std::u16string_view replace_with) {
   DoReplaceMatchesAfterOffset(str, start_offset,
-                              SubstringMatcher<string16>{find_this},
+                              SubstringMatcher<std::u16string>{find_this},
                               replace_with, ReplaceType::REPLACE_ALL);
 }
 
 void ReplaceSubstringsAfterOffset(std::string* str,
                                   size_t start_offset,
-                                  StringPiece find_this,
-                                  StringPiece replace_with) {
+                                  std::string_view find_this,
+                                  std::string_view replace_with) {
   DoReplaceMatchesAfterOffset(str, start_offset,
                               SubstringMatcher<std::string>{find_this},
                               replace_with, ReplaceType::REPLACE_ALL);
@@ -849,7 +858,7 @@
   return WriteIntoT(str, length_with_null);
 }
 
-char16* WriteInto(string16* str, size_t length_with_null) {
+char16_t* WriteInto(std::u16string* str, size_t length_with_null) {
   return WriteIntoT(str, length_with_null);
 }
 
@@ -892,12 +901,12 @@
 }
 
 std::string JoinString(const std::vector<std::string>& parts,
-                       StringPiece separator) {
+                       std::string_view separator) {
   return JoinStringT(parts, separator);
 }
 
-string16 JoinString(const std::vector<string16>& parts,
-                    StringPiece16 separator) {
+std::u16string JoinString(const std::vector<std::u16string>& parts,
+                          std::u16string_view separator) {
   return JoinStringT(parts, separator);
 }
 
@@ -906,23 +915,23 @@
 #pragma optimize("", on)
 #endif
 
-std::string JoinString(const std::vector<StringPiece>& parts,
-                       StringPiece separator) {
+std::string JoinString(const std::vector<std::string_view>& parts,
+                       std::string_view separator) {
   return JoinStringT(parts, separator);
 }
 
-string16 JoinString(const std::vector<StringPiece16>& parts,
-                    StringPiece16 separator) {
+std::u16string JoinString(const std::vector<std::u16string_view>& parts,
+                          std::u16string_view separator) {
   return JoinStringT(parts, separator);
 }
 
-std::string JoinString(std::initializer_list<StringPiece> parts,
-                       StringPiece separator) {
+std::string JoinString(std::initializer_list<std::string_view> parts,
+                       std::string_view separator) {
   return JoinStringT(parts, separator);
 }
 
-string16 JoinString(std::initializer_list<StringPiece16> parts,
-                    StringPiece16 separator) {
+std::u16string JoinString(std::initializer_list<std::u16string_view> parts,
+                          std::u16string_view separator) {
   return JoinStringT(parts, separator);
 }
 
@@ -981,25 +990,27 @@
   return formatted;
 }
 
-string16 ReplaceStringPlaceholders(const string16& format_string,
-                                   const std::vector<string16>& subst,
-                                   std::vector<size_t>* offsets) {
+std::u16string ReplaceStringPlaceholders(
+    const std::u16string& format_string,
+    const std::vector<std::u16string>& subst,
+    std::vector<size_t>* offsets) {
   return DoReplaceStringPlaceholders(format_string, subst, offsets);
 }
 
-std::string ReplaceStringPlaceholders(StringPiece format_string,
+std::string ReplaceStringPlaceholders(std::string_view format_string,
                                       const std::vector<std::string>& subst,
                                       std::vector<size_t>* offsets) {
   return DoReplaceStringPlaceholders(format_string, subst, offsets);
 }
 
-string16 ReplaceStringPlaceholders(const string16& format_string,
-                                   const string16& a,
-                                   size_t* offset) {
+std::u16string ReplaceStringPlaceholders(const std::u16string& format_string,
+                                         const std::u16string& a,
+                                         size_t* offset) {
   std::vector<size_t> offsets;
-  std::vector<string16> subst;
+  std::vector<std::u16string> subst;
   subst.push_back(a);
-  string16 result = ReplaceStringPlaceholders(format_string, subst, &offsets);
+  std::u16string result =
+      ReplaceStringPlaceholders(format_string, subst, &offsets);
 
   DCHECK_EQ(1U, offsets.size());
   if (offset)
diff --git a/base/strings/string_util.h b/base/strings/string_util.h
index 9b3c608..9ed66b2 100644
--- a/base/strings/string_util.h
+++ b/base/strings/string_util.h
@@ -14,11 +14,10 @@
 
 #include <initializer_list>
 #include <string>
+#include <string_view>
 #include <vector>
 
 #include "base/compiler_specific.h"
-#include "base/strings/string16.h"
-#include "base/strings/string_piece.h"  // For implicit conversions.
 #include "util/build_config.h"
 
 namespace base {
@@ -58,7 +57,7 @@
 inline char ToLowerASCII(char c) {
   return (c >= 'A' && c <= 'Z') ? (c + ('a' - 'A')) : c;
 }
-inline char16 ToLowerASCII(char16 c) {
+inline char16_t ToLowerASCII(char16_t c) {
   return (c >= 'A' && c <= 'Z') ? (c + ('a' - 'A')) : c;
 }
 
@@ -67,17 +66,17 @@
 inline char ToUpperASCII(char c) {
   return (c >= 'a' && c <= 'z') ? (c + ('A' - 'a')) : c;
 }
-inline char16 ToUpperASCII(char16 c) {
+inline char16_t ToUpperASCII(char16_t c) {
   return (c >= 'a' && c <= 'z') ? (c + ('A' - 'a')) : c;
 }
 
 // Converts the given string to it's ASCII-lowercase equivalent.
-std::string ToLowerASCII(StringPiece str);
-string16 ToLowerASCII(StringPiece16 str);
+std::string ToLowerASCII(std::string_view str);
+std::u16string ToLowerASCII(std::u16string_view str);
 
 // Converts the given string to it's ASCII-uppercase equivalent.
-std::string ToUpperASCII(StringPiece str);
-string16 ToUpperASCII(StringPiece16 str);
+std::string ToUpperASCII(std::string_view str);
+std::u16string ToUpperASCII(std::u16string_view str);
 
 // Functor for case-insensitive ASCII comparisons for STL algorithms like
 // std::search.
@@ -102,21 +101,21 @@
 // (unlike strcasecmp which can return values greater or less than 1/-1). For
 // full Unicode support, use base::i18n::ToLower or base::i18h::FoldCase
 // and then just call the normal string operators on the result.
-int CompareCaseInsensitiveASCII(StringPiece a, StringPiece b);
-int CompareCaseInsensitiveASCII(StringPiece16 a, StringPiece16 b);
+int CompareCaseInsensitiveASCII(std::string_view a, std::string_view b);
+int CompareCaseInsensitiveASCII(std::u16string_view a, std::u16string_view b);
 
 // Equality for ASCII case-insensitive comparisons. For full Unicode support,
 // use base::i18n::ToLower or base::i18h::FoldCase and then compare with either
 // == or !=.
-bool EqualsCaseInsensitiveASCII(StringPiece a, StringPiece b);
-bool EqualsCaseInsensitiveASCII(StringPiece16 a, StringPiece16 b);
+bool EqualsCaseInsensitiveASCII(std::string_view a, std::string_view b);
+bool EqualsCaseInsensitiveASCII(std::u16string_view a, std::u16string_view b);
 
 // Contains the set of characters representing whitespace in the corresponding
 // encoding. Null-terminated. The ASCII versions are the whitespaces as defined
 // by HTML5, and don't include control characters.
-extern const char16 kWhitespaceUTF16[];  // Includes Unicode.
+extern const char16_t kWhitespaceUTF16[];  // Includes Unicode.
 extern const char kWhitespaceASCII[];
-extern const char16 kWhitespaceASCIIAs16[];  // No unicode.
+extern const char16_t kWhitespaceASCIIAs16[];  // No unicode.
 
 // Null-terminated string representing the UTF-8 byte order mark.
 extern const char kUtf8ByteOrderMark[];
@@ -124,11 +123,11 @@
 // Removes characters in |remove_chars| from anywhere in |input|.  Returns true
 // if any characters were removed.  |remove_chars| must be null-terminated.
 // NOTE: Safe to use the same variable for both |input| and |output|.
-bool RemoveChars(const string16& input,
-                 StringPiece16 remove_chars,
-                 string16* output);
+bool RemoveChars(const std::u16string& input,
+                 std::u16string_view remove_chars,
+                 std::u16string* output);
 bool RemoveChars(const std::string& input,
-                 StringPiece remove_chars,
+                 std::string_view remove_chars,
                  std::string* output);
 
 // Replaces characters in |replace_chars| from anywhere in |input| with
@@ -136,12 +135,12 @@
 // the |replace_with| string.  Returns true if any characters were replaced.
 // |replace_chars| must be null-terminated.
 // NOTE: Safe to use the same variable for both |input| and |output|.
-bool ReplaceChars(const string16& input,
-                  StringPiece16 replace_chars,
-                  const string16& replace_with,
-                  string16* output);
+bool ReplaceChars(const std::u16string& input,
+                  std::u16string_view replace_chars,
+                  const std::u16string& replace_with,
+                  std::u16string* output);
 bool ReplaceChars(const std::string& input,
-                  StringPiece replace_chars,
+                  std::string_view replace_chars,
                   const std::string& replace_with,
                   std::string* output);
 
@@ -158,21 +157,21 @@
 //
 // It is safe to use the same variable for both |input| and |output| (this is
 // the normal usage to trim in-place).
-bool TrimString(const string16& input,
-                StringPiece16 trim_chars,
-                string16* output);
+bool TrimString(const std::u16string& input,
+                std::u16string_view trim_chars,
+                std::u16string* output);
 bool TrimString(const std::string& input,
-                StringPiece trim_chars,
+                std::string_view trim_chars,
                 std::string* output);
 
-// StringPiece versions of the above. The returned pieces refer to the original
-// buffer.
-StringPiece16 TrimString(StringPiece16 input,
-                         StringPiece16 trim_chars,
-                         TrimPositions positions);
-StringPiece TrimString(StringPiece input,
-                       StringPiece trim_chars,
-                       TrimPositions positions);
+// std::string_view versions of the above. The returned pieces refer to the
+// original buffer.
+std::u16string_view TrimString(std::u16string_view input,
+                               std::u16string_view trim_chars,
+                               TrimPositions positions);
+std::string_view TrimString(std::string_view input,
+                            std::string_view trim_chars,
+                            TrimPositions positions);
 
 // Truncates a string to the nearest UTF-8 character that will leave
 // the string less than or equal to the specified byte size.
@@ -182,19 +181,21 @@
 
 // Trims any whitespace from either end of the input string.
 //
-// The StringPiece versions return a substring referencing the input buffer.
-// The ASCII versions look only for ASCII whitespace.
+// The std::string_view versions return a substring referencing the input
+// buffer. The ASCII versions look only for ASCII whitespace.
 //
 // The std::string versions return where whitespace was found.
 // NOTE: Safe to use the same variable for both input and output.
-TrimPositions TrimWhitespace(const string16& input,
+TrimPositions TrimWhitespace(const std::u16string& input,
                              TrimPositions positions,
-                             string16* output);
-StringPiece16 TrimWhitespace(StringPiece16 input, TrimPositions positions);
+                             std::u16string* output);
+std::u16string_view TrimWhitespace(std::u16string_view input,
+                                   TrimPositions positions);
 TrimPositions TrimWhitespaceASCII(const std::string& input,
                                   TrimPositions positions,
                                   std::string* output);
-StringPiece TrimWhitespaceASCII(StringPiece input, TrimPositions positions);
+std::string_view TrimWhitespaceASCII(std::string_view input,
+                                     TrimPositions positions);
 
 // Searches for CR or LF characters.  Removes all contiguous whitespace
 // strings that contain them.  This is useful when trying to deal with text
@@ -204,15 +205,16 @@
 // (2) If |trim_sequences_with_line_breaks| is true, any other whitespace
 //     sequences containing a CR or LF are trimmed.
 // (3) All other whitespace sequences are converted to single spaces.
-string16 CollapseWhitespace(const string16& text,
-                            bool trim_sequences_with_line_breaks);
+std::u16string CollapseWhitespace(const std::u16string& text,
+                                  bool trim_sequences_with_line_breaks);
 std::string CollapseWhitespaceASCII(const std::string& text,
                                     bool trim_sequences_with_line_breaks);
 
 // Returns true if |input| is empty or contains only characters found in
 // |characters|.
-bool ContainsOnlyChars(StringPiece input, StringPiece characters);
-bool ContainsOnlyChars(StringPiece16 input, StringPiece16 characters);
+bool ContainsOnlyChars(std::string_view input, std::string_view characters);
+bool ContainsOnlyChars(std::u16string_view input,
+                       std::u16string_view characters);
 
 // Returns true if the specified string matches the criteria. How can a wide
 // string be 8-bit or UTF8? It contains only characters that are < 256 (in the
@@ -228,19 +230,21 @@
 //
 // IsStringASCII assumes the input is likely all ASCII, and does not leave early
 // if it is not the case.
-bool IsStringUTF8(StringPiece str);
-bool IsStringASCII(StringPiece str);
-bool IsStringASCII(StringPiece16 str);
+bool IsStringUTF8(std::string_view str);
+bool IsStringASCII(std::string_view str);
+bool IsStringASCII(std::u16string_view str);
 
 // Compare the lower-case form of the given string against the given
 // previously-lower-cased ASCII string (typically a constant).
-bool LowerCaseEqualsASCII(StringPiece str, StringPiece lowecase_ascii);
-bool LowerCaseEqualsASCII(StringPiece16 str, StringPiece lowecase_ascii);
+bool LowerCaseEqualsASCII(std::string_view str,
+                          std::string_view lowecase_ascii);
+bool LowerCaseEqualsASCII(std::u16string_view str,
+                          std::string_view lowecase_ascii);
 
 // Performs a case-sensitive string compare of the given 16-bit string against
 // the given 8-bit ASCII string (typically a constant). The behavior is
 // undefined if the |ascii| string is not ASCII.
-bool EqualsASCII(StringPiece16 str, StringPiece ascii);
+bool EqualsASCII(std::u16string_view str, std::string_view ascii);
 
 // Indicates case sensitivity of comparisons. Only ASCII case insensitivity
 // is supported. Full Unicode case-insensitive conversions would need to go in
@@ -255,17 +259,17 @@
   INSENSITIVE_ASCII,
 };
 
-bool StartsWith(StringPiece str,
-                StringPiece search_for,
+bool StartsWith(std::string_view str,
+                std::string_view search_for,
                 CompareCase case_sensitivity);
-bool StartsWith(StringPiece16 str,
-                StringPiece16 search_for,
+bool StartsWith(std::u16string_view str,
+                std::u16string_view search_for,
                 CompareCase case_sensitivity);
-bool EndsWith(StringPiece str,
-              StringPiece search_for,
+bool EndsWith(std::string_view str,
+              std::string_view search_for,
               CompareCase case_sensitivity);
-bool EndsWith(StringPiece16 str,
-              StringPiece16 search_for,
+bool EndsWith(std::u16string_view str,
+              std::u16string_view search_for,
               CompareCase case_sensitivity);
 
 // Determines the type of ASCII character, independent of locale (the C
@@ -311,18 +315,18 @@
 // appropriate for use in any UI; use of FormatBytes and friends in ui/base is
 // highly recommended instead. TODO(avi): Figure out how to get callers to use
 // FormatBytes instead; remove this.
-string16 FormatBytesUnlocalized(int64_t bytes);
+std::u16string FormatBytesUnlocalized(int64_t bytes);
 
 // Starting at |start_offset| (usually 0), replace the first instance of
 // |find_this| with |replace_with|.
-void ReplaceFirstSubstringAfterOffset(base::string16* str,
+void ReplaceFirstSubstringAfterOffset(std::u16string* str,
                                       size_t start_offset,
-                                      StringPiece16 find_this,
-                                      StringPiece16 replace_with);
+                                      std::u16string_view find_this,
+                                      std::u16string_view replace_with);
 void ReplaceFirstSubstringAfterOffset(std::string* str,
                                       size_t start_offset,
-                                      StringPiece find_this,
-                                      StringPiece replace_with);
+                                      std::string_view find_this,
+                                      std::string_view replace_with);
 
 // Starting at |start_offset| (usually 0), look through |str| and replace all
 // instances of |find_this| with |replace_with|.
@@ -330,14 +334,14 @@
 // This does entire substrings; use std::replace in <algorithm> for single
 // characters, for example:
 //   std::replace(str.begin(), str.end(), 'a', 'b');
-void ReplaceSubstringsAfterOffset(string16* str,
+void ReplaceSubstringsAfterOffset(std::u16string* str,
                                   size_t start_offset,
-                                  StringPiece16 find_this,
-                                  StringPiece16 replace_with);
+                                  std::u16string_view find_this,
+                                  std::u16string_view replace_with);
 void ReplaceSubstringsAfterOffset(std::string* str,
                                   size_t start_offset,
-                                  StringPiece find_this,
-                                  StringPiece replace_with);
+                                  std::string_view find_this,
+                                  std::string_view replace_with);
 
 // Reserves enough memory in |str| to accommodate |length_with_null| characters,
 // sets the size of |str| to |length_with_null - 1| characters, and returns a
@@ -360,51 +364,52 @@
 // than str.c_str() will get back a string of whatever size |str| had on entry
 // to this function (probably 0).
 char* WriteInto(std::string* str, size_t length_with_null);
-char16* WriteInto(string16* str, size_t length_with_null);
+char16_t* WriteInto(std::u16string* str, size_t length_with_null);
 
 // Does the opposite of SplitString()/SplitStringPiece(). Joins a vector or list
 // of strings into a single string, inserting |separator| (which may be empty)
 // in between all elements.
 //
-// If possible, callers should build a vector of StringPieces and use the
-// StringPiece variant, so that they do not create unnecessary copies of
+// If possible, callers should build a vector of std::string_views and use the
+// std::string_view variant, so that they do not create unnecessary copies of
 // strings. For example, instead of using SplitString, modifying the vector,
 // then using JoinString, use SplitStringPiece followed by JoinString so that no
 // copies of those strings are created until the final join operation.
 //
 // Use StrCat (in base/strings/strcat.h) if you don't need a separator.
 std::string JoinString(const std::vector<std::string>& parts,
-                       StringPiece separator);
-string16 JoinString(const std::vector<string16>& parts,
-                    StringPiece16 separator);
-std::string JoinString(const std::vector<StringPiece>& parts,
-                       StringPiece separator);
-string16 JoinString(const std::vector<StringPiece16>& parts,
-                    StringPiece16 separator);
+                       std::string_view separator);
+std::u16string JoinString(const std::vector<std::u16string>& parts,
+                          std::u16string_view separator);
+std::string JoinString(const std::vector<std::string_view>& parts,
+                       std::string_view separator);
+std::u16string JoinString(const std::vector<std::u16string_view>& parts,
+                          std::u16string_view separator);
 // Explicit initializer_list overloads are required to break ambiguity when used
 // with a literal initializer list (otherwise the compiler would not be able to
-// decide between the string and StringPiece overloads).
-std::string JoinString(std::initializer_list<StringPiece> parts,
-                       StringPiece separator);
-string16 JoinString(std::initializer_list<StringPiece16> parts,
-                    StringPiece16 separator);
+// decide between the string and std::string_view overloads).
+std::string JoinString(std::initializer_list<std::string_view> parts,
+                       std::string_view separator);
+std::u16string JoinString(std::initializer_list<std::u16string_view> parts,
+                          std::u16string_view separator);
 
 // Replace $1-$2-$3..$9 in the format string with values from |subst|.
 // Additionally, any number of consecutive '$' characters is replaced by that
 // number less one. Eg $$->$, $$$->$$, etc. The offsets parameter here can be
 // NULL. This only allows you to use up to nine replacements.
-string16 ReplaceStringPlaceholders(const string16& format_string,
-                                   const std::vector<string16>& subst,
-                                   std::vector<size_t>* offsets);
+std::u16string ReplaceStringPlaceholders(
+    const std::u16string& format_string,
+    const std::vector<std::u16string>& subst,
+    std::vector<size_t>* offsets);
 
-std::string ReplaceStringPlaceholders(StringPiece format_string,
+std::string ReplaceStringPlaceholders(std::string_view format_string,
                                       const std::vector<std::string>& subst,
                                       std::vector<size_t>* offsets);
 
 // Single-string shortcut for ReplaceStringHolders. |offset| may be NULL.
-string16 ReplaceStringPlaceholders(const string16& format_string,
-                                   const string16& a,
-                                   size_t* offset);
+std::u16string ReplaceStringPlaceholders(const std::u16string& format_string,
+                                         const std::u16string& a,
+                                         size_t* offset);
 
 }  // namespace base
 
diff --git a/base/strings/string_util_constants.cc b/base/strings/string_util_constants.cc
index ed17fcd..de88454 100644
--- a/base/strings/string_util_constants.cc
+++ b/base/strings/string_util_constants.cc
@@ -34,7 +34,7 @@
       0x3000, /* IDEOGRAPHIC SPACE */         \
       0
 
-const char16 kWhitespaceUTF16[] = {WHITESPACE_UNICODE};
+const char16_t kWhitespaceUTF16[] = {WHITESPACE_UNICODE};
 
 const char kWhitespaceASCII[] = {0x09,  // CHARACTER TABULATION
                                  0x0A,  // LINE FEED (LF)
@@ -44,13 +44,13 @@
                                  0x20,  // SPACE
                                  0};
 
-const char16 kWhitespaceASCIIAs16[] = {0x09,  // CHARACTER TABULATION
-                                       0x0A,  // LINE FEED (LF)
-                                       0x0B,  // LINE TABULATION
-                                       0x0C,  // FORM FEED (FF)
-                                       0x0D,  // CARRIAGE RETURN (CR)
-                                       0x20,  // SPACE
-                                       0};
+const char16_t kWhitespaceASCIIAs16[] = {0x09,  // CHARACTER TABULATION
+                                         0x0A,  // LINE FEED (LF)
+                                         0x0B,  // LINE TABULATION
+                                         0x0C,  // FORM FEED (FF)
+                                         0x0D,  // CARRIAGE RETURN (CR)
+                                         0x20,  // SPACE
+                                         0};
 
 const char kUtf8ByteOrderMark[] = "\xEF\xBB\xBF";
 
diff --git a/base/strings/utf_offset_string_conversions.cc b/base/strings/utf_offset_string_conversions.cc
index 177839a..ee55a24 100644
--- a/base/strings/utf_offset_string_conversions.cc
+++ b/base/strings/utf_offset_string_conversions.cc
@@ -8,9 +8,9 @@
 
 #include <algorithm>
 #include <memory>
+#include <string_view>
 
 #include "base/logging.h"
-#include "base/strings/string_piece.h"
 #include "base/strings/utf_string_conversion_utils.h"
 
 namespace base {
@@ -37,7 +37,7 @@
                                   size_t* offset,
                                   size_t limit) {
   DCHECK(offset);
-  if (*offset == string16::npos)
+  if (*offset == std::u16string::npos)
     return;
   int adjustment = 0;
   for (Adjustments::const_iterator i = adjustments.begin();
@@ -45,7 +45,7 @@
     if (*offset <= i->original_offset)
       break;
     if (*offset < (i->original_offset + i->original_length)) {
-      *offset = string16::npos;
+      *offset = std::u16string::npos;
       return;
     }
     adjustment += static_cast<int>(i->original_length - i->output_length);
@@ -53,7 +53,7 @@
   *offset -= adjustment;
 
   if (*offset > limit)
-    *offset = string16::npos;
+    *offset = std::u16string::npos;
 }
 
 // static
@@ -70,7 +70,7 @@
 // static
 void OffsetAdjuster::UnadjustOffset(const Adjustments& adjustments,
                                     size_t* offset) {
-  if (*offset == string16::npos)
+  if (*offset == std::u16string::npos)
     return;
   int adjustment = 0;
   for (Adjustments::const_iterator i = adjustments.begin();
@@ -79,7 +79,7 @@
       break;
     adjustment += static_cast<int>(i->original_length - i->output_length);
     if ((*offset + adjustment) < (i->original_offset + i->original_length)) {
-      *offset = string16::npos;
+      *offset = std::u16string::npos;
       return;
     }
   }
@@ -221,39 +221,39 @@
 bool UTF8ToUTF16WithAdjustments(
     const char* src,
     size_t src_len,
-    string16* output,
+    std::u16string* output,
     base::OffsetAdjuster::Adjustments* adjustments) {
   PrepareForUTF16Or32Output(src, src_len, output);
   return ConvertUnicode(src, src_len, output, adjustments);
 }
 
-string16 UTF8ToUTF16WithAdjustments(
-    const base::StringPiece& utf8,
+std::u16string UTF8ToUTF16WithAdjustments(
+    const std::string_view& utf8,
     base::OffsetAdjuster::Adjustments* adjustments) {
-  string16 result;
+  std::u16string result;
   UTF8ToUTF16WithAdjustments(utf8.data(), utf8.length(), &result, adjustments);
   return result;
 }
 
-string16 UTF8ToUTF16AndAdjustOffsets(
-    const base::StringPiece& utf8,
+std::u16string UTF8ToUTF16AndAdjustOffsets(
+    const std::string_view& utf8,
     std::vector<size_t>* offsets_for_adjustment) {
   for (size_t& offset : *offsets_for_adjustment) {
     if (offset > utf8.length())
-      offset = string16::npos;
+      offset = std::u16string::npos;
   }
   OffsetAdjuster::Adjustments adjustments;
-  string16 result = UTF8ToUTF16WithAdjustments(utf8, &adjustments);
+  std::u16string result = UTF8ToUTF16WithAdjustments(utf8, &adjustments);
   OffsetAdjuster::AdjustOffsets(adjustments, offsets_for_adjustment);
   return result;
 }
 
 std::string UTF16ToUTF8AndAdjustOffsets(
-    const base::StringPiece16& utf16,
+    const std::u16string_view& utf16,
     std::vector<size_t>* offsets_for_adjustment) {
   for (size_t& offset : *offsets_for_adjustment) {
     if (offset > utf16.length())
-      offset = string16::npos;
+      offset = std::u16string::npos;
   }
   std::string result;
   PrepareForUTF8Output(utf16.data(), utf16.length(), &result);
diff --git a/base/strings/utf_offset_string_conversions.h b/base/strings/utf_offset_string_conversions.h
index b7c4a1b..8d6c5e8 100644
--- a/base/strings/utf_offset_string_conversions.h
+++ b/base/strings/utf_offset_string_conversions.h
@@ -8,11 +8,9 @@
 #include <stddef.h>
 
 #include <string>
+#include <string_view>
 #include <vector>
 
-#include "base/strings/string16.h"
-#include "base/strings/string_piece.h"
-
 namespace base {
 
 // A helper class and associated data structures to adjust offsets into a
@@ -34,7 +32,7 @@
 
   // Adjusts all offsets in |offsets_for_adjustment| to reflect the adjustments
   // recorded in |adjustments|.  Adjusted offsets greater than |limit| will be
-  // set to string16::npos.
+  // set to std::u16string::npos.
   //
   // Offsets represents insertion/selection points between characters: if |src|
   // is "abcd", then 0 is before 'a', 2 is between 'b' and 'c', and 4 is at the
@@ -42,23 +40,24 @@
   // exit, each offset will have been modified to point at the same logical
   // position in the output string.  If an offset cannot be successfully
   // adjusted (e.g., because it points into the middle of a multibyte sequence),
-  // it will be set to string16::npos.
+  // it will be set to std::u16string::npos.
   static void AdjustOffsets(const Adjustments& adjustments,
                             std::vector<size_t>* offsets_for_adjustment,
-                            size_t limit = string16::npos);
+                            size_t limit = std::u16string::npos);
 
   // Adjusts the single |offset| to reflect the adjustments recorded in
   // |adjustments|.
   static void AdjustOffset(const Adjustments& adjustments,
                            size_t* offset,
-                           size_t limit = string16::npos);
+                           size_t limit = std::u16string::npos);
 
   // Adjusts all offsets in |offsets_for_unadjustment| to reflect the reverse
   // of the adjustments recorded in |adjustments|.  In other words, the offsets
   // provided represent offsets into an adjusted string and the caller wants
   // to know the offsets they correspond to in the original string.  If an
   // offset cannot be successfully unadjusted (e.g., because it points into
-  // the middle of a multibyte sequence), it will be set to string16::npos.
+  // the middle of a multibyte sequence), it will be set to
+  // std::u16string::npos.
   static void UnadjustOffsets(const Adjustments& adjustments,
                               std::vector<size_t>* offsets_for_unadjustment);
 
@@ -91,19 +90,20 @@
 // It may be NULL.
 bool UTF8ToUTF16WithAdjustments(const char* src,
                                 size_t src_len,
-                                string16* output,
+                                std::u16string* output,
                                 base::OffsetAdjuster::Adjustments* adjustments);
-string16 UTF8ToUTF16WithAdjustments(
-    const base::StringPiece& utf8,
+std::u16string UTF8ToUTF16WithAdjustments(
+    const std::string_view& utf8,
     base::OffsetAdjuster::Adjustments* adjustments);
 // As above, but instead internally examines the adjustments and applies them
 // to |offsets_for_adjustment|.  Input offsets greater than the length of the
-// input string will be set to string16::npos.  See comments by AdjustOffsets().
-string16 UTF8ToUTF16AndAdjustOffsets(
-    const base::StringPiece& utf8,
+// input string will be set to std::u16string::npos.  See comments by
+// AdjustOffsets().
+std::u16string UTF8ToUTF16AndAdjustOffsets(
+    const std::string_view& utf8,
     std::vector<size_t>* offsets_for_adjustment);
 std::string UTF16ToUTF8AndAdjustOffsets(
-    const base::StringPiece16& utf16,
+    const std::u16string_view& utf16,
     std::vector<size_t>* offsets_for_adjustment);
 
 }  // namespace base
diff --git a/base/strings/utf_string_conversion_utils.cc b/base/strings/utf_string_conversion_utils.cc
index 838471c..32aa3e3 100644
--- a/base/strings/utf_string_conversion_utils.cc
+++ b/base/strings/utf_string_conversion_utils.cc
@@ -75,10 +75,10 @@
   return char_offset - original_char_offset;
 }
 
-size_t WriteUnicodeCharacter(uint32_t code_point, string16* output) {
+size_t WriteUnicodeCharacter(uint32_t code_point, std::u16string* output) {
   if (CBU16_LENGTH(code_point) == 1) {
     // Thie code point is in the Basic Multilingual Plane (BMP).
-    output->push_back(static_cast<char16>(code_point));
+    output->push_back(static_cast<char16_t>(code_point));
     return 1;
   }
   // Non-BMP characters use a double-character encoding.
@@ -127,6 +127,6 @@
 }
 
 // Instantiate versions we know callers will need.
-template void PrepareForUTF16Or32Output(const char*, size_t, string16*);
+template void PrepareForUTF16Or32Output(const char*, size_t, std::u16string*);
 
 }  // namespace base
diff --git a/base/strings/utf_string_conversion_utils.h b/base/strings/utf_string_conversion_utils.h
index 3f14808..e24a7db 100644
--- a/base/strings/utf_string_conversion_utils.h
+++ b/base/strings/utf_string_conversion_utils.h
@@ -11,7 +11,7 @@
 #include <stddef.h>
 #include <stdint.h>
 
-#include "base/strings/string16.h"
+#include <string>
 
 namespace base {
 
@@ -60,7 +60,7 @@
 
 // Appends the given code point as a UTF-16 character to the given 16-bit
 // string.  Returns the number of 16-bit values written.
-size_t WriteUnicodeCharacter(uint32_t code_point, string16* output);
+size_t WriteUnicodeCharacter(uint32_t code_point, std::u16string* output);
 
 // Generalized Unicode converter -----------------------------------------------
 
diff --git a/base/strings/utf_string_conversions.cc b/base/strings/utf_string_conversions.cc
index 15f12f6..4b4e420 100644
--- a/base/strings/utf_string_conversions.cc
+++ b/base/strings/utf_string_conversions.cc
@@ -6,7 +6,8 @@
 
 #include <stdint.h>
 
-#include "base/strings/string_piece.h"
+#include <string_view>
+
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversion_utils.h"
 #include "base/third_party/icu/icu_utf.h"
@@ -32,7 +33,7 @@
 };
 
 template <>
-struct SizeCoefficient<char16, char> {
+struct SizeCoefficient<char16_t, char> {
   // One UTF-16 codeunit corresponds to at most 3 codeunits in UTF-8.
   static constexpr int value = 3;
 };
@@ -49,7 +50,7 @@
   CBU8_APPEND_UNSAFE(out, *size, code_point);
 }
 
-void UnicodeAppendUnsafe(char16* out, int32_t* size, uint32_t code_point) {
+void UnicodeAppendUnsafe(char16_t* out, int32_t* size, uint32_t code_point) {
   CBU16_APPEND_UNSAFE(out, *size, code_point);
 }
 
@@ -80,13 +81,13 @@
 }
 
 template <typename DestChar>
-bool DoUTFConversion(const char16* src,
+bool DoUTFConversion(const char16_t* src,
                      int32_t src_len,
                      DestChar* dest,
                      int32_t* dest_len) {
   bool success = true;
 
-  auto ConvertSingleChar = [&success](char16 in) -> int32_t {
+  auto ConvertSingleChar = [&success](char16_t in) -> int32_t {
     if (!CBU16_IS_SINGLE(in) || !IsValidCodepoint(in)) {
       success = false;
       return kErrorCodePoint;
@@ -155,23 +156,23 @@
 
 // UTF16 <-> UTF8 --------------------------------------------------------------
 
-bool UTF8ToUTF16(const char* src, size_t src_len, string16* output) {
-  return UTFConversion(StringPiece(src, src_len), output);
+bool UTF8ToUTF16(const char* src, size_t src_len, std::u16string* output) {
+  return UTFConversion(std::string_view(src, src_len), output);
 }
 
-string16 UTF8ToUTF16(StringPiece utf8) {
-  string16 ret;
+std::u16string UTF8ToUTF16(std::string_view utf8) {
+  std::u16string ret;
   // Ignore the success flag of this call, it will do the best it can for
   // invalid input, which is what we want here.
   UTF8ToUTF16(utf8.data(), utf8.size(), &ret);
   return ret;
 }
 
-bool UTF16ToUTF8(const char16* src, size_t src_len, std::string* output) {
-  return UTFConversion(StringPiece16(src, src_len), output);
+bool UTF16ToUTF8(const char16_t* src, size_t src_len, std::string* output) {
+  return UTFConversion(std::u16string_view(src, src_len), output);
 }
 
-std::string UTF16ToUTF8(StringPiece16 utf16) {
+std::string UTF16ToUTF8(std::u16string_view utf16) {
   std::string ret;
   // Ignore the success flag of this call, it will do the best it can for
   // invalid input, which is what we want here.
@@ -181,12 +182,12 @@
 
 // ASCII <-> UTF-16 -----------------------------------------------------------
 
-string16 ASCIIToUTF16(StringPiece ascii) {
+std::u16string ASCIIToUTF16(std::string_view ascii) {
   DCHECK(IsStringASCII(ascii)) << ascii;
-  return string16(ascii.begin(), ascii.end());
+  return std::u16string(ascii.begin(), ascii.end());
 }
 
-std::string UTF16ToASCII(StringPiece16 utf16) {
+std::string UTF16ToASCII(std::u16string_view utf16) {
   DCHECK(IsStringASCII(utf16)) << UTF16ToUTF8(utf16);
   return std::string(utf16.begin(), utf16.end());
 }
diff --git a/base/strings/utf_string_conversions.h b/base/strings/utf_string_conversions.h
index c4c2b11..116e6a5 100644
--- a/base/strings/utf_string_conversions.h
+++ b/base/strings/utf_string_conversions.h
@@ -8,24 +8,22 @@
 #include <stddef.h>
 
 #include <string>
-
-#include "base/strings/string16.h"
-#include "base/strings/string_piece.h"
+#include <string_view>
 
 namespace base {
 
-bool UTF8ToUTF16(const char* src, size_t src_len, string16* output);
-string16 UTF8ToUTF16(StringPiece utf8);
-bool UTF16ToUTF8(const char16* src, size_t src_len, std::string* output);
-std::string UTF16ToUTF8(StringPiece16 utf16);
+bool UTF8ToUTF16(const char* src, size_t src_len, std::u16string* output);
+std::u16string UTF8ToUTF16(std::string_view utf8);
+bool UTF16ToUTF8(const char16_t* src, size_t src_len, std::string* output);
+std::string UTF16ToUTF8(std::u16string_view utf16);
 
 // This converts an ASCII string, typically a hardcoded constant, to a UTF16
 // string.
-string16 ASCIIToUTF16(StringPiece ascii);
+std::u16string ASCIIToUTF16(std::string_view ascii);
 
 // Converts to 7-bit ASCII by truncating. The result must be known to be ASCII
 // beforehand.
-std::string UTF16ToASCII(StringPiece16 utf16);
+std::string UTF16ToASCII(std::u16string_view utf16);
 
 }  // namespace base
 
diff --git a/base/values.cc b/base/values.cc
index 0b348b7..9c34803 100644
--- a/base/values.cc
+++ b/base/values.cc
@@ -130,16 +130,18 @@
 
 Value::Value(const char* in_string) : Value(std::string(in_string)) {}
 
-Value::Value(StringPiece in_string) : Value(std::string(in_string)) {}
+Value::Value(std::string_view in_string) : Value(std::string(in_string)) {}
 
 Value::Value(std::string&& in_string) noexcept
     : type_(Type::STRING), string_value_(std::move(in_string)) {
   DCHECK(IsStringUTF8(string_value_));
 }
 
-Value::Value(const char16* in_string16) : Value(StringPiece16(in_string16)) {}
+Value::Value(const char16_t* in_string16)
+    : Value(std::u16string_view(in_string16)) {}
 
-Value::Value(StringPiece16 in_string16) : Value(UTF16ToUTF8(in_string16)) {}
+Value::Value(std::u16string_view in_string16)
+    : Value(UTF16ToUTF8(in_string16)) {}
 
 Value::Value(const BlobStorage& in_blob)
     : type_(Type::BINARY), binary_value_(in_blob) {}
@@ -237,11 +239,11 @@
   return list_;
 }
 
-Value* Value::FindKey(StringPiece key) {
+Value* Value::FindKey(std::string_view key) {
   return const_cast<Value*>(static_cast<const Value*>(this)->FindKey(key));
 }
 
-const Value* Value::FindKey(StringPiece key) const {
+const Value* Value::FindKey(std::string_view key) const {
   CHECK(is_dict());
   auto found = dict_.find(key);
   if (found == dict_.end())
@@ -249,28 +251,28 @@
   return found->second.get();
 }
 
-Value* Value::FindKeyOfType(StringPiece key, Type type) {
+Value* Value::FindKeyOfType(std::string_view key, Type type) {
   return const_cast<Value*>(
       static_cast<const Value*>(this)->FindKeyOfType(key, type));
 }
 
-const Value* Value::FindKeyOfType(StringPiece key, Type type) const {
+const Value* Value::FindKeyOfType(std::string_view key, Type type) const {
   const Value* result = FindKey(key);
   if (!result || result->type() != type)
     return nullptr;
   return result;
 }
 
-bool Value::RemoveKey(StringPiece key) {
+bool Value::RemoveKey(std::string_view key) {
   CHECK(is_dict());
   // NOTE: Can't directly return dict_->erase(key) due to MSVC warning C4800.
   return dict_.erase(key) != 0;
 }
 
-Value* Value::SetKey(StringPiece key, Value value) {
+Value* Value::SetKey(std::string_view key, Value value) {
   CHECK(is_dict());
   // NOTE: We can't use |insert_or_assign| here, as only |try_emplace| does
-  // an explicit conversion from StringPiece to std::string if necessary.
+  // an explicit conversion from std::string_view to std::string if necessary.
   auto val_ptr = std::make_unique<Value>(std::move(value));
   auto result = dict_.try_emplace(key, std::move(val_ptr));
   if (!result.second) {
@@ -289,49 +291,50 @@
 }
 
 Value* Value::SetKey(const char* key, Value value) {
-  return SetKey(StringPiece(key), std::move(value));
+  return SetKey(std::string_view(key), std::move(value));
 }
 
-Value* Value::FindPath(std::initializer_list<StringPiece> path) {
+Value* Value::FindPath(std::initializer_list<std::string_view> path) {
   return const_cast<Value*>(const_cast<const Value*>(this)->FindPath(path));
 }
 
-Value* Value::FindPath(span<const StringPiece> path) {
+Value* Value::FindPath(span<const std::string_view> path) {
   return const_cast<Value*>(const_cast<const Value*>(this)->FindPath(path));
 }
 
-const Value* Value::FindPath(std::initializer_list<StringPiece> path) const {
+const Value* Value::FindPath(
+    std::initializer_list<std::string_view> path) const {
   DCHECK_GE(path.size(), 2u) << "Use FindKey() for a path of length 1.";
   return FindPath(make_span(path.begin(), path.size()));
 }
 
-const Value* Value::FindPath(span<const StringPiece> path) const {
+const Value* Value::FindPath(span<const std::string_view> path) const {
   const Value* cur = this;
-  for (const StringPiece component : path) {
+  for (const std::string_view component : path) {
     if (!cur->is_dict() || (cur = cur->FindKey(component)) == nullptr)
       return nullptr;
   }
   return cur;
 }
 
-Value* Value::FindPathOfType(std::initializer_list<StringPiece> path,
+Value* Value::FindPathOfType(std::initializer_list<std::string_view> path,
                              Type type) {
   return const_cast<Value*>(
       const_cast<const Value*>(this)->FindPathOfType(path, type));
 }
 
-Value* Value::FindPathOfType(span<const StringPiece> path, Type type) {
+Value* Value::FindPathOfType(span<const std::string_view> path, Type type) {
   return const_cast<Value*>(
       const_cast<const Value*>(this)->FindPathOfType(path, type));
 }
 
-const Value* Value::FindPathOfType(std::initializer_list<StringPiece> path,
+const Value* Value::FindPathOfType(std::initializer_list<std::string_view> path,
                                    Type type) const {
   DCHECK_GE(path.size(), 2u) << "Use FindKeyOfType() for a path of length 1.";
   return FindPathOfType(make_span(path.begin(), path.size()), type);
 }
 
-const Value* Value::FindPathOfType(span<const StringPiece> path,
+const Value* Value::FindPathOfType(span<const std::string_view> path,
                                    Type type) const {
   const Value* result = FindPath(path);
   if (!result || result->type() != type)
@@ -339,24 +342,25 @@
   return result;
 }
 
-Value* Value::SetPath(std::initializer_list<StringPiece> path, Value value) {
+Value* Value::SetPath(std::initializer_list<std::string_view> path,
+                      Value value) {
   DCHECK_GE(path.size(), 2u) << "Use SetKey() for a path of length 1.";
   return SetPath(make_span(path.begin(), path.size()), std::move(value));
 }
 
-Value* Value::SetPath(span<const StringPiece> path, Value value) {
+Value* Value::SetPath(span<const std::string_view> path, Value value) {
   DCHECK_NE(path.begin(), path.end());  // Can't be empty path.
 
   // Walk/construct intermediate dictionaries. The last element requires
   // special handling so skip it in this loop.
   Value* cur = this;
-  const StringPiece* cur_path = path.begin();
+  const std::string_view* cur_path = path.begin();
   for (; (cur_path + 1) < path.end(); ++cur_path) {
     if (!cur->is_dict())
       return nullptr;
 
     // Use lower_bound to avoid doing the search twice for missing keys.
-    const StringPiece path_component = *cur_path;
+    const std::string_view path_component = *cur_path;
     auto found = cur->dict_.lower_bound(path_component);
     if (found == cur->dict_.end() || found->first != path_component) {
       // No key found, insert one.
@@ -374,12 +378,12 @@
   return cur->SetKey(*cur_path, std::move(value));
 }
 
-bool Value::RemovePath(std::initializer_list<StringPiece> path) {
+bool Value::RemovePath(std::initializer_list<std::string_view> path) {
   DCHECK_GE(path.size(), 2u) << "Use RemoveKey() for a path of length 1.";
   return RemovePath(make_span(path.begin(), path.size()));
 }
 
-bool Value::RemovePath(span<const StringPiece> path) {
+bool Value::RemovePath(span<const std::string_view> path) {
   if (!is_dict() || path.empty())
     return false;
 
@@ -441,7 +445,7 @@
   return is_string();
 }
 
-bool Value::GetAsString(string16* out_value) const {
+bool Value::GetAsString(std::u16string* out_value) const {
   if (out_value && is_string()) {
     *out_value = UTF8ToUTF16(string_value_);
     return true;
@@ -457,7 +461,7 @@
   return is_string();
 }
 
-bool Value::GetAsString(StringPiece* out_value) const {
+bool Value::GetAsString(std::string_view* out_value) const {
   if (out_value && is_string()) {
     *out_value = string_value_;
     return true;
@@ -660,7 +664,7 @@
 DictionaryValue::DictionaryValue(DictStorage&& in_dict) noexcept
     : Value(std::move(in_dict)) {}
 
-bool DictionaryValue::HasKey(StringPiece key) const {
+bool DictionaryValue::HasKey(std::string_view key) const {
   DCHECK(IsStringUTF8(key));
   auto current_entry = dict_.find(key);
   DCHECK((current_entry == dict_.end()) || current_entry->second);
@@ -671,17 +675,18 @@
   dict_.clear();
 }
 
-Value* DictionaryValue::Set(StringPiece path, std::unique_ptr<Value> in_value) {
+Value* DictionaryValue::Set(std::string_view path,
+                            std::unique_ptr<Value> in_value) {
   DCHECK(IsStringUTF8(path));
   DCHECK(in_value);
 
-  StringPiece current_path(path);
+  std::string_view current_path(path);
   Value* current_dictionary = this;
   for (size_t delimiter_position = current_path.find('.');
-       delimiter_position != StringPiece::npos;
+       delimiter_position != std::string_view::npos;
        delimiter_position = current_path.find('.')) {
     // Assume that we're indexing into a dictionary.
-    StringPiece key = current_path.substr(0, delimiter_position);
+    std::string_view key = current_path.substr(0, delimiter_position);
     Value* child_dictionary =
         current_dictionary->FindKeyOfType(key, Type::DICTIONARY);
     if (!child_dictionary) {
@@ -697,38 +702,40 @@
       ->SetWithoutPathExpansion(current_path, std::move(in_value));
 }
 
-Value* DictionaryValue::SetBoolean(StringPiece path, bool in_value) {
+Value* DictionaryValue::SetBoolean(std::string_view path, bool in_value) {
   return Set(path, std::make_unique<Value>(in_value));
 }
 
-Value* DictionaryValue::SetInteger(StringPiece path, int in_value) {
+Value* DictionaryValue::SetInteger(std::string_view path, int in_value) {
   return Set(path, std::make_unique<Value>(in_value));
 }
 
-Value* DictionaryValue::SetString(StringPiece path, StringPiece in_value) {
+Value* DictionaryValue::SetString(std::string_view path,
+                                  std::string_view in_value) {
   return Set(path, std::make_unique<Value>(in_value));
 }
 
-Value* DictionaryValue::SetString(StringPiece path, const string16& in_value) {
+Value* DictionaryValue::SetString(std::string_view path,
+                                  const std::u16string& in_value) {
   return Set(path, std::make_unique<Value>(in_value));
 }
 
 DictionaryValue* DictionaryValue::SetDictionary(
-    StringPiece path,
+    std::string_view path,
     std::unique_ptr<DictionaryValue> in_value) {
   return static_cast<DictionaryValue*>(Set(path, std::move(in_value)));
 }
 
-ListValue* DictionaryValue::SetList(StringPiece path,
+ListValue* DictionaryValue::SetList(std::string_view path,
                                     std::unique_ptr<ListValue> in_value) {
   return static_cast<ListValue*>(Set(path, std::move(in_value)));
 }
 
 Value* DictionaryValue::SetWithoutPathExpansion(
-    StringPiece key,
+    std::string_view key,
     std::unique_ptr<Value> in_value) {
   // NOTE: We can't use |insert_or_assign| here, as only |try_emplace| does
-  // an explicit conversion from StringPiece to std::string if necessary.
+  // an explicit conversion from std::string_view to std::string if necessary.
   auto result = dict_.try_emplace(key, std::move(in_value));
   if (!result.second) {
     // in_value is guaranteed to be still intact at this point.
@@ -737,9 +744,10 @@
   return result.first->second.get();
 }
 
-bool DictionaryValue::Get(StringPiece path, const Value** out_value) const {
+bool DictionaryValue::Get(std::string_view path,
+                          const Value** out_value) const {
   DCHECK(IsStringUTF8(path));
-  StringPiece current_path(path);
+  std::string_view current_path(path);
   const DictionaryValue* current_dictionary = this;
   for (size_t delimiter_position = current_path.find('.');
        delimiter_position != std::string::npos;
@@ -757,12 +765,13 @@
   return current_dictionary->GetWithoutPathExpansion(current_path, out_value);
 }
 
-bool DictionaryValue::Get(StringPiece path, Value** out_value) {
+bool DictionaryValue::Get(std::string_view path, Value** out_value) {
   return static_cast<const DictionaryValue&>(*this).Get(
       path, const_cast<const Value**>(out_value));
 }
 
-bool DictionaryValue::GetBoolean(StringPiece path, bool* bool_value) const {
+bool DictionaryValue::GetBoolean(std::string_view path,
+                                 bool* bool_value) const {
   const Value* value;
   if (!Get(path, &value))
     return false;
@@ -770,7 +779,7 @@
   return value->GetAsBoolean(bool_value);
 }
 
-bool DictionaryValue::GetInteger(StringPiece path, int* out_value) const {
+bool DictionaryValue::GetInteger(std::string_view path, int* out_value) const {
   const Value* value;
   if (!Get(path, &value))
     return false;
@@ -778,7 +787,7 @@
   return value->GetAsInteger(out_value);
 }
 
-bool DictionaryValue::GetString(StringPiece path,
+bool DictionaryValue::GetString(std::string_view path,
                                 std::string* out_value) const {
   const Value* value;
   if (!Get(path, &value))
@@ -787,7 +796,8 @@
   return value->GetAsString(out_value);
 }
 
-bool DictionaryValue::GetString(StringPiece path, string16* out_value) const {
+bool DictionaryValue::GetString(std::string_view path,
+                                std::u16string* out_value) const {
   const Value* value;
   if (!Get(path, &value))
     return false;
@@ -795,7 +805,7 @@
   return value->GetAsString(out_value);
 }
 
-bool DictionaryValue::GetStringASCII(StringPiece path,
+bool DictionaryValue::GetStringASCII(std::string_view path,
                                      std::string* out_value) const {
   std::string out;
   if (!GetString(path, &out))
@@ -810,7 +820,7 @@
   return true;
 }
 
-bool DictionaryValue::GetBinary(StringPiece path,
+bool DictionaryValue::GetBinary(std::string_view path,
                                 const Value** out_value) const {
   const Value* value;
   bool result = Get(path, &value);
@@ -823,12 +833,12 @@
   return true;
 }
 
-bool DictionaryValue::GetBinary(StringPiece path, Value** out_value) {
+bool DictionaryValue::GetBinary(std::string_view path, Value** out_value) {
   return static_cast<const DictionaryValue&>(*this).GetBinary(
       path, const_cast<const Value**>(out_value));
 }
 
-bool DictionaryValue::GetDictionary(StringPiece path,
+bool DictionaryValue::GetDictionary(std::string_view path,
                                     const DictionaryValue** out_value) const {
   const Value* value;
   bool result = Get(path, &value);
@@ -841,13 +851,13 @@
   return true;
 }
 
-bool DictionaryValue::GetDictionary(StringPiece path,
+bool DictionaryValue::GetDictionary(std::string_view path,
                                     DictionaryValue** out_value) {
   return static_cast<const DictionaryValue&>(*this).GetDictionary(
       path, const_cast<const DictionaryValue**>(out_value));
 }
 
-bool DictionaryValue::GetList(StringPiece path,
+bool DictionaryValue::GetList(std::string_view path,
                               const ListValue** out_value) const {
   const Value* value;
   bool result = Get(path, &value);
@@ -860,12 +870,12 @@
   return true;
 }
 
-bool DictionaryValue::GetList(StringPiece path, ListValue** out_value) {
+bool DictionaryValue::GetList(std::string_view path, ListValue** out_value) {
   return static_cast<const DictionaryValue&>(*this).GetList(
       path, const_cast<const ListValue**>(out_value));
 }
 
-bool DictionaryValue::GetWithoutPathExpansion(StringPiece key,
+bool DictionaryValue::GetWithoutPathExpansion(std::string_view key,
                                               const Value** out_value) const {
   DCHECK(IsStringUTF8(key));
   auto entry_iterator = dict_.find(key);
@@ -877,13 +887,13 @@
   return true;
 }
 
-bool DictionaryValue::GetWithoutPathExpansion(StringPiece key,
+bool DictionaryValue::GetWithoutPathExpansion(std::string_view key,
                                               Value** out_value) {
   return static_cast<const DictionaryValue&>(*this).GetWithoutPathExpansion(
       key, const_cast<const Value**>(out_value));
 }
 
-bool DictionaryValue::GetBooleanWithoutPathExpansion(StringPiece key,
+bool DictionaryValue::GetBooleanWithoutPathExpansion(std::string_view key,
                                                      bool* out_value) const {
   const Value* value;
   if (!GetWithoutPathExpansion(key, &value))
@@ -892,7 +902,7 @@
   return value->GetAsBoolean(out_value);
 }
 
-bool DictionaryValue::GetIntegerWithoutPathExpansion(StringPiece key,
+bool DictionaryValue::GetIntegerWithoutPathExpansion(std::string_view key,
                                                      int* out_value) const {
   const Value* value;
   if (!GetWithoutPathExpansion(key, &value))
@@ -902,7 +912,7 @@
 }
 
 bool DictionaryValue::GetStringWithoutPathExpansion(
-    StringPiece key,
+    std::string_view key,
     std::string* out_value) const {
   const Value* value;
   if (!GetWithoutPathExpansion(key, &value))
@@ -911,8 +921,9 @@
   return value->GetAsString(out_value);
 }
 
-bool DictionaryValue::GetStringWithoutPathExpansion(StringPiece key,
-                                                    string16* out_value) const {
+bool DictionaryValue::GetStringWithoutPathExpansion(
+    std::string_view key,
+    std::u16string* out_value) const {
   const Value* value;
   if (!GetWithoutPathExpansion(key, &value))
     return false;
@@ -921,7 +932,7 @@
 }
 
 bool DictionaryValue::GetDictionaryWithoutPathExpansion(
-    StringPiece key,
+    std::string_view key,
     const DictionaryValue** out_value) const {
   const Value* value;
   bool result = GetWithoutPathExpansion(key, &value);
@@ -935,7 +946,7 @@
 }
 
 bool DictionaryValue::GetDictionaryWithoutPathExpansion(
-    StringPiece key,
+    std::string_view key,
     DictionaryValue** out_value) {
   const DictionaryValue& const_this =
       static_cast<const DictionaryValue&>(*this);
@@ -944,7 +955,7 @@
 }
 
 bool DictionaryValue::GetListWithoutPathExpansion(
-    StringPiece key,
+    std::string_view key,
     const ListValue** out_value) const {
   const Value* value;
   bool result = GetWithoutPathExpansion(key, &value);
@@ -957,19 +968,19 @@
   return true;
 }
 
-bool DictionaryValue::GetListWithoutPathExpansion(StringPiece key,
+bool DictionaryValue::GetListWithoutPathExpansion(std::string_view key,
                                                   ListValue** out_value) {
   return static_cast<const DictionaryValue&>(*this).GetListWithoutPathExpansion(
       key, const_cast<const ListValue**>(out_value));
 }
 
-bool DictionaryValue::Remove(StringPiece path,
+bool DictionaryValue::Remove(std::string_view path,
                              std::unique_ptr<Value>* out_value) {
   DCHECK(IsStringUTF8(path));
-  StringPiece current_path(path);
+  std::string_view current_path(path);
   DictionaryValue* current_dictionary = this;
   size_t delimiter_position = current_path.rfind('.');
-  if (delimiter_position != StringPiece::npos) {
+  if (delimiter_position != std::string_view::npos) {
     if (!GetDictionary(current_path.substr(0, delimiter_position),
                        &current_dictionary))
       return false;
@@ -981,7 +992,7 @@
 }
 
 bool DictionaryValue::RemoveWithoutPathExpansion(
-    StringPiece key,
+    std::string_view key,
     std::unique_ptr<Value>* out_value) {
   DCHECK(IsStringUTF8(key));
   auto entry_iterator = dict_.find(key);
@@ -994,7 +1005,7 @@
   return true;
 }
 
-bool DictionaryValue::RemovePath(StringPiece path,
+bool DictionaryValue::RemovePath(std::string_view path,
                                  std::unique_ptr<Value>* out_value) {
   bool result = false;
   size_t delimiter_position = path.find('.');
@@ -1002,7 +1013,7 @@
   if (delimiter_position == std::string::npos)
     return RemoveWithoutPathExpansion(path, out_value);
 
-  StringPiece subdict_path = path.substr(0, delimiter_position);
+  std::string_view subdict_path = path.substr(0, delimiter_position);
   DictionaryValue* subdict = nullptr;
   if (!GetDictionary(subdict_path, &subdict))
     return false;
@@ -1135,7 +1146,7 @@
   return value->GetAsString(out_value);
 }
 
-bool ListValue::GetString(size_t index, string16* out_value) const {
+bool ListValue::GetString(size_t index, std::u16string* out_value) const {
   const Value* value;
   if (!Get(index, &value))
     return false;
@@ -1222,11 +1233,11 @@
   list_.emplace_back(in_value);
 }
 
-void ListValue::AppendString(StringPiece in_value) {
+void ListValue::AppendString(std::string_view in_value) {
   list_.emplace_back(in_value);
 }
 
-void ListValue::AppendString(const string16& in_value) {
+void ListValue::AppendString(const std::u16string& in_value) {
   list_.emplace_back(in_value);
 }
 
@@ -1236,7 +1247,7 @@
     list_.emplace_back(in_value);
 }
 
-void ListValue::AppendStrings(const std::vector<string16>& in_values) {
+void ListValue::AppendStrings(const std::vector<std::u16string>& in_values) {
   list_.reserve(list_.size() + in_values.size());
   for (const auto& in_value : in_values)
     list_.emplace_back(in_value);
diff --git a/base/values.h b/base/values.h
index c3ec875..b32c8f9 100644
--- a/base/values.h
+++ b/base/values.h
@@ -27,14 +27,13 @@
 #include <map>
 #include <memory>
 #include <string>
+#include <string_view>
 #include <utility>
 #include <vector>
 
 #include "base/containers/flat_map.h"
 #include "base/containers/span.h"
 #include "base/macros.h"
-#include "base/strings/string16.h"
-#include "base/strings/string_piece.h"
 #include "base/value_iterators.h"
 
 namespace base {
@@ -116,15 +115,15 @@
   explicit Value(bool in_bool);
   explicit Value(int in_int);
 
-  // Value(const char*) and Value(const char16*) are required despite
-  // Value(StringPiece) and Value(StringPiece16) because otherwise the
-  // compiler will choose the Value(bool) constructor for these arguments.
+  // Value(const char*) and Value(const char16_t*) are required despite
+  // Value(std::string_view) and Value(std::u16string_view) because otherwise
+  // the compiler will choose the Value(bool) constructor for these arguments.
   // Value(std::string&&) allow for efficient move construction.
   explicit Value(const char* in_string);
-  explicit Value(StringPiece in_string);
+  explicit Value(std::string_view in_string);
   explicit Value(std::string&& in_string) noexcept;
-  explicit Value(const char16* in_string16);
-  explicit Value(StringPiece16 in_string16);
+  explicit Value(const char16_t* in_string16);
+  explicit Value(std::u16string_view in_string16);
 
   explicit Value(const BlobStorage& in_blob);
   explicit Value(BlobStorage&& in_blob) noexcept;
@@ -171,8 +170,8 @@
   //
   // Example:
   //   auto* found = FindKey("foo");
-  Value* FindKey(StringPiece key);
-  const Value* FindKey(StringPiece key) const;
+  Value* FindKey(std::string_view key);
+  const Value* FindKey(std::string_view key) const;
 
   // |FindKeyOfType| is similar to |FindKey|, but it also requires the found
   // value to have type |type|. If no type is found, or the found value is of a
@@ -183,8 +182,8 @@
   //
   // Example:
   //   auto* found = FindKey("foo", Type::INTEGER);
-  Value* FindKeyOfType(StringPiece key, Type type);
-  const Value* FindKeyOfType(StringPiece key, Type type) const;
+  Value* FindKeyOfType(std::string_view key, Type type);
+  const Value* FindKeyOfType(std::string_view key, Type type) const;
 
   // |SetKey| looks up |key| in the underlying dictionary and sets the mapped
   // value to |value|. If |key| could not be found, a new element is inserted.
@@ -193,7 +192,7 @@
   //
   // Example:
   //   SetKey("foo", std::move(myvalue));
-  Value* SetKey(StringPiece key, Value value);
+  Value* SetKey(std::string_view key, Value value);
   // This overload results in a performance improvement for std::string&&.
   Value* SetKey(std::string&& key, Value value);
   // This overload is necessary to avoid ambiguity for const char* arguments.
@@ -207,7 +206,7 @@
   //
   // Example:
   //   bool success = RemoveKey("foo");
-  bool RemoveKey(StringPiece key);
+  bool RemoveKey(std::string_view key);
 
   // Searches a hierarchy of dictionary values for a given value. If a path
   // of dictionaries exist, returns the item at that path. If any of the path
@@ -223,25 +222,27 @@
   // Example:
   //   auto* found = FindPath({"foo", "bar"});
   //
-  //   std::vector<StringPiece> components = ...
+  //   std::vector<std::string_view> components = ...
   //   auto* found = FindPath(components);
   //
   // Note: If there is only one component in the path, use FindKey() instead.
-  Value* FindPath(std::initializer_list<StringPiece> path);
-  Value* FindPath(span<const StringPiece> path);
-  const Value* FindPath(std::initializer_list<StringPiece> path) const;
-  const Value* FindPath(span<const StringPiece> path) const;
+  Value* FindPath(std::initializer_list<std::string_view> path);
+  Value* FindPath(span<const std::string_view> path);
+  const Value* FindPath(std::initializer_list<std::string_view> path) const;
+  const Value* FindPath(span<const std::string_view> path) const;
 
   // Like FindPath() but will only return the value if the leaf Value type
   // matches the given type. Will return nullptr otherwise.
   //
   // Note: If there is only one component in the path, use FindKeyOfType()
   // instead.
-  Value* FindPathOfType(std::initializer_list<StringPiece> path, Type type);
-  Value* FindPathOfType(span<const StringPiece> path, Type type);
-  const Value* FindPathOfType(std::initializer_list<StringPiece> path,
+  Value* FindPathOfType(std::initializer_list<std::string_view> path,
+                        Type type);
+  Value* FindPathOfType(span<const std::string_view> path, Type type);
+  const Value* FindPathOfType(std::initializer_list<std::string_view> path,
                               Type type) const;
-  const Value* FindPathOfType(span<const StringPiece> path, Type type) const;
+  const Value* FindPathOfType(span<const std::string_view> path,
+                              Type type) const;
 
   // Sets the given path, expanding and creating dictionary keys as necessary.
   //
@@ -255,12 +256,12 @@
   // Example:
   //   value.SetPath({"foo", "bar"}, std::move(myvalue));
   //
-  //   std::vector<StringPiece> components = ...
+  //   std::vector<std::string_view> components = ...
   //   value.SetPath(components, std::move(myvalue));
   //
   // Note: If there is only one component in the path, use SetKey() instead.
-  Value* SetPath(std::initializer_list<StringPiece> path, Value value);
-  Value* SetPath(span<const StringPiece> path, Value value);
+  Value* SetPath(std::initializer_list<std::string_view> path, Value value);
+  Value* SetPath(span<const std::string_view> path, Value value);
 
   // Tries to remove a Value at the given path.
   //
@@ -272,12 +273,12 @@
   // Example:
   //   bool success = value.RemovePath({"foo", "bar"});
   //
-  //   std::vector<StringPiece> components = ...
+  //   std::vector<std::string_view> components = ...
   //   bool success = value.RemovePath(components);
   //
   // Note: If there is only one component in the path, use RemoveKey() instead.
-  bool RemovePath(std::initializer_list<StringPiece> path);
-  bool RemovePath(span<const StringPiece> path);
+  bool RemovePath(std::initializer_list<std::string_view> path);
+  bool RemovePath(span<const std::string_view> path);
 
   using dict_iterator_proxy = detail::dict_iterator_proxy;
   using const_dict_iterator_proxy = detail::const_dict_iterator_proxy;
@@ -305,9 +306,9 @@
   bool GetAsInteger(int* out_value) const;
   // DEPRECATED, use GetString() instead.
   bool GetAsString(std::string* out_value) const;
-  bool GetAsString(string16* out_value) const;
+  bool GetAsString(std::u16string* out_value) const;
   bool GetAsString(const Value** out_value) const;
-  bool GetAsString(StringPiece* out_value) const;
+  bool GetAsString(std::string_view* out_value) const;
   // ListValue::From is the equivalent for std::unique_ptr conversions.
   // DEPRECATED, use GetList() instead.
   bool GetAsList(ListValue** out_value);
@@ -384,7 +385,7 @@
 
   // Returns true if the current dictionary has a value for the given key.
   // DEPRECATED, use Value::FindKey(key) instead.
-  bool HasKey(StringPiece key) const;
+  bool HasKey(std::string_view key) const;
 
   // Returns the number of Values in this dictionary.
   size_t size() const { return dict_.size(); }
@@ -404,28 +405,29 @@
   // to the path in that location. |in_value| must be non-null.
   // Returns a pointer to the inserted value.
   // DEPRECATED, use Value::SetPath(path, value) instead.
-  Value* Set(StringPiece path, std::unique_ptr<Value> in_value);
+  Value* Set(std::string_view path, std::unique_ptr<Value> in_value);
 
   // Convenience forms of Set().  These methods will replace any existing
   // value at that path, even if it has a different type.
   // DEPRECATED, use Value::SetPath(path, Value(bool)) instead.
-  Value* SetBoolean(StringPiece path, bool in_value);
+  Value* SetBoolean(std::string_view path, bool in_value);
   // DEPRECATED, use Value::SetPath(path, Value(int)) instead.
-  Value* SetInteger(StringPiece path, int in_value);
-  // DEPRECATED, use Value::SetPath(path, Value(StringPiece)) instead.
-  Value* SetString(StringPiece path, StringPiece in_value);
+  Value* SetInteger(std::string_view path, int in_value);
+  // DEPRECATED, use Value::SetPath(path, Value(std::string_view)) instead.
+  Value* SetString(std::string_view path, std::string_view in_value);
   // DEPRECATED, use Value::SetPath(path, Value(const string& 16)) instead.
-  Value* SetString(StringPiece path, const string16& in_value);
+  Value* SetString(std::string_view path, const std::u16string& in_value);
   // DEPRECATED, use Value::SetPath(path, Value(Type::DICTIONARY)) instead.
-  DictionaryValue* SetDictionary(StringPiece path,
+  DictionaryValue* SetDictionary(std::string_view path,
                                  std::unique_ptr<DictionaryValue> in_value);
   // DEPRECATED, use Value::SetPath(path, Value(Type::LIST)) instead.
-  ListValue* SetList(StringPiece path, std::unique_ptr<ListValue> in_value);
+  ListValue* SetList(std::string_view path,
+                     std::unique_ptr<ListValue> in_value);
 
   // Like Set(), but without special treatment of '.'.  This allows e.g. URLs to
   // be used as paths.
   // DEPRECATED, use Value::SetKey(key, value) instead.
-  Value* SetWithoutPathExpansion(StringPiece key,
+  Value* SetWithoutPathExpansion(std::string_view key,
                                  std::unique_ptr<Value> in_value);
 
   // Gets the Value associated with the given path starting from this object.
@@ -437,65 +439,69 @@
   // Note that the dictionary always owns the value that's returned.
   // |out_value| is optional and will only be set if non-NULL.
   // DEPRECATED, use Value::FindPath(path) instead.
-  bool Get(StringPiece path, const Value** out_value) const;
+  bool Get(std::string_view path, const Value** out_value) const;
   // DEPRECATED, use Value::FindPath(path) instead.
-  bool Get(StringPiece path, Value** out_value);
+  bool Get(std::string_view path, Value** out_value);
 
   // These are convenience forms of Get().  The value will be retrieved
   // and the return value will be true if the path is valid and the value at
   // the end of the path can be returned in the form specified.
   // |out_value| is optional and will only be set if non-NULL.
   // DEPRECATED, use Value::FindPath(path) and Value::GetBool() instead.
-  bool GetBoolean(StringPiece path, bool* out_value) const;
+  bool GetBoolean(std::string_view path, bool* out_value) const;
   // DEPRECATED, use Value::FindPath(path) and Value::GetInt() instead.
-  bool GetInteger(StringPiece path, int* out_value) const;
+  bool GetInteger(std::string_view path, int* out_value) const;
   // DEPRECATED, use Value::FindPath(path) and Value::GetString() instead.
-  bool GetString(StringPiece path, std::string* out_value) const;
+  bool GetString(std::string_view path, std::string* out_value) const;
   // DEPRECATED, use Value::FindPath(path) and Value::GetString() instead.
-  bool GetString(StringPiece path, string16* out_value) const;
+  bool GetString(std::string_view path, std::u16string* out_value) const;
   // DEPRECATED, use Value::FindPath(path) and Value::GetString() instead.
-  bool GetStringASCII(StringPiece path, std::string* out_value) const;
+  bool GetStringASCII(std::string_view path, std::string* out_value) const;
   // DEPRECATED, use Value::FindPath(path) and Value::GetBlob() instead.
-  bool GetBinary(StringPiece path, const Value** out_value) const;
+  bool GetBinary(std::string_view path, const Value** out_value) const;
   // DEPRECATED, use Value::FindPath(path) and Value::GetBlob() instead.
-  bool GetBinary(StringPiece path, Value** out_value);
+  bool GetBinary(std::string_view path, Value** out_value);
   // DEPRECATED, use Value::FindPath(path) and Value's Dictionary API instead.
-  bool GetDictionary(StringPiece path, const DictionaryValue** out_value) const;
+  bool GetDictionary(std::string_view path,
+                     const DictionaryValue** out_value) const;
   // DEPRECATED, use Value::FindPath(path) and Value's Dictionary API instead.
-  bool GetDictionary(StringPiece path, DictionaryValue** out_value);
+  bool GetDictionary(std::string_view path, DictionaryValue** out_value);
   // DEPRECATED, use Value::FindPath(path) and Value::GetList() instead.
-  bool GetList(StringPiece path, const ListValue** out_value) const;
+  bool GetList(std::string_view path, const ListValue** out_value) const;
   // DEPRECATED, use Value::FindPath(path) and Value::GetList() instead.
-  bool GetList(StringPiece path, ListValue** out_value);
+  bool GetList(std::string_view path, ListValue** out_value);
 
   // Like Get(), but without special treatment of '.'.  This allows e.g. URLs to
   // be used as paths.
   // DEPRECATED, use Value::FindKey(key) instead.
-  bool GetWithoutPathExpansion(StringPiece key, const Value** out_value) const;
+  bool GetWithoutPathExpansion(std::string_view key,
+                               const Value** out_value) const;
   // DEPRECATED, use Value::FindKey(key) instead.
-  bool GetWithoutPathExpansion(StringPiece key, Value** out_value);
+  bool GetWithoutPathExpansion(std::string_view key, Value** out_value);
   // DEPRECATED, use Value::FindKey(key) and Value::GetBool() instead.
-  bool GetBooleanWithoutPathExpansion(StringPiece key, bool* out_value) const;
+  bool GetBooleanWithoutPathExpansion(std::string_view key,
+                                      bool* out_value) const;
   // DEPRECATED, use Value::FindKey(key) and Value::GetInt() instead.
-  bool GetIntegerWithoutPathExpansion(StringPiece key, int* out_value) const;
+  bool GetIntegerWithoutPathExpansion(std::string_view key,
+                                      int* out_value) const;
   // DEPRECATED, use Value::FindKey(key) and Value::GetString() instead.
-  bool GetStringWithoutPathExpansion(StringPiece key,
+  bool GetStringWithoutPathExpansion(std::string_view key,
                                      std::string* out_value) const;
   // DEPRECATED, use Value::FindKey(key) and Value::GetString() instead.
-  bool GetStringWithoutPathExpansion(StringPiece key,
-                                     string16* out_value) const;
+  bool GetStringWithoutPathExpansion(std::string_view key,
+                                     std::u16string* out_value) const;
   // DEPRECATED, use Value::FindKey(key) and Value's Dictionary API instead.
   bool GetDictionaryWithoutPathExpansion(
-      StringPiece key,
+      std::string_view key,
       const DictionaryValue** out_value) const;
   // DEPRECATED, use Value::FindKey(key) and Value's Dictionary API instead.
-  bool GetDictionaryWithoutPathExpansion(StringPiece key,
+  bool GetDictionaryWithoutPathExpansion(std::string_view key,
                                          DictionaryValue** out_value);
   // DEPRECATED, use Value::FindKey(key) and Value::GetList() instead.
-  bool GetListWithoutPathExpansion(StringPiece key,
+  bool GetListWithoutPathExpansion(std::string_view key,
                                    const ListValue** out_value) const;
   // DEPRECATED, use Value::FindKey(key) and Value::GetList() instead.
-  bool GetListWithoutPathExpansion(StringPiece key, ListValue** out_value);
+  bool GetListWithoutPathExpansion(std::string_view key, ListValue** out_value);
 
   // Removes the Value with the specified path from this dictionary (or one
   // of its child dictionaries, if the path is more than just a local key).
@@ -504,18 +510,18 @@
   // This method returns true if |path| is a valid path; otherwise it will
   // return false and the DictionaryValue object will be unchanged.
   // DEPRECATED, use Value::RemovePath(path) instead.
-  bool Remove(StringPiece path, std::unique_ptr<Value>* out_value);
+  bool Remove(std::string_view path, std::unique_ptr<Value>* out_value);
 
   // Like Remove(), but without special treatment of '.'.  This allows e.g. URLs
   // to be used as paths.
   // DEPRECATED, use Value::RemoveKey(key) instead.
-  bool RemoveWithoutPathExpansion(StringPiece key,
+  bool RemoveWithoutPathExpansion(std::string_view key,
                                   std::unique_ptr<Value>* out_value);
 
   // Removes a path, clearing out all dictionaries on |path| that remain empty
   // after removing the value at |path|.
   // DEPRECATED, use Value::RemovePath(path) instead.
-  bool RemovePath(StringPiece path, std::unique_ptr<Value>* out_value);
+  bool RemovePath(std::string_view path, std::unique_ptr<Value>* out_value);
 
   using Value::RemovePath;  // DictionaryValue::RemovePath shadows otherwise.
 
@@ -625,7 +631,7 @@
   bool GetInteger(size_t index, int* out_value) const;
   // DEPRECATED, use GetList()::operator[]::GetString() instead.
   bool GetString(size_t index, std::string* out_value) const;
-  bool GetString(size_t index, string16* out_value) const;
+  bool GetString(size_t index, std::u16string* out_value) const;
 
   bool GetDictionary(size_t index, const DictionaryValue** out_value) const;
   bool GetDictionary(size_t index, DictionaryValue** out_value);
@@ -664,11 +670,11 @@
   // DEPRECATED, use GetList()::emplace_back() instead.
   void AppendBoolean(bool in_value);
   void AppendInteger(int in_value);
-  void AppendString(StringPiece in_value);
-  void AppendString(const string16& in_value);
+  void AppendString(std::string_view in_value);
+  void AppendString(const std::u16string& in_value);
   // DEPRECATED, use GetList()::emplace_back() in a loop instead.
   void AppendStrings(const std::vector<std::string>& in_values);
-  void AppendStrings(const std::vector<string16>& in_values);
+  void AppendStrings(const std::vector<std::u16string>& in_values);
 
   // Appends a Value if it's not already present. Returns true if successful,
   // or false if the value was already
diff --git a/tools/gn/args.cc b/tools/gn/args.cc
index 802c373..e14adf6 100644
--- a/tools/gn/args.cc
+++ b/tools/gn/args.cc
@@ -108,8 +108,8 @@
 void Args::AddArgOverride(const char* name, const Value& value) {
   std::lock_guard<std::mutex> lock(lock_);
 
-  overrides_[base::StringPiece(name)] = value;
-  all_overrides_[base::StringPiece(name)] = value;
+  overrides_[std::string_view(name)] = value;
+  all_overrides_[std::string_view(name)] = value;
 }
 
 void Args::AddArgOverrides(const Scope::KeyValueMap& overrides) {
@@ -131,7 +131,7 @@
   std::lock_guard<std::mutex> lock(lock_);
 
   Scope::KeyValueMap::const_iterator found =
-      all_overrides_.find(base::StringPiece(name));
+      all_overrides_.find(std::string_view(name));
   if (found == all_overrides_.end())
     return nullptr;
   return &found->second;
@@ -240,7 +240,7 @@
 
   // Some assignments in args.gn had no effect.  Show an error for the first
   // unused assignment.
-  base::StringPiece name = unused_overrides.begin()->first;
+  std::string_view name = unused_overrides.begin()->first;
   const Value& value = unused_overrides.begin()->second;
 
   std::string err_help(
@@ -250,12 +250,12 @@
       "To view all possible args, run \"gn args --list <out_dir>\"");
 
   // Use all declare_args for a spelling suggestion.
-  std::vector<base::StringPiece> candidates;
+  std::vector<std::string_view> candidates;
   for (const auto& map_pair : declared_arguments_per_toolchain_) {
     for (const auto& declared_arg : map_pair.second)
       candidates.push_back(declared_arg.first);
   }
-  base::StringPiece suggestion = SpellcheckString(name, candidates);
+  std::string_view suggestion = SpellcheckString(name, candidates);
   if (!suggestion.empty())
     err_help = "Did you mean \"" + suggestion + "\"?\n\n" + err_help;
 
diff --git a/tools/gn/args.h b/tools/gn/args.h
index 4a4bc7c..3921e23 100644
--- a/tools/gn/args.h
+++ b/tools/gn/args.h
@@ -37,7 +37,7 @@
     bool has_override;     // True indicates override_value is valid.
     Value override_value;  // From .gn or the current build's "gn args".
   };
-  using ValueWithOverrideMap = std::map<base::StringPiece, ValueWithOverride>;
+  using ValueWithOverrideMap = std::map<std::string_view, ValueWithOverride>;
 
   Args();
   Args(const Args& other);
diff --git a/tools/gn/bundle_data.cc b/tools/gn/bundle_data.cc
index 9de0e8c..60500c6 100644
--- a/tools/gn/bundle_data.cc
+++ b/tools/gn/bundle_data.cc
@@ -16,14 +16,14 @@
 namespace {
 
 // Return directory of |path| without the trailing directory separator.
-base::StringPiece FindDirNoTrailingSeparator(base::StringPiece path) {
-  base::StringPiece::size_type pos = path.find_last_of("/\\");
-  if (pos == base::StringPiece::npos)
-    return base::StringPiece();
-  return base::StringPiece(path.data(), pos);
+std::string_view FindDirNoTrailingSeparator(std::string_view path) {
+  std::string_view::size_type pos = path.find_last_of("/\\");
+  if (pos == std::string_view::npos)
+    return std::string_view();
+  return std::string_view(path.data(), pos);
 }
 
-bool IsSourceFileFromAssetsCatalog(base::StringPiece source,
+bool IsSourceFileFromAssetsCatalog(std::string_view source,
                                    SourceFile* asset_catalog) {
   // Check whether |source| matches one of the following pattern:
   //    .*\.xcassets/Contents.json
@@ -31,7 +31,7 @@
   //    .*\.xcassets/[^/]*\.imageset/[^/]*
   //    .*\.xcassets/[^/]*\.launchimage/[^/]*
   bool is_file_from_asset_catalog = false;
-  base::StringPiece dir = FindDirNoTrailingSeparator(source);
+  std::string_view dir = FindDirNoTrailingSeparator(source);
   if (base::EndsWith(source, "/Contents.json", base::CompareCase::SENSITIVE) &&
       base::EndsWith(dir, ".xcassets", base::CompareCase::SENSITIVE)) {
     is_file_from_asset_catalog = true;
diff --git a/tools/gn/c_include_iterator.cc b/tools/gn/c_include_iterator.cc
index 540d118..077609f 100644
--- a/tools/gn/c_include_iterator.cc
+++ b/tools/gn/c_include_iterator.cc
@@ -21,7 +21,7 @@
 // Returns a new string piece referencing the same buffer as the argument, but
 // with leading space trimmed. This only checks for space and tab characters
 // since we're dealing with lines in C source files.
-base::StringPiece TrimLeadingWhitespace(const base::StringPiece& str) {
+std::string_view TrimLeadingWhitespace(const std::string_view& str) {
   size_t new_begin = 0;
   while (new_begin < str.size() &&
          (str[new_begin] == ' ' || str[new_begin] == '\t'))
@@ -40,7 +40,7 @@
 //
 // We assume the line has leading whitespace trimmed. We also assume that empty
 // lines have already been filtered out.
-bool ShouldCountTowardNonIncludeLines(const base::StringPiece& line) {
+bool ShouldCountTowardNonIncludeLines(const std::string_view& line) {
   if (base::StartsWith(line, "//", base::CompareCase::SENSITIVE))
     return false;  // Don't count comments.
   if (base::StartsWith(line, "/*", base::CompareCase::SENSITIVE) ||
@@ -59,15 +59,15 @@
 //
 // The 1-based character number on the line that the include was found at
 // will be filled into *begin_char.
-IncludeType ExtractInclude(const base::StringPiece& line,
-                           base::StringPiece* path,
+IncludeType ExtractInclude(const std::string_view& line,
+                           std::string_view* path,
                            int* begin_char) {
   static const char kInclude[] = "include";
   static const size_t kIncludeLen = arraysize(kInclude) - 1;  // No null.
   static const char kImport[] = "import";
   static const size_t kImportLen = arraysize(kImport) - 1;  // No null.
 
-  base::StringPiece trimmed = TrimLeadingWhitespace(line);
+  std::string_view trimmed = TrimLeadingWhitespace(line);
   if (trimmed.empty())
     return INCLUDE_NONE;
 
@@ -76,11 +76,11 @@
 
   trimmed = TrimLeadingWhitespace(trimmed.substr(1));
 
-  base::StringPiece contents;
-  if (base::StartsWith(trimmed, base::StringPiece(kInclude, kIncludeLen),
+  std::string_view contents;
+  if (base::StartsWith(trimmed, std::string_view(kInclude, kIncludeLen),
                        base::CompareCase::SENSITIVE))
     contents = TrimLeadingWhitespace(trimmed.substr(kIncludeLen));
-  else if (base::StartsWith(trimmed, base::StringPiece(kImport, kImportLen),
+  else if (base::StartsWith(trimmed, std::string_view(kImport, kImportLen),
                             base::CompareCase::SENSITIVE))
     contents = TrimLeadingWhitespace(trimmed.substr(kImportLen));
 
@@ -101,7 +101,7 @@
 
   // Count everything to next "/> as the contents.
   size_t terminator_index = contents.find(terminating_char, 1);
-  if (terminator_index == base::StringPiece::npos)
+  if (terminator_index == std::string_view::npos)
     return INCLUDE_NONE;
 
   *path = contents.substr(1, terminator_index - 1);
@@ -111,8 +111,8 @@
 }
 
 // Returns true if this line has a "nogncheck" comment associated with it.
-bool HasNoCheckAnnotation(const base::StringPiece& line) {
-  return line.find("nogncheck") != base::StringPiece::npos;
+bool HasNoCheckAnnotation(const std::string_view& line) {
+  return line.find("nogncheck") != std::string_view::npos;
 }
 
 }  // namespace
@@ -124,13 +124,13 @@
 
 CIncludeIterator::~CIncludeIterator() = default;
 
-bool CIncludeIterator::GetNextIncludeString(base::StringPiece* out,
+bool CIncludeIterator::GetNextIncludeString(std::string_view* out,
                                             LocationRange* location) {
-  base::StringPiece line;
+  std::string_view line;
   int cur_line_number = 0;
   while (lines_since_last_include_ <= kMaxNonIncludeLines &&
          GetNextLine(&line, &cur_line_number)) {
-    base::StringPiece include_contents;
+    std::string_view include_contents;
     int begin_char;
     IncludeType type = ExtractInclude(line, &include_contents, &begin_char);
     if (type == INCLUDE_USER && !HasNoCheckAnnotation(line)) {
@@ -153,7 +153,7 @@
   return false;
 }
 
-bool CIncludeIterator::GetNextLine(base::StringPiece* line, int* line_number) {
+bool CIncludeIterator::GetNextLine(std::string_view* line, int* line_number) {
   if (offset_ == file_.size())
     return false;
 
diff --git a/tools/gn/c_include_iterator.h b/tools/gn/c_include_iterator.h
index 86a0954..0c379e1 100644
--- a/tools/gn/c_include_iterator.h
+++ b/tools/gn/c_include_iterator.h
@@ -7,8 +7,9 @@
 
 #include <stddef.h>
 
+#include <string_view>
+
 #include "base/macros.h"
-#include "base/strings/string_piece.h"
 
 class InputFile;
 class LocationRange;
@@ -26,7 +27,7 @@
   // Fills in the string with the contents of the next include, and the
   // location with where it came from, and returns true, or returns false if
   // there are no more includes.
-  bool GetNextIncludeString(base::StringPiece* out, LocationRange* location);
+  bool GetNextIncludeString(std::string_view* out, LocationRange* location);
 
   // Maximum numbef of non-includes we'll tolerate before giving up. This does
   // not count comments or preprocessor.
@@ -35,12 +36,12 @@
  private:
   // Returns false on EOF, otherwise fills in the given line and the one-based
   // line number into *line_number;
-  bool GetNextLine(base::StringPiece* line, int* line_number);
+  bool GetNextLine(std::string_view* line, int* line_number);
 
   const InputFile* input_file_;
 
   // This just points into input_file_.contents() for convenience.
-  base::StringPiece file_;
+  std::string_view file_;
 
   // 0-based offset into the file.
   size_t offset_ = 0;
diff --git a/tools/gn/c_include_iterator_unittest.cc b/tools/gn/c_include_iterator_unittest.cc
index aa1f99a..de9b14a 100644
--- a/tools/gn/c_include_iterator_unittest.cc
+++ b/tools/gn/c_include_iterator_unittest.cc
@@ -44,7 +44,7 @@
 
   CIncludeIterator iter(&file);
 
-  base::StringPiece contents;
+  std::string_view contents;
   LocationRange range;
   EXPECT_TRUE(iter.GetNextIncludeString(&contents, &range));
   EXPECT_EQ("foo/bar.h", contents);
@@ -77,7 +77,7 @@
   InputFile file(SourceFile("//foo.cc"));
   file.SetContents(buffer);
 
-  base::StringPiece contents;
+  std::string_view contents;
   LocationRange range;
 
   CIncludeIterator iter(&file);
@@ -99,7 +99,7 @@
   InputFile file(SourceFile("//foo.cc"));
   file.SetContents(buffer);
 
-  base::StringPiece contents;
+  std::string_view contents;
   LocationRange range;
 
   CIncludeIterator iter(&file);
@@ -126,7 +126,7 @@
   InputFile file(SourceFile("//foo.cc"));
   file.SetContents(buffer);
 
-  base::StringPiece contents;
+  std::string_view contents;
   LocationRange range;
 
   CIncludeIterator iter(&file);
@@ -152,7 +152,7 @@
   InputFile file(SourceFile("//foo.cc"));
   file.SetContents(buffer);
 
-  base::StringPiece contents;
+  std::string_view contents;
   LocationRange range;
 
   CIncludeIterator iter(&file);
@@ -167,7 +167,7 @@
   InputFile file(SourceFile("//foo.cc"));
   file.SetContents(buffer);
 
-  base::StringPiece contents;
+  std::string_view contents;
   LocationRange range;
 
   CIncludeIterator iter(&file);
diff --git a/tools/gn/command_args.cc b/tools/gn/command_args.cc
index 26b8bd6..41f9f5b 100644
--- a/tools/gn/command_args.cc
+++ b/tools/gn/command_args.cc
@@ -40,7 +40,7 @@
 const char kSwitchOverridesOnly[] = "overrides-only";
 const char kSwitchJson[] = "json";
 
-bool DoesLineBeginWithComment(const base::StringPiece& line) {
+bool DoesLineBeginWithComment(const std::string_view& line) {
   // Skip whitespace.
   size_t i = 0;
   while (i < line.size() && base::IsAsciiWhitespace(line[i]))
@@ -67,7 +67,7 @@
 
 // Assumes DoesLineBeginWithComment(), this strips the # character from the
 // beginning and normalizes preceding whitespace.
-std::string StripHashFromLine(const base::StringPiece& line, bool pad) {
+std::string StripHashFromLine(const std::string_view& line, bool pad) {
   // Replace the # sign and everything before it with 3 spaces, so that a
   // normal comment that has a space after the # will be indented 4 spaces
   // (which makes our formatting come out nicely). If the comment is indented
@@ -104,8 +104,8 @@
     line_off -= 2;  // Back up to end of previous line.
     size_t previous_line_offset = BackUpToLineBegin(data, line_off);
 
-    base::StringPiece line(&data[previous_line_offset],
-                           line_off - previous_line_offset + 1);
+    std::string_view line(&data[previous_line_offset],
+                          line_off - previous_line_offset + 1);
     if (!DoesLineBeginWithComment(line))
       break;
 
@@ -120,7 +120,7 @@
 // is a bit different.
 //
 // The default value also contains the docstring.
-void PrintDefaultValueInfo(base::StringPiece name, const Value& value) {
+void PrintDefaultValueInfo(std::string_view name, const Value& value) {
   OutputString(value.ToString(true) + "\n");
   if (value.origin()) {
     int line_no;
@@ -137,7 +137,7 @@
 }
 
 // Override value is null if there is no override.
-void PrintArgHelp(const base::StringPiece& name,
+void PrintArgHelp(const std::string_view& name,
                   const Args::ValueWithOverride& val) {
   OutputString(std::string(name), DECORATION_YELLOW);
   OutputString("\n");
@@ -163,7 +163,7 @@
 }
 
 void BuildArgJson(base::Value& dict,
-                  const base::StringPiece& name,
+                  const std::string_view& name,
                   const Args::ValueWithOverride& arg,
                   bool short_only) {
   assert(dict.is_dict());
diff --git a/tools/gn/command_clean.cc b/tools/gn/command_clean.cc
index 32aaf77..d2822fc 100644
--- a/tools/gn/command_clean.cc
+++ b/tools/gn/command_clean.cc
@@ -27,7 +27,7 @@
   if (!base::ReadFileToString(build_ninja_file, &file_contents))
     return std::string();
 
-  std::vector<base::StringPiece> lines = base::SplitStringPiece(
+  std::vector<std::string_view> lines = base::SplitStringPiece(
       file_contents, "\n", base::KEEP_WHITESPACE, base::SPLIT_WANT_ALL);
 
   std::string result;
diff --git a/tools/gn/command_format.cc b/tools/gn/command_format.cc
index a8604a5..15689ad 100644
--- a/tools/gn/command_format.cc
+++ b/tools/gn/command_format.cc
@@ -127,7 +127,7 @@
   };
 
   // Add to output.
-  void Print(base::StringPiece str);
+  void Print(std::string_view str);
 
   // Add the current margin (as spaces) to the output.
   void PrintMargin();
@@ -238,7 +238,7 @@
   std::vector<IndentState> stack_;
 
   // Gives the precedence for operators in a BinaryOpNode.
-  std::map<base::StringPiece, Precedence> precedence_;
+  std::map<std::string_view, Precedence> precedence_;
 
   DISALLOW_COPY_AND_ASSIGN(Printer);
 };
@@ -264,7 +264,7 @@
 
 Printer::~Printer() = default;
 
-void Printer::Print(base::StringPiece str) {
+void Printer::Print(std::string_view str) {
   output_.append(str);
 }
 
@@ -323,7 +323,7 @@
   // This is somewhat arbitrary, but we include the 'deps'- and 'sources'-like
   // things, but not flags things.
   if (binop->op().value() == "=" && ident && list) {
-    const base::StringPiece lhs = ident->value().value();
+    const std::string_view lhs = ident->value().value();
     if (lhs == "data" || lhs == "datadeps" || lhs == "data_deps" ||
         lhs == "deps" || lhs == "inputs" || lhs == "outputs" ||
         lhs == "public" || lhs == "public_deps" || lhs == "sources") {
@@ -347,7 +347,7 @@
   if ((binop->op().value() == "=" || binop->op().value() == "+=" ||
        binop->op().value() == "-=") &&
       ident && list) {
-    const base::StringPiece lhs = ident->value().value();
+    const std::string_view lhs = ident->value().value();
     if (lhs == "public" || lhs == "sources")
       const_cast<ListNode*>(list)->SortAsStringsList();
     else if (lhs == "deps" || lhs == "public_deps")
@@ -389,14 +389,14 @@
                     const std::unique_ptr<PARSENODE>& b) const {
       const auto& a_args = a->AsFunctionCall()->args()->contents();
       const auto& b_args = b->AsFunctionCall()->args()->contents();
-      base::StringPiece a_name;
-      base::StringPiece b_name;
+      std::string_view a_name;
+      std::string_view b_name;
       if (!a_args.empty())
         a_name = a_args[0]->AsLiteral()->value().value();
       if (!b_args.empty())
         b_name = b_args[0]->AsLiteral()->value().value();
 
-      auto is_absolute = [](base::StringPiece import) {
+      auto is_absolute = [](std::string_view import) {
         return import.size() >= 3 && import[0] == '"' && import[1] == '/' &&
                import[2] == '/';
       };
diff --git a/tools/gn/command_help.cc b/tools/gn/command_help.cc
index 987f506..86ca088 100644
--- a/tools/gn/command_help.cc
+++ b/tools/gn/command_help.cc
@@ -215,7 +215,7 @@
 bool PrintHelpOnSwitch(const std::string& what) {
   const switches::SwitchInfoMap& all = switches::GetSwitches();
   switches::SwitchInfoMap::const_iterator found =
-      all.find(base::StringPiece(what));
+      all.find(std::string_view(what));
   if (found == all.end())
     return false;
   PrintLongHelp(found->second.long_help);
@@ -280,7 +280,7 @@
     what = args[0];
   }
 
-  std::vector<base::StringPiece> all_help_topics;
+  std::vector<std::string_view> all_help_topics;
 
   // Special-case ambiguous topics.
   if (what == "args") {
@@ -361,7 +361,7 @@
 
   // No help on this.
   Err(Location(), "No help on \"" + what + "\".").PrintToStdout();
-  base::StringPiece suggestion = SpellcheckString(what, all_help_topics);
+  std::string_view suggestion = SpellcheckString(what, all_help_topics);
   if (suggestion.empty()) {
     OutputString("Run `gn help` for a list of available topics.\n",
                  DECORATION_NONE);
diff --git a/tools/gn/commands.h b/tools/gn/commands.h
index d6b6728..f57f740 100644
--- a/tools/gn/commands.h
+++ b/tools/gn/commands.h
@@ -8,9 +8,9 @@
 #include <map>
 #include <set>
 #include <string>
+#include <string_view>
 #include <vector>
 
-#include "base/strings/string_piece.h"
 #include "base/values.h"
 #include "tools/gn/target.h"
 #include "tools/gn/unique_vector.h"
@@ -102,7 +102,7 @@
   CommandRunner runner;
 };
 
-typedef std::map<base::StringPiece, CommandInfo> CommandInfoMap;
+typedef std::map<std::string_view, CommandInfo> CommandInfoMap;
 
 const CommandInfoMap& GetCommands();
 
@@ -145,7 +145,8 @@
 bool CheckPublicHeaders(const BuildSettings* build_settings,
                         const std::vector<const Target*>& all_targets,
                         const std::vector<const Target*>& to_check,
-                        bool force_check, bool check_generated);
+                        bool force_check,
+                        bool check_generated);
 
 // Filters the given list of targets by the given pattern list.
 void FilterTargetsByPatterns(const std::vector<const Target*>& input,
diff --git a/tools/gn/create_bundle_target_generator.cc b/tools/gn/create_bundle_target_generator.cc
index 2c5a3af..be60f50 100644
--- a/tools/gn/create_bundle_target_generator.cc
+++ b/tools/gn/create_bundle_target_generator.cc
@@ -73,7 +73,7 @@
 
 bool CreateBundleTargetGenerator::FillBundleDir(
     const SourceDir& bundle_root_dir,
-    const base::StringPiece& name,
+    const std::string_view& name,
     SourceDir* bundle_dir) {
   // All bundle_foo_dir properties are optional. They are only required if they
   // are used in an expansion. The check is performed there.
diff --git a/tools/gn/create_bundle_target_generator.h b/tools/gn/create_bundle_target_generator.h
index a7f1edc..63b85fa 100644
--- a/tools/gn/create_bundle_target_generator.h
+++ b/tools/gn/create_bundle_target_generator.h
@@ -24,7 +24,7 @@
 
  private:
   bool FillBundleDir(const SourceDir& bundle_root_dir,
-                     const base::StringPiece& name,
+                     const std::string_view& name,
                      SourceDir* bundle_dir);
 
   bool FillXcodeExtraAttributes();
diff --git a/tools/gn/err.cc b/tools/gn/err.cc
index 4f60964..4d3cbce 100644
--- a/tools/gn/err.cc
+++ b/tools/gn/err.cc
@@ -17,7 +17,7 @@
 
 namespace {
 
-std::string GetNthLine(const base::StringPiece& data, int n) {
+std::string GetNthLine(const std::string_view& data, int n) {
   size_t line_off = Tokenizer::ByteOffsetOfNthLine(data, n);
   size_t end = line_off + 1;
   while (end < data.size() && !Tokenizer::IsNewline(data, end))
diff --git a/tools/gn/escape.cc b/tools/gn/escape.cc
index d5e33c0..ef4dcfa 100644
--- a/tools/gn/escape.cc
+++ b/tools/gn/escape.cc
@@ -62,7 +62,7 @@
   return ch == '$' || ch == ' ' || ch == ':';
 }
 
-size_t EscapeStringToString_Ninja(const base::StringPiece& str,
+size_t EscapeStringToString_Ninja(const std::string_view& str,
                                   const EscapeOptions& options,
                                   char* dest,
                                   bool* needed_quoting) {
@@ -75,7 +75,7 @@
   return i;
 }
 
-size_t EscapeStringToString_Depfile(const base::StringPiece& str,
+size_t EscapeStringToString_Depfile(const std::string_view& str,
                                     const EscapeOptions& options,
                                     char* dest,
                                     bool* needed_quoting) {
@@ -93,7 +93,7 @@
   return i;
 }
 
-size_t EscapeStringToString_NinjaPreformatted(const base::StringPiece& str,
+size_t EscapeStringToString_NinjaPreformatted(const std::string_view& str,
                                               char* dest) {
   // Only Ninja-escape $.
   size_t i = 0;
@@ -113,7 +113,7 @@
 // See:
 //   http://blogs.msdn.com/b/twistylittlepassagesallalike/archive/2011/04/23/everyone-quotes-arguments-the-wrong-way.aspx
 //   http://blogs.msdn.com/b/oldnewthing/archive/2010/09/17/10063629.aspx
-size_t EscapeStringToString_WindowsNinjaFork(const base::StringPiece& str,
+size_t EscapeStringToString_WindowsNinjaFork(const std::string_view& str,
                                              const EscapeOptions& options,
                                              char* dest,
                                              bool* needed_quoting) {
@@ -165,7 +165,7 @@
   return i;
 }
 
-size_t EscapeStringToString_PosixNinjaFork(const base::StringPiece& str,
+size_t EscapeStringToString_PosixNinjaFork(const std::string_view& str,
                                            const EscapeOptions& options,
                                            char* dest,
                                            bool* needed_quoting) {
@@ -196,7 +196,7 @@
 }
 
 // Escapes |str| into |dest| and returns the number of characters written.
-size_t EscapeStringToString(const base::StringPiece& str,
+size_t EscapeStringToString(const std::string_view& str,
                             const EscapeOptions& options,
                             char* dest,
                             bool* needed_quoting) {
@@ -237,7 +237,7 @@
 
 }  // namespace
 
-std::string EscapeString(const base::StringPiece& str,
+std::string EscapeString(const std::string_view& str,
                          const EscapeOptions& options,
                          bool* needed_quoting) {
   StackOrHeapBuffer dest(str.size() * kMaxEscapedCharsPerChar);
@@ -246,7 +246,7 @@
 }
 
 void EscapeStringToStream(std::ostream& out,
-                          const base::StringPiece& str,
+                          const std::string_view& str,
                           const EscapeOptions& options) {
   StackOrHeapBuffer dest(str.size() * kMaxEscapedCharsPerChar);
   out.write(dest, EscapeStringToString(str, options, dest, nullptr));
diff --git a/tools/gn/escape.h b/tools/gn/escape.h
index af5f8b8..36a9c5c 100644
--- a/tools/gn/escape.h
+++ b/tools/gn/escape.h
@@ -6,8 +6,7 @@
 #define TOOLS_GN_ESCAPE_H_
 
 #include <iosfwd>
-
-#include "base/strings/string_piece.h"
+#include <string_view>
 
 enum EscapingMode {
   // No escaping.
@@ -64,14 +63,14 @@
 // (if inhibit_quoting was set) quoted will be written to it. This value should
 // be initialized to false by the caller and will be written to only if it's
 // true (the common use-case is for chaining calls).
-std::string EscapeString(const base::StringPiece& str,
+std::string EscapeString(const std::string_view& str,
                          const EscapeOptions& options,
                          bool* needed_quoting);
 
 // Same as EscapeString but writes the results to the given stream, saving a
 // copy.
 void EscapeStringToStream(std::ostream& out,
-                          const base::StringPiece& str,
+                          const std::string_view& str,
                           const EscapeOptions& options);
 
 #endif  // TOOLS_GN_ESCAPE_H_
diff --git a/tools/gn/exec_process.cc b/tools/gn/exec_process.cc
index 2496405..e266d90 100644
--- a/tools/gn/exec_process.cc
+++ b/tools/gn/exec_process.cc
@@ -42,7 +42,7 @@
                      std_err, exit_code);
 }
 
-bool ExecProcess(const base::string16& cmdline_str,
+bool ExecProcess(const std::u16string& cmdline_str,
                  const base::FilePath& startup_dir,
                  std::string* std_out,
                  std::string* std_err,
@@ -94,7 +94,7 @@
   start_info.hStdError = GetStdHandle(STD_ERROR_HANDLE);
   start_info.dwFlags |= STARTF_USESTDHANDLES;
 
-  base::string16 cmdline_writable = cmdline_str;
+  std::u16string cmdline_writable = cmdline_str;
 
   // Create the child process.
   PROCESS_INFORMATION temp_process_info = {};
diff --git a/tools/gn/exec_process.h b/tools/gn/exec_process.h
index 278d539..91ee876 100644
--- a/tools/gn/exec_process.h
+++ b/tools/gn/exec_process.h
@@ -7,7 +7,6 @@
 
 #include <string>
 
-#include "base/strings/string16.h"
 #include "util/build_config.h"
 
 namespace base {
@@ -24,7 +23,7 @@
                  int* exit_code);
 
 #if defined(OS_WIN)
-bool ExecProcess(const base::string16& cmdline_str,
+bool ExecProcess(const std::u16string& cmdline_str,
                  const base::FilePath& startup_dir,
                  std::string* std_out,
                  std::string* std_err,
diff --git a/tools/gn/filesystem_utils.cc b/tools/gn/filesystem_utils.cc
index ea4dfb8..43efcc3 100644
--- a/tools/gn/filesystem_utils.cc
+++ b/tools/gn/filesystem_utils.cc
@@ -81,8 +81,8 @@
 
 // Attempts to do a case and slash-insensitive comparison of two 8-bit Windows
 // paths.
-bool AreAbsoluteWindowsPathsEqual(const base::StringPiece& a,
-                                  const base::StringPiece& b) {
+bool AreAbsoluteWindowsPathsEqual(const std::string_view& a,
+                                  const std::string_view& b) {
   if (a.size() != b.size())
     return false;
 
@@ -95,7 +95,7 @@
   return true;
 }
 
-bool DoesBeginWindowsDriveLetter(const base::StringPiece& path) {
+bool DoesBeginWindowsDriveLetter(const std::string_view& path) {
   if (path.size() < 3)
     return false;
 
@@ -200,7 +200,7 @@
   }
 }
 
-size_t AbsPathLenWithNoTrailingSlash(const base::StringPiece& path) {
+size_t AbsPathLenWithNoTrailingSlash(const std::string_view& path) {
   size_t len = path.size();
 #if defined(OS_WIN)
   size_t min_len = 3;
@@ -222,7 +222,7 @@
 #endif
 }
 
-base::FilePath UTF8ToFilePath(const base::StringPiece& sp) {
+base::FilePath UTF8ToFilePath(const std::string_view& sp) {
 #if defined(OS_WIN)
   return base::FilePath(base::UTF8ToUTF16(sp));
 #else
@@ -240,12 +240,12 @@
   return std::string::npos;
 }
 
-base::StringPiece FindExtension(const std::string* path) {
+std::string_view FindExtension(const std::string* path) {
   size_t extension_offset = FindExtensionOffset(*path);
   if (extension_offset == std::string::npos)
-    return base::StringPiece();
-  return base::StringPiece(&path->data()[extension_offset],
-                           path->size() - extension_offset);
+    return std::string_view();
+  return std::string_view(&path->data()[extension_offset],
+                          path->size() - extension_offset);
 }
 
 size_t FindFilenameOffset(const std::string& path) {
@@ -256,17 +256,17 @@
   return 0;  // No filename found means everything was the filename.
 }
 
-base::StringPiece FindFilename(const std::string* path) {
+std::string_view FindFilename(const std::string* path) {
   size_t filename_offset = FindFilenameOffset(*path);
   if (filename_offset == 0)
-    return base::StringPiece(*path);  // Everything is the file name.
-  return base::StringPiece(&(*path).data()[filename_offset],
-                           path->size() - filename_offset);
+    return std::string_view(*path);  // Everything is the file name.
+  return std::string_view(&(*path).data()[filename_offset],
+                          path->size() - filename_offset);
 }
 
-base::StringPiece FindFilenameNoExtension(const std::string* path) {
+std::string_view FindFilenameNoExtension(const std::string* path) {
   if (path->empty())
-    return base::StringPiece();
+    return std::string_view();
   size_t filename_offset = FindFilenameOffset(*path);
   size_t extension_offset = FindExtensionOffset(*path);
 
@@ -276,7 +276,7 @@
   else
     name_len = extension_offset - filename_offset - 1;
 
-  return base::StringPiece(&(*path).data()[filename_offset], name_len);
+  return std::string_view(&(*path).data()[filename_offset], name_len);
 }
 
 void RemoveFilename(std::string* path) {
@@ -287,18 +287,18 @@
   return !s.empty() && IsSlash(s[s.size() - 1]);
 }
 
-base::StringPiece FindDir(const std::string* path) {
+std::string_view FindDir(const std::string* path) {
   size_t filename_offset = FindFilenameOffset(*path);
   if (filename_offset == 0u)
-    return base::StringPiece();
-  return base::StringPiece(path->data(), filename_offset);
+    return std::string_view();
+  return std::string_view(path->data(), filename_offset);
 }
 
-base::StringPiece FindLastDirComponent(const SourceDir& dir) {
+std::string_view FindLastDirComponent(const SourceDir& dir) {
   const std::string& dir_string = dir.value();
 
   if (dir_string.empty())
-    return base::StringPiece();
+    return std::string_view();
   int cur = static_cast<int>(dir_string.size()) - 1;
   DCHECK(dir_string[cur] == '/');
   int end = cur;
@@ -306,9 +306,9 @@
 
   for (; cur >= 0; cur--) {
     if (dir_string[cur] == '/')
-      return base::StringPiece(&dir_string[cur + 1], end - cur - 1);
+      return std::string_view(&dir_string[cur + 1], end - cur - 1);
   }
-  return base::StringPiece(&dir_string[0], end);
+  return std::string_view(&dir_string[0], end);
 }
 
 bool IsStringInOutputDir(const SourceDir& output_dir, const std::string& str) {
@@ -334,7 +334,7 @@
   return false;
 }
 
-bool IsPathAbsolute(const base::StringPiece& path) {
+bool IsPathAbsolute(const std::string_view& path) {
   if (path.empty())
     return false;
 
@@ -355,12 +355,12 @@
   return true;
 }
 
-bool IsPathSourceAbsolute(const base::StringPiece& path) {
+bool IsPathSourceAbsolute(const std::string_view& path) {
   return (path.size() >= 2 && path[0] == '/' && path[1] == '/');
 }
 
-bool MakeAbsolutePathRelativeIfPossible(const base::StringPiece& source_root,
-                                        const base::StringPiece& path,
+bool MakeAbsolutePathRelativeIfPossible(const std::string_view& source_root,
+                                        const std::string_view& path,
                                         std::string* dest) {
   DCHECK(IsPathAbsolute(source_root));
   DCHECK(IsPathAbsolute(path));
@@ -504,7 +504,7 @@
   return base::FilePath(base::JoinString(relative_components, separator));
 }
 
-void NormalizePath(std::string* path, const base::StringPiece& source_root) {
+void NormalizePath(std::string* path, const std::string_view& source_root) {
   char* pathbuf = path->empty() ? nullptr : &(*path)[0];
 
   // top_index is the first character we can modify in the path. Anything
@@ -702,7 +702,7 @@
 
 std::string RebasePath(const std::string& input,
                        const SourceDir& dest_dir,
-                       const base::StringPiece& source_root) {
+                       const std::string_view& source_root) {
   std::string ret;
   DCHECK(source_root.empty() ||
          !base::EndsWith(source_root, "/", base::CompareCase::SENSITIVE));
@@ -784,7 +784,7 @@
 std::string ResolveRelative(const StringType& input,
                             const std::string& value,
                             bool as_file,
-                            const base::StringPiece& source_root) {
+                            const std::string_view& source_root) {
   std::string result;
 
   if (input.size() >= 2 && input[0] == '/' && input[1] == '/') {
@@ -846,15 +846,15 @@
 }
 
 // Explicit template instantiation
-template std::string ResolveRelative(const base::StringPiece& input,
+template std::string ResolveRelative(const std::string_view& input,
                                      const std::string& value,
                                      bool as_file,
-                                     const base::StringPiece& source_root);
+                                     const std::string_view& source_root);
 
 template std::string ResolveRelative(const std::string& input,
                                      const std::string& value,
                                      bool as_file,
-                                     const base::StringPiece& source_root);
+                                     const std::string_view& source_root);
 
 std::string DirectoryWithNoLastSlash(const SourceDir& dir) {
   std::string ret;
diff --git a/tools/gn/filesystem_utils.h b/tools/gn/filesystem_utils.h
index 220c4f8..f25e702 100644
--- a/tools/gn/filesystem_utils.h
+++ b/tools/gn/filesystem_utils.h
@@ -8,9 +8,9 @@
 #include <stddef.h>
 
 #include <string>
+#include <string_view>
 
 #include "base/files/file_path.h"
-#include "base/strings/string_piece.h"
 #include "tools/gn/settings.h"
 #include "tools/gn/target.h"
 
@@ -20,7 +20,7 @@
 inline std::string FilePathToUTF8(const base::FilePath& path) {
   return FilePathToUTF8(path.value());
 }
-base::FilePath UTF8ToFilePath(const base::StringPiece& sp);
+base::FilePath UTF8ToFilePath(const std::string_view& sp);
 
 // Extensions -----------------------------------------------------------------
 
@@ -31,7 +31,7 @@
 
 // Returns a string piece pointing into the input string identifying the
 // extension. Note that the input pointer must outlive the output.
-base::StringPiece FindExtension(const std::string* path);
+std::string_view FindExtension(const std::string* path);
 
 // Filename parts -------------------------------------------------------------
 
@@ -43,10 +43,10 @@
 // Returns a string piece pointing into the input string identifying the
 // file name (following the last slash, including the extension). Note that the
 // input pointer must outlive the output.
-base::StringPiece FindFilename(const std::string* path);
+std::string_view FindFilename(const std::string* path);
 
 // Like FindFilename but does not include the extension.
-base::StringPiece FindFilenameNoExtension(const std::string* path);
+std::string_view FindFilenameNoExtension(const std::string* path);
 
 // Removes everything after the last slash. The last slash, if any, will be
 // preserved.
@@ -67,11 +67,11 @@
 // Returns a string piece pointing into the input string identifying the
 // directory name of the given path, including the last slash. Note that the
 // input pointer must outlive the output.
-base::StringPiece FindDir(const std::string* path);
+std::string_view FindDir(const std::string* path);
 
 // Returns the substring identifying the last component of the dir, or the
 // empty substring if none. For example "//foo/bar/" -> "bar".
-base::StringPiece FindLastDirComponent(const SourceDir& dir);
+std::string_view FindLastDirComponent(const SourceDir& dir);
 
 // Returns true if the given string is in the given output dir. This is pretty
 // stupid and doesn't handle "." and "..", etc., it is designed for a sanity
@@ -96,12 +96,12 @@
 // Returns true if the input string is absolute. Double-slashes at the
 // beginning are treated as source-relative paths. On Windows, this handles
 // paths of both the native format: "C:/foo" and ours "/C:/foo"
-bool IsPathAbsolute(const base::StringPiece& path);
+bool IsPathAbsolute(const std::string_view& path);
 
 // Returns true if the input string is source-absolute. Source-absolute
 // paths begin with two forward slashes and resolve as if they are
 // relative to the source root.
-bool IsPathSourceAbsolute(const base::StringPiece& path);
+bool IsPathSourceAbsolute(const std::string_view& path);
 
 // Given an absolute path, checks to see if is it is inside the source root.
 // If it is, fills a source-absolute path into the given output and returns
@@ -112,8 +112,8 @@
 // ("/C:/"). The source root can end with a slash or not.
 //
 // Note that this does not attempt to normalize slashes in the output.
-bool MakeAbsolutePathRelativeIfPossible(const base::StringPiece& source_root,
-                                        const base::StringPiece& path,
+bool MakeAbsolutePathRelativeIfPossible(const std::string_view& source_root,
+                                        const std::string_view& path,
                                         std::string* dest);
 
 // Given two absolute paths |base| and |target|, returns a relative path to
@@ -134,7 +134,7 @@
 // a leading slash. Otherwise, |path| will retain its relativity. |source_root|
 // must not end with a slash.
 void NormalizePath(std::string* path,
-                   const base::StringPiece& source_root = base::StringPiece());
+                   const std::string_view& source_root = std::string_view());
 
 // Converts slashes to backslashes for Windows. Keeps the string unchanged
 // for other systems.
@@ -150,7 +150,7 @@
 std::string RebasePath(
     const std::string& input,
     const SourceDir& dest_dir,
-    const base::StringPiece& source_root = base::StringPiece());
+    const std::string_view& source_root = std::string_view());
 
 // Resolves a file or dir name (parameter input) relative to
 // value directory. Will return an empty SourceDir/File on error
@@ -169,7 +169,7 @@
 std::string ResolveRelative(const StringType& input,
                             const std::string& value,
                             bool as_file,
-                            const base::StringPiece& source_root);
+                            const std::string_view& source_root);
 
 // Resolves source file or directory relative to some given source root. Returns
 // an empty file path on error.
diff --git a/tools/gn/filesystem_utils_unittest.cc b/tools/gn/filesystem_utils_unittest.cc
index 2f8df44..da1d4b1 100644
--- a/tools/gn/filesystem_utils_unittest.cc
+++ b/tools/gn/filesystem_utils_unittest.cc
@@ -424,7 +424,7 @@
 }
 
 TEST(FilesystemUtils, RebasePath) {
-  base::StringPiece source_root("/source/root");
+  std::string_view source_root("/source/root");
 
   // Degenerate case.
   EXPECT_EQ(".", RebasePath("//", SourceDir("//"), source_root));
@@ -468,84 +468,84 @@
 
   // Check when only |input| is system-absolute
   EXPECT_EQ("foo", RebasePath("/source/root/foo", SourceDir("//"),
-                              base::StringPiece("/source/root")));
+                              std::string_view("/source/root")));
   EXPECT_EQ("foo/", RebasePath("/source/root/foo/", SourceDir("//"),
-                               base::StringPiece("/source/root")));
+                               std::string_view("/source/root")));
   EXPECT_EQ("../../builddir/Out/Debug",
             RebasePath("/builddir/Out/Debug", SourceDir("//"),
-                       base::StringPiece("/source/root")));
+                       std::string_view("/source/root")));
   EXPECT_EQ("../../../builddir/Out/Debug",
             RebasePath("/builddir/Out/Debug", SourceDir("//"),
-                       base::StringPiece("/source/root/foo")));
+                       std::string_view("/source/root/foo")));
   EXPECT_EQ("../../../builddir/Out/Debug/",
             RebasePath("/builddir/Out/Debug/", SourceDir("//"),
-                       base::StringPiece("/source/root/foo")));
+                       std::string_view("/source/root/foo")));
   EXPECT_EQ("../../path/to/foo", RebasePath("/path/to/foo", SourceDir("//"),
-                                            base::StringPiece("/source/root")));
+                                            std::string_view("/source/root")));
   EXPECT_EQ("../../../path/to/foo",
             RebasePath("/path/to/foo", SourceDir("//a"),
-                       base::StringPiece("/source/root")));
+                       std::string_view("/source/root")));
   EXPECT_EQ("../../../../path/to/foo",
             RebasePath("/path/to/foo", SourceDir("//a/b"),
-                       base::StringPiece("/source/root")));
+                       std::string_view("/source/root")));
 
   // Check when only |dest_dir| is system-absolute.
   EXPECT_EQ(".", RebasePath("//", SourceDir("/source/root"),
-                            base::StringPiece("/source/root")));
+                            std::string_view("/source/root")));
   EXPECT_EQ("foo", RebasePath("//foo", SourceDir("/source/root"),
-                              base::StringPiece("/source/root")));
+                              std::string_view("/source/root")));
   EXPECT_EQ("../foo", RebasePath("//foo", SourceDir("/source/root/bar"),
-                                 base::StringPiece("/source/root")));
+                                 std::string_view("/source/root")));
   EXPECT_EQ("../../../source/root/foo",
             RebasePath("//foo", SourceDir("/other/source/root"),
-                       base::StringPiece("/source/root")));
+                       std::string_view("/source/root")));
   EXPECT_EQ("../../../../source/root/foo",
             RebasePath("//foo", SourceDir("/other/source/root/bar"),
-                       base::StringPiece("/source/root")));
+                       std::string_view("/source/root")));
 
   // Check when |input| and |dest_dir| are both system-absolute. Also,
   // in this case |source_root| is never used so set it to a dummy
   // value.
   EXPECT_EQ("foo", RebasePath("/source/root/foo", SourceDir("/source/root"),
-                              base::StringPiece("/x/y/z")));
+                              std::string_view("/x/y/z")));
   EXPECT_EQ("foo/", RebasePath("/source/root/foo/", SourceDir("/source/root"),
-                               base::StringPiece("/x/y/z")));
+                               std::string_view("/x/y/z")));
   EXPECT_EQ("../../builddir/Out/Debug",
             RebasePath("/builddir/Out/Debug", SourceDir("/source/root"),
-                       base::StringPiece("/x/y/z")));
+                       std::string_view("/x/y/z")));
   EXPECT_EQ("../../../builddir/Out/Debug",
             RebasePath("/builddir/Out/Debug", SourceDir("/source/root/foo"),
-                       base::StringPiece("/source/root/foo")));
+                       std::string_view("/source/root/foo")));
   EXPECT_EQ("../../../builddir/Out/Debug/",
             RebasePath("/builddir/Out/Debug/", SourceDir("/source/root/foo"),
-                       base::StringPiece("/source/root/foo")));
+                       std::string_view("/source/root/foo")));
   EXPECT_EQ("../../path/to/foo",
             RebasePath("/path/to/foo", SourceDir("/source/root"),
-                       base::StringPiece("/x/y/z")));
+                       std::string_view("/x/y/z")));
   EXPECT_EQ("../../../path/to/foo",
             RebasePath("/path/to/foo", SourceDir("/source/root/a"),
-                       base::StringPiece("/x/y/z")));
+                       std::string_view("/x/y/z")));
   EXPECT_EQ("../../../../path/to/foo",
             RebasePath("/path/to/foo", SourceDir("/source/root/a/b"),
-                       base::StringPiece("/x/y/z")));
+                       std::string_view("/x/y/z")));
 
 #if defined(OS_WIN)
   // Test corrections while rebasing Windows-style absolute paths.
   EXPECT_EQ("../../../../path/to/foo",
             RebasePath("C:/path/to/foo", SourceDir("//a/b"),
-                       base::StringPiece("/C:/source/root")));
+                       std::string_view("/C:/source/root")));
   EXPECT_EQ("../../../../path/to/foo",
             RebasePath("/C:/path/to/foo", SourceDir("//a/b"),
-                       base::StringPiece("C:/source/root")));
+                       std::string_view("C:/source/root")));
   EXPECT_EQ("../../../../path/to/foo",
             RebasePath("/C:/path/to/foo", SourceDir("//a/b"),
-                       base::StringPiece("/c:/source/root")));
+                       std::string_view("/c:/source/root")));
   EXPECT_EQ("../../../../path/to/foo",
             RebasePath("/c:/path/to/foo", SourceDir("//a/b"),
-                       base::StringPiece("c:/source/root")));
+                       std::string_view("c:/source/root")));
   EXPECT_EQ("../../../../path/to/foo",
             RebasePath("/c:/path/to/foo", SourceDir("//a/b"),
-                       base::StringPiece("C:/source/root")));
+                       std::string_view("C:/source/root")));
 #endif
 }
 
diff --git a/tools/gn/function_foreach.cc b/tools/gn/function_foreach.cc
index 24ffaab..ec9070f 100644
--- a/tools/gn/function_foreach.cc
+++ b/tools/gn/function_foreach.cc
@@ -62,7 +62,7 @@
         Err(args_vector[0].get(), "Expected an identifier for the loop var.");
     return Value();
   }
-  base::StringPiece loop_var(identifier->value().value());
+  std::string_view loop_var(identifier->value().value());
 
   // Extract the list to iterate over. Always copy in case the code changes
   // the list variable inside the loop.
diff --git a/tools/gn/function_forward_variables_from.cc b/tools/gn/function_forward_variables_from.cc
index 875af91..0366381 100644
--- a/tools/gn/function_forward_variables_from.cc
+++ b/tools/gn/function_forward_variables_from.cc
@@ -43,9 +43,10 @@
     if (value) {
       // Use the storage key for the original value rather than the string in
       // "cur" because "cur" is a temporary that will be deleted, and Scopes
-      // expect a persistent StringPiece (it won't copy). Not doing this will
-      // lead the scope's key to point to invalid memory after this returns.
-      base::StringPiece storage_key = source->GetStorageKey(cur.string_value());
+      // expect a persistent std::string_view (it won't copy). Not doing this
+      // will lead the scope's key to point to invalid memory after this
+      // returns.
+      std::string_view storage_key = source->GetStorageKey(cur.string_value());
       if (storage_key.empty()) {
         // Programmatic value, don't allow copying.
         *err =
diff --git a/tools/gn/function_get_path_info.cc b/tools/gn/function_get_path_info.cc
index b392490..6e87a57 100644
--- a/tools/gn/function_get_path_info.cc
+++ b/tools/gn/function_get_path_info.cc
@@ -77,7 +77,7 @@
       return std::string(FindExtension(&input_string));
     }
     case WHAT_DIR: {
-      base::StringPiece dir_incl_slash = FindDir(&input_string);
+      std::string_view dir_incl_slash = FindDir(&input_string);
       if (dir_incl_slash.empty())
         return std::string(".");
       // Trim slash since this function doesn't return trailing slashes. The
diff --git a/tools/gn/functions.cc b/tools/gn/functions.cc
index c0a64ac..74b48bc 100644
--- a/tools/gn/functions.cc
+++ b/tools/gn/functions.cc
@@ -135,7 +135,7 @@
 
   // Set the target name variable to the current target, and mark it used
   // because we don't want to issue an error if the script ignores it.
-  const base::StringPiece target_name(variables::kTargetName);
+  const std::string_view target_name(variables::kTargetName);
   block_scope->SetValue(target_name, Value(function, args[0].string_value()),
                         function);
   block_scope->MarkUsed(target_name);
diff --git a/tools/gn/functions.h b/tools/gn/functions.h
index 9dc2cdc..4119571 100644
--- a/tools/gn/functions.h
+++ b/tools/gn/functions.h
@@ -7,10 +7,9 @@
 
 #include <map>
 #include <string>
+#include <string_view>
 #include <vector>
 
-#include "base/strings/string_piece.h"
-
 class Err;
 class BlockNode;
 class FunctionCallNode;
@@ -433,7 +432,7 @@
   bool is_target;
 };
 
-typedef std::map<base::StringPiece, FunctionInfo> FunctionInfoMap;
+typedef std::map<std::string_view, FunctionInfo> FunctionInfoMap;
 
 // Returns the mapping of all built-in functions.
 const FunctionInfoMap& GetFunctions();
diff --git a/tools/gn/generated_file_target_generator.cc b/tools/gn/generated_file_target_generator.cc
index 023e5d4..35e0db4 100644
--- a/tools/gn/generated_file_target_generator.cc
+++ b/tools/gn/generated_file_target_generator.cc
@@ -68,7 +68,7 @@
 }
 
 bool GeneratedFileTargetGenerator::IsMetadataCollectionTarget(
-    const base::StringPiece& variable,
+    const std::string_view& variable,
     const ParseNode* origin) {
   if (contents_defined_) {
     *err_ =
diff --git a/tools/gn/generated_file_target_generator.h b/tools/gn/generated_file_target_generator.h
index 206555f..cdcea14 100644
--- a/tools/gn/generated_file_target_generator.h
+++ b/tools/gn/generated_file_target_generator.h
@@ -35,7 +35,7 @@
   // it is okay to set metadata collection variables on this target.
   //
   // Should be called before FillContents().
-  bool IsMetadataCollectionTarget(const base::StringPiece& variable,
+  bool IsMetadataCollectionTarget(const std::string_view& variable,
                                   const ParseNode* origin);
 
   bool contents_defined_ = false;
diff --git a/tools/gn/header_checker.cc b/tools/gn/header_checker.cc
index 14784b7..f4af9d8 100644
--- a/tools/gn/header_checker.cc
+++ b/tools/gn/header_checker.cc
@@ -244,7 +244,7 @@
 }
 
 SourceFile HeaderChecker::SourceFileForInclude(
-    const base::StringPiece& relative_file_path,
+    const std::string_view& relative_file_path,
     const std::vector<SourceDir>& include_dirs,
     const InputFile& source_file,
     const LocationRange& range,
@@ -308,7 +308,7 @@
 
   size_t error_count_before = errors->size();
   CIncludeIterator iter(&input_file);
-  base::StringPiece current_include;
+  std::string_view current_include;
   LocationRange range;
 
   std::set<std::pair<const Target*, const Target*>> no_dependency_cache;
diff --git a/tools/gn/header_checker.h b/tools/gn/header_checker.h
index 3932001..8e73c19 100644
--- a/tools/gn/header_checker.h
+++ b/tools/gn/header_checker.h
@@ -9,13 +9,13 @@
 #include <map>
 #include <mutex>
 #include <set>
+#include <string_view>
 #include <vector>
 
 #include "base/atomic_ref_count.h"
 #include "base/gtest_prod_util.h"
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
-#include "base/strings/string_piece.h"
 #include "tools/gn/err.h"
 #include "tools/gn/source_dir.h"
 
@@ -112,7 +112,7 @@
   bool IsFileInOuputDir(const SourceFile& file) const;
 
   // Resolves the contents of an include to a SourceFile.
-  SourceFile SourceFileForInclude(const base::StringPiece& relative_file_path,
+  SourceFile SourceFileForInclude(const std::string_view& relative_file_path,
                                   const std::vector<SourceDir>& include_dirs,
                                   const InputFile& source_file,
                                   const LocationRange& range,
diff --git a/tools/gn/input_conversion.cc b/tools/gn/input_conversion.cc
index 270d437..d2acb71 100644
--- a/tools/gn/input_conversion.cc
+++ b/tools/gn/input_conversion.cc
@@ -107,7 +107,7 @@
   return ret;
 }
 
-bool IsIdentifier(const base::StringPiece& buffer) {
+bool IsIdentifier(const std::string_view& buffer) {
   DCHECK(buffer.size() > 0);
   if (!Tokenizer::IsIdentifierFirstChar(buffer[0]))
     return false;
@@ -146,14 +146,13 @@
         }
         // Search for the key in the input file. We know it's present because
         // it was parsed by the JSON reader, but we need its location to
-        // construct a StringPiece that can be used as key in the Scope.
+        // construct a std::string_view that can be used as key in the Scope.
         size_t off = input_file->contents().find("\"" + it.first + "\"");
         if (off == std::string::npos) {
           *err = Err(origin, "Invalid encoding \"" + it.first + "\".");
           return Value();
         }
-        base::StringPiece key(&input_file->contents()[off + 1],
-                              it.first.size());
+        std::string_view key(&input_file->contents()[off + 1], it.first.size());
         scope->SetValue(key, std::move(parsed_value), origin);
       }
       return Value(origin, std::move(scope));
diff --git a/tools/gn/label.cc b/tools/gn/label.cc
index 22b6f81..e5a1148 100644
--- a/tools/gn/label.cc
+++ b/tools/gn/label.cc
@@ -29,7 +29,7 @@
 // used. The value is used only for generating error messages.
 bool ComputeBuildLocationFromDep(const Value& input_value,
                                  const SourceDir& current_dir,
-                                 const base::StringPiece& input,
+                                 const std::string_view& input,
                                  SourceDir* result,
                                  Err* err) {
   // No rule, use the current location.
@@ -48,7 +48,7 @@
 // error messages.
 bool ComputeTargetNameFromDep(const Value& input_value,
                               const SourceDir& computed_location,
-                              const base::StringPiece& input,
+                              const std::string_view& input,
                               std::string* result,
                               Err* err) {
   if (!input.empty()) {
@@ -88,13 +88,14 @@
 bool Resolve(const SourceDir& current_dir,
              const Label& current_toolchain,
              const Value& original_value,
-             const base::StringPiece& input,
+             const std::string_view& input,
              SourceDir* out_dir,
              std::string* out_name,
              SourceDir* out_toolchain_dir,
              std::string* out_toolchain_name,
              Err* err) {
-  // To workaround the problem that StringPiece operator[] doesn't return a ref.
+  // To workaround the problem that std::string_view operator[] doesn't return a
+  // ref.
   const char* input_str = input.data();
   size_t offset = 0;
 #if defined(OS_WIN)
@@ -110,19 +111,19 @@
   }
 #endif
   size_t path_separator = input.find_first_of(":(", offset);
-  base::StringPiece location_piece;
-  base::StringPiece name_piece;
-  base::StringPiece toolchain_piece;
+  std::string_view location_piece;
+  std::string_view name_piece;
+  std::string_view toolchain_piece;
   if (path_separator == std::string::npos) {
     location_piece = input;
     // Leave name & toolchain piece null.
   } else {
-    location_piece = base::StringPiece(&input_str[0], path_separator);
+    location_piece = std::string_view(&input_str[0], path_separator);
 
     size_t toolchain_separator = input.find('(', path_separator);
     if (toolchain_separator == std::string::npos) {
-      name_piece = base::StringPiece(&input_str[path_separator + 1],
-                                     input.size() - path_separator - 1);
+      name_piece = std::string_view(&input_str[path_separator + 1],
+                                    input.size() - path_separator - 1);
       // Leave location piece null.
     } else if (!out_toolchain_dir) {
       // Toolchain specified but not allows in this context.
@@ -135,9 +136,8 @@
       // Name piece is everything between the two separators. Note that the
       // separators may be the same (e.g. "//foo(bar)" which means empty name.
       if (toolchain_separator > path_separator) {
-        name_piece =
-            base::StringPiece(&input_str[path_separator + 1],
-                              toolchain_separator - path_separator - 1);
+        name_piece = std::string_view(&input_str[path_separator + 1],
+                                      toolchain_separator - path_separator - 1);
       }
 
       // Toolchain name should end in a ) and this should be the end of the
@@ -151,8 +151,8 @@
 
       // Subtract off the two parens to just get the toolchain name.
       toolchain_piece =
-          base::StringPiece(&input_str[toolchain_separator + 1],
-                            input.size() - toolchain_separator - 2);
+          std::string_view(&input_str[toolchain_separator + 1],
+                           input.size() - toolchain_separator - 2);
     }
   }
 
@@ -251,15 +251,15 @@
 )*";
 
 Label::Label(const SourceDir& dir,
-             const base::StringPiece& name,
+             const std::string_view& name,
              const SourceDir& toolchain_dir,
-             const base::StringPiece& toolchain_name)
+             const std::string_view& toolchain_name)
     : dir_(dir), toolchain_dir_(toolchain_dir) {
   name_.assign(name.data(), name.size());
   toolchain_name_.assign(toolchain_name.data(), toolchain_name.size());
 }
 
-Label::Label(const SourceDir& dir, const base::StringPiece& name) : dir_(dir) {
+Label::Label(const SourceDir& dir, const std::string_view& name) : dir_(dir) {
   name_.assign(name.data(), name.size());
 }
 
diff --git a/tools/gn/label.h b/tools/gn/label.h
index 44f6e40..9fd245f 100644
--- a/tools/gn/label.h
+++ b/tools/gn/label.h
@@ -24,12 +24,12 @@
   // Makes a label given an already-separated out path and name.
   // See also Resolve().
   Label(const SourceDir& dir,
-        const base::StringPiece& name,
+        const std::string_view& name,
         const SourceDir& toolchain_dir,
-        const base::StringPiece& toolchain_name);
+        const std::string_view& toolchain_name);
 
   // Makes a label with an empty toolchain.
-  Label(const SourceDir& dir, const base::StringPiece& name);
+  Label(const SourceDir& dir, const std::string_view& name);
 
   // Resolves a string from a build file that may be relative to the
   // current directory into a fully qualified label. On failure returns an
diff --git a/tools/gn/label_pattern.cc b/tools/gn/label_pattern.cc
index bed4d86..b69cfe4 100644
--- a/tools/gn/label_pattern.cc
+++ b/tools/gn/label_pattern.cc
@@ -53,7 +53,7 @@
 
 LabelPattern::LabelPattern(Type type,
                            const SourceDir& dir,
-                           const base::StringPiece& name,
+                           const std::string_view& name,
                            const Label& toolchain_label)
     : toolchain_(toolchain_label), type_(type), dir_(dir), name_(name) {}
 
@@ -68,7 +68,7 @@
   if (!value.VerifyTypeIs(Value::STRING, err))
     return LabelPattern();
 
-  base::StringPiece str(value.string_value());
+  std::string_view str(value.string_value());
   if (str.empty()) {
     *err = Err(value, "Label pattern must not be empty.");
     return LabelPattern();
@@ -120,8 +120,8 @@
   }
 
   // Extract path and name.
-  base::StringPiece path;
-  base::StringPiece name;
+  std::string_view path;
+  std::string_view name;
   size_t offset = 0;
 #if defined(OS_WIN)
   if (IsPathAbsolute(str)) {
@@ -136,7 +136,7 @@
 #endif
   size_t colon = str.find(':', offset);
   if (colon == std::string::npos) {
-    path = base::StringPiece(str);
+    path = std::string_view(str);
   } else {
     path = str.substr(0, colon);
     name = str.substr(colon + 1);
@@ -173,7 +173,7 @@
   // Resolve the part of the path that's not the wildcard.
   if (!path.empty()) {
     // The non-wildcard stuff better not have a wildcard.
-    if (path.find('*') != base::StringPiece::npos) {
+    if (path.find('*') != std::string_view::npos) {
       *err = Err(value, "Label patterns only support wildcard suffixes.",
                  "The pattern contained a '*' that wasn't at the end.");
       return LabelPattern();
@@ -207,7 +207,7 @@
   }
 
   // When we're doing wildcard matching, the name is always empty.
-  return LabelPattern(type, dir, base::StringPiece(), toolchain_label);
+  return LabelPattern(type, dir, std::string_view(), toolchain_label);
 }
 
 bool LabelPattern::HasWildcard(const std::string& str) {
diff --git a/tools/gn/label_pattern.h b/tools/gn/label_pattern.h
index 231fd6d..675d328 100644
--- a/tools/gn/label_pattern.h
+++ b/tools/gn/label_pattern.h
@@ -5,7 +5,8 @@
 #ifndef TOOLS_GN_LABEL_PATTERN_H_
 #define TOOLS_GN_LABEL_PATTERN_H_
 
-#include "base/strings/string_piece.h"
+#include <string_view>
+
 #include "tools/gn/label.h"
 #include "tools/gn/source_dir.h"
 
@@ -29,7 +30,7 @@
   LabelPattern();
   LabelPattern(Type type,
                const SourceDir& dir,
-               const base::StringPiece& name,
+               const std::string_view& name,
                const Label& toolchain_label);
   LabelPattern(const LabelPattern& other);
   ~LabelPattern();
diff --git a/tools/gn/lib_file.cc b/tools/gn/lib_file.cc
index 81e54fb..50295ac 100644
--- a/tools/gn/lib_file.cc
+++ b/tools/gn/lib_file.cc
@@ -8,7 +8,7 @@
 
 LibFile::LibFile(const SourceFile& source_file) : source_file_(source_file) {}
 
-LibFile::LibFile(const base::StringPiece& lib_name)
+LibFile::LibFile(const std::string_view& lib_name)
     : name_(lib_name.data(), lib_name.size()) {
   DCHECK(!lib_name.empty());
 }
diff --git a/tools/gn/lib_file.h b/tools/gn/lib_file.h
index 58621eb..b971ad6 100644
--- a/tools/gn/lib_file.h
+++ b/tools/gn/lib_file.h
@@ -9,8 +9,8 @@
 
 #include <algorithm>
 #include <string>
+#include <string_view>
 
-#include "base/strings/string_piece.h"
 #include "tools/gn/source_file.h"
 
 // Represents an entry in "libs" list. Can be either a path (a SourceFile) or
@@ -19,7 +19,7 @@
  public:
   LibFile() = default;
 
-  explicit LibFile(const base::StringPiece& lib_name);
+  explicit LibFile(const std::string_view& lib_name);
   explicit LibFile(const SourceFile& source_file);
 
   bool is_source_file() const { return name_.empty(); }
diff --git a/tools/gn/metadata_unittest.cc b/tools/gn/metadata_unittest.cc
index 901e539..683e65f 100644
--- a/tools/gn/metadata_unittest.cc
+++ b/tools/gn/metadata_unittest.cc
@@ -17,8 +17,8 @@
   b_expected.list_value().push_back(Value(nullptr, true));
 
   Metadata::Contents contents;
-  contents.insert(std::pair<base::StringPiece, Value>("a", a_expected));
-  contents.insert(std::pair<base::StringPiece, Value>("b", b_expected));
+  contents.insert(std::pair<std::string_view, Value>("a", a_expected));
+  contents.insert(std::pair<std::string_view, Value>("b", b_expected));
 
   metadata.set_contents(std::move(contents));
 
@@ -41,7 +41,7 @@
   a_expected.list_value().push_back(Value(nullptr, "bar.h"));
 
   metadata.contents().insert(
-      std::pair<base::StringPiece, Value>("a", a_expected));
+      std::pair<std::string_view, Value>("a", a_expected));
 
   std::vector<std::string> data_keys;
   data_keys.emplace_back("a");
@@ -75,7 +75,7 @@
   a_expected.list_value().push_back(Value(nullptr, "foo/bar.h"));
 
   metadata.contents().insert(
-      std::pair<base::StringPiece, Value>("a", a_expected));
+      std::pair<std::string_view, Value>("a", a_expected));
 
   std::vector<std::string> data_keys;
   data_keys.emplace_back("a");
@@ -117,7 +117,7 @@
   inner_scope.SetScopeValue(std::move(scope));
   a.list_value().push_back(inner_scope);
 
-  metadata.contents().insert(std::pair<base::StringPiece, Value>("a", a));
+  metadata.contents().insert(std::pair<std::string_view, Value>("a", a));
   std::vector<std::string> data_keys;
   data_keys.emplace_back("a");
   std::vector<std::string> walk_keys;
@@ -162,7 +162,7 @@
   a_expected.list_value().push_back(Value(nullptr, "//target"));
 
   metadata.contents().insert(
-      std::pair<base::StringPiece, Value>("a", a_expected));
+      std::pair<std::string_view, Value>("a", a_expected));
 
   std::vector<std::string> data_keys;
   std::vector<std::string> walk_keys;
@@ -213,7 +213,7 @@
   a_expected.list_value().push_back(Value(nullptr, "//target"));
 
   metadata.contents().insert(
-      std::pair<base::StringPiece, Value>("a", a_expected));
+      std::pair<std::string_view, Value>("a", a_expected));
 
   std::vector<std::string> data_keys;
   std::vector<std::string> walk_keys;
diff --git a/tools/gn/metadata_walk_unittest.cc b/tools/gn/metadata_walk_unittest.cc
index a18a07e..04f7cd1 100644
--- a/tools/gn/metadata_walk_unittest.cc
+++ b/tools/gn/metadata_walk_unittest.cc
@@ -17,12 +17,12 @@
   Value a_expected(nullptr, Value::LIST);
   a_expected.list_value().push_back(Value(nullptr, "foo"));
   one.metadata().contents().insert(
-      std::pair<base::StringPiece, Value>("a", a_expected));
+      std::pair<std::string_view, Value>("a", a_expected));
 
   Value b_expected(nullptr, Value::LIST);
   b_expected.list_value().push_back(Value(nullptr, true));
   one.metadata().contents().insert(
-      std::pair<base::StringPiece, Value>("b", b_expected));
+      std::pair<std::string_view, Value>("b", b_expected));
 
   one.metadata().set_source_dir(SourceDir("/usr/home/files/"));
 
@@ -30,12 +30,12 @@
   Value a_2_expected(nullptr, Value::LIST);
   a_2_expected.list_value().push_back(Value(nullptr, "bar"));
   two.metadata().contents().insert(
-      std::pair<base::StringPiece, Value>("a", a_2_expected));
+      std::pair<std::string_view, Value>("a", a_2_expected));
 
   Value b_2_expected(nullptr, Value::LIST);
   b_2_expected.list_value().push_back(Value(nullptr, false));
   two.metadata().contents().insert(
-      std::pair<base::StringPiece, Value>("b", b_2_expected));
+      std::pair<std::string_view, Value>("b", b_2_expected));
 
   two.metadata().set_source_dir(SourceDir("/usr/home/files/inner"));
 
@@ -75,18 +75,18 @@
   Value a_expected(nullptr, Value::LIST);
   a_expected.list_value().push_back(Value(nullptr, "foo"));
   one.metadata().contents().insert(
-      std::pair<base::StringPiece, Value>("a", a_expected));
+      std::pair<std::string_view, Value>("a", a_expected));
 
   Value b_expected(nullptr, Value::LIST);
   b_expected.list_value().push_back(Value(nullptr, true));
   one.metadata().contents().insert(
-      std::pair<base::StringPiece, Value>("b", b_expected));
+      std::pair<std::string_view, Value>("b", b_expected));
 
   TestTarget two(setup, "//foo:two", Target::SOURCE_SET);
   Value a_2_expected(nullptr, Value::LIST);
   a_2_expected.list_value().push_back(Value(nullptr, "bar"));
   two.metadata().contents().insert(
-      std::pair<base::StringPiece, Value>("a", a_2_expected));
+      std::pair<std::string_view, Value>("a", a_2_expected));
 
   one.public_deps().push_back(LabelTargetPair(&two));
 
@@ -124,25 +124,25 @@
   Value a_expected(nullptr, Value::LIST);
   a_expected.list_value().push_back(Value(nullptr, "foo"));
   one.metadata().contents().insert(
-      std::pair<base::StringPiece, Value>("a", a_expected));
+      std::pair<std::string_view, Value>("a", a_expected));
 
   Value walk_expected(nullptr, Value::LIST);
   walk_expected.list_value().push_back(
       Value(nullptr, "//foo:two(//toolchain:default)"));
   one.metadata().contents().insert(
-      std::pair<base::StringPiece, Value>("walk", walk_expected));
+      std::pair<std::string_view, Value>("walk", walk_expected));
 
   TestTarget two(setup, "//foo:two", Target::SOURCE_SET);
   Value a_2_expected(nullptr, Value::LIST);
   a_2_expected.list_value().push_back(Value(nullptr, "bar"));
   two.metadata().contents().insert(
-      std::pair<base::StringPiece, Value>("a", a_2_expected));
+      std::pair<std::string_view, Value>("a", a_2_expected));
 
   TestTarget three(setup, "//foo:three", Target::SOURCE_SET);
   Value a_3_expected(nullptr, Value::LIST);
   a_3_expected.list_value().push_back(Value(nullptr, "baz"));
   three.metadata().contents().insert(
-      std::pair<base::StringPiece, Value>("a", a_3_expected));
+      std::pair<std::string_view, Value>("a", a_3_expected));
 
   one.public_deps().push_back(LabelTargetPair(&two));
   one.public_deps().push_back(LabelTargetPair(&three));
@@ -180,12 +180,12 @@
   Value a_expected(nullptr, Value::LIST);
   a_expected.list_value().push_back(Value(nullptr, "foo"));
   one.metadata().contents().insert(
-      std::pair<base::StringPiece, Value>("a", a_expected));
+      std::pair<std::string_view, Value>("a", a_expected));
 
   Value walk_expected(nullptr, Value::LIST);
   walk_expected.list_value().push_back(Value(nullptr, "//foo:missing"));
   one.metadata().contents().insert(
-      std::pair<base::StringPiece, Value>("walk", walk_expected));
+      std::pair<std::string_view, Value>("walk", walk_expected));
 
   UniqueVector<const Target*> targets;
   targets.push_back(&one);
diff --git a/tools/gn/operators.cc b/tools/gn/operators.cc
index 24b17c0..ab77782 100644
--- a/tools/gn/operators.cc
+++ b/tools/gn/operators.cc
@@ -101,7 +101,7 @@
   }
 
   // Known to be an accessor.
-  base::StringPiece base_str = dest_accessor->base().value();
+  std::string_view base_str = dest_accessor->base().value();
   Value* base =
       exec_scope->GetMutableValue(base_str, Scope::SEARCH_CURRENT, false);
   if (!base) {
diff --git a/tools/gn/output_conversion_unittest.cc b/tools/gn/output_conversion_unittest.cc
index 2e4146d..ad6ea80 100644
--- a/tools/gn/output_conversion_unittest.cc
+++ b/tools/gn/output_conversion_unittest.cc
@@ -100,7 +100,7 @@
   // Add some values to the scope.
   Value value(nullptr, "hello");
   new_scope->SetValue("v", value, nullptr);
-  base::StringPiece private_var_name("_private");
+  std::string_view private_var_name("_private");
   new_scope->SetValue(private_var_name, value, nullptr);
 
   std::ostringstream result;
@@ -164,7 +164,7 @@
   // Add some values to the scope.
   Value value(nullptr, "hello");
   new_scope->SetValue("v", value, nullptr);
-  base::StringPiece private_var_name("_private");
+  std::string_view private_var_name("_private");
   new_scope->SetValue(private_var_name, value, nullptr);
 
   std::ostringstream result;
diff --git a/tools/gn/parse_tree.cc b/tools/gn/parse_tree.cc
index 337b3b2..b49fae7 100644
--- a/tools/gn/parse_tree.cc
+++ b/tools/gn/parse_tree.cc
@@ -36,7 +36,7 @@
   DEPS_CATEGORY_OTHER,
 };
 
-DepsCategory GetDepsCategory(base::StringPiece deps) {
+DepsCategory GetDepsCategory(std::string_view deps) {
   if (deps.length() < 2 || deps[0] != '"' || deps[deps.size() - 1] != '"')
     return DEPS_CATEGORY_OTHER;
 
@@ -49,19 +49,19 @@
   return DEPS_CATEGORY_RELATIVE;
 }
 
-std::tuple<base::StringPiece, base::StringPiece> SplitAtFirst(
-    base::StringPiece str,
+std::tuple<std::string_view, std::string_view> SplitAtFirst(
+    std::string_view str,
     char c) {
   if (!base::StartsWith(str, "\"", base::CompareCase::SENSITIVE) ||
       !base::EndsWith(str, "\"", base::CompareCase::SENSITIVE))
-    return std::make_tuple(str, base::StringPiece());
+    return std::make_tuple(str, std::string_view());
 
   str = str.substr(1, str.length() - 2);
   size_t index_of_first = str.find(c);
   return std::make_tuple(str.substr(0, index_of_first),
-                         index_of_first != base::StringPiece::npos
+                         index_of_first != std::string_view::npos
                              ? str.substr(index_of_first + 1)
-                             : base::StringPiece());
+                             : std::string_view());
 }
 
 bool IsSortRangeSeparator(const ParseNode* node, const ParseNode* prev) {
@@ -74,7 +74,7 @@
                static_cast<int>(node->comments()->before().size() + 1)));
 }
 
-base::StringPiece GetStringRepresentation(const ParseNode* node) {
+std::string_view GetStringRepresentation(const ParseNode* node) {
   DCHECK(node->AsLiteral() || node->AsIdentifier() || node->AsAccessor());
   if (node->AsLiteral())
     return node->AsLiteral()->value().value();
@@ -82,7 +82,7 @@
     return node->AsIdentifier()->value().value();
   else if (node->AsAccessor())
     return node->AsAccessor()->base().value();
-  return base::StringPiece();
+  return std::string_view();
 }
 
 }  // namespace
@@ -148,7 +148,7 @@
 }
 
 base::Value ParseNode::CreateJSONNode(const char* type,
-                                      const base::StringPiece& value) const {
+                                      const std::string_view& value) const {
   base::Value dict(base::Value::Type::DICTIONARY);
   dict.SetKey(kJsonNodeType, base::Value(type));
   dict.SetKey(kJsonNodeValue, base::Value(value));
@@ -712,8 +712,8 @@
 void ListNode::SortAsStringsList() {
   // Sorts alphabetically.
   SortList([](const ParseNode* a, const ParseNode* b) {
-    base::StringPiece astr = GetStringRepresentation(a);
-    base::StringPiece bstr = GetStringRepresentation(b);
+    std::string_view astr = GetStringRepresentation(a);
+    std::string_view bstr = GetStringRepresentation(b);
     return astr < bstr;
   });
 }
@@ -722,8 +722,8 @@
   // Sorts first relative targets, then absolute, each group is sorted
   // alphabetically.
   SortList([](const ParseNode* a, const ParseNode* b) {
-    base::StringPiece astr = GetStringRepresentation(a);
-    base::StringPiece bstr = GetStringRepresentation(b);
+    std::string_view astr = GetStringRepresentation(a);
+    std::string_view bstr = GetStringRepresentation(b);
     return std::make_pair(GetDepsCategory(astr), SplitAtFirst(astr, ':')) <
            std::make_pair(GetDepsCategory(bstr), SplitAtFirst(bstr, ':'));
   });
@@ -807,7 +807,7 @@
     case Token::FALSE_TOKEN:
       return Value(this, false);
     case Token::INTEGER: {
-      base::StringPiece s = value_.value();
+      std::string_view s = value_.value();
       if ((base::StartsWith(s, "0", base::CompareCase::SENSITIVE) &&
            s.size() > 1) ||
           base::StartsWith(s, "-0", base::CompareCase::SENSITIVE)) {
diff --git a/tools/gn/parse_tree.h b/tools/gn/parse_tree.h
index 6c61b72..82a5071 100644
--- a/tools/gn/parse_tree.h
+++ b/tools/gn/parse_tree.h
@@ -112,8 +112,8 @@
   // Helper functions for GetJSONNode. Creates and fills a Value object with
   // given type (and value).
   base::Value CreateJSONNode(const char* type) const;
-  base::Value CreateJSONNode(const char* type, const base::StringPiece& value)
-      const;
+  base::Value CreateJSONNode(const char* type,
+                             const std::string_view& value) const;
 
  private:
   // Helper function for CreateJSONNode.
diff --git a/tools/gn/parser.cc b/tools/gn/parser.cc
index ea498a4..b65a5de 100644
--- a/tools/gn/parser.cc
+++ b/tools/gn/parser.cc
@@ -290,7 +290,7 @@
 };
 
 Parser::Parser(const std::vector<Token>& tokens, Err* err)
-    : invalid_token_(Location(), Token::INVALID, base::StringPiece()),
+    : invalid_token_(Location(), Token::INVALID, std::string_view()),
       err_(err),
       cur_(0) {
   for (const auto& token : tokens) {
diff --git a/tools/gn/path_output.cc b/tools/gn/path_output.cc
index 0f57997..8da480a 100644
--- a/tools/gn/path_output.cc
+++ b/tools/gn/path_output.cc
@@ -11,7 +11,7 @@
 #include "util/build_config.h"
 
 PathOutput::PathOutput(const SourceDir& current_dir,
-                       const base::StringPiece& source_root,
+                       const std::string_view& source_root,
                        EscapingMode escaping)
     : current_dir_(current_dir) {
   inverse_current_dir_ = RebasePath("//", current_dir, source_root);
@@ -65,7 +65,7 @@
   } else {
     // DIR_NO_LAST_SLASH mode, just trim the last char.
     WritePathStr(out,
-                 base::StringPiece(dir.value().data(), dir.value().size() - 1));
+                 std::string_view(dir.value().data(), dir.value().size() - 1));
   }
 }
 
@@ -104,8 +104,7 @@
           file.value()[file.value().size() - 1] == '/') {
         // Trim trailing slash.
         EscapeStringToStream(
-            out,
-            base::StringPiece(file.value().data(), file.value().size() - 1),
+            out, std::string_view(file.value().data(), file.value().size() - 1),
             options_);
       } else {
         // Doesn't end with a slash, write the whole thing.
@@ -122,7 +121,7 @@
 }
 
 void PathOutput::WriteSourceRelativeString(std::ostream& out,
-                                           const base::StringPiece& str) const {
+                                           const std::string_view& str) const {
   if (options_.mode == ESCAPE_NINJA_COMMAND) {
     // Shell escaping needs an intermediate string since it may end up
     // quoting the whole thing.
@@ -133,7 +132,7 @@
     intermediate.append(str.data(), str.size());
 
     EscapeStringToStream(
-        out, base::StringPiece(intermediate.c_str(), intermediate.size()),
+        out, std::string_view(intermediate.c_str(), intermediate.size()),
         options_);
   } else {
     // Ninja (and none) escaping can avoid the intermediate string and
@@ -144,11 +143,11 @@
 }
 
 void PathOutput::WritePathStr(std::ostream& out,
-                              const base::StringPiece& str) const {
+                              const std::string_view& str) const {
   DCHECK(str.size() > 0 && str[0] == '/');
 
   if (str.substr(0, current_dir_.value().size()) ==
-      base::StringPiece(current_dir_.value())) {
+      std::string_view(current_dir_.value())) {
     // The current dir is a prefix of the output file, so we can strip the
     // prefix and write out the result.
     EscapeStringToStream(out, str.substr(current_dir_.value().size()),
diff --git a/tools/gn/path_output.h b/tools/gn/path_output.h
index 1d98a2c..21c4cc4 100644
--- a/tools/gn/path_output.h
+++ b/tools/gn/path_output.h
@@ -7,9 +7,9 @@
 
 #include <iosfwd>
 #include <string>
+#include <string_view>
 
 #include "base/macros.h"
-#include "base/strings/string_piece.h"
 #include "tools/gn/escape.h"
 #include "tools/gn/source_dir.h"
 #include "tools/gn/unique_vector.h"
@@ -35,7 +35,7 @@
   };
 
   PathOutput(const SourceDir& current_dir,
-             const base::StringPiece& source_root,
+             const std::string_view& source_root,
              EscapingMode escaping);
   ~PathOutput();
 
@@ -71,13 +71,13 @@
 
   // Backend for WriteFile and WriteDir. This appends the given file or
   // directory string to the file.
-  void WritePathStr(std::ostream& out, const base::StringPiece& str) const;
+  void WritePathStr(std::ostream& out, const std::string_view& str) const;
 
  private:
   // Takes the given string and writes it out, appending to the inverse
   // current dir. This assumes leading slashes have been trimmed.
   void WriteSourceRelativeString(std::ostream& out,
-                                 const base::StringPiece& str) const;
+                                 const std::string_view& str) const;
 
   SourceDir current_dir_;
 
diff --git a/tools/gn/path_output_unittest.cc b/tools/gn/path_output_unittest.cc
index 8857fd9..190647a 100644
--- a/tools/gn/path_output_unittest.cc
+++ b/tools/gn/path_output_unittest.cc
@@ -14,7 +14,7 @@
 
 TEST(PathOutput, Basic) {
   SourceDir build_dir("//out/Debug/");
-  base::StringPiece source_root("/source/root");
+  std::string_view source_root("/source/root");
   PathOutput writer(build_dir, source_root, ESCAPE_NONE);
   {
     // Normal source-root path.
@@ -56,7 +56,7 @@
 // Same as basic but the output dir is the root.
 TEST(PathOutput, BasicInRoot) {
   SourceDir build_dir("//");
-  base::StringPiece source_root("/source/root");
+  std::string_view source_root("/source/root");
   PathOutput writer(build_dir, source_root, ESCAPE_NONE);
   {
     // Normal source-root path.
@@ -74,7 +74,7 @@
 
 TEST(PathOutput, NinjaEscaping) {
   SourceDir build_dir("//out/Debug/");
-  base::StringPiece source_root("/source/root");
+  std::string_view source_root("/source/root");
   PathOutput writer(build_dir, source_root, ESCAPE_NINJA);
   {
     // Spaces and $ in filenames.
@@ -92,7 +92,7 @@
 
 TEST(PathOutput, NinjaForkEscaping) {
   SourceDir build_dir("//out/Debug/");
-  base::StringPiece source_root("/source/root");
+  std::string_view source_root("/source/root");
   PathOutput writer(build_dir, source_root, ESCAPE_NINJA_COMMAND);
 
   // Spaces in filenames should get quoted on Windows.
@@ -145,7 +145,7 @@
 
 TEST(PathOutput, InhibitQuoting) {
   SourceDir build_dir("//out/Debug/");
-  base::StringPiece source_root("/source/root");
+  std::string_view source_root("/source/root");
   PathOutput writer(build_dir, source_root, ESCAPE_NINJA_COMMAND);
   writer.set_inhibit_quoting(true);
 
@@ -169,7 +169,7 @@
 TEST(PathOutput, WriteDir) {
   {
     SourceDir build_dir("//out/Debug/");
-    base::StringPiece source_root("/source/root");
+    std::string_view source_root("/source/root");
     PathOutput writer(build_dir, source_root, ESCAPE_NINJA);
     {
       std::ostringstream out;
@@ -259,7 +259,7 @@
   }
   {
     // Empty build dir writer.
-    base::StringPiece source_root("/source/root");
+    std::string_view source_root("/source/root");
     PathOutput root_writer(SourceDir("//"), source_root, ESCAPE_NINJA);
     {
       std::ostringstream out;
diff --git a/tools/gn/scope.cc b/tools/gn/scope.cc
index 40d4a86..793f1a8 100644
--- a/tools/gn/scope.cc
+++ b/tools/gn/scope.cc
@@ -21,7 +21,7 @@
 // Returns true if this variable name should be considered private. Private
 // values start with an underscore, and are not imported from "gni" files
 // when processing an import.
-bool IsPrivateVar(const base::StringPiece& name) {
+bool IsPrivateVar(const std::string_view& name) {
   return name.empty() || name[0] == '_';
 }
 
@@ -74,13 +74,13 @@
   return !values_.empty();
 }
 
-const Value* Scope::GetValue(const base::StringPiece& ident,
+const Value* Scope::GetValue(const std::string_view& ident,
                              bool counts_as_used) {
   const Scope* found_in_scope = nullptr;
   return GetValueWithScope(ident, counts_as_used, &found_in_scope);
 }
 
-const Value* Scope::GetValueWithScope(const base::StringPiece& ident,
+const Value* Scope::GetValueWithScope(const std::string_view& ident,
                                       bool counts_as_used,
                                       const Scope** found_in_scope) {
   // First check for programmatically-provided values.
@@ -110,7 +110,7 @@
   return nullptr;
 }
 
-Value* Scope::GetMutableValue(const base::StringPiece& ident,
+Value* Scope::GetMutableValue(const std::string_view& ident,
                               SearchNested search_mode,
                               bool counts_as_used) {
   // Don't do programmatic values, which are not mutable.
@@ -129,7 +129,7 @@
   return nullptr;
 }
 
-base::StringPiece Scope::GetStorageKey(const base::StringPiece& ident) const {
+std::string_view Scope::GetStorageKey(const std::string_view& ident) const {
   RecordMap::const_iterator found = values_.find(ident);
   if (found != values_.end())
     return found->first;
@@ -137,15 +137,15 @@
   // Search in parent scope.
   if (containing())
     return containing()->GetStorageKey(ident);
-  return base::StringPiece();
+  return std::string_view();
 }
 
-const Value* Scope::GetValue(const base::StringPiece& ident) const {
+const Value* Scope::GetValue(const std::string_view& ident) const {
   const Scope* found_in_scope = nullptr;
   return GetValueWithScope(ident, &found_in_scope);
 }
 
-const Value* Scope::GetValueWithScope(const base::StringPiece& ident,
+const Value* Scope::GetValueWithScope(const std::string_view& ident,
                                       const Scope** found_in_scope) const {
   RecordMap::const_iterator found = values_.find(ident);
   if (found != values_.end()) {
@@ -157,7 +157,7 @@
   return nullptr;
 }
 
-Value* Scope::SetValue(const base::StringPiece& ident,
+Value* Scope::SetValue(const std::string_view& ident,
                        Value v,
                        const ParseNode* set_node) {
   Record& r = values_[ident];  // Clears any existing value.
@@ -166,7 +166,7 @@
   return &r.value;
 }
 
-void Scope::RemoveIdentifier(const base::StringPiece& ident) {
+void Scope::RemoveIdentifier(const std::string_view& ident) {
   RecordMap::iterator found = values_.find(ident);
   if (found != values_.end())
     values_.erase(found);
@@ -177,7 +177,7 @@
   // currently backed by several different vendor-specific implementations and
   // I'm not sure if all of them support mutating while iterating. Since this
   // is not perf-critical, do the safe thing.
-  std::vector<base::StringPiece> to_remove;
+  std::vector<std::string_view> to_remove;
   for (const auto& cur : values_) {
     if (IsPrivateVar(cur.first))
       to_remove.push_back(cur.first);
@@ -203,7 +203,7 @@
   return nullptr;
 }
 
-void Scope::MarkUsed(const base::StringPiece& ident) {
+void Scope::MarkUsed(const std::string_view& ident) {
   RecordMap::iterator found = values_.find(ident);
   if (found == values_.end()) {
     NOTREACHED();
@@ -227,7 +227,7 @@
   }
 }
 
-void Scope::MarkUnused(const base::StringPiece& ident) {
+void Scope::MarkUnused(const std::string_view& ident) {
   RecordMap::iterator found = values_.find(ident);
   if (found == values_.end()) {
     NOTREACHED();
@@ -236,7 +236,7 @@
   found->second.used = false;
 }
 
-bool Scope::IsSetButUnused(const base::StringPiece& ident) const {
+bool Scope::IsSetButUnused(const std::string_view& ident) const {
   RecordMap::const_iterator found = values_.find(ident);
   if (found != values_.end()) {
     if (!found->second.used) {
@@ -298,7 +298,7 @@
                                 Err* err) const {
   // Values.
   for (const auto& pair : values_) {
-    const base::StringPiece& current_name = pair.first;
+    const std::string_view& current_name = pair.first;
     if (options.skip_private_vars && IsPrivateVar(current_name))
       continue;  // Skip this private var.
     if (!options.excluded_values.empty() &&
diff --git a/tools/gn/scope.h b/tools/gn/scope.h
index f7d70ca..962f5c3 100644
--- a/tools/gn/scope.h
+++ b/tools/gn/scope.h
@@ -38,7 +38,7 @@
 // variables. So you should use a non-const containing scope whenever possible.
 class Scope {
  public:
-  using KeyValueMap = std::map<base::StringPiece, Value>;
+  using KeyValueMap = std::map<std::string_view, Value>;
   // Holds an owning list of Items.
   using ItemVector = std::vector<std::unique_ptr<Item>>;
 
@@ -59,7 +59,7 @@
     // Returns a non-null value if the given value can be programmatically
     // generated, or NULL if there is none.
     virtual const Value* GetProgrammaticValue(
-        const base::StringPiece& ident) = 0;
+        const std::string_view& ident) = 0;
 
    protected:
     Scope* scope_;
@@ -135,11 +135,11 @@
   // found_in_scope is set to the scope that contains the definition of the
   // ident. If the value was provided programmatically (like host_cpu),
   // found_in_scope will be set to null.
-  const Value* GetValue(const base::StringPiece& ident, bool counts_as_used);
-  const Value* GetValue(const base::StringPiece& ident) const;
-  const Value* GetValueWithScope(const base::StringPiece& ident,
+  const Value* GetValue(const std::string_view& ident, bool counts_as_used);
+  const Value* GetValue(const std::string_view& ident) const;
+  const Value* GetValueWithScope(const std::string_view& ident,
                                  const Scope** found_in_scope) const;
-  const Value* GetValueWithScope(const base::StringPiece& ident,
+  const Value* GetValueWithScope(const std::string_view& ident,
                                  bool counts_as_used,
                                  const Scope** found_in_scope);
 
@@ -165,28 +165,28 @@
   //    }
   // The 6 should get set on the nested scope rather than modify the value
   // in the outer one.
-  Value* GetMutableValue(const base::StringPiece& ident,
+  Value* GetMutableValue(const std::string_view& ident,
                          SearchNested search_mode,
                          bool counts_as_used);
 
-  // Returns the StringPiece used to identify the value. This string piece
+  // Returns the std::string_view used to identify the value. This string piece
   // will have the same contents as "ident" passed in, but may point to a
-  // different underlying buffer. This is useful because this StringPiece is
-  // static and won't be deleted for the life of the program, so it can be used
-  // as keys in places that may outlive a temporary. It will return an empty
-  // string for programmatic and nonexistant values.
-  base::StringPiece GetStorageKey(const base::StringPiece& ident) const;
+  // different underlying buffer. This is useful because this std::string_view
+  // is static and won't be deleted for the life of the program, so it can be
+  // used as keys in places that may outlive a temporary. It will return an
+  // empty string for programmatic and nonexistant values.
+  std::string_view GetStorageKey(const std::string_view& ident) const;
 
   // The set_node indicates the statement that caused the set, for displaying
   // errors later. Returns a pointer to the value in the current scope (a copy
   // is made for storage).
-  Value* SetValue(const base::StringPiece& ident,
+  Value* SetValue(const std::string_view& ident,
                   Value v,
                   const ParseNode* set_node);
 
   // Removes the value with the given identifier if it exists on the current
   // scope. This does not search recursive scopes. Does nothing if not found.
-  void RemoveIdentifier(const base::StringPiece& ident);
+  void RemoveIdentifier(const std::string_view& ident);
 
   // Removes from this scope all identifiers and templates that are considered
   // private.
@@ -200,17 +200,17 @@
   const Template* GetTemplate(const std::string& name) const;
 
   // Marks the given identifier as (un)used in the current scope.
-  void MarkUsed(const base::StringPiece& ident);
+  void MarkUsed(const std::string_view& ident);
   void MarkAllUsed();
   void MarkAllUsed(const std::set<std::string>& excluded_values);
-  void MarkUnused(const base::StringPiece& ident);
+  void MarkUnused(const std::string_view& ident);
 
   // Checks to see if the scope has a var set that hasn't been used. This is
   // called before replacing the var with a different one. It does not check
   // containing scopes.
   //
   // If the identifier is present but hasnn't been used, return true.
-  bool IsSetButUnused(const base::StringPiece& ident) const;
+  bool IsSetButUnused(const std::string_view& ident) const;
 
   // Checks the scope to see if any values were set but not used, and fills in
   // the error and returns false if they were.
@@ -338,7 +338,7 @@
     Value value;
   };
 
-  using RecordMap = std::unordered_map<base::StringPiece, Record>;
+  using RecordMap = std::unordered_map<std::string_view, Record>;
 
   void AddProvider(ProgrammaticProvider* p);
   void RemoveProvider(ProgrammaticProvider* p);
diff --git a/tools/gn/scope_per_file_provider.cc b/tools/gn/scope_per_file_provider.cc
index d7d11af..1adfa84 100644
--- a/tools/gn/scope_per_file_provider.cc
+++ b/tools/gn/scope_per_file_provider.cc
@@ -18,7 +18,7 @@
 ScopePerFileProvider::~ScopePerFileProvider() = default;
 
 const Value* ScopePerFileProvider::GetProgrammaticValue(
-    const base::StringPiece& ident) {
+    const std::string_view& ident) {
   if (ident == variables::kCurrentToolchain)
     return GetCurrentToolchain();
   if (ident == variables::kDefaultToolchain)
diff --git a/tools/gn/scope_per_file_provider.h b/tools/gn/scope_per_file_provider.h
index ac0d872..c7a76c0 100644
--- a/tools/gn/scope_per_file_provider.h
+++ b/tools/gn/scope_per_file_provider.h
@@ -21,7 +21,7 @@
   ~ScopePerFileProvider() override;
 
   // ProgrammaticProvider implementation.
-  const Value* GetProgrammaticValue(const base::StringPiece& ident) override;
+  const Value* GetProgrammaticValue(const std::string_view& ident) override;
 
  private:
   const Value* GetCurrentToolchain();
diff --git a/tools/gn/scope_unittest.cc b/tools/gn/scope_unittest.cc
index 681d6c8..f54c666 100644
--- a/tools/gn/scope_unittest.cc
+++ b/tools/gn/scope_unittest.cc
@@ -57,7 +57,7 @@
   // Add some values to the scope.
   Value old_value(&assignment, "hello");
   setup.scope()->SetValue("v", old_value, &assignment);
-  base::StringPiece private_var_name("_private");
+  std::string_view private_var_name("_private");
   setup.scope()->SetValue(private_var_name, old_value, &assignment);
 
   // Add some templates to the scope.
diff --git a/tools/gn/setup.cc b/tools/gn/setup.cc
index 1b2ad55..16e09fe 100644
--- a/tools/gn/setup.cc
+++ b/tools/gn/setup.cc
@@ -193,7 +193,7 @@
 
 #if defined(OS_WIN)
 
-std::u16string SysMultiByteTo16(base::StringPiece mb) {
+std::u16string SysMultiByteTo16(std::string_view mb) {
   if (mb.empty())
     return std::u16string();
 
@@ -222,7 +222,7 @@
   // quote the first argument in addition (to allow for spaces in the Python
   // path, you need *another* set of quotes around that, likewise, we need
   // two quotes at the end.
-  base::string16 command = u"cmd.exe /c \"\"";
+  std::u16string command = u"cmd.exe /c \"\"";
   command.append(bat_path.value());
   command.append(u"\" -c \"import sys; print sys.executable\"\"");
 
@@ -245,11 +245,11 @@
   return base::FilePath();
 }
 
-const base::char16 kPythonExeName[] = u"python.exe";
-const base::char16 kPythonBatName[] = u"python.bat";
+const char16_t kPythonExeName[] = u"python.exe";
+const char16_t kPythonBatName[] = u"python.bat";
 
 base::FilePath FindWindowsPython() {
-  base::char16 current_directory[MAX_PATH];
+  char16_t current_directory[MAX_PATH];
   ::GetCurrentDirectory(MAX_PATH, reinterpret_cast<LPWSTR>(current_directory));
 
   // First search for python.exe in the current directory.
@@ -259,12 +259,12 @@
     return cur_dir_candidate_exe;
 
   // Get the path.
-  const base::char16 kPathEnvVarName[] = u"Path";
+  const char16_t kPathEnvVarName[] = u"Path";
   DWORD path_length = ::GetEnvironmentVariable(
       reinterpret_cast<LPCWSTR>(kPathEnvVarName), nullptr, 0);
   if (path_length == 0)
     return base::FilePath();
-  std::unique_ptr<base::char16[]> full_path(new base::char16[path_length]);
+  std::unique_ptr<char16_t[]> full_path(new char16_t[path_length]);
   DWORD actual_path_length = ::GetEnvironmentVariable(
       reinterpret_cast<LPCWSTR>(kPathEnvVarName),
       reinterpret_cast<LPWSTR>(full_path.get()), path_length);
@@ -272,7 +272,7 @@
 
   // Search for python.exe in the path.
   for (const auto& component : base::SplitStringPiece(
-           base::StringPiece16(full_path.get(), path_length), u";",
+           std::u16string_view(full_path.get(), path_length), u";",
            base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY)) {
     base::FilePath candidate_exe =
         base::FilePath(component).Append(kPythonExeName);
diff --git a/tools/gn/source_dir.cc b/tools/gn/source_dir.cc
index 7def4b2..e8c4ae9 100644
--- a/tools/gn/source_dir.cc
+++ b/tools/gn/source_dir.cc
@@ -77,7 +77,7 @@
     const Value& blame_input_value,
     const StringType& input_value,
     Err* err,
-    const base::StringPiece& source_root) const {
+    const std::string_view& source_root) const {
   if (!ValidateResolveInput<StringType>(as_file, blame_input_value, input_value,
                                         err)) {
     return std::string();
@@ -88,7 +88,7 @@
 SourceFile SourceDir::ResolveRelativeFile(
     const Value& p,
     Err* err,
-    const base::StringPiece& source_root) const {
+    const std::string_view& source_root) const {
   SourceFile ret;
 
   if (!p.VerifyTypeIs(Value::STRING, err))
@@ -105,7 +105,7 @@
 std::string SourceDir::ResolveRelativeAs(bool as_file,
                                          const Value& v,
                                          Err* err,
-                                         const base::StringPiece& source_root,
+                                         const std::string_view& source_root,
                                          const std::string* v_value) const {
   if (!v.VerifyTypeIs(Value::STRING, err))
     return std::string();
@@ -123,7 +123,7 @@
 SourceDir SourceDir::ResolveRelativeDir(
     const Value& v,
     Err* err,
-    const base::StringPiece& source_root) const {
+    const std::string_view& source_root) const {
   if (!v.VerifyTypeIs(Value::STRING, err))
     return SourceDir();
 
@@ -140,11 +140,11 @@
     const Value& blame_input_value,
     const std::string& input_value,
     Err* err,
-    const base::StringPiece& source_root) const;
+    const std::string_view& source_root) const;
 
 template std::string SourceDir::ResolveRelativeAs(
     bool as_file,
     const Value& blame_input_value,
-    const base::StringPiece& input_value,
+    const std::string_view& input_value,
     Err* err,
-    const base::StringPiece& source_root) const;
+    const std::string_view& source_root) const;
diff --git a/tools/gn/source_dir.h b/tools/gn/source_dir.h
index 8b6dcc9..ed4b1e3 100644
--- a/tools/gn/source_dir.h
+++ b/tools/gn/source_dir.h
@@ -9,10 +9,10 @@
 
 #include <algorithm>
 #include <string>
+#include <string_view>
 
 #include "base/files/file_path.h"
 #include "base/logging.h"
-#include "base/strings/string_piece.h"
 
 class Err;
 class SourceFile;
@@ -47,7 +47,7 @@
       bool as_file,
       const Value& v,
       Err* err,
-      const base::StringPiece& source_root = base::StringPiece(),
+      const std::string_view& source_root = std::string_view(),
       const std::string* v_value = nullptr) const;
 
   // Like ResolveRelativeAs above, but allows to produce result
@@ -58,13 +58,13 @@
       const Value& blame_input_value,
       const StringType& input_value,
       Err* err,
-      const base::StringPiece& source_root = base::StringPiece()) const;
+      const std::string_view& source_root = std::string_view()) const;
 
   // Wrapper for ResolveRelativeAs.
   SourceFile ResolveRelativeFile(
       const Value& p,
       Err* err,
-      const base::StringPiece& source_root = base::StringPiece()) const;
+      const std::string_view& source_root = std::string_view()) const;
 
   // Wrapper for ResolveRelativeAs.
   template <typename StringType>
@@ -72,7 +72,7 @@
       const Value& blame_input_value,
       const StringType& input_value,
       Err* err,
-      const base::StringPiece& source_root = base::StringPiece()) const {
+      const std::string_view& source_root = std::string_view()) const {
     SourceDir ret;
     ret.value_ = ResolveRelativeAs<StringType>(false, blame_input_value,
                                                input_value, err, source_root);
@@ -84,7 +84,7 @@
   SourceDir ResolveRelativeDir(
       const Value& v,
       Err* err,
-      const base::StringPiece& source_root = base::StringPiece()) const;
+      const std::string_view& source_root = std::string_view()) const;
 
   // Resolves this source file relative to some given source root. Returns
   // an empty file path on error.
@@ -110,19 +110,19 @@
   //
   // This function asserts that the directory is actually source-absolute. The
   // return value points into our buffer.
-  base::StringPiece SourceAbsoluteWithOneSlash() const {
+  std::string_view SourceAbsoluteWithOneSlash() const {
     CHECK(is_source_absolute());
-    return base::StringPiece(&value_[1], value_.size() - 1);
+    return std::string_view(&value_[1], value_.size() - 1);
   }
 
   // Returns a path that does not end with a slash.
   //
   // This function simply returns the reference to the value if the path is a
   // root, e.g. "/" or "//".
-  base::StringPiece SourceWithNoTrailingSlash() const {
+  std::string_view SourceWithNoTrailingSlash() const {
     if (value_.size() > 2)
-      return base::StringPiece(&value_[0], value_.size() - 1);
-    return base::StringPiece(value_);
+      return std::string_view(&value_[0], value_.size() - 1);
+    return std::string_view(value_);
   }
 
   void SwapValue(std::string* v);
diff --git a/tools/gn/source_dir_unittest.cc b/tools/gn/source_dir_unittest.cc
index d5ada23..20c60b7 100644
--- a/tools/gn/source_dir_unittest.cc
+++ b/tools/gn/source_dir_unittest.cc
@@ -13,9 +13,9 @@
   Err err;
   SourceDir base("//base/");
 #if defined(OS_WIN)
-  base::StringPiece source_root("C:/source/root");
+  std::string_view source_root("C:/source/root");
 #else
-  base::StringPiece source_root("/source/root");
+  std::string_view source_root("/source/root");
 #endif
 
   // Empty input is an error.
@@ -116,9 +116,9 @@
   Err err;
   SourceDir base("//base/");
 #if defined(OS_WIN)
-  base::StringPiece source_root("C:/source/root");
+  std::string_view source_root("C:/source/root");
 #else
-  base::StringPiece source_root("/source/root");
+  std::string_view source_root("/source/root");
 #endif
 
   // Empty input is an error.
diff --git a/tools/gn/source_file.cc b/tools/gn/source_file.cc
index ce24207..d3ea1cc 100644
--- a/tools/gn/source_file.cc
+++ b/tools/gn/source_file.cc
@@ -22,7 +22,7 @@
 }
 
 SourceFile::Type GetSourceFileType(const std::string& file) {
-  base::StringPiece extension = FindExtension(&file);
+  std::string_view extension = FindExtension(&file);
   if (extension == "cc" || extension == "cpp" || extension == "cxx")
     return SourceFile::SOURCE_CPP;
   if (extension == "h" || extension == "hpp" || extension == "hxx" ||
diff --git a/tools/gn/source_file.h b/tools/gn/source_file.h
index 081cda6..392cdd4 100644
--- a/tools/gn/source_file.h
+++ b/tools/gn/source_file.h
@@ -9,10 +9,10 @@
 
 #include <algorithm>
 #include <string>
+#include <string_view>
 
 #include "base/files/file_path.h"
 #include "base/logging.h"
-#include "base/strings/string_piece.h"
 
 class SourceDir;
 
@@ -78,9 +78,9 @@
   //
   // This function asserts that the file is actually source-absolute. The
   // return value points into our buffer.
-  base::StringPiece SourceAbsoluteWithOneSlash() const {
+  std::string_view SourceAbsoluteWithOneSlash() const {
     CHECK(is_source_absolute());
-    return base::StringPiece(&value_[1], value_.size() - 1);
+    return std::string_view(&value_[1], value_.size() - 1);
   }
 
   bool operator==(const SourceFile& other) const {
diff --git a/tools/gn/standard_out.cc b/tools/gn/standard_out.cc
index 3056418..003c8ee 100644
--- a/tools/gn/standard_out.cc
+++ b/tools/gn/standard_out.cc
@@ -6,11 +6,11 @@
 
 #include <stddef.h>
 
+#include <string_view>
 #include <vector>
 
 #include "base/command_line.h"
 #include "base/logging.h"
-#include "base/strings/string_piece.h"
 #include "base/strings/string_split.h"
 #include "base/strings/string_util.h"
 #include "tools/gn/switches.h"
@@ -78,8 +78,8 @@
 #endif  // !defined(OS_WIN)
 
 void OutputMarkdownDec(TextDecoration dec) {
-// The markdown rendering turns "dim" text to italics and any
-// other colored text to bold.
+  // The markdown rendering turns "dim" text to italics and any
+  // other colored text to bold.
 
 #if defined(OS_WIN)
   DWORD written = 0;
diff --git a/tools/gn/string_utils.cc b/tools/gn/string_utils.cc
index 89fc4b0..ab0aea8 100644
--- a/tools/gn/string_utils.cc
+++ b/tools/gn/string_utils.cc
@@ -117,7 +117,7 @@
                                   size_t end_offset,
                                   std::string* output,
                                   Err* err) {
-  base::StringPiece identifier(&input[begin_offset], end_offset - begin_offset);
+  std::string_view identifier(&input[begin_offset], end_offset - begin_offset);
   const Value* value = scope->GetValue(identifier, true);
   if (!value) {
     // We assume the input points inside the token.
@@ -225,7 +225,7 @@
     return false;
   }
   int value = 0;
-  if (!base::HexStringToInt(base::StringPiece(&input[*i + 2], 2), &value)) {
+  if (!base::HexStringToInt(std::string_view(&input[*i + 2], 2), &value)) {
     *err = ErrInsideStringToken(token, dollars_index, *i - dollars_index + 1,
                                 "Could not convert hex value.");
     return false;
@@ -287,8 +287,8 @@
   return true;
 }
 
-size_t EditDistance(const base::StringPiece& s1,
-                    const base::StringPiece& s2,
+size_t EditDistance(const std::string_view& s1,
+                    const std::string_view& s2,
                     size_t max_edit_distance) {
   // The algorithm implemented below is the "classic"
   // dynamic-programming algorithm for computing the Levenshtein
@@ -329,14 +329,13 @@
   return row[n];
 }
 
-base::StringPiece SpellcheckString(
-    const base::StringPiece& text,
-    const std::vector<base::StringPiece>& words) {
+std::string_view SpellcheckString(const std::string_view& text,
+                                  const std::vector<std::string_view>& words) {
   const size_t kMaxValidEditDistance = 3u;
 
   size_t min_distance = kMaxValidEditDistance + 1u;
-  base::StringPiece result;
-  for (base::StringPiece word : words) {
+  std::string_view result;
+  for (std::string_view word : words) {
     size_t distance = EditDistance(word, text, kMaxValidEditDistance);
     if (distance < min_distance) {
       min_distance = distance;
diff --git a/tools/gn/string_utils.h b/tools/gn/string_utils.h
index c77daca..3d4e056 100644
--- a/tools/gn/string_utils.h
+++ b/tools/gn/string_utils.h
@@ -6,16 +6,15 @@
 #define TOOLS_GN_STRING_UTILS_H_
 
 #include <string>
+#include <string_view>
 #include <vector>
 
-#include "base/strings/string_piece.h"
-
 class Err;
 class Scope;
 class Token;
 class Value;
 
-inline std::string operator+(const std::string& a, const base::StringPiece& b) {
+inline std::string operator+(const std::string& a, const std::string_view& b) {
   std::string ret;
   ret.reserve(a.size() + b.size());
   ret.assign(a);
@@ -23,7 +22,7 @@
   return ret;
 }
 
-inline std::string operator+(const base::StringPiece& a, const std::string& b) {
+inline std::string operator+(const std::string_view& a, const std::string& b) {
   std::string ret;
   ret.reserve(a.size() + b.size());
   ret.assign(a.data(), a.size());
@@ -41,14 +40,14 @@
 // Returns the minimum number of inserts, deleted, and replacements of
 // characters needed to transform s1 to s2, or max_edit_distance + 1 if
 // transforming s1 into s2 isn't possible in at most max_edit_distance steps.
-size_t EditDistance(const base::StringPiece& s1,
-                    const base::StringPiece& s2,
+size_t EditDistance(const std::string_view& s1,
+                    const std::string_view& s2,
                     size_t max_edit_distance);
 
 // Given a string |text| and a vector of correctly-spelled strings |words|,
 // returns the first string in |words| closest to |text|, or an empty
-// StringPiece if none of the strings in |words| is close.
-base::StringPiece SpellcheckString(const base::StringPiece& text,
-                                   const std::vector<base::StringPiece>& words);
+// std::string_view if none of the strings in |words| is close.
+std::string_view SpellcheckString(const std::string_view& text,
+                                  const std::vector<std::string_view>& words);
 
 #endif  // TOOLS_GN_STRING_UTILS_H_
diff --git a/tools/gn/string_utils_unittest.cc b/tools/gn/string_utils_unittest.cc
index bf10dd4..4c5cd81 100644
--- a/tools/gn/string_utils_unittest.cc
+++ b/tools/gn/string_utils_unittest.cc
@@ -144,7 +144,7 @@
 }
 
 TEST(StringUtils, SpellcheckString) {
-  std::vector<base::StringPiece> words;
+  std::vector<std::string_view> words;
   words.push_back("your");
   words.push_back("bravado");
   words.push_back("won\'t");
diff --git a/tools/gn/switches.h b/tools/gn/switches.h
index d1abb1f..9f0ddf0 100644
--- a/tools/gn/switches.h
+++ b/tools/gn/switches.h
@@ -6,8 +6,7 @@
 #define TOOLS_GN_SWITCHES_H_
 
 #include <map>
-
-#include "base/strings/string_piece.h"
+#include <string_view>
 
 namespace switches {
 
@@ -19,7 +18,7 @@
   const char* long_help;
 };
 
-typedef std::map<base::StringPiece, SwitchInfo> SwitchInfoMap;
+typedef std::map<std::string_view, SwitchInfo> SwitchInfoMap;
 
 // Returns the mapping of all global switches.
 const SwitchInfoMap& GetSwitches();
diff --git a/tools/gn/target_unittest.cc b/tools/gn/target_unittest.cc
index f117846..24f4822 100644
--- a/tools/gn/target_unittest.cc
+++ b/tools/gn/target_unittest.cc
@@ -1108,12 +1108,12 @@
   Value a_expected(nullptr, Value::LIST);
   a_expected.list_value().push_back(Value(nullptr, "foo"));
   one.metadata().contents().insert(
-      std::pair<base::StringPiece, Value>("a", a_expected));
+      std::pair<std::string_view, Value>("a", a_expected));
 
   Value b_expected(nullptr, Value::LIST);
   b_expected.list_value().push_back(Value(nullptr, true));
   one.metadata().contents().insert(
-      std::pair<base::StringPiece, Value>("b", b_expected));
+      std::pair<std::string_view, Value>("b", b_expected));
 
   one.metadata().set_source_dir(SourceDir("/usr/home/files/"));
 
@@ -1143,18 +1143,18 @@
   Value a_expected(nullptr, Value::LIST);
   a_expected.list_value().push_back(Value(nullptr, "foo"));
   one.metadata().contents().insert(
-      std::pair<base::StringPiece, Value>("a", a_expected));
+      std::pair<std::string_view, Value>("a", a_expected));
 
   Value b_expected(nullptr, Value::LIST);
   b_expected.list_value().push_back(Value(nullptr, true));
   one.metadata().contents().insert(
-      std::pair<base::StringPiece, Value>("b", b_expected));
+      std::pair<std::string_view, Value>("b", b_expected));
 
   TestTarget two(setup, "//foo:two", Target::SOURCE_SET);
   Value a_2_expected(nullptr, Value::LIST);
   a_2_expected.list_value().push_back(Value(nullptr, "bar"));
   two.metadata().contents().insert(
-      std::pair<base::StringPiece, Value>("a", a_2_expected));
+      std::pair<std::string_view, Value>("a", a_2_expected));
 
   one.public_deps().push_back(LabelTargetPair(&two));
 
@@ -1185,25 +1185,25 @@
   Value a_expected(nullptr, Value::LIST);
   a_expected.list_value().push_back(Value(nullptr, "foo"));
   one.metadata().contents().insert(
-      std::pair<base::StringPiece, Value>("a", a_expected));
+      std::pair<std::string_view, Value>("a", a_expected));
 
   Value walk_expected(nullptr, Value::LIST);
   walk_expected.list_value().push_back(
       Value(nullptr, "//foo:two(//toolchain:default)"));
   one.metadata().contents().insert(
-      std::pair<base::StringPiece, Value>("walk", walk_expected));
+      std::pair<std::string_view, Value>("walk", walk_expected));
 
   TestTarget two(setup, "//foo:two", Target::SOURCE_SET);
   Value a_2_expected(nullptr, Value::LIST);
   a_2_expected.list_value().push_back(Value(nullptr, "bar"));
   two.metadata().contents().insert(
-      std::pair<base::StringPiece, Value>("a", a_2_expected));
+      std::pair<std::string_view, Value>("a", a_2_expected));
 
   TestTarget three(setup, "//foo:three", Target::SOURCE_SET);
   Value a_3_expected(nullptr, Value::LIST);
   a_3_expected.list_value().push_back(Value(nullptr, "baz"));
   three.metadata().contents().insert(
-      std::pair<base::StringPiece, Value>("a", a_3_expected));
+      std::pair<std::string_view, Value>("a", a_3_expected));
 
   one.public_deps().push_back(LabelTargetPair(&two));
   one.public_deps().push_back(LabelTargetPair(&three));
@@ -1234,12 +1234,12 @@
   Value a_expected(nullptr, Value::LIST);
   a_expected.list_value().push_back(Value(nullptr, "foo"));
   one.metadata().contents().insert(
-      std::pair<base::StringPiece, Value>("a", a_expected));
+      std::pair<std::string_view, Value>("a", a_expected));
 
   Value walk_expected(nullptr, Value::LIST);
   walk_expected.list_value().push_back(Value(nullptr, "//foo:missing"));
   one.metadata().contents().insert(
-      std::pair<base::StringPiece, Value>("walk", walk_expected));
+      std::pair<std::string_view, Value>("walk", walk_expected));
 
   std::vector<std::string> data_keys;
   data_keys.push_back("a");
diff --git a/tools/gn/template.cc b/tools/gn/template.cc
index 2b40fb3..625cf5e 100644
--- a/tools/gn/template.cc
+++ b/tools/gn/template.cc
@@ -83,7 +83,7 @@
   invoker_value->SetScopeValue(std::move(invocation_scope));
   template_scope.set_source_dir(scope->GetSourceDir());
 
-  const base::StringPiece target_name(variables::kTargetName);
+  const std::string_view target_name(variables::kTargetName);
   template_scope.SetValue(
       target_name, Value(invocation, args[0].string_value()), invocation);
 
diff --git a/tools/gn/token.cc b/tools/gn/token.cc
index 3c016fd..7951571 100644
--- a/tools/gn/token.cc
+++ b/tools/gn/token.cc
@@ -8,7 +8,7 @@
 
 Token::Token() : type_(INVALID), value_() {}
 
-Token::Token(const Location& location, Type t, const base::StringPiece& v)
+Token::Token(const Location& location, Type t, const std::string_view& v)
     : type_(t), value_(v), location_(location) {}
 
 Token::Token(const Token& other) = default;
diff --git a/tools/gn/token.h b/tools/gn/token.h
index 126201c..46eb78e 100644
--- a/tools/gn/token.h
+++ b/tools/gn/token.h
@@ -5,7 +5,8 @@
 #ifndef TOOLS_GN_TOKEN_H_
 #define TOOLS_GN_TOKEN_H_
 
-#include "base/strings/string_piece.h"
+#include <string_view>
+
 #include "tools/gn/location.h"
 
 class Token {
@@ -57,11 +58,11 @@
   };
 
   Token();
-  Token(const Location& location, Type t, const base::StringPiece& v);
+  Token(const Location& location, Type t, const std::string_view& v);
   Token(const Token& other);
 
   Type type() const { return type_; }
-  const base::StringPiece& value() const { return value_; }
+  const std::string_view& value() const { return value_; }
   const Location& location() const { return location_; }
   void set_location(Location location) { location_ = location; }
   LocationRange range() const {
@@ -78,7 +79,7 @@
 
  private:
   Type type_;
-  base::StringPiece value_;
+  std::string_view value_;
   Location location_;
 };
 
diff --git a/tools/gn/tokenizer.cc b/tools/gn/tokenizer.cc
index 09f0b4b..73a1491 100644
--- a/tools/gn/tokenizer.cc
+++ b/tools/gn/tokenizer.cc
@@ -32,7 +32,7 @@
   return c == '(' || c == ')' || c == '[' || c == ']' || c == '{' || c == '}';
 }
 
-Token::Type GetSpecificOperatorType(base::StringPiece value) {
+Token::Type GetSpecificOperatorType(std::string_view value) {
   if (value == "=")
     return Token::EQUAL;
   if (value == "+")
@@ -98,8 +98,8 @@
       break;
     size_t token_end = cur_;
 
-    base::StringPiece token_value(&input_.data()[token_begin],
-                                  token_end - token_begin);
+    std::string_view token_value(&input_.data()[token_begin],
+                                 token_end - token_begin);
 
     if (type == Token::UNCLASSIFIED_OPERATOR) {
       type = GetSpecificOperatorType(token_value);
@@ -148,7 +148,7 @@
 }
 
 // static
-size_t Tokenizer::ByteOffsetOfNthLine(const base::StringPiece& buf, int n) {
+size_t Tokenizer::ByteOffsetOfNthLine(const std::string_view& buf, int n) {
   DCHECK_GT(n, 0);
 
   if (n == 1)
@@ -168,7 +168,7 @@
 }
 
 // static
-bool Tokenizer::IsNewline(const base::StringPiece& buffer, size_t offset) {
+bool Tokenizer::IsNewline(const std::string_view& buffer, size_t offset) {
   DCHECK(offset < buffer.size());
   // We may need more logic here to handle different line ending styles.
   return buffer[offset] == '\n';
diff --git a/tools/gn/tokenizer.h b/tools/gn/tokenizer.h
index 7b66ac0..41451ee 100644
--- a/tools/gn/tokenizer.h
+++ b/tools/gn/tokenizer.h
@@ -7,10 +7,10 @@
 
 #include <stddef.h>
 
+#include <string_view>
 #include <vector>
 
 #include "base/macros.h"
-#include "base/strings/string_piece.h"
 #include "tools/gn/err.h"
 #include "tools/gn/token.h"
 
@@ -27,11 +27,11 @@
   //
   // This is a helper function for error output so that the tokenizer's
   // notion of lines can be used elsewhere.
-  static size_t ByteOffsetOfNthLine(const base::StringPiece& buf, int n);
+  static size_t ByteOffsetOfNthLine(const std::string_view& buf, int n);
 
   // Returns true if the given offset of the string piece counts as a newline.
   // The offset must be in the buffer.
-  static bool IsNewline(const base::StringPiece& buffer, size_t offset);
+  static bool IsNewline(const std::string_view& buffer, size_t offset);
 
   static bool IsIdentifierFirstChar(char c);
 
@@ -77,7 +77,7 @@
   std::vector<Token> tokens_;
 
   const InputFile* input_file_;
-  const base::StringPiece input_;
+  const std::string_view input_;
   Err* err_;
   size_t cur_ = 0;  // Byte offset into input buffer.
 
diff --git a/tools/gn/toolchain.h b/tools/gn/toolchain.h
index afab7f3..fbeda8f 100644
--- a/tools/gn/toolchain.h
+++ b/tools/gn/toolchain.h
@@ -6,9 +6,9 @@
 #define TOOLS_GN_TOOLCHAIN_H_
 
 #include <memory>
+#include <string_view>
 
 #include "base/logging.h"
-#include "base/strings/string_piece.h"
 #include "tools/gn/item.h"
 #include "tools/gn/label_ptr.h"
 #include "tools/gn/scope.h"
diff --git a/tools/gn/variables.h b/tools/gn/variables.h
index 09f2c18..60769d4 100644
--- a/tools/gn/variables.h
+++ b/tools/gn/variables.h
@@ -6,8 +6,7 @@
 #define TOOLS_GN_VARIABLES_H_
 
 #include <map>
-
-#include "base/strings/string_piece.h"
+#include <string_view>
 
 namespace variables {
 
@@ -337,7 +336,7 @@
   const char* help;
 };
 
-typedef std::map<base::StringPiece, VariableInfo> VariableInfoMap;
+typedef std::map<std::string_view, VariableInfo> VariableInfoMap;
 
 // Returns the built-in readonly variables.
 // Note: this is used only for help so this getter is not threadsafe.
diff --git a/tools/gn/visibility.cc b/tools/gn/visibility.cc
index 75039e9..babbacc 100644
--- a/tools/gn/visibility.cc
+++ b/tools/gn/visibility.cc
@@ -5,8 +5,8 @@
 #include "tools/gn/visibility.h"
 
 #include <memory>
+#include <string_view>
 
-#include "base/strings/string_piece.h"
 #include "base/strings/string_util.h"
 #include "base/values.h"
 #include "tools/gn/err.h"
diff --git a/tools/gn/visual_studio_writer.cc b/tools/gn/visual_studio_writer.cc
index 217075b..0a4c6a5 100644
--- a/tools/gn/visual_studio_writer.cc
+++ b/tools/gn/visual_studio_writer.cc
@@ -98,16 +98,16 @@
   std::string kits_path;
 
 #if defined(OS_WIN)
-  const base::char16* const subkeys[] = {
+  const char16_t* const subkeys[] = {
       u"SOFTWARE\\Microsoft\\Windows Kits\\Installed Roots",
       u"SOFTWARE\\Wow6432Node\\Microsoft\\Windows Kits\\Installed Roots"};
 
-  base::string16 value_name =
+  std::u16string value_name =
       base::ASCIIToUTF16("KitsRoot") + base::ASCIIToUTF16(kWindowsKitsVersion);
 
-  for (const base::char16* subkey : subkeys) {
+  for (const char16_t* subkey : subkeys) {
     base::win::RegKey key(HKEY_LOCAL_MACHINE, subkey, KEY_READ);
-    base::string16 value;
+    std::u16string value;
     if (key.ReadValue(value_name.c_str(), &value) == ERROR_SUCCESS) {
       kits_path = base::UTF16ToUTF8(value);
       break;
@@ -175,13 +175,13 @@
 // Returns a string piece pointing into the input string identifying the parent
 // directory path, excluding the last slash. Note that the input pointer must
 // outlive the output.
-base::StringPiece FindParentDir(const std::string* path) {
+std::string_view FindParentDir(const std::string* path) {
   DCHECK(path && !path->empty());
   for (int i = static_cast<int>(path->size()) - 2; i >= 0; --i) {
     if (IsSlash((*path)[i]))
-      return base::StringPiece(path->data(), i);
+      return std::string_view(path->data(), i);
   }
-  return base::StringPiece();
+  return std::string_view();
 }
 
 bool FilterTargets(const BuildSettings* build_settings,
@@ -697,7 +697,7 @@
       filter_path_output.WriteFile(target_relative_out, *file_and_type.file);
       std::string target_relative_path = target_relative_out.str();
       ConvertPathToSystem(&target_relative_path);
-      base::StringPiece filter_path = FindParentDir(&target_relative_path);
+      std::string_view filter_path = FindParentDir(&target_relative_path);
 
       if (!filter_path.empty()) {
         std::string filter_path_str(filter_path);
@@ -806,9 +806,9 @@
   root_folder_path_.clear();
 
   // Get all project directories. Create solution folder for each directory.
-  std::map<base::StringPiece, SolutionEntry*> processed_paths;
+  std::map<std::string_view, SolutionEntry*> processed_paths;
   for (const std::unique_ptr<SolutionProject>& project : projects_) {
-    base::StringPiece folder_path = project->label_dir_path;
+    std::string_view folder_path = project->label_dir_path;
     if (IsSlash(folder_path[folder_path.size() - 1]))
       folder_path = folder_path.substr(0, folder_path.size() - 1);
     auto it = processed_paths.find(folder_path);
@@ -856,7 +856,7 @@
       continue;
 
     SolutionEntry* folder = solution_folder.get();
-    base::StringPiece parent_path;
+    std::string_view parent_path;
     while ((parent_path = FindParentDir(&folder->path)) != root_folder_path_) {
       auto it = processed_paths.find(parent_path);
       if (it != processed_paths.end()) {
diff --git a/tools/gn/xcode_object.cc b/tools/gn/xcode_object.cc
index 248661a..7509547 100644
--- a/tools/gn/xcode_object.cc
+++ b/tools/gn/xcode_object.cc
@@ -140,7 +140,7 @@
     {"y", "sourcecode.yacc"},
 };
 
-const char* GetSourceType(const base::StringPiece& ext) {
+const char* GetSourceType(const std::string_view& ext) {
   for (size_t i = 0; i < arraysize(kSourceTypeForExt); ++i) {
     if (kSourceTypeForExt[i].ext == ext)
       return kSourceTypeForExt[i].source_type;
@@ -149,11 +149,11 @@
   return "text";
 }
 
-bool HasExplicitFileType(const base::StringPiece& ext) {
+bool HasExplicitFileType(const std::string_view& ext) {
   return ext == "dart";
 }
 
-bool IsSourceFileForIndexing(const base::StringPiece& ext) {
+bool IsSourceFileForIndexing(const std::string_view& ext) {
   return ext == "c" || ext == "cc" || ext == "cpp" || ext == "cxx" ||
          ext == "m" || ext == "mm";
 }
@@ -467,7 +467,7 @@
     PrintProperty(out, rules, "explicitFileType", type_);
     PrintProperty(out, rules, "includeInIndex", 0u);
   } else {
-    base::StringPiece ext = FindExtension(&name_);
+    std::string_view ext = FindExtension(&name_);
     if (HasExplicitFileType(ext))
       PrintProperty(out, rules, "explicitFileType", GetSourceType(ext));
     else
@@ -547,7 +547,7 @@
   }
 
   PBXGroup* group = nullptr;
-  base::StringPiece component(navigator_path.data(), sep);
+  std::string_view component(navigator_path.data(), sep);
   for (const auto& child : children_) {
     if (child->Class() != PBXGroupClass)
       continue;
@@ -692,7 +692,7 @@
                                PBXNativeTarget* target) {
   PBXFileReference* file_reference =
       sources_->AddSourceFile(navigator_path, source_path);
-  base::StringPiece ext = FindExtension(&source_path);
+  std::string_view ext = FindExtension(&source_path);
   if (!IsSourceFileForIndexing(ext))
     return;
 
@@ -736,7 +736,7 @@
     const std::string& output_type,
     const std::string& shell_script,
     const PBXAttributes& extra_attributes) {
-  base::StringPiece ext = FindExtension(&output_name);
+  std::string_view ext = FindExtension(&output_name);
   PBXFileReference* product = static_cast<PBXFileReference*>(
       products_->AddChild(std::make_unique<PBXFileReference>(
           std::string(), output_name,
diff --git a/tools/gn/xml_element_writer.cc b/tools/gn/xml_element_writer.cc
index 360d8af..f94878c 100644
--- a/tools/gn/xml_element_writer.cc
+++ b/tools/gn/xml_element_writer.cc
@@ -8,13 +8,13 @@
 
 XmlAttributes::XmlAttributes() = default;
 
-XmlAttributes::XmlAttributes(const base::StringPiece& attr_key,
-                             const base::StringPiece& attr_value) {
+XmlAttributes::XmlAttributes(const std::string_view& attr_key,
+                             const std::string_view& attr_value) {
   add(attr_key, attr_value);
 }
 
-XmlAttributes& XmlAttributes::add(const base::StringPiece& attr_key,
-                                  const base::StringPiece& attr_value) {
+XmlAttributes& XmlAttributes::add(const std::string_view& attr_key,
+                                  const std::string_view& attr_value) {
   push_back(std::make_pair(attr_key, attr_value));
   return *this;
 }
@@ -50,7 +50,7 @@
   }
 }
 
-void XmlElementWriter::Text(const base::StringPiece& content) {
+void XmlElementWriter::Text(const std::string_view& content) {
   StartContent(false);
   out_ << content;
 }
diff --git a/tools/gn/xml_element_writer.h b/tools/gn/xml_element_writer.h
index 1f68a7d..b276052 100644
--- a/tools/gn/xml_element_writer.h
+++ b/tools/gn/xml_element_writer.h
@@ -8,22 +8,22 @@
 #include <memory>
 #include <ostream>
 #include <string>
+#include <string_view>
 #include <utility>
 #include <vector>
 
 #include "base/macros.h"
-#include "base/strings/string_piece.h"
 
 // Vector of XML attribute key-value pairs.
 class XmlAttributes
-    : public std::vector<std::pair<base::StringPiece, base::StringPiece>> {
+    : public std::vector<std::pair<std::string_view, std::string_view>> {
  public:
   XmlAttributes();
-  XmlAttributes(const base::StringPiece& attr_key,
-                const base::StringPiece& attr_value);
+  XmlAttributes(const std::string_view& attr_key,
+                const std::string_view& attr_value);
 
-  XmlAttributes& add(const base::StringPiece& attr_key,
-                     const base::StringPiece& attr_value);
+  XmlAttributes& add(const std::string_view& attr_key,
+                     const std::string_view& attr_value);
 };
 
 // Helper class for writing XML elements. New XML element is started in
@@ -54,7 +54,7 @@
   ~XmlElementWriter();
 
   // Writes arbitrary XML element text.
-  void Text(const base::StringPiece& content);
+  void Text(const std::string_view& content);
 
   // Starts new XML sub-element. Caller must ensure that parent element outlives
   // its children.
