Rename typefdefs for C++17

These typedefs are no longer necessary:

  base::char16 -> char16_t
  base::string16 -> std::u16string
  base::StringPiece -> std::string_view
  base::StringPiece16 -> std::u16string_view

There should be no behavior change since the objects are already the
C++17 types.

Change-Id: I482a9371bc668e72d12811c17b4f1128715ea62a
Reviewed-on: https://gn-review.googlesource.com/c/gn/+/6060
Reviewed-by: Scott Graham <scottmg@chromium.org>
Commit-Queue: Brett Wilson <brettw@chromium.org>
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.