diff --git a/net/base/chunked_upload_data_stream.cc b/net/base/chunked_upload_data_stream.cc
index 2bae390..f7e2a66 100644
--- a/net/base/chunked_upload_data_stream.cc
+++ b/net/base/chunked_upload_data_stream.cc
@@ -58,7 +58,7 @@
   int result = ReadChunk(read_buffer_.get(), read_buffer_len_);
   // Shouldn't get an error or ERR_IO_PENDING.
   DCHECK_GE(result, 0);
-  read_buffer_ = NULL;
+  read_buffer_ = nullptr;
   read_buffer_len_ = 0;
   OnReadCompleted(result);
 }
@@ -84,7 +84,7 @@
 }
 
 void ChunkedUploadDataStream::ResetInternal() {
-  read_buffer_ = NULL;
+  read_buffer_ = nullptr;
   read_buffer_len_ = 0;
   read_index_ = 0;
   read_offset_ = 0;
diff --git a/net/base/chunked_upload_data_stream_unittest.cc b/net/base/chunked_upload_data_stream_unittest.cc
index 8074e3cc..6f6a6dbeb 100644
--- a/net/base/chunked_upload_data_stream_unittest.cc
+++ b/net/base/chunked_upload_data_stream_unittest.cc
@@ -243,7 +243,7 @@
   int result = stream.Read(buf.get(), kTestBufferSize, callback.callback());
   ASSERT_THAT(result, IsError(ERR_IO_PENDING));
 
-  stream.AppendData(NULL, 0, true);
+  stream.AppendData(nullptr, 0, true);
   int read = callback.WaitForResult();
   EXPECT_EQ(0, read);
   EXPECT_EQ(0u, stream.position());
@@ -252,7 +252,7 @@
 
 TEST(ChunkedUploadDataStreamTest, EmptyUploadEndedBeforeInit) {
   ChunkedUploadDataStream stream(0);
-  stream.AppendData(NULL, 0, true);
+  stream.AppendData(nullptr, 0, true);
 
   ASSERT_THAT(
       stream.Init(TestCompletionCallback().callback(), NetLogWithSource()),
diff --git a/net/base/data_url.cc b/net/base/data_url.cc
index c19e47f..e3c0e36 100644
--- a/net/base/data_url.cc
+++ b/net/base/data_url.cc
@@ -77,7 +77,7 @@
     mime_type->assign("text/plain");
     if (charset->empty())
       charset->assign("US-ASCII");
-  } else if (!ParseMimeTypeWithoutParameter(*mime_type, NULL, NULL)) {
+  } else if (!ParseMimeTypeWithoutParameter(*mime_type, nullptr, nullptr)) {
     // Fallback to the default as recommended in RFC2045 when the mediatype
     // value is invalid. For this case, we don't respect |charset| but force it
     // set to "US-ASCII".
diff --git a/net/base/expiring_cache.h b/net/base/expiring_cache.h
index a22497b..8f79800 100644
--- a/net/base/expiring_cache.h
+++ b/net/base/expiring_cache.h
@@ -127,12 +127,12 @@
   const ValueType* Get(const KeyType& key, const ExpirationType& now) {
     typename EntryMap::iterator it = entries_.find(key);
     if (it == entries_.end())
-      return NULL;
+      return nullptr;
 
     // Immediately remove expired entries.
     if (!expiration_comp_(now, it->second.second)) {
       Evict(it, now, true);
-      return NULL;
+      return nullptr;
     }
 
     return &it->second.first;
diff --git a/net/base/file_stream_context_win.cc b/net/base/file_stream_context_win.cc
index 38571a4..7ded4baa 100644
--- a/net/base/file_stream_context_win.cc
+++ b/net/base/file_stream_context_win.cc
@@ -187,14 +187,14 @@
     async_in_progress_ = false;
   }
   scoped_refptr<IOBuffer> temp_buf = in_flight_buf_;
-  in_flight_buf_ = NULL;
+  in_flight_buf_ = nullptr;
   std::move(callback_).Run(result_);
 }
 
 void FileStream::Context::DeleteOrphanedContext() {
   async_in_progress_ = false;
   callback_.Reset();
-  in_flight_buf_ = NULL;
+  in_flight_buf_ = nullptr;
   CloseAndDelete();
 }
 
diff --git a/net/base/interval_test.cc b/net/base/interval_test.cc
index 5d440c59..2ee6dc1 100644
--- a/net/base/interval_test.cc
+++ b/net/base/interval_test.cc
@@ -157,15 +157,15 @@
 
   Interval<int64_t> i;
   EXPECT_TRUE(d.Intersects(d, &i) && d.Equals(i));
-  EXPECT_TRUE(!empty.Intersects(d, NULL) && !d.Intersects(empty, NULL));
-  EXPECT_TRUE(!d.Intersects(d1, NULL) && !d1.Intersects(d, NULL));
+  EXPECT_TRUE(!empty.Intersects(d, nullptr) && !d.Intersects(empty, nullptr));
+  EXPECT_TRUE(!d.Intersects(d1, nullptr) && !d1.Intersects(d, nullptr));
   EXPECT_TRUE(d.Intersects(d2, &i) && i.Equals(Interval<int64_t>(100, 110)));
   EXPECT_TRUE(d2.Intersects(d, &i) && i.Equals(Interval<int64_t>(100, 110)));
   EXPECT_TRUE(d.Intersects(d3, &i) && i.Equals(d3));
   EXPECT_TRUE(d3.Intersects(d, &i) && i.Equals(d3));
   EXPECT_TRUE(d.Intersects(d4, &i) && i.Equals(Interval<int64_t>(180, 200)));
   EXPECT_TRUE(d4.Intersects(d, &i) && i.Equals(Interval<int64_t>(180, 200)));
-  EXPECT_TRUE(!d.Intersects(d5, NULL) && !d5.Intersects(d, NULL));
+  EXPECT_TRUE(!d.Intersects(d5, nullptr) && !d5.Intersects(d, nullptr));
   EXPECT_TRUE(d.Intersects(d6, &i) && i.Equals(d6));
   EXPECT_TRUE(d6.Intersects(d, &i) && i.Equals(d6));
   EXPECT_TRUE(d.Intersects(d7, &i) && i.Equals(d7));
diff --git a/net/base/io_buffer.cc b/net/base/io_buffer.cc
index 7a4ab5b..6e2ea7a7 100644
--- a/net/base/io_buffer.cc
+++ b/net/base/io_buffer.cc
@@ -26,9 +26,7 @@
 
 }  // namespace
 
-IOBuffer::IOBuffer()
-    : data_(NULL) {
-}
+IOBuffer::IOBuffer() : data_(nullptr) {}
 
 IOBuffer::IOBuffer(int buffer_size) {
   AssertValidBufferSize(buffer_size);
@@ -46,7 +44,7 @@
 
 IOBuffer::~IOBuffer() {
   delete[] data_;
-  data_ = NULL;
+  data_ = nullptr;
 }
 
 IOBufferWithSize::IOBufferWithSize(int size)
@@ -73,14 +71,13 @@
 IOBufferWithSize::~IOBufferWithSize() = default;
 
 StringIOBuffer::StringIOBuffer(const std::string& s)
-    : IOBuffer(static_cast<char*>(NULL)),
-      string_data_(s) {
+    : IOBuffer(static_cast<char*>(nullptr)), string_data_(s) {
   AssertValidBufferSize(s.size());
   data_ = const_cast<char*>(string_data_.data());
 }
 
 StringIOBuffer::StringIOBuffer(std::unique_ptr<std::string> s)
-    : IOBuffer(static_cast<char*>(NULL)) {
+    : IOBuffer(static_cast<char*>(nullptr)) {
   AssertValidBufferSize(s->size());
   string_data_.swap(*s.get());
   data_ = const_cast<char*>(string_data_.data());
@@ -89,7 +86,7 @@
 StringIOBuffer::~StringIOBuffer() {
   // We haven't allocated the buffer, so remove it before the base class
   // destructor tries to delete[] it.
-  data_ = NULL;
+  data_ = nullptr;
 }
 
 DrainableIOBuffer::DrainableIOBuffer(scoped_refptr<IOBuffer> base, int size)
@@ -124,7 +121,7 @@
 
 DrainableIOBuffer::~DrainableIOBuffer() {
   // The buffer is owned by the |base_| instance.
-  data_ = NULL;
+  data_ = nullptr;
 }
 
 GrowableIOBuffer::GrowableIOBuffer()
@@ -160,7 +157,7 @@
 }
 
 GrowableIOBuffer::~GrowableIOBuffer() {
-  data_ = NULL;
+  data_ = nullptr;
 }
 
 PickledIOBuffer::PickledIOBuffer() : IOBuffer() {
@@ -171,7 +168,7 @@
 }
 
 PickledIOBuffer::~PickledIOBuffer() {
-  data_ = NULL;
+  data_ = nullptr;
 }
 
 WrappedIOBuffer::WrappedIOBuffer(const char* data)
@@ -179,7 +176,7 @@
 }
 
 WrappedIOBuffer::~WrappedIOBuffer() {
-  data_ = NULL;
+  data_ = nullptr;
 }
 
 }  // namespace net
diff --git a/net/base/ip_endpoint_unittest.cc b/net/base/ip_endpoint_unittest.cc
index fa32dfa..a2220bf 100644
--- a/net/base/ip_endpoint_unittest.cc
+++ b/net/base/ip_endpoint_unittest.cc
@@ -38,7 +38,7 @@
     return &sockaddr->sin6_port;
   } else {
     NOTREACHED();
-    return NULL;
+    return nullptr;
   }
 }
 
diff --git a/net/base/layered_network_delegate_unittest.cc b/net/base/layered_network_delegate_unittest.cc
index d791f913..9ae629c7 100644
--- a/net/base/layered_network_delegate_unittest.cc
+++ b/net/base/layered_network_delegate_unittest.cc
@@ -189,25 +189,27 @@
     ProxyRetryInfoMap proxy_retry_info;
 
     EXPECT_EQ(OK, OnBeforeURLRequest(request.get(),
-                                     completion_callback.callback(), NULL));
-    EXPECT_EQ(OK, OnBeforeStartTransaction(NULL, completion_callback.callback(),
-                                           request_headers.get()));
-    OnBeforeSendHeaders(NULL, ProxyInfo(), proxy_retry_info,
+                                     completion_callback.callback(), nullptr));
+    EXPECT_EQ(OK,
+              OnBeforeStartTransaction(nullptr, completion_callback.callback(),
+                                       request_headers.get()));
+    OnBeforeSendHeaders(nullptr, ProxyInfo(), proxy_retry_info,
                         request_headers.get());
-    OnStartTransaction(NULL, *request_headers);
+    OnStartTransaction(nullptr, *request_headers);
     OnNetworkBytesSent(request.get(), 42);
-    EXPECT_EQ(OK, OnHeadersReceived(NULL, completion_callback.callback(),
-                                    response_headers.get(), NULL, NULL));
+    EXPECT_EQ(OK, OnHeadersReceived(nullptr, completion_callback.callback(),
+                                    response_headers.get(), nullptr, nullptr));
     OnResponseStarted(request.get(), net::OK);
     OnNetworkBytesReceived(request.get(), 42);
     OnCompleted(request.get(), false, net::OK);
     OnURLRequestDestroyed(request.get());
     OnPACScriptError(0, base::string16());
-    EXPECT_EQ(
-        NetworkDelegate::AUTH_REQUIRED_RESPONSE_NO_ACTION,
-        OnAuthRequired(request.get(), *auth_challenge, AuthCallback(), NULL));
+    EXPECT_EQ(NetworkDelegate::AUTH_REQUIRED_RESPONSE_NO_ACTION,
+              OnAuthRequired(request.get(), *auth_challenge, AuthCallback(),
+                             nullptr));
     EXPECT_FALSE(OnCanGetCookies(*request, CookieList(), true));
-    EXPECT_FALSE(OnCanSetCookie(*request, net::CanonicalCookie(), NULL, true));
+    EXPECT_FALSE(
+        OnCanSetCookie(*request, net::CanonicalCookie(), nullptr, true));
     EXPECT_FALSE(OnCanAccessFile(*request, base::FilePath(), base::FilePath()));
     EXPECT_FALSE(OnForcePrivacyMode(GURL(), GURL()));
     EXPECT_FALSE(OnCancelURLRequestWithPolicyViolatingReferrerHeader(
diff --git a/net/base/mime_sniffer.cc b/net/base/mime_sniffer.cc
index 408cacc..6741cc8 100644
--- a/net/base/mime_sniffer.cc
+++ b/net/base/mime_sniffer.cc
@@ -325,7 +325,7 @@
   // pretend the length is content_size.
   const char* end = static_cast<const char*>(memchr(content, '\0', size));
   const size_t content_strlen =
-      (end != NULL) ? static_cast<size_t>(end - content) : size;
+      (end != nullptr) ? static_cast<size_t>(end - content) : size;
 
   bool match = false;
   if (magic_entry.is_string) {
diff --git a/net/base/mime_util.cc b/net/base/mime_util.cc
index 112488e..a2ff77a 100644
--- a/net/base/mime_util.cc
+++ b/net/base/mime_util.cc
@@ -235,7 +235,7 @@
       extensions += 1;  // skip over comma
     }
   }
-  return NULL;
+  return nullptr;
 }
 
 static base::FilePath::StringType StringToFilePathStringType(
diff --git a/net/base/mime_util_unittest.cc b/net/base/mime_util_unittest.cc
index 7474ce2e..49ce634 100644
--- a/net/base/mime_util_unittest.cc
+++ b/net/base/mime_util_unittest.cc
@@ -189,13 +189,13 @@
 
 TEST(MimeUtilTest, TestParseMimeTypeWithoutParameter) {
   std::string nonAscii("application/nonutf8");
-  EXPECT_TRUE(ParseMimeTypeWithoutParameter(nonAscii, NULL, NULL));
+  EXPECT_TRUE(ParseMimeTypeWithoutParameter(nonAscii, nullptr, nullptr));
 #if defined(OS_WIN)
   nonAscii.append(base::WideToUTF8(L"\u2603"));
 #else
   nonAscii.append("\u2603");  // unicode snowman
 #endif
-  EXPECT_FALSE(ParseMimeTypeWithoutParameter(nonAscii, NULL, NULL));
+  EXPECT_FALSE(ParseMimeTypeWithoutParameter(nonAscii, nullptr, nullptr));
 
   std::string top_level_type;
   std::string subtype;
@@ -205,57 +205,64 @@
   EXPECT_EQ("mime", subtype);
 
   // Various allowed subtype forms.
-  EXPECT_TRUE(ParseMimeTypeWithoutParameter("application/json", NULL, NULL));
-  EXPECT_TRUE(ParseMimeTypeWithoutParameter(
-      "application/x-suggestions+json", NULL, NULL));
-  EXPECT_TRUE(ParseMimeTypeWithoutParameter("application/+json", NULL, NULL));
+  EXPECT_TRUE(
+      ParseMimeTypeWithoutParameter("application/json", nullptr, nullptr));
+  EXPECT_TRUE(ParseMimeTypeWithoutParameter("application/x-suggestions+json",
+                                            nullptr, nullptr));
+  EXPECT_TRUE(
+      ParseMimeTypeWithoutParameter("application/+json", nullptr, nullptr));
 
   // Upper case letters are allowed.
-  EXPECT_TRUE(ParseMimeTypeWithoutParameter("text/mime", NULL, NULL));
-  EXPECT_TRUE(ParseMimeTypeWithoutParameter("TEXT/mime", NULL, NULL));
-  EXPECT_TRUE(ParseMimeTypeWithoutParameter("Text/mime", NULL, NULL));
-  EXPECT_TRUE(ParseMimeTypeWithoutParameter("TeXt/mime", NULL, NULL));
+  EXPECT_TRUE(ParseMimeTypeWithoutParameter("text/mime", nullptr, nullptr));
+  EXPECT_TRUE(ParseMimeTypeWithoutParameter("TEXT/mime", nullptr, nullptr));
+  EXPECT_TRUE(ParseMimeTypeWithoutParameter("Text/mime", nullptr, nullptr));
+  EXPECT_TRUE(ParseMimeTypeWithoutParameter("TeXt/mime", nullptr, nullptr));
 
   // Experimental types are also considered to be valid.
-  EXPECT_TRUE(ParseMimeTypeWithoutParameter("x-video/mime", NULL, NULL));
-  EXPECT_TRUE(ParseMimeTypeWithoutParameter("X-Video/mime", NULL, NULL));
+  EXPECT_TRUE(ParseMimeTypeWithoutParameter("x-video/mime", nullptr, nullptr));
+  EXPECT_TRUE(ParseMimeTypeWithoutParameter("X-Video/mime", nullptr, nullptr));
 
-  EXPECT_FALSE(ParseMimeTypeWithoutParameter("text", NULL, NULL));
-  EXPECT_FALSE(ParseMimeTypeWithoutParameter("text/", NULL, NULL));
-  EXPECT_FALSE(ParseMimeTypeWithoutParameter("text/ ", NULL, NULL));
-  EXPECT_FALSE(ParseMimeTypeWithoutParameter("te(xt/ ", NULL, NULL));
-  EXPECT_FALSE(ParseMimeTypeWithoutParameter("text/()plain", NULL, NULL));
+  EXPECT_FALSE(ParseMimeTypeWithoutParameter("text", nullptr, nullptr));
+  EXPECT_FALSE(ParseMimeTypeWithoutParameter("text/", nullptr, nullptr));
+  EXPECT_FALSE(ParseMimeTypeWithoutParameter("text/ ", nullptr, nullptr));
+  EXPECT_FALSE(ParseMimeTypeWithoutParameter("te(xt/ ", nullptr, nullptr));
+  EXPECT_FALSE(ParseMimeTypeWithoutParameter("text/()plain", nullptr, nullptr));
 
-  EXPECT_FALSE(ParseMimeTypeWithoutParameter("x-video", NULL, NULL));
-  EXPECT_FALSE(ParseMimeTypeWithoutParameter("x-video/", NULL, NULL));
+  EXPECT_FALSE(ParseMimeTypeWithoutParameter("x-video", nullptr, nullptr));
+  EXPECT_FALSE(ParseMimeTypeWithoutParameter("x-video/", nullptr, nullptr));
 
-  EXPECT_FALSE(ParseMimeTypeWithoutParameter("application/a/b/c", NULL, NULL));
+  EXPECT_FALSE(
+      ParseMimeTypeWithoutParameter("application/a/b/c", nullptr, nullptr));
 
   // Test leading and trailing whitespace
-  EXPECT_TRUE(ParseMimeTypeWithoutParameter(" text/plain", NULL, NULL));
-  EXPECT_TRUE(ParseMimeTypeWithoutParameter("text/plain ", NULL, NULL));
-  EXPECT_FALSE(ParseMimeTypeWithoutParameter("text /plain", NULL, NULL));
-  EXPECT_FALSE(ParseMimeTypeWithoutParameter("text/ plain ", NULL, NULL));
+  EXPECT_TRUE(ParseMimeTypeWithoutParameter(" text/plain", nullptr, nullptr));
+  EXPECT_TRUE(ParseMimeTypeWithoutParameter("text/plain ", nullptr, nullptr));
+  EXPECT_FALSE(ParseMimeTypeWithoutParameter("text /plain", nullptr, nullptr));
+  EXPECT_FALSE(ParseMimeTypeWithoutParameter("text/ plain ", nullptr, nullptr));
 
-  EXPECT_TRUE(ParseMimeTypeWithoutParameter("\ttext/plain", NULL, NULL));
-  EXPECT_TRUE(ParseMimeTypeWithoutParameter("text/plain\t", NULL, NULL));
-  EXPECT_FALSE(ParseMimeTypeWithoutParameter("text\t/plain", NULL, NULL));
-  EXPECT_FALSE(ParseMimeTypeWithoutParameter("text/\tplain ", NULL, NULL));
+  EXPECT_TRUE(ParseMimeTypeWithoutParameter("\ttext/plain", nullptr, nullptr));
+  EXPECT_TRUE(ParseMimeTypeWithoutParameter("text/plain\t", nullptr, nullptr));
+  EXPECT_FALSE(ParseMimeTypeWithoutParameter("text\t/plain", nullptr, nullptr));
+  EXPECT_FALSE(
+      ParseMimeTypeWithoutParameter("text/\tplain ", nullptr, nullptr));
 
-  EXPECT_TRUE(ParseMimeTypeWithoutParameter("\vtext/plain", NULL, NULL));
-  EXPECT_TRUE(ParseMimeTypeWithoutParameter("text/plain\v", NULL, NULL));
-  EXPECT_FALSE(ParseMimeTypeWithoutParameter("text\v/plain", NULL, NULL));
-  EXPECT_FALSE(ParseMimeTypeWithoutParameter("text/\vplain ", NULL, NULL));
+  EXPECT_TRUE(ParseMimeTypeWithoutParameter("\vtext/plain", nullptr, nullptr));
+  EXPECT_TRUE(ParseMimeTypeWithoutParameter("text/plain\v", nullptr, nullptr));
+  EXPECT_FALSE(ParseMimeTypeWithoutParameter("text\v/plain", nullptr, nullptr));
+  EXPECT_FALSE(
+      ParseMimeTypeWithoutParameter("text/\vplain ", nullptr, nullptr));
 
-  EXPECT_TRUE(ParseMimeTypeWithoutParameter("\rtext/plain", NULL, NULL));
-  EXPECT_TRUE(ParseMimeTypeWithoutParameter("text/plain\r", NULL, NULL));
-  EXPECT_FALSE(ParseMimeTypeWithoutParameter("text\r/plain", NULL, NULL));
-  EXPECT_FALSE(ParseMimeTypeWithoutParameter("text/\rplain ", NULL, NULL));
+  EXPECT_TRUE(ParseMimeTypeWithoutParameter("\rtext/plain", nullptr, nullptr));
+  EXPECT_TRUE(ParseMimeTypeWithoutParameter("text/plain\r", nullptr, nullptr));
+  EXPECT_FALSE(ParseMimeTypeWithoutParameter("text\r/plain", nullptr, nullptr));
+  EXPECT_FALSE(
+      ParseMimeTypeWithoutParameter("text/\rplain ", nullptr, nullptr));
 
-  EXPECT_TRUE(ParseMimeTypeWithoutParameter("\ntext/plain", NULL, NULL));
-  EXPECT_TRUE(ParseMimeTypeWithoutParameter("text/plain\n", NULL, NULL));
-  EXPECT_FALSE(ParseMimeTypeWithoutParameter("text\n/plain", NULL, NULL));
-  EXPECT_FALSE(ParseMimeTypeWithoutParameter("text/\nplain ", NULL, NULL));
+  EXPECT_TRUE(ParseMimeTypeWithoutParameter("\ntext/plain", nullptr, nullptr));
+  EXPECT_TRUE(ParseMimeTypeWithoutParameter("text/plain\n", nullptr, nullptr));
+  EXPECT_FALSE(ParseMimeTypeWithoutParameter("text\n/plain", nullptr, nullptr));
+  EXPECT_FALSE(
+      ParseMimeTypeWithoutParameter("text/\nplain ", nullptr, nullptr));
 
   //EXPECT_TRUE(ParseMimeTypeWithoutParameter("video/mime;parameter"));
 }
@@ -293,18 +300,18 @@
     const char* const contained_result;
     bool no_matches;
   } tests[] = {
-    {"text/plain", 2, "txt"},
-    {"text/pl", 0, NULL, true},
-    {"*", 0, NULL},
-    {"", 0, NULL, true},
-    {"message/*", 1, "eml"},
-    {"MeSsAge/*", 1, "eml"},
-    {"message/", 0, NULL, true},
-    {"image/bmp", 1, "bmp"},
-    {"video/*", 6, "mp4"},
-    {"video/*", 6, "mpeg"},
-    {"audio/*", 6, "oga"},
-    {"aUDIo/*", 6, "wav"},
+      {"text/plain", 2, "txt"},
+      {"text/pl", 0, nullptr, true},
+      {"*", 0, nullptr},
+      {"", 0, nullptr, true},
+      {"message/*", 1, "eml"},
+      {"MeSsAge/*", 1, "eml"},
+      {"message/", 0, nullptr, true},
+      {"image/bmp", 1, "bmp"},
+      {"video/*", 6, "mp4"},
+      {"video/*", 6, "mpeg"},
+      {"audio/*", 6, "oga"},
+      {"aUDIo/*", 6, "wav"},
   };
 
   for (const auto& test : tests) {
diff --git a/net/base/network_activity_monitor_unittest.cc b/net/base/network_activity_monitor_unittest.cc
index d7b6ceaa..e38e4dc 100644
--- a/net/base/network_activity_monitor_unittest.cc
+++ b/net/base/network_activity_monitor_unittest.cc
@@ -41,7 +41,7 @@
 
 TEST_F(NetworkActivityMontiorTest, GetInstance) {
   NetworkActivityMonitor* monitor = NetworkActivityMonitor::GetInstance();
-  EXPECT_TRUE(monitor != NULL);
+  EXPECT_TRUE(monitor != nullptr);
   EXPECT_TRUE(monitor == NetworkActivityMonitor::GetInstance());
 }
 
diff --git a/net/base/network_change_notifier.cc b/net/base/network_change_notifier.cc
index 55772fc..b45a33be 100644
--- a/net/base/network_change_notifier.cc
+++ b/net/base/network_change_notifier.cc
@@ -47,10 +47,10 @@
 // in ways that would require us to place locks around access to this object.
 // (The prohibition on global non-POD objects makes it tricky to do such a thing
 // anyway.)
-NetworkChangeNotifier* g_network_change_notifier = NULL;
+NetworkChangeNotifier* g_network_change_notifier = nullptr;
 
 // Class factory singleton.
-NetworkChangeNotifierFactory* g_network_change_notifier_factory = NULL;
+NetworkChangeNotifierFactory* g_network_change_notifier_factory = nullptr;
 
 class MockNetworkChangeNotifier : public NetworkChangeNotifier {
  public:
@@ -183,7 +183,7 @@
 NetworkChangeNotifier::~NetworkChangeNotifier() {
   network_change_calculator_.reset();
   DCHECK_EQ(this, g_network_change_notifier);
-  g_network_change_notifier = NULL;
+  g_network_change_notifier = nullptr;
 }
 
 // static
@@ -864,7 +864,7 @@
 NetworkChangeNotifier::DisableForTest::DisableForTest()
     : network_change_notifier_(g_network_change_notifier) {
   DCHECK(g_network_change_notifier);
-  g_network_change_notifier = NULL;
+  g_network_change_notifier = nullptr;
 }
 
 NetworkChangeNotifier::DisableForTest::~DisableForTest() {
diff --git a/net/base/network_change_notifier_win.cc b/net/base/network_change_notifier_win.cc
index 4031e87d..3393d9a 100644
--- a/net/base/network_change_notifier_win.cc
+++ b/net/base/network_change_notifier_win.cc
@@ -310,7 +310,7 @@
   }
 
   ResetEventIfSignaled(addr_overlapped_.hEvent);
-  HANDLE handle = NULL;
+  HANDLE handle = nullptr;
   DWORD ret = NotifyAddrChange(&handle, &addr_overlapped_);
   if (ret != ERROR_IO_PENDING)
     return false;
diff --git a/net/base/network_interfaces_unittest.cc b/net/base/network_interfaces_unittest.cc
index 428eeec..843de293 100644
--- a/net/base/network_interfaces_unittest.cc
+++ b/net/base/network_interfaces_unittest.cc
@@ -68,7 +68,7 @@
   // We can't check the result of GetWifiSSID() directly, since the result
   // will differ across machines. Simply exercise the code path and hope that it
   // doesn't crash.
-  EXPECT_NE((const char*)NULL, GetWifiSSID().c_str());
+  EXPECT_NE((const char*)nullptr, GetWifiSSID().c_str());
 }
 
 TEST(NetworkInterfacesTest, GetHostName) {
diff --git a/net/base/network_interfaces_win.cc b/net/base/network_interfaces_win.cc
index 33b1adc..6c3dde1 100644
--- a/net/base/network_interfaces_win.cc
+++ b/net/base/network_interfaces_win.cc
@@ -55,16 +55,16 @@
   if (result != ERROR_SUCCESS)
     return wlan_connection_attributes;
 
-  WLAN_INTERFACE_INFO_LIST* interface_list_ptr = NULL;
+  WLAN_INTERFACE_INFO_LIST* interface_list_ptr = nullptr;
   result =
-      wlanapi.enum_interfaces_func(client.Get(), NULL, &interface_list_ptr);
+      wlanapi.enum_interfaces_func(client.Get(), nullptr, &interface_list_ptr);
   if (result != ERROR_SUCCESS)
     return wlan_connection_attributes;
   std::unique_ptr<WLAN_INTERFACE_INFO_LIST, internal::WlanApiDeleter>
       interface_list(interface_list_ptr);
 
   // Assume at most one connected wifi interface.
-  WLAN_INTERFACE_INFO* info = NULL;
+  WLAN_INTERFACE_INFO* info = nullptr;
   for (unsigned i = 0; i < interface_list->dwNumberOfItems; ++i) {
     if (interface_list->InterfaceInfo[i].isState ==
         wlan_interface_state_connected) {
@@ -73,7 +73,7 @@
     }
   }
 
-  if (info == NULL)
+  if (info == nullptr)
     return wlan_connection_attributes;
 
   WLAN_CONNECTION_ATTRIBUTES* conn_info_ptr = nullptr;
@@ -81,7 +81,7 @@
   WLAN_OPCODE_VALUE_TYPE op_code;
   result = wlanapi.query_interface_func(
       client.Get(), &info->InterfaceGuid, wlan_intf_opcode_current_connection,
-      NULL, &conn_info_size, reinterpret_cast<VOID**>(&conn_info_ptr),
+      nullptr, &conn_info_size, reinterpret_cast<VOID**>(&conn_info_ptr),
       &op_code);
   wlan_connection_attributes.reset(conn_info_ptr);
   if (result == ERROR_SUCCESS)
@@ -107,7 +107,7 @@
   static const wchar_t* const kDLL = L"%WINDIR%\\system32\\wlanapi.dll";
   wchar_t path[MAX_PATH] = {0};
   ExpandEnvironmentStrings(kDLL, path, base::size(path));
-  module = ::LoadLibraryEx(path, NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
+  module = ::LoadLibraryEx(path, nullptr, LOAD_WITH_ALTERED_SEARCH_PATH);
   if (!module)
     return;
 
@@ -131,7 +131,7 @@
 bool GetNetworkListImpl(NetworkInterfaceList* networks,
                         int policy,
                         const IP_ADAPTER_ADDRESSES* adapters) {
-  for (const IP_ADAPTER_ADDRESSES* adapter = adapters; adapter != NULL;
+  for (const IP_ADAPTER_ADDRESSES* adapter = adapters; adapter != nullptr;
        adapter = adapter->Next) {
     // Ignore the loopback device.
     if (adapter->IfType == IF_TYPE_SOFTWARE_LOOPBACK) {
@@ -147,7 +147,7 @@
     // but don't ignore any GUEST side adapters with a description like:
     // VMware Accelerated AMD PCNet Adapter #2
     if ((policy & EXCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES) &&
-        strstr(adapter->AdapterName, "VMnet") != NULL) {
+        strstr(adapter->AdapterName, "VMnet") != nullptr) {
       continue;
     }
 
@@ -289,8 +289,8 @@
     if (result != ERROR_SUCCESS)
       return;
 
-    WLAN_INTERFACE_INFO_LIST* interface_list_ptr = NULL;
-    result = wlanapi.enum_interfaces_func(client_.Get(), NULL,
+    WLAN_INTERFACE_INFO_LIST* interface_list_ptr = nullptr;
+    result = wlanapi.enum_interfaces_func(client_.Get(), nullptr,
                                           &interface_list_ptr);
     if (result != ERROR_SUCCESS)
       return;
@@ -301,21 +301,15 @@
       WLAN_INTERFACE_INFO* info = &interface_list->InterfaceInfo[i];
       if (options & WIFI_OPTIONS_DISABLE_SCAN) {
         BOOL data = false;
-        wlanapi.set_interface_func(client_.Get(),
-                                   &info->InterfaceGuid,
+        wlanapi.set_interface_func(client_.Get(), &info->InterfaceGuid,
                                    wlan_intf_opcode_background_scan_enabled,
-                                   sizeof(data),
-                                   &data,
-                                   NULL);
+                                   sizeof(data), &data, nullptr);
       }
       if (options & WIFI_OPTIONS_MEDIA_STREAMING_MODE) {
         BOOL data = true;
-        wlanapi.set_interface_func(client_.Get(),
-                                   &info->InterfaceGuid,
+        wlanapi.set_interface_func(client_.Get(), &info->InterfaceGuid,
                                    wlan_intf_opcode_media_streaming_mode,
-                                   sizeof(data),
-                                   &data,
-                                   NULL);
+                                   sizeof(data), &data, nullptr);
       }
     }
   }
diff --git a/net/base/network_interfaces_win.h b/net/base/network_interfaces_win.h
index 5ca75c31..737f20e 100644
--- a/net/base/network_interfaces_win.h
+++ b/net/base/network_interfaces_win.h
@@ -38,8 +38,8 @@
   template <typename T>
   DWORD OpenHandle(DWORD client_version, DWORD* cur_version, T* handle) const {
     HANDLE temp_handle;
-    DWORD result = open_handle_func(client_version, NULL, cur_version,
-                                    &temp_handle);
+    DWORD result =
+        open_handle_func(client_version, nullptr, cur_version, &temp_handle);
     if (result != ERROR_SUCCESS)
       return result;
     handle->Set(temp_handle);
@@ -60,8 +60,8 @@
   typedef HANDLE Handle;
 
   static bool CloseHandle(HANDLE handle) {
-    return WlanApi::GetInstance().close_handle_func(handle, NULL) ==
-        ERROR_SUCCESS;
+    return WlanApi::GetInstance().close_handle_func(handle, nullptr) ==
+           ERROR_SUCCESS;
   }
   static bool IsHandleValid(HANDLE handle) {
     return base::win::HandleTraits::IsHandleValid(handle);
diff --git a/net/base/network_interfaces_win_unittest.cc b/net/base/network_interfaces_win_unittest.cc
index 4d112f3b..5141718 100644
--- a/net/base/network_interfaces_win_unittest.cc
+++ b/net/base/network_interfaces_win_unittest.cc
@@ -211,9 +211,9 @@
   if (result != ERROR_SUCCESS)
     return -1;
 
-  WLAN_INTERFACE_INFO_LIST* interface_list_ptr = NULL;
+  WLAN_INTERFACE_INFO_LIST* interface_list_ptr = nullptr;
   result =
-      wlanapi.enum_interfaces_func(client.Get(), NULL, &interface_list_ptr);
+      wlanapi.enum_interfaces_func(client.Get(), nullptr, &interface_list_ptr);
   if (result != ERROR_SUCCESS)
     return -1;
   std::unique_ptr<WLAN_INTERFACE_INFO_LIST, internal::WlanApiDeleter>
@@ -227,7 +227,7 @@
     result =
         wlanapi.query_interface_func(client.Get(), &info->InterfaceGuid,
                                      wlan_intf_opcode_background_scan_enabled,
-                                     NULL, &data_size, &data, NULL);
+                                     nullptr, &data_size, &data, nullptr);
     if (result != ERROR_SUCCESS)
       continue;
     if (!read_int_or_bool(data_size, data)) {
@@ -237,7 +237,7 @@
 
     result = wlanapi.query_interface_func(client.Get(), &info->InterfaceGuid,
                                           wlan_intf_opcode_media_streaming_mode,
-                                          NULL, &data_size, &data, NULL);
+                                          nullptr, &data_size, &data, nullptr);
     if (result != ERROR_SUCCESS)
       continue;
     if (read_int_or_bool(data_size, data)) {
diff --git a/net/base/prioritized_dispatcher.cc b/net/base/prioritized_dispatcher.cc
index 747a454..79baa33 100644
--- a/net/base/prioritized_dispatcher.cc
+++ b/net/base/prioritized_dispatcher.cc
@@ -56,7 +56,7 @@
 PrioritizedDispatcher::Job* PrioritizedDispatcher::EvictOldestLowest() {
   Handle handle = queue_.FirstMin();
   if (handle.is_null())
-    return NULL;
+    return nullptr;
   Job* job = handle.value();
   Cancel(handle);
   return job;
diff --git a/net/base/prioritized_dispatcher_unittest.cc b/net/base/prioritized_dispatcher_unittest.cc
index 3970ff4d..389d20db 100644
--- a/net/base/prioritized_dispatcher_unittest.cc
+++ b/net/base/prioritized_dispatcher_unittest.cc
@@ -406,7 +406,7 @@
 TEST_F(PrioritizedDispatcherTest, EvictFromEmpty) {
   PrioritizedDispatcher::Limits limits(NUM_PRIORITIES, 1);
   Prepare(limits);
-  EXPECT_TRUE(dispatcher_->EvictOldestLowest() == NULL);
+  EXPECT_TRUE(dispatcher_->EvictOldestLowest() == nullptr);
 }
 
 TEST_F(PrioritizedDispatcherTest, AddWhileZeroLimits) {
diff --git a/net/base/test_completion_callback_unittest.cc b/net/base/test_completion_callback_unittest.cc
index 8ee06e0b1..b799d4b 100644
--- a/net/base/test_completion_callback_unittest.cc
+++ b/net/base/test_completion_callback_unittest.cc
@@ -84,7 +84,7 @@
   // Drop the employer_'s reference to us.  Do this before running the
   // callback since the callback might result in the employer being
   // destroyed.
-  employer_->request_ = NULL;
+  employer_->request_ = nullptr;
 
   std::move(callback_).Run(kMagicResult);
 }
@@ -101,7 +101,7 @@
   if (!base::ThreadTaskRunnerHandle::Get()->PostTask(
           FROM_HERE, base::BindOnce(&ExampleWorker::DoWork, request_))) {
     NOTREACHED();
-    request_ = NULL;
+    request_ = nullptr;
     return false;
   }
 
diff --git a/net/base/upload_data_stream.cc b/net/base/upload_data_stream.cc
index bd7b8f7..193872e63 100644
--- a/net/base/upload_data_stream.cc
+++ b/net/base/upload_data_stream.cc
@@ -143,7 +143,7 @@
 
 const std::vector<std::unique_ptr<UploadElementReader>>*
 UploadDataStream::GetElementReaders() const {
-  return NULL;
+  return nullptr;
 }
 
 void UploadDataStream::OnInitCompleted(int result) {
diff --git a/net/cert/cert_verify_proc.cc b/net/cert/cert_verify_proc.cc
index 3cd0f3d..9196b77 100644
--- a/net/cert/cert_verify_proc.cc
+++ b/net/cert/cert_verify_proc.cc
@@ -100,7 +100,7 @@
                          CertTypeToString(cert_type));
   // Do not use UMA_HISTOGRAM_... macros here, as it caches the Histogram
   // instance and thus only works if |histogram_name| is constant.
-  base::HistogramBase* counter = NULL;
+  base::HistogramBase* counter = nullptr;
 
   // Histogram buckets are contingent upon the underlying algorithm being used.
   if (cert_type == X509Certificate::kPublicKeyTypeECDH ||
diff --git a/net/cert/cert_verify_proc_unittest.cc b/net/cert/cert_verify_proc_unittest.cc
index 237ad0e..aa87982 100644
--- a/net/cert/cert_verify_proc_unittest.cc
+++ b/net/cert/cert_verify_proc_unittest.cc
@@ -906,7 +906,7 @@
           reinterpret_cast<const char*>(paypal_null_der),
           sizeof(paypal_null_der)));
 
-  ASSERT_NE(static_cast<X509Certificate*>(NULL), paypal_null_cert.get());
+  ASSERT_NE(static_cast<X509Certificate*>(nullptr), paypal_null_cert.get());
 
   EXPECT_EQ(paypal_null_fingerprint, X509Certificate::CalculateFingerprint256(
                                          paypal_null_cert->cert_buffer()));
@@ -1097,7 +1097,7 @@
   // Add the root that signed the intermediates for this test.
   scoped_refptr<X509Certificate> root_cert =
       ImportCertFromFile(certs_dir, "2048-rsa-root.pem");
-  ASSERT_NE(static_cast<X509Certificate*>(NULL), root_cert.get());
+  ASSERT_NE(static_cast<X509Certificate*>(nullptr), root_cert.get());
   ScopedTestRoot scoped_root(root_cert.get());
 
   // Now test each chain.
@@ -1110,12 +1110,12 @@
       SCOPED_TRACE(basename);
       scoped_refptr<X509Certificate> ee_cert =
           ImportCertFromFile(certs_dir, basename);
-      ASSERT_NE(static_cast<X509Certificate*>(NULL), ee_cert.get());
+      ASSERT_NE(static_cast<X509Certificate*>(nullptr), ee_cert.get());
 
       basename = *signer_type + "-intermediate.pem";
       scoped_refptr<X509Certificate> intermediate =
           ImportCertFromFile(certs_dir, basename);
-      ASSERT_NE(static_cast<X509Certificate*>(NULL), intermediate.get());
+      ASSERT_NE(static_cast<X509Certificate*>(nullptr), intermediate.get());
 
       std::vector<bssl::UniquePtr<CRYPTO_BUFFER>> intermediates;
       intermediates.push_back(bssl::UpRef(intermediate->cert_buffer()));
@@ -1163,15 +1163,15 @@
 
   scoped_refptr<X509Certificate> server_cert =
       ImportCertFromFile(certs_dir, "cross-signed-leaf.pem");
-  ASSERT_NE(static_cast<X509Certificate*>(NULL), server_cert.get());
+  ASSERT_NE(static_cast<X509Certificate*>(nullptr), server_cert.get());
 
   scoped_refptr<X509Certificate> extra_cert =
       ImportCertFromFile(certs_dir, "cross-signed-root-md5.pem");
-  ASSERT_NE(static_cast<X509Certificate*>(NULL), extra_cert.get());
+  ASSERT_NE(static_cast<X509Certificate*>(nullptr), extra_cert.get());
 
   scoped_refptr<X509Certificate> root_cert =
       ImportCertFromFile(certs_dir, "cross-signed-root-sha256.pem");
-  ASSERT_NE(static_cast<X509Certificate*>(NULL), root_cert.get());
+  ASSERT_NE(static_cast<X509Certificate*>(nullptr), root_cert.get());
 
   ScopedTestRoot scoped_root(root_cert.get());
 
@@ -1204,11 +1204,11 @@
 
   scoped_refptr<X509Certificate> server_cert =
       ImportCertFromFile(certs_dir, "google_diginotar.pem");
-  ASSERT_NE(static_cast<X509Certificate*>(NULL), server_cert.get());
+  ASSERT_NE(static_cast<X509Certificate*>(nullptr), server_cert.get());
 
   scoped_refptr<X509Certificate> intermediate_cert =
       ImportCertFromFile(certs_dir, "diginotar_public_ca_2025.pem");
-  ASSERT_NE(static_cast<X509Certificate*>(NULL), intermediate_cert.get());
+  ASSERT_NE(static_cast<X509Certificate*>(nullptr), intermediate_cert.get());
 
   std::vector<bssl::UniquePtr<CRYPTO_BUFFER>> intermediates;
   intermediates.push_back(bssl::UpRef(intermediate_cert->cert_buffer()));
@@ -1767,7 +1767,7 @@
 
   scoped_refptr<X509Certificate> server_cert =
       ImportCertFromFile(certs_dir, "invalid_key_usage_cert.der");
-  ASSERT_NE(static_cast<X509Certificate*>(NULL), server_cert.get());
+  ASSERT_NE(static_cast<X509Certificate*>(nullptr), server_cert.get());
 
   int flags = 0;
   CertVerifyResult verify_result;
@@ -1860,17 +1860,17 @@
   scoped_refptr<X509Certificate> google_full_chain =
       X509Certificate::CreateFromBuffer(bssl::UpRef(certs[0]->cert_buffer()),
                                         std::move(intermediates));
-  ASSERT_NE(static_cast<X509Certificate*>(NULL), google_full_chain.get());
+  ASSERT_NE(static_cast<X509Certificate*>(nullptr), google_full_chain.get());
   ASSERT_EQ(2U, google_full_chain->intermediate_buffers().size());
 
   CertVerifyResult verify_result;
-  EXPECT_EQ(static_cast<X509Certificate*>(NULL),
+  EXPECT_EQ(static_cast<X509Certificate*>(nullptr),
             verify_result.verified_cert.get());
   int error =
       Verify(google_full_chain.get(), "127.0.0.1", 0,
              CRLSet::BuiltinCRLSet().get(), CertificateList(), &verify_result);
   EXPECT_THAT(error, IsOk());
-  ASSERT_NE(static_cast<X509Certificate*>(NULL),
+  ASSERT_NE(static_cast<X509Certificate*>(nullptr),
             verify_result.verified_cert.get());
 
   EXPECT_NE(google_full_chain, verify_result.verified_cert);
@@ -2121,8 +2121,10 @@
       ImportCertFromFile(certs_dir, "duplicate_cn_1.pem");
   scoped_refptr<X509Certificate> unrelated_certificate2 =
       ImportCertFromFile(certs_dir, "aia-cert.pem");
-  ASSERT_NE(static_cast<X509Certificate*>(NULL), unrelated_certificate.get());
-  ASSERT_NE(static_cast<X509Certificate*>(NULL), unrelated_certificate2.get());
+  ASSERT_NE(static_cast<X509Certificate*>(nullptr),
+            unrelated_certificate.get());
+  ASSERT_NE(static_cast<X509Certificate*>(nullptr),
+            unrelated_certificate2.get());
 
   // Interject unrelated certificates into the list of intermediates.
   std::vector<bssl::UniquePtr<CRYPTO_BUFFER>> intermediates;
@@ -3263,11 +3265,11 @@
 // unable to distinguish that this is an intermediate and not a trust anchor, so
 // this intermediate is treated like a trust anchor.
 const WeakDigestTestData kVerifyIncompleteIntermediateTestData[] = {
-    {NULL, "weak_digest_md5_intermediate.pem", "weak_digest_sha1_ee.pem",
+    {nullptr, "weak_digest_md5_intermediate.pem", "weak_digest_sha1_ee.pem",
      /*EXPECT_MD5 |*/ EXPECT_SHA1 | EXPECT_SHA1_LEAF},
-    {NULL, "weak_digest_md4_intermediate.pem", "weak_digest_sha1_ee.pem",
+    {nullptr, "weak_digest_md4_intermediate.pem", "weak_digest_sha1_ee.pem",
      /*EXPECT_MD4 |*/ EXPECT_SHA1 | EXPECT_SHA1_LEAF},
-    {NULL, "weak_digest_md2_intermediate.pem", "weak_digest_sha1_ee.pem",
+    {nullptr, "weak_digest_md2_intermediate.pem", "weak_digest_sha1_ee.pem",
      /*EXPECT_MD2 |*/ EXPECT_SHA1 | EXPECT_SHA1_LEAF},
 };
 
@@ -3282,11 +3284,11 @@
 // this is an intermediate and not a trust anchor, so this intermediate is
 // treated like a trust anchor.
 const WeakDigestTestData kVerifyIncompleteEETestData[] = {
-    {NULL, "weak_digest_sha1_intermediate.pem", "weak_digest_md5_ee.pem",
+    {nullptr, "weak_digest_sha1_intermediate.pem", "weak_digest_md5_ee.pem",
      /*EXPECT_SHA1 |*/ EXPECT_MD5},
-    {NULL, "weak_digest_sha1_intermediate.pem", "weak_digest_md4_ee.pem",
+    {nullptr, "weak_digest_sha1_intermediate.pem", "weak_digest_md4_ee.pem",
      /*EXPECT_SHA1 |*/ EXPECT_MD4},
-    {NULL, "weak_digest_sha1_intermediate.pem", "weak_digest_md2_ee.pem",
+    {nullptr, "weak_digest_sha1_intermediate.pem", "weak_digest_md2_ee.pem",
      /*EXPECT_SHA1 |*/ EXPECT_MD2},
 };
 
@@ -3312,10 +3314,10 @@
 // The EE is a trusted certificate. Even though it uses weak hashes, these
 // should not be reported.
 const WeakDigestTestData kVerifyTrustedEETestData[] = {
-    {NULL, NULL, "weak_digest_md5_ee.pem", 0},
-    {NULL, NULL, "weak_digest_md4_ee.pem", 0},
-    {NULL, NULL, "weak_digest_md2_ee.pem", 0},
-    {NULL, NULL, "weak_digest_sha1_ee.pem", 0},
+    {nullptr, nullptr, "weak_digest_md5_ee.pem", 0},
+    {nullptr, nullptr, "weak_digest_md4_ee.pem", 0},
+    {nullptr, nullptr, "weak_digest_md2_ee.pem", 0},
+    {nullptr, nullptr, "weak_digest_sha1_ee.pem", 0},
 };
 
 INSTANTIATE_TEST_SUITE_P(VerifyTrustedEE,
diff --git a/net/cert/cert_verify_proc_win.cc b/net/cert/cert_verify_proc_win.cc
index 03f2e60..95cfda8 100644
--- a/net/cert/cert_verify_proc_win.cc
+++ b/net/cert/cert_verify_proc_win.cc
@@ -183,7 +183,7 @@
   decode_para.cbSize = sizeof(decode_para);
   decode_para.pfnAlloc = crypto::CryptAlloc;
   decode_para.pfnFree = crypto::CryptFree;
-  CERT_NAME_INFO* name_info = NULL;
+  CERT_NAME_INFO* name_info = nullptr;
   DWORD name_info_size = 0;
   BOOL rv;
   rv = CryptDecodeObjectEx(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING,
@@ -279,7 +279,7 @@
   DWORD num_elements = first_chain->cElement;
   PCERT_CHAIN_ELEMENT* element = first_chain->rgpElement;
 
-  PCCERT_CONTEXT verified_cert = NULL;
+  PCCERT_CONTEXT verified_cert = nullptr;
   std::vector<PCCERT_CONTEXT> verified_chain;
 
   bool has_root_ca = num_elements > 1 &&
@@ -335,7 +335,7 @@
   decode_para.cbSize = sizeof(decode_para);
   decode_para.pfnAlloc = crypto::CryptAlloc;
   decode_para.pfnFree = crypto::CryptFree;
-  CERT_POLICIES_INFO* policies_info = NULL;
+  CERT_POLICIES_INFO* policies_info = nullptr;
   DWORD policies_info_size = 0;
   BOOL rv;
   rv = CryptDecodeObjectEx(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING,
@@ -628,7 +628,7 @@
          reinterpret_cast<void*>(&CertDllVerifyRevocationWithCRLSet)},
     };
     BOOL ok = CryptInstallOIDFunctionAddress(
-        NULL, X509_ASN_ENCODING, CRYPT_OID_VERIFY_REVOCATION_FUNC,
+        nullptr, X509_ASN_ENCODING, CRYPT_OID_VERIFY_REVOCATION_FUNC,
         base::size(kInterceptFunction), kInterceptFunction,
         CRYPT_INSTALL_OID_FUNC_BEFORE_FLAG);
     DCHECK(ok);
@@ -882,7 +882,7 @@
 
   // Get the certificatePolicies extension of the certificate.
   std::unique_ptr<CERT_POLICIES_INFO, base::FreeDeleter> policies_info;
-  LPSTR ev_policy_oid = NULL;
+  LPSTR ev_policy_oid = nullptr;
   GetCertPoliciesInfo(cert_list.get(), &policies_info);
   if (policies_info) {
     EVRootCAMetadata* metadata = EVRootCAMetadata::GetInstance();
@@ -982,9 +982,9 @@
   // calls will use the fallback path.
   BOOL chain_result =
       CertGetCertificateChain(chain_engine, cert_list.get(),
-                              NULL,  // current system time
+                              nullptr,  // current system time
                               cert_list->hCertStore, &chain_para, chain_flags,
-                              NULL,  // reserved
+                              nullptr,  // reserved
                               &chain_context);
   if (chain_result && chain_context &&
       (chain_context->TrustStatus.dwErrorStatus &
@@ -999,9 +999,9 @@
     chain_para.dwStrongSignFlags = 0;
     chain_result =
         CertGetCertificateChain(chain_engine, cert_list.get(),
-                                NULL,  // current system time
+                                nullptr,  // current system time
                                 cert_list->hCertStore, &chain_para, chain_flags,
-                                NULL,  // reserved
+                                nullptr,  // reserved
                                 &chain_context);
   }
 
@@ -1028,15 +1028,12 @@
     verify_result->cert_status |= CERT_STATUS_REV_CHECKING_ENABLED;
 
     CertFreeCertificateChain(chain_context);
-    if (!CertGetCertificateChain(
-             chain_engine,
-             cert_list.get(),
-             NULL,  // current system time
-             cert_list->hCertStore,
-             &chain_para,
-             chain_flags,
-             NULL,  // reserved
-             &chain_context)) {
+    if (!CertGetCertificateChain(chain_engine, cert_list.get(),
+                                 nullptr,  // current system time
+                                 cert_list->hCertStore, &chain_para,
+                                 chain_flags,
+                                 nullptr,  // reserved
+                                 &chain_context)) {
       verify_result->cert_status |= CERT_STATUS_INVALID;
       return MapSecurityError(GetLastError());
     }
@@ -1044,19 +1041,16 @@
 
   if (chain_context->TrustStatus.dwErrorStatus &
       CERT_TRUST_IS_NOT_VALID_FOR_USAGE) {
-    ev_policy_oid = NULL;
+    ev_policy_oid = nullptr;
     chain_para.RequestedIssuancePolicy.Usage.cUsageIdentifier = 0;
-    chain_para.RequestedIssuancePolicy.Usage.rgpszUsageIdentifier = NULL;
+    chain_para.RequestedIssuancePolicy.Usage.rgpszUsageIdentifier = nullptr;
     CertFreeCertificateChain(chain_context);
-    if (!CertGetCertificateChain(
-             chain_engine,
-             cert_list.get(),
-             NULL,  // current system time
-             cert_list->hCertStore,
-             &chain_para,
-             chain_flags,
-             NULL,  // reserved
-             &chain_context)) {
+    if (!CertGetCertificateChain(chain_engine, cert_list.get(),
+                                 nullptr,  // current system time
+                                 cert_list->hCertStore, &chain_para,
+                                 chain_flags,
+                                 nullptr,  // reserved
+                                 &chain_context)) {
       verify_result->cert_status |= CERT_STATUS_INVALID;
       return MapSecurityError(GetLastError());
     }
@@ -1073,15 +1067,12 @@
     chain_flags &= ~CERT_CHAIN_REVOCATION_CHECK_CACHE_ONLY;
 
     CertFreeCertificateChain(chain_context);
-    if (!CertGetCertificateChain(
-             chain_engine,
-             cert_list.get(),
-             NULL,  // current system time
-             cert_list->hCertStore,
-             &chain_para,
-             chain_flags,
-             NULL,  // reserved
-             &chain_context)) {
+    if (!CertGetCertificateChain(chain_engine, cert_list.get(),
+                                 nullptr,  // current system time
+                                 cert_list->hCertStore, &chain_para,
+                                 chain_flags,
+                                 nullptr,  // reserved
+                                 &chain_context)) {
       verify_result->cert_status |= CERT_STATUS_INVALID;
       return MapSecurityError(GetLastError());
     }
diff --git a/net/cert/cert_verify_result.cc b/net/cert/cert_verify_result.cc
index 7c4ecfa..cbbfb02 100644
--- a/net/cert/cert_verify_result.cc
+++ b/net/cert/cert_verify_result.cc
@@ -19,7 +19,7 @@
 CertVerifyResult::~CertVerifyResult() = default;
 
 void CertVerifyResult::Reset() {
-  verified_cert = NULL;
+  verified_cert = nullptr;
   cert_status = 0;
   has_md2 = false;
   has_md4 = false;
diff --git a/net/cert/crl_set_unittest.cc b/net/cert/crl_set_unittest.cc
index b9c89e6..a549950f 100644
--- a/net/cert/crl_set_unittest.cc
+++ b/net/cert/crl_set_unittest.cc
@@ -82,7 +82,7 @@
                       sizeof(kGIACRLSet));
   scoped_refptr<CRLSet> set;
   EXPECT_TRUE(CRLSet::Parse(s, &set));
-  ASSERT_TRUE(set.get() != NULL);
+  ASSERT_TRUE(set.get() != nullptr);
 
   const CRLSet::CRLList& crls = set->CrlsForTesting();
   ASSERT_EQ(1u, crls.size());
@@ -113,7 +113,7 @@
                       sizeof(kBlockedSPKICRLSet));
   scoped_refptr<CRLSet> set;
   EXPECT_TRUE(CRLSet::Parse(s, &set));
-  ASSERT_TRUE(set.get() != NULL);
+  ASSERT_TRUE(set.get() != nullptr);
 
   const uint8_t spki_hash[] = {
     227, 176, 196, 66, 152, 252, 28, 20, 154, 251, 244, 200, 153, 111, 185, 36,
@@ -140,7 +140,7 @@
   static const char* const kDigiNotarFilenames[] = {
       "diginotar_root_ca.pem",          "diginotar_cyber_ca.pem",
       "diginotar_services_1024_ca.pem", "diginotar_pkioverheid.pem",
-      "diginotar_pkioverheid_g2.pem",   NULL,
+      "diginotar_pkioverheid_g2.pem",   nullptr,
   };
 
   base::FilePath certs_dir = GetTestCertsDirectory();
@@ -170,7 +170,7 @@
       &crl_set_bytes));
   scoped_refptr<CRLSet> set;
   EXPECT_TRUE(CRLSet::Parse(crl_set_bytes, &set));
-  ASSERT_TRUE(set.get() != NULL);
+  ASSERT_TRUE(set.get() != nullptr);
 
   scoped_refptr<X509Certificate> root = CreateCertificateChainFromFile(
       GetTestCertsDirectory(), "root_ca_cert.pem",
@@ -212,7 +212,7 @@
                       sizeof(kExpiredCRLSet));
   scoped_refptr<CRLSet> set;
   EXPECT_TRUE(CRLSet::Parse(s, &set));
-  ASSERT_TRUE(set.get() != NULL);
+  ASSERT_TRUE(set.get() != nullptr);
 
   EXPECT_TRUE(set->IsExpired());
 }
diff --git a/net/cert/ct_log_response_parser.cc b/net/cert/ct_log_response_parser.cc
index 81e0f0a..eea2167 100644
--- a/net/cert/ct_log_response_parser.cc
+++ b/net/cert/ct_log_response_parser.cc
@@ -162,7 +162,7 @@
     return false;
   }
 
-  const base::DictionaryValue* dict_value = NULL;
+  const base::DictionaryValue* dict_value = nullptr;
   if (!json_consistency_proof.GetAsDictionary(&dict_value) ||
       !dict_value->HasKey("consistency")) {
     DVLOG(1) << "Missing consistency field.";
diff --git a/net/cert/ct_log_verifier.cc b/net/cert/ct_log_verifier.cc
index ea79f5c7..f82649a 100644
--- a/net/cert/ct_log_verifier.cc
+++ b/net/cert/ct_log_verifier.cc
@@ -50,7 +50,7 @@
     case ct::DigitallySigned::HASH_ALGO_NONE:
     default:
       NOTREACHED();
-      return NULL;
+      return nullptr;
   }
 }
 
@@ -73,7 +73,7 @@
       dns_domain_(std::move(dns_domain)),
       hash_algorithm_(ct::DigitallySigned::HASH_ALGO_NONE),
       signature_algorithm_(ct::DigitallySigned::SIG_ALGO_ANONYMOUS),
-      public_key_(NULL) {
+      public_key_(nullptr) {
   DCHECK(!dns_domain_.empty());
 }
 
@@ -345,11 +345,12 @@
   crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE);
 
   const EVP_MD* hash_alg = GetEvpAlg(hash_algorithm_);
-  if (hash_alg == NULL)
+  if (hash_alg == nullptr)
     return false;
 
   bssl::ScopedEVP_MD_CTX ctx;
-  return EVP_DigestVerifyInit(ctx.get(), NULL, hash_alg, NULL, public_key_) &&
+  return EVP_DigestVerifyInit(ctx.get(), nullptr, hash_alg, nullptr,
+                              public_key_) &&
          EVP_DigestVerifyUpdate(ctx.get(), data_to_sign.data(),
                                 data_to_sign.size()) &&
          EVP_DigestVerifyFinal(
diff --git a/net/cert/jwk_serializer.cc b/net/cert/jwk_serializer.cc
index 0faab40..870099e 100644
--- a/net/cert/jwk_serializer.cc
+++ b/net/cert/jwk_serializer.cc
@@ -52,7 +52,7 @@
   bssl::UniquePtr<BIGNUM> x(BN_new());
   bssl::UniquePtr<BIGNUM> y(BN_new());
   if (!EC_POINT_get_affine_coordinates_GFp(ec_group, ec_point, x.get(), y.get(),
-                                           NULL)) {
+                                           nullptr)) {
     return false;
   }
 
diff --git a/net/cert/multi_log_ct_verifier_unittest.cc b/net/cert/multi_log_ct_verifier_unittest.cc
index d1a50c3c..e3e43f1 100644
--- a/net/cert/multi_log_ct_verifier_unittest.cc
+++ b/net/cert/multi_log_ct_verifier_unittest.cc
@@ -141,7 +141,7 @@
     base::Histogram* histogram = static_cast<base::Histogram*>(
         base::StatisticsRecorder::FindHistogram(histogram_name));
 
-    if (histogram == NULL)
+    if (histogram == nullptr)
       return 0;
 
     std::unique_ptr<base::HistogramSamples> samples =
diff --git a/net/cert/multi_threaded_cert_verifier_unittest.cc b/net/cert/multi_threaded_cert_verifier_unittest.cc
index 29c383f..5506984 100644
--- a/net/cert/multi_threaded_cert_verifier_unittest.cc
+++ b/net/cert/multi_threaded_cert_verifier_unittest.cc
@@ -94,7 +94,7 @@
   base::FilePath certs_dir = GetTestCertsDirectory();
   scoped_refptr<X509Certificate> test_cert(
       ImportCertFromFile(certs_dir, "ok_cert.pem"));
-  ASSERT_NE(static_cast<X509Certificate*>(NULL), test_cert.get());
+  ASSERT_NE(static_cast<X509Certificate*>(nullptr), test_cert.get());
 
   int error;
   CertVerifyResult verify_result;
@@ -129,7 +129,7 @@
   base::FilePath certs_dir = GetTestCertsDirectory();
   scoped_refptr<X509Certificate> test_cert(
       ImportCertFromFile(certs_dir, "ok_cert.pem"));
-  ASSERT_NE(static_cast<X509Certificate*>(NULL), test_cert.get());
+  ASSERT_NE(static_cast<X509Certificate*>(nullptr), test_cert.get());
 
   int error;
   CertVerifyResult verify_result;
@@ -163,7 +163,7 @@
   base::FilePath certs_dir = GetTestCertsDirectory();
   scoped_refptr<X509Certificate> test_cert(
       ImportCertFromFile(certs_dir, "ok_cert.pem"));
-  ASSERT_NE(static_cast<X509Certificate*>(NULL), test_cert.get());
+  ASSERT_NE(static_cast<X509Certificate*>(nullptr), test_cert.get());
 
   int error;
   CertVerifyResult verify_result;
diff --git a/net/cert/signed_certificate_timestamp.cc b/net/cert/signed_certificate_timestamp.cc
index 3fff518..4b2567b 100644
--- a/net/cert/signed_certificate_timestamp.cc
+++ b/net/cert/signed_certificate_timestamp.cc
@@ -65,7 +65,7 @@
         iter->ReadString(&sct->signature.signature_data) &&
         iter->ReadInt(&origin) &&
         iter->ReadString(&sct->log_description))) {
-    return NULL;
+    return nullptr;
   }
   // Now set the rest of the member variables:
   sct->version = static_cast<Version>(version);
diff --git a/net/cert/test_root_certs.cc b/net/cert/test_root_certs.cc
index cd07674c..f455d18f 100644
--- a/net/cert/test_root_certs.cc
+++ b/net/cert/test_root_certs.cc
@@ -64,7 +64,7 @@
 }
 
 ScopedTestRoot::~ScopedTestRoot() {
-  Reset(NULL);
+  Reset(nullptr);
 }
 
 void ScopedTestRoot::Reset(X509Certificate* cert) {
diff --git a/net/cert/test_root_certs_unittest.cc b/net/cert/test_root_certs_unittest.cc
index ef68752..db9b092c 100644
--- a/net/cert/test_root_certs_unittest.cc
+++ b/net/cert/test_root_certs_unittest.cc
@@ -41,10 +41,10 @@
 TEST(TestRootCertsTest, AddFromPointer) {
   scoped_refptr<X509Certificate> root_cert =
       ImportCertFromFile(GetTestCertsDirectory(), kRootCertificateFile);
-  ASSERT_NE(static_cast<X509Certificate*>(NULL), root_cert.get());
+  ASSERT_NE(static_cast<X509Certificate*>(nullptr), root_cert.get());
 
   TestRootCerts* test_roots = TestRootCerts::GetInstance();
-  ASSERT_NE(static_cast<TestRootCerts*>(NULL), test_roots);
+  ASSERT_NE(static_cast<TestRootCerts*>(nullptr), test_roots);
   EXPECT_TRUE(test_roots->IsEmpty());
 
   EXPECT_TRUE(test_roots->Add(root_cert.get()));
@@ -58,7 +58,7 @@
 // behave the same as when adding from an existing certificate.
 TEST(TestRootCertsTest, AddFromFile) {
   TestRootCerts* test_roots = TestRootCerts::GetInstance();
-  ASSERT_NE(static_cast<TestRootCerts*>(NULL), test_roots);
+  ASSERT_NE(static_cast<TestRootCerts*>(nullptr), test_roots);
   EXPECT_TRUE(test_roots->IsEmpty());
 
   base::FilePath cert_path =
@@ -77,12 +77,12 @@
 // is properly being set and cleared.
 TEST(TestRootCertsTest, OverrideTrust) {
   TestRootCerts* test_roots = TestRootCerts::GetInstance();
-  ASSERT_NE(static_cast<TestRootCerts*>(NULL), test_roots);
+  ASSERT_NE(static_cast<TestRootCerts*>(nullptr), test_roots);
   EXPECT_TRUE(test_roots->IsEmpty());
 
   scoped_refptr<X509Certificate> test_cert =
       ImportCertFromFile(GetTestCertsDirectory(), kGoodCertificateFile);
-  ASSERT_NE(static_cast<X509Certificate*>(NULL), test_cert.get());
+  ASSERT_NE(static_cast<X509Certificate*>(nullptr), test_cert.get());
 
   // Test that the good certificate fails verification, because the root
   // certificate should not yet be trusted.
diff --git a/net/cert/test_root_certs_win.cc b/net/cert/test_root_certs_win.cc
index 72240c7..d581099a 100644
--- a/net/cert/test_root_certs_win.cc
+++ b/net/cert/test_root_certs_win.cc
@@ -45,9 +45,7 @@
  private:
   friend struct base::LazyInstanceTraitsBase<CryptoAPIInjector>;
 
-  CryptoAPIInjector()
-      : original_function(NULL),
-        original_handle(NULL) {
+  CryptoAPIInjector() : original_function(nullptr), original_handle(nullptr) {
     HCRYPTOIDFUNCSET registered_functions =
         CryptInitOIDFunctionSet(CRYPT_OID_OPEN_STORE_PROV_FUNC, 0);
 
@@ -72,10 +70,9 @@
     // Inject kFunctionToIntercept at the front of the linked list that
     // crypt32 uses when CertOpenStore is called, replacing the existing
     // registered function.
-    ok = CryptInstallOIDFunctionAddress(NULL, 0,
-                                        CRYPT_OID_OPEN_STORE_PROV_FUNC, 1,
-                                        &kFunctionToIntercept,
-                                        CRYPT_INSTALL_OID_FUNC_BEFORE_FLAG);
+    ok = CryptInstallOIDFunctionAddress(
+        nullptr, 0, CRYPT_OID_OPEN_STORE_PROV_FUNC, 1, &kFunctionToIntercept,
+        CRYPT_INSTALL_OID_FUNC_BEFORE_FLAG);
     DCHECK(ok);
   }
 
@@ -84,7 +81,7 @@
   // may still be running when ~AtExitManager is called, so the LazyInstance
   // must be leaky.
   ~CryptoAPIInjector() {
-    original_function = NULL;
+    original_function = nullptr;
     CryptFreeOIDFunctionAddress(original_handle, NULL);
   }
 };
@@ -150,7 +147,7 @@
       reinterpret_cast<const BYTE*>(
           CRYPTO_BUFFER_data(certificate->cert_buffer())),
       base::checked_cast<DWORD>(CRYPTO_BUFFER_len(certificate->cert_buffer())),
-      CERT_STORE_ADD_NEW, NULL);
+      CERT_STORE_ADD_NEW, nullptr);
   if (!ok) {
     // If the certificate is already added, return successfully.
     return GetLastError() == static_cast<DWORD>(CRYPT_E_EXISTS);
@@ -164,9 +161,9 @@
   empty_ = true;
 
   for (PCCERT_CONTEXT prev_cert =
-           CertEnumCertificatesInStore(temporary_roots_, NULL);
+           CertEnumCertificatesInStore(temporary_roots_, nullptr);
        prev_cert;
-       prev_cert = CertEnumCertificatesInStore(temporary_roots_, NULL))
+       prev_cert = CertEnumCertificatesInStore(temporary_roots_, nullptr))
     CertDeleteCertificateFromStore(prev_cert);
 }
 
@@ -176,7 +173,7 @@
 
 HCERTCHAINENGINE TestRootCerts::GetChainEngine() const {
   if (IsEmpty())
-    return NULL;  // Default chain engine will suffice.
+    return nullptr;  // Default chain engine will suffice.
 
   // Windows versions before 8 don't accept the struct size for later versions.
   // We report the size of the old struct since we don't need the new members.
@@ -197,7 +194,7 @@
   engine_config.dwFlags =
       CERT_CHAIN_ENABLE_CACHE_AUTO_UPDATE |
       CERT_CHAIN_ENABLE_SHARE_STORE;
-  HCERTCHAINENGINE chain_engine = NULL;
+  HCERTCHAINENGINE chain_engine = nullptr;
   BOOL ok = CertCreateCertificateChainEngine(&engine_config, &chain_engine);
   DCHECK(ok);
   return chain_engine;
@@ -209,9 +206,9 @@
 
 void TestRootCerts::Init() {
   empty_ = true;
-  temporary_roots_ = CertOpenStore(
-      CERT_STORE_PROV_MEMORY, 0, NULL,
-      CERT_STORE_DEFER_CLOSE_UNTIL_LAST_FREE_FLAG, NULL);
+  temporary_roots_ =
+      CertOpenStore(CERT_STORE_PROV_MEMORY, 0, NULL,
+                    CERT_STORE_DEFER_CLOSE_UNTIL_LAST_FREE_FLAG, nullptr);
   DCHECK(temporary_roots_);
 }
 
diff --git a/net/cert/x509_certificate.cc b/net/cert/x509_certificate.cc
index 22b64a6..0f7df41 100644
--- a/net/cert/x509_certificate.cc
+++ b/net/cert/x509_certificate.cc
@@ -248,7 +248,7 @@
   bssl::UniquePtr<CRYPTO_BUFFER> cert_buffer =
       CreateCertBufferFromBytes(data, length);
   if (!cert_buffer)
-    return NULL;
+    return nullptr;
 
   scoped_refptr<X509Certificate> cert =
       CreateFromBufferUnsafeOptions(std::move(cert_buffer), {}, options);
diff --git a/net/cert/x509_certificate_unittest.cc b/net/cert/x509_certificate_unittest.cc
index 3922cf94..007e437 100644
--- a/net/cert/x509_certificate_unittest.cc
+++ b/net/cert/x509_certificate_unittest.cc
@@ -72,7 +72,7 @@
                      const SHA256HashValue& expected_fingerprint,
                      double valid_from,
                      double valid_to) {
-  ASSERT_NE(static_cast<X509Certificate*>(NULL), google_cert.get());
+  ASSERT_NE(static_cast<X509Certificate*>(nullptr), google_cert.get());
 
   const CertPrincipal& subject = google_cert->subject();
   EXPECT_EQ("www.google.com", subject.common_name);
@@ -122,7 +122,7 @@
   scoped_refptr<X509Certificate> webkit_cert(X509Certificate::CreateFromBytes(
       reinterpret_cast<const char*>(webkit_der), sizeof(webkit_der)));
 
-  ASSERT_NE(static_cast<X509Certificate*>(NULL), webkit_cert.get());
+  ASSERT_NE(static_cast<X509Certificate*>(nullptr), webkit_cert.get());
 
   const CertPrincipal& subject = webkit_cert->subject();
   EXPECT_EQ("Cupertino", subject.locality_name);
@@ -173,7 +173,7 @@
   scoped_refptr<X509Certificate> thawte_cert(X509Certificate::CreateFromBytes(
       reinterpret_cast<const char*>(thawte_der), sizeof(thawte_der)));
 
-  ASSERT_NE(static_cast<X509Certificate*>(NULL), thawte_cert.get());
+  ASSERT_NE(static_cast<X509Certificate*>(nullptr), thawte_cert.get());
 
   const CertPrincipal& subject = thawte_cert->subject();
   EXPECT_EQ("www.thawte.com", subject.common_name);
@@ -216,7 +216,7 @@
 
   scoped_refptr<X509Certificate> multivalue_rdn_cert =
       ImportCertFromFile(certs_dir, "multivalue_rdn.pem");
-  ASSERT_NE(static_cast<X509Certificate*>(NULL), multivalue_rdn_cert.get());
+  ASSERT_NE(static_cast<X509Certificate*>(nullptr), multivalue_rdn_cert.get());
 
   const CertPrincipal& subject = multivalue_rdn_cert->subject();
   EXPECT_EQ("Multivalue RDN Test", subject.common_name);
@@ -240,7 +240,7 @@
 
   scoped_refptr<X509Certificate> unescaped_cert =
       ImportCertFromFile(certs_dir, "unescaped.pem");
-  ASSERT_NE(static_cast<X509Certificate*>(NULL), unescaped_cert.get());
+  ASSERT_NE(static_cast<X509Certificate*>(nullptr), unescaped_cert.get());
 
   const CertPrincipal& subject = unescaped_cert->subject();
   EXPECT_EQ("127.0.0.1", subject.common_name);
@@ -457,15 +457,15 @@
 
   scoped_refptr<X509Certificate> server_cert =
       ImportCertFromFile(certs_dir, "salesforce_com_test.pem");
-  ASSERT_NE(static_cast<X509Certificate*>(NULL), server_cert.get());
+  ASSERT_NE(static_cast<X509Certificate*>(nullptr), server_cert.get());
 
   scoped_refptr<X509Certificate> intermediate_cert1 =
       ImportCertFromFile(certs_dir, "verisign_intermediate_ca_2011.pem");
-  ASSERT_NE(static_cast<X509Certificate*>(NULL), intermediate_cert1.get());
+  ASSERT_NE(static_cast<X509Certificate*>(nullptr), intermediate_cert1.get());
 
   scoped_refptr<X509Certificate> intermediate_cert2 =
       ImportCertFromFile(certs_dir, "verisign_intermediate_ca_2016.pem");
-  ASSERT_NE(static_cast<X509Certificate*>(NULL), intermediate_cert2.get());
+  ASSERT_NE(static_cast<X509Certificate*>(nullptr), intermediate_cert2.get());
 
   std::vector<bssl::UniquePtr<CRYPTO_BUFFER>> intermediates;
   intermediates.push_back(bssl::UpRef(intermediate_cert1->cert_buffer()));
@@ -513,7 +513,7 @@
 
   scoped_refptr<X509Certificate> san_cert =
       ImportCertFromFile(certs_dir, "subjectAltName_sanity_check.pem");
-  ASSERT_NE(static_cast<X509Certificate*>(NULL), san_cert.get());
+  ASSERT_NE(static_cast<X509Certificate*>(nullptr), san_cert.get());
 
   // Ensure that testing for SAN without using it is accepted.
   EXPECT_TRUE(san_cert->GetSubjectAltName(nullptr, nullptr));
@@ -554,7 +554,7 @@
 
   scoped_refptr<X509Certificate> no_san_cert =
       ImportCertFromFile(certs_dir, "salesforce_com_test.pem");
-  ASSERT_NE(static_cast<X509Certificate*>(NULL), no_san_cert.get());
+  ASSERT_NE(static_cast<X509Certificate*>(nullptr), no_san_cert.get());
 
   EXPECT_NE(0u, dns_names.size());
   EXPECT_NE(0u, ip_addresses.size());
@@ -567,7 +567,7 @@
   base::FilePath certs_dir = GetTestCertsDirectory();
   scoped_refptr<X509Certificate> cert =
       ImportCertFromFile(certs_dir, "nist.der");
-  ASSERT_NE(static_cast<X509Certificate*>(NULL), cert.get());
+  ASSERT_NE(static_cast<X509Certificate*>(nullptr), cert.get());
 
   base::StringPiece spkiBytes;
   EXPECT_TRUE(asn1::ExtractSPKIFromDERCert(
@@ -584,7 +584,7 @@
   base::FilePath certs_dir = GetTestCertsDirectory();
   scoped_refptr<X509Certificate> cert =
       ImportCertFromFile(certs_dir, "tls_feature_extension.pem");
-  ASSERT_NE(static_cast<X509Certificate*>(NULL), cert.get());
+  ASSERT_NE(static_cast<X509Certificate*>(nullptr), cert.get());
 
   EXPECT_TRUE(asn1::HasTLSFeatureExtension(
       x509_util::CryptoBufferAsStringPiece(cert->cert_buffer())));
@@ -594,7 +594,7 @@
   base::FilePath certs_dir = GetTestCertsDirectory();
   scoped_refptr<X509Certificate> cert =
       ImportCertFromFile(certs_dir, "ok_cert.pem");
-  ASSERT_NE(static_cast<X509Certificate*>(NULL), cert.get());
+  ASSERT_NE(static_cast<X509Certificate*>(nullptr), cert.get());
 
   EXPECT_FALSE(asn1::HasTLSFeatureExtension(
       x509_util::CryptoBufferAsStringPiece(cert->cert_buffer())));
@@ -604,7 +604,7 @@
   base::FilePath certs_dir = GetTestCertsDirectory();
   scoped_refptr<X509Certificate> cert = ImportCertFromFile(
       certs_dir, "can_sign_http_exchanges_draft_extension.pem");
-  ASSERT_NE(static_cast<X509Certificate*>(NULL), cert.get());
+  ASSERT_NE(static_cast<X509Certificate*>(nullptr), cert.get());
 
   EXPECT_TRUE(asn1::HasCanSignHttpExchangesDraftExtension(
       x509_util::CryptoBufferAsStringPiece(cert->cert_buffer())));
@@ -614,7 +614,7 @@
   base::FilePath certs_dir = GetTestCertsDirectory();
   scoped_refptr<X509Certificate> cert = ImportCertFromFile(
       certs_dir, "can_sign_http_exchanges_draft_extension_invalid.pem");
-  ASSERT_NE(static_cast<X509Certificate*>(NULL), cert.get());
+  ASSERT_NE(static_cast<X509Certificate*>(nullptr), cert.get());
 
   EXPECT_FALSE(asn1::HasCanSignHttpExchangesDraftExtension(
       x509_util::CryptoBufferAsStringPiece(cert->cert_buffer())));
@@ -624,7 +624,7 @@
   base::FilePath certs_dir = GetTestCertsDirectory();
   scoped_refptr<X509Certificate> cert =
       ImportCertFromFile(certs_dir, "ok_cert.pem");
-  ASSERT_NE(static_cast<X509Certificate*>(NULL), cert.get());
+  ASSERT_NE(static_cast<X509Certificate*>(nullptr), cert.get());
 
   EXPECT_FALSE(asn1::HasCanSignHttpExchangesDraftExtension(
       x509_util::CryptoBufferAsStringPiece(cert->cert_buffer())));
@@ -634,7 +634,7 @@
   base::FilePath certs_dir = GetTestCertsDirectory();
   scoped_refptr<X509Certificate> cert =
       ImportCertFromFile(certs_dir, "ok_cert.pem");
-  ASSERT_NE(static_cast<X509Certificate*>(NULL), cert.get());
+  ASSERT_NE(static_cast<X509Certificate*>(nullptr), cert.get());
 
   static constexpr uint8_t kBasicConstraintsOID[] = {0x55, 0x1d, 0x13};
   bool present, critical;
@@ -882,7 +882,7 @@
   // Test a client certificate from MIT.
   scoped_refptr<X509Certificate> mit_davidben_cert(
       ImportCertFromFile(certs_dir, "mit.davidben.der"));
-  ASSERT_NE(static_cast<X509Certificate*>(NULL), mit_davidben_cert.get());
+  ASSERT_NE(static_cast<X509Certificate*>(nullptr), mit_davidben_cert.get());
 
   std::string mit_issuer(reinterpret_cast<const char*>(MITDN),
                          sizeof(MITDN));
@@ -890,7 +890,7 @@
   // Test a certificate from Google, issued by Thawte
   scoped_refptr<X509Certificate> google_cert(
       ImportCertFromFile(certs_dir, "google.single.der"));
-  ASSERT_NE(static_cast<X509Certificate*>(NULL), google_cert.get());
+  ASSERT_NE(static_cast<X509Certificate*>(nullptr), google_cert.get());
 
   std::string thawte_issuer(reinterpret_cast<const char*>(ThawteDN),
                             sizeof(ThawteDN));
@@ -923,22 +923,22 @@
 
   scoped_refptr<X509Certificate> cert(
       ImportCertFromFile(certs_dir, "mit.davidben.der"));
-  ASSERT_NE(static_cast<X509Certificate*>(NULL), cert.get());
+  ASSERT_NE(static_cast<X509Certificate*>(nullptr), cert.get());
   EXPECT_FALSE(X509Certificate::IsSelfSigned(cert->cert_buffer()));
 
   scoped_refptr<X509Certificate> self_signed(
       ImportCertFromFile(certs_dir, "aia-root.pem"));
-  ASSERT_NE(static_cast<X509Certificate*>(NULL), self_signed.get());
+  ASSERT_NE(static_cast<X509Certificate*>(nullptr), self_signed.get());
   EXPECT_TRUE(X509Certificate::IsSelfSigned(self_signed->cert_buffer()));
 
   scoped_refptr<X509Certificate> bad_name(
       ImportCertFromFile(certs_dir, "self-signed-invalid-name.pem"));
-  ASSERT_NE(static_cast<X509Certificate*>(NULL), bad_name.get());
+  ASSERT_NE(static_cast<X509Certificate*>(nullptr), bad_name.get());
   EXPECT_FALSE(X509Certificate::IsSelfSigned(bad_name->cert_buffer()));
 
   scoped_refptr<X509Certificate> bad_sig(
       ImportCertFromFile(certs_dir, "self-signed-invalid-sig.pem"));
-  ASSERT_NE(static_cast<X509Certificate*>(NULL), bad_sig.get());
+  ASSERT_NE(static_cast<X509Certificate*>(nullptr), bad_sig.get());
   EXPECT_FALSE(X509Certificate::IsSelfSigned(bad_sig->cert_buffer()));
 }
 
@@ -1014,79 +1014,100 @@
     {"google.single.der",
      X509Certificate::FORMAT_SINGLE_CERTIFICATE,
      {
-         &google_parse_fingerprint, NULL,
+         &google_parse_fingerprint,
+         nullptr,
      }},
     // DER parsing - single certificate, PEM encoded
     {"google.single.pem",
      X509Certificate::FORMAT_SINGLE_CERTIFICATE,
      {
-         &google_parse_fingerprint, NULL,
+         &google_parse_fingerprint,
+         nullptr,
      }},
     // PEM parsing - single certificate, PEM encoded with a PEB of
     // "CERTIFICATE"
     {"google.single.pem",
      X509Certificate::FORMAT_PEM_CERT_SEQUENCE,
      {
-         &google_parse_fingerprint, NULL,
+         &google_parse_fingerprint,
+         nullptr,
      }},
     // PEM parsing - sequence of certificates, PEM encoded with a PEB of
     // "CERTIFICATE"
     {"google.chain.pem",
      X509Certificate::FORMAT_PEM_CERT_SEQUENCE,
      {
-         &google_parse_fingerprint, &thawte_parse_fingerprint, NULL,
+         &google_parse_fingerprint,
+         &thawte_parse_fingerprint,
+         nullptr,
      }},
     // PKCS#7 parsing - "degenerate" SignedData collection of certificates, DER
     // encoding
     {"google.binary.p7b",
      X509Certificate::FORMAT_PKCS7,
      {
-         &google_parse_fingerprint, &thawte_parse_fingerprint, NULL,
+         &google_parse_fingerprint,
+         &thawte_parse_fingerprint,
+         nullptr,
      }},
     // PKCS#7 parsing - "degenerate" SignedData collection of certificates, PEM
     // encoded with a PEM PEB of "CERTIFICATE"
     {"google.pem_cert.p7b",
      X509Certificate::FORMAT_PKCS7,
      {
-         &google_parse_fingerprint, &thawte_parse_fingerprint, NULL,
+         &google_parse_fingerprint,
+         &thawte_parse_fingerprint,
+         nullptr,
      }},
     // PKCS#7 parsing - "degenerate" SignedData collection of certificates, PEM
     // encoded with a PEM PEB of "PKCS7"
     {"google.pem_pkcs7.p7b",
      X509Certificate::FORMAT_PKCS7,
      {
-         &google_parse_fingerprint, &thawte_parse_fingerprint, NULL,
+         &google_parse_fingerprint,
+         &thawte_parse_fingerprint,
+         nullptr,
      }},
     // All of the above, this time using auto-detection
     {"google.single.der",
      X509Certificate::FORMAT_AUTO,
      {
-         &google_parse_fingerprint, NULL,
+         &google_parse_fingerprint,
+         nullptr,
      }},
     {"google.single.pem",
      X509Certificate::FORMAT_AUTO,
      {
-         &google_parse_fingerprint, NULL,
+         &google_parse_fingerprint,
+         nullptr,
      }},
     {"google.chain.pem",
      X509Certificate::FORMAT_AUTO,
      {
-         &google_parse_fingerprint, &thawte_parse_fingerprint, NULL,
+         &google_parse_fingerprint,
+         &thawte_parse_fingerprint,
+         nullptr,
      }},
     {"google.binary.p7b",
      X509Certificate::FORMAT_AUTO,
      {
-         &google_parse_fingerprint, &thawte_parse_fingerprint, NULL,
+         &google_parse_fingerprint,
+         &thawte_parse_fingerprint,
+         nullptr,
      }},
     {"google.pem_cert.p7b",
      X509Certificate::FORMAT_AUTO,
      {
-         &google_parse_fingerprint, &thawte_parse_fingerprint, NULL,
+         &google_parse_fingerprint,
+         &thawte_parse_fingerprint,
+         nullptr,
      }},
     {"google.pem_pkcs7.p7b",
      X509Certificate::FORMAT_AUTO,
      {
-         &google_parse_fingerprint, &thawte_parse_fingerprint, NULL,
+         &google_parse_fingerprint,
+         &thawte_parse_fingerprint,
+         nullptr,
      }},
 };
 
diff --git a/net/cert/x509_util_win.cc b/net/cert/x509_util_win.cc
index 827ab4d8..f28a007 100644
--- a/net/cert/x509_util_win.cc
+++ b/net/cert/x509_util_win.cc
@@ -71,7 +71,7 @@
   // PCCERT_CONTEXT, and will not be freed until the PCCERT_CONTEXT is freed.
   ScopedHCERTSTORE store(
       CertOpenStore(CERT_STORE_PROV_MEMORY, 0, NULL,
-                    CERT_STORE_DEFER_CLOSE_UNTIL_LAST_FREE_FLAG, NULL));
+                    CERT_STORE_DEFER_CLOSE_UNTIL_LAST_FREE_FLAG, nullptr));
   if (!store.get())
     return nullptr;
 
@@ -89,7 +89,7 @@
     ok = CertAddEncodedCertificateToStore(
         store.get(), X509_ASN_ENCODING, CRYPTO_BUFFER_data(intermediate.get()),
         base::checked_cast<DWORD>(CRYPTO_BUFFER_len(intermediate.get())),
-        CERT_STORE_ADD_ALWAYS, NULL);
+        CERT_STORE_ADD_ALWAYS, nullptr);
     if (!ok) {
       if (invalid_intermediate_behavior == InvalidIntermediateBehavior::kFail)
         return nullptr;
@@ -103,7 +103,7 @@
 }
 
 SHA256HashValue CalculateFingerprint256(PCCERT_CONTEXT cert) {
-  DCHECK(NULL != cert->pbCertEncoded);
+  DCHECK(nullptr != cert->pbCertEncoded);
   DCHECK_NE(0u, cert->cbCertEncoded);
 
   SHA256HashValue sha256;
@@ -123,7 +123,8 @@
       NULL, X509_ASN_ENCODING, CRYPT_VERIFY_CERT_SIGN_SUBJECT_CERT,
       reinterpret_cast<void*>(const_cast<PCERT_CONTEXT>(cert_handle)),
       CRYPT_VERIFY_CERT_SIGN_ISSUER_CERT,
-      reinterpret_cast<void*>(const_cast<PCERT_CONTEXT>(cert_handle)), 0, NULL);
+      reinterpret_cast<void*>(const_cast<PCERT_CONTEXT>(cert_handle)), 0,
+      nullptr);
   if (!valid_signature)
     return false;
   return !!CertCompareCertificateName(X509_ASN_ENCODING,
diff --git a/net/cookies/cookie_monster.cc b/net/cookies/cookie_monster.cc
index 4fa8571..83f285e 100644
--- a/net/cookies/cookie_monster.cc
+++ b/net/cookies/cookie_monster.cc
@@ -611,7 +611,7 @@
   // Note that this does not prune cookies to be below our limits (if we've
   // exceeded them) the way that calling GarbageCollect() would.
   GarbageCollectExpired(
-      Time::Now(), CookieMapItPair(cookies_.begin(), cookies_.end()), NULL);
+      Time::Now(), CookieMapItPair(cookies_.begin(), cookies_.end()), nullptr);
 
   // Copy the CanonicalCookie pointers from the map so that we can use the same
   // sorter as elsewhere, then copy the result out.
diff --git a/net/cookies/cookie_store_test_callbacks.cc b/net/cookies/cookie_store_test_callbacks.cc
index 58a9c25..0cc18870 100644
--- a/net/cookies/cookie_store_test_callbacks.cc
+++ b/net/cookies/cookie_store_test_callbacks.cc
@@ -17,7 +17,7 @@
     : run_in_thread_(run_in_thread) {}
 
 CookieCallback::CookieCallback()
-    : run_in_thread_(NULL),
+    : run_in_thread_(nullptr),
       run_in_task_runner_(base::ThreadTaskRunnerHandle::Get()) {}
 
 CookieCallback::~CookieCallback() = default;
diff --git a/net/cookies/parsed_cookie.cc b/net/cookies/parsed_cookie.cc
index 9cc4c82..ce7f8b6 100644
--- a/net/cookies/parsed_cookie.cc
+++ b/net/cookies/parsed_cookie.cc
@@ -69,7 +69,7 @@
 // Returns true if |c| occurs in |chars|
 // TODO(erikwright): maybe make this take an iterator, could check for end also?
 inline bool CharIsA(const char c, const char* chars) {
-  return strchr(chars, c) != NULL;
+  return strchr(chars, c) != nullptr;
 }
 // Seek the iterator to the first occurrence of a character in |chars|.
 // Returns true if it hit the end, false otherwise.
diff --git a/net/disk_cache/backend_unittest.cc b/net/disk_cache/backend_unittest.cc
index 417123de..824dea7 100644
--- a/net/disk_cache/backend_unittest.cc
+++ b/net/disk_cache/backend_unittest.cc
@@ -89,7 +89,7 @@
   if (cb.GetResult(rv) != net::OK)
     return std::unique_ptr<disk_cache::BackendImpl>();
 
-  disk_cache::Entry* entry = NULL;
+  disk_cache::Entry* entry = nullptr;
   rv = cache->CreateEntry(kExistingEntryKey, net::HIGHEST, &entry,
                           cb.callback());
   if (cb.GetResult(rv) != net::OK)
@@ -242,9 +242,9 @@
   // This must be greater than MemEntryImpl::kMaxSparseEntrySize.
   const int kOffset = 10 + 1024 * 1024;
 
-  disk_cache::Entry* entry0 = NULL;
-  disk_cache::Entry* entry1 = NULL;
-  disk_cache::Entry* entry2 = NULL;
+  disk_cache::Entry* entry0 = nullptr;
+  disk_cache::Entry* entry1 = nullptr;
+  disk_cache::Entry* entry2 = nullptr;
 
   scoped_refptr<net::IOBuffer> buffer =
       base::MakeRefCounted<net::IOBuffer>(kSize);
@@ -282,8 +282,8 @@
 
   // Order in rankings list:
   // third_part1, fourth_part1, third_part2, fourth_part2
-  disk_cache::Entry* entry3 = NULL;
-  disk_cache::Entry* entry4 = NULL;
+  disk_cache::Entry* entry3 = nullptr;
+  disk_cache::Entry* entry4 = nullptr;
   ASSERT_THAT(CreateEntry("third", &entry3), IsOk());
   ASSERT_EQ(kSize, WriteSparseData(entry3, 0, buffer.get(), kSize));
   ASSERT_THAT(CreateEntry("fourth", &entry4), IsOk());
@@ -365,29 +365,29 @@
 
 void DiskCacheBackendTest::BackendBasics() {
   InitCache();
-  disk_cache::Entry *entry1 = NULL, *entry2 = NULL;
+  disk_cache::Entry *entry1 = nullptr, *entry2 = nullptr;
   EXPECT_NE(net::OK, OpenEntry("the first key", &entry1));
   ASSERT_THAT(CreateEntry("the first key", &entry1), IsOk());
-  ASSERT_TRUE(NULL != entry1);
+  ASSERT_TRUE(nullptr != entry1);
   entry1->Close();
-  entry1 = NULL;
+  entry1 = nullptr;
 
   ASSERT_THAT(OpenEntry("the first key", &entry1), IsOk());
-  ASSERT_TRUE(NULL != entry1);
+  ASSERT_TRUE(nullptr != entry1);
   entry1->Close();
-  entry1 = NULL;
+  entry1 = nullptr;
 
   EXPECT_NE(net::OK, CreateEntry("the first key", &entry1));
   ASSERT_THAT(OpenEntry("the first key", &entry1), IsOk());
   EXPECT_NE(net::OK, OpenEntry("some other key", &entry2));
   ASSERT_THAT(CreateEntry("some other key", &entry2), IsOk());
-  ASSERT_TRUE(NULL != entry1);
-  ASSERT_TRUE(NULL != entry2);
+  ASSERT_TRUE(nullptr != entry1);
+  ASSERT_TRUE(nullptr != entry2);
   EXPECT_EQ(2, cache_->GetEntryCount());
 
-  disk_cache::Entry* entry3 = NULL;
+  disk_cache::Entry* entry3 = nullptr;
   ASSERT_THAT(OpenEntry("some other key", &entry3), IsOk());
-  ASSERT_TRUE(NULL != entry3);
+  ASSERT_TRUE(nullptr != entry3);
   EXPECT_TRUE(entry2 == entry3);
 
   EXPECT_THAT(DoomEntry("some other key"), IsOk());
@@ -505,21 +505,21 @@
 
     // Test the private factory method(s).
     std::unique_ptr<disk_cache::Backend> cache;
-    cache = disk_cache::MemBackendImpl::CreateBackend(0, NULL);
+    cache = disk_cache::MemBackendImpl::CreateBackend(0, nullptr);
     ASSERT_TRUE(cache.get());
     cache.reset();
 
     // Now test the public API.
     int rv = disk_cache::CreateCacheBackend(
         net::DISK_CACHE, net::CACHE_BACKEND_DEFAULT, cache_path_, 0, false,
-        NULL, &cache, cb.callback());
+        nullptr, &cache, cb.callback());
     ASSERT_THAT(cb.GetResult(rv), IsOk());
     ASSERT_TRUE(cache.get());
     cache.reset();
 
     rv = disk_cache::CreateCacheBackend(
         net::MEMORY_CACHE, net::CACHE_BACKEND_DEFAULT, base::FilePath(), 0,
-        false, NULL, &cache, cb.callback());
+        false, nullptr, &cache, cb.callback());
     ASSERT_THAT(cb.GetResult(rv), IsOk());
     ASSERT_TRUE(cache.get());
     cache.reset();
@@ -925,7 +925,7 @@
       net::DISK_CACHE, net::CACHE_BACKEND_DEFAULT, store.GetPath(), 0, false,
       /* net_log = */ nullptr, &extra_cache, cb.callback());
   ASSERT_THAT(cb.GetResult(rv), IsOk());
-  ASSERT_TRUE(extra_cache.get() != NULL);
+  ASSERT_TRUE(extra_cache.get() != nullptr);
 
   ASSERT_TRUE(CleanupCacheDir());
   SetNewEviction();  // Match the expected behavior for integrity verification.
@@ -1634,7 +1634,7 @@
   Time last_modified[kNumEntries];
   Time last_used[kNumEntries];
   while (iter->OpenNextEntry(&entry) == net::OK) {
-    ASSERT_TRUE(NULL != entry);
+    ASSERT_TRUE(nullptr != entry);
     if (count < kNumEntries) {
       last_modified[count] = entry->GetLastModified();
       last_used[count] = entry->GetLastUsed();
@@ -1651,7 +1651,7 @@
   count = 0;
   // The previous enumeration should not have changed the timestamps.
   while (iter->OpenNextEntry(&entry) == net::OK) {
-    ASSERT_TRUE(NULL != entry);
+    ASSERT_TRUE(nullptr != entry);
     if (count < kNumEntries) {
       EXPECT_TRUE(last_modified[count] == entry->GetLastModified());
       EXPECT_TRUE(last_used[count] == entry->GetLastUsed());
@@ -1717,7 +1717,7 @@
 
   // Modify the oldest entry and get the newest element.
   ASSERT_THAT(OpenEntry(first, &entry1), IsOk());
-  EXPECT_EQ(0, WriteData(entry1, 0, 200, NULL, 0, false));
+  EXPECT_EQ(0, WriteData(entry1, 0, 200, nullptr, 0, false));
   ASSERT_THAT(iter->OpenNextEntry(&entry2), IsOk());
   if (type_ == net::APP_CACHE) {
     // The list is not updated.
@@ -1878,7 +1878,7 @@
   std::unique_ptr<TestIterator> iter = CreateIterator();
   int count = 0;
   while (iter->OpenNextEntry(&entry) == net::OK) {
-    ASSERT_TRUE(NULL != entry);
+    ASSERT_TRUE(nullptr != entry);
     EXPECT_EQ(key2, entry->GetKey());
     entry->Close();
     count++;
@@ -1920,26 +1920,26 @@
   std::unique_ptr<TestIterator> iter1 = CreateIterator(),
                                 iter2 = CreateIterator();
   ASSERT_THAT(iter1->OpenNextEntry(&entry1), IsOk());
-  ASSERT_TRUE(NULL != entry1);
+  ASSERT_TRUE(nullptr != entry1);
   entry1->Close();
-  entry1 = NULL;
+  entry1 = nullptr;
 
   // Let's go to the middle of the list.
   for (int i = 0; i < kNumEntries / 2; i++) {
     if (entry1)
       entry1->Close();
     ASSERT_THAT(iter1->OpenNextEntry(&entry1), IsOk());
-    ASSERT_TRUE(NULL != entry1);
+    ASSERT_TRUE(nullptr != entry1);
 
     ASSERT_THAT(iter2->OpenNextEntry(&entry2), IsOk());
-    ASSERT_TRUE(NULL != entry2);
+    ASSERT_TRUE(nullptr != entry2);
     entry2->Close();
   }
 
   // Messing up with entry1 will modify entry2->next.
   entry1->Doom();
   ASSERT_THAT(iter2->OpenNextEntry(&entry2), IsOk());
-  ASSERT_TRUE(NULL != entry2);
+  ASSERT_TRUE(nullptr != entry2);
 
   // The link entry2->entry1 should be broken.
   EXPECT_NE(entry2->GetKey(), entry1->GetKey());
@@ -1948,7 +1948,7 @@
 
   // And the second iterator should keep working.
   ASSERT_THAT(iter2->OpenNextEntry(&entry2), IsOk());
-  ASSERT_TRUE(NULL != entry2);
+  ASSERT_TRUE(nullptr != entry2);
   entry2->Close();
 }
 
@@ -2011,14 +2011,14 @@
 TEST_F(DiskCacheBackendTest, MemoryOnlyDoomEntriesSinceSparse) {
   SetMemoryOnlyMode();
   base::Time start;
-  InitSparseCache(&start, NULL);
+  InitSparseCache(&start, nullptr);
   DoomEntriesSince(start);
   EXPECT_EQ(1, cache_->GetEntryCount());
 }
 
 TEST_F(DiskCacheBackendTest, DoomEntriesSinceSparse) {
   base::Time start;
-  InitSparseCache(&start, NULL);
+  InitSparseCache(&start, nullptr);
   DoomEntriesSince(start);
   // NOTE: BackendImpl counts child entries in its GetEntryCount(), while
   // MemBackendImpl does not. Thats why expected value differs here from
@@ -2028,13 +2028,13 @@
 
 TEST_F(DiskCacheBackendTest, MemoryOnlyDoomAllSparse) {
   SetMemoryOnlyMode();
-  InitSparseCache(NULL, NULL);
+  InitSparseCache(nullptr, nullptr);
   EXPECT_THAT(DoomAllEntries(), IsOk());
   EXPECT_EQ(0, cache_->GetEntryCount());
 }
 
 TEST_F(DiskCacheBackendTest, DoomAllSparse) {
-  InitSparseCache(NULL, NULL);
+  InitSparseCache(nullptr, nullptr);
   EXPECT_THAT(DoomAllEntries(), IsOk());
   EXPECT_EQ(0, cache_->GetEntryCount());
 }
@@ -2346,7 +2346,7 @@
   }
 
   cache_.reset();
-  cache_impl_ = NULL;
+  cache_impl_ = nullptr;
 
   ASSERT_TRUE(CheckCacheIntegrity(cache_path_, new_eviction_, MaxSize(), mask));
   success_ = true;
@@ -2500,8 +2500,8 @@
   net::TestCompletionCallback cb;
   std::unique_ptr<disk_cache::Backend> base_cache;
   int rv = disk_cache::CreateCacheBackend(
-      net::DISK_CACHE, net::CACHE_BACKEND_BLOCKFILE, cache_path_, 0, true, NULL,
-      &base_cache, cb.callback());
+      net::DISK_CACHE, net::CACHE_BACKEND_BLOCKFILE, cache_path_, 0, true,
+      nullptr, &base_cache, cb.callback());
   ASSERT_THAT(cb.GetResult(rv), IsOk());
   EXPECT_EQ(0, base_cache->GetEntryCount());
 }
@@ -2531,7 +2531,7 @@
     ASSERT_THAT(cb.GetResult(rv), IsOk());
     EXPECT_EQ(1, cache->GetEntryCount());
 
-    disk_cache::Entry* entry = NULL;
+    disk_cache::Entry* entry = nullptr;
     rv = cache->OpenEntry(kExistingEntryKey, net::HIGHEST, &entry,
                           cb.callback());
     ASSERT_THAT(cb.GetResult(rv), IsOk());
@@ -2572,7 +2572,7 @@
     ASSERT_THAT(cb.GetResult(rv), IsOk());
     EXPECT_EQ(1, cache->GetEntryCount());
 
-    disk_cache::Entry* entry = NULL;
+    disk_cache::Entry* entry = nullptr;
     rv = cache->OpenEntry(kExistingEntryKey, net::HIGHEST, &entry,
                           cb.callback());
     ASSERT_THAT(cb.GetResult(rv), IsOk());
@@ -2592,9 +2592,9 @@
   net::TestCompletionCallback cb;
   bool prev = base::ThreadRestrictions::SetIOAllowed(false);
   base::FilePath path(cache_path_);
-  int rv = disk_cache::CreateCacheBackend(net::DISK_CACHE,
-                                          net::CACHE_BACKEND_BLOCKFILE, path, 0,
-                                          true, NULL, &cache_, cb.callback());
+  int rv = disk_cache::CreateCacheBackend(
+      net::DISK_CACHE, net::CACHE_BACKEND_BLOCKFILE, path, 0, true, nullptr,
+      &cache_, cb.callback());
   path.clear();  // Make sure path was captured by the previous call.
   ASSERT_THAT(cb.GetResult(rv), IsOk());
   base::ThreadRestrictions::SetIOAllowed(prev);
@@ -2921,7 +2921,7 @@
   ASSERT_THAT(CreateEntry(first, &entry), IsOk());
   entry->Close();
   ASSERT_THAT(OpenEntry(first, &entry), IsOk());
-  EXPECT_EQ(0, WriteData(entry, 0, 200, NULL, 0, false));
+  EXPECT_EQ(0, WriteData(entry, 0, 200, nullptr, 0, false));
   entry->Close();
   ASSERT_THAT(CreateEntry(second, &entry), IsOk());
 
@@ -2984,12 +2984,12 @@
   ASSERT_THAT(CreateEntry(first, &entry), IsOk());
   entry->Close();
   ASSERT_THAT(OpenEntry(first, &entry), IsOk());
-  EXPECT_EQ(0, WriteData(entry, 0, 200, NULL, 0, false));
+  EXPECT_EQ(0, WriteData(entry, 0, 200, nullptr, 0, false));
   entry->Close();
   ASSERT_THAT(CreateEntry(second, &entry), IsOk());
   entry->Close();
   ASSERT_THAT(OpenEntry(second, &entry), IsOk());
-  EXPECT_EQ(0, WriteData(entry, 0, 200, NULL, 0, false));
+  EXPECT_EQ(0, WriteData(entry, 0, 200, nullptr, 0, false));
 
   // Corrupt this entry.
   disk_cache::EntryImpl* entry_impl =
@@ -3206,7 +3206,7 @@
   std::unique_ptr<TestIterator> iter = CreateIterator();
   int count = 0;
   while (iter->OpenNextEntry(&entry) == net::OK) {
-    ASSERT_TRUE(NULL != entry);
+    ASSERT_TRUE(nullptr != entry);
     entry->Close();
     count++;
     ASSERT_LT(count, 9);
@@ -3413,7 +3413,7 @@
   std::string key_prefix("prefix");
   for (int i = 0; i < kWriteEntryCount; ++i) {
     AddDelay();
-    disk_cache::Entry* entry = NULL;
+    disk_cache::Entry* entry = nullptr;
     ASSERT_THAT(CreateEntry(key_prefix + base::NumberToString(i), &entry),
                 IsOk());
     disk_cache::ScopedEntryPtr entry_closer(entry);
@@ -3527,7 +3527,7 @@
   std::unique_ptr<disk_cache::BackendImpl> cache(
       std::make_unique<disk_cache::BackendImpl>(
           cache_path_, nullptr, base::ThreadTaskRunnerHandle::Get(), nullptr));
-  ASSERT_TRUE(NULL != cache.get());
+  ASSERT_TRUE(nullptr != cache.get());
   cache->SetUnitTestMode();
   ASSERT_THAT(cache->SyncInit(), IsOk());
 
@@ -3543,11 +3543,11 @@
   std::unique_ptr<disk_cache::BackendImpl> cache(
       std::make_unique<disk_cache::BackendImpl>(
           cache_path_, nullptr, base::ThreadTaskRunnerHandle::Get(), nullptr));
-  ASSERT_TRUE(NULL != cache.get());
+  ASSERT_TRUE(nullptr != cache.get());
   cache->SetUnitTestMode();
   ASSERT_NE(net::OK, cache->SyncInit());
 
-  ASSERT_TRUE(NULL == cache->GetTimerForTest());
+  ASSERT_TRUE(nullptr == cache->GetTimerForTest());
 
   DisableIntegrityCheck();
 }
@@ -3700,7 +3700,7 @@
       nullptr, &cache[1], cb.callback());
   ASSERT_THAT(cb.GetResult(rv), IsOk());
 
-  ASSERT_TRUE(cache[0].get() != NULL && cache[1].get() != NULL);
+  ASSERT_TRUE(cache[0].get() != nullptr && cache[1].get() != nullptr);
 
   std::string key("the first key");
   disk_cache::Entry* entry;
@@ -3846,13 +3846,13 @@
   DWORD sharing = FILE_SHARE_READ | FILE_SHARE_WRITE;
   DWORD access = GENERIC_READ | GENERIC_WRITE;
   base::win::ScopedHandle file2(CreateFile(base::as_wcstr(name.value()), access,
-                                           sharing, NULL, OPEN_EXISTING, 0,
-                                           NULL));
+                                           sharing, nullptr, OPEN_EXISTING, 0,
+                                           nullptr));
   EXPECT_FALSE(file2.IsValid());
 
   sharing |= FILE_SHARE_DELETE;
-  file2.Set(CreateFile(base::as_wcstr(name.value()), access, sharing, NULL,
-                       OPEN_EXISTING, 0, NULL));
+  file2.Set(CreateFile(base::as_wcstr(name.value()), access, sharing, nullptr,
+                       OPEN_EXISTING, 0, nullptr));
   EXPECT_TRUE(file2.IsValid());
 #endif
 
@@ -3998,19 +3998,19 @@
   InitCache();
 
   const char key[] = "the first key";
-  disk_cache::Entry* entry = NULL;
+  disk_cache::Entry* entry = nullptr;
 
   ASSERT_THAT(CreateEntry(key, &entry), IsOk());
-  ASSERT_TRUE(entry != NULL);
+  ASSERT_TRUE(entry != nullptr);
   entry->Close();
-  entry = NULL;
+  entry = nullptr;
 
   // To make sure the file creation completed we need to call open again so that
   // we block until it actually created the files.
   ASSERT_THAT(OpenEntry(key, &entry), IsOk());
-  ASSERT_TRUE(entry != NULL);
+  ASSERT_TRUE(entry != nullptr);
   entry->Close();
-  entry = NULL;
+  entry = nullptr;
 
   // Delete one of the files in the entry.
   base::FilePath to_delete_file = cache_path_.AppendASCII(
@@ -4034,20 +4034,20 @@
   InitCache();
 
   const char key[] = "the first key";
-  disk_cache::Entry* entry = NULL;
+  disk_cache::Entry* entry = nullptr;
 
   ASSERT_THAT(CreateEntry(key, &entry), IsOk());
-  disk_cache::Entry* null = NULL;
+  disk_cache::Entry* null = nullptr;
   ASSERT_NE(null, entry);
   entry->Close();
-  entry = NULL;
+  entry = nullptr;
 
   // To make sure the file creation completed we need to call open again so that
   // we block until it actually created the files.
   ASSERT_THAT(OpenEntry(key, &entry), IsOk());
   ASSERT_NE(null, entry);
   entry->Close();
-  entry = NULL;
+  entry = nullptr;
 
   // The entry is being closed on the Simple Cache worker pool
   disk_cache::SimpleBackendImpl::FlushWorkerPoolForTesting();
@@ -4234,7 +4234,7 @@
   ASSERT_TRUE(CreateSetOfRandomEntries(&key_pool));
 
   std::unique_ptr<TestIterator> iter = CreateIterator();
-  disk_cache::Entry* entry = NULL;
+  disk_cache::Entry* entry = nullptr;
   ASSERT_THAT(iter->OpenNextEntry(&entry), IsOk());
   EXPECT_TRUE(entry);
   disk_cache::ScopedEntryPtr entry_closer(entry);
@@ -4436,7 +4436,7 @@
       disk_cache::SimpleSynchronousEntry::kInitialHeaderRead + 10;
   std::string long_key(long_key_length, 'X');
   key_pool.insert(long_key);
-  disk_cache::Entry* entry = NULL;
+  disk_cache::Entry* entry = nullptr;
   ASSERT_THAT(CreateEntry(long_key.c_str(), &entry), IsOk());
   entry->Close();
 
diff --git a/net/disk_cache/blockfile/backend_impl.cc b/net/disk_cache/blockfile/backend_impl.cc
index bcb65ee..a7e54f9 100644
--- a/net/disk_cache/blockfile/backend_impl.cc
+++ b/net/disk_cache/blockfile/backend_impl.cc
@@ -364,7 +364,7 @@
   }
   block_files_.CloseFiles();
   FlushIndex();
-  index_ = NULL;
+  index_ = nullptr;
   ptr_factory_.InvalidateWeakPtrs();
   done_.Signal();
 }
@@ -441,7 +441,7 @@
         node->GetLastUsed() < end_time) {
       node->DoomImpl();
     } else if (node->GetLastUsed() < initial_time) {
-      next = NULL;
+      next = nullptr;
       SyncEndEnumeration(std::move(iterator));
     }
   }
@@ -509,7 +509,7 @@
 
 scoped_refptr<EntryImpl> BackendImpl::OpenEntryImpl(const std::string& key) {
   if (disabled_)
-    return NULL;
+    return nullptr;
 
   TimeTicks start = TimeTicks::Now();
   uint32_t hash = base::Hash(key);
@@ -520,7 +520,7 @@
       MatchEntry(key, hash, false, Addr(), &error);
   if (cache_entry && ENTRY_NORMAL != cache_entry->entry()->Data()->state) {
     // The entry was already evicted.
-    cache_entry = NULL;
+    cache_entry = nullptr;
     web_fonts_histogram::RecordEvictedEntry(key);
   } else if (!cache_entry) {
     web_fonts_histogram::RecordCacheMiss(key);
@@ -533,7 +533,7 @@
 
   if (!cache_entry) {
     stats_.OnEvent(Stats::OPEN_MISS);
-    return NULL;
+    return nullptr;
   }
 
   eviction_.OnOpenEntry(cache_entry.get());
@@ -554,7 +554,7 @@
 
 scoped_refptr<EntryImpl> BackendImpl::CreateEntryImpl(const std::string& key) {
   if (disabled_ || key.empty())
-    return NULL;
+    return nullptr;
 
   TimeTicks start = TimeTicks::Now();
   uint32_t hash = base::Hash(key);
@@ -576,7 +576,7 @@
     if (!parent && data_->table[hash & mask_]) {
       // We should have corrected the problem.
       NOTREACHED();
-      return NULL;
+      return nullptr;
     }
   }
 
@@ -597,7 +597,7 @@
   if (!block_files_.CreateBlock(BLOCK_256, num_blocks, &entry_address)) {
     LOG(ERROR) << "Create entry failed " << key.c_str();
     stats_.OnEvent(Stats::CREATE_ERROR);
-    return NULL;
+    return nullptr;
   }
 
   Addr node_address(0);
@@ -605,7 +605,7 @@
     block_files_.DeleteBlock(entry_address, false);
     LOG(ERROR) << "Create entry failed " << key.c_str();
     stats_.OnEvent(Stats::CREATE_ERROR);
-    return NULL;
+    return nullptr;
   }
 
   scoped_refptr<EntryImpl> cache_entry(
@@ -617,7 +617,7 @@
     block_files_.DeleteBlock(node_address, false);
     LOG(ERROR) << "Create entry failed " << key.c_str();
     stats_.OnEvent(Stats::CREATE_ERROR);
-    return NULL;
+    return nullptr;
   }
 
   cache_entry->BeginLogging(net_log_, true);
@@ -651,7 +651,7 @@
 scoped_refptr<EntryImpl> BackendImpl::OpenNextEntryImpl(
     Rankings::Iterator* iterator) {
   if (disabled_)
-    return NULL;
+    return nullptr;
 
   const int kListsToSearch = 3;
   scoped_refptr<EntryImpl> entries[kListsToSearch];
@@ -666,7 +666,7 @@
     }
     if (!ret) {
       iterator->Reset();
-      return NULL;
+      return nullptr;
     }
   } else {
     // Get the next entry from the last list, and the actual entries for the
@@ -702,7 +702,7 @@
 
   if (newest < 0 || oldest < 0) {
     iterator->Reset();
-    return NULL;
+    return nullptr;
   }
 
   scoped_refptr<EntryImpl> next_entry = entries[newest];
@@ -747,7 +747,7 @@
 
 MappedFile* BackendImpl::File(Addr address) {
   if (disabled_)
-    return NULL;
+    return nullptr;
   return block_files_.GetFile(address);
 }
 
@@ -935,7 +935,7 @@
     return it->second;
   }
 
-  return NULL;
+  return nullptr;
 }
 
 int32_t BackendImpl::GetCurrentEntryId() const {
@@ -1434,7 +1434,7 @@
   if (*file_created)
     ret = CreateBackingStore(file.get());
 
-  file = NULL;
+  file = nullptr;
   if (!ret)
     return false;
 
@@ -1496,7 +1496,7 @@
       return false;
 
     data_->header.stats = address.value();
-    return stats_.Init(NULL, 0, address);
+    return stats_.Init(nullptr, 0, address);
   }
 
   if (!address.is_block_file()) {
@@ -1579,8 +1579,8 @@
   disabled_ = true;
   data_->header.crash = 0;
   index_->Flush();
-  index_ = NULL;
-  data_ = NULL;
+  index_ = nullptr;
+  data_ = nullptr;
   block_files_.CloseFiles();
   rankings_.Reset();
   init_ = false;
@@ -1606,7 +1606,7 @@
   scoped_refptr<EntryImpl> cache_entry(
       new EntryImpl(this, address, read_only_));
   IncreaseNumRefs();
-  *entry = NULL;
+  *entry = nullptr;
 
   TimeTicks start = TimeTicks::Now();
   if (!cache_entry->entry()->Load())
@@ -1702,7 +1702,7 @@
 
       if (parent_entry.get()) {
         parent_entry->SetNextAddress(child);
-        parent_entry = NULL;
+        parent_entry = nullptr;
       } else {
         data_->table[hash & mask_] = child.value();
       }
@@ -1714,7 +1714,7 @@
         // It is important to call DestroyInvalidEntry after removing this
         // entry from the table.
         DestroyInvalidEntry(cache_entry.get());
-        cache_entry = NULL;
+        cache_entry = nullptr;
       } else {
         Trace("NewEntry failed on MatchEntry 0x%x", address.value());
       }
@@ -1728,19 +1728,19 @@
     DCHECK_EQ(hash & mask_, cache_entry->entry()->Data()->hash & mask_);
     if (cache_entry->IsSameEntry(key, hash)) {
       if (!cache_entry->Update())
-        cache_entry = NULL;
+        cache_entry = nullptr;
       found = true;
       if (find_parent && entry_addr.value() != address.value()) {
         Trace("Entry not on the index 0x%x", address.value());
         *match_error = true;
-        parent_entry = NULL;
+        parent_entry = nullptr;
       }
       break;
     }
     if (!cache_entry->Update())
-      cache_entry = NULL;
+      cache_entry = nullptr;
     parent_entry = cache_entry;
-    cache_entry = NULL;
+    cache_entry = nullptr;
     if (!parent_entry.get())
       break;
 
@@ -1748,15 +1748,15 @@
   }
 
   if (parent_entry.get() && (!find_parent || !found))
-    parent_entry = NULL;
+    parent_entry = nullptr;
 
   if (find_parent && entry_addr.is_initialized() && !cache_entry.get()) {
     *match_error = true;
-    parent_entry = NULL;
+    parent_entry = nullptr;
   }
 
   if (cache_entry.get() && (find_parent || !found))
-    cache_entry = NULL;
+    cache_entry = nullptr;
 
   FlushIndex();
 
@@ -1776,7 +1776,7 @@
   Rankings::ScopedRankingsBlock rankings(&rankings_, *from_entry);
   CacheRankingsBlock* next_block = rankings_.GetNext(rankings.get(), list);
   Rankings::ScopedRankingsBlock next(&rankings_, next_block);
-  *from_entry = NULL;
+  *from_entry = nullptr;
 
   *next_entry = GetEnumeratedEntry(next.get(), list);
   if (!*next_entry)
@@ -1790,7 +1790,7 @@
     CacheRankingsBlock* next,
     Rankings::List list) {
   if (!next || disabled_)
-    return NULL;
+    return nullptr;
 
   scoped_refptr<EntryImpl> entry;
   int rv = NewEntry(Addr(next->Data()->contents), &entry);
@@ -1801,18 +1801,18 @@
       // There is nothing linked from the index. Delete the rankings node.
       DeleteBlock(next->address(), true);
     }
-    return NULL;
+    return nullptr;
   }
 
   if (entry->dirty()) {
     // We cannot trust this entry.
     InternalDoomEntry(entry.get());
-    return NULL;
+    return nullptr;
   }
 
   if (!entry->Update()) {
     STRESS_NOTREACHED();
-    return NULL;
+    return nullptr;
   }
 
   // Note that it is unfortunate (but possible) for this entry to be clean, but
@@ -1835,7 +1835,7 @@
     deleted_entry = nullptr;
     stats_.OnEvent(Stats::CREATE_MISS);
     Trace("create entry miss ");
-    return NULL;
+    return nullptr;
   }
 
   // We are attempting to create an entry and found out that the entry was
diff --git a/net/disk_cache/blockfile/bitmap.h b/net/disk_cache/blockfile/bitmap.h
index 59a987a..bc9af80 100644
--- a/net/disk_cache/blockfile/bitmap.h
+++ b/net/disk_cache/blockfile/bitmap.h
@@ -16,7 +16,7 @@
 // This class provides support for simple maps of bits.
 class NET_EXPORT_PRIVATE Bitmap {
  public:
-  Bitmap() : map_(NULL), num_bits_(0), array_size_(0), alloc_(false) {}
+  Bitmap() : map_(nullptr), num_bits_(0), array_size_(0), alloc_(false) {}
 
   // This constructor will allocate on a uint32_t boundary. If |clear_bits| is
   // false, the bitmap bits will not be initialized.
diff --git a/net/disk_cache/blockfile/bitmap_unittest.cc b/net/disk_cache/blockfile/bitmap_unittest.cc
index 29d8739..c77aedf 100644
--- a/net/disk_cache/blockfile/bitmap_unittest.cc
+++ b/net/disk_cache/blockfile/bitmap_unittest.cc
@@ -19,7 +19,7 @@
   disk_cache::Bitmap map;
   EXPECT_EQ(0, map.Size());
   EXPECT_EQ(0, map.ArraySize());
-  EXPECT_TRUE(NULL == map.GetMap());
+  EXPECT_TRUE(nullptr == map.GetMap());
 }
 
 TEST(BitmapTest, Basics) {
diff --git a/net/disk_cache/blockfile/block_files.cc b/net/disk_cache/blockfile/block_files.cc
index eac68fb..f245308 100644
--- a/net/disk_cache/blockfile/block_files.cc
+++ b/net/disk_cache/blockfile/block_files.cc
@@ -39,8 +39,7 @@
 
 namespace disk_cache {
 
-BlockHeader::BlockHeader() : header_(NULL) {
-}
+BlockHeader::BlockHeader() : header_(nullptr) {}
 
 BlockHeader::BlockHeader(BlockFileHeader* header) : header_(header) {
 }
@@ -262,8 +261,7 @@
 // ------------------------------------------------------------------------
 
 BlockFiles::BlockFiles(const base::FilePath& path)
-    : init_(false), zero_buffer_(NULL), path_(path) {
-}
+    : init_(false), zero_buffer_(nullptr), path_(path) {}
 
 BlockFiles::~BlockFiles() {
   if (zero_buffer_)
@@ -302,14 +300,14 @@
             static_cast<size_t>(kFirstAdditionalBlockFile));
   DCHECK(address.is_block_file() || !address.is_initialized());
   if (!address.is_initialized())
-    return NULL;
+    return nullptr;
 
   int file_index = address.FileNumber();
   if (static_cast<unsigned int>(file_index) >= block_files_.size() ||
       !block_files_[file_index]) {
     // We need to open the file
     if (!OpenBlockFile(file_index))
-      return NULL;
+      return nullptr;
   }
   DCHECK_GE(block_files_.size(), static_cast<unsigned int>(file_index));
   return block_files_[file_index].get();
@@ -551,13 +549,13 @@
     if (kMaxBlocks == file_header.Header()->max_entries) {
       file = NextFile(file);
       if (!file)
-        return NULL;
+        return nullptr;
       file_header = BlockHeader(file);
       continue;
     }
 
     if (!GrowBlockFile(file, file_header.Header()))
-      return NULL;
+      return nullptr;
     break;
   }
   LOCAL_HISTOGRAM_TIMES("DiskCache.GetFileForNewBlock",
@@ -578,7 +576,7 @@
 
     new_file = CreateNextBlockFile(type);
     if (!new_file)
-      return NULL;
+      return nullptr;
 
     FileLock lock(header);
     header->next_file = new_file;
@@ -625,7 +623,7 @@
       base::FilePath name = Name(file_index);
       scoped_refptr<File> this_file(new File(false));
       this_file->Init(name);
-      block_files_[file_index] = NULL;
+      block_files_[file_index] = nullptr;
 
       int failure = DeleteCacheFile(name) ? 0 : 1;
       UMA_HISTOGRAM_COUNTS_1M("DiskCache.DeleteFailed2", failure);
diff --git a/net/disk_cache/blockfile/block_files_unittest.cc b/net/disk_cache/blockfile/block_files_unittest.cc
index ca1e019..b9572d1 100644
--- a/net/disk_cache/blockfile/block_files_unittest.cc
+++ b/net/disk_cache/blockfile/block_files_unittest.cc
@@ -115,11 +115,11 @@
 
   Addr address(entries[kNumEntries / 2]);
   MappedFile* file = files.GetFile(address);
-  ASSERT_TRUE(NULL != file);
+  ASSERT_TRUE(nullptr != file);
 
   BlockFileHeader* header =
       reinterpret_cast<BlockFileHeader*>(file->buffer());
-  ASSERT_TRUE(NULL != header);
+  ASSERT_TRUE(nullptr != header);
 
   ASSERT_EQ(0, header->updating);
 
@@ -140,10 +140,10 @@
 
   // The file must have been fixed.
   file = files.GetFile(address);
-  ASSERT_TRUE(NULL != file);
+  ASSERT_TRUE(nullptr != file);
 
   header = reinterpret_cast<BlockFileHeader*>(file->buffer());
-  ASSERT_TRUE(NULL != header);
+  ASSERT_TRUE(nullptr != header);
 
   ASSERT_EQ(0, header->updating);
 
@@ -211,10 +211,10 @@
   EXPECT_TRUE(files.CreateBlock(RANKINGS, 2, &address));
 
   MappedFile* file = files.GetFile(address);
-  ASSERT_TRUE(NULL != file);
+  ASSERT_TRUE(nullptr != file);
 
   BlockFileHeader* header = reinterpret_cast<BlockFileHeader*>(file->buffer());
-  ASSERT_TRUE(NULL != header);
+  ASSERT_TRUE(nullptr != header);
   ASSERT_EQ(0, header->updating);
 
   // Alter the counters so that the free space doesn't add up.
@@ -223,9 +223,9 @@
 
   ASSERT_TRUE(files.Init(false));
   file = files.GetFile(address);
-  ASSERT_TRUE(NULL != file);
+  ASSERT_TRUE(nullptr != file);
   header = reinterpret_cast<BlockFileHeader*>(file->buffer());
-  ASSERT_TRUE(NULL != header);
+  ASSERT_TRUE(nullptr != header);
 
   // The file must have been fixed.
   ASSERT_EQ(0, header->empty[2]);
@@ -237,9 +237,9 @@
 
   ASSERT_TRUE(files.Init(false));
   file = files.GetFile(address);
-  ASSERT_TRUE(NULL != file);
+  ASSERT_TRUE(nullptr != file);
   header = reinterpret_cast<BlockFileHeader*>(file->buffer());
-  ASSERT_TRUE(NULL != header);
+  ASSERT_TRUE(nullptr != header);
 
   // The file must have been "fixed".
   ASSERT_EQ(2, header->num_entries);
@@ -263,7 +263,7 @@
 
   // Let's access block 10 of file 5. (There is no file).
   Addr addr(BLOCK_256, 1, 5, 10);
-  EXPECT_TRUE(NULL == files.GetFile(addr));
+  EXPECT_TRUE(nullptr == files.GetFile(addr));
 
   // Let's create an invalid file.
   base::FilePath filename(files.Name(5));
@@ -272,10 +272,10 @@
   EXPECT_EQ(kBlockHeaderSize,
             base::WriteFile(filename, header, kBlockHeaderSize));
 
-  EXPECT_TRUE(NULL == files.GetFile(addr));
+  EXPECT_TRUE(nullptr == files.GetFile(addr));
 
   // The file should not have been changed (it is still invalid).
-  EXPECT_TRUE(NULL == files.GetFile(addr));
+  EXPECT_TRUE(nullptr == files.GetFile(addr));
 }
 
 // Tests that we generate the correct file stats.
diff --git a/net/disk_cache/blockfile/entry_impl.cc b/net/disk_cache/blockfile/entry_impl.cc
index 97dd597..dc96b82 100644
--- a/net/disk_cache/blockfile/entry_impl.cc
+++ b/net/disk_cache/blockfile/entry_impl.cc
@@ -75,7 +75,7 @@
           disk_cache::CreateNetLogReadWriteCompleteCallback(bytes_copied));
     }
     entry_->ReportIOTime(disk_cache::EntryImpl::kAsyncIO, start_);
-    buf_ = NULL;  // Release the buffer before invoking the callback.
+    buf_ = nullptr;  // Release the buffer before invoking the callback.
     std::move(callback_).Run(bytes_copied);
   }
   delete this;
@@ -83,7 +83,7 @@
 
 void SyncCallback::Discard() {
   callback_.Reset();
-  buf_ = NULL;
+  buf_ = nullptr;
   OnFileIOComplete(0);
 }
 
@@ -130,7 +130,7 @@
   // Prepare this buffer for reuse.
   void Reset();
 
-  char* Data() { return buffer_.size() ? &buffer_[0] : NULL; }
+  char* Data() { return buffer_.size() ? &buffer_[0] : nullptr; }
   int Size() { return static_cast<int>(buffer_.size()); }
   int Start() { return offset_; }
   int End() { return offset_ + Size(); }
@@ -302,8 +302,11 @@
 // ------------------------------------------------------------------------
 
 EntryImpl::EntryImpl(BackendImpl* backend, Addr address, bool read_only)
-    : entry_(NULL, Addr(0)), node_(NULL, Addr(0)),
-      backend_(backend->GetWeakPtr()), doomed_(false), read_only_(read_only),
+    : entry_(nullptr, Addr(0)),
+      node_(nullptr, Addr(0)),
+      backend_(backend->GetWeakPtr()),
+      doomed_(false),
+      read_only_(read_only),
       dirty_(false) {
   entry_.LazyInit(backend->File(address), address);
   for (int i = 0; i < kNumStreams; i++) {
@@ -1070,7 +1073,7 @@
                    kBlockHeaderSize;
   }
 
-  SyncCallback* io_callback = NULL;
+  SyncCallback* io_callback = nullptr;
   bool null_callback = callback.is_null();
   if (!null_callback) {
     io_callback =
@@ -1178,7 +1181,7 @@
   if (!buf_len)
     return 0;
 
-  SyncCallback* io_callback = NULL;
+  SyncCallback* io_callback = nullptr;
   bool null_callback = callback.is_null();
   if (!null_callback) {
     io_callback = new SyncCallback(this, buf, std::move(callback),
@@ -1257,7 +1260,7 @@
           backend_->GetFileName(address).value() << " from the cache.";
     }
     if (files_[index].get())
-      files_[index] = NULL;  // Releases the object.
+      files_[index] = nullptr;  // Releases the object.
   } else {
     backend_->DeleteBlock(address, true);
   }
@@ -1282,7 +1285,7 @@
 
 File* EntryImpl::GetBackingFile(Addr address, int index) {
   if (!backend_.get())
-    return NULL;
+    return nullptr;
 
   File* file;
   if (address.is_separate_file())
@@ -1410,7 +1413,7 @@
 
   int len = std::min(entry_.Data()->data_size[index], kMaxBlockSize);
   user_buffers_[index].reset(new UserBuffer(backend_.get()));
-  user_buffers_[index]->Write(len, NULL, 0);
+  user_buffers_[index]->Write(len, nullptr, 0);
 
   File* file = GetBackingFile(address, index);
   int offset = 0;
@@ -1418,8 +1421,8 @@
   if (address.is_block_file())
     offset = address.start_block() * address.BlockSize() + kBlockHeaderSize;
 
-  if (!file ||
-      !file->Read(user_buffers_[index]->Data(), len, offset, NULL, NULL)) {
+  if (!file || !file->Read(user_buffers_[index]->Data(), len, offset, nullptr,
+                           nullptr)) {
     user_buffers_[index].reset();
     return false;
   }
@@ -1516,7 +1519,7 @@
   if (!file)
     return false;
 
-  if (!file->Write(user_buffers_[index]->Data(), len, offset, NULL, NULL))
+  if (!file->Write(user_buffers_[index]->Data(), len, offset, nullptr, nullptr))
     return false;
   user_buffers_[index]->Reset();
 
@@ -1570,7 +1573,7 @@
 
   // Bad news: we'd have to read the info from disk so instead we'll just tell
   // the caller where to read from.
-  *buffer = NULL;
+  *buffer = nullptr;
   address->set_value(entry_.Data()->data_addr[index]);
   if (address->is_initialized()) {
     // Prevent us from deleting the block from the backing store.
diff --git a/net/disk_cache/blockfile/eviction.cc b/net/disk_cache/blockfile/eviction.cc
index be71609..2608c7a 100644
--- a/net/disk_cache/blockfile/eviction.cc
+++ b/net/disk_cache/blockfile/eviction.cc
@@ -79,11 +79,7 @@
 
 // The real initialization happens during Init(), init_ is the only member that
 // has to be initialized here.
-Eviction::Eviction()
-    : backend_(NULL),
-      init_(false),
-      ptr_factory_(this) {
-}
+Eviction::Eviction() : backend_(nullptr), init_(false), ptr_factory_(this) {}
 
 Eviction::~Eviction() = default;
 
@@ -331,7 +327,7 @@
     next[i].set_rankings(rankings_);
     if (done)
       continue;
-    next[i].reset(rankings_->GetPrev(NULL, static_cast<Rankings::List>(i)));
+    next[i].reset(rankings_->GetPrev(nullptr, static_cast<Rankings::List>(i)));
     if (!empty && NodeIsOldEnough(next[i].get(), i)) {
       list = static_cast<Rankings::List>(i);
       done = true;
@@ -577,14 +573,14 @@
   if (!new_eviction_)
     return;
 
-  Rankings::ScopedRankingsBlock last1(rankings_,
-      rankings_->GetPrev(NULL, Rankings::NO_USE));
-  Rankings::ScopedRankingsBlock last2(rankings_,
-      rankings_->GetPrev(NULL, Rankings::LOW_USE));
-  Rankings::ScopedRankingsBlock last3(rankings_,
-      rankings_->GetPrev(NULL, Rankings::HIGH_USE));
-  Rankings::ScopedRankingsBlock last4(rankings_,
-      rankings_->GetPrev(NULL, Rankings::DELETED));
+  Rankings::ScopedRankingsBlock last1(
+      rankings_, rankings_->GetPrev(nullptr, Rankings::NO_USE));
+  Rankings::ScopedRankingsBlock last2(
+      rankings_, rankings_->GetPrev(nullptr, Rankings::LOW_USE));
+  Rankings::ScopedRankingsBlock last3(
+      rankings_, rankings_->GetPrev(nullptr, Rankings::HIGH_USE));
+  Rankings::ScopedRankingsBlock last4(
+      rankings_, rankings_->GetPrev(nullptr, Rankings::DELETED));
 
   if (last1.get())
     CACHE_UMA(AGE, "NoUseAge", 0,
diff --git a/net/disk_cache/blockfile/file_win.cc b/net/disk_cache/blockfile/file_win.cc
index 1bf43d1..2225c16d 100644
--- a/net/disk_cache/blockfile/file_win.cc
+++ b/net/disk_cache/blockfile/file_win.cc
@@ -115,9 +115,9 @@
 
   DWORD sharing = FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE;
   DWORD access = GENERIC_READ | GENERIC_WRITE | DELETE;
-  base_file_ =
-      base::File(CreateFile(base::as_wcstr(name.value()), access, sharing, NULL,
-                            OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL));
+  base_file_ = base::File(CreateFile(base::as_wcstr(name.value()), access,
+                                     sharing, nullptr, OPEN_EXISTING,
+                                     FILE_FLAG_OVERLAPPED, nullptr));
 
   if (!base_file_.IsValid())
     return false;
@@ -127,8 +127,8 @@
 
   init_ = true;
   sync_base_file_ =
-      base::File(CreateFile(base::as_wcstr(name.value()), access, sharing, NULL,
-                            OPEN_EXISTING, 0, NULL));
+      base::File(CreateFile(base::as_wcstr(name.value()), access, sharing,
+                            nullptr, OPEN_EXISTING, 0, nullptr));
 
   if (!sync_base_file_.IsValid())
     return false;
@@ -193,8 +193,8 @@
   // The operation completed already. We'll be called back anyway.
   *completed = (actual == size);
   DCHECK_EQ(size, actual);
-  data->callback_ = NULL;
-  data->file_ = NULL;  // There is no reason to hold on to this anymore.
+  data->callback_ = nullptr;
+  data->file_ = nullptr;  // There is no reason to hold on to this anymore.
   return *completed;
 }
 
@@ -243,8 +243,8 @@
   // The operation completed already. We'll be called back anyway.
   *completed = (actual == size);
   DCHECK_EQ(size, actual);
-  data->callback_ = NULL;
-  data->file_ = NULL;  // There is no reason to hold on to this anymore.
+  data->callback_ = nullptr;
+  data->file_ = nullptr;  // There is no reason to hold on to this anymore.
   return *completed;
 }
 
@@ -255,7 +255,8 @@
 
   DWORD size = static_cast<DWORD>(length);
   HANDLE file = platform_file();
-  if (INVALID_SET_FILE_POINTER == SetFilePointer(file, size, NULL, FILE_BEGIN))
+  if (INVALID_SET_FILE_POINTER ==
+      SetFilePointer(file, size, nullptr, FILE_BEGIN))
     return false;
 
   return TRUE == SetEndOfFile(file);
diff --git a/net/disk_cache/blockfile/in_flight_backend_io.cc b/net/disk_cache/blockfile/in_flight_backend_io.cc
index 552b8416..32895a5 100644
--- a/net/disk_cache/blockfile/in_flight_backend_io.cc
+++ b/net/disk_cache/blockfile/in_flight_backend_io.cc
@@ -41,16 +41,16 @@
       backend_(backend),
       callback_(std::move(callback)),
       operation_(OP_NONE),
-      entry_ptr_(NULL),
-      entry_with_opened_ptr_(NULL),
-      iterator_(NULL),
-      entry_(NULL),
+      entry_ptr_(nullptr),
+      entry_with_opened_ptr_(nullptr),
+      iterator_(nullptr),
+      entry_(nullptr),
       index_(0),
       offset_(0),
       buf_len_(0),
       truncate_(false),
       offset64_(0),
-      start_(NULL) {
+      start_(nullptr) {
   start_time_ = base::TimeTicks::Now();
 }
 
@@ -388,7 +388,7 @@
       NOTREACHED() << "Invalid Operation";
       result_ = net::ERR_UNEXPECTED;
   }
-  buf_ = NULL;
+  buf_ = nullptr;
   if (result_ != net::ERR_IO_PENDING)
     NotifyController();
 }
diff --git a/net/disk_cache/blockfile/in_flight_io.cc b/net/disk_cache/blockfile/in_flight_io.cc
index e32a6b49..893108d 100644
--- a/net/disk_cache/blockfile/in_flight_io.cc
+++ b/net/disk_cache/blockfile/in_flight_io.cc
@@ -29,7 +29,7 @@
   // controller_ may be in use from the background thread at this time.
   base::AutoLock lock(controller_lock_);
   DCHECK(controller_);
-  controller_ = NULL;
+  controller_ = nullptr;
 }
 
 BackgroundIO::~BackgroundIO() = default;
diff --git a/net/disk_cache/blockfile/mapped_file_win.cc b/net/disk_cache/blockfile/mapped_file_win.cc
index 706ae09..1490212 100644
--- a/net/disk_cache/blockfile/mapped_file_win.cc
+++ b/net/disk_cache/blockfile/mapped_file_win.cc
@@ -17,14 +17,14 @@
 void* MappedFile::Init(const base::FilePath& name, size_t size) {
   DCHECK(!init_);
   if (init_ || !File::Init(name))
-    return NULL;
+    return nullptr;
 
-  buffer_ = NULL;
+  buffer_ = nullptr;
   init_ = true;
-  section_ = CreateFileMapping(platform_file(), NULL, PAGE_READWRITE, 0,
-                               static_cast<DWORD>(size), NULL);
+  section_ = CreateFileMapping(platform_file(), nullptr, PAGE_READWRITE, 0,
+                               static_cast<DWORD>(size), nullptr);
   if (!section_)
-    return NULL;
+    return nullptr;
 
   buffer_ = MapViewOfFile(section_, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, size);
   DCHECK(buffer_);
@@ -34,7 +34,7 @@
   size_t temp_len = size ? size : 4096;
   std::unique_ptr<char[]> temp(new char[temp_len]);
   if (!Read(temp.get(), temp_len, 0))
-    return NULL;
+    return nullptr;
 
   return buffer_;
 }
diff --git a/net/disk_cache/blockfile/rankings.cc b/net/disk_cache/blockfile/rankings.cc
index 6ce0438..978b8d9 100644
--- a/net/disk_cache/blockfile/rankings.cc
+++ b/net/disk_cache/blockfile/rankings.cc
@@ -192,7 +192,7 @@
 
 namespace disk_cache {
 
-Rankings::ScopedRankingsBlock::ScopedRankingsBlock() : rankings_(NULL) {}
+Rankings::ScopedRankingsBlock::ScopedRankingsBlock() : rankings_(nullptr) {}
 
 Rankings::ScopedRankingsBlock::ScopedRankingsBlock(Rankings* rankings)
     : rankings_(rankings) {}
@@ -242,7 +242,7 @@
     heads_[i].set_value(0);
     tails_[i].set_value(0);
   }
-  control_data_ = NULL;
+  control_data_ = nullptr;
 }
 
 void Rankings::Insert(CacheRankingsBlock* node, bool modified, List list) {
@@ -420,30 +420,30 @@
   if (!node) {
     Addr& my_head = heads_[list];
     if (!my_head.is_initialized())
-      return NULL;
+      return nullptr;
     next.reset(new CacheRankingsBlock(backend_->File(my_head), my_head));
   } else {
     if (!node->HasData())
       node->Load();
     Addr& my_tail = tails_[list];
     if (!my_tail.is_initialized())
-      return NULL;
+      return nullptr;
     if (my_tail.value() == node->address().value())
-      return NULL;
+      return nullptr;
     Addr address(node->Data()->next);
     if (address.value() == node->address().value())
-      return NULL;  // Another tail? fail it.
+      return nullptr;  // Another tail? fail it.
     next.reset(new CacheRankingsBlock(backend_->File(address), address));
   }
 
   TrackRankingsBlock(next.get(), true);
 
   if (!GetRanking(next.get()))
-    return NULL;
+    return nullptr;
 
   ConvertToLongLived(next.get());
   if (node && !CheckSingleLink(node, next.get()))
-    return NULL;
+    return nullptr;
 
   return next.release();
 }
@@ -453,30 +453,30 @@
   if (!node) {
     Addr& my_tail = tails_[list];
     if (!my_tail.is_initialized())
-      return NULL;
+      return nullptr;
     prev.reset(new CacheRankingsBlock(backend_->File(my_tail), my_tail));
   } else {
     if (!node->HasData())
       node->Load();
     Addr& my_head = heads_[list];
     if (!my_head.is_initialized())
-      return NULL;
+      return nullptr;
     if (my_head.value() == node->address().value())
-      return NULL;
+      return nullptr;
     Addr address(node->Data()->prev);
     if (address.value() == node->address().value())
-      return NULL;  // Another head? fail it.
+      return nullptr;  // Another head? fail it.
     prev.reset(new CacheRankingsBlock(backend_->File(address), address));
   }
 
   TrackRankingsBlock(prev.get(), true);
 
   if (!GetRanking(prev.get()))
-    return NULL;
+    return nullptr;
 
   ConvertToLongLived(prev.get());
   if (node && !CheckSingleLink(prev.get(), node))
-    return NULL;
+    return nullptr;
 
   return prev.release();
 }
@@ -627,7 +627,7 @@
   // We cannot return a shared node because we are not keeping a reference
   // to the entry that owns the buffer. Make this node a copy of the one that
   // we have, and let the iterator logic update it when the entry changes.
-  CacheRankingsBlock temp(NULL, Addr(0));
+  CacheRankingsBlock temp(nullptr, Addr(0));
   *temp.Data() = *rankings->Data();
   rankings->StopSharingData();
   *rankings->Data() = *temp.Data();
diff --git a/net/disk_cache/blockfile/rankings.h b/net/disk_cache/blockfile/rankings.h
index 66ba7b8..c55c0a2 100644
--- a/net/disk_cache/blockfile/rankings.h
+++ b/net/disk_cache/blockfile/rankings.h
@@ -81,7 +81,7 @@
     }
 
     // scoped_ptr::reset will delete the object.
-    void reset(CacheRankingsBlock* p = NULL) {
+    void reset(CacheRankingsBlock* p = nullptr) {
       if (p != get())
         rankings_->FreeRankingsBlock(get());
       std::unique_ptr<CacheRankingsBlock>::reset(p);
diff --git a/net/disk_cache/blockfile/sparse_control.cc b/net/disk_cache/blockfile/sparse_control.cc
index 105ce54..f064890 100644
--- a/net/disk_cache/blockfile/sparse_control.cc
+++ b/net/disk_cache/blockfile/sparse_control.cc
@@ -196,7 +196,7 @@
 
 SparseControl::SparseControl(EntryImpl* entry)
     : entry_(entry),
-      child_(NULL),
+      child_(nullptr),
       operation_(kNoOperation),
       pending_(false),
       finished_(false),
@@ -279,8 +279,8 @@
   // Copy the operation parameters.
   operation_ = op;
   offset_ = offset;
-  user_buf_ =
-      buf ? base::MakeRefCounted<net::DrainableIOBuffer>(buf, buf_len) : NULL;
+  user_buf_ = buf ? base::MakeRefCounted<net::DrainableIOBuffer>(buf, buf_len)
+                  : nullptr;
   buf_len_ = buf_len;
   user_callback_ = std::move(callback);
 
@@ -299,7 +299,7 @@
   if (!pending_) {
     // Everything was done synchronously.
     operation_ = kNoOperation;
-    user_buf_ = NULL;
+    user_buf_ = nullptr;
     user_callback_.Reset();
     return result_;
   }
@@ -316,8 +316,8 @@
   DCHECK(start);
 
   range_found_ = false;
-  int result =
-      StartIO(kGetRangeOperation, offset, NULL, len, CompletionOnceCallback());
+  int result = StartIO(kGetRangeOperation, offset, nullptr, len,
+                       CompletionOnceCallback());
   if (range_found_) {
     *start = offset_;
     return result;
@@ -515,7 +515,7 @@
                              CompletionOnceCallback(), false);
   if (rv != sizeof(child_data_))
     DLOG(ERROR) << "Failed to save child data";
-  child_ = NULL;
+  child_ = nullptr;
 }
 
 std::string SparseControl::GenerateChildKey() {
@@ -527,7 +527,7 @@
 bool SparseControl::KillChildAndContinue(const std::string& key, bool fatal) {
   SetChildBit(false);
   child_->DoomImpl();
-  child_ = NULL;
+  child_ = nullptr;
   if (fatal) {
     result_ = net::ERR_CACHE_READ_FAILURE;
     return false;
@@ -547,7 +547,7 @@
 
   child_ = entry_->backend_->CreateEntryImpl(key);
   if (!child_) {
-    child_ = NULL;
+    child_ = nullptr;
     result_ = net::ERR_CACHE_READ_FAILURE;
     return false;
   }
@@ -901,7 +901,7 @@
 void SparseControl::DoUserCallback() {
   DCHECK(!user_callback_.is_null());
   CompletionOnceCallback cb = std::move(user_callback_);
-  user_buf_ = NULL;
+  user_buf_ = nullptr;
   pending_ = false;
   operation_ = kNoOperation;
   int rv = result_;
diff --git a/net/disk_cache/blockfile/storage_block-inl.h b/net/disk_cache/blockfile/storage_block-inl.h
index 828df3a..784463e 100644
--- a/net/disk_cache/blockfile/storage_block-inl.h
+++ b/net/disk_cache/blockfile/storage_block-inl.h
@@ -16,10 +16,14 @@
 
 namespace disk_cache {
 
-template<typename T> StorageBlock<T>::StorageBlock(MappedFile* file,
-                                                   Addr address)
-    : data_(NULL), file_(file), address_(address), modified_(false),
-      own_data_(false), extended_(false) {
+template <typename T>
+StorageBlock<T>::StorageBlock(MappedFile* file, Addr address)
+    : data_(nullptr),
+      file_(file),
+      address_(address),
+      modified_(false),
+      own_data_(false),
+      extended_(false) {
   if (address.num_blocks() > 1)
     extended_ = true;
   DCHECK(!address.is_initialized() || sizeof(*data_) == address.BlockSize());
@@ -74,7 +78,7 @@
     return;
   }
   DeleteData();
-  data_ = NULL;
+  data_ = nullptr;
   modified_ = false;
   extended_ = false;
 }
@@ -83,7 +87,7 @@
   if (!data_ || own_data_)
     return;
   DCHECK(!modified_);
-  data_ = NULL;
+  data_ = nullptr;
 }
 
 template<typename T> void StorageBlock<T>::set_modified() {
@@ -102,7 +106,7 @@
 }
 
 template<typename T> bool StorageBlock<T>::HasData() const {
-  return (NULL != data_);
+  return (nullptr != data_);
 }
 
 template<typename T> bool StorageBlock<T>::VerifyHash() const {
diff --git a/net/disk_cache/blockfile/storage_block_unittest.cc b/net/disk_cache/blockfile/storage_block_unittest.cc
index 0ed528e..9992edc 100644
--- a/net/disk_cache/blockfile/storage_block_unittest.cc
+++ b/net/disk_cache/blockfile/storage_block_unittest.cc
@@ -43,7 +43,7 @@
 
   CacheEntryBlock entry2(file.get(), disk_cache::Addr(0xa0010002));
   EXPECT_TRUE(entry2.Load());
-  EXPECT_TRUE(entry2.Data() != NULL);
+  EXPECT_TRUE(entry2.Data() != nullptr);
   EXPECT_TRUE(0 == entry2.Data()->hash);
 
   EXPECT_TRUE(entry2.Data() != entry1.Data());
diff --git a/net/disk_cache/blockfile/trace.cc b/net/disk_cache/blockfile/trace.cc
index cea0eba..0b451be 100644
--- a/net/disk_cache/blockfile/trace.cc
+++ b/net/disk_cache/blockfile/trace.cc
@@ -59,7 +59,7 @@
 // s_trace_buffer and s_trace_object are not singletons because I want the
 // buffer to be destroyed and re-created when the last user goes away, and it
 // must be straightforward to access the buffer from the debugger.
-static TraceObject* s_trace_object = NULL;
+static TraceObject* s_trace_object = nullptr;
 
 // Static.
 TraceObject* TraceObject::GetTraceObject() {
@@ -87,7 +87,7 @@
 
 #if ENABLE_TRACING
 
-static TraceBuffer* s_trace_buffer = NULL;
+static TraceBuffer* s_trace_buffer = nullptr;
 
 void InitTrace(void) {
   s_trace_enabled = true;
@@ -102,8 +102,8 @@
   base::AutoLock lock(s_lock.Get());
 
   delete s_trace_buffer;
-  s_trace_buffer = NULL;
-  s_trace_object = NULL;
+  s_trace_buffer = nullptr;
+  s_trace_object = nullptr;
 }
 
 void Trace(const char* format, ...) {
diff --git a/net/disk_cache/blockfile/webfonts_histogram.cc b/net/disk_cache/blockfile/webfonts_histogram.cc
index a92d942..95f54af 100644
--- a/net/disk_cache/blockfile/webfonts_histogram.cc
+++ b/net/disk_cache/blockfile/webfonts_histogram.cc
@@ -48,7 +48,7 @@
       return kOthers;
     }
   }
-  return NULL;
+  return nullptr;
 }
 
 std::string HistogramName(const char* prefix, const char* label) {
diff --git a/net/disk_cache/cache_util_unittest.cc b/net/disk_cache/cache_util_unittest.cc
index d7b4caa..598d59ff 100644
--- a/net/disk_cache/cache_util_unittest.cc
+++ b/net/disk_cache/cache_util_unittest.cc
@@ -27,14 +27,14 @@
     file3_ = base::FilePath(dir1_.Append(FILE_PATH_LITERAL("file03")));
     ASSERT_TRUE(base::CreateDirectory(cache_dir_));
     FILE *fp = base::OpenFile(file1_, "w");
-    ASSERT_TRUE(fp != NULL);
+    ASSERT_TRUE(fp != nullptr);
     base::CloseFile(fp);
     fp = base::OpenFile(file2_, "w");
-    ASSERT_TRUE(fp != NULL);
+    ASSERT_TRUE(fp != nullptr);
     base::CloseFile(fp);
     ASSERT_TRUE(base::CreateDirectory(dir1_));
     fp = base::OpenFile(file3_, "w");
-    ASSERT_TRUE(fp != NULL);
+    ASSERT_TRUE(fp != nullptr);
     base::CloseFile(fp);
     dest_dir_ = tmp_dir_.GetPath().Append(FILE_PATH_LITERAL("old_Cache_001"));
     dest_file1_ = base::FilePath(dest_dir_.Append(FILE_PATH_LITERAL("file01")));
diff --git a/net/disk_cache/cache_util_win.cc b/net/disk_cache/cache_util_win.cc
index 83353d7c..1bd12e5b 100644
--- a/net/disk_cache/cache_util_win.cc
+++ b/net/disk_cache/cache_util_win.cc
@@ -35,8 +35,8 @@
     DWORD sharing = FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE;
     DWORD access = SYNCHRONIZE;
     base::win::ScopedHandle file(CreateFile(base::as_wcstr(name.value()),
-                                            access, sharing, NULL,
-                                            OPEN_EXISTING, 0, NULL));
+                                            access, sharing, nullptr,
+                                            OPEN_EXISTING, 0, nullptr));
     if (file.IsValid())
       return false;
 
diff --git a/net/disk_cache/disk_cache_test_base.cc b/net/disk_cache/disk_cache_test_base.cc
index c83e0f50..f7ca9b2a 100644
--- a/net/disk_cache/disk_cache_test_base.cc
+++ b/net/disk_cache/disk_cache_test_base.cc
@@ -74,9 +74,9 @@
 }
 
 DiskCacheTestWithCache::DiskCacheTestWithCache()
-    : cache_impl_(NULL),
-      simple_cache_impl_(NULL),
-      mem_cache_(NULL),
+    : cache_impl_(nullptr),
+      simple_cache_impl_(nullptr),
+      mem_cache_(nullptr),
       mask_(0),
       size_(0),
       type_(net::DISK_CACHE),
@@ -97,7 +97,7 @@
   else
     InitDiskCache();
 
-  ASSERT_TRUE(NULL != cache_);
+  ASSERT_TRUE(nullptr != cache_);
   if (first_cleanup_)
     ASSERT_EQ(0, cache_->GetEntryCount());
 }
@@ -321,7 +321,7 @@
 }
 
 void DiskCacheTestWithCache::InitMemoryCache() {
-  mem_cache_ = new disk_cache::MemBackendImpl(NULL);
+  mem_cache_ = new disk_cache::MemBackendImpl(nullptr);
   cache_.reset(mem_cache_);
   ASSERT_TRUE(cache_);
 
diff --git a/net/disk_cache/disk_cache_test_util.cc b/net/disk_cache/disk_cache_test_util.cc
index 7382adaa..57741417 100644
--- a/net/disk_cache/disk_cache_test_util.cc
+++ b/net/disk_cache/disk_cache_test_util.cc
@@ -64,7 +64,7 @@
                          int max_size,
                          uint32_t mask) {
   std::unique_ptr<disk_cache::BackendImpl> cache(new disk_cache::BackendImpl(
-      path, mask, base::ThreadTaskRunnerHandle::Get(), NULL));
+      path, mask, base::ThreadTaskRunnerHandle::Get(), nullptr));
   if (max_size)
     cache->SetMaxSize(max_size);
   if (!cache.get())
diff --git a/net/disk_cache/entry_unittest.cc b/net/disk_cache/entry_unittest.cc
index c309f1b..41f9713 100644
--- a/net/disk_cache/entry_unittest.cc
+++ b/net/disk_cache/entry_unittest.cc
@@ -141,10 +141,10 @@
   EXPECT_EQ(8192, entry->GetDataSize(1));
 
   // We need to delete the memory buffer on this thread.
-  EXPECT_EQ(
-      0, entry->WriteData(0, 0, NULL, 0, net::CompletionOnceCallback(), true));
-  EXPECT_EQ(
-      0, entry->WriteData(1, 0, NULL, 0, net::CompletionOnceCallback(), true));
+  EXPECT_EQ(0, entry->WriteData(0, 0, nullptr, 0, net::CompletionOnceCallback(),
+                                true));
+  EXPECT_EQ(0, entry->WriteData(1, 0, nullptr, 0, net::CompletionOnceCallback(),
+                                true));
 }
 
 // We need to support synchronous IO even though it is not a supported operation
@@ -152,9 +152,9 @@
 // it internally, not just by a few tests, but as part of the implementation
 // (see sparse_control.cc, for example).
 void DiskCacheEntryTest::InternalSyncIO() {
-  disk_cache::Entry* entry = NULL;
+  disk_cache::Entry* entry = nullptr;
   ASSERT_THAT(CreateEntry("the first key", &entry), IsOk());
-  ASSERT_TRUE(NULL != entry);
+  ASSERT_TRUE(nullptr != entry);
 
   // The bulk of the test runs from within the callback, on the cache thread.
   RunTaskForTest(base::Bind(&DiskCacheEntryTest::InternalSyncIOBackground,
@@ -180,17 +180,17 @@
 }
 
 void DiskCacheEntryTest::InternalAsyncIO() {
-  disk_cache::Entry* entry = NULL;
+  disk_cache::Entry* entry = nullptr;
   ASSERT_THAT(CreateEntry("the first key", &entry), IsOk());
-  ASSERT_TRUE(NULL != entry);
+  ASSERT_TRUE(nullptr != entry);
 
   // Avoid using internal buffers for the test. We have to write something to
   // the entry and close it so that we flush the internal buffer to disk. After
   // that, IO operations will be really hitting the disk. We don't care about
   // the content, so just extending the entry is enough (all extensions zero-
   // fill any holes).
-  EXPECT_EQ(0, WriteData(entry, 0, 15 * 1024, NULL, 0, false));
-  EXPECT_EQ(0, WriteData(entry, 1, 15 * 1024, NULL, 0, false));
+  EXPECT_EQ(0, WriteData(entry, 0, 15 * 1024, nullptr, 0, false));
+  EXPECT_EQ(0, WriteData(entry, 1, 15 * 1024, nullptr, 0, false));
   entry->Close();
   ASSERT_THAT(OpenEntry("the first key", &entry), IsOk());
 
@@ -422,10 +422,10 @@
   EXPECT_EQ(37000, entry->GetDataSize(1));
 
   // We need to delete the memory buffer on this thread.
-  EXPECT_EQ(
-      0, entry->WriteData(0, 0, NULL, 0, net::CompletionOnceCallback(), true));
-  EXPECT_EQ(
-      0, entry->WriteData(1, 0, NULL, 0, net::CompletionOnceCallback(), true));
+  EXPECT_EQ(0, entry->WriteData(0, 0, nullptr, 0, net::CompletionOnceCallback(),
+                                true));
+  EXPECT_EQ(0, entry->WriteData(1, 0, nullptr, 0, net::CompletionOnceCallback(),
+                                true));
 }
 
 void DiskCacheEntryTest::ExternalSyncIO() {
@@ -631,9 +631,9 @@
 
 // Tests that IOBuffers are not referenced after IO completes.
 void DiskCacheEntryTest::ReleaseBuffer(int stream_index) {
-  disk_cache::Entry* entry = NULL;
+  disk_cache::Entry* entry = nullptr;
   ASSERT_THAT(CreateEntry("the first key", &entry), IsOk());
-  ASSERT_TRUE(NULL != entry);
+  ASSERT_TRUE(nullptr != entry);
 
   const int kBufferSize = 1024;
   scoped_refptr<net::IOBuffer> buffer =
@@ -660,9 +660,9 @@
 }
 
 void DiskCacheEntryTest::StreamAccess() {
-  disk_cache::Entry* entry = NULL;
+  disk_cache::Entry* entry = nullptr;
   ASSERT_THAT(CreateEntry("the first key", &entry), IsOk());
-  ASSERT_TRUE(NULL != entry);
+  ASSERT_TRUE(nullptr != entry);
 
   const int kBufferSize = 1024;
   const int kNumStreams = 3;
@@ -688,7 +688,7 @@
 
   // Open the entry and read it in chunks, including a read past the end.
   ASSERT_THAT(OpenEntry("the first key", &entry), IsOk());
-  ASSERT_TRUE(NULL != entry);
+  ASSERT_TRUE(nullptr != entry);
   const int kReadBufferSize = 600;
   const int kFinalReadSize = kBufferSize - kReadBufferSize;
   static_assert(kFinalReadSize < kReadBufferSize,
@@ -793,7 +793,7 @@
   AddDelay();
   Time t2 = Time::Now();
   EXPECT_TRUE(t2 > t1);
-  EXPECT_EQ(0, WriteData(entry, stream_index, 200, NULL, 0, false));
+  EXPECT_EQ(0, WriteData(entry, stream_index, 200, nullptr, 0, false));
   if (type_ == net::APP_CACHE) {
     EXPECT_TRUE(entry->GetLastModified() < t2);
   } else {
@@ -1022,17 +1022,17 @@
   disk_cache::Entry* entry;
   ASSERT_THAT(CreateEntry(key, &entry), IsOk());
 
-  EXPECT_EQ(0, ReadData(entry, stream_index, 0, NULL, 0));
-  EXPECT_EQ(0, WriteData(entry, stream_index, 0, NULL, 0, false));
+  EXPECT_EQ(0, ReadData(entry, stream_index, 0, nullptr, 0));
+  EXPECT_EQ(0, WriteData(entry, stream_index, 0, nullptr, 0, false));
 
   // This write should extend the entry.
-  EXPECT_EQ(0, WriteData(entry, stream_index, 1000, NULL, 0, false));
-  EXPECT_EQ(0, ReadData(entry, stream_index, 500, NULL, 0));
-  EXPECT_EQ(0, ReadData(entry, stream_index, 2000, NULL, 0));
+  EXPECT_EQ(0, WriteData(entry, stream_index, 1000, nullptr, 0, false));
+  EXPECT_EQ(0, ReadData(entry, stream_index, 500, nullptr, 0));
+  EXPECT_EQ(0, ReadData(entry, stream_index, 2000, nullptr, 0));
   EXPECT_EQ(1000, entry->GetDataSize(stream_index));
 
-  EXPECT_EQ(0, WriteData(entry, stream_index, 100000, NULL, 0, true));
-  EXPECT_EQ(0, ReadData(entry, stream_index, 50000, NULL, 0));
+  EXPECT_EQ(0, WriteData(entry, stream_index, 100000, nullptr, 0, true));
+  EXPECT_EQ(0, ReadData(entry, stream_index, 50000, nullptr, 0));
   EXPECT_EQ(100000, entry->GetDataSize(stream_index));
 
   // Let's verify the actual content.
@@ -1459,7 +1459,7 @@
                 stream_index, 0, buffer.get(), kSize, cb.callback(), false));
 
   // Release our reference to the buffer.
-  buffer = NULL;
+  buffer = nullptr;
   EXPECT_EQ(kSize, cb.WaitForResult());
 
   // And now test with a Read().
@@ -1469,7 +1469,7 @@
   EXPECT_EQ(
       net::ERR_IO_PENDING,
       entry->ReadData(stream_index, 0, buffer.get(), kSize, cb.callback()));
-  buffer = NULL;
+  buffer = nullptr;
   EXPECT_EQ(kSize, cb.WaitForResult());
 
   entry->Close();
@@ -1657,10 +1657,10 @@
 
   // Perform the enumerations.
   std::unique_ptr<TestIterator> iter = CreateIterator();
-  disk_cache::Entry* entry = NULL;
+  disk_cache::Entry* entry = nullptr;
   int count = 0;
   while (iter->OpenNextEntry(&entry) == net::OK) {
-    ASSERT_TRUE(entry != NULL);
+    ASSERT_TRUE(entry != nullptr);
     ++count;
     disk_cache::MemEntryImpl* mem_entry =
         reinterpret_cast<disk_cache::MemEntryImpl*>(entry);
@@ -2491,7 +2491,7 @@
   int count = 0;
   std::string child_key[2];
   while (iter->OpenNextEntry(&entry) == net::OK) {
-    ASSERT_TRUE(entry != NULL);
+    ASSERT_TRUE(entry != nullptr);
     // Writing to an entry will alter the LRU list and invalidate the iterator.
     if (entry->GetKey() != key && count < 2)
       child_key[count++] = entry->GetKey();
@@ -2795,7 +2795,7 @@
 // Requires SimpleCacheMode.
 bool DiskCacheEntryTest::SimpleCacheMakeBadChecksumEntry(const std::string& key,
                                                          int data_size) {
-  disk_cache::Entry* entry = NULL;
+  disk_cache::Entry* entry = nullptr;
 
   if (CreateEntry(key, &entry) != net::OK || !entry) {
     LOG(ERROR) << "Could not create entry";
@@ -2808,7 +2808,7 @@
 
   EXPECT_EQ(data_size, WriteData(entry, 1, 0, buffer.get(), data_size, false));
   entry->Close();
-  entry = NULL;
+  entry = nullptr;
 
   // Corrupt the last byte of the data.
   base::FilePath entry_file0_path = cache_path_.AppendASCII(
@@ -2833,7 +2833,7 @@
   const int kLargeSize = 50000;
   ASSERT_TRUE(SimpleCacheMakeBadChecksumEntry(key, kLargeSize));
 
-  disk_cache::Entry* entry = NULL;
+  disk_cache::Entry* entry = nullptr;
 
   // Open the entry. Can't spot the checksum that quickly with it so
   // huge.
@@ -2860,7 +2860,7 @@
   const int kLargeSize = 50000;
   ASSERT_TRUE(SimpleCacheMakeBadChecksumEntry(key, kLargeSize));
 
-  disk_cache::Entry* entry = NULL;
+  disk_cache::Entry* entry = nullptr;
 
   // Open the entry, forcing an IO error.
   ASSERT_THAT(OpenEntry(key, &entry), IsOk());
@@ -3015,18 +3015,18 @@
 
   const std::string key("the first key");
 
-  disk_cache::Entry* entry = NULL;
+  disk_cache::Entry* entry = nullptr;
   ASSERT_THAT(CreateEntry(key, &entry), IsOk());
-  disk_cache::Entry* null = NULL;
+  disk_cache::Entry* null = nullptr;
   EXPECT_NE(null, entry);
   entry->Close();
-  entry = NULL;
+  entry = nullptr;
 
   // Force the entry to flush to disk, so subsequent platform file operations
   // succed.
   ASSERT_THAT(OpenEntry(key, &entry), IsOk());
   entry->Close();
-  entry = NULL;
+  entry = nullptr;
 
   // Truncate the file such that the length isn't sufficient to have an EOF
   // record.
@@ -3046,9 +3046,9 @@
   SetCacheType(net::APP_CACHE);  // APP_CACHE doesn't use optimistic operations.
   SetSimpleCacheMode();
   InitCache();
-  disk_cache::Entry* const null_entry = NULL;
+  disk_cache::Entry* const null_entry = nullptr;
 
-  disk_cache::Entry* entry = NULL;
+  disk_cache::Entry* entry = nullptr;
   EXPECT_THAT(CreateEntry("my key", &entry), IsOk());
   ASSERT_NE(null_entry, entry);
   ScopedEntryPtr entry_closer(entry);
@@ -3073,7 +3073,7 @@
   SetCacheType(net::APP_CACHE);  // APP_CACHE doesn't use optimistic operations.
   SetSimpleCacheMode();
   InitCache();
-  disk_cache::Entry* const null_entry = NULL;
+  disk_cache::Entry* const null_entry = nullptr;
 
   MessageLoopHelper helper;
   CallbackTest create_callback(&helper, false);
@@ -3083,7 +3083,7 @@
   scoped_refptr<net::IOBufferWithSize> write_buffer =
       base::MakeRefCounted<net::IOBufferWithSize>(kBufferSize);
 
-  disk_cache::Entry* entry = NULL;
+  disk_cache::Entry* entry = nullptr;
   EXPECT_THAT(CreateEntry("my key", &entry), IsOk());
   ASSERT_NE(null_entry, entry);
   ScopedEntryPtr entry_closer(entry);
@@ -3108,10 +3108,10 @@
   SetCacheType(net::APP_CACHE);  // APP_CACHE doesn't use optimistic operations.
   SetSimpleCacheMode();
   InitCache();
-  disk_cache::Entry* const null_entry = NULL;
+  disk_cache::Entry* const null_entry = nullptr;
   MessageLoopHelper helper;
 
-  disk_cache::Entry* entry = NULL;
+  disk_cache::Entry* entry = nullptr;
   // Note that |entry| is only set once CreateEntry() completed which is why we
   // have to wait (i.e. use the helper CreateEntry() function).
   EXPECT_THAT(CreateEntry("my key", &entry), IsOk());
@@ -3157,7 +3157,7 @@
   // Create, Write, Read, Write, Read, Close.
   SetSimpleCacheMode();
   InitCache();
-  disk_cache::Entry* null = NULL;
+  disk_cache::Entry* null = nullptr;
   const char key[] = "the first key";
 
   MessageLoopHelper helper;
@@ -3181,7 +3181,7 @@
   CacheTestFillBuffer(buffer1->data(), kSize1, false);
   CacheTestFillBuffer(buffer2->data(), kSize2, false);
 
-  disk_cache::Entry* entry = NULL;
+  disk_cache::Entry* entry = nullptr;
   // Create is optimistic, must return OK.
   ASSERT_EQ(net::OK,
             cache_->CreateEntry(
@@ -3251,14 +3251,14 @@
   // Create, Open, Close, Close.
   SetSimpleCacheMode();
   InitCache();
-  disk_cache::Entry* null = NULL;
+  disk_cache::Entry* null = nullptr;
   const char key[] = "the first key";
 
   MessageLoopHelper helper;
   CallbackTest callback1(&helper, false);
   CallbackTest callback2(&helper, false);
 
-  disk_cache::Entry* entry = NULL;
+  disk_cache::Entry* entry = nullptr;
   ASSERT_EQ(net::OK,
             cache_->CreateEntry(
                 key, net::HIGHEST, &entry,
@@ -3266,7 +3266,7 @@
   EXPECT_NE(null, entry);
   ScopedEntryPtr entry_closer(entry);
 
-  disk_cache::Entry* entry2 = NULL;
+  disk_cache::Entry* entry2 = nullptr;
   ASSERT_EQ(net::ERR_IO_PENDING,
             cache_->OpenEntry(
                 key, net::HIGHEST, &entry2,
@@ -3289,17 +3289,17 @@
   // Create, Close, Open, Close.
   SetSimpleCacheMode();
   InitCache();
-  disk_cache::Entry* null = NULL;
+  disk_cache::Entry* null = nullptr;
   const char key[] = "the first key";
 
-  disk_cache::Entry* entry = NULL;
+  disk_cache::Entry* entry = nullptr;
   ASSERT_EQ(net::OK, cache_->CreateEntry(key, net::HIGHEST, &entry,
                                          net::CompletionOnceCallback()));
   EXPECT_NE(null, entry);
   entry->Close();
 
   net::TestCompletionCallback cb;
-  disk_cache::Entry* entry2 = NULL;
+  disk_cache::Entry* entry2 = nullptr;
   ASSERT_EQ(net::ERR_IO_PENDING,
             cache_->OpenEntry(key, net::HIGHEST, &entry2, cb.callback()));
   ASSERT_THAT(cb.GetResult(net::ERR_IO_PENDING), IsOk());
@@ -3318,7 +3318,7 @@
   // Create, Close, Write, Open, Open, Close, Write, Read, Close.
   SetSimpleCacheMode();
   InitCache();
-  disk_cache::Entry* null = NULL;
+  disk_cache::Entry* null = nullptr;
   const char key[] = "the first key";
 
   net::TestCompletionCallback cb;
@@ -3326,7 +3326,7 @@
   scoped_refptr<net::IOBuffer> buffer1 =
       base::MakeRefCounted<net::IOBuffer>(kSize1);
   CacheTestFillBuffer(buffer1->data(), kSize1, false);
-  disk_cache::Entry* entry = NULL;
+  disk_cache::Entry* entry = nullptr;
 
   ASSERT_EQ(net::OK, cache_->CreateEntry(key, net::HIGHEST, &entry,
                                          net::CompletionOnceCallback()));
@@ -3346,13 +3346,13 @@
 
   // At this point the |entry| must have been destroyed, and called
   // RemoveSelfFromBackend().
-  disk_cache::Entry* entry2 = NULL;
+  disk_cache::Entry* entry2 = nullptr;
   ASSERT_EQ(net::ERR_IO_PENDING,
             cache_->OpenEntry(key, net::HIGHEST, &entry2, cb.callback()));
   ASSERT_THAT(cb.GetResult(net::ERR_IO_PENDING), IsOk());
   EXPECT_NE(null, entry2);
 
-  disk_cache::Entry* entry3 = NULL;
+  disk_cache::Entry* entry3 = nullptr;
   ASSERT_EQ(net::ERR_IO_PENDING,
             cache_->OpenEntry(key, net::HIGHEST, &entry3, cb.callback()));
   ASSERT_THAT(cb.GetResult(net::ERR_IO_PENDING), IsOk());
@@ -3384,7 +3384,7 @@
   // Create, Doom, Write, Read, Close.
   SetSimpleCacheMode();
   InitCache();
-  disk_cache::Entry* null = NULL;
+  disk_cache::Entry* null = nullptr;
   const char key[] = "the first key";
 
   net::TestCompletionCallback cb;
@@ -3392,7 +3392,7 @@
   scoped_refptr<net::IOBuffer> buffer1 =
       base::MakeRefCounted<net::IOBuffer>(kSize1);
   CacheTestFillBuffer(buffer1->data(), kSize1, false);
-  disk_cache::Entry* entry = NULL;
+  disk_cache::Entry* entry = nullptr;
 
   ASSERT_EQ(net::OK, cache_->CreateEntry(key, net::HIGHEST, &entry,
                                          net::CompletionOnceCallback()));
@@ -3419,7 +3419,7 @@
   // Create, Write, Doom, Doom, Read, Doom, Close.
   SetSimpleCacheMode();
   InitCache();
-  disk_cache::Entry* null = NULL;
+  disk_cache::Entry* null = nullptr;
   const char key[] = "the first key";
 
   net::TestCompletionCallback cb;
@@ -3429,7 +3429,7 @@
   scoped_refptr<net::IOBuffer> buffer1_read =
       base::MakeRefCounted<net::IOBuffer>(kSize1);
   CacheTestFillBuffer(buffer1->data(), kSize1, false);
-  disk_cache::Entry* entry = NULL;
+  disk_cache::Entry* entry = nullptr;
 
   ASSERT_EQ(net::OK, cache_->CreateEntry(key, net::HIGHEST, &entry,
                                          net::CompletionOnceCallback()));
@@ -3460,7 +3460,7 @@
   InitCache();
 
   const char key[] = "the first key";
-  disk_cache::Entry* entry = NULL;
+  disk_cache::Entry* entry = nullptr;
 
   // First, an optimistic create.
   ASSERT_EQ(net::OK, cache_->CreateEntry(key, net::HIGHEST, &entry,
@@ -3493,7 +3493,7 @@
   // Create, Doom, Write, Close, Check files are not on disk anymore.
   SetSimpleCacheMode();
   InitCache();
-  disk_cache::Entry* null = NULL;
+  disk_cache::Entry* null = nullptr;
   const char key[] = "the first key";
 
   net::TestCompletionCallback cb;
@@ -3501,7 +3501,7 @@
   scoped_refptr<net::IOBuffer> buffer1 =
       base::MakeRefCounted<net::IOBuffer>(kSize1);
   CacheTestFillBuffer(buffer1->data(), kSize1, false);
-  disk_cache::Entry* entry = NULL;
+  disk_cache::Entry* entry = nullptr;
 
   ASSERT_EQ(net::OK, cache_->CreateEntry(key, net::HIGHEST, &entry,
                                          net::CompletionOnceCallback()));
@@ -3536,12 +3536,12 @@
   SetCacheType(net::APP_CACHE);
   SetSimpleCacheMode();
   InitCache();
-  disk_cache::Entry* null = NULL;
+  disk_cache::Entry* null = nullptr;
   const char key[] = "the first key";
 
   net::TestCompletionCallback create_callback;
 
-  disk_cache::Entry* entry1 = NULL;
+  disk_cache::Entry* entry1 = nullptr;
   ASSERT_EQ(net::OK,
             create_callback.GetResult(cache_->CreateEntry(
                 key, net::HIGHEST, &entry1, create_callback.callback())));
@@ -3552,7 +3552,7 @@
   EXPECT_EQ(net::ERR_IO_PENDING,
             cache_->DoomEntry(key, net::HIGHEST, doom_callback.callback()));
 
-  disk_cache::Entry* entry2 = NULL;
+  disk_cache::Entry* entry2 = nullptr;
   ASSERT_EQ(net::OK,
             create_callback.GetResult(cache_->CreateEntry(
                 key, net::HIGHEST, &entry2, create_callback.callback())));
@@ -3667,18 +3667,18 @@
   // Create, Doom, Create, Doom (1st entry), Open.
   SetSimpleCacheMode();
   InitCache();
-  disk_cache::Entry* null = NULL;
+  disk_cache::Entry* null = nullptr;
 
   const char key[] = "the first key";
 
-  disk_cache::Entry* entry1 = NULL;
+  disk_cache::Entry* entry1 = nullptr;
   ASSERT_THAT(CreateEntry(key, &entry1), IsOk());
   ScopedEntryPtr entry1_closer(entry1);
   EXPECT_NE(null, entry1);
 
   EXPECT_THAT(DoomEntry(key), IsOk());
 
-  disk_cache::Entry* entry2 = NULL;
+  disk_cache::Entry* entry2 = nullptr;
   ASSERT_THAT(CreateEntry(key, &entry2), IsOk());
   ScopedEntryPtr entry2_closer(entry2);
   EXPECT_NE(null, entry2);
@@ -3690,7 +3690,7 @@
   EXPECT_EQ(net::OK,
             cb.GetResult(simple_entry1->DoomEntry(cb.callback())));
 
-  disk_cache::Entry* entry3 = NULL;
+  disk_cache::Entry* entry3 = nullptr;
   ASSERT_THAT(OpenEntry(key, &entry3), IsOk());
   ScopedEntryPtr entry3_closer(entry3);
   EXPECT_NE(null, entry3);
@@ -3702,18 +3702,18 @@
   SetSimpleCacheMode();
   InitCache();
 
-  disk_cache::Entry* null = NULL;
+  disk_cache::Entry* null = nullptr;
 
   const char key[] = "the first key";
 
-  disk_cache::Entry* entry1 = NULL;
+  disk_cache::Entry* entry1 = nullptr;
   ASSERT_THAT(CreateEntry(key, &entry1), IsOk());
   ScopedEntryPtr entry1_closer(entry1);
   EXPECT_NE(null, entry1);
 
   entry1->Doom();
 
-  disk_cache::Entry* entry2 = NULL;
+  disk_cache::Entry* entry2 = nullptr;
   ASSERT_THAT(CreateEntry(key, &entry2), IsOk());
   ScopedEntryPtr entry2_closer(entry2);
   EXPECT_NE(null, entry2);
@@ -3728,28 +3728,28 @@
   SetSimpleCacheMode();
   InitCache();
 
-  disk_cache::Entry* null = NULL;
+  disk_cache::Entry* null = nullptr;
 
   const char key[] = "this is a key";
 
-  disk_cache::Entry* entry1 = NULL;
+  disk_cache::Entry* entry1 = nullptr;
   ASSERT_THAT(CreateEntry(key, &entry1), IsOk());
   ScopedEntryPtr entry1_closer(entry1);
   EXPECT_NE(null, entry1);
 
   entry1->Doom();
   entry1_closer.reset();
-  entry1 = NULL;
+  entry1 = nullptr;
 
-  disk_cache::Entry* entry2 = NULL;
+  disk_cache::Entry* entry2 = nullptr;
   ASSERT_THAT(CreateEntry(key, &entry2), IsOk());
   ScopedEntryPtr entry2_closer(entry2);
   EXPECT_NE(null, entry2);
 
   entry2_closer.reset();
-  entry2 = NULL;
+  entry2 = nullptr;
 
-  disk_cache::Entry* entry3 = NULL;
+  disk_cache::Entry* entry3 = nullptr;
   ASSERT_THAT(OpenEntry(key, &entry3), IsOk());
   ScopedEntryPtr entry3_closer(entry3);
   EXPECT_NE(null, entry3);
@@ -3764,8 +3764,8 @@
   // initially succeed, but realize later that creation failed.
   const std::string key = "the key";
   net::TestCompletionCallback cb;
-  disk_cache::Entry* entry = NULL;
-  disk_cache::Entry* entry2 = NULL;
+  disk_cache::Entry* entry = nullptr;
+  disk_cache::Entry* entry2 = nullptr;
 
   EXPECT_TRUE(disk_cache::simple_util::CreateCorruptFileForTests(
       key, cache_path_));
@@ -3852,13 +3852,13 @@
       base::MakeRefCounted<net::IOBuffer>(kBufferSize);
   CacheTestFillBuffer(write_buffer->data(), kBufferSize, false);
 
-  disk_cache::Entry* entry = NULL;
+  disk_cache::Entry* entry = nullptr;
   ASSERT_THAT(CreateEntry(key, &entry), IsOk());
 
   EXPECT_EQ(kBufferSize,
             WriteData(entry, 1, 0, write_buffer.get(), kBufferSize, false));
   entry->Close();
-  entry = NULL;
+  entry = nullptr;
 
   ASSERT_THAT(OpenEntry(key, &entry), IsOk());
   ScopedEntryPtr entry_closer(entry);
@@ -3912,7 +3912,7 @@
   InitCache();
 
   const char key[] = "the first key";
-  disk_cache::Entry* entry = NULL;
+  disk_cache::Entry* entry = nullptr;
   ASSERT_EQ(net::OK, cache_->CreateEntry(key, net::HIGHEST, &entry,
                                          net::CompletionOnceCallback()));
   ScopedEntryPtr entry_closer(entry);
@@ -3999,13 +3999,13 @@
       base::MakeRefCounted<net::IOBuffer>(size);
 
   // Advance the first reader a little.
-  disk_cache::Entry* entry = NULL;
+  disk_cache::Entry* entry = nullptr;
   ASSERT_THAT(OpenEntry(key, &entry), IsOk());
   ScopedEntryPtr entry_closer(entry);
   EXPECT_EQ(1, ReadData(entry, 1, 0, read_buffer1.get(), 1));
 
   // Advance the 2nd reader by the same amount.
-  disk_cache::Entry* entry2 = NULL;
+  disk_cache::Entry* entry2 = nullptr;
   EXPECT_THAT(OpenEntry(key, &entry2), IsOk());
   ScopedEntryPtr entry2_closer(entry2);
   EXPECT_EQ(1, ReadData(entry2, 1, 0, read_buffer2.get(), 1));
@@ -4026,7 +4026,7 @@
   // Close.
   SetSimpleCacheMode();
   InitCache();
-  disk_cache::Entry* null = NULL;
+  disk_cache::Entry* null = nullptr;
   const char key[] = "the first key";
 
   const int kHalfSize = 200;
@@ -4034,7 +4034,7 @@
   scoped_refptr<net::IOBuffer> buffer1 =
       base::MakeRefCounted<net::IOBuffer>(kSize);
   CacheTestFillBuffer(buffer1->data(), kSize, false);
-  disk_cache::Entry* entry = NULL;
+  disk_cache::Entry* entry = nullptr;
 
   ASSERT_THAT(CreateEntry(key, &entry), IsOk());
   EXPECT_NE(null, entry);
@@ -4042,7 +4042,7 @@
   EXPECT_EQ(kSize, WriteData(entry, 1, 0, buffer1.get(), kSize, false));
   entry->Close();
 
-  disk_cache::Entry* entry2 = NULL;
+  disk_cache::Entry* entry2 = nullptr;
   ASSERT_THAT(OpenEntry(key, &entry2), IsOk());
   EXPECT_EQ(entry, entry2);
 
@@ -4068,7 +4068,7 @@
   EXPECT_TRUE(
       static_cast<disk_cache::SimpleEntryImpl*>(entry)->HasOneRef());
   entry->Close();
-  entry = NULL;
+  entry = nullptr;
 }
 
 // Test if we can write the data not in sequence and read correctly. In
@@ -4079,7 +4079,7 @@
   // Close.
   SetSimpleCacheMode();
   InitCache();
-  disk_cache::Entry* null = NULL;
+  disk_cache::Entry* null = nullptr;
   const char key[] = "the first key";
 
   const int kHalfSize = 200;
@@ -4092,7 +4092,7 @@
   char* buffer1_data = buffer1->data() + kHalfSize;
   memcpy(buffer2->data(), buffer1_data, kHalfSize);
 
-  disk_cache::Entry* entry = NULL;
+  disk_cache::Entry* entry = nullptr;
   ASSERT_THAT(CreateEntry(key, &entry), IsOk());
   entry->Close();
   for (int i = 0; i < disk_cache::kSimpleEntryStreamCount; ++i) {
@@ -4128,7 +4128,7 @@
 TEST_F(DiskCacheEntryTest, SimpleCacheStream1SizeChanges) {
   SetSimpleCacheMode();
   InitCache();
-  disk_cache::Entry* entry = NULL;
+  disk_cache::Entry* entry = nullptr;
   const std::string key("the key");
   const int kSize = 100;
   scoped_refptr<net::IOBuffer> buffer =
@@ -4194,7 +4194,7 @@
   EXPECT_EQ(kSize, ReadData(entry, 0, 0, buffer_read.get(), kSize));
   EXPECT_EQ(0, memcmp(buffer->data(), buffer_read->data(), kSize));
   entry->Close();
-  entry = NULL;
+  entry = nullptr;
 }
 
 // Test that writing within the range for which the crc has already been
@@ -4205,7 +4205,7 @@
   // Open, Read (all), Close.
   SetSimpleCacheMode();
   InitCache();
-  disk_cache::Entry* null = NULL;
+  disk_cache::Entry* null = nullptr;
   const char key[] = "the first key";
 
   const int kHalfSize = 200;
@@ -4217,7 +4217,7 @@
   CacheTestFillBuffer(buffer1->data(), kSize, false);
   CacheTestFillBuffer(buffer2->data(), kHalfSize, false);
 
-  disk_cache::Entry* entry = NULL;
+  disk_cache::Entry* entry = nullptr;
   ASSERT_THAT(CreateEntry(key, &entry), IsOk());
   EXPECT_NE(null, entry);
   entry->Close();
@@ -4296,7 +4296,7 @@
 }
 
 void DiskCacheEntryTest::UseAfterBackendDestruction() {
-  disk_cache::Entry* entry = NULL;
+  disk_cache::Entry* entry = nullptr;
   ASSERT_THAT(CreateEntry("the first key", &entry), IsOk());
   cache_.reset();
 
@@ -4466,7 +4466,7 @@
   // Open, Close.
   SetSimpleCacheMode();
   InitCache();
-  disk_cache::Entry* null = NULL;
+  disk_cache::Entry* null = nullptr;
   const char key[] = "the first key";
 
   const int kSize = 200;
@@ -4480,12 +4480,12 @@
   // The race only happens on stream 1 and stream 2.
   for (int i = 0; i < disk_cache::kSimpleEntryStreamCount; ++i) {
     ASSERT_THAT(DoomAllEntries(), IsOk());
-    disk_cache::Entry* entry = NULL;
+    disk_cache::Entry* entry = nullptr;
 
     ASSERT_THAT(CreateEntry(key, &entry), IsOk());
     EXPECT_NE(null, entry);
     entry->Close();
-    entry = NULL;
+    entry = nullptr;
 
     ASSERT_THAT(DoomAllEntries(), IsOk());
     ASSERT_THAT(CreateEntry(key, &entry), IsOk());
@@ -4507,7 +4507,7 @@
     EXPECT_NE(null, entry);
 
     entry->Close();
-    entry = NULL;
+    entry = nullptr;
   }
 }
 
@@ -4517,17 +4517,17 @@
   SetSimpleCacheMode();
   InitCache();
 
-  disk_cache::Entry* null = NULL;
+  disk_cache::Entry* null = nullptr;
 
   const char key[] = "this is a key";
 
-  disk_cache::Entry* entry1 = NULL;
+  disk_cache::Entry* entry1 = nullptr;
   ASSERT_THAT(CreateEntry(key, &entry1), IsOk());
   ScopedEntryPtr entry1_closer(entry1);
   EXPECT_NE(null, entry1);
   entry1->Doom();
 
-  disk_cache::Entry* entry2 = NULL;
+  disk_cache::Entry* entry2 = nullptr;
   ASSERT_THAT(CreateEntry(key, &entry2), IsOk());
   ScopedEntryPtr entry2_closer(entry2);
   EXPECT_NE(null, entry2);
@@ -4535,7 +4535,7 @@
 
   // Closing then reopening entry2 insures that entry2 is serialized, and so
   // it can be opened from files without error.
-  entry2 = NULL;
+  entry2 = nullptr;
   ASSERT_THAT(OpenEntry(key, &entry2), IsOk());
   EXPECT_NE(null, entry2);
   entry2_closer.reset(entry2);
@@ -4547,7 +4547,7 @@
   // the backend's |active_entries_| while |entry2| is still alive and its
   // files are still on disk.
   entry1_closer.reset();
-  entry1 = NULL;
+  entry1 = nullptr;
 
   // Close does not have a callback. However, we need to be sure the close is
   // finished before we continue the test. We can take advantage of how the ref
@@ -4561,11 +4561,11 @@
     base::PlatformThread::YieldCurrentThread();
     base::RunLoop().RunUntilIdle();
   }
-  entry1_refptr = NULL;
+  entry1_refptr = nullptr;
 
   // In the bug case, this new entry ends up being a duplicate object pointing
   // at the same underlying files.
-  disk_cache::Entry* entry3 = NULL;
+  disk_cache::Entry* entry3 = nullptr;
   EXPECT_THAT(OpenEntry(key, &entry3), IsOk());
   ScopedEntryPtr entry3_closer(entry3);
   EXPECT_NE(null, entry3);
@@ -4621,7 +4621,7 @@
   InitCache();
 
   const char key[] = "key";
-  disk_cache::Entry* null = NULL;
+  disk_cache::Entry* null = nullptr;
   disk_cache::Entry* entry;
   ASSERT_THAT(CreateEntry(key, &entry), IsOk());
   EXPECT_NE(null, entry);
@@ -5245,7 +5245,7 @@
   }
 
   void TryRead(const std::string& key) {
-    disk_cache::Entry* entry = NULL;
+    disk_cache::Entry* entry = nullptr;
     ASSERT_THAT(OpenEntry(key, &entry), IsOk());
     scoped_refptr<net::IOBuffer> read_buf =
         base::MakeRefCounted<net::IOBuffer>(kEntrySize);
@@ -5297,7 +5297,7 @@
   const char kKey[] = "a key";
   InitCacheAndCreateEntry(kKey);
 
-  disk_cache::Entry* entry = NULL;
+  disk_cache::Entry* entry = nullptr;
   ASSERT_THAT(OpenEntry(kKey, &entry), IsOk());
   entry->Close();
 
@@ -5322,7 +5322,7 @@
   const char key[] = "the first key";
   ASSERT_TRUE(SimpleCacheMakeBadChecksumEntry(key, 10));
 
-  disk_cache::Entry* entry = NULL;
+  disk_cache::Entry* entry = nullptr;
 
   // Open the entry. Since we made a small entry, we will detect the CRC
   // problem at open.
@@ -5401,7 +5401,7 @@
   const char kKey[] = "a key";
   InitCacheAndCreateEntry(kKey);
 
-  disk_cache::Entry* entry = NULL;
+  disk_cache::Entry* entry = nullptr;
   ASSERT_THAT(OpenEntry(kKey, &entry), IsOk());
   scoped_refptr<net::IOBuffer> read_buf =
       base::MakeRefCounted<net::IOBuffer>(kEntrySize);
diff --git a/net/disk_cache/simple/simple_backend_impl.cc b/net/disk_cache/simple/simple_backend_impl.cc
index 34cc653..d57fb5c 100644
--- a/net/disk_cache/simple/simple_backend_impl.cc
+++ b/net/disk_cache/simple/simple_backend_impl.cc
@@ -629,7 +629,7 @@
       uint64_t entry_hash = hashes_to_enumerate_->back();
       hashes_to_enumerate_->pop_back();
       if (backend_->index()->Has(entry_hash)) {
-        *next_entry = NULL;
+        *next_entry = nullptr;
         CompletionOnceCallback continue_iteration = base::BindOnce(
             &SimpleIterator::CheckIterationReturnValue,
             weak_factory_.GetWeakPtr(), next_entry, copyable_callback);
diff --git a/net/disk_cache/simple/simple_entry_impl.cc b/net/disk_cache/simple/simple_entry_impl.cc
index 34cd1a925..2d74e4a 100644
--- a/net/disk_cache/simple/simple_entry_impl.cc
+++ b/net/disk_cache/simple/simple_entry_impl.cc
@@ -951,7 +951,7 @@
         results.get());
     OnceClosure reply = base::BindOnce(&SimpleEntryImpl::CloseOperationComplete,
                                        this, base::Passed(&results));
-    synchronous_entry_ = NULL;
+    synchronous_entry_ = nullptr;
     prioritized_task_runner_->PostTaskAndReply(
         FROM_HERE, std::move(task), std::move(reply), entry_priority_);
 
diff --git a/net/disk_cache/simple/simple_entry_operation.cc b/net/disk_cache/simple/simple_entry_operation.cc
index d3461e49..6e64021 100644
--- a/net/disk_cache/simple/simple_entry_operation.cc
+++ b/net/disk_cache/simple/simple_entry_operation.cc
@@ -24,9 +24,9 @@
     OpenEntryIndexEnum index_state,
     net::CompletionOnceCallback callback,
     Entry** out_entry) {
-  return SimpleEntryOperation(entry, NULL, std::move(callback), out_entry,
-                              nullptr, 0, 0, 0, NULL, TYPE_OPEN, index_state, 0,
-                              false, false);
+  return SimpleEntryOperation(entry, nullptr, std::move(callback), out_entry,
+                              nullptr, 0, 0, 0, nullptr, TYPE_OPEN, index_state,
+                              0, false, false);
 }
 
 // static
@@ -35,9 +35,9 @@
     OpenEntryIndexEnum index_state,
     net::CompletionOnceCallback callback,
     Entry** out_entry) {
-  return SimpleEntryOperation(entry, NULL, std::move(callback), out_entry,
-                              nullptr, 0, 0, 0, NULL, TYPE_CREATE, index_state,
-                              0, false, false);
+  return SimpleEntryOperation(entry, nullptr, std::move(callback), out_entry,
+                              nullptr, 0, 0, 0, nullptr, TYPE_CREATE,
+                              index_state, 0, false, false);
 }
 
 // static
@@ -46,17 +46,17 @@
     OpenEntryIndexEnum index_state,
     net::CompletionOnceCallback callback,
     EntryWithOpened* entry_struct) {
-  return SimpleEntryOperation(entry, NULL, std::move(callback), nullptr,
-                              entry_struct, 0, 0, 0, NULL, TYPE_OPEN_OR_CREATE,
-                              index_state, 0, false, false);
+  return SimpleEntryOperation(
+      entry, nullptr, std::move(callback), nullptr, entry_struct, 0, 0, 0,
+      nullptr, TYPE_OPEN_OR_CREATE, index_state, 0, false, false);
 }
 
 // static
 SimpleEntryOperation SimpleEntryOperation::CloseOperation(
     SimpleEntryImpl* entry) {
-  return SimpleEntryOperation(entry, NULL, CompletionOnceCallback(), nullptr,
-                              nullptr, 0, 0, 0, NULL, TYPE_CLOSE, INDEX_NOEXIST,
-                              0, false, false);
+  return SimpleEntryOperation(entry, nullptr, CompletionOnceCallback(), nullptr,
+                              nullptr, 0, 0, 0, nullptr, TYPE_CLOSE,
+                              INDEX_NOEXIST, 0, false, false);
 }
 
 // static
@@ -68,8 +68,8 @@
     net::IOBuffer* buf,
     CompletionOnceCallback callback) {
   return SimpleEntryOperation(entry, buf, std::move(callback), nullptr, nullptr,
-                              offset, 0, length, NULL, TYPE_READ, INDEX_NOEXIST,
-                              index, false, false);
+                              offset, 0, length, nullptr, TYPE_READ,
+                              INDEX_NOEXIST, index, false, false);
 }
 
 // static
@@ -83,7 +83,7 @@
     bool optimistic,
     CompletionOnceCallback callback) {
   return SimpleEntryOperation(entry, buf, std::move(callback), nullptr, nullptr,
-                              offset, 0, length, NULL, TYPE_WRITE,
+                              offset, 0, length, nullptr, TYPE_WRITE,
                               INDEX_NOEXIST, index, truncate, optimistic);
 }
 
@@ -95,8 +95,8 @@
     net::IOBuffer* buf,
     CompletionOnceCallback callback) {
   return SimpleEntryOperation(entry, buf, std::move(callback), nullptr, nullptr,
-                              0, sparse_offset, length, NULL, TYPE_READ_SPARSE,
-                              INDEX_NOEXIST, 0, false, false);
+                              0, sparse_offset, length, nullptr,
+                              TYPE_READ_SPARSE, INDEX_NOEXIST, 0, false, false);
 }
 
 // static
@@ -106,9 +106,9 @@
     int length,
     net::IOBuffer* buf,
     CompletionOnceCallback callback) {
-  return SimpleEntryOperation(entry, buf, std::move(callback), nullptr, nullptr,
-                              0, sparse_offset, length, NULL, TYPE_WRITE_SPARSE,
-                              INDEX_NOEXIST, 0, false, false);
+  return SimpleEntryOperation(
+      entry, buf, std::move(callback), nullptr, nullptr, 0, sparse_offset,
+      length, nullptr, TYPE_WRITE_SPARSE, INDEX_NOEXIST, 0, false, false);
 }
 
 // static
@@ -118,7 +118,7 @@
     int length,
     int64_t* out_start,
     CompletionOnceCallback callback) {
-  return SimpleEntryOperation(entry, NULL, std::move(callback), nullptr,
+  return SimpleEntryOperation(entry, nullptr, std::move(callback), nullptr,
                               nullptr, 0, sparse_offset, length, out_start,
                               TYPE_GET_AVAILABLE_RANGE, INDEX_NOEXIST, 0, false,
                               false);
@@ -128,13 +128,13 @@
 SimpleEntryOperation SimpleEntryOperation::DoomOperation(
     SimpleEntryImpl* entry,
     net::CompletionOnceCallback callback) {
-  net::IOBuffer* const buf = NULL;
-  Entry** const out_entry = NULL;
+  net::IOBuffer* const buf = nullptr;
+  Entry** const out_entry = nullptr;
   EntryWithOpened* out_entry_struct = nullptr;
   const int offset = 0;
   const int64_t sparse_offset = 0;
   const int length = 0;
-  int64_t* const out_start = NULL;
+  int64_t* const out_start = nullptr;
   const OpenEntryIndexEnum index_state = INDEX_NOEXIST;
   const int index = 0;
   const bool truncate = false;
diff --git a/net/disk_cache/simple/simple_index_file.cc b/net/disk_cache/simple/simple_index_file.cc
index f377c41..d6bfe32 100644
--- a/net/disk_cache/simple/simple_index_file.cc
+++ b/net/disk_cache/simple/simple_index_file.cc
@@ -329,7 +329,7 @@
   }
 
   // Atomically rename the temporary index file to become the real one.
-  if (!base::ReplaceFile(temp_index_filename, index_filename, NULL))
+  if (!base::ReplaceFile(temp_index_filename, index_filename, nullptr))
     return;
 
   if (app_on_background) {
diff --git a/net/disk_cache/simple/simple_index_file_unittest.cc b/net/disk_cache/simple/simple_index_file_unittest.cc
index fb1d903..001a9af 100644
--- a/net/disk_cache/simple/simple_index_file_unittest.cc
+++ b/net/disk_cache/simple/simple_index_file_unittest.cc
@@ -213,7 +213,7 @@
 
   std::unique_ptr<base::Pickle> pickle = WrappedSimpleIndexFile::Serialize(
       net::DISK_CACHE, index_metadata, entries);
-  EXPECT_TRUE(pickle.get() != NULL);
+  EXPECT_TRUE(pickle.get() != nullptr);
   base::Time now = base::Time::Now();
   WrappedSimpleIndexFile::SerializeFinalData(now, pickle.get());
   base::Time when_index_last_saw_cache;
@@ -253,7 +253,7 @@
 
   std::unique_ptr<base::Pickle> pickle = WrappedSimpleIndexFile::Serialize(
       net::APP_CACHE, index_metadata, entries);
-  EXPECT_TRUE(pickle.get() != NULL);
+  EXPECT_TRUE(pickle.get() != nullptr);
   base::Time now = base::Time::Now();
   WrappedSimpleIndexFile::SerializeFinalData(now, pickle.get());
   base::Time when_index_last_saw_cache;
@@ -295,7 +295,7 @@
   }
   std::unique_ptr<base::Pickle> pickle =
       WrappedSimpleIndexFile::Serialize(net::DISK_CACHE, v7_metadata, entries);
-  ASSERT_TRUE(pickle.get() != NULL);
+  ASSERT_TRUE(pickle.get() != nullptr);
   base::Time now = base::Time::Now();
   WrappedSimpleIndexFile::SerializeFinalData(now, pickle.get());
 
@@ -338,7 +338,7 @@
   }
   std::unique_ptr<base::Pickle> pickle =
       WrappedSimpleIndexFile::Serialize(net::DISK_CACHE, v8_metadata, entries);
-  ASSERT_TRUE(pickle.get() != NULL);
+  ASSERT_TRUE(pickle.get() != nullptr);
   base::Time now = base::Time::Now();
   WrappedSimpleIndexFile::SerializeFinalData(now, pickle.get());
 
@@ -381,7 +381,7 @@
   }
   std::unique_ptr<base::Pickle> pickle =
       WrappedSimpleIndexFile::Serialize(net::DISK_CACHE, v8_metadata, entries);
-  ASSERT_TRUE(pickle.get() != NULL);
+  ASSERT_TRUE(pickle.get() != nullptr);
   base::Time now = base::Time::Now();
   WrappedSimpleIndexFile::SerializeFinalData(now, pickle.get());
 
diff --git a/net/disk_cache/simple/simple_synchronous_entry.cc b/net/disk_cache/simple/simple_synchronous_entry.cc
index a45ceca..fcaaa9e 100644
--- a/net/disk_cache/simple/simple_synchronous_entry.cc
+++ b/net/disk_cache/simple/simple_synchronous_entry.cc
@@ -299,7 +299,7 @@
 
 SimpleEntryCreationResults::SimpleEntryCreationResults(
     SimpleEntryStat entry_stat)
-    : sync_entry(NULL),
+    : sync_entry(nullptr),
       entry_stat(entry_stat),
       result(net::OK),
       created(false) {}
@@ -366,7 +366,7 @@
   if (out_results->result != net::OK) {
     sync_entry->Doom();
     delete sync_entry;
-    out_results->sync_entry = NULL;
+    out_results->sync_entry = nullptr;
     out_results->stream_prefetch_data[0].data = nullptr;
     out_results->stream_prefetch_data[1].data = nullptr;
     return;
@@ -401,7 +401,7 @@
     if (out_results->result != net::ERR_FILE_EXISTS)
       sync_entry->Doom();
     delete sync_entry;
-    out_results->sync_entry = NULL;
+    out_results->sync_entry = nullptr;
     return;
   }
   out_results->sync_entry = sync_entry;
diff --git a/net/disk_cache/simple/simple_version_upgrade.cc b/net/disk_cache/simple/simple_version_upgrade.cc
index 86ac278..49a4aa8 100644
--- a/net/disk_cache/simple/simple_version_upgrade.cc
+++ b/net/disk_cache/simple/simple_version_upgrade.cc
@@ -228,7 +228,7 @@
     LogMessageFailedUpgradeFromVersion(file_header.version);
     return SimpleCacheConsistencyResult::kWriteFakeIndexFileFailed;
   }
-  if (!base::ReplaceFile(temp_fake_index, fake_index, NULL)) {
+  if (!base::ReplaceFile(temp_fake_index, fake_index, nullptr)) {
     LOG(ERROR) << "Failed to replace the fake index.";
     LogMessageFailedUpgradeFromVersion(file_header.version);
     return SimpleCacheConsistencyResult::kReplaceFileFailed;
diff --git a/net/dns/address_sorter_win.cc b/net/dns/address_sorter_win.cc
index a64f361..18f0abf 100644
--- a/net/dns/address_sorter_win.cc
+++ b/net/dns/address_sorter_win.cc
@@ -96,7 +96,7 @@
       DWORD result_size = 0;
       int result = WSAIoctl(sock, SIO_ADDRESS_LIST_SORT, input_buffer_.get(),
                             buffer_size_, output_buffer_.get(), buffer_size_,
-                            &result_size, NULL, NULL);
+                            &result_size, nullptr, nullptr);
       if (result == SOCKET_ERROR) {
         LOG(ERROR) << "SIO_ADDRESS_LIST_SORT failed " << WSAGetLastError();
       } else {
diff --git a/net/dns/dns_client.cc b/net/dns/dns_client.cc
index c230b32..7de02c7 100644
--- a/net/dns/dns_client.cc
+++ b/net/dns/dns_client.cc
@@ -45,11 +45,11 @@
   }
 
   const DnsConfig* GetConfig() const override {
-    return session_.get() ? &session_->config() : NULL;
+    return session_.get() ? &session_->config() : nullptr;
   }
 
   DnsTransactionFactory* GetTransactionFactory() override {
-    return session_.get() ? factory_.get() : NULL;
+    return session_.get() ? factory_.get() : nullptr;
   }
 
   AddressSorter* GetAddressSorter() override { return address_sorter_.get(); }
diff --git a/net/dns/dns_config_service_win.cc b/net/dns/dns_config_service_win.cc
index e4a6885b..12bbb2ee 100644
--- a/net/dns/dns_config_service_win.cc
+++ b/net/dns/dns_config_service_win.cc
@@ -132,7 +132,7 @@
        tries++) {
     out.reset(static_cast<PIP_ADAPTER_ADDRESSES>(malloc(len)));
     memset(out.get(), 0, len);
-    rv = GetAdaptersAddresses(AF_UNSPEC, flags, NULL, out.get(), &len);
+    rv = GetAdaptersAddresses(AF_UNSPEC, flags, nullptr, out.get(), &len);
   }
   if (rv != NO_ERROR)
     out.reset();
@@ -242,7 +242,7 @@
   // The order of adapters is the network binding order, so stick to the
   // first good adapter for each family.
   for (const IP_ADAPTER_ADDRESSES* adapter = addresses.get();
-       adapter != NULL && (!have_ipv4 || !have_ipv6);
+       adapter != nullptr && (!have_ipv4 || !have_ipv6);
        adapter = adapter->Next) {
     if (adapter->OperStatus != IfOperStatusUp)
       continue;
@@ -251,8 +251,7 @@
 
     for (const IP_ADAPTER_UNICAST_ADDRESS* address =
              adapter->FirstUnicastAddress;
-         address != NULL;
-         address = address->Next) {
+         address != nullptr; address = address->Next) {
       IPEndPoint ipe;
       if (!ipe.FromSockAddr(address->Address.lpSockaddr,
                             address->Address.iSockaddrLength)) {
@@ -506,7 +505,7 @@
   // The order of adapters is the network binding order, so stick to the
   // first good adapter.
   for (const IP_ADAPTER_ADDRESSES* adapter = settings.addresses.get();
-       adapter != NULL && config->nameservers.empty();
+       adapter != nullptr && config->nameservers.empty();
        adapter = adapter->Next) {
     if (adapter->OperStatus != IfOperStatusUp)
       continue;
@@ -515,8 +514,7 @@
 
     for (const IP_ADAPTER_DNS_SERVER_ADDRESS* address =
              adapter->FirstDnsServerAddress;
-         address != NULL;
-         address = address->Next) {
+         address != nullptr; address = address->Next) {
       IPEndPoint ipe;
       if (ipe.FromSockAddr(address->Address.lpSockaddr,
                            address->Address.iSockaddrLength)) {
diff --git a/net/dns/dns_config_service_win_unittest.cc b/net/dns/dns_config_service_win_unittest.cc
index d30d047..93e62afd 100644
--- a/net/dns/dns_config_service_win_unittest.cc
+++ b/net/dns/dns_config_service_win_unittest.cc
@@ -20,16 +20,16 @@
     const base::char16* input;
     const char* output[4];  // NULL-terminated, empty if expected false
   } cases[] = {
-      {STRING16_LITERAL("chromium.org"), {"chromium.org", NULL}},
-      {STRING16_LITERAL("chromium.org,org"), {"chromium.org", "org", NULL}},
+      {STRING16_LITERAL("chromium.org"), {"chromium.org", nullptr}},
+      {STRING16_LITERAL("chromium.org,org"), {"chromium.org", "org", nullptr}},
       // Empty suffixes terminate the list
-      {STRING16_LITERAL("crbug.com,com,,org"), {"crbug.com", "com", NULL}},
+      {STRING16_LITERAL("crbug.com,com,,org"), {"crbug.com", "com", nullptr}},
       // IDN are converted to punycode
       {STRING16_LITERAL("\u017c\xf3\u0142ta.pi\u0119\u015b\u0107.pl,pl"),
-       {"xn--ta-4ja03asj.xn--pi-wla5e0q.pl", "pl", NULL}},
+       {"xn--ta-4ja03asj.xn--pi-wla5e0q.pl", "pl", nullptr}},
       // Empty search list is invalid
-      {STRING16_LITERAL(""), {NULL}},
-      {STRING16_LITERAL(",,"), {NULL}},
+      {STRING16_LITERAL(""), {nullptr}},
+      {STRING16_LITERAL(",,"), {nullptr}},
   };
 
   for (const auto& t : cases) {
@@ -89,7 +89,7 @@
     adapter->IfType = info.if_type;
     adapter->OperStatus = info.oper_status;
     adapter->DnsSuffix = const_cast<PWCHAR>(info.dns_suffix);
-    IP_ADAPTER_DNS_SERVER_ADDRESS* address = NULL;
+    IP_ADAPTER_DNS_SERVER_ADDRESS* address = nullptr;
     for (size_t j = 0; !info.dns_server_addresses[j].empty(); ++j) {
       --num_addresses;
       if (j == 0) {
diff --git a/net/dns/dns_response.cc b/net/dns/dns_response.cc
index 7deef945..2e7fab29 100644
--- a/net/dns/dns_response.cc
+++ b/net/dns/dns_response.cc
@@ -113,7 +113,8 @@
          (owned_rdata.empty() ? rdata.size() : owned_rdata.size());
 }
 
-DnsRecordParser::DnsRecordParser() : packet_(nullptr), length_(0), cur_(0) {}
+DnsRecordParser::DnsRecordParser()
+    : packet_(nullptr), length_(0), cur_(nullptr) {}
 
 DnsRecordParser::DnsRecordParser(const void* packet,
                                  size_t length,
diff --git a/net/dns/dns_response.h b/net/dns/dns_response.h
index 1335d2b9..33c6397 100644
--- a/net/dns/dns_response.h
+++ b/net/dns/dns_response.h
@@ -76,7 +76,7 @@
   DnsRecordParser(const void* packet, size_t length, size_t offset);
 
   // Returns |true| if initialized.
-  bool IsValid() const { return packet_ != NULL; }
+  bool IsValid() const { return packet_ != nullptr; }
 
   // Returns |true| if no more bytes remain in the packet.
   bool AtEnd() const { return cur_ == packet_ + length_; }
diff --git a/net/dns/dns_response_unittest.cc b/net/dns/dns_response_unittest.cc
index a71732f..41bf66e 100644
--- a/net/dns/dns_response_unittest.cc
+++ b/net/dns/dns_response_unittest.cc
@@ -68,14 +68,14 @@
   EXPECT_EQ("bar.example.com", out);
 
   // Parse name without storing it.
-  EXPECT_EQ(0x11u, parser.ReadName(data + 0x00, NULL));
-  EXPECT_EQ(0x1u, parser.ReadName(data + 0x10, NULL));
-  EXPECT_EQ(0x6u, parser.ReadName(data + 0x11, NULL));
-  EXPECT_EQ(0x2u, parser.ReadName(data + 0x17, NULL));
+  EXPECT_EQ(0x11u, parser.ReadName(data + 0x00, nullptr));
+  EXPECT_EQ(0x1u, parser.ReadName(data + 0x10, nullptr));
+  EXPECT_EQ(0x6u, parser.ReadName(data + 0x11, nullptr));
+  EXPECT_EQ(0x2u, parser.ReadName(data + 0x17, nullptr));
 
   // Check that it works even if initial position is different.
   parser = DnsRecordParser(data, sizeof(data), 0x12);
-  EXPECT_EQ(0x6u, parser.ReadName(data + 0x11, NULL));
+  EXPECT_EQ(0x6u, parser.ReadName(data + 0x11, nullptr));
 }
 
 TEST(DnsRecordParserTest, ReadNameFail) {
diff --git a/net/dns/dns_session_unittest.cc b/net/dns/dns_session_unittest.cc
index 3889439..8afa5b7 100644
--- a/net/dns/dns_session_unittest.cc
+++ b/net/dns/dns_session_unittest.cc
@@ -143,7 +143,7 @@
 
   session_ =
       new DnsSession(config_, std::unique_ptr<DnsSocketPool>(dns_socket_pool),
-                     base::Bind(&base::RandInt), NULL /* NetLog */);
+                     base::Bind(&base::RandInt), nullptr /* NetLog */);
 
   events_.clear();
 }
diff --git a/net/dns/dns_socket_pool.cc b/net/dns/dns_socket_pool.cc
index 5922d39..1abb206 100644
--- a/net/dns/dns_socket_pool.cc
+++ b/net/dns/dns_socket_pool.cc
@@ -42,8 +42,8 @@
                              const RandIntCallback& rand_int_callback)
     : socket_factory_(socket_factory),
       rand_int_callback_(rand_int_callback),
-      net_log_(NULL),
-      nameservers_(NULL),
+      net_log_(nullptr),
+      nameservers_(nullptr),
       initialized_(false) {}
 
 void DnsSocketPool::InitializeInternal(
@@ -64,7 +64,8 @@
 
   return std::unique_ptr<StreamSocket>(
       socket_factory_->CreateTransportClientSocket(
-          AddressList((*nameservers_)[server_index]), NULL, net_log_, source));
+          AddressList((*nameservers_)[server_index]), nullptr, net_log_,
+          source));
 }
 
 std::unique_ptr<DatagramClientSocket> DnsSocketPool::CreateConnectedSocket(
diff --git a/net/dns/dns_test_util.cc b/net/dns/dns_test_util.cc
index b02fa0876..c428f52 100644
--- a/net/dns/dns_test_util.cc
+++ b/net/dns/dns_test_util.cc
@@ -498,11 +498,11 @@
 }
 
 const DnsConfig* MockDnsClient::GetConfig() const {
-  return config_.IsValid() ? &config_ : NULL;
+  return config_.IsValid() ? &config_ : nullptr;
 }
 
 DnsTransactionFactory* MockDnsClient::GetTransactionFactory() {
-  return config_.IsValid() ? factory_.get() : NULL;
+  return config_.IsValid() ? factory_.get() : nullptr;
 }
 
 AddressSorter* MockDnsClient::GetAddressSorter() {
diff --git a/net/dns/dns_transaction.cc b/net/dns/dns_transaction.cc
index 57f1cbd..8be8918 100644
--- a/net/dns/dns_transaction.cc
+++ b/net/dns/dns_transaction.cc
@@ -205,7 +205,7 @@
 
   const DnsResponse* GetResponse() const override {
     const DnsResponse* resp = response_.get();
-    return (resp != NULL && resp->IsValid()) ? resp : NULL;
+    return (resp != nullptr && resp->IsValid()) ? resp : nullptr;
   }
 
   const NetLogWithSource& GetSocketNetLog() const override {
@@ -419,7 +419,7 @@
   const DnsQuery* GetQuery() const override { return query_.get(); }
   const DnsResponse* GetResponse() const override {
     const DnsResponse* resp = response_.get();
-    return (resp != NULL && resp->IsValid()) ? resp : NULL;
+    return (resp != nullptr && resp->IsValid()) ? resp : nullptr;
   }
   const NetLogWithSource& GetSocketNetLog() const override { return net_log_; }
   bool secure() const override { return true; }
@@ -579,7 +579,7 @@
 
   const DnsResponse* GetResponse() const override {
     const DnsResponse* resp = response_.get();
-    return (resp != NULL && resp->IsValid()) ? resp : NULL;
+    return (resp != nullptr && resp->IsValid()) ? resp : nullptr;
   }
 
   const NetLogWithSource& GetSocketNetLog() const override {
@@ -845,7 +845,7 @@
     DCHECK(attempts_.empty());
     net_log_.BeginEvent(NetLogEventType::DNS_TRANSACTION,
                         base::Bind(&NetLogStartCallback, &hostname_, qtype_));
-    AttemptResult result(PrepareSearch(), NULL);
+    AttemptResult result(PrepareSearch(), nullptr);
     if (result.rv == OK) {
       qnames_initial_size_ = qnames_.size();
       result = ProcessAttemptResult(StartQuery());
@@ -937,8 +937,8 @@
       return;
 
     const DnsResponse* response =
-        result.attempt ? result.attempt->GetResponse() : NULL;
-    CHECK(result.rv != OK || response != NULL);
+        result.attempt ? result.attempt->GetResponse() : nullptr;
+    CHECK(result.rv != OK || response != nullptr);
 
     bool secure = result.attempt ? result.attempt->secure() : false;
 
@@ -1000,7 +1000,7 @@
     ++attempts_count_;
 
     if (!got_socket)
-      return AttemptResult(ERR_CONNECTION_REFUSED, NULL);
+      return AttemptResult(ERR_CONNECTION_REFUSED, nullptr);
 
     net_log_.AddEvent(
         NetLogEventType::DNS_TRANSACTION_ATTEMPT,
@@ -1214,7 +1214,7 @@
           if (result.attempt != attempts_.back().get()) {
             // This attempt already timed out. Ignore it.
             session_->RecordServerFailure(result.attempt->server_index());
-            return AttemptResult(ERR_IO_PENDING, NULL);
+            return AttemptResult(ERR_IO_PENDING, nullptr);
           }
           if (!MoreAttemptsAllowed()) {
             return result;
diff --git a/net/dns/dns_transaction_unittest.cc b/net/dns/dns_transaction_unittest.cc
index db3e7c58..e20b7857 100644
--- a/net/dns/dns_transaction_unittest.cc
+++ b/net/dns/dns_transaction_unittest.cc
@@ -312,8 +312,8 @@
   }
 
   void Cancel() {
-    ASSERT_TRUE(transaction_.get() != NULL);
-    transaction_.reset(NULL);
+    ASSERT_TRUE(transaction_.get() != nullptr);
+    transaction_.reset(nullptr);
   }
 
   void OnTransactionComplete(DnsTransaction* t,
@@ -339,7 +339,7 @@
 
     if (expected_answer_count_ >= 0) {
       ASSERT_THAT(rv, IsOk());
-      ASSERT_TRUE(response != NULL);
+      ASSERT_TRUE(response != nullptr);
       EXPECT_EQ(static_cast<unsigned>(expected_answer_count_),
                 response->answer_count());
       EXPECT_EQ(qtype_, response->qtype());
@@ -593,7 +593,7 @@
         DnsSocketPool::CreateNull(socket_factory_.get(),
                                   base::Bind(base::RandInt)),
         base::Bind(&DnsTransactionTestBase::GetNextId, base::Unretained(this)),
-        NULL /* NetLog */);
+        nullptr /* NetLog */);
     transaction_factory_ = DnsTransactionFactory::CreateFactory(session_.get());
   }
 
@@ -982,7 +982,7 @@
   helper0.StartTransaction(transaction_factory_.get());
 
   // Destroying the client does not affect running requests.
-  transaction_factory_.reset(NULL);
+  transaction_factory_.reset(nullptr);
 
   base::RunLoop().RunUntilIdle();
 
diff --git a/net/dns/host_resolver_manager.cc b/net/dns/host_resolver_manager.cc
index 9a997a2..ed4b72f 100644
--- a/net/dns/host_resolver_manager.cc
+++ b/net/dns/host_resolver_manager.cc
@@ -282,12 +282,12 @@
     // Map the error code to a human-readable string.
     LPWSTR error_string = nullptr;
     FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
-                  0,  // Use the internal message table.
+                  nullptr,  // Use the internal message table.
                   os_error,
                   0,  // Use default language.
                   (LPWSTR)&error_string,
-                  0,   // Buffer size.
-                  0);  // Arguments (unused).
+                  0,         // Buffer size.
+                  nullptr);  // Arguments (unused).
     dict->SetString("os_error_string", base::WideToUTF8(error_string));
     LocalFree(error_string);
 #elif defined(OS_POSIX) || defined(OS_FUCHSIA)
@@ -2116,7 +2116,7 @@
 HostResolverManager::HostResolverManager(const Options& options,
                                          NetLog* net_log)
     : max_queued_jobs_(0),
-      proc_params_(NULL, options.max_retry_attempts),
+      proc_params_(nullptr, options.max_retry_attempts),
       net_log_(net_log),
       received_dns_config_(false),
       num_dns_failures_(0),
diff --git a/net/dns/host_resolver_manager_unittest.cc b/net/dns/host_resolver_manager_unittest.cc
index 626a2e6..80ca8c5 100644
--- a/net/dns/host_resolver_manager_unittest.cc
+++ b/net/dns/host_resolver_manager_unittest.cc
@@ -109,7 +109,7 @@
   typedef std::vector<ResolveKey> CaptureList;
 
   MockHostResolverProc()
-      : HostResolverProc(NULL),
+      : HostResolverProc(nullptr),
         num_requests_waiting_(0),
         num_slots_available_(0),
         requests_waiting_(&lock_),
@@ -498,7 +498,8 @@
                                                  bool ipv6_reachable) {
     HostResolverManager::Options options = DefaultOptions();
     options.max_concurrent_resolves = max_concurrent_resolves;
-    resolver_.reset(new TestHostResolverManager(options, NULL, ipv6_reachable));
+    resolver_.reset(
+        new TestHostResolverManager(options, nullptr, ipv6_reachable));
     resolver_->set_proc_params_for_test(params);
   }
 
@@ -1770,7 +1771,7 @@
   base::TimeDelta kSleepFudgeFactor = base::TimeDelta::FromMilliseconds(1);
 
   scoped_refptr<LookupAttemptHostResolverProc> resolver_proc(
-      new LookupAttemptHostResolverProc(NULL, kAttemptNumberToResolve,
+      new LookupAttemptHostResolverProc(nullptr, kAttemptNumberToResolve,
                                         kTotalAttempts));
 
   ProcTaskParams params = DefaultParams(resolver_proc.get());
@@ -2798,7 +2799,7 @@
 // Specialized fixture for tests of DnsTask.
 class HostResolverManagerDnsTest : public HostResolverManagerTest {
  public:
-  HostResolverManagerDnsTest() : dns_client_(NULL) {}
+  HostResolverManagerDnsTest() : dns_client_(nullptr) {}
 
  protected:
   // testing::Test implementation:
@@ -2815,7 +2816,8 @@
                                          bool ipv6_reachable) override {
     HostResolverManager::Options options = DefaultOptions();
     options.max_concurrent_resolves = max_concurrent_resolves;
-    resolver_.reset(new TestHostResolverManager(options, NULL, ipv6_reachable));
+    resolver_.reset(
+        new TestHostResolverManager(options, nullptr, ipv6_reachable));
     resolver_->set_proc_params_for_test(params);
     UseMockDnsClient(DnsConfig(), CreateDefaultDnsRules());
   }
diff --git a/net/dns/host_resolver_proc.cc b/net/dns/host_resolver_proc.cc
index ab5e16f..90d9958 100644
--- a/net/dns/host_resolver_proc.cc
+++ b/net/dns/host_resolver_proc.cc
@@ -27,7 +27,7 @@
 bool IsAllLocalhostOfOneFamily(const struct addrinfo* ai) {
   bool saw_v4_localhost = false;
   bool saw_v6_localhost = false;
-  for (; ai != NULL; ai = ai->ai_next) {
+  for (; ai != nullptr; ai = ai->ai_next) {
     switch (ai->ai_family) {
       case AF_INET: {
         const struct sockaddr_in* addr_in =
@@ -59,7 +59,7 @@
 
 }  // namespace
 
-HostResolverProc* HostResolverProc::default_proc_ = NULL;
+HostResolverProc* HostResolverProc::default_proc_ = nullptr;
 
 HostResolverProc::HostResolverProc(HostResolverProc* previous) {
   SetPreviousProc(previous);
@@ -89,7 +89,7 @@
 
 void HostResolverProc::SetPreviousProc(HostResolverProc* proc) {
   HostResolverProc* current_previous = previous_proc_.get();
-  previous_proc_ = NULL;
+  previous_proc_ = nullptr;
   // Now that we've guaranteed |this| is the last proc in a chain, we can
   // detect potential cycles using GetLastProc().
   previous_proc_ = (GetLastProc(proc) == this) ? current_previous : proc;
@@ -101,10 +101,10 @@
 
 // static
 HostResolverProc* HostResolverProc::GetLastProc(HostResolverProc* proc) {
-  if (proc == NULL)
-    return NULL;
+  if (proc == nullptr)
+    return nullptr;
   HostResolverProc* last_proc = proc;
-  while (last_proc->previous_proc_.get() != NULL)
+  while (last_proc->previous_proc_.get() != nullptr)
     last_proc = last_proc->previous_proc_.get();
   return last_proc;
 }
@@ -133,7 +133,7 @@
   if (os_error)
     *os_error = 0;
 
-  struct addrinfo* ai = NULL;
+  struct addrinfo* ai = nullptr;
   struct addrinfo hints = {0};
 
   switch (address_family) {
@@ -201,7 +201,7 @@
     !defined(OS_ANDROID) && !defined(OS_FUCHSIA)
   DnsReloaderMaybeReload();
 #endif
-  int err = getaddrinfo(host.c_str(), NULL, &hints, &ai);
+  int err = getaddrinfo(host.c_str(), nullptr, &hints, &ai);
   bool should_retry = false;
   // If the lookup was restricted (either by address family, or address
   // detection), and the results where all localhost of a single family,
@@ -219,11 +219,11 @@
     }
   }
   if (should_retry) {
-    if (ai != NULL) {
+    if (ai != nullptr) {
       freeaddrinfo(ai);
-      ai = NULL;
+      ai = nullptr;
     }
-    err = getaddrinfo(host.c_str(), NULL, &hints, &ai);
+    err = getaddrinfo(host.c_str(), nullptr, &hints, &ai);
   }
 
   if (err) {
@@ -260,7 +260,7 @@
   return OK;
 }
 
-SystemHostResolverProc::SystemHostResolverProc() : HostResolverProc(NULL) {}
+SystemHostResolverProc::SystemHostResolverProc() : HostResolverProc(nullptr) {}
 
 int SystemHostResolverProc::Resolve(const std::string& hostname,
                                     AddressFamily address_family,
diff --git a/net/dns/mdns_client_impl.cc b/net/dns/mdns_client_impl.cc
index 164fdbf..af9c2eae 100644
--- a/net/dns/mdns_client_impl.cc
+++ b/net/dns/mdns_client_impl.cc
@@ -435,7 +435,7 @@
 }
 
 bool MDnsClientImpl::IsListening() const {
-  return core_.get() != NULL;
+  return core_.get() != nullptr;
 }
 
 std::unique_ptr<MDnsListener> MDnsClientImpl::CreateListener(
@@ -675,9 +675,9 @@
 void MDnsTransactionImpl::SignalTransactionOver() {
   DCHECK(started_);
   if (flags_ & MDnsTransaction::SINGLE_RESULT) {
-    TriggerCallback(MDnsTransaction::RESULT_NO_RESULTS, NULL);
+    TriggerCallback(MDnsTransaction::RESULT_NO_RESULTS, nullptr);
   } else {
-    TriggerCallback(MDnsTransaction::RESULT_DONE, NULL);
+    TriggerCallback(MDnsTransaction::RESULT_DONE, nullptr);
   }
 }
 
@@ -700,7 +700,7 @@
             records.front()->rdata<NsecRecordRdata>();
         DCHECK(rdata);
         if (!rdata->GetBit(rrtype_))
-          weak_this->TriggerCallback(MDnsTransaction::RESULT_NSEC, NULL);
+          weak_this->TriggerCallback(MDnsTransaction::RESULT_NSEC, nullptr);
       }
     }
 #endif
@@ -725,7 +725,7 @@
 }
 
 void MDnsTransactionImpl::OnNsecRecord(const std::string& name, unsigned type) {
-  TriggerCallback(RESULT_NSEC, NULL);
+  TriggerCallback(RESULT_NSEC, nullptr);
 }
 
 void MDnsTransactionImpl::OnCachePurged() {
diff --git a/net/dns/mock_host_resolver.cc b/net/dns/mock_host_resolver.cc
index 0b61518c..ed31768 100644
--- a/net/dns/mock_host_resolver.cc
+++ b/net/dns/mock_host_resolver.cc
@@ -829,7 +829,7 @@
 }
 
 RuleBasedHostResolverProc* CreateCatchAllHostResolverProc() {
-  RuleBasedHostResolverProc* catchall = new RuleBasedHostResolverProc(NULL);
+  RuleBasedHostResolverProc* catchall = new RuleBasedHostResolverProc(nullptr);
   // Note that IPv6 lookups fail.
   catchall->AddIPLiteralRule("*", "127.0.0.1", "localhost");
 
diff --git a/net/dns/record_parsed.h b/net/dns/record_parsed.h
index be227d4..27d771d 100644
--- a/net/dns/record_parsed.h
+++ b/net/dns/record_parsed.h
@@ -38,7 +38,7 @@
 
   template <class T> const T* rdata() const {
     if (T::kType != type_)
-      return NULL;
+      return nullptr;
     return static_cast<const T*>(rdata_.get());
   }
 
diff --git a/net/dns/record_parsed_unittest.cc b/net/dns/record_parsed_unittest.cc
index fdb37aa..c60f18c 100644
--- a/net/dns/record_parsed_unittest.cc
+++ b/net/dns/record_parsed_unittest.cc
@@ -31,14 +31,14 @@
 
   parser.SkipQuestion();
   record = RecordParsed::CreateFrom(&parser, base::Time());
-  EXPECT_TRUE(record != NULL);
+  EXPECT_TRUE(record != nullptr);
 
   ASSERT_EQ("codereview.chromium.org", record->name());
   ASSERT_EQ(dns_protocol::kTypeCNAME, record->type());
   ASSERT_EQ(dns_protocol::kClassIN, record->klass());
 
   rdata = record->rdata<CnameRecordRdata>();
-  ASSERT_TRUE(rdata != NULL);
+  ASSERT_TRUE(rdata != nullptr);
   ASSERT_EQ(kT1CanonName, rdata->cname());
 
   ASSERT_FALSE(record->rdata<SrvRecordRdata>());
diff --git a/net/dns/record_rdata.cc b/net/dns/record_rdata.cc
index a284224..87c707e 100644
--- a/net/dns/record_rdata.cc
+++ b/net/dns/record_rdata.cc
@@ -231,7 +231,7 @@
 
   // Read the "next domain". This part for the NSEC record format is
   // ignored for mDNS, since it has no semantic meaning.
-  unsigned next_domain_length = parser.ReadName(data.data(), NULL);
+  unsigned next_domain_length = parser.ReadName(data.data(), nullptr);
 
   // If we did not succeed in getting the next domain or the data length
   // is too short for reading the bitmap header, return.
diff --git a/net/dns/record_rdata_unittest.cc b/net/dns/record_rdata_unittest.cc
index d5765478..827a29e 100644
--- a/net/dns/record_rdata_unittest.cc
+++ b/net/dns/record_rdata_unittest.cc
@@ -46,7 +46,7 @@
 
   std::unique_ptr<SrvRecordRdata> record1_obj =
       SrvRecordRdata::Create(record1_strpiece, parser);
-  ASSERT_TRUE(record1_obj != NULL);
+  ASSERT_TRUE(record1_obj != nullptr);
   ASSERT_EQ(1, record1_obj->priority());
   ASSERT_EQ(2, record1_obj->weight());
   ASSERT_EQ(80, record1_obj->port());
@@ -55,7 +55,7 @@
 
   std::unique_ptr<SrvRecordRdata> record2_obj =
       SrvRecordRdata::Create(record2_strpiece, parser);
-  ASSERT_TRUE(record2_obj != NULL);
+  ASSERT_TRUE(record2_obj != nullptr);
   ASSERT_EQ(257, record2_obj->priority());
   ASSERT_EQ(258, record2_obj->weight());
   ASSERT_EQ(259, record2_obj->port());
@@ -79,7 +79,7 @@
 
   std::unique_ptr<ARecordRdata> record_obj =
       ARecordRdata::Create(record_strpiece, parser);
-  ASSERT_TRUE(record_obj != NULL);
+  ASSERT_TRUE(record_obj != nullptr);
 
   ASSERT_EQ("127.0.0.1", record_obj->address().ToString());
 
@@ -100,7 +100,7 @@
 
   std::unique_ptr<AAAARecordRdata> record_obj =
       AAAARecordRdata::Create(record_strpiece, parser);
-  ASSERT_TRUE(record_obj != NULL);
+  ASSERT_TRUE(record_obj != nullptr);
 
   ASSERT_EQ("1234:5678::9", record_obj->address().ToString());
 
@@ -119,7 +119,7 @@
 
   std::unique_ptr<CnameRecordRdata> record_obj =
       CnameRecordRdata::Create(record_strpiece, parser);
-  ASSERT_TRUE(record_obj != NULL);
+  ASSERT_TRUE(record_obj != nullptr);
 
   ASSERT_EQ("www.google.com", record_obj->cname());
 
@@ -138,7 +138,7 @@
 
   std::unique_ptr<PtrRecordRdata> record_obj =
       PtrRecordRdata::Create(record_strpiece, parser);
-  ASSERT_TRUE(record_obj != NULL);
+  ASSERT_TRUE(record_obj != nullptr);
 
   ASSERT_EQ("www.google.com", record_obj->ptrdomain());
 
@@ -157,7 +157,7 @@
 
   std::unique_ptr<TxtRecordRdata> record_obj =
       TxtRecordRdata::Create(record_strpiece, parser);
-  ASSERT_TRUE(record_obj != NULL);
+  ASSERT_TRUE(record_obj != nullptr);
 
   std::vector<std::string> expected;
   expected.push_back("www");
@@ -182,7 +182,7 @@
 
   std::unique_ptr<NsecRecordRdata> record_obj =
       NsecRecordRdata::Create(record_strpiece, parser);
-  ASSERT_TRUE(record_obj != NULL);
+  ASSERT_TRUE(record_obj != nullptr);
 
   ASSERT_EQ(16u, record_obj->bitmap_length());
 
diff --git a/net/extras/sqlite/sqlite_channel_id_store_unittest.cc b/net/extras/sqlite/sqlite_channel_id_store_unittest.cc
index 5ff05b9..7d2e245 100644
--- a/net/extras/sqlite/sqlite_channel_id_store_unittest.cc
+++ b/net/extras/sqlite/sqlite_channel_id_store_unittest.cc
@@ -127,7 +127,7 @@
   // Replace the store effectively destroying the current one and forcing it
   // to write its data to disk. Then we can see if after loading it again it
   // is still there.
-  store_ = NULL;
+  store_ = nullptr;
   // Make sure we wait until the destructor has run.
   base::RunLoop().RunUntilIdle();
   store_ = new SQLiteChannelIDStore(
@@ -156,7 +156,7 @@
   // Now delete the keypair and check persistence again.
   store_->DeleteChannelID(*channel_ids[0]);
   store_->DeleteChannelID(*channel_ids[1]);
-  store_ = NULL;
+  store_ = nullptr;
   // Make sure we wait until the destructor has run.
   base::RunLoop().RunUntilIdle();
   channel_ids.clear();
@@ -168,7 +168,7 @@
   Load(&channel_ids);
   ASSERT_EQ(0U, channel_ids.size());
   // Close the store.
-  store_ = NULL;
+  store_ = nullptr;
   // Make sure we wait until the destructor has run.
   base::RunLoop().RunUntilIdle();
 }
@@ -183,7 +183,7 @@
   // Replace the store effectively destroying the current one and forcing it
   // to write its data to disk. Then we can see if after loading it again it
   // is still there.
-  store_ = NULL;
+  store_ = nullptr;
   // Make sure we wait until the destructor has run.
   base::RunLoop().RunUntilIdle();
   store_ = new SQLiteChannelIDStore(
@@ -200,7 +200,7 @@
   store_->DeleteAllInList(delete_server_identifiers);
 
   // Now check persistence again.
-  store_ = NULL;
+  store_ = nullptr;
   // Make sure we wait until the destructor has run.
   base::RunLoop().RunUntilIdle();
   channel_ids.clear();
@@ -213,14 +213,14 @@
   ASSERT_EQ(1U, channel_ids.size());
   ASSERT_EQ("foo.com", channel_ids[0]->server_identifier());
   // Close the store.
-  store_ = NULL;
+  store_ = nullptr;
   // Make sure we wait until the destructor has run.
   base::RunLoop().RunUntilIdle();
 }
 
 TEST_F(SQLiteChannelIDStoreTest, TestUpgradeV1) {
   // Reset the store.  We'll be using a different database for this test.
-  store_ = NULL;
+  store_ = nullptr;
 
   base::FilePath v1_db_path(temp_dir_.GetPath().AppendASCII("v1db"));
 
@@ -272,7 +272,7 @@
     Load(&channel_ids);
     ASSERT_EQ(0U, channel_ids.size());
 
-    store_ = NULL;
+    store_ = nullptr;
     base::RunLoop().RunUntilIdle();
 
     // Verify the database version is updated.
@@ -290,7 +290,7 @@
 
 TEST_F(SQLiteChannelIDStoreTest, TestUpgradeV2) {
   // Reset the store.  We'll be using a different database for this test.
-  store_ = NULL;
+  store_ = nullptr;
 
   base::FilePath v2_db_path(temp_dir_.GetPath().AppendASCII("v2db"));
 
@@ -346,7 +346,7 @@
     Load(&channel_ids);
     ASSERT_EQ(0U, channel_ids.size());
 
-    store_ = NULL;
+    store_ = nullptr;
     // Make sure we wait until the destructor has run.
     base::RunLoop().RunUntilIdle();
 
@@ -365,7 +365,7 @@
 
 TEST_F(SQLiteChannelIDStoreTest, TestUpgradeV3) {
   // Reset the store.  We'll be using a different database for this test.
-  store_ = NULL;
+  store_ = nullptr;
 
   base::FilePath v3_db_path(temp_dir_.GetPath().AppendASCII("v3db"));
 
@@ -423,7 +423,7 @@
     Load(&channel_ids);
     ASSERT_EQ(0U, channel_ids.size());
 
-    store_ = NULL;
+    store_ = nullptr;
     // Make sure we wait until the destructor has run.
     base::RunLoop().RunUntilIdle();
 
@@ -442,7 +442,7 @@
 
 TEST_F(SQLiteChannelIDStoreTest, TestUpgradeV4) {
   // Reset the store.  We'll be using a different database for this test.
-  store_ = NULL;
+  store_ = nullptr;
 
   base::FilePath v4_db_path(temp_dir_.GetPath().AppendASCII("v4db"));
 
@@ -516,7 +516,7 @@
     Load(&channel_ids);
     ASSERT_EQ(0U, channel_ids.size());
 
-    store_ = NULL;
+    store_ = nullptr;
     // Make sure we wait until the destructor has run.
     base::RunLoop().RunUntilIdle();
 
@@ -535,7 +535,7 @@
 
 TEST_F(SQLiteChannelIDStoreTest, TestUpgradeV5) {
   // Reset the store.  We'll be using a different database for this test.
-  store_ = NULL;
+  store_ = nullptr;
 
   base::FilePath v5_db_path(temp_dir_.GetPath().AppendASCII("v5db"));
 
@@ -591,7 +591,7 @@
     Load(&channel_ids);
     ASSERT_EQ(0U, channel_ids.size());
 
-    store_ = NULL;
+    store_ = nullptr;
     // Make sure we wait until the destructor has run.
     base::RunLoop().RunUntilIdle();
 
diff --git a/net/extras/sqlite/sqlite_persistent_cookie_store.cc b/net/extras/sqlite/sqlite_persistent_cookie_store.cc
index fb891be..d66909b 100644
--- a/net/extras/sqlite/sqlite_persistent_cookie_store.cc
+++ b/net/extras/sqlite/sqlite_persistent_cookie_store.cc
@@ -747,7 +747,7 @@
   if (initialized_ || corruption_detected_) {
     // Return false if we were previously initialized but the DB has since been
     // closed, or if corruption caused a database reset during initialization.
-    return db_ != NULL;
+    return db_ != nullptr;
   }
 
   base::Time start = base::Time::Now();
diff --git a/net/extras/sqlite/sqlite_persistent_cookie_store_perftest.cc b/net/extras/sqlite/sqlite_persistent_cookie_store_perftest.cc
index 71005556..14074cf 100644
--- a/net/extras/sqlite/sqlite_persistent_cookie_store_perftest.cc
+++ b/net/extras/sqlite/sqlite_persistent_cookie_store_perftest.cc
@@ -87,7 +87,7 @@
     ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
     store_ = new SQLitePersistentCookieStore(
         temp_dir_.GetPath().Append(cookie_filename), client_task_runner_,
-        background_task_runner_, false, NULL);
+        background_task_runner_, false, nullptr);
     std::vector<CanonicalCookie*> cookies;
     Load();
     ASSERT_EQ(0u, cookies_.size());
@@ -99,14 +99,14 @@
     }
     // Replace the store effectively destroying the current one and forcing it
     // to write its data to disk.
-    store_ = NULL;
+    store_ = nullptr;
 
     // Flush TaskScheduler tasks, causing pending commits to run.
     scoped_task_environment_.RunUntilIdle();
 
     store_ = new SQLitePersistentCookieStore(
         temp_dir_.GetPath().Append(cookie_filename), client_task_runner_,
-        background_task_runner_, false, NULL);
+        background_task_runner_, false, nullptr);
   }
 
   // Pick a random cookie out of the 15000 in the store and return it.
@@ -120,9 +120,7 @@
     return CookieFromIndices(domain, cookie_num);
   }
 
-  void TearDown() override {
-    store_ = NULL;
-  }
+  void TearDown() override { store_ = nullptr; }
 
   void StartPerfMeasurement() {
     DCHECK(perf_measurement_start_.is_null());
diff --git a/net/filter/gzip_header.cc b/net/filter/gzip_header.cc
index a34aece..2ffd9ee 100644
--- a/net/filter/gzip_header.cc
+++ b/net/filter/gzip_header.cc
@@ -123,7 +123,7 @@
         }
         // See if we can find the end of the \0-terminated FNAME field.
         pos = reinterpret_cast<const uint8_t*>(memchr(pos, '\0', (end - pos)));
-        if ( pos != NULL ) {
+        if (pos != nullptr) {
           pos++;  // advance past the '\0'
           flags_ &= ~FLAG_FNAME;   // we're done with the FNAME stuff
           state_ = IN_FCOMMENT;
@@ -139,7 +139,7 @@
         }
         // See if we can find the end of the \0-terminated FCOMMENT field.
         pos = reinterpret_cast<const uint8_t*>(memchr(pos, '\0', (end - pos)));
-        if ( pos != NULL ) {
+        if (pos != nullptr) {
           pos++;  // advance past the '\0'
           flags_ &= ~FLAG_FCOMMENT;   // we're done with the FCOMMENT stuff
           state_ = IN_FHCRC_BYTE_0;
diff --git a/net/ftp/ftp_auth_cache.cc b/net/ftp/ftp_auth_cache.cc
index 129906cf..63da9ae 100644
--- a/net/ftp/ftp_auth_cache.cc
+++ b/net/ftp/ftp_auth_cache.cc
@@ -29,7 +29,7 @@
     if (it->origin == origin)
       return &(*it);
   }
-  return NULL;
+  return nullptr;
 }
 
 void FtpAuthCache::Add(const GURL& origin, const AuthCredentials& credentials) {
diff --git a/net/ftp/ftp_auth_cache_unittest.cc b/net/ftp/ftp_auth_cache_unittest.cc
index e6eaa87..af3ea7c 100644
--- a/net/ftp/ftp_auth_cache_unittest.cc
+++ b/net/ftp/ftp_auth_cache_unittest.cc
@@ -38,7 +38,7 @@
   GURL origin2("ftp://foo2");
 
   // Lookup non-existent entry.
-  EXPECT_TRUE(cache.Lookup(origin1) == NULL);
+  EXPECT_TRUE(cache.Lookup(origin1) == nullptr);
 
   // Add entry for origin1.
   cache.Add(origin1, AuthCredentials(kUsername1, kPassword1));
@@ -69,11 +69,11 @@
 
   // Remove entry of origin1.
   cache.Remove(origin1, AuthCredentials(kUsername3, kPassword3));
-  EXPECT_TRUE(cache.Lookup(origin1) == NULL);
+  EXPECT_TRUE(cache.Lookup(origin1) == nullptr);
 
   // Remove non-existent entry.
   cache.Remove(origin1, AuthCredentials(kUsername3, kPassword3));
-  EXPECT_TRUE(cache.Lookup(origin1) == NULL);
+  EXPECT_TRUE(cache.Lookup(origin1) == nullptr);
 }
 
 // Check that if the origin differs only by port number, it is considered
@@ -116,7 +116,7 @@
 
   // Remove
   cache.Remove(GURL("ftp://HOsT"), AuthCredentials(kOthername, kOtherword));
-  EXPECT_TRUE(cache.Lookup(GURL("ftp://host")) == NULL);
+  EXPECT_TRUE(cache.Lookup(GURL("ftp://host")) == nullptr);
 }
 
 TEST(FtpAuthCacheTest, OnlyRemoveMatching) {
@@ -131,7 +131,7 @@
 
   // Auth data matches, should remove.
   cache.Remove(GURL("ftp://host"), AuthCredentials(kUsername, kPassword));
-  EXPECT_TRUE(cache.Lookup(GURL("ftp://host")) == NULL);
+  EXPECT_TRUE(cache.Lookup(GURL("ftp://host")) == nullptr);
 }
 
 TEST(FtpAuthCacheTest, EvictOldEntries) {
@@ -149,7 +149,7 @@
 
   // Adding one entry should cause eviction of the first entry.
   cache.Add(GURL("ftp://last_host"), AuthCredentials(kUsername, kPassword));
-  EXPECT_TRUE(cache.Lookup(GURL("ftp://host0")) == NULL);
+  EXPECT_TRUE(cache.Lookup(GURL("ftp://host0")) == nullptr);
 
   // Remaining entries should not get evicted.
   for (size_t i = 1; i < FtpAuthCache::kMaxEntries; i++) {
diff --git a/net/http/failing_http_transaction_factory.cc b/net/http/failing_http_transaction_factory.cc
index 2ee5fc8..4d3a609 100644
--- a/net/http/failing_http_transaction_factory.cc
+++ b/net/http/failing_http_transaction_factory.cc
@@ -211,7 +211,7 @@
 }
 
 HttpCache* FailingHttpTransactionFactory::GetCache() {
-  return NULL;
+  return nullptr;
 }
 
 HttpNetworkSession* FailingHttpTransactionFactory::GetSession() {
diff --git a/net/http/http_auth.cc b/net/http/http_auth.cc
index 68ae3b1f..7aa3b60 100644
--- a/net/http/http_auth.cc
+++ b/net/http/http_auth.cc
@@ -35,7 +35,7 @@
     HostResolver* host_resolver,
     std::unique_ptr<HttpAuthHandler>* handler) {
   DCHECK(http_auth_handler_factory);
-  DCHECK(handler->get() == NULL);
+  DCHECK(handler->get() == nullptr);
 
   // Choose the challenge whose authentication handler gives the maximum score.
   std::unique_ptr<HttpAuthHandler> best;
diff --git a/net/http/http_auth_cache_unittest.cc b/net/http/http_auth_cache_unittest.cc
index 41016b0..f54049b 100644
--- a/net/http/http_auth_cache_unittest.cc
+++ b/net/http/http_auth_cache_unittest.cc
@@ -322,7 +322,7 @@
   // lookup.
   HttpAuthCache::Entry* entry = cache.Lookup(
       origin, kRealm3, HttpAuth::AUTH_SCHEME_DIGEST);
-  EXPECT_FALSE(NULL == entry);
+  EXPECT_FALSE(nullptr == entry);
 }
 
 TEST(HttpAuthCacheTest, ClearEntriesAddedSince) {
@@ -461,7 +461,7 @@
       "nonce=\"s3MzvFhaBAA=4c520af5acd9d8d7ae26947529d18c8eae1e98f4\"",
       CreateASCIICredentials("realm-digest-user", "realm-digest-password"),
       "/baz/index.html");
-  ASSERT_TRUE(entry_pre != NULL);
+  ASSERT_TRUE(entry_pre != nullptr);
 
   EXPECT_EQ(2, entry_pre->IncrementNonceCount());
   EXPECT_EQ(3, entry_pre->IncrementNonceCount());
@@ -478,7 +478,7 @@
   // the nonce count should be reset to 0.
   HttpAuthCache::Entry* entry_post =
       cache.Lookup(origin, kRealm1, HttpAuth::AUTH_SCHEME_DIGEST);
-  ASSERT_TRUE(entry_post != NULL);
+  ASSERT_TRUE(entry_post != nullptr);
   EXPECT_EQ(2, entry_post->IncrementNonceCount());
 
   // UpdateStaleChallenge will fail if an entry doesn't exist in the cache.
@@ -524,19 +524,19 @@
 
   // Copied from first_cache.
   entry = second_cache.Lookup(origin, kRealm1, HttpAuth::AUTH_SCHEME_BASIC);
-  EXPECT_TRUE(NULL != entry);
+  EXPECT_TRUE(nullptr != entry);
   EXPECT_EQ(kAlice, entry->credentials().username());
   EXPECT_EQ(k123, entry->credentials().password());
 
   // Copied from first_cache.
   entry = second_cache.Lookup(origin, kRealm2, HttpAuth::AUTH_SCHEME_BASIC);
-  EXPECT_TRUE(NULL != entry);
+  EXPECT_TRUE(nullptr != entry);
   EXPECT_EQ(kAlice2, entry->credentials().username());
   EXPECT_EQ(k1234, entry->credentials().password());
 
   // Overwritten from first_cache.
   entry = second_cache.Lookup(origin, kRealm3, HttpAuth::AUTH_SCHEME_DIGEST);
-  EXPECT_TRUE(NULL != entry);
+  EXPECT_TRUE(nullptr != entry);
   EXPECT_EQ(kRoot, entry->credentials().username());
   EXPECT_EQ(kWileCoyote, entry->credentials().password());
   // Nonce count should get copied.
@@ -544,13 +544,13 @@
 
   // All paths should get copied.
   entry = second_cache.LookupByPath(origin, another_path);
-  EXPECT_TRUE(NULL != entry);
+  EXPECT_TRUE(nullptr != entry);
   EXPECT_EQ(kRoot, entry->credentials().username());
   EXPECT_EQ(kWileCoyote, entry->credentials().password());
 
   // Left intact in second_cache.
   entry = second_cache.Lookup(origin, kRealm4, HttpAuth::AUTH_SCHEME_BASIC);
-  EXPECT_TRUE(NULL != entry);
+  EXPECT_TRUE(nullptr != entry);
   EXPECT_EQ(kAdmin, entry->credentials().username());
   EXPECT_EQ(kRoot, entry->credentials().password());
 }
@@ -587,10 +587,10 @@
         cache_.Lookup(
             origin_, GenerateRealm(realm_i), HttpAuth::AUTH_SCHEME_BASIC);
     if (exists) {
-      EXPECT_FALSE(entry == NULL);
+      EXPECT_FALSE(entry == nullptr);
       EXPECT_EQ(GenerateRealm(realm_i), entry->realm());
     } else {
-      EXPECT_TRUE(entry == NULL);
+      EXPECT_TRUE(entry == nullptr);
     }
   }
 
@@ -598,10 +598,10 @@
     const HttpAuthCache::Entry* entry =
         cache_.LookupByPath(origin_, GeneratePath(realm_i, path_i));
     if (exists) {
-      EXPECT_FALSE(entry == NULL);
+      EXPECT_FALSE(entry == nullptr);
       EXPECT_EQ(GenerateRealm(realm_i), entry->realm());
     } else {
-      EXPECT_TRUE(entry == NULL);
+      EXPECT_TRUE(entry == nullptr);
     }
   }
 
diff --git a/net/http/http_auth_controller.cc b/net/http/http_auth_controller.cc
index 12cc4f2..6bb51b9c 100644
--- a/net/http/http_auth_controller.cc
+++ b/net/http/http_auth_controller.cc
@@ -154,7 +154,7 @@
   bool needs_auth = HaveAuth() || SelectPreemptiveAuth(net_log);
   if (!needs_auth)
     return OK;
-  const AuthCredentials* credentials = NULL;
+  const AuthCredentials* credentials = nullptr;
   if (identity_.source != HttpAuth::IDENT_SRC_DEFAULT_CREDENTIALS)
     credentials = &identity_.credentials;
   DCHECK(auth_token_.empty());
@@ -385,7 +385,7 @@
 }
 
 bool HttpAuthController::HaveAuthHandler() const {
-  return handler_.get() != NULL;
+  return handler_.get() != nullptr;
 }
 
 bool HttpAuthController::HaveAuth() const {
diff --git a/net/http/http_auth_handler.cc b/net/http/http_auth_handler.cc
index 9aafc81..e79bedfe 100644
--- a/net/http/http_auth_handler.cc
+++ b/net/http/http_auth_handler.cc
@@ -69,8 +69,8 @@
                                        std::string* auth_token) {
   DCHECK(!callback.is_null());
   DCHECK(request);
-  DCHECK(credentials != NULL || AllowsDefaultCredentials());
-  DCHECK(auth_token != NULL);
+  DCHECK(credentials != nullptr || AllowsDefaultCredentials());
+  DCHECK(auth_token != nullptr);
   DCHECK(callback_.is_null());
   callback_ = std::move(callback);
   net_log_.BeginEvent(EventTypeFromAuthTarget(target_));
diff --git a/net/http/http_auth_handler_digest_unittest.cc b/net/http/http_auth_handler_digest_unittest.cc
index 4af18578..e4bc09dd 100644
--- a/net/http/http_auth_handler_digest_unittest.cc
+++ b/net/http/http_auth_handler_digest_unittest.cc
@@ -43,7 +43,7 @@
                         const std::string& challenge,
                         std::string* token) {
   // Input validation.
-  if (token == NULL) {
+  if (token == nullptr) {
     ADD_FAILURE() << "|token| must be non-NULL";
     return false;
   }
@@ -66,7 +66,7 @@
   int rv_create = factory->CreateAuthHandlerFromString(
       challenge, target, null_ssl_info, url_origin.GetOrigin(),
       NetLogWithSource(), host_resolver.get(), &handler);
-  if (rv_create != OK || handler.get() == NULL) {
+  if (rv_create != OK || handler.get() == nullptr) {
     ADD_FAILURE() << "Unable to create auth handler.";
     return false;
   }
@@ -372,10 +372,10 @@
       EXPECT_THAT(rv, IsOk());
     } else {
       EXPECT_NE(OK, rv);
-      EXPECT_TRUE(handler.get() == NULL);
+      EXPECT_TRUE(handler.get() == nullptr);
       continue;
     }
-    ASSERT_TRUE(handler.get() != NULL);
+    ASSERT_TRUE(handler.get() != nullptr);
     HttpAuthHandlerDigest* digest =
         static_cast<HttpAuthHandlerDigest*>(handler.get());
     EXPECT_STREQ(tests[i].parsed_realm, digest->realm_.c_str());
@@ -534,7 +534,7 @@
         tests[i].challenge, HttpAuth::AUTH_SERVER, null_ssl_info, origin,
         NetLogWithSource(), host_resolver.get(), &handler);
     EXPECT_THAT(rv, IsOk());
-    ASSERT_TRUE(handler != NULL);
+    ASSERT_TRUE(handler != nullptr);
 
     HttpAuthHandlerDigest* digest =
         static_cast<HttpAuthHandlerDigest*>(handler.get());
@@ -564,7 +564,7 @@
       default_challenge, HttpAuth::AUTH_SERVER, null_ssl_info, origin,
       NetLogWithSource(), host_resolver.get(), &handler);
   EXPECT_THAT(rv, IsOk());
-  ASSERT_TRUE(handler.get() != NULL);
+  ASSERT_TRUE(handler.get() != nullptr);
   HttpAuthChallengeTokenizer tok_default(default_challenge.begin(),
                                          default_challenge.end());
   EXPECT_EQ(HttpAuth::AUTHORIZATION_RESULT_REJECT,
diff --git a/net/http/http_auth_handler_factory.cc b/net/http/http_auth_handler_factory.cc
index 0e5610e..c6519b1b 100644
--- a/net/http/http_auth_handler_factory.cc
+++ b/net/http/http_auth_handler_factory.cc
@@ -94,7 +94,7 @@
   std::string lower_scheme = base::ToLowerASCII(scheme);
   auto it = factory_map_.find(lower_scheme);
   if (it == factory_map_.end()) {
-    return NULL;                  // |scheme| is not registered.
+    return nullptr;  // |scheme| is not registered.
   }
   return it->second.get();
 }
diff --git a/net/http/http_auth_handler_factory.h b/net/http/http_auth_handler_factory.h
index c0e0659..efc3d9e 100644
--- a/net/http/http_auth_handler_factory.h
+++ b/net/http/http_auth_handler_factory.h
@@ -39,7 +39,7 @@
     CREATE_PREEMPTIVE,    // Create a handler preemptively.
   };
 
-  HttpAuthHandlerFactory() : http_auth_preferences_(NULL) {}
+  HttpAuthHandlerFactory() : http_auth_preferences_(nullptr) {}
   virtual ~HttpAuthHandlerFactory() {}
 
   // Sets the source of the HTTP authentication preferences.
diff --git a/net/http/http_auth_handler_factory_unittest.cc b/net/http/http_auth_handler_factory_unittest.cc
index b6ae977..8ce2c4a 100644
--- a/net/http/http_auth_handler_factory_unittest.cc
+++ b/net/http/http_auth_handler_factory_unittest.cc
@@ -134,7 +134,7 @@
         "Basic realm=\"FooBar\"", HttpAuth::AUTH_SERVER, null_ssl_info,
         server_origin, NetLogWithSource(), host_resolver.get(), &handler);
     EXPECT_THAT(rv, IsOk());
-    ASSERT_FALSE(handler.get() == NULL);
+    ASSERT_FALSE(handler.get() == nullptr);
     EXPECT_EQ(HttpAuth::AUTH_SCHEME_BASIC, handler->auth_scheme());
     EXPECT_STREQ("FooBar", handler->realm().c_str());
     EXPECT_EQ(HttpAuth::AUTH_SERVER, handler->target());
@@ -147,7 +147,7 @@
         "UNSUPPORTED realm=\"FooBar\"", HttpAuth::AUTH_SERVER, null_ssl_info,
         server_origin, NetLogWithSource(), host_resolver.get(), &handler);
     EXPECT_THAT(rv, IsError(ERR_UNSUPPORTED_AUTH_SCHEME));
-    EXPECT_TRUE(handler.get() == NULL);
+    EXPECT_TRUE(handler.get() == nullptr);
   }
   {
     std::unique_ptr<HttpAuthHandler> handler;
@@ -156,7 +156,7 @@
         null_ssl_info, proxy_origin, NetLogWithSource(), host_resolver.get(),
         &handler);
     EXPECT_THAT(rv, IsOk());
-    ASSERT_FALSE(handler.get() == NULL);
+    ASSERT_FALSE(handler.get() == nullptr);
     EXPECT_EQ(HttpAuth::AUTH_SCHEME_DIGEST, handler->auth_scheme());
     EXPECT_STREQ("FooBar", handler->realm().c_str());
     EXPECT_EQ(HttpAuth::AUTH_PROXY, handler->target());
@@ -169,7 +169,7 @@
         "NTLM", HttpAuth::AUTH_SERVER, null_ssl_info, server_origin,
         NetLogWithSource(), host_resolver.get(), &handler);
     EXPECT_THAT(rv, IsOk());
-    ASSERT_FALSE(handler.get() == NULL);
+    ASSERT_FALSE(handler.get() == nullptr);
     EXPECT_EQ(HttpAuth::AUTH_SCHEME_NTLM, handler->auth_scheme());
     EXPECT_STREQ("", handler->realm().c_str());
     EXPECT_EQ(HttpAuth::AUTH_SERVER, handler->target());
@@ -184,7 +184,7 @@
 // Note the default factory doesn't support Kerberos on Android
 #if BUILDFLAG(USE_KERBEROS) && !defined(OS_ANDROID)
     EXPECT_THAT(rv, IsOk());
-    ASSERT_FALSE(handler.get() == NULL);
+    ASSERT_FALSE(handler.get() == nullptr);
     EXPECT_EQ(HttpAuth::AUTH_SCHEME_NEGOTIATE, handler->auth_scheme());
     EXPECT_STREQ("", handler->realm().c_str());
     EXPECT_EQ(HttpAuth::AUTH_SERVER, handler->target());
diff --git a/net/http/http_auth_handler_mock.cc b/net/http/http_auth_handler_mock.cc
index 850f20a..791eb8b 100644
--- a/net/http/http_auth_handler_mock.cc
+++ b/net/http/http_auth_handler_mock.cc
@@ -46,7 +46,7 @@
     : state_(State::WAIT_FOR_INIT),
       generate_async_(false),
       generate_rv_(OK),
-      auth_token_(NULL),
+      auth_token_(nullptr),
       first_round_(true),
       connection_based_(false),
       allows_default_credentials_(false),
@@ -112,7 +112,7 @@
   request_url_ = request->url;
   if (generate_async_) {
     EXPECT_TRUE(callback_.is_null());
-    EXPECT_TRUE(auth_token_ == NULL);
+    EXPECT_TRUE(auth_token_ == nullptr);
     callback_ = std::move(callback);
     auth_token_ = auth_token;
     base::ThreadTaskRunnerHandle::Get()->PostTask(
@@ -143,7 +143,7 @@
   } else {
     state_ = State::DONE;
   }
-  auth_token_ = NULL;
+  auth_token_ = nullptr;
   base::ResetAndReturn(&callback_).Run(generate_rv_);
 }
 
diff --git a/net/http/http_auth_handler_negotiate.cc b/net/http/http_auth_handler_negotiate.cc
index 1733efc..267dc09 100644
--- a/net/http/http_auth_handler_negotiate.cc
+++ b/net/http/http_auth_handler_negotiate.cc
@@ -150,7 +150,7 @@
       resolver_(resolver),
       already_called_(false),
       has_credentials_(false),
-      auth_token_(NULL),
+      auth_token_(nullptr),
       next_state_(STATE_NONE),
       http_auth_preferences_(prefs) {}
 
@@ -221,10 +221,10 @@
     CompletionOnceCallback callback,
     std::string* auth_token) {
   DCHECK(callback_.is_null());
-  DCHECK(auth_token_ == NULL);
+  DCHECK(auth_token_ == nullptr);
   auth_token_ = auth_token;
   if (already_called_) {
-    DCHECK((!has_credentials_ && credentials == NULL) ||
+    DCHECK((!has_credentials_ && credentials == nullptr) ||
            (has_credentials_ && credentials->Equals(credentials_)));
     next_state_ = STATE_GENERATE_AUTH_TOKEN;
   } else {
@@ -375,7 +375,7 @@
 
 int HttpAuthHandlerNegotiate::DoGenerateAuthToken() {
   next_state_ = STATE_GENERATE_AUTH_TOKEN_COMPLETE;
-  AuthCredentials* credentials = has_credentials_ ? &credentials_ : NULL;
+  AuthCredentials* credentials = has_credentials_ ? &credentials_ : nullptr;
   return auth_system_->GenerateAuthToken(
       credentials, spn_, channel_bindings_, auth_token_,
       base::BindOnce(&HttpAuthHandlerNegotiate::OnIOComplete,
@@ -384,7 +384,7 @@
 
 int HttpAuthHandlerNegotiate::DoGenerateAuthTokenComplete(int rv) {
   DCHECK_NE(ERR_IO_PENDING, rv);
-  auth_token_ = NULL;
+  auth_token_ = nullptr;
   return rv;
 }
 
diff --git a/net/http/http_auth_handler_negotiate_unittest.cc b/net/http/http_auth_handler_negotiate_unittest.cc
index eff278ed..d376a3c 100644
--- a/net/http/http_auth_handler_negotiate_unittest.cc
+++ b/net/http/http_auth_handler_negotiate_unittest.cc
@@ -259,12 +259,12 @@
   EXPECT_EQ(OK, CreateHandler(
       true, false, true, "http://alias:500", &auth_handler));
 
-  ASSERT_TRUE(auth_handler.get() != NULL);
+  ASSERT_TRUE(auth_handler.get() != nullptr);
   TestCompletionCallback callback;
   HttpRequestInfo request_info;
   std::string token;
   EXPECT_EQ(OK, callback.GetResult(auth_handler->GenerateAuthToken(
-                    NULL, &request_info, callback.callback(), &token)));
+                    nullptr, &request_info, callback.callback(), &token)));
 #if defined(OS_WIN)
   EXPECT_EQ("HTTP/alias", auth_handler->spn_for_testing());
 #elif defined(OS_POSIX)
@@ -277,12 +277,12 @@
   std::unique_ptr<HttpAuthHandlerNegotiate> auth_handler;
   EXPECT_EQ(OK, CreateHandler(
       true, true, true, "http://alias:80", &auth_handler));
-  ASSERT_TRUE(auth_handler.get() != NULL);
+  ASSERT_TRUE(auth_handler.get() != nullptr);
   TestCompletionCallback callback;
   HttpRequestInfo request_info;
   std::string token;
   EXPECT_EQ(OK, callback.GetResult(auth_handler->GenerateAuthToken(
-                    NULL, &request_info, callback.callback(), &token)));
+                    nullptr, &request_info, callback.callback(), &token)));
 #if defined(OS_WIN)
   EXPECT_EQ("HTTP/alias", auth_handler->spn_for_testing());
 #elif defined(OS_POSIX)
@@ -295,12 +295,12 @@
   std::unique_ptr<HttpAuthHandlerNegotiate> auth_handler;
   EXPECT_EQ(OK, CreateHandler(
       true, true, true, "http://alias:500", &auth_handler));
-  ASSERT_TRUE(auth_handler.get() != NULL);
+  ASSERT_TRUE(auth_handler.get() != nullptr);
   TestCompletionCallback callback;
   HttpRequestInfo request_info;
   std::string token;
   EXPECT_EQ(OK, callback.GetResult(auth_handler->GenerateAuthToken(
-                    NULL, &request_info, callback.callback(), &token)));
+                    nullptr, &request_info, callback.callback(), &token)));
 #if defined(OS_WIN)
   EXPECT_EQ("HTTP/alias:500", auth_handler->spn_for_testing());
 #elif defined(OS_POSIX)
@@ -313,12 +313,12 @@
   std::unique_ptr<HttpAuthHandlerNegotiate> auth_handler;
   EXPECT_EQ(OK, CreateHandler(
       false, false, true, "http://alias:500", &auth_handler));
-  ASSERT_TRUE(auth_handler.get() != NULL);
+  ASSERT_TRUE(auth_handler.get() != nullptr);
   TestCompletionCallback callback;
   HttpRequestInfo request_info;
   std::string token;
   EXPECT_EQ(OK, callback.GetResult(auth_handler->GenerateAuthToken(
-                    NULL, &request_info, callback.callback(), &token)));
+                    nullptr, &request_info, callback.callback(), &token)));
 #if defined(OS_WIN)
   EXPECT_EQ("HTTP/canonical.example.com", auth_handler->spn_for_testing());
 #elif defined(OS_POSIX)
@@ -331,12 +331,13 @@
   std::unique_ptr<HttpAuthHandlerNegotiate> auth_handler;
   EXPECT_EQ(OK, CreateHandler(
       false, false, false, "http://alias:500", &auth_handler));
-  ASSERT_TRUE(auth_handler.get() != NULL);
+  ASSERT_TRUE(auth_handler.get() != nullptr);
   TestCompletionCallback callback;
   HttpRequestInfo request_info;
   std::string token;
-  EXPECT_EQ(ERR_IO_PENDING, auth_handler->GenerateAuthToken(
-      NULL, &request_info, callback.callback(), &token));
+  EXPECT_EQ(ERR_IO_PENDING,
+            auth_handler->GenerateAuthToken(nullptr, &request_info,
+                                            callback.callback(), &token));
   EXPECT_THAT(callback.WaitForResult(), IsOk());
 #if defined(OS_WIN)
   EXPECT_EQ("HTTP/canonical.example.com", auth_handler->spn_for_testing());
diff --git a/net/http/http_auth_sspi_win.cc b/net/http/http_auth_sspi_win.cc
index 767a4de..d972421 100644
--- a/net/http/http_auth_sspi_win.cc
+++ b/net/http/http_auth_sspi_win.cc
@@ -71,15 +71,15 @@
 
   // Pass the username/password to get the credentials handle.
   SECURITY_STATUS status = library->AcquireCredentialsHandle(
-      NULL,  // pszPrincipal
+      nullptr,                          // pszPrincipal
       const_cast<SEC_WCHAR*>(package),  // pszPackage
-      SECPKG_CRED_OUTBOUND,  // fCredentialUse
-      NULL,  // pvLogonID
-      &identity,  // pAuthData
-      NULL,  // pGetKeyFn (not used)
-      NULL,  // pvGetKeyArgument (not used)
-      cred,  // phCredential
-      &expiry);  // ptsExpiry
+      SECPKG_CRED_OUTBOUND,             // fCredentialUse
+      nullptr,                          // pvLogonID
+      &identity,                        // pAuthData
+      nullptr,                          // pGetKeyFn (not used)
+      nullptr,                          // pvGetKeyArgument (not used)
+      cred,                             // phCredential
+      &expiry);                         // ptsExpiry
 
   return MapAcquireCredentialsStatusToError(status, package);
 }
@@ -93,15 +93,15 @@
   // cached credentials for the logged in user, which can be used
   // for a single sign-on.
   SECURITY_STATUS status = library->AcquireCredentialsHandle(
-      NULL,  // pszPrincipal
+      nullptr,                          // pszPrincipal
       const_cast<SEC_WCHAR*>(package),  // pszPackage
-      SECPKG_CRED_OUTBOUND,  // fCredentialUse
-      NULL,  // pvLogonID
-      NULL,  // pAuthData
-      NULL,  // pGetKeyFn (not used)
-      NULL,  // pvGetKeyArgument (not used)
-      cred,  // phCredential
-      &expiry);  // ptsExpiry
+      SECPKG_CRED_OUTBOUND,             // fCredentialUse
+      nullptr,                          // pvLogonID
+      nullptr,                          // pAuthData
+      nullptr,                          // pGetKeyFn (not used)
+      nullptr,                          // pvGetKeyArgument (not used)
+      cred,                             // phCredential
+      &expiry);                         // ptsExpiry
 
   return MapAcquireCredentialsStatusToError(status, package);
 }
@@ -445,7 +445,7 @@
   }
   if (!out_buffer.cbBuffer) {
     free(out_buffer.pvBuffer);
-    out_buffer.pvBuffer = NULL;
+    out_buffer.pvBuffer = nullptr;
   }
   *out_token = out_buffer.pvBuffer;
   *out_token_len = out_buffer.cbBuffer;
@@ -473,7 +473,7 @@
                             ULONG* max_token_length) {
   DCHECK(library);
   DCHECK(max_token_length);
-  PSecPkgInfo pkg_info = NULL;
+  PSecPkgInfo pkg_info = nullptr;
   SECURITY_STATUS status = library->QuerySecurityPackageInfo(
       const_cast<wchar_t *>(package.c_str()), &pkg_info);
   int rv = MapQuerySecurityPackageInfoStatusToError(status);
diff --git a/net/http/http_auth_sspi_win_unittest.cc b/net/http/http_auth_sspi_win_unittest.cc
index 33c796d..3c42767 100644
--- a/net/http/http_auth_sspi_win_unittest.cc
+++ b/net/http/http_auth_sspi_win_unittest.cc
@@ -61,7 +61,7 @@
 TEST(HttpAuthSSPITest, DetermineMaxTokenLength_InvalidPackage) {
   MockSSPILibrary mock_library;
   mock_library.ExpectQuerySecurityPackageInfo(L"Foo", SEC_E_SECPKG_NOT_FOUND,
-                                              NULL);
+                                              nullptr);
   ULONG max_token_length = kMaxTokenLength;
   int rv = DetermineMaxTokenLength(&mock_library, L"Foo", &max_token_length);
   EXPECT_THAT(rv, IsError(ERR_UNSUPPORTED_AUTH_SCHEME));
@@ -97,7 +97,7 @@
   // Generate an auth token and create another thing.
   std::string auth_token;
   EXPECT_EQ(OK, auth_sspi.GenerateAuthToken(
-                    NULL, "HTTP/intranet.google.com", std::string(),
+                    nullptr, "HTTP/intranet.google.com", std::string(),
                     &auth_token, base::BindOnce(&UnexpectedCallback)));
 
   std::string second_challenge_text = "Negotiate Zm9vYmFy";
@@ -134,7 +134,7 @@
 
   std::string auth_token;
   EXPECT_EQ(OK, auth_sspi.GenerateAuthToken(
-                    NULL, "HTTP/intranet.google.com", std::string(),
+                    nullptr, "HTTP/intranet.google.com", std::string(),
                     &auth_token, base::BindOnce(&UnexpectedCallback)));
   std::string second_challenge_text = "Negotiate";
   HttpAuthChallengeTokenizer second_challenge(second_challenge_text.begin(),
@@ -157,7 +157,7 @@
 
   std::string auth_token;
   EXPECT_EQ(OK, auth_sspi.GenerateAuthToken(
-                    NULL, "HTTP/intranet.google.com", std::string(),
+                    nullptr, "HTTP/intranet.google.com", std::string(),
                     &auth_token, base::BindOnce(&UnexpectedCallback)));
   std::string second_challenge_text = "Negotiate =happyjoy=";
   HttpAuthChallengeTokenizer second_challenge(second_challenge_text.begin(),
diff --git a/net/http/http_cache.cc b/net/http/http_cache.cc
index 199074f..fc87738b 100644
--- a/net/http/http_cache.cc
+++ b/net/http/http_cache.cc
@@ -172,14 +172,14 @@
       : operation_(operation),
         transaction_(transaction),
         entry_(entry),
-        backend_(NULL) {}
+        backend_(nullptr) {}
   WorkItem(WorkItemOperation operation,
            Transaction* transaction,
            CompletionOnceCallback callback,
            disk_cache::Backend** backend)
       : operation_(operation),
         transaction_(transaction),
-        entry_(NULL),
+        entry_(nullptr),
         callback_(std::move(callback)),
         backend_(backend) {}
   ~WorkItem() = default;
@@ -206,8 +206,8 @@
   }
 
   WorkItemOperation operation() { return operation_; }
-  void ClearTransaction() { transaction_ = NULL; }
-  void ClearEntry() { entry_ = NULL; }
+  void ClearTransaction() { transaction_ = nullptr; }
+  void ClearEntry() { entry_ = nullptr; }
   void ClearCallback() { callback_.Reset(); }
   bool Matches(Transaction* transaction) const {
     return transaction == transaction_;
@@ -433,7 +433,7 @@
   // Do lazy initialization of disk cache if needed.
   if (!disk_cache_.get()) {
     // We don't care about the result.
-    CreateBackend(NULL, CompletionOnceCallback());
+    CreateBackend(nullptr, CompletionOnceCallback());
   }
 
   HttpCache::Transaction* transaction =
@@ -477,7 +477,7 @@
   // Do lazy initialization of disk cache if needed.
   if (!disk_cache_.get()) {
     // We don't care about the result.
-    CreateBackend(NULL, CompletionOnceCallback());
+    CreateBackend(nullptr, CompletionOnceCallback());
   }
 
   HttpCache::Transaction* new_transaction =
@@ -638,7 +638,7 @@
 
   // This is not a performance critical operation, this is handling an error
   // condition so it is OK to look up the entry again.
-  int rv = DoomEntry(key, NULL);
+  int rv = DoomEntry(key, nullptr);
   DCHECK_EQ(OK, rv);
 }
 
@@ -707,9 +707,9 @@
   // Defer to DoomEntry if there is an active entry, otherwise call
   // AsyncDoomEntry without triggering a callback.
   if (active_entries_.count(key))
-    DoomEntry(key, NULL);
+    DoomEntry(key, nullptr);
   else
-    AsyncDoomEntry(key, NULL);
+    AsyncDoomEntry(key, nullptr);
 }
 
 void HttpCache::FinalizeDoomedEntry(ActiveEntry* entry) {
@@ -1443,18 +1443,18 @@
     }
 
     if (try_restart_requests) {
-      item->NotifyTransaction(ERR_CACHE_RACE, NULL);
+      item->NotifyTransaction(ERR_CACHE_RACE, nullptr);
       continue;
     }
     // At this point item->operation() is anything except Doom.
     if (item->operation() == WI_CREATE_ENTRY) {
       if (result == OK) {
         // Successful OpenOrCreate, Open, or Create followed by a Create.
-        item->NotifyTransaction(ERR_CACHE_CREATE_FAILURE, NULL);
+        item->NotifyTransaction(ERR_CACHE_CREATE_FAILURE, nullptr);
       } else {
         if (op != WI_CREATE_ENTRY && op != WI_OPEN_OR_CREATE_ENTRY) {
           // Failed Open or Doom followed by a Create.
-          item->NotifyTransaction(ERR_CACHE_RACE, NULL);
+          item->NotifyTransaction(ERR_CACHE_RACE, nullptr);
           try_restart_requests = true;
         } else {
           item->NotifyTransaction(result, entry);
@@ -1465,7 +1465,7 @@
     else if (item->operation() == WI_OPEN_OR_CREATE_ENTRY) {
       if ((op == WI_OPEN_ENTRY || op == WI_CREATE_ENTRY) && result != OK) {
         // Failed Open or Create followed by an OpenOrCreate.
-        item->NotifyTransaction(ERR_CACHE_RACE, NULL);
+        item->NotifyTransaction(ERR_CACHE_RACE, nullptr);
         try_restart_requests = true;
       } else {
         item->NotifyTransaction(result, entry);
@@ -1475,7 +1475,7 @@
     else {
       if (op == WI_CREATE_ENTRY && result != OK) {
         // Failed Create followed by an Open.
-        item->NotifyTransaction(ERR_CACHE_RACE, NULL);
+        item->NotifyTransaction(ERR_CACHE_RACE, nullptr);
         try_restart_requests = true;
       } else {
         item->NotifyTransaction(result, entry);
@@ -1533,7 +1533,7 @@
 
   // The cache may be gone when we return from the callback.
   if (!item->DoCallback(result, disk_cache_.get()))
-    item->NotifyTransaction(result, NULL);
+    item->NotifyTransaction(result, nullptr);
 }
 
 }  // namespace net
diff --git a/net/http/http_cache_transaction.cc b/net/http/http_cache_transaction.cc
index 6964c70..bb31e3e 100644
--- a/net/http/http_cache_transaction.cc
+++ b/net/http/http_cache_transaction.cc
@@ -111,11 +111,10 @@
 // If the request includes one of these request headers, then avoid caching
 // to avoid getting confused.
 static const HeaderNameAndValue kPassThroughHeaders[] = {
-  { "if-unmodified-since", NULL },  // causes unexpected 412s
-  { "if-match", NULL },             // causes unexpected 412s
-  { "if-range", NULL },
-  { NULL, NULL }
-};
+    {"if-unmodified-since", nullptr},  // causes unexpected 412s
+    {"if-match", nullptr},             // causes unexpected 412s
+    {"if-range", nullptr},
+    {nullptr, nullptr}};
 
 struct ValidationHeaderInfo {
   const char* request_header_name;
@@ -130,17 +129,15 @@
 // If the request includes one of these request headers, then avoid reusing
 // our cached copy if any.
 static const HeaderNameAndValue kForceFetchHeaders[] = {
-  { "cache-control", "no-cache" },
-  { "pragma", "no-cache" },
-  { NULL, NULL }
-};
+    {"cache-control", "no-cache"},
+    {"pragma", "no-cache"},
+    {nullptr, nullptr}};
 
 // If the request includes one of these request headers, then force our
 // cached copy (if any) to be revalidated before reusing it.
 static const HeaderNameAndValue kForceValidateHeaders[] = {
-  { "cache-control", "max-age=0" },
-  { NULL, NULL }
-};
+    {"cache-control", "max-age=0"},
+    {nullptr, nullptr}};
 
 static bool HeaderMatches(const HttpRequestHeaders& headers,
                           const HeaderNameAndValue* search) {
@@ -167,12 +164,12 @@
 HttpCache::Transaction::Transaction(RequestPriority priority, HttpCache* cache)
     : next_state_(STATE_NONE),
       initial_request_(nullptr),
-      request_(NULL),
+      request_(nullptr),
       priority_(priority),
       cache_(cache->GetWeakPtr()),
-      entry_(NULL),
-      new_entry_(NULL),
-      new_response_(NULL),
+      entry_(nullptr),
+      new_entry_(nullptr),
+      new_response_(nullptr),
       mode_(NONE),
       reading_(false),
       invalid_range_(false),
@@ -197,7 +194,7 @@
       recorded_histograms_(false),
       parallel_writing_pattern_(PARALLEL_WRITING_NONE),
       moved_network_transaction_to_writers_(false),
-      websocket_handshake_stream_base_create_helper_(NULL),
+      websocket_handshake_stream_base_create_helper_(nullptr),
       in_do_loop_(false),
       weak_factory_(this) {
   TRACE_EVENT0("io", "HttpCacheTransaction::Transaction");
@@ -1121,7 +1118,7 @@
   }
 
   // This is only set if we have something to do with the response.
-  range_requested_ = (partial_.get() != NULL);
+  range_requested_ = (partial_.get() != nullptr);
 
   return OK;
 }
@@ -1382,7 +1379,7 @@
     entry_ = new_entry_;
 
   // If there is a failure, the cache should have taken care of new_entry_.
-  new_entry_ = NULL;
+  new_entry_ = nullptr;
 
   if (result == ERR_CACHE_RACE) {
     TransitionToState(STATE_HEADERS_PHASE_CANNOT_PROCEED);
@@ -1767,7 +1764,7 @@
     UpdateCacheEntryStatus(CacheEntryStatus::ENTRY_OTHER);
     SetResponse(HttpResponseInfo());
     ResetNetworkTransaction();
-    new_response_ = NULL;
+    new_response_ = nullptr;
     TransitionToState(STATE_SEND_REQUEST);
     return OK;
   }
@@ -1788,7 +1785,7 @@
   if (mode_ == WRITE && (method_ == "PUT" || method_ == "DELETE")) {
     if (NonErrorResponse(new_response->headers->response_code()) &&
         (entry_ && !entry_->doomed)) {
-      int ret = cache_->DoomEntry(cache_key_, NULL);
+      int ret = cache_->DoomEntry(cache_key_, nullptr);
       DCHECK_EQ(OK, ret);
     }
     // Do not invalidate the entry if its a failed Delete or Put.
@@ -1851,7 +1848,7 @@
 
   if (response_.headers->HasHeaderValue("cache-control", "no-store")) {
     if (!entry_->doomed) {
-      int ret = cache_->DoomEntry(cache_key_, NULL);
+      int ret = cache_->DoomEntry(cache_key_, nullptr);
       DCHECK_EQ(OK, ret);
     }
     TransitionToState(STATE_UPDATE_CACHED_RESPONSE_COMPLETE);
@@ -1909,7 +1906,7 @@
     // the first part to the user.
     if (network_trans_)
       ResetNetworkTransaction();
-    new_response_ = NULL;
+    new_response_ = nullptr;
     TransitionToState(STATE_START_PARTIAL_CACHE_VALIDATION);
     partial_->SetRangeToStartDownload();
     return OK;
@@ -1934,7 +1931,7 @@
   if (method_ == "HEAD") {
     // This response is replacing the cached one.
     DoneWithEntry(false);
-    new_response_ = NULL;
+    new_response_ = nullptr;
     TransitionToState(STATE_FINISH_HEADERS);
     return OK;
   }
@@ -1995,7 +1992,7 @@
   if (net_log_.IsCapturing())
     net_log_.BeginEvent(NetLogEventType::HTTP_CACHE_WRITE_DATA);
   // Truncate the stream.
-  return WriteToEntry(kResponseContentIndex, 0, NULL, 0, io_callback_);
+  return WriteToEntry(kResponseContentIndex, 0, nullptr, 0, io_callback_);
 }
 
 int HttpCache::Transaction::DoTruncateCachedDataComplete(int result) {
@@ -2019,7 +2016,7 @@
 
   if (net_log_.IsCapturing())
     net_log_.BeginEvent(NetLogEventType::HTTP_CACHE_WRITE_INFO);
-  return WriteToEntry(kMetadataIndex, 0, NULL, 0, io_callback_);
+  return WriteToEntry(kMetadataIndex, 0, nullptr, 0, io_callback_);
 }
 
 int HttpCache::Transaction::DoTruncateCachedMetadataComplete(int result) {
@@ -2036,7 +2033,7 @@
 }
 
 int HttpCache::Transaction::DoPartialHeadersReceived() {
-  new_response_ = NULL;
+  new_response_ = nullptr;
 
   if (!partial_) {
     if (entry_ && entry_->disk_entry->GetDataSize(kMetadataIndex) &&
@@ -2421,7 +2418,7 @@
       // The range is invalid or we cannot handle it properly.
       VLOG(1) << "Invalid byte range found.";
       effective_load_flags_ |= LOAD_DISABLE_CACHE;
-      partial_.reset(NULL);
+      partial_.reset(nullptr);
     }
   }
 }
@@ -2640,8 +2637,7 @@
     // Retrieve either the cached response's "etag" or "last-modified" header.
     std::string validator;
     response_.headers->EnumerateHeader(
-        NULL,
-        kValidationHeaders[i].related_response_header_name,
+        nullptr, kValidationHeaders[i].related_response_header_name,
         &validator);
 
     if (response_.headers->response_code() != 200 || truncated_ ||
@@ -2782,9 +2778,9 @@
   // TODO(darin): Or should we use the last?
 
   if (response_.headers->GetHttpVersion() >= HttpVersion(1, 1))
-    response_.headers->EnumerateHeader(NULL, "etag", etag_value);
+    response_.headers->EnumerateHeader(nullptr, "etag", etag_value);
 
-  response_.headers->EnumerateHeader(NULL, "last-modified",
+  response_.headers->EnumerateHeader(nullptr, "last-modified",
                                      last_modified_value);
 
   if (etag_value->empty() && last_modified_value->empty())
@@ -3028,7 +3024,7 @@
   // response from the server (it's not changing its mind midway, right?).
   UpdateCacheEntryStatus(CacheEntryStatus::ENTRY_OTHER);
   DoneWithEntry(mode_ != WRITE);
-  partial_.reset(NULL);
+  partial_.reset(nullptr);
 }
 
 void HttpCache::Transaction::FixHeadersForHead() {
@@ -3202,7 +3198,7 @@
     // DoneWithEntry.
     cache_->DoneWithEntry(entry_, this, true /* entry_is_complete */,
                           partial_ != nullptr);
-    entry_ = NULL;
+    entry_ = nullptr;
     is_sparse_ = false;
     // It's OK to use PartialData::RestoreHeaders here as |restart| is only set
     // when the HttpResponseInfo couldn't even be read, at which point it's
@@ -3238,17 +3234,17 @@
 void HttpCache::Transaction::DoomPartialEntry(bool delete_object) {
   DVLOG(2) << "DoomPartialEntry";
   if (entry_ && !entry_->doomed) {
-    int rv = cache_->DoomEntry(cache_key_, NULL);
+    int rv = cache_->DoomEntry(cache_key_, nullptr);
     DCHECK_EQ(OK, rv);
   }
 
   cache_->DoneWithEntry(entry_, this, false /* entry_is_complete */,
                         partial_ != nullptr);
-  entry_ = NULL;
+  entry_ = nullptr;
   is_sparse_ = false;
   truncated_ = false;
   if (delete_object)
-    partial_.reset(NULL);
+    partial_.reset(nullptr);
 }
 
 int HttpCache::Transaction::DoPartialCacheReadCompleted(int result) {
diff --git a/net/http/http_cache_unittest.cc b/net/http/http_cache_unittest.cc
index 308a9572..9aaf0cad 100644
--- a/net/http/http_cache_unittest.cc
+++ b/net/http/http_cache_unittest.cc
@@ -576,8 +576,8 @@
 void CreateTruncatedEntry(std::string raw_headers, MockHttpCache* cache) {
   // Create a disk cache entry that stores an incomplete resource.
   disk_cache::Entry* entry;
-  ASSERT_TRUE(cache->CreateBackendEntry(kRangeGET_TransactionOK.url, &entry,
-                                        NULL));
+  ASSERT_TRUE(
+      cache->CreateBackendEntry(kRangeGET_TransactionOK.url, &entry, nullptr));
 
   raw_headers =
       HttpUtil::AssembleRawHeaders(raw_headers.data(), raw_headers.size());
@@ -5106,14 +5106,14 @@
 
   // We will control the network layer's responses for |kUrl| using
   // |mock_network_response|.
-  MockTransaction mock_network_response = { 0 };
+  MockTransaction mock_network_response = {nullptr};
   mock_network_response.url = kUrl;
   AddMockTransaction(&mock_network_response);
 
   // Request |kUrl| for the first time. It should hit the network and
   // receive |kNetResponse1|, which it saves into the HTTP cache.
 
-  MockTransaction request = { 0 };
+  MockTransaction request = {nullptr};
   request.url = kUrl;
   request.method = "GET";
   request.request_headers = "";
@@ -5297,11 +5297,11 @@
 
   // We will control the network layer's responses for |kUrl| using
   // |mock_network_response|.
-  MockTransaction mock_network_response = { 0 };
+  MockTransaction mock_network_response = {nullptr};
   mock_network_response.url = kUrl;
   AddMockTransaction(&mock_network_response);
 
-  MockTransaction request = { 0 };
+  MockTransaction request = {nullptr};
   request.url = kUrl;
   request.method = "GET";
   request.request_headers = kExtraRequestHeaders;
@@ -5341,11 +5341,11 @@
 
   // We will control the network layer's responses for |kUrl| using
   // |mock_network_response|.
-  MockTransaction mock_network_response = { 0 };
+  MockTransaction mock_network_response = {nullptr};
   mock_network_response.url = kUrl;
   AddMockTransaction(&mock_network_response);
 
-  MockTransaction request = { 0 };
+  MockTransaction request = {nullptr};
   request.url = kUrl;
   request.method = "GET";
   request.request_headers = kExtraRequestHeaders;
@@ -5601,7 +5601,8 @@
   request.upload_data_stream = &upload_data_stream;
 
   // Populate the cache.
-  RunTransactionTestWithRequest(cache.http_cache(), transaction, request, NULL);
+  RunTransactionTestWithRequest(cache.http_cache(), transaction, request,
+                                nullptr);
 
   EXPECT_EQ(1, cache.network_layer()->transaction_count());
   EXPECT_EQ(0, cache.disk_cache()->open_count());
@@ -5609,7 +5610,8 @@
 
   // Load from cache.
   request.load_flags |= LOAD_ONLY_FROM_CACHE | LOAD_SKIP_CACHE_VALIDATION;
-  RunTransactionTestWithRequest(cache.http_cache(), transaction, request, NULL);
+  RunTransactionTestWithRequest(cache.http_cache(), transaction, request,
+                                nullptr);
 
   EXPECT_EQ(1, cache.network_layer()->transaction_count());
   EXPECT_EQ(1, cache.disk_cache()->open_count());
@@ -5639,7 +5641,8 @@
   request.upload_data_stream = &upload_data_stream;
 
   // Attempt to populate the cache.
-  RunTransactionTestWithRequest(cache.http_cache(), transaction, request, NULL);
+  RunTransactionTestWithRequest(cache.http_cache(), transaction, request,
+                                nullptr);
 
   EXPECT_EQ(1, cache.network_layer()->transaction_count());
   EXPECT_EQ(0, cache.disk_cache()->open_count());
@@ -5659,7 +5662,7 @@
   MockHttpRequest req1(transaction);
   req1.upload_data_stream = &upload_data_stream;
 
-  RunTransactionTestWithRequest(cache.http_cache(), transaction, req1, NULL);
+  RunTransactionTestWithRequest(cache.http_cache(), transaction, req1, nullptr);
 
   EXPECT_EQ(1, cache.network_layer()->transaction_count());
   EXPECT_EQ(0, cache.disk_cache()->open_count());
@@ -5668,7 +5671,7 @@
   transaction.method = "GET";
   MockHttpRequest req2(transaction);
 
-  RunTransactionTestWithRequest(cache.http_cache(), transaction, req2, NULL);
+  RunTransactionTestWithRequest(cache.http_cache(), transaction, req2, nullptr);
 
   EXPECT_EQ(2, cache.network_layer()->transaction_count());
   EXPECT_EQ(0, cache.disk_cache()->open_count());
@@ -5684,7 +5687,7 @@
   MockHttpRequest req1(transaction);
 
   // Attempt to populate the cache.
-  RunTransactionTestWithRequest(cache.http_cache(), transaction, req1, NULL);
+  RunTransactionTestWithRequest(cache.http_cache(), transaction, req1, nullptr);
 
   EXPECT_EQ(1, cache.network_layer()->transaction_count());
   EXPECT_EQ(0, cache.disk_cache()->open_count());
@@ -5700,13 +5703,13 @@
   MockHttpRequest req2(transaction);
   req2.upload_data_stream = &upload_data_stream;
 
-  RunTransactionTestWithRequest(cache.http_cache(), transaction, req2, NULL);
+  RunTransactionTestWithRequest(cache.http_cache(), transaction, req2, nullptr);
 
   EXPECT_EQ(2, cache.network_layer()->transaction_count());
   EXPECT_EQ(0, cache.disk_cache()->open_count());
   EXPECT_EQ(2, cache.disk_cache()->create_count());
 
-  RunTransactionTestWithRequest(cache.http_cache(), transaction, req1, NULL);
+  RunTransactionTestWithRequest(cache.http_cache(), transaction, req1, nullptr);
 
   EXPECT_EQ(3, cache.network_layer()->transaction_count());
   EXPECT_EQ(0, cache.disk_cache()->open_count());
@@ -5730,12 +5733,13 @@
   req1.top_frame_origin = origin_a;
 
   // Attempt to populate the cache.
-  RunTransactionTestWithRequest(cache.http_cache(), transaction, req1, NULL);
+  RunTransactionTestWithRequest(cache.http_cache(), transaction, req1, nullptr);
 
   // Same for a different origin.
   MockHttpRequest req1b(transaction);
   req1b.top_frame_origin = origin_b;
-  RunTransactionTestWithRequest(cache.http_cache(), transaction, req1b, NULL);
+  RunTransactionTestWithRequest(cache.http_cache(), transaction, req1b,
+                                nullptr);
 
   EXPECT_EQ(2, cache.network_layer()->transaction_count());
   EXPECT_EQ(0, cache.disk_cache()->open_count());
@@ -5752,7 +5756,7 @@
   req2.upload_data_stream = &upload_data_stream;
   req2.top_frame_origin = origin_a;
 
-  RunTransactionTestWithRequest(cache.http_cache(), transaction, req2, NULL);
+  RunTransactionTestWithRequest(cache.http_cache(), transaction, req2, nullptr);
 
   EXPECT_EQ(3, cache.network_layer()->transaction_count());
   EXPECT_EQ(0, cache.disk_cache()->open_count());
@@ -5760,13 +5764,14 @@
 
   // req1b should still be cached, since it has a different top-level frame
   // origin.
-  RunTransactionTestWithRequest(cache.http_cache(), transaction, req1b, NULL);
+  RunTransactionTestWithRequest(cache.http_cache(), transaction, req1b,
+                                nullptr);
   EXPECT_EQ(3, cache.network_layer()->transaction_count());
   EXPECT_EQ(1, cache.disk_cache()->open_count());
   EXPECT_EQ(3, cache.disk_cache()->create_count());
 
   // req1 should not be cached after the POST.
-  RunTransactionTestWithRequest(cache.http_cache(), transaction, req1, NULL);
+  RunTransactionTestWithRequest(cache.http_cache(), transaction, req1, nullptr);
   EXPECT_EQ(4, cache.network_layer()->transaction_count());
   EXPECT_EQ(1, cache.disk_cache()->open_count());
   EXPECT_EQ(4, cache.disk_cache()->create_count());
@@ -5784,7 +5789,7 @@
   MockHttpRequest req1(transaction);
 
   // Attempt to populate the cache.
-  RunTransactionTestWithRequest(cache.http_cache(), transaction, req1, NULL);
+  RunTransactionTestWithRequest(cache.http_cache(), transaction, req1, nullptr);
 
   EXPECT_EQ(1, cache.network_layer()->transaction_count());
   EXPECT_EQ(0, cache.disk_cache()->open_count());
@@ -5800,13 +5805,13 @@
   MockHttpRequest req2(transaction);
   req2.upload_data_stream = &upload_data_stream;
 
-  RunTransactionTestWithRequest(cache.http_cache(), transaction, req2, NULL);
+  RunTransactionTestWithRequest(cache.http_cache(), transaction, req2, nullptr);
 
   EXPECT_EQ(2, cache.network_layer()->transaction_count());
   EXPECT_EQ(0, cache.disk_cache()->open_count());
   EXPECT_EQ(1, cache.disk_cache()->create_count());
 
-  RunTransactionTestWithRequest(cache.http_cache(), transaction, req1, NULL);
+  RunTransactionTestWithRequest(cache.http_cache(), transaction, req1, nullptr);
 
   EXPECT_EQ(3, cache.network_layer()->transaction_count());
   EXPECT_EQ(0, cache.disk_cache()->open_count());
@@ -5832,7 +5837,7 @@
   MockHttpRequest req(transaction);
   req.upload_data_stream = &upload_data_stream;
 
-  RunTransactionTestWithRequest(cache.http_cache(), transaction, req, NULL);
+  RunTransactionTestWithRequest(cache.http_cache(), transaction, req, nullptr);
 
   RemoveMockTransaction(&transaction);
 }
@@ -5846,7 +5851,7 @@
   MockHttpRequest req1(transaction);
 
   // Attempt to populate the cache.
-  RunTransactionTestWithRequest(cache.http_cache(), transaction, req1, NULL);
+  RunTransactionTestWithRequest(cache.http_cache(), transaction, req1, nullptr);
 
   EXPECT_EQ(1, cache.network_layer()->transaction_count());
   EXPECT_EQ(0, cache.disk_cache()->open_count());
@@ -5862,13 +5867,13 @@
   MockHttpRequest req2(transaction);
   req2.upload_data_stream = &upload_data_stream;
 
-  RunTransactionTestWithRequest(cache.http_cache(), transaction, req2, NULL);
+  RunTransactionTestWithRequest(cache.http_cache(), transaction, req2, nullptr);
 
   EXPECT_EQ(2, cache.network_layer()->transaction_count());
   EXPECT_EQ(0, cache.disk_cache()->open_count());
   EXPECT_EQ(2, cache.disk_cache()->create_count());
 
-  RunTransactionTestWithRequest(cache.http_cache(), transaction, req1, NULL);
+  RunTransactionTestWithRequest(cache.http_cache(), transaction, req1, nullptr);
 
   EXPECT_EQ(2, cache.network_layer()->transaction_count());
   EXPECT_EQ(1, cache.disk_cache()->open_count());
@@ -6173,7 +6178,8 @@
   request.upload_data_stream = &upload_data_stream;
 
   // Attempt to populate the cache.
-  RunTransactionTestWithRequest(cache.http_cache(), transaction, request, NULL);
+  RunTransactionTestWithRequest(cache.http_cache(), transaction, request,
+                                nullptr);
 
   EXPECT_EQ(1, cache.network_layer()->transaction_count());
   EXPECT_EQ(0, cache.disk_cache()->open_count());
@@ -6188,7 +6194,7 @@
   MockHttpRequest req1(transaction);
 
   // Attempt to populate the cache.
-  RunTransactionTestWithRequest(cache.http_cache(), transaction, req1, NULL);
+  RunTransactionTestWithRequest(cache.http_cache(), transaction, req1, nullptr);
 
   EXPECT_EQ(1, cache.network_layer()->transaction_count());
   EXPECT_EQ(0, cache.disk_cache()->open_count());
@@ -6203,13 +6209,13 @@
   MockHttpRequest req2(transaction);
   req2.upload_data_stream = &upload_data_stream;
 
-  RunTransactionTestWithRequest(cache.http_cache(), transaction, req2, NULL);
+  RunTransactionTestWithRequest(cache.http_cache(), transaction, req2, nullptr);
 
   EXPECT_EQ(2, cache.network_layer()->transaction_count());
   EXPECT_EQ(1, cache.disk_cache()->open_count());
   EXPECT_EQ(1, cache.disk_cache()->create_count());
 
-  RunTransactionTestWithRequest(cache.http_cache(), transaction, req1, NULL);
+  RunTransactionTestWithRequest(cache.http_cache(), transaction, req1, nullptr);
 
   EXPECT_EQ(3, cache.network_layer()->transaction_count());
   EXPECT_EQ(1, cache.disk_cache()->open_count());
@@ -6225,7 +6231,7 @@
   MockHttpRequest req1(transaction);
 
   // Attempt to populate the cache.
-  RunTransactionTestWithRequest(cache.http_cache(), transaction, req1, NULL);
+  RunTransactionTestWithRequest(cache.http_cache(), transaction, req1, nullptr);
 
   EXPECT_EQ(1, cache.network_layer()->transaction_count());
   EXPECT_EQ(0, cache.disk_cache()->open_count());
@@ -6241,13 +6247,13 @@
   MockHttpRequest req2(transaction);
   req2.upload_data_stream = &upload_data_stream;
 
-  RunTransactionTestWithRequest(cache.http_cache(), transaction, req2, NULL);
+  RunTransactionTestWithRequest(cache.http_cache(), transaction, req2, nullptr);
 
   EXPECT_EQ(2, cache.network_layer()->transaction_count());
   EXPECT_EQ(1, cache.disk_cache()->open_count());
   EXPECT_EQ(1, cache.disk_cache()->create_count());
 
-  RunTransactionTestWithRequest(cache.http_cache(), transaction, req1, NULL);
+  RunTransactionTestWithRequest(cache.http_cache(), transaction, req1, nullptr);
 
   EXPECT_EQ(3, cache.network_layer()->transaction_count());
   EXPECT_EQ(1, cache.disk_cache()->open_count());
@@ -6264,7 +6270,7 @@
   MockHttpRequest req1(transaction);
 
   // Attempt to populate the cache.
-  RunTransactionTestWithRequest(cache.http_cache(), transaction, req1, NULL);
+  RunTransactionTestWithRequest(cache.http_cache(), transaction, req1, nullptr);
 
   EXPECT_EQ(1, cache.network_layer()->transaction_count());
   EXPECT_EQ(0, cache.disk_cache()->open_count());
@@ -6280,13 +6286,13 @@
   MockHttpRequest req2(transaction);
   req2.upload_data_stream = &upload_data_stream;
 
-  RunTransactionTestWithRequest(cache.http_cache(), transaction, req2, NULL);
+  RunTransactionTestWithRequest(cache.http_cache(), transaction, req2, nullptr);
 
   EXPECT_EQ(2, cache.network_layer()->transaction_count());
   EXPECT_EQ(1, cache.disk_cache()->open_count());
   EXPECT_EQ(1, cache.disk_cache()->create_count());
 
-  RunTransactionTestWithRequest(cache.http_cache(), transaction, req1, NULL);
+  RunTransactionTestWithRequest(cache.http_cache(), transaction, req1, nullptr);
 
   EXPECT_EQ(2, cache.network_layer()->transaction_count());
   EXPECT_EQ(2, cache.disk_cache()->open_count());
@@ -6310,7 +6316,8 @@
   request.upload_data_stream = &upload_data_stream;
 
   // Attempt to populate the cache.
-  RunTransactionTestWithRequest(cache.http_cache(), transaction, request, NULL);
+  RunTransactionTestWithRequest(cache.http_cache(), transaction, request,
+                                nullptr);
 
   EXPECT_EQ(1, cache.network_layer()->transaction_count());
   EXPECT_EQ(0, cache.disk_cache()->open_count());
@@ -6325,7 +6332,7 @@
   MockHttpRequest req1(transaction);
 
   // Attempt to populate the cache.
-  RunTransactionTestWithRequest(cache.http_cache(), transaction, req1, NULL);
+  RunTransactionTestWithRequest(cache.http_cache(), transaction, req1, nullptr);
 
   EXPECT_EQ(1, cache.network_layer()->transaction_count());
   EXPECT_EQ(0, cache.disk_cache()->open_count());
@@ -6340,13 +6347,13 @@
   MockHttpRequest req2(transaction);
   req2.upload_data_stream = &upload_data_stream;
 
-  RunTransactionTestWithRequest(cache.http_cache(), transaction, req2, NULL);
+  RunTransactionTestWithRequest(cache.http_cache(), transaction, req2, nullptr);
 
   EXPECT_EQ(2, cache.network_layer()->transaction_count());
   EXPECT_EQ(1, cache.disk_cache()->open_count());
   EXPECT_EQ(1, cache.disk_cache()->create_count());
 
-  RunTransactionTestWithRequest(cache.http_cache(), transaction, req1, NULL);
+  RunTransactionTestWithRequest(cache.http_cache(), transaction, req1, nullptr);
 
   EXPECT_EQ(3, cache.network_layer()->transaction_count());
   EXPECT_EQ(1, cache.disk_cache()->open_count());
@@ -6565,7 +6572,7 @@
   MockTransaction transaction(kRangeGET_TransactionOK);
   AddMockTransaction(&transaction);
   transaction.request_headers = EXTRA_HEADER;
-  transaction.handler = NULL;
+  transaction.handler = nullptr;
   RunTransactionTest(cache.http_cache(), transaction);
 
   EXPECT_EQ(1, cache.network_layer()->transaction_count());
@@ -6777,7 +6784,7 @@
   transaction.response_headers = "ETag: \"foo\"\n"
                                  "Accept-Ranges: bytes\n"
                                  "Content-Range: bytes 40-49/80\n";
-  transaction.handler = NULL;
+  transaction.handler = nullptr;
   RunTransactionTestWithResponse(cache.http_cache(), transaction, &headers);
 
   EXPECT_EQ(1, cache.network_layer()->transaction_count());
@@ -7375,7 +7382,7 @@
   transaction.status = "HTTP/1.1 301 Moved Permanently";
   transaction.response_headers = "Location: http://www.bar.com/\n";
   transaction.data = "";
-  transaction.handler = NULL;
+  transaction.handler = nullptr;
 
   // Write to the cache.
   RunTransactionTest(cache.http_cache(), transaction);
@@ -7631,8 +7638,8 @@
 
   // Create a disk cache entry that stores 206 headers while not being sparse.
   disk_cache::Entry* entry;
-  ASSERT_TRUE(cache.CreateBackendEntry(kSimpleGET_Transaction.url, &entry,
-                                       NULL));
+  ASSERT_TRUE(
+      cache.CreateBackendEntry(kSimpleGET_Transaction.url, &entry, nullptr));
 
   std::string raw_headers(kRangeGET_TransactionOK.status);
   raw_headers.append("\n");
@@ -7679,8 +7686,8 @@
 
   // Create a disk cache entry that stores 206 headers while not being sparse.
   disk_cache::Entry* entry;
-  ASSERT_TRUE(cache.CreateBackendEntry(kRangeGET_TransactionOK.url, &entry,
-                                       NULL));
+  ASSERT_TRUE(
+      cache.CreateBackendEntry(kRangeGET_TransactionOK.url, &entry, nullptr));
 
   std::string raw_headers(kRangeGET_TransactionOK.status);
   raw_headers.append("\n");
@@ -7720,8 +7727,8 @@
 
   // Create a disk cache entry that stores 206 headers.
   disk_cache::Entry* entry;
-  ASSERT_TRUE(cache.CreateBackendEntry(kSimpleGET_Transaction.url, &entry,
-                                       NULL));
+  ASSERT_TRUE(
+      cache.CreateBackendEntry(kSimpleGET_Transaction.url, &entry, nullptr));
 
   // Make sure that the headers cannot be validated with the server.
   std::string raw_headers(kRangeGET_TransactionOK.status);
@@ -8088,7 +8095,7 @@
   std::string headers;
 
   MockTransaction transaction(kRangeGET_TransactionOK);
-  transaction.handler = NULL;
+  transaction.handler = nullptr;
   transaction.response_headers = "Content-Range: bytes 40-49/45\n"
                                  "Content-Length: 10\n";
   AddMockTransaction(&transaction);
@@ -8116,7 +8123,7 @@
   std::string headers;
 
   MockTransaction transaction(kRangeGET_TransactionOK);
-  transaction.handler = NULL;
+  transaction.handler = nullptr;
   transaction.response_headers = "Content-Range: bytes 40-49/80\n"
                                  "Content-Length: 20\n";
   AddMockTransaction(&transaction);
@@ -8145,7 +8152,7 @@
   std::string headers;
 
   MockTransaction transaction(kRangeGET_TransactionOK);
-  transaction.handler = NULL;
+  transaction.handler = nullptr;
   transaction.request_headers = "Range: bytes = 50-59\r\n" EXTRA_HEADER;
   std::string response_headers(transaction.response_headers);
   response_headers.append("Content-Range: bytes 50-59/160\n");
@@ -8185,7 +8192,7 @@
   std::string headers;
 
   MockTransaction transaction(kRangeGET_TransactionOK);
-  transaction.handler = NULL;
+  transaction.handler = nullptr;
   transaction.request_headers = "Range: bytes = 4294967288-4294967297\r\n"
                                 EXTRA_HEADER;
   transaction.response_headers =
@@ -8283,7 +8290,7 @@
   MockTransaction transaction(kRangeGET_TransactionOK);
   transaction.request_headers = "Range: bytes = 40-49\r\n" EXTRA_HEADER;
   transaction.data = "rg: 40-";  // Less than expected.
-  transaction.handler = NULL;
+  transaction.handler = nullptr;
   std::string headers(transaction.response_headers);
   headers.append("Content-Range: bytes 40-49/80\n");
   transaction.response_headers = headers.c_str();
@@ -8357,8 +8364,8 @@
 TEST_F(HttpCacheTest, WriteResponseInfo_Truncated) {
   MockHttpCache cache;
   disk_cache::Entry* entry;
-  ASSERT_TRUE(cache.CreateBackendEntry("http://www.google.com", &entry,
-                                       NULL));
+  ASSERT_TRUE(
+      cache.CreateBackendEntry("http://www.google.com", &entry, nullptr));
 
   std::string headers("HTTP/1.1 200 OK");
   headers = HttpUtil::AssembleRawHeaders(headers.data(), headers.size());
@@ -9187,7 +9194,7 @@
     EXPECT_EQ(info->headers->response_code(), 301);
 
     std::string location;
-    info->headers->EnumerateHeader(NULL, "Location", &location);
+    info->headers->EnumerateHeader(nullptr, "Location", &location);
     EXPECT_EQ(location, "http://www.bar.com/");
 
     // Mark the transaction as completed so it is cached.
@@ -9221,7 +9228,7 @@
     EXPECT_EQ(info->headers->response_code(), 301);
 
     std::string location;
-    info->headers->EnumerateHeader(NULL, "Location", &location);
+    info->headers->EnumerateHeader(nullptr, "Location", &location);
     EXPECT_EQ(location, "http://www.bar.com/");
 
     // Mark the transaction as completed so it is cached.
@@ -9447,14 +9454,14 @@
   const char kUrl[] = "http://foobar";
   const char kData[] = "body";
 
-  MockTransaction mock_network_response = { 0 };
+  MockTransaction mock_network_response = {nullptr};
   mock_network_response.url = kUrl;
 
   AddMockTransaction(&mock_network_response);
 
   // Request |kUrl|, causing |kNetResponse1| to be written to the cache.
 
-  MockTransaction request = { 0 };
+  MockTransaction request = {nullptr};
   request.url = kUrl;
   request.method = "GET";
   request.request_headers = "\r\n";
@@ -9634,11 +9641,11 @@
   HttpResponseInfo response;
   RunTransactionTestWithResponseInfo(cache.http_cache(), kSimpleGET_Transaction,
                                      &response);
-  EXPECT_TRUE(response.metadata.get() == NULL);
+  EXPECT_TRUE(response.metadata.get() == nullptr);
 
   // Trivial call.
   cache.http_cache()->WriteMetadata(GURL("foo"), DEFAULT_PRIORITY, Time::Now(),
-                                    NULL, 0);
+                                    nullptr, 0);
 
   // Write meta data to the same entry.
   scoped_refptr<IOBufferWithSize> buf =
@@ -9650,14 +9657,14 @@
                                     buf.get(), buf->size());
 
   // Release the buffer before the operation takes place.
-  buf = NULL;
+  buf = nullptr;
 
   // Makes sure we finish pending operations.
   base::RunLoop().RunUntilIdle();
 
   RunTransactionTestWithResponseInfo(cache.http_cache(), kSimpleGET_Transaction,
                                      &response);
-  ASSERT_TRUE(response.metadata.get() != NULL);
+  ASSERT_TRUE(response.metadata.get() != nullptr);
   EXPECT_EQ(50, response.metadata->size());
   EXPECT_EQ(0, strcmp(response.metadata->data(), "Hi there"));
 
@@ -9677,11 +9684,11 @@
   HttpResponseInfo response;
   RunTransactionTestWithResponseInfo(cache.http_cache(), kSimpleGET_Transaction,
                                      &response);
-  EXPECT_TRUE(response.metadata.get() == NULL);
+  EXPECT_TRUE(response.metadata.get() == nullptr);
 
   // Trivial call.
   cache.http_cache()->WriteMetadata(GURL("foo"), DEFAULT_PRIORITY, Time::Now(),
-                                    NULL, 0);
+                                    nullptr, 0);
 
   // Write meta data to the same entry.
   scoped_refptr<IOBufferWithSize> buf =
@@ -9693,14 +9700,14 @@
                                     buf.get(), buf->size());
 
   // Release the buffer before the operation takes place.
-  buf = NULL;
+  buf = nullptr;
 
   // Makes sure we finish pending operations.
   base::RunLoop().RunUntilIdle();
 
   RunTransactionTestWithResponseInfo(cache.http_cache(), kSimpleGET_Transaction,
                                      &response);
-  ASSERT_TRUE(response.metadata.get() == NULL);
+  ASSERT_TRUE(response.metadata.get() == nullptr);
 
   EXPECT_EQ(1, cache.network_layer()->transaction_count());
   EXPECT_EQ(2, cache.disk_cache()->open_count());
@@ -9718,7 +9725,7 @@
   HttpResponseInfo response;
   RunTransactionTestWithResponseInfo(cache.http_cache(), kSimpleGET_Transaction,
                                      &response);
-  EXPECT_TRUE(response.metadata.get() == NULL);
+  EXPECT_TRUE(response.metadata.get() == nullptr);
 
   // Attempt to write meta data to the same entry.
   scoped_refptr<IOBufferWithSize> buf =
@@ -9736,7 +9743,7 @@
 
   RunTransactionTestWithResponseInfo(cache.http_cache(), kSimpleGET_Transaction,
                                      &response);
-  EXPECT_TRUE(response.metadata.get() == NULL);
+  EXPECT_TRUE(response.metadata.get() == nullptr);
 
   EXPECT_EQ(1, cache.network_layer()->transaction_count());
   EXPECT_EQ(2, cache.disk_cache()->open_count());
@@ -9889,7 +9896,7 @@
   HttpResponseInfo response;
   RunTransactionTestWithResponseInfo(cache.http_cache(),
                                      kTypicalGET_Transaction, &response);
-  EXPECT_TRUE(response.metadata.get() == NULL);
+  EXPECT_TRUE(response.metadata.get() == nullptr);
 
   // Write meta data to the same entry.
   scoped_refptr<IOBufferWithSize> buf =
@@ -9908,7 +9915,7 @@
   trans1.load_flags = LOAD_ONLY_FROM_CACHE | LOAD_SKIP_CACHE_VALIDATION;
 
   RunTransactionTestWithResponseInfo(cache.http_cache(), trans1, &response);
-  ASSERT_TRUE(response.metadata.get() != NULL);
+  ASSERT_TRUE(response.metadata.get() != nullptr);
   EXPECT_EQ(50, response.metadata->size());
   EXPECT_EQ(0, strcmp(response.metadata->data(), "Hi there"));
 
@@ -9922,9 +9929,9 @@
   trans1.status = "HTTP/1.1 304 Not Modified";
   AddMockTransaction(&trans1);
 
-  response.metadata = NULL;
+  response.metadata = nullptr;
   RunTransactionTestWithResponseInfo(cache.http_cache(), trans1, &response);
-  EXPECT_TRUE(response.metadata.get() != NULL);
+  EXPECT_TRUE(response.metadata.get() != nullptr);
 
   EXPECT_EQ(2, cache.network_layer()->transaction_count());
   EXPECT_EQ(3, cache.disk_cache()->open_count());
@@ -9936,7 +9943,7 @@
   MockTransaction trans2(kTypicalGET_Transaction);
   trans2.load_flags = LOAD_VALIDATE_CACHE;
   RunTransactionTestWithResponseInfo(cache.http_cache(), trans2, &response);
-  EXPECT_TRUE(response.metadata.get() == NULL);
+  EXPECT_TRUE(response.metadata.get() == nullptr);
 
   EXPECT_EQ(3, cache.network_layer()->transaction_count());
   EXPECT_EQ(4, cache.disk_cache()->open_count());
diff --git a/net/http/http_cache_writers.cc b/net/http/http_cache_writers.cc
index 6842520d..c20d5d3 100644
--- a/net/http/http_cache_writers.cc
+++ b/net/http/http_cache_writers.cc
@@ -361,7 +361,7 @@
   // Save the callback as |this| may be destroyed when |cache_callback_| is run.
   // Note that |callback_| is intentionally reset even if it is not run.
   CompletionOnceCallback callback = std::move(callback_);
-  read_buf_ = NULL;
+  read_buf_ = nullptr;
   DCHECK(!all_writers_.empty() || cache_callback_);
   if (cache_callback_)
     std::move(cache_callback_).Run();
diff --git a/net/http/http_network_layer.cc b/net/http/http_network_layer.cc
index 5a43fd3..ab48161 100644
--- a/net/http/http_network_layer.cc
+++ b/net/http/http_network_layer.cc
@@ -50,7 +50,7 @@
 }
 
 HttpCache* HttpNetworkLayer::GetCache() {
-  return NULL;
+  return nullptr;
 }
 
 HttpNetworkSession* HttpNetworkLayer::GetSession() {
diff --git a/net/http/http_network_layer_unittest.cc b/net/http/http_network_layer_unittest.cc
index 3871fb5d..0f651458 100644
--- a/net/http/http_network_layer_unittest.cc
+++ b/net/http/http_network_layer_unittest.cc
@@ -282,7 +282,7 @@
   std::unique_ptr<HttpTransaction> trans;
   int rv = factory_->CreateTransaction(DEFAULT_PRIORITY, &trans);
   EXPECT_THAT(rv, IsOk());
-  EXPECT_TRUE(trans.get() != NULL);
+  EXPECT_TRUE(trans.get() != nullptr);
 }
 
 TEST_F(HttpNetworkLayerTest, Suspend) {
@@ -297,7 +297,7 @@
   rv = factory_->CreateTransaction(DEFAULT_PRIORITY, &trans);
   EXPECT_THAT(rv, IsError(ERR_NETWORK_IO_SUSPENDED));
 
-  ASSERT_TRUE(trans == NULL);
+  ASSERT_TRUE(trans == nullptr);
 
   factory_->OnResume();
 
diff --git a/net/http/http_network_session.cc b/net/http/http_network_session.cc
index 6b0db6c..3a0f61a 100644
--- a/net/http/http_network_session.cc
+++ b/net/http/http_network_session.cc
@@ -516,7 +516,7 @@
       NOTREACHED();
       break;
   }
-  return NULL;
+  return nullptr;
 }
 
 void HttpNetworkSession::OnMemoryPressure(
diff --git a/net/http/http_network_transaction.cc b/net/http/http_network_transaction.cc
index 359d488..8f6711a 100644
--- a/net/http/http_network_transaction.cc
+++ b/net/http/http_network_transaction.cc
@@ -102,7 +102,7 @@
       io_callback_(base::BindRepeating(&HttpNetworkTransaction::OnIOComplete,
                                        base::Unretained(this))),
       session_(session),
-      request_(NULL),
+      request_(nullptr),
       priority_(priority),
       headers_valid_(false),
       can_send_early_data_(false),
@@ -119,7 +119,7 @@
       establishing_tunnel_(false),
       enable_ip_based_pooling_(true),
       enable_alternative_services_(true),
-      websocket_handshake_stream_base_create_helper_(NULL),
+      websocket_handshake_stream_base_create_helper_(nullptr),
       net_error_details_(),
       retry_attempts_(0),
       num_restarts_(0),
@@ -275,14 +275,14 @@
     // In this case, we've gathered credentials for use with proxy
     // authentication of a tunnel.
     DCHECK_EQ(STATE_CREATE_STREAM_COMPLETE, next_state_);
-    DCHECK(stream_request_ != NULL);
-    auth_controllers_[target] = NULL;
+    DCHECK(stream_request_ != nullptr);
+    auth_controllers_[target] = nullptr;
     ResetStateForRestart();
     rv = stream_request_->RestartTunnelWithProxyAuth();
   } else {
     // In this case, we've gathered credentials for the server or the proxy
     // but it is not during the tunneling phase.
-    DCHECK(stream_request_ == NULL);
+    DCHECK(stream_request_ == nullptr);
     PrepareForAuthRestart(target);
     rv = DoLoop(OK);
     // Note: If an error is encountered while draining the old response body, no
@@ -335,7 +335,7 @@
   if (stream_.get()) {
     total_received_bytes_ += stream_->GetTotalReceivedBytes();
     total_sent_bytes_ += stream_->GetTotalSentBytes();
-    HttpStream* new_stream = NULL;
+    HttpStream* new_stream = nullptr;
     if (keep_alive && stream_->CanReuseConnection()) {
       // We should call connection_->set_idle_time(), but this doesn't occur
       // often enough to be worth the trouble.
@@ -1279,7 +1279,7 @@
 int HttpNetworkTransaction::DoReadBody() {
   DCHECK(read_buf_.get());
   DCHECK_GT(read_buf_len_, 0);
-  DCHECK(stream_ != NULL);
+  DCHECK(stream_ != nullptr);
 
   next_state_ = STATE_READ_BODY_COMPLETE;
   return stream_->ReadResponseBody(
@@ -1329,7 +1329,7 @@
   }
 
   // Clear these to avoid leaving around old state.
-  read_buf_ = NULL;
+  read_buf_ = nullptr;
   read_buf_len_ = 0;
 
   return result;
@@ -1736,7 +1736,7 @@
   send_end_time_ = base::TimeTicks();
 
   pending_auth_target_ = HttpAuth::AUTH_NONE;
-  read_buf_ = NULL;
+  read_buf_ = nullptr;
   read_buf_len_ = 0;
   headers_valid_ = false;
   request_headers_.Clear();
@@ -1763,7 +1763,7 @@
 
 bool HttpNetworkTransaction::ShouldResendRequest() const {
   bool connection_is_proven = stream_->IsConnectionReused();
-  bool has_received_headers = GetResponseHeaders() != NULL;
+  bool has_received_headers = GetResponseHeaders() != nullptr;
 
   // NOTE: we resend a request only if we reused a keep-alive connection.
   // This automatically prevents an infinite resend loop because we'll run
diff --git a/net/http/http_network_transaction_ssl_unittest.cc b/net/http/http_network_transaction_ssl_unittest.cc
index 837fd08..fa77814 100644
--- a/net/http/http_network_transaction_ssl_unittest.cc
+++ b/net/http/http_network_transaction_ssl_unittest.cc
@@ -106,7 +106,7 @@
 };
 
 TEST_F(HttpNetworkTransactionSSLTest, ChannelID) {
-  ChannelIDService channel_id_service(new DefaultChannelIDStore(NULL));
+  ChannelIDService channel_id_service(new DefaultChannelIDStore(nullptr));
   session_context_.channel_id_service = &channel_id_service;
 
   HttpNetworkSession::Params params;
diff --git a/net/http/http_network_transaction_unittest.cc b/net/http/http_network_transaction_unittest.cc
index 0cad95cae..816e546d 100644
--- a/net/http/http_network_transaction_unittest.cc
+++ b/net/http/http_network_transaction_unittest.cc
@@ -697,21 +697,21 @@
     : ParentPool(0,
                  0,
                  base::TimeDelta(),
-                 NULL,
+                 nullptr,
                  host_resolver,
-                 NULL,
-                 NULL,
-                 NULL,
-                 NULL,
-                 NULL,
-                 NULL,
-                 NULL,
-                 NULL,
-                 NULL,
-                 NULL,
-                 NULL,
-                 NULL,
-                 NULL) {}
+                 nullptr,
+                 nullptr,
+                 nullptr,
+                 nullptr,
+                 nullptr,
+                 nullptr,
+                 nullptr,
+                 nullptr,
+                 nullptr,
+                 nullptr,
+                 nullptr,
+                 nullptr,
+                 nullptr) {}
 
 //-----------------------------------------------------------------------------
 
@@ -1765,7 +1765,7 @@
   spdy::SpdySerializedFrame spdy_request(spdy_util_.ConstructSpdyGet(
       request.url.spec().c_str(), 1, DEFAULT_PRIORITY));
   spdy::SpdySerializedFrame spdy_response(
-      spdy_util_.ConstructSpdyGetReply(NULL, 0, 1));
+      spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
   spdy::SpdySerializedFrame spdy_data(
       spdy_util_.ConstructSpdyDataFrame(1, "hello", true));
 
@@ -1950,17 +1950,17 @@
 
 TEST_F(HttpNetworkTransactionTest, KeepAliveConnectionNotConnectedOnWrite) {
   MockWrite write_failure(ASYNC, ERR_SOCKET_NOT_CONNECTED);
-  KeepAliveConnectionResendRequestTest(&write_failure, NULL);
+  KeepAliveConnectionResendRequestTest(&write_failure, nullptr);
 }
 
 TEST_F(HttpNetworkTransactionTest, KeepAliveConnectionReset) {
   MockRead read_failure(ASYNC, ERR_CONNECTION_RESET);
-  KeepAliveConnectionResendRequestTest(NULL, &read_failure);
+  KeepAliveConnectionResendRequestTest(nullptr, &read_failure);
 }
 
 TEST_F(HttpNetworkTransactionTest, KeepAliveConnectionEOF) {
   MockRead read_failure(SYNCHRONOUS, OK);  // EOF
-  KeepAliveConnectionResendRequestTest(NULL, &read_failure);
+  KeepAliveConnectionResendRequestTest(nullptr, &read_failure);
 }
 
 // Make sure that on a 408 response (Request Timeout), the request is retried,
@@ -1971,27 +1971,27 @@
                         "Connection: Keep-Alive\r\n"
                         "Content-Length: 6\r\n\r\n"
                         "Pickle");
-  KeepAliveConnectionResendRequestTest(NULL, &read_failure);
+  KeepAliveConnectionResendRequestTest(nullptr, &read_failure);
 }
 
 TEST_F(HttpNetworkTransactionTest, PreconnectErrorNotConnectedOnWrite) {
   MockWrite write_failure(ASYNC, ERR_SOCKET_NOT_CONNECTED);
-  PreconnectErrorResendRequestTest(&write_failure, NULL, false);
+  PreconnectErrorResendRequestTest(&write_failure, nullptr, false);
 }
 
 TEST_F(HttpNetworkTransactionTest, PreconnectErrorReset) {
   MockRead read_failure(ASYNC, ERR_CONNECTION_RESET);
-  PreconnectErrorResendRequestTest(NULL, &read_failure, false);
+  PreconnectErrorResendRequestTest(nullptr, &read_failure, false);
 }
 
 TEST_F(HttpNetworkTransactionTest, PreconnectErrorEOF) {
   MockRead read_failure(SYNCHRONOUS, OK);  // EOF
-  PreconnectErrorResendRequestTest(NULL, &read_failure, false);
+  PreconnectErrorResendRequestTest(nullptr, &read_failure, false);
 }
 
 TEST_F(HttpNetworkTransactionTest, PreconnectErrorAsyncEOF) {
   MockRead read_failure(ASYNC, OK);  // EOF
-  PreconnectErrorResendRequestTest(NULL, &read_failure, false);
+  PreconnectErrorResendRequestTest(nullptr, &read_failure, false);
 }
 
 // Make sure that on a 408 response (Request Timeout), the request is retried,
@@ -2002,28 +2002,28 @@
                         "Connection: Keep-Alive\r\n"
                         "Content-Length: 6\r\n\r\n"
                         "Pickle");
-  KeepAliveConnectionResendRequestTest(NULL, &read_failure);
-  PreconnectErrorResendRequestTest(NULL, &read_failure, false);
+  KeepAliveConnectionResendRequestTest(nullptr, &read_failure);
+  PreconnectErrorResendRequestTest(nullptr, &read_failure, false);
 }
 
 TEST_F(HttpNetworkTransactionTest, SpdyPreconnectErrorNotConnectedOnWrite) {
   MockWrite write_failure(ASYNC, ERR_SOCKET_NOT_CONNECTED);
-  PreconnectErrorResendRequestTest(&write_failure, NULL, true);
+  PreconnectErrorResendRequestTest(&write_failure, nullptr, true);
 }
 
 TEST_F(HttpNetworkTransactionTest, SpdyPreconnectErrorReset) {
   MockRead read_failure(ASYNC, ERR_CONNECTION_RESET);
-  PreconnectErrorResendRequestTest(NULL, &read_failure, true);
+  PreconnectErrorResendRequestTest(nullptr, &read_failure, true);
 }
 
 TEST_F(HttpNetworkTransactionTest, SpdyPreconnectErrorEOF) {
   MockRead read_failure(SYNCHRONOUS, OK);  // EOF
-  PreconnectErrorResendRequestTest(NULL, &read_failure, true);
+  PreconnectErrorResendRequestTest(nullptr, &read_failure, true);
 }
 
 TEST_F(HttpNetworkTransactionTest, SpdyPreconnectErrorAsyncEOF) {
   MockRead read_failure(ASYNC, OK);  // EOF
-  PreconnectErrorResendRequestTest(NULL, &read_failure, true);
+  PreconnectErrorResendRequestTest(nullptr, &read_failure, true);
 }
 
 TEST_F(HttpNetworkTransactionTest, NonKeepAliveConnectionReset) {
@@ -5508,7 +5508,8 @@
       spdy_util_.ConstructSpdyGet("http://www.example.org/", 1, LOWEST));
   MockWrite spdy_writes[] = {CreateMockWrite(req, 0)};
 
-  spdy::SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1));
+  spdy::SpdySerializedFrame resp(
+      spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
   spdy::SpdySerializedFrame data(spdy_util_.ConstructSpdyDataFrame(1, true));
   MockRead spdy_reads[] = {
       CreateMockRead(resp, 1), CreateMockRead(data, 2), MockRead(ASYNC, 0, 3),
@@ -5601,7 +5602,7 @@
   spdy::SpdySerializedFrame body_authentication(
       spdy_util_.ConstructSpdyDataFrame(1, true));
   spdy::SpdySerializedFrame resp_data(
-      spdy_util_.ConstructSpdyGetReply(NULL, 0, 3));
+      spdy_util_.ConstructSpdyGetReply(nullptr, 0, 3));
   spdy::SpdySerializedFrame body_data(
       spdy_util_.ConstructSpdyDataFrame(3, true));
   MockRead spdy_reads[] = {
@@ -5673,7 +5674,7 @@
 
   // CONNECT to www.example.org:443 via SPDY
   spdy::SpdySerializedFrame connect(spdy_util_.ConstructSpdyConnect(
-      NULL, 0, 1, LOWEST, HostPortPair("www.example.org", 443)));
+      nullptr, 0, 1, LOWEST, HostPortPair("www.example.org", 443)));
   // fetch https://www.example.org/ via HTTP
 
   const char get[] =
@@ -5683,7 +5684,7 @@
   spdy::SpdySerializedFrame wrapped_get(
       spdy_util_.ConstructSpdyDataFrame(1, get, false));
   spdy::SpdySerializedFrame conn_resp(
-      spdy_util_.ConstructSpdyGetReply(NULL, 0, 1));
+      spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
   const char resp[] = "HTTP/1.1 200 OK\r\n"
       "Content-Length: 10\r\n\r\n";
   spdy::SpdySerializedFrame wrapped_get_resp(
@@ -5758,7 +5759,7 @@
 
   // CONNECT to www.example.org:443 via SPDY
   spdy::SpdySerializedFrame connect(spdy_util_.ConstructSpdyConnect(
-      NULL, 0, 1, LOWEST, HostPortPair("www.example.org", 443)));
+      nullptr, 0, 1, LOWEST, HostPortPair("www.example.org", 443)));
   // fetch https://www.example.org/ via SPDY
   const char kMyUrl[] = "https://www.example.org/";
   spdy::SpdySerializedFrame get(
@@ -5766,9 +5767,9 @@
   spdy::SpdySerializedFrame wrapped_get(
       spdy_util_.ConstructWrappedSpdyFrame(get, 1));
   spdy::SpdySerializedFrame conn_resp(
-      spdy_util_.ConstructSpdyGetReply(NULL, 0, 1));
+      spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
   spdy::SpdySerializedFrame get_resp(
-      spdy_util_wrapped.ConstructSpdyGetReply(NULL, 0, 1));
+      spdy_util_wrapped.ConstructSpdyGetReply(nullptr, 0, 1));
   spdy::SpdySerializedFrame wrapped_get_resp(
       spdy_util_.ConstructWrappedSpdyFrame(get_resp, 1));
   spdy::SpdySerializedFrame body(
@@ -5849,7 +5850,7 @@
 
   // CONNECT to www.example.org:443 via SPDY
   spdy::SpdySerializedFrame connect(spdy_util_.ConstructSpdyConnect(
-      NULL, 0, 1, LOWEST, HostPortPair("www.example.org", 443)));
+      nullptr, 0, 1, LOWEST, HostPortPair("www.example.org", 443)));
   spdy::SpdySerializedFrame get(
       spdy_util_.ConstructSpdyRstStream(1, spdy::ERROR_CODE_CANCEL));
 
@@ -5909,14 +5910,14 @@
   const char kMyUrl[] = "https://www.example.org/";
   spdy::SpdySerializedFrame get(spdy_util_.ConstructSpdyGet(kMyUrl, 1, LOWEST));
   spdy::SpdySerializedFrame get_resp(
-      spdy_util_.ConstructSpdyGetReply(NULL, 0, 1));
+      spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
   spdy::SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true));
 
   spdy_util_.UpdateWithStreamDestruction(1);
   spdy::SpdySerializedFrame get2(
       spdy_util_.ConstructSpdyGet(kMyUrl, 3, LOWEST));
   spdy::SpdySerializedFrame get_resp2(
-      spdy_util_.ConstructSpdyGetReply(NULL, 0, 3));
+      spdy_util_.ConstructSpdyGetReply(nullptr, 0, 3));
   spdy::SpdySerializedFrame body2(spdy_util_.ConstructSpdyDataFrame(3, true));
 
   MockWrite auth_challenge_writes[] = {
@@ -6055,9 +6056,9 @@
 
   // CONNECT to www.example.org:443 via SPDY.
   spdy::SpdySerializedFrame connect1(spdy_util_.ConstructSpdyConnect(
-      NULL, 0, 1, LOWEST, HostPortPair("www.example.org", 443)));
+      nullptr, 0, 1, LOWEST, HostPortPair("www.example.org", 443)));
   spdy::SpdySerializedFrame conn_resp1(
-      spdy_util_.ConstructSpdyGetReply(NULL, 0, 1));
+      spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
 
   // Fetch https://www.example.org/ via HTTP.
   const char get1[] =
@@ -6083,7 +6084,7 @@
       3, std::move(connect2_block), LOWEST, false));
 
   spdy::SpdySerializedFrame conn_resp2(
-      spdy_util_.ConstructSpdyGetReply(NULL, 0, 3));
+      spdy_util_.ConstructSpdyGetReply(nullptr, 0, 3));
 
   // Fetch https://mail.example.org/ via HTTP.
   const char get2[] =
@@ -6191,9 +6192,9 @@
 
   // CONNECT to www.example.org:443 via SPDY.
   spdy::SpdySerializedFrame connect1(spdy_util_.ConstructSpdyConnect(
-      NULL, 0, 1, LOWEST, HostPortPair("www.example.org", 443)));
+      nullptr, 0, 1, LOWEST, HostPortPair("www.example.org", 443)));
   spdy::SpdySerializedFrame conn_resp1(
-      spdy_util_.ConstructSpdyGetReply(NULL, 0, 1));
+      spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
 
   // Fetch https://www.example.org/ via HTTP.
   const char get1[] =
@@ -6321,7 +6322,7 @@
   spdy::SpdySerializedFrame get1(
       spdy_util_.ConstructSpdyHeaders(1, std::move(headers), LOWEST, true));
   spdy::SpdySerializedFrame get_resp1(
-      spdy_util_.ConstructSpdyGetReply(NULL, 0, 1));
+      spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
   spdy::SpdySerializedFrame body1(
       spdy_util_.ConstructSpdyDataFrame(1, "1", true));
   spdy_util_.UpdateWithStreamDestruction(1);
@@ -6332,7 +6333,7 @@
   spdy::SpdySerializedFrame get2(
       spdy_util_.ConstructSpdyHeaders(3, std::move(headers2), LOWEST, true));
   spdy::SpdySerializedFrame get_resp2(
-      spdy_util_.ConstructSpdyGetReply(NULL, 0, 3));
+      spdy_util_.ConstructSpdyGetReply(nullptr, 0, 3));
   spdy::SpdySerializedFrame body2(
       spdy_util_.ConstructSpdyDataFrame(3, "22", true));
 
@@ -6416,16 +6417,16 @@
   SpdyTestUtil spdy_util1;
   // CONNECT to www.example.org:443 via HTTP/2.
   spdy::SpdySerializedFrame connect(spdy_util_.ConstructSpdyConnect(
-      NULL, 0, 1, LOWEST, HostPortPair("www.example.org", 443)));
+      nullptr, 0, 1, LOWEST, HostPortPair("www.example.org", 443)));
   // fetch https://www.example.org/ via HTTP/2.
   const char kMyUrl[] = "https://www.example.org/";
   spdy::SpdySerializedFrame get(spdy_util1.ConstructSpdyGet(kMyUrl, 1, LOWEST));
   spdy::SpdySerializedFrame wrapped_get(
       spdy_util_.ConstructWrappedSpdyFrame(get, 1));
   spdy::SpdySerializedFrame conn_resp(
-      spdy_util_.ConstructSpdyGetReply(NULL, 0, 1));
+      spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
   spdy::SpdySerializedFrame get_resp(
-      spdy_util1.ConstructSpdyGetReply(NULL, 0, 1));
+      spdy_util1.ConstructSpdyGetReply(nullptr, 0, 1));
   spdy::SpdySerializedFrame wrapped_get_resp(
       spdy_util_.ConstructWrappedSpdyFrame(get_resp, 1));
   spdy::SpdySerializedFrame body(spdy_util1.ConstructSpdyDataFrame(1, true));
@@ -9735,7 +9736,7 @@
       net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
 
   spdy::SpdySerializedFrame conn(spdy_util_.ConstructSpdyConnect(
-      NULL, 0, 1, LOWEST, HostPortPair("www.example.org", 443)));
+      nullptr, 0, 1, LOWEST, HostPortPair("www.example.org", 443)));
   spdy::SpdySerializedFrame goaway(
       spdy_util_.ConstructSpdyRstStream(1, spdy::ERROR_CODE_CANCEL));
   MockWrite data_writes[] = {
@@ -9885,7 +9886,7 @@
       net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
 
   spdy::SpdySerializedFrame conn(spdy_util_.ConstructSpdyConnect(
-      NULL, 0, 1, LOWEST, HostPortPair("www.example.org", 443)));
+      nullptr, 0, 1, LOWEST, HostPortPair("www.example.org", 443)));
   spdy::SpdySerializedFrame rst(
       spdy_util_.ConstructSpdyRstStream(1, spdy::ERROR_CODE_CANCEL));
   MockWrite data_writes[] = {
@@ -9947,7 +9948,7 @@
 
   // Since we have proxy, should try to establish tunnel.
   spdy::SpdySerializedFrame req(spdy_util_.ConstructSpdyConnect(
-      NULL, 0, 1, LOWEST, HostPortPair("www.example.org", 443)));
+      nullptr, 0, 1, LOWEST, HostPortPair("www.example.org", 443)));
   spdy::SpdySerializedFrame rst(
       spdy_util_.ConstructSpdyRstStream(1, spdy::ERROR_CODE_CANCEL));
   spdy_util_.UpdateWithStreamDestruction(1);
@@ -9983,7 +9984,7 @@
       kAuthStatus, kAuthChallenge, base::size(kAuthChallenge) / 2, 1));
 
   spdy::SpdySerializedFrame conn_resp(
-      spdy_util_.ConstructSpdyGetReply(NULL, 0, 3));
+      spdy_util_.ConstructSpdyGetReply(nullptr, 0, 3));
   const char resp[] = "HTTP/1.1 200 OK\r\n"
       "Content-Length: 5\r\n\r\n";
 
@@ -10108,10 +10109,10 @@
   };
 
   spdy::SpdySerializedFrame stream2_syn(spdy_util_.ConstructSpdyPush(
-      NULL, 0, 2, 1, "http://www.another-origin.com/foo.dat"));
+      nullptr, 0, 2, 1, "http://www.another-origin.com/foo.dat"));
 
   spdy::SpdySerializedFrame stream1_reply(
-      spdy_util_.ConstructSpdyGetReply(NULL, 0, 1));
+      spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
 
   spdy::SpdySerializedFrame stream1_body(
       spdy_util_.ConstructSpdyDataFrame(1, true));
@@ -10225,13 +10226,13 @@
   };
 
   spdy::SpdySerializedFrame stream1_reply(
-      spdy_util_.ConstructSpdyGetReply(NULL, 0, 1));
+      spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
 
   spdy::SpdySerializedFrame stream1_body(
       spdy_util_.ConstructSpdyDataFrame(1, true));
 
   spdy::SpdySerializedFrame stream2_syn(spdy_util_.ConstructSpdyPush(
-      NULL, 0, 2, 1, "https://www.another-origin.com/foo.dat"));
+      nullptr, 0, 2, 1, "https://www.another-origin.com/foo.dat"));
 
   MockRead spdy_reads[] = {
       CreateMockRead(stream1_reply, 1, ASYNC),
@@ -11335,7 +11336,7 @@
     ProxyServer proxy_server(ProxyServer::SCHEME_HTTP,
                              HostPortPair("http_proxy", 80));
     CaptureGroupNameTransportSocketPool* http_proxy_pool =
-        new CaptureGroupNameTransportSocketPool(NULL, NULL);
+        new CaptureGroupNameTransportSocketPool(nullptr, nullptr);
     auto mock_pool_manager = std::make_unique<MockClientSocketPoolManager>();
     mock_pool_manager->SetSocketPool(proxy_server,
                                      base::WrapUnique(http_proxy_pool));
@@ -11398,7 +11399,7 @@
         ProxyServer::FromURI(tests[i].proxy_server, ProxyServer::SCHEME_HTTP));
     ASSERT_TRUE(proxy_server.is_valid());
     CaptureGroupNameTransportSocketPool* socks_conn_pool =
-        new CaptureGroupNameTransportSocketPool(NULL, NULL);
+        new CaptureGroupNameTransportSocketPool(nullptr, nullptr);
     auto mock_pool_manager = std::make_unique<MockClientSocketPoolManager>();
     mock_pool_manager->SetSocketPool(proxy_server,
                                      base::WrapUnique(socks_conn_pool));
@@ -12904,7 +12905,8 @@
       spdy_util_.ConstructSpdyGet("https://www.example.org/", 1, LOWEST));
   MockWrite spdy_writes[] = {CreateMockWrite(req, 0)};
 
-  spdy::SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1));
+  spdy::SpdySerializedFrame resp(
+      spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
   spdy::SpdySerializedFrame data(spdy_util_.ConstructSpdyDataFrame(1, true));
   MockRead spdy_reads[] = {
       CreateMockRead(resp, 1), CreateMockRead(data, 2), MockRead(ASYNC, 0, 3),
@@ -13004,9 +13006,11 @@
   MockWrite spdy_writes[] = {
       CreateMockWrite(req1, 0), CreateMockWrite(req2, 1),
   };
-  spdy::SpdySerializedFrame resp1(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1));
+  spdy::SpdySerializedFrame resp1(
+      spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
   spdy::SpdySerializedFrame data1(spdy_util_.ConstructSpdyDataFrame(1, true));
-  spdy::SpdySerializedFrame resp2(spdy_util_.ConstructSpdyGetReply(NULL, 0, 3));
+  spdy::SpdySerializedFrame resp2(
+      spdy_util_.ConstructSpdyGetReply(nullptr, 0, 3));
   spdy::SpdySerializedFrame data2(spdy_util_.ConstructSpdyDataFrame(3, true));
   MockRead spdy_reads[] = {
       CreateMockRead(resp1, 2), CreateMockRead(data1, 3),
@@ -13290,7 +13294,8 @@
 
   const char kCONNECTResponse[] = "HTTP/1.1 200 Connected\r\n\r\n";
 
-  spdy::SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1));
+  spdy::SpdySerializedFrame resp(
+      spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
   spdy::SpdySerializedFrame data(spdy_util_.ConstructSpdyDataFrame(1, true));
   MockRead spdy_reads[] = {
       MockRead(ASYNC, 1, kCONNECTResponse), CreateMockRead(resp, 3),
@@ -13385,7 +13390,8 @@
       spdy_util_.ConstructSpdyGet("https://www.example.org/", 1, LOWEST));
   MockWrite spdy_writes[] = {CreateMockWrite(req, 0)};
 
-  spdy::SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1));
+  spdy::SpdySerializedFrame resp(
+      spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
   spdy::SpdySerializedFrame data(spdy_util_.ConstructSpdyDataFrame(1, true));
   MockRead spdy_reads[] = {
       CreateMockRead(resp, 1), CreateMockRead(data, 2), MockRead(ASYNC, 0, 3),
@@ -13535,15 +13541,17 @@
   // and TestRound's created with the default constructor should not be used.
   struct TestRound {
     TestRound()
-        : expected_rv(ERR_UNEXPECTED), extra_write(NULL), extra_read(NULL) {}
+        : expected_rv(ERR_UNEXPECTED),
+          extra_write(nullptr),
+          extra_read(nullptr) {}
     TestRound(const MockWrite& write_arg,
               const MockRead& read_arg,
               int expected_rv_arg)
         : write(write_arg),
           read(read_arg),
           expected_rv(expected_rv_arg),
-          extra_write(NULL),
-          extra_read(NULL) {}
+          extra_write(nullptr),
+          extra_read(nullptr) {}
     TestRound(const MockWrite& write_arg, const MockRead& read_arg,
               int expected_rv_arg, const MockWrite* extra_write_arg,
               const MockRead* extra_read_arg)
@@ -14397,7 +14405,7 @@
   auth_factory->AddMockHandler(auth_handler, HttpAuth::AUTH_SERVER);
 
   int rv = OK;
-  const HttpResponseInfo* response = NULL;
+  const HttpResponseInfo* response = nullptr;
   HttpRequestInfo request;
   request.method = "GET";
   request.url = origin;
@@ -15075,7 +15083,8 @@
       spdy_util_.ConstructSpdyGet("https://www.example.org", 1, LOWEST));
   MockWrite spdy_writes[] = {CreateMockWrite(req, 0)};
 
-  spdy::SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1));
+  spdy::SpdySerializedFrame resp(
+      spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
   spdy::SpdySerializedFrame data(spdy_util_.ConstructSpdyDataFrame(1, true));
   MockRead spdy_reads[] = {
       CreateMockRead(resp, 1), CreateMockRead(data, 2), MockRead(ASYNC, 0, 3),
@@ -15236,7 +15245,7 @@
   // of SSLClientCertCache, NULL is just as meaningful as a real
   // certificate, so this is the same as supply a
   // legitimate-but-unacceptable certificate.
-  rv = trans.RestartWithCertificate(NULL, NULL, callback.callback());
+  rv = trans.RestartWithCertificate(nullptr, nullptr, callback.callback());
   ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
 
   // Ensure the certificate was added to the client auth cache before
@@ -15354,7 +15363,7 @@
   // of SSLClientCertCache, NULL is just as meaningful as a real
   // certificate, so this is the same as supply a
   // legitimate-but-unacceptable certificate.
-  rv = trans.RestartWithCertificate(NULL, NULL, callback.callback());
+  rv = trans.RestartWithCertificate(nullptr, nullptr, callback.callback());
   ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
 
   // Ensure the certificate was added to the client auth cache before
@@ -15451,7 +15460,7 @@
     // of SSLClientCertCache, NULL is just as meaningful as a real
     // certificate, so this is the same as supply a
     // legitimate-but-unacceptable certificate.
-    rv = trans.RestartWithCertificate(NULL, NULL, callback.callback());
+    rv = trans.RestartWithCertificate(nullptr, nullptr, callback.callback());
     ASSERT_THAT(rv, IsError(ERR_IO_PENDING));
 
     // Ensure the certificate was added to the client auth cache before
@@ -15499,11 +15508,11 @@
       CreateMockWrite(host1_req, 0), CreateMockWrite(host2_req, 3),
   };
   spdy::SpdySerializedFrame host1_resp(
-      spdy_util_.ConstructSpdyGetReply(NULL, 0, 1));
+      spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
   spdy::SpdySerializedFrame host1_resp_body(
       spdy_util_.ConstructSpdyDataFrame(1, true));
   spdy::SpdySerializedFrame host2_resp(
-      spdy_util_.ConstructSpdyGetReply(NULL, 0, 3));
+      spdy_util_.ConstructSpdyGetReply(nullptr, 0, 3));
   spdy::SpdySerializedFrame host2_resp_body(
       spdy_util_.ConstructSpdyDataFrame(3, true));
   MockRead spdy_reads[] = {
@@ -15582,11 +15591,11 @@
       CreateMockWrite(host1_req, 0), CreateMockWrite(host2_req, 3),
   };
   spdy::SpdySerializedFrame host1_resp(
-      spdy_util_.ConstructSpdyGetReply(NULL, 0, 1));
+      spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
   spdy::SpdySerializedFrame host1_resp_body(
       spdy_util_.ConstructSpdyDataFrame(1, true));
   spdy::SpdySerializedFrame host2_resp(
-      spdy_util_.ConstructSpdyGetReply(NULL, 0, 3));
+      spdy_util_.ConstructSpdyGetReply(nullptr, 0, 3));
   spdy::SpdySerializedFrame host2_resp_body(
       spdy_util_.ConstructSpdyDataFrame(3, true));
   MockRead spdy_reads[] = {
@@ -15911,11 +15920,11 @@
       CreateMockWrite(host1_req, 0), CreateMockWrite(host2_req, 3),
   };
   spdy::SpdySerializedFrame host1_resp(
-      spdy_util_.ConstructSpdyGetReply(NULL, 0, 1));
+      spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
   spdy::SpdySerializedFrame host1_resp_body(
       spdy_util_.ConstructSpdyDataFrame(1, true));
   spdy::SpdySerializedFrame host2_resp(
-      spdy_util_.ConstructSpdyGetReply(NULL, 0, 3));
+      spdy_util_.ConstructSpdyGetReply(nullptr, 0, 3));
   spdy::SpdySerializedFrame host2_resp_body(
       spdy_util_.ConstructSpdyDataFrame(3, true));
   MockRead spdy_reads[] = {
@@ -15990,7 +15999,8 @@
       CreateMockWrite(req1, 0),
   };
 
-  spdy::SpdySerializedFrame resp1(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1));
+  spdy::SpdySerializedFrame resp1(
+      spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
   spdy::SpdySerializedFrame body1(spdy_util_.ConstructSpdyDataFrame(1, true));
   MockRead reads1[] = {CreateMockRead(resp1, 1), CreateMockRead(body1, 2),
                        MockRead(SYNCHRONOUS, ERR_IO_PENDING, 3)};
@@ -16339,7 +16349,7 @@
   // SPDY GET for HTTPS URL (through CONNECT tunnel)
   const HostPortPair host_port_pair("www.example.org", 8080);
   spdy::SpdySerializedFrame connect(
-      spdy_util_.ConstructSpdyConnect(NULL, 0, 1, LOWEST, host_port_pair));
+      spdy_util_.ConstructSpdyConnect(nullptr, 0, 1, LOWEST, host_port_pair));
   spdy::SpdySerializedFrame req1(
       spdy_util_wrapped.ConstructSpdyGet(https_url.c_str(), 1, LOWEST));
   spdy::SpdySerializedFrame wrapped_req1(
@@ -16369,7 +16379,8 @@
       spdy_util_wrapped.ConstructWrappedSpdyFrame(resp1, 1));
   spdy::SpdySerializedFrame wrapped_body1(
       spdy_util_wrapped.ConstructWrappedSpdyFrame(body1, 1));
-  spdy::SpdySerializedFrame resp2(spdy_util_.ConstructSpdyGetReply(NULL, 0, 3));
+  spdy::SpdySerializedFrame resp2(
+      spdy_util_.ConstructSpdyGetReply(nullptr, 0, 3));
   spdy::SpdySerializedFrame body2(spdy_util_.ConstructSpdyDataFrame(3, true));
   MockRead reads1[] = {
       CreateMockRead(conn_resp, 1),
@@ -16474,7 +16485,8 @@
       CreateMockWrite(req1, 0),
   };
 
-  spdy::SpdySerializedFrame resp1(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1));
+  spdy::SpdySerializedFrame resp1(
+      spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
   spdy::SpdySerializedFrame body1(spdy_util_.ConstructSpdyDataFrame(1, true));
   MockRead reads1[] = {
       MockRead(ASYNC, ERR_IO_PENDING, 1), CreateMockRead(resp1, 2),
@@ -16497,7 +16509,7 @@
   };
 
   spdy::SpdySerializedFrame resp2(
-      spdy_util_secure.ConstructSpdyGetReply(NULL, 0, 1));
+      spdy_util_secure.ConstructSpdyGetReply(nullptr, 0, 1));
   spdy::SpdySerializedFrame body2(
       spdy_util_secure.ConstructSpdyDataFrame(1, true));
   MockRead reads2[] = {CreateMockRead(resp2, 1), CreateMockRead(body2, 2),
@@ -16596,7 +16608,8 @@
       CreateMockWrite(req2, 0),
   };
 
-  spdy::SpdySerializedFrame resp2(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1));
+  spdy::SpdySerializedFrame resp2(
+      spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
   spdy::SpdySerializedFrame body2(spdy_util_.ConstructSpdyDataFrame(1, true));
   MockRead reads2[] = {
       CreateMockRead(resp2, 1), CreateMockRead(body2, 2),
@@ -16672,7 +16685,7 @@
       CreateMockWrite(host1_req, 0),
   };
   spdy::SpdySerializedFrame host1_resp(
-      spdy_util_.ConstructSpdyGetReply(NULL, 0, 1));
+      spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
   spdy::SpdySerializedFrame host1_resp_body(
       spdy_util_.ConstructSpdyDataFrame(1, true));
   MockRead spdy1_reads[] = {
@@ -16692,7 +16705,7 @@
       CreateMockWrite(host2_req, 0),
   };
   spdy::SpdySerializedFrame host2_resp(
-      spdy_util_2.ConstructSpdyGetReply(NULL, 0, 1));
+      spdy_util_2.ConstructSpdyGetReply(nullptr, 0, 1));
   spdy::SpdySerializedFrame host2_resp_body(
       spdy_util_2.ConstructSpdyDataFrame(1, true));
   MockRead spdy2_reads[] = {
diff --git a/net/http/http_proxy_client_socket.cc b/net/http/http_proxy_client_socket.cc
index 710f958..51d112a 100644
--- a/net/http/http_proxy_client_socket.cc
+++ b/net/http/http_proxy_client_socket.cc
@@ -99,7 +99,7 @@
 }
 
 const HttpResponseInfo* HttpProxyClientSocket::GetConnectResponseInfo() const {
-  return response_.headers.get() ? &response_ : NULL;
+  return response_.headers.get() ? &response_ : nullptr;
 }
 
 int HttpProxyClientSocket::Connect(CompletionOnceCallback callback) {
diff --git a/net/http/http_proxy_client_socket_pool_unittest.cc b/net/http/http_proxy_client_socket_pool_unittest.cc
index 47558d33..2b64e3e 100644
--- a/net/http/http_proxy_client_socket_pool_unittest.cc
+++ b/net/http/http_proxy_client_socket_pool_unittest.cc
@@ -130,18 +130,18 @@
 
   scoped_refptr<TransportSocketParams> CreateHttpProxyParams() const {
     if (GetParam() != HTTP)
-      return NULL;
+      return nullptr;
     return new TransportSocketParams(HostPortPair(kHttpProxyHost, 80), false,
                                      OnHostResolutionCallback());
   }
 
   scoped_refptr<SSLSocketParams> CreateHttpsProxyParams() const {
     if (GetParam() == HTTP)
-      return NULL;
+      return nullptr;
     return new SSLSocketParams(
         new TransportSocketParams(HostPortPair(kHttpsProxyHost, 443), false,
                                   OnHostResolutionCallback()),
-        NULL, NULL, HostPortPair(kHttpsProxyHost, 443), SSLConfig(),
+        nullptr, nullptr, HostPortPair(kHttpsProxyHost, 443), SSLConfig(),
         PRIVACY_MODE_DISABLED);
   }
 
diff --git a/net/http/http_proxy_connect_job.cc b/net/http/http_proxy_connect_job.cc
index 2379d4a..dbf3065 100644
--- a/net/http/http_proxy_connect_job.cc
+++ b/net/http/http_proxy_connect_job.cc
@@ -147,8 +147,8 @@
       spdy_session_pool_(spdy_session_pool),
       quic_stream_factory_(quic_stream_factory),
       endpoint_(endpoint),
-      http_auth_cache_(tunnel ? http_auth_cache : NULL),
-      http_auth_handler_factory_(tunnel ? http_auth_handler_factory : NULL),
+      http_auth_cache_(tunnel ? http_auth_cache : nullptr),
+      http_auth_handler_factory_(tunnel ? http_auth_handler_factory : nullptr),
       is_trusted_proxy_(is_trusted_proxy),
       tunnel_(tunnel),
       traffic_annotation_(traffic_annotation) {
diff --git a/net/http/http_proxy_connect_job_unittest.cc b/net/http/http_proxy_connect_job_unittest.cc
index e5ce43c..f942365 100644
--- a/net/http/http_proxy_connect_job_unittest.cc
+++ b/net/http/http_proxy_connect_job_unittest.cc
@@ -511,7 +511,7 @@
 
     SpdyTestUtil spdy_util;
     spdy::SpdySerializedFrame connect(spdy_util.ConstructSpdyConnect(
-        NULL, 0, 1, DEFAULT_PRIORITY, HostPortPair(kEndpointHost, 443)));
+        nullptr, 0, 1, DEFAULT_PRIORITY, HostPortPair(kEndpointHost, 443)));
     spdy::SpdySerializedFrame rst(
         spdy_util.ConstructSpdyRstStream(1, spdy::ERROR_CODE_CANCEL));
     spdy_util.UpdateWithStreamDestruction(1);
@@ -627,7 +627,7 @@
 
     SpdyTestUtil spdy_util;
     spdy::SpdySerializedFrame connect(spdy_util.ConstructSpdyConnect(
-        NULL, 0, 1, DEFAULT_PRIORITY, HostPortPair(kEndpointHost, 443)));
+        nullptr, 0, 1, DEFAULT_PRIORITY, HostPortPair(kEndpointHost, 443)));
     spdy::SpdySerializedFrame rst(
         spdy_util.ConstructSpdyRstStream(1, spdy::ERROR_CODE_CANCEL));
     spdy_util.UpdateWithStreamDestruction(1);
@@ -1111,7 +1111,7 @@
 
   SpdyTestUtil spdy_util;
   spdy::SpdySerializedFrame connect(spdy_util.ConstructSpdyConnect(
-      NULL, 0, 1, DEFAULT_PRIORITY, HostPortPair(kEndpointHost, 443)));
+      nullptr, 0, 1, DEFAULT_PRIORITY, HostPortPair(kEndpointHost, 443)));
   spdy::SpdySerializedFrame rst(
       spdy_util.ConstructSpdyRstStream(1, spdy::ERROR_CODE_CANCEL));
   spdy_util.UpdateWithStreamDestruction(1);
diff --git a/net/http/http_request_info.cc b/net/http/http_request_info.cc
index d8bbe325..f764880 100644
--- a/net/http/http_request_info.cc
+++ b/net/http/http_request_info.cc
@@ -7,7 +7,7 @@
 namespace net {
 
 HttpRequestInfo::HttpRequestInfo()
-    : upload_data_stream(NULL),
+    : upload_data_stream(nullptr),
       load_flags(0),
       privacy_mode(PRIVACY_MODE_DISABLED),
       reporting_upload_depth(0) {}
diff --git a/net/http/http_response_body_drainer.cc b/net/http/http_response_body_drainer.cc
index 45f363b..010657d 100644
--- a/net/http/http_response_body_drainer.cc
+++ b/net/http/http_response_body_drainer.cc
@@ -22,7 +22,7 @@
     : stream_(stream),
       next_state_(STATE_NONE),
       total_read_(0),
-      session_(NULL) {}
+      session_(nullptr) {}
 
 HttpResponseBodyDrainer::~HttpResponseBodyDrainer() = default;
 
diff --git a/net/http/http_response_body_drainer_unittest.cc b/net/http/http_response_body_drainer_unittest.cc
index f21ba7d..8f229ca 100644
--- a/net/http/http_response_body_drainer_unittest.cc
+++ b/net/http/http_response_body_drainer_unittest.cc
@@ -129,7 +129,7 @@
     result_waiter_->set_result(not_reusable);
   }
 
-  HttpStream* RenewStreamForAuth() override { return NULL; }
+  HttpStream* RenewStreamForAuth() override { return nullptr; }
 
   bool IsResponseBodyComplete() const override { return is_complete_; }
 
@@ -225,7 +225,7 @@
 
 void MockHttpStream::CompleteRead() {
   int result = ReadResponseBodyImpl(user_buf_.get(), buf_len_);
-  user_buf_ = NULL;
+  user_buf_ = nullptr;
   base::ResetAndReturn(&callback_).Run(result);
 }
 
diff --git a/net/http/http_response_headers.cc b/net/http/http_response_headers.cc
index 63f47c78..f457e187 100644
--- a/net/http/http_response_headers.cc
+++ b/net/http/http_response_headers.cc
@@ -889,7 +889,8 @@
 
   size_t iter = 0;
   while (EnumerateHeader(&iter, name, &value))
-    HttpUtil::ParseContentType(value, mime_type, charset, &had_charset, NULL);
+    HttpUtil::ParseContentType(value, mime_type, charset, &had_charset,
+                               nullptr);
 }
 
 bool HttpResponseHeaders::GetMimeType(std::string* mime_type) const {
@@ -1279,9 +1280,9 @@
 
 bool HttpResponseHeaders::HasValidators() const {
   std::string etag_header;
-  EnumerateHeader(NULL, "etag", &etag_header);
+  EnumerateHeader(nullptr, "etag", &etag_header);
   std::string last_modified_header;
-  EnumerateHeader(NULL, "Last-Modified", &last_modified_header);
+  EnumerateHeader(nullptr, "Last-Modified", &last_modified_header);
   return HttpUtil::HasValidators(GetHttpVersion(), etag_header,
                                  last_modified_header);
 }
diff --git a/net/http/http_response_headers_unittest.cc b/net/http/http_response_headers_unittest.cc
index d70fb4d..690a8f9a 100644
--- a/net/http/http_response_headers_unittest.cc
+++ b/net/http/http_response_headers_unittest.cc
@@ -559,9 +559,9 @@
   scoped_refptr<HttpResponseHeaders> parsed(new HttpResponseHeaders(headers));
 
   std::string value;
-  EXPECT_TRUE(parsed->EnumerateHeader(NULL, "date", &value));
+  EXPECT_TRUE(parsed->EnumerateHeader(nullptr, "date", &value));
   EXPECT_EQ("Tue, 07 Aug 2007 23:10:55 GMT", value);
-  EXPECT_TRUE(parsed->EnumerateHeader(NULL, "last-modified", &value));
+  EXPECT_TRUE(parsed->EnumerateHeader(nullptr, "last-modified", &value));
   EXPECT_EQ("Wed, 01 Aug 2007 23:23:45 GMT", value);
 }
 
diff --git a/net/http/http_server_properties_impl.cc b/net/http/http_server_properties_impl.cc
index 7f205e2..0a872c3 100644
--- a/net/http/http_server_properties_impl.cc
+++ b/net/http/http_server_properties_impl.cc
@@ -595,7 +595,7 @@
     const url::SchemeHostPort& server) {
   auto it = server_network_stats_map_.Get(server);
   if (it == server_network_stats_map_.end()) {
-    return NULL;
+    return nullptr;
   }
   return &it->second;
 }
diff --git a/net/http/http_stream_parser.cc b/net/http/http_stream_parser.cc
index 19eaa7e..3db1d0e 100644
--- a/net/http/http_stream_parser.cc
+++ b/net/http/http_stream_parser.cc
@@ -250,7 +250,7 @@
   std::string request = request_line + headers.ToString();
   request_headers_length_ = request.size();
 
-  if (request_->upload_data_stream != NULL) {
+  if (request_->upload_data_stream != nullptr) {
     request_body_send_buf_ =
         base::MakeRefCounted<SeekableIOBuffer>(kRequestBodyBufferSize);
     if (request_->upload_data_stream->is_chunked()) {
@@ -488,10 +488,10 @@
     return OK;
   }
 
-  if (request_->upload_data_stream != NULL &&
+  if (request_->upload_data_stream != nullptr &&
       (request_->upload_data_stream->is_chunked() ||
-      // !IsEOF() indicates that the body wasn't merged.
-      (request_->upload_data_stream->size() > 0 &&
+       // !IsEOF() indicates that the body wasn't merged.
+       (request_->upload_data_stream->size() > 0 &&
         !request_->upload_data_stream->IsEOF()))) {
     net_log_.AddEvent(NetLogEventType::HTTP_TRANSACTION_SEND_REQUEST_BODY,
                       base::Bind(&NetLogSendRequestBodyCallback,
@@ -789,7 +789,7 @@
     read_buf_unused_offset_ = 0;
   } else {
     // Now waiting for more of the body to be read.
-    user_read_buf_ = NULL;
+    user_read_buf_ = nullptr;
     user_read_buf_len_ = 0;
   }
 
@@ -1164,10 +1164,9 @@
 bool HttpStreamParser::ShouldMergeRequestHeadersAndBody(
     const std::string& request_headers,
     const UploadDataStream* request_body) {
-  if (request_body != NULL &&
+  if (request_body != nullptr &&
       // IsInMemory() ensures that the request body is not chunked.
-      request_body->IsInMemory() &&
-      request_body->size() > 0) {
+      request_body->IsInMemory() && request_body->size() > 0) {
     uint64_t merged_size = request_headers.size() + request_body->size();
     if (merged_size <= kMaxMergedHeaderAndBodySize)
       return true;
diff --git a/net/http/http_stream_parser_unittest.cc b/net/http/http_stream_parser_unittest.cc
index 1125d556..16b77a3 100644
--- a/net/http/http_stream_parser_unittest.cc
+++ b/net/http/http_stream_parser_unittest.cc
@@ -341,8 +341,8 @@
 
 TEST(HttpStreamParser, ShouldMergeRequestHeadersAndBody_NoBody) {
   // Shouldn't be merged if upload data is non-existent.
-  ASSERT_FALSE(HttpStreamParser::ShouldMergeRequestHeadersAndBody(
-      "some header", NULL));
+  ASSERT_FALSE(HttpStreamParser::ShouldMergeRequestHeadersAndBody("some header",
+                                                                  nullptr));
 }
 
 TEST(HttpStreamParser, ShouldMergeRequestHeadersAndBody_EmptyBody) {
diff --git a/net/http/http_transaction_test_util.cc b/net/http/http_transaction_test_util.cc
index bb000a7..7f9ce92 100644
--- a/net/http/http_transaction_test_util.cc
+++ b/net/http/http_transaction_test_util.cc
@@ -587,11 +587,11 @@
 }
 
 HttpCache* MockNetworkLayer::GetCache() {
-  return NULL;
+  return nullptr;
 }
 
 HttpNetworkSession* MockNetworkLayer::GetSession() {
-  return NULL;
+  return nullptr;
 }
 
 void MockNetworkLayer::SetClock(base::Clock* clock) {
diff --git a/net/http/http_util.cc b/net/http/http_util.cc
index 6d9c6e63..150c9c7 100644
--- a/net/http/http_util.cc
+++ b/net/http/http_util.cc
@@ -998,7 +998,7 @@
 }
 
 bool HttpUtil::HeadersIterator::AdvanceTo(const char* name) {
-  DCHECK(name != NULL);
+  DCHECK(name != nullptr);
   DCHECK_EQ(0, base::ToLowerASCII(name).compare(name))
       << "the header name must be in all lower case";
 
diff --git a/net/http/mock_http_cache.cc b/net/http/mock_http_cache.cc
index 355b2060..6880ae4 100644
--- a/net/http/mock_http_cache.cc
+++ b/net/http/mock_http_cache.cc
@@ -343,7 +343,7 @@
     return;
   ignore_callbacks_ = value;
   if (!value)
-    StoreAndDeliverCallbacks(false, NULL, CompletionOnceCallback(), 0);
+    StoreAndDeliverCallbacks(false, nullptr, CompletionOnceCallback(), 0);
 }
 
 MockDiskEntry::~MockDiskEntry() = default;
@@ -728,7 +728,7 @@
   disk_cache::Backend* backend;
   int rv = http_cache_.GetBackend(&backend, cb.callback());
   rv = cb.GetResult(rv);
-  return (rv == OK) ? backend : NULL;
+  return (rv == OK) ? backend : nullptr;
 }
 
 MockDiskCache* MockHttpCache::disk_cache() {
@@ -864,10 +864,7 @@
 //-----------------------------------------------------------------------------
 
 MockBlockingBackendFactory::MockBlockingBackendFactory()
-    : backend_(NULL),
-      block_(true),
-      fail_(false) {
-}
+    : backend_(nullptr), block_(true), fail_(false) {}
 
 MockBlockingBackendFactory::~MockBlockingBackendFactory() = default;
 
diff --git a/net/http/proxy_connect_redirect_http_stream.cc b/net/http/proxy_connect_redirect_http_stream.cc
index 99b3ba4..1f5dae74 100644
--- a/net/http/proxy_connect_redirect_http_stream.cc
+++ b/net/http/proxy_connect_redirect_http_stream.cc
@@ -13,7 +13,7 @@
 
 ProxyConnectRedirectHttpStream::ProxyConnectRedirectHttpStream(
     LoadTimingInfo* load_timing_info)
-    : has_load_timing_info_(load_timing_info != NULL) {
+    : has_load_timing_info_(load_timing_info != nullptr) {
   if (has_load_timing_info_)
     load_timing_info_ = *load_timing_info;
 }
@@ -123,7 +123,7 @@
 
 HttpStream* ProxyConnectRedirectHttpStream::RenewStreamForAuth() {
   NOTREACHED();
-  return NULL;
+  return nullptr;
 }
 
 }  // namespace net
diff --git a/net/http/transport_security_persister.cc b/net/http/transport_security_persister.cc
index ee788d8..804ea45 100644
--- a/net/http/transport_security_persister.cc
+++ b/net/http/transport_security_persister.cc
@@ -236,7 +236,7 @@
   if (writer_.HasPendingWrite())
     writer_.DoScheduledWrite();
 
-  transport_security_state_->SetDelegate(NULL);
+  transport_security_state_->SetDelegate(nullptr);
 }
 
 void TransportSecurityPersister::StateIsDirty(TransportSecurityState* state) {
@@ -294,7 +294,7 @@
                                              TransportSecurityState* state) {
   std::unique_ptr<base::Value> value =
       base::JSONReader::ReadDeprecated(serialized);
-  base::DictionaryValue* dict_value = NULL;
+  base::DictionaryValue* dict_value = nullptr;
   if (!value.get() || !value->GetAsDictionary(&dict_value))
     return false;
 
@@ -303,7 +303,7 @@
 
   for (base::DictionaryValue::Iterator i(*dict_value);
        !i.IsAtEnd(); i.Advance()) {
-    const base::DictionaryValue* parsed = NULL;
+    const base::DictionaryValue* parsed = nullptr;
     if (!i.value().GetAsDictionary(&parsed)) {
       LOG(WARNING) << "Could not parse entry " << i.key() << "; skipping entry";
       continue;
diff --git a/net/http/url_security_manager_win.cc b/net/http/url_security_manager_win.cc
index 97fd9e1..3d6b0100 100644
--- a/net/http/url_security_manager_win.cc
+++ b/net/http/url_security_manager_win.cc
@@ -57,7 +57,8 @@
   HRESULT hr;
   hr = security_manager_->ProcessUrlAction(
       base::as_wcstr(url16), URLACTION_CREDENTIALS_USE,
-      reinterpret_cast<BYTE*>(&policy), sizeof(policy), NULL, 0, PUAF_NOUI, 0);
+      reinterpret_cast<BYTE*>(&policy), sizeof(policy), nullptr, 0, PUAF_NOUI,
+      0);
   if (FAILED(hr)) {
     LOG(ERROR) << "IInternetSecurityManager::ProcessUrlAction failed: " << hr;
     return false;
@@ -102,8 +103,8 @@
 
 bool URLSecurityManagerWin::EnsureSystemSecurityManager() {
   if (!security_manager_.Get()) {
-    HRESULT hr = CoInternetCreateSecurityManager(
-        NULL, security_manager_.GetAddressOf(), NULL);
+    HRESULT hr =
+        CoInternetCreateSecurityManager(nullptr, &security_manager_, 0);
     if (FAILED(hr) || !security_manager_.Get()) {
       LOG(ERROR) << "Unable to create the Windows Security Manager instance";
       return false;
diff --git a/net/log/net_log.cc b/net/log/net_log.cc
index 4481012..afb760e 100644
--- a/net/log/net_log.cc
+++ b/net/log/net_log.cc
@@ -110,8 +110,7 @@
 
 }  // namespace
 
-NetLog::ThreadSafeObserver::ThreadSafeObserver() : net_log_(NULL) {
-}
+NetLog::ThreadSafeObserver::ThreadSafeObserver() : net_log_(nullptr) {}
 
 NetLog::ThreadSafeObserver::~ThreadSafeObserver() {
   // Make sure we aren't watching a NetLog on destruction.  Because the NetLog
@@ -141,7 +140,7 @@
 
 void NetLog::AddGlobalEntry(NetLogEventType type) {
   AddEntry(type, NetLogSource(NetLogSourceType::NONE, NextID()),
-           NetLogEventPhase::NONE, NULL);
+           NetLogEventPhase::NONE, nullptr);
 }
 
 void NetLog::AddGlobalEntry(
@@ -192,7 +191,7 @@
   DCHECK(it != observers_.end());
   observers_.erase(it);
 
-  observer->net_log_ = NULL;
+  observer->net_log_ = nullptr;
   observer->capture_mode_ = NetLogCaptureMode();
   UpdateIsCapturing();
 }
@@ -232,7 +231,7 @@
 #undef EVENT_TYPE
     default:
       NOTREACHED();
-      return NULL;
+      return nullptr;
   }
 }
 
@@ -255,7 +254,7 @@
 #undef SOURCE_TYPE
     default:
       NOTREACHED();
-      return NULL;
+      return nullptr;
   }
 }
 
@@ -279,7 +278,7 @@
       return "PHASE_NONE";
   }
   NOTREACHED();
-  return NULL;
+  return nullptr;
 }
 
 // static
diff --git a/net/log/net_log_source.cc b/net/log/net_log_source.cc
index b8104b68..a427f68 100644
--- a/net/log/net_log_source.cc
+++ b/net/log/net_log_source.cc
@@ -57,8 +57,8 @@
 // static
 bool NetLogSource::FromEventParameters(base::Value* event_params,
                                        NetLogSource* source) {
-  base::DictionaryValue* dict = NULL;
-  base::DictionaryValue* source_dict = NULL;
+  base::DictionaryValue* dict = nullptr;
+  base::DictionaryValue* source_dict = nullptr;
   int source_id = -1;
   int source_type = static_cast<int>(NetLogSourceType::COUNT);
   if (!event_params || !event_params->GetAsDictionary(&dict) ||
diff --git a/net/log/net_log_unittest.cc b/net/log/net_log_unittest.cc
index 7a82814..21a14096 100644
--- a/net/log/net_log_unittest.cc
+++ b/net/log/net_log_unittest.cc
@@ -162,7 +162,9 @@
 class NetLogTestThread : public base::SimpleThread {
  public:
   NetLogTestThread()
-      : base::SimpleThread("NetLogTest"), net_log_(NULL), start_event_(NULL) {}
+      : base::SimpleThread("NetLogTest"),
+        net_log_(nullptr),
+        start_event_(nullptr) {}
 
   // We'll wait for |start_event| to be triggered before calling a subclass's
   // subclass's RunTestThread() function.
diff --git a/net/log/net_log_util.cc b/net/log/net_log_util.cc
index 823de8e..59bd8b0 100644
--- a/net/log/net_log_util.cc
+++ b/net/log/net_log_util.cc
@@ -107,11 +107,11 @@
 // Despite the name, can return an in memory "disk cache".
 disk_cache::Backend* GetDiskCacheBackend(URLRequestContext* context) {
   if (!context->http_transaction_factory())
-    return NULL;
+    return nullptr;
 
   HttpCache* http_cache = context->http_transaction_factory()->GetCache();
   if (!http_cache)
-    return NULL;
+    return nullptr;
 
   return http_cache->GetCurrentBackend();
 }
diff --git a/net/log/net_log_util_unittest.cc b/net/log/net_log_util_unittest.cc
index 813f60a..9208cd6 100644
--- a/net/log/net_log_util_unittest.cc
+++ b/net/log/net_log_util_unittest.cc
@@ -47,7 +47,7 @@
   EXPECT_GT(net_info_without_cache->size(), 0u);
 
   // Fore creation of a cache backend, and get NetInfo again.
-  disk_cache::Backend* backend = NULL;
+  disk_cache::Backend* backend = nullptr;
   EXPECT_EQ(OK, context.http_transaction_factory()->GetCache()->GetBackend(
                     &backend, TestCompletionCallback().callback()));
   EXPECT_TRUE(http_cache->GetCurrentBackend());
diff --git a/net/log/net_log_with_source.cc b/net/log/net_log_with_source.cc
index 0e88cdf2..8997f64c 100644
--- a/net/log/net_log_with_source.cc
+++ b/net/log/net_log_with_source.cc
@@ -46,7 +46,7 @@
 
   if (!net_log_)
     return;
-  net_log_->AddEntry(type, source_, phase, NULL);
+  net_log_->AddEntry(type, source_, phase, nullptr);
 }
 
 void NetLogWithSource::AddEntry(
diff --git a/net/log/net_log_with_source.h b/net/log/net_log_with_source.h
index d3656f7..820160b 100644
--- a/net/log/net_log_with_source.h
+++ b/net/log/net_log_with_source.h
@@ -19,7 +19,7 @@
 // output log messages without needing to pass in the source.
 class NET_EXPORT NetLogWithSource {
  public:
-  NetLogWithSource() : net_log_(NULL) {}
+  NetLogWithSource() : net_log_(nullptr) {}
   ~NetLogWithSource();
 
   // Add a log entry to the NetLog for the bound source.
diff --git a/net/log/test_net_log_entry.cc b/net/log/test_net_log_entry.cc
index 1936ef3..d58e4d2 100644
--- a/net/log/test_net_log_entry.cc
+++ b/net/log/test_net_log_entry.cc
@@ -37,7 +37,7 @@
   time = entry.time;
   source = entry.source;
   phase = entry.phase;
-  params.reset(entry.params ? entry.params->DeepCopy() : NULL);
+  params.reset(entry.params ? entry.params->DeepCopy() : nullptr);
   return *this;
 }
 
diff --git a/net/proxy_resolution/dhcp_pac_file_adapter_fetcher_win.cc b/net/proxy_resolution/dhcp_pac_file_adapter_fetcher_win.cc
index c8b3024..deb86879 100644
--- a/net/proxy_resolution/dhcp_pac_file_adapter_fetcher_win.cc
+++ b/net/proxy_resolution/dhcp_pac_file_adapter_fetcher_win.cc
@@ -214,7 +214,7 @@
   std::wstring adapter_name_wide = base::SysMultiByteToWide(adapter_name,
                                                             CP_ACP);
 
-  DHCPCAPI_PARAMS_ARRAY send_params = { 0, NULL };
+  DHCPCAPI_PARAMS_ARRAY send_params = {0, nullptr};
 
   DHCPCAPI_PARAMS wpad_params = { 0 };
   wpad_params.OptionId = 252;
@@ -246,13 +246,10 @@
     // chances on non-standard, poorly documented usage.
     base::ScopedBlockingCall scoped_blocking_call(
         FROM_HERE, base::BlockingType::MAY_BLOCK);
-    res = ::DhcpRequestParams(DHCPCAPI_REQUEST_SYNCHRONOUS,
-                              NULL,
-                              const_cast<LPWSTR>(adapter_name_wide.c_str()),
-                              NULL,
-                              send_params, request_params,
-                              result_buffer.get(), &result_buffer_size,
-                              NULL);
+    res = ::DhcpRequestParams(
+        DHCPCAPI_REQUEST_SYNCHRONOUS, nullptr,
+        const_cast<LPWSTR>(adapter_name_wide.c_str()), nullptr, send_params,
+        request_params, result_buffer.get(), &result_buffer_size, nullptr);
     ++retry_count;
   } while (res == ERROR_MORE_DATA && retry_count <= 3);
 
diff --git a/net/proxy_resolution/dhcp_pac_file_adapter_fetcher_win_unittest.cc b/net/proxy_resolution/dhcp_pac_file_adapter_fetcher_win_unittest.cc
index cdc39aa..d5be763 100644
--- a/net/proxy_resolution/dhcp_pac_file_adapter_fetcher_win_unittest.cc
+++ b/net/proxy_resolution/dhcp_pac_file_adapter_fetcher_win_unittest.cc
@@ -54,7 +54,7 @@
 
   void Cancel() override {
     DhcpPacFileAdapterFetcher::Cancel();
-    fetcher_ = NULL;
+    fetcher_ = nullptr;
   }
 
   std::unique_ptr<PacFileFetcher> ImplCreateScriptFetcher() override {
@@ -116,7 +116,7 @@
     // the simple approach currently used in ImplCreateScriptFetcher above).
     DCHECK(fetcher_ && fetcher_->has_pending_request());
     fetcher_->NotifyFetchCompletion(fetcher_result_, pac_script_);
-    fetcher_ = NULL;
+    fetcher_ = nullptr;
   }
 
   bool IsWaitingForFetcher() const {
diff --git a/net/proxy_resolution/dhcp_pac_file_fetcher_win.cc b/net/proxy_resolution/dhcp_pac_file_fetcher_win.cc
index 5541498..348de98 100644
--- a/net/proxy_resolution/dhcp_pac_file_fetcher_win.cc
+++ b/net/proxy_resolution/dhcp_pac_file_fetcher_win.cc
@@ -275,7 +275,7 @@
     URLRequestContext* url_request_context)
     : state_(STATE_START),
       num_pending_fetchers_(0),
-      destination_string_(NULL),
+      destination_string_(nullptr),
       url_request_context_(url_request_context),
       task_runner_(base::MakeRefCounted<TaskRunnerWithCap>()) {
   DCHECK(url_request_context_);
@@ -376,7 +376,7 @@
   // and a previous query was cancelled before it completed.
   if (query.get() != last_query_.get())
     return;
-  last_query_ = NULL;
+  last_query_ = nullptr;
 
   DhcpAdapterNamesLoggingInfo* logging_info = query->logging_info();
   logging_info->origin_thread_end_time = base::TimeTicks::Now();
@@ -565,14 +565,11 @@
     // Return only unicast addresses, and skip information we do not need.
     base::ScopedBlockingCall scoped_blocking_call(
         FROM_HERE, base::BlockingType::MAY_BLOCK);
-    error = GetAdaptersAddresses(AF_UNSPEC,
-                                 GAA_FLAG_SKIP_ANYCAST |
-                                 GAA_FLAG_SKIP_MULTICAST |
-                                 GAA_FLAG_SKIP_DNS_SERVER |
-                                 GAA_FLAG_SKIP_FRIENDLY_NAME,
-                                 NULL,
-                                 adapters.get(),
-                                 &adapters_size);
+    error = GetAdaptersAddresses(
+        AF_UNSPEC,
+        GAA_FLAG_SKIP_ANYCAST | GAA_FLAG_SKIP_MULTICAST |
+            GAA_FLAG_SKIP_DNS_SERVER | GAA_FLAG_SKIP_FRIENDLY_NAME,
+        nullptr, adapters.get(), &adapters_size);
     ++num_tries;
   } while (error == ERROR_BUFFER_OVERFLOW && num_tries <= 3);
 
@@ -589,7 +586,7 @@
     return false;
   }
 
-  IP_ADAPTER_ADDRESSES* adapter = NULL;
+  IP_ADAPTER_ADDRESSES* adapter = nullptr;
   for (adapter = adapters.get(); adapter; adapter = adapter->Next) {
     if (IsDhcpCapableAdapter(adapter)) {
       DCHECK(adapter->AdapterName);
diff --git a/net/proxy_resolution/mock_pac_file_fetcher.cc b/net/proxy_resolution/mock_pac_file_fetcher.cc
index 9e6ce594..07190a6 100644
--- a/net/proxy_resolution/mock_pac_file_fetcher.cc
+++ b/net/proxy_resolution/mock_pac_file_fetcher.cc
@@ -14,8 +14,7 @@
 namespace net {
 
 MockPacFileFetcher::MockPacFileFetcher()
-    : pending_request_text_(NULL),
-      is_shutdown_(false) {}
+    : pending_request_text_(nullptr), is_shutdown_(false) {}
 
 MockPacFileFetcher::~MockPacFileFetcher() = default;
 
@@ -60,7 +59,7 @@
 }
 
 URLRequestContext* MockPacFileFetcher::GetRequestContext() const {
-  return NULL;
+  return nullptr;
 }
 
 const GURL& MockPacFileFetcher::pending_request_url() const {
diff --git a/net/proxy_resolution/multi_threaded_proxy_resolver.cc b/net/proxy_resolution/multi_threaded_proxy_resolver.cc
index b48196c..a73dba3 100644
--- a/net/proxy_resolution/multi_threaded_proxy_resolver.cc
+++ b/net/proxy_resolution/multi_threaded_proxy_resolver.cc
@@ -158,7 +158,7 @@
 
 class Job : public base::RefCountedThreadSafe<Job> {
  public:
-  Job() : executor_(NULL), was_cancelled_(false) {}
+  Job() : executor_(nullptr), was_cancelled_(false) {}
 
   void set_executor(Executor* executor) {
     executor_ = executor;
@@ -303,8 +303,8 @@
   void Run(scoped_refptr<base::SingleThreadTaskRunner> origin_runner) override {
     ProxyResolver* resolver = executor()->resolver();
     DCHECK(resolver);
-    int rv = resolver->GetProxyForURL(url_, &results_buf_,
-                                      CompletionOnceCallback(), NULL, net_log_);
+    int rv = resolver->GetProxyForURL(
+        url_, &results_buf_, CompletionOnceCallback(), nullptr, net_log_);
     DCHECK_NE(rv, ERR_IO_PENDING);
 
     origin_runner->PostTask(
@@ -368,7 +368,7 @@
 
 void Executor::OnJobCompleted(Job* job) {
   DCHECK_EQ(job, outstanding_job_.get());
-  outstanding_job_ = NULL;
+  outstanding_job_ = nullptr;
   coordinator_->OnExecutorReady(this);
 }
 
@@ -388,7 +388,7 @@
   if (outstanding_job_.get()) {
     outstanding_job_->Cancel();
     // Orphan the job (since this executor may be deleted soon).
-    outstanding_job_->set_executor(NULL);
+    outstanding_job_->set_executor(nullptr);
   }
 
   // It is now safe to free the ProxyResolver, since all the tasks that
@@ -396,8 +396,8 @@
   resolver_.reset();
 
   // Null some stuff as a precaution.
-  coordinator_ = NULL;
-  outstanding_job_ = NULL;
+  coordinator_ = nullptr;
+  outstanding_job_ = nullptr;
 }
 
 Executor::~Executor() {
@@ -479,7 +479,7 @@
     if (!executor->outstanding_job())
       return executor;
   }
-  return NULL;
+  return nullptr;
 }
 
 void MultiThreadedProxyResolver::AddNewExecutor() {
diff --git a/net/proxy_resolution/multi_threaded_proxy_resolver_unittest.cc b/net/proxy_resolution/multi_threaded_proxy_resolver_unittest.cc
index dacb16e..6c93f5d6 100644
--- a/net/proxy_resolution/multi_threaded_proxy_resolver_unittest.cc
+++ b/net/proxy_resolution/multi_threaded_proxy_resolver_unittest.cc
@@ -61,7 +61,7 @@
     EXPECT_TRUE(worker_thread_checker_.CalledOnValidThread());
 
     EXPECT_TRUE(callback.is_null());
-    EXPECT_TRUE(request == NULL);
+    EXPECT_TRUE(request == nullptr);
 
     // Write something into |net_log| (doesn't really have any meaning.)
     net_log.BeginEvent(NetLogEventType::PAC_JAVASCRIPT_ALERT);
@@ -261,7 +261,7 @@
   BoundTestNetLog log0;
   ProxyInfo results0;
   rv = resolver().GetProxyForURL(GURL("http://request0"), &results0,
-                                 callback0.callback(), NULL, log0.bound());
+                                 callback0.callback(), nullptr, log0.bound());
   EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
 
   // Wait for request 0 to finish.
@@ -283,23 +283,23 @@
 
   TestCompletionCallback callback1;
   ProxyInfo results1;
-  rv =
-      resolver().GetProxyForURL(GURL("http://request1"), &results1,
-                                callback1.callback(), NULL, NetLogWithSource());
+  rv = resolver().GetProxyForURL(GURL("http://request1"), &results1,
+                                 callback1.callback(), nullptr,
+                                 NetLogWithSource());
   EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
 
   TestCompletionCallback callback2;
   ProxyInfo results2;
-  rv =
-      resolver().GetProxyForURL(GURL("http://request2"), &results2,
-                                callback2.callback(), NULL, NetLogWithSource());
+  rv = resolver().GetProxyForURL(GURL("http://request2"), &results2,
+                                 callback2.callback(), nullptr,
+                                 NetLogWithSource());
   EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
 
   TestCompletionCallback callback3;
   ProxyInfo results3;
-  rv =
-      resolver().GetProxyForURL(GURL("http://request3"), &results3,
-                                callback3.callback(), NULL, NetLogWithSource());
+  rv = resolver().GetProxyForURL(GURL("http://request3"), &results3,
+                                 callback3.callback(), nullptr,
+                                 NetLogWithSource());
   EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
 
   // Wait for the requests to finish (they must finish in the order they were
@@ -345,7 +345,7 @@
   ProxyInfo results1;
   BoundTestNetLog log1;
   rv = resolver().GetProxyForURL(GURL("http://request1"), &results1,
-                                 callback1.callback(), NULL, log1.bound());
+                                 callback1.callback(), nullptr, log1.bound());
   EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
 
   std::unique_ptr<ProxyResolver::Request> request2;
@@ -426,9 +426,9 @@
 
   TestCompletionCallback callback1;
   ProxyInfo results1;
-  rv =
-      resolver().GetProxyForURL(GURL("http://request1"), &results1,
-                                callback1.callback(), NULL, NetLogWithSource());
+  rv = resolver().GetProxyForURL(GURL("http://request1"), &results1,
+                                 callback1.callback(), nullptr,
+                                 NetLogWithSource());
   EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
 
   std::unique_ptr<ProxyResolver::Request> request2;
@@ -441,9 +441,9 @@
 
   TestCompletionCallback callback3;
   ProxyInfo results3;
-  rv =
-      resolver().GetProxyForURL(GURL("http://request3"), &results3,
-                                callback3.callback(), NULL, NetLogWithSource());
+  rv = resolver().GetProxyForURL(GURL("http://request3"), &results3,
+                                 callback3.callback(), nullptr,
+                                 NetLogWithSource());
   EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
 
   // Cancel request0 (inprogress) and request2 (pending).
@@ -487,23 +487,23 @@
 
   TestCompletionCallback callback0;
   ProxyInfo results0;
-  rv =
-      resolver().GetProxyForURL(GURL("http://request0"), &results0,
-                                callback0.callback(), NULL, NetLogWithSource());
+  rv = resolver().GetProxyForURL(GURL("http://request0"), &results0,
+                                 callback0.callback(), nullptr,
+                                 NetLogWithSource());
   EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
 
   TestCompletionCallback callback1;
   ProxyInfo results1;
-  rv =
-      resolver().GetProxyForURL(GURL("http://request1"), &results1,
-                                callback1.callback(), NULL, NetLogWithSource());
+  rv = resolver().GetProxyForURL(GURL("http://request1"), &results1,
+                                 callback1.callback(), nullptr,
+                                 NetLogWithSource());
   EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
 
   TestCompletionCallback callback2;
   ProxyInfo results2;
-  rv =
-      resolver().GetProxyForURL(GURL("http://request2"), &results2,
-                                callback2.callback(), NULL, NetLogWithSource());
+  rv = resolver().GetProxyForURL(GURL("http://request2"), &results2,
+                                 callback2.callback(), nullptr,
+                                 NetLogWithSource());
   EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
 
   // Wait until request 0 reaches the worker thread.
diff --git a/net/proxy_resolution/network_delegate_error_observer.cc b/net/proxy_resolution/network_delegate_error_observer.cc
index a898cb6..9998540 100644
--- a/net/proxy_resolution/network_delegate_error_observer.cc
+++ b/net/proxy_resolution/network_delegate_error_observer.cc
@@ -60,7 +60,7 @@
 
 void NetworkDelegateErrorObserver::Core::Shutdown() {
   CHECK(origin_runner_->BelongsToCurrentThread());
-  network_delegate_ = NULL;
+  network_delegate_ = nullptr;
 }
 
 // NetworkDelegateErrorObserver -----------------------------------------------
diff --git a/net/proxy_resolution/network_delegate_error_observer_unittest.cc b/net/proxy_resolution/network_delegate_error_observer_unittest.cc
index 0a13cab02..1bd3e42 100644
--- a/net/proxy_resolution/network_delegate_error_observer_unittest.cc
+++ b/net/proxy_resolution/network_delegate_error_observer_unittest.cc
@@ -108,7 +108,7 @@
   base::Thread thread("test_thread");
   thread.Start();
   NetworkDelegateErrorObserver observer(
-      NULL, base::ThreadTaskRunnerHandle::Get().get());
+      nullptr, base::ThreadTaskRunnerHandle::Get().get());
   thread.task_runner()->PostTask(
       FROM_HERE,
       base::BindOnce(&NetworkDelegateErrorObserver::OnPACScriptError,
diff --git a/net/proxy_resolution/pac_file_decider_unittest.cc b/net/proxy_resolution/pac_file_decider_unittest.cc
index c257c2e..cd3d212 100644
--- a/net/proxy_resolution/pac_file_decider_unittest.cc
+++ b/net/proxy_resolution/pac_file_decider_unittest.cc
@@ -108,7 +108,7 @@
 class RuleBasedPacFileFetcher : public PacFileFetcher {
  public:
   explicit RuleBasedPacFileFetcher(const Rules* rules)
-      : rules_(rules), request_context_(NULL) {}
+      : rules_(rules), request_context_(nullptr) {}
 
   virtual void SetRequestContext(URLRequestContext* context) {
     request_context_ = context;
@@ -285,7 +285,7 @@
   rules.AddFailParsingRule("http://custom/proxy.pac");
 
   TestCompletionCallback callback;
-  PacFileDecider decider(&fetcher, &dhcp_fetcher, NULL);
+  PacFileDecider decider(&fetcher, &dhcp_fetcher, nullptr);
   EXPECT_THAT(decider.Start(ProxyConfigWithAnnotation(
                                 config, TRAFFIC_ANNOTATION_FOR_TESTS),
                             base::TimeDelta(), true, callback.callback()),
@@ -302,7 +302,7 @@
   config.set_pac_url(GURL("http://custom/proxy.pac"));
 
   TestCompletionCallback callback;
-  PacFileDecider decider(NULL, &dhcp_fetcher, NULL);
+  PacFileDecider decider(nullptr, &dhcp_fetcher, nullptr);
   EXPECT_THAT(decider.Start(ProxyConfigWithAnnotation(
                                 config, TRAFFIC_ANNOTATION_FOR_TESTS),
                             base::TimeDelta(), true, callback.callback()),
@@ -322,7 +322,7 @@
   Rules::Rule rule = rules.AddSuccessRule("http://wpad/wpad.dat");
 
   TestCompletionCallback callback;
-  PacFileDecider decider(&fetcher, &dhcp_fetcher, NULL);
+  PacFileDecider decider(&fetcher, &dhcp_fetcher, nullptr);
   EXPECT_THAT(decider.Start(ProxyConfigWithAnnotation(
                                 config, TRAFFIC_ANNOTATION_FOR_TESTS),
                             base::TimeDelta(), true, callback.callback()),
@@ -344,7 +344,7 @@
     request_context_.set_host_resolver(&resolver_);
     fetcher_.SetRequestContext(&request_context_);
     config_.set_auto_detect(true);
-    decider_.reset(new PacFileDecider(&fetcher_, &dhcp_fetcher_, NULL));
+    decider_.reset(new PacFileDecider(&fetcher_, &dhcp_fetcher_, nullptr));
   }
 
   int StartDecider() {
@@ -428,7 +428,7 @@
   base::string16 pac_contents = base::UTF8ToUTF16(kPac);
   GURL url("http://foobar/baz");
   dhcp_fetcher.SetPacURL(url);
-  decider_.reset(new PacFileDecider(&fetcher_, &dhcp_fetcher, NULL));
+  decider_.reset(new PacFileDecider(&fetcher_, &dhcp_fetcher, nullptr));
   EXPECT_THAT(StartDecider(), IsError(ERR_IO_PENDING));
   dhcp_fetcher.CompleteRequests(OK, pac_contents);
   EXPECT_TRUE(decider_->effective_config().value().has_pac_url());
@@ -445,7 +445,7 @@
   resolver_.rules_map()[HostResolverSource::SYSTEM]->AddSimulatedFailure(
       "wpad");
   MockPacFileFetcher fetcher;
-  decider_.reset(new PacFileDecider(&fetcher, &dhcp_fetcher_, NULL));
+  decider_.reset(new PacFileDecider(&fetcher, &dhcp_fetcher_, nullptr));
   EXPECT_THAT(StartDecider(), IsError(ERR_IO_PENDING));
   EXPECT_TRUE(fetcher.has_pending_request());
   fetcher.NotifyFetchCompletion(OK, kPac);
@@ -482,7 +482,7 @@
 TEST_F(PacFileDeciderQuickCheckTest, CancelPartway) {
   resolver_.set_ondemand_mode(true);
   EXPECT_THAT(StartDecider(), IsError(ERR_IO_PENDING));
-  decider_.reset(NULL);
+  decider_.reset(nullptr);
 }
 
 // Fails at WPAD (downloading), but succeeds in choosing the custom PAC.
@@ -499,7 +499,7 @@
   Rules::Rule rule = rules.AddSuccessRule("http://custom/proxy.pac");
 
   TestCompletionCallback callback;
-  PacFileDecider decider(&fetcher, &dhcp_fetcher, NULL);
+  PacFileDecider decider(&fetcher, &dhcp_fetcher, nullptr);
   EXPECT_THAT(decider.Start(ProxyConfigWithAnnotation(
                                 config, TRAFFIC_ANNOTATION_FOR_TESTS),
                             base::TimeDelta(), true, callback.callback()),
@@ -593,7 +593,7 @@
   rules.AddFailDownloadRule("http://custom/proxy.pac");
 
   TestCompletionCallback callback;
-  PacFileDecider decider(&fetcher, &dhcp_fetcher, NULL);
+  PacFileDecider decider(&fetcher, &dhcp_fetcher, nullptr);
   EXPECT_THAT(decider.Start(ProxyConfigWithAnnotation(
                                 config, TRAFFIC_ANNOTATION_FOR_TESTS),
                             base::TimeDelta(), true, callback.callback()),
@@ -615,7 +615,7 @@
   rules.AddFailParsingRule("http://custom/proxy.pac");
 
   TestCompletionCallback callback;
-  PacFileDecider decider(&fetcher, &dhcp_fetcher, NULL);
+  PacFileDecider decider(&fetcher, &dhcp_fetcher, nullptr);
   EXPECT_THAT(decider.Start(ProxyConfigWithAnnotation(
                                 config, TRAFFIC_ANNOTATION_FOR_TESTS),
                             base::TimeDelta(), true, callback.callback()),
@@ -753,7 +753,7 @@
   rules.AddFailDownloadRule("http://wpad/wpad.dat");
 
   TestCompletionCallback callback;
-  PacFileDecider decider(&fetcher, &dhcp_fetcher, NULL);
+  PacFileDecider decider(&fetcher, &dhcp_fetcher, nullptr);
   EXPECT_THAT(decider.Start(ProxyConfigWithAnnotation(
                                 config, TRAFFIC_ANNOTATION_FOR_TESTS),
                             base::TimeDelta(), true, callback.callback()),
@@ -779,7 +779,7 @@
   rules.AddFailDownloadRule("http://wpad/wpad.dat");
 
   TestCompletionCallback callback;
-  PacFileDecider decider(&fetcher, &dhcp_fetcher, NULL);
+  PacFileDecider decider(&fetcher, &dhcp_fetcher, nullptr);
   // Since there is fallback to DNS-based WPAD, the final error will be that
   // it failed downloading, not that it failed parsing.
   EXPECT_THAT(decider.Start(ProxyConfigWithAnnotation(
@@ -846,7 +846,7 @@
 
   // Scope so PacFileDecider gets destroyed early.
   {
-    PacFileDecider decider(&fetcher, dhcp_fetcher.get(), NULL);
+    PacFileDecider decider(&fetcher, dhcp_fetcher.get(), nullptr);
     decider.Start(
         ProxyConfigWithAnnotation(config, TRAFFIC_ANNOTATION_FOR_TESTS),
         base::TimeDelta(), true, callback.callback());
diff --git a/net/proxy_resolution/pac_file_fetcher_impl.cc b/net/proxy_resolution/pac_file_fetcher_impl.cc
index e9e919b..4e7b612 100644
--- a/net/proxy_resolution/pac_file_fetcher_impl.cc
+++ b/net/proxy_resolution/pac_file_fetcher_impl.cc
@@ -331,7 +331,7 @@
       next_id_(0),
       cur_request_id_(0),
       result_code_(OK),
-      result_text_(NULL),
+      result_text_(nullptr),
       max_response_bytes_(kDefaultMaxResponseBytes),
       max_duration_(kDefaultMaxDuration),
       allow_file_url_(allow_file_url),
@@ -425,7 +425,7 @@
   cur_request_id_ = 0;
   callback_.Reset();
   result_code_ = OK;
-  result_text_ = NULL;
+  result_text_ = nullptr;
   fetch_start_time_ = base::TimeTicks();
   fetch_time_to_first_byte_ = base::TimeTicks();
 }
diff --git a/net/proxy_resolution/polling_proxy_config_service.cc b/net/proxy_resolution/polling_proxy_config_service.cc
index 1035de7..1f39e6f 100644
--- a/net/proxy_resolution/polling_proxy_config_service.cc
+++ b/net/proxy_resolution/polling_proxy_config_service.cc
@@ -38,7 +38,7 @@
   // (observers should not be called past this point).
   void Orphan() {
     base::AutoLock lock(lock_);
-    origin_task_runner_ = NULL;
+    origin_task_runner_ = nullptr;
   }
 
   bool GetLatestProxyConfig(ProxyConfigWithAnnotation* config) {
diff --git a/net/proxy_resolution/proxy_config.cc b/net/proxy_resolution/proxy_config.cc
index 9cfe6d1..091c685 100644
--- a/net/proxy_resolution/proxy_config.cc
+++ b/net/proxy_resolution/proxy_config.cc
@@ -150,7 +150,7 @@
     return GetProxyListForWebSocketScheme();
   if (!fallback_proxies.IsEmpty())
     return &fallback_proxies;
-  return NULL;  // No mapping for this scheme. Use direct.
+  return nullptr;  // No mapping for this scheme. Use direct.
 }
 
 bool ProxyConfig::ProxyRules::Equals(const ProxyRules& other) const {
@@ -172,7 +172,7 @@
     return &proxies_for_https;
   if (scheme == "ftp")
     return &proxies_for_ftp;
-  return NULL;  // No mapping for this scheme.
+  return nullptr;  // No mapping for this scheme.
 }
 
 const ProxyList* ProxyConfig::ProxyRules::GetProxyListForWebSocketScheme()
@@ -183,7 +183,7 @@
     return &proxies_for_https;
   if (!proxies_for_http.IsEmpty())
     return &proxies_for_http;
-  return NULL;
+  return nullptr;
 }
 
 ProxyConfig::ProxyConfig() : auto_detect_(false), pac_mandatory_(false) {}
diff --git a/net/proxy_resolution/proxy_config_service_win_unittest.cc b/net/proxy_resolution/proxy_config_service_win_unittest.cc
index 147e86c..5665e3b9 100644
--- a/net/proxy_resolution/proxy_config_service_win_unittest.cc
+++ b/net/proxy_resolution/proxy_config_service_win_unittest.cc
@@ -30,171 +30,180 @@
     ProxyRulesExpectation proxy_rules;
     const char* proxy_bypass_list;  // newline separated
   } tests[] = {
-    // Auto detect.
-    {
-      { // Input.
-        TRUE,  // fAutoDetect
-        NULL,  // lpszAutoConfigUrl
-        NULL,  // lpszProxy
-        NULL,  // lpszProxyBypass
+      // Auto detect.
+      {
+          {
+              // Input.
+              TRUE,     // fAutoDetect
+              nullptr,  // lpszAutoConfigUrl
+              nullptr,  // lpszProxy
+              nullptr,  // lpszProxyBypass
+          },
+
+          // Expected result.
+          true,    // auto_detect
+          GURL(),  // pac_url
+          ProxyRulesExpectation::Empty(),
       },
 
-      // Expected result.
-      true,                       // auto_detect
-      GURL(),                     // pac_url
-      ProxyRulesExpectation::Empty(),
-    },
+      // Valid PAC url
+      {
+          {
+              // Input.
+              FALSE,                    // fAutoDetect
+              L"http://wpad/wpad.dat",  // lpszAutoConfigUrl
+              nullptr,                  // lpszProxy
+              nullptr,                  // lpszProxy_bypass
+          },
 
-    // Valid PAC url
-    {
-      { // Input.
-        FALSE,                    // fAutoDetect
-        L"http://wpad/wpad.dat",  // lpszAutoConfigUrl
-        NULL,                     // lpszProxy
-        NULL,                     // lpszProxy_bypass
+          // Expected result.
+          false,                         // auto_detect
+          GURL("http://wpad/wpad.dat"),  // pac_url
+          ProxyRulesExpectation::Empty(),
       },
 
-      // Expected result.
-      false,                         // auto_detect
-      GURL("http://wpad/wpad.dat"),  // pac_url
-      ProxyRulesExpectation::Empty(),
-    },
+      // Invalid PAC url string.
+      {
+          {
+              // Input.
+              FALSE,        // fAutoDetect
+              L"wpad.dat",  // lpszAutoConfigUrl
+              nullptr,      // lpszProxy
+              nullptr,      // lpszProxy_bypass
+          },
 
-    // Invalid PAC url string.
-    {
-      { // Input.
-        FALSE,        // fAutoDetect
-        L"wpad.dat",  // lpszAutoConfigUrl
-        NULL,         // lpszProxy
-        NULL,         // lpszProxy_bypass
+          // Expected result.
+          false,   // auto_detect
+          GURL(),  // pac_url
+          ProxyRulesExpectation::Empty(),
       },
 
-      // Expected result.
-      false,                      // auto_detect
-      GURL(),                     // pac_url
-      ProxyRulesExpectation::Empty(),
-    },
+      // Single-host in proxy list.
+      {
+          {
+              // Input.
+              FALSE,              // fAutoDetect
+              nullptr,            // lpszAutoConfigUrl
+              L"www.google.com",  // lpszProxy
+              nullptr,            // lpszProxy_bypass
+          },
 
-    // Single-host in proxy list.
-    {
-      { // Input.
-        FALSE,              // fAutoDetect
-        NULL,               // lpszAutoConfigUrl
-        L"www.google.com",  // lpszProxy
-        NULL,               // lpszProxy_bypass
+          // Expected result.
+          false,                                              // auto_detect
+          GURL(),                                             // pac_url
+          ProxyRulesExpectation::Single("www.google.com:80",  // single proxy
+                                        ""),                  // bypass rules
       },
 
-      // Expected result.
-      false,                                   // auto_detect
-      GURL(),                                  // pac_url
-      ProxyRulesExpectation::Single(
-          "www.google.com:80",  // single proxy
-          ""),                  // bypass rules
-    },
+      // Per-scheme proxy rules.
+      {
+          {
+              // Input.
+              FALSE,    // fAutoDetect
+              nullptr,  // lpszAutoConfigUrl
+              L"http=www.google.com:80;https=www.foo.com:110",  // lpszProxy
+              nullptr,  // lpszProxy_bypass
+          },
 
-    // Per-scheme proxy rules.
-    {
-      { // Input.
-        FALSE,                                            // fAutoDetect
-        NULL,                                             // lpszAutoConfigUrl
-        L"http=www.google.com:80;https=www.foo.com:110",  // lpszProxy
-        NULL,                                             // lpszProxy_bypass
+          // Expected result.
+          false,                                                 // auto_detect
+          GURL(),                                                // pac_url
+          ProxyRulesExpectation::PerScheme("www.google.com:80",  // http
+                                           "www.foo.com:110",    // https
+                                           "",                   // ftp
+                                           ""),                  // bypass rules
       },
 
-      // Expected result.
-      false,                                   // auto_detect
-      GURL(),                                  // pac_url
-      ProxyRulesExpectation::PerScheme(
-          "www.google.com:80",  // http
-          "www.foo.com:110",   // https
-          "",                  // ftp
-          ""),                 // bypass rules
-    },
+      // SOCKS proxy configuration.
+      {
+          {
+              // Input.
+              FALSE,    // fAutoDetect
+              nullptr,  // lpszAutoConfigUrl
+              L"http=www.google.com:80;https=www.foo.com:110;"
+              L"ftp=ftpproxy:20;socks=foopy:130",  // lpszProxy
+              nullptr,                             // lpszProxy_bypass
+          },
 
-    // SOCKS proxy configuration.
-    {
-      { // Input.
-        FALSE,                                            // fAutoDetect
-        NULL,                                             // lpszAutoConfigUrl
-        L"http=www.google.com:80;https=www.foo.com:110;"
-        L"ftp=ftpproxy:20;socks=foopy:130",               // lpszProxy
-        NULL,                                             // lpszProxy_bypass
+          // Expected result.
+          // Note that "socks" is interprted as meaning "socks4", since that is
+          // how
+          // Internet Explorer applies the settings. For more details on this
+          // policy, see:
+          // http://code.google.com/p/chromium/issues/detail?id=55912#c2
+          false,   // auto_detect
+          GURL(),  // pac_url
+          ProxyRulesExpectation::PerSchemeWithSocks(
+              "www.google.com:80",   // http
+              "www.foo.com:110",     // https
+              "ftpproxy:20",         // ftp
+              "socks4://foopy:130",  // socks
+              ""),                   // bypass rules
       },
 
-      // Expected result.
-      // Note that "socks" is interprted as meaning "socks4", since that is how
-      // Internet Explorer applies the settings. For more details on this
-      // policy, see:
-      // http://code.google.com/p/chromium/issues/detail?id=55912#c2
-      false,                                   // auto_detect
-      GURL(),                                  // pac_url
-      ProxyRulesExpectation::PerSchemeWithSocks(
-          "www.google.com:80",   // http
-          "www.foo.com:110",     // https
-          "ftpproxy:20",         // ftp
-          "socks4://foopy:130",  // socks
-          ""),                   // bypass rules
-    },
+      // Bypass local names.
+      {
+          {
+              // Input.
+              TRUE,        // fAutoDetect
+              nullptr,     // lpszAutoConfigUrl
+              nullptr,     // lpszProxy
+              L"<local>",  // lpszProxy_bypass
+          },
 
-    // Bypass local names.
-    {
-      { // Input.
-        TRUE,            // fAutoDetect
-        NULL,            // lpszAutoConfigUrl
-        NULL,            // lpszProxy
-        L"<local>",      // lpszProxy_bypass
+          true,    // auto_detect
+          GURL(),  // pac_url
+          ProxyRulesExpectation::EmptyWithBypass("<local>"),
       },
 
-      true,                       // auto_detect
-      GURL(),                     // pac_url
-      ProxyRulesExpectation::EmptyWithBypass("<local>"),
-    },
+      // Bypass "google.com" and local names, using semicolon as delimiter
+      // (ignoring white space).
+      {
+          {
+              // Input.
+              TRUE,                     // fAutoDetect
+              nullptr,                  // lpszAutoConfigUrl
+              nullptr,                  // lpszProxy
+              L"<local> ; google.com",  // lpszProxy_bypass
+          },
 
-    // Bypass "google.com" and local names, using semicolon as delimiter
-    // (ignoring white space).
-    {
-      { // Input.
-        TRUE,                         // fAutoDetect
-        NULL,                         // lpszAutoConfigUrl
-        NULL,                         // lpszProxy
-        L"<local> ; google.com",      // lpszProxy_bypass
+          // Expected result.
+          true,    // auto_detect
+          GURL(),  // pac_url
+          ProxyRulesExpectation::EmptyWithBypass("<local>,google.com"),
       },
 
-      // Expected result.
-      true,                       // auto_detect
-      GURL(),                     // pac_url
-      ProxyRulesExpectation::EmptyWithBypass("<local>,google.com"),
-    },
+      // Bypass "foo.com" and "google.com", using lines as delimiter.
+      {
+          {
+              // Input.
+              TRUE,                      // fAutoDetect
+              nullptr,                   // lpszAutoConfigUrl
+              nullptr,                   // lpszProxy
+              L"foo.com\r\ngoogle.com",  // lpszProxy_bypass
+          },
 
-    // Bypass "foo.com" and "google.com", using lines as delimiter.
-    {
-      { // Input.
-        TRUE,                      // fAutoDetect
-        NULL,                      // lpszAutoConfigUrl
-        NULL,                      // lpszProxy
-        L"foo.com\r\ngoogle.com",  // lpszProxy_bypass
+          // Expected result.
+          true,    // auto_detect
+          GURL(),  // pac_url
+          ProxyRulesExpectation::EmptyWithBypass("foo.com,google.com"),
       },
 
-      // Expected result.
-      true,                       // auto_detect
-      GURL(),                     // pac_url
-      ProxyRulesExpectation::EmptyWithBypass("foo.com,google.com"),
-    },
+      // Bypass "foo.com" and "google.com", using commas as delimiter.
+      {
+          {
+              // Input.
+              TRUE,                    // fAutoDetect
+              nullptr,                 // lpszAutoConfigUrl
+              nullptr,                 // lpszProxy
+              L"foo.com, google.com",  // lpszProxy_bypass
+          },
 
-    // Bypass "foo.com" and "google.com", using commas as delimiter.
-    {
-      { // Input.
-        TRUE,                      // fAutoDetect
-        NULL,                      // lpszAutoConfigUrl
-        NULL,                      // lpszProxy
-        L"foo.com, google.com",    // lpszProxy_bypass
+          // Expected result.
+          true,    // auto_detect
+          GURL(),  // pac_url
+          ProxyRulesExpectation::EmptyWithBypass("foo.com,google.com"),
       },
-
-      // Expected result.
-      true,                       // auto_detect
-      GURL(),                     // pac_url
-      ProxyRulesExpectation::EmptyWithBypass("foo.com,google.com"),
-    },
   };
 
   for (size_t i = 0; i < base::size(tests); ++i) {
diff --git a/net/proxy_resolution/proxy_config_unittest.cc b/net/proxy_resolution/proxy_config_unittest.cc
index 2902fd8f..eeaacce 100644
--- a/net/proxy_resolution/proxy_config_unittest.cc
+++ b/net/proxy_resolution/proxy_config_unittest.cc
@@ -13,7 +13,7 @@
 
 void ExpectProxyServerEquals(const char* expectation,
                              const ProxyList& proxy_servers) {
-  if (expectation == NULL) {
+  if (expectation == nullptr) {
     EXPECT_TRUE(proxy_servers.IsEmpty());
   } else {
     EXPECT_EQ(expectation, proxy_servers.ToPacString());
@@ -108,202 +108,204 @@
     const char* proxy_for_ftp;
     const char* fallback_proxy;
   } tests[] = {
-    // One HTTP proxy for all schemes.
-    {
-      "myproxy:80",
+      // One HTTP proxy for all schemes.
+      {
+          "myproxy:80",
 
-      ProxyConfig::ProxyRules::Type::PROXY_LIST,
-      "PROXY myproxy:80",
-      NULL,
-      NULL,
-      NULL,
-      NULL,
-    },
-
-    // Multiple HTTP proxies for all schemes.
-    {
-      "myproxy:80,https://myotherproxy",
-
-      ProxyConfig::ProxyRules::Type::PROXY_LIST,
-      "PROXY myproxy:80;HTTPS myotherproxy:443",
-      NULL,
-      NULL,
-      NULL,
-      NULL,
-    },
-
-    // Only specify a proxy server for "http://" urls.
-    {
-      "http=myproxy:80",
-
-      ProxyConfig::ProxyRules::Type::PROXY_LIST_PER_SCHEME,
-      NULL,
-      "PROXY myproxy:80",
-      NULL,
-      NULL,
-      NULL,
-    },
-
-    // Specify an HTTP proxy for "ftp://" and a SOCKS proxy for "https://" urls.
-    {
-      "ftp=ftp-proxy ; https=socks4://foopy",
-
-      ProxyConfig::ProxyRules::Type::PROXY_LIST_PER_SCHEME,
-      NULL,
-      NULL,
-      "SOCKS foopy:1080",
-      "PROXY ftp-proxy:80",
-      NULL,
-    },
-
-    // Give a scheme-specific proxy as well as a non-scheme specific.
-    // The first entry "foopy" takes precedance marking this list as
-    // Type::PROXY_LIST.
-    {
-      "foopy ; ftp=ftp-proxy",
-
-      ProxyConfig::ProxyRules::Type::PROXY_LIST,
-      "PROXY foopy:80",
-      NULL,
-      NULL,
-      NULL,
-      NULL,
-    },
-
-    // Give a scheme-specific proxy as well as a non-scheme specific.
-    // The first entry "ftp=ftp-proxy" takes precedance marking this list as
-    // Type::PROXY_LIST_PER_SCHEME.
-    {
-      "ftp=ftp-proxy ; foopy",
-
-      ProxyConfig::ProxyRules::Type::PROXY_LIST_PER_SCHEME,
-      NULL,
-      NULL,
-      NULL,
-      "PROXY ftp-proxy:80",
-      NULL,
-    },
-
-    // Include a list of entries for a single scheme.
-    {
-      "ftp=ftp1,ftp2,ftp3",
-
-      ProxyConfig::ProxyRules::Type::PROXY_LIST_PER_SCHEME,
-      NULL,
-      NULL,
-      NULL,
-      "PROXY ftp1:80;PROXY ftp2:80;PROXY ftp3:80",
-      NULL,
-    },
-
-    // Include multiple entries for the same scheme -- they accumulate.
-    {
-      "http=http1,http2; http=http3",
-
-      ProxyConfig::ProxyRules::Type::PROXY_LIST_PER_SCHEME,
-      NULL,
-      "PROXY http1:80;PROXY http2:80;PROXY http3:80",
-      NULL,
-      NULL,
-      NULL,
-    },
-
-    // Include lists of entries for multiple schemes.
-    {
-      "ftp=ftp1,ftp2,ftp3 ; http=http1,http2; ",
-
-      ProxyConfig::ProxyRules::Type::PROXY_LIST_PER_SCHEME,
-      NULL,
-      "PROXY http1:80;PROXY http2:80",
-      NULL,
-      "PROXY ftp1:80;PROXY ftp2:80;PROXY ftp3:80",
-      NULL,
-    },
-
-    // Include non-default proxy schemes.
-    {
-      "http=https://secure_proxy; ftp=socks4://socks_proxy; https=socks://foo",
-
-      ProxyConfig::ProxyRules::Type::PROXY_LIST_PER_SCHEME,
-      NULL,
-      "HTTPS secure_proxy:443",
-      "SOCKS5 foo:1080",
-      "SOCKS socks_proxy:1080",
-      NULL,
-    },
-
-    // Only SOCKS proxy present, others being blank.
-    {
-      "socks=foopy",
-
-      ProxyConfig::ProxyRules::Type::PROXY_LIST_PER_SCHEME,
-      NULL,
-      NULL,
-      NULL,
-      NULL,
-      "SOCKS foopy:1080",
+          ProxyConfig::ProxyRules::Type::PROXY_LIST,
+          "PROXY myproxy:80",
+          nullptr,
+          nullptr,
+          nullptr,
+          nullptr,
       },
 
-    // SOCKS proxy present along with other proxies too
-    {
-      "http=httpproxy ; https=httpsproxy ; ftp=ftpproxy ; socks=foopy ",
+      // Multiple HTTP proxies for all schemes.
+      {
+          "myproxy:80,https://myotherproxy",
 
-      ProxyConfig::ProxyRules::Type::PROXY_LIST_PER_SCHEME,
-      NULL,
-      "PROXY httpproxy:80",
-      "PROXY httpsproxy:80",
-      "PROXY ftpproxy:80",
-      "SOCKS foopy:1080",
-    },
-
-    // SOCKS proxy (with modifier) present along with some proxies
-    // (FTP being blank)
-    {
-      "http=httpproxy ; https=httpsproxy ; socks=socks5://foopy ",
-
-      ProxyConfig::ProxyRules::Type::PROXY_LIST_PER_SCHEME,
-      NULL,
-      "PROXY httpproxy:80",
-      "PROXY httpsproxy:80",
-      NULL,
-      "SOCKS5 foopy:1080",
+          ProxyConfig::ProxyRules::Type::PROXY_LIST,
+          "PROXY myproxy:80;HTTPS myotherproxy:443",
+          nullptr,
+          nullptr,
+          nullptr,
+          nullptr,
       },
 
-    // Include unsupported schemes -- they are discarded.
-    {
-      "crazy=foopy ; foo=bar ; https=myhttpsproxy",
+      // Only specify a proxy server for "http://" urls.
+      {
+          "http=myproxy:80",
 
-      ProxyConfig::ProxyRules::Type::PROXY_LIST_PER_SCHEME,
-      NULL,
-      NULL,
-      "PROXY myhttpsproxy:80",
-      NULL,
-      NULL,
-    },
+          ProxyConfig::ProxyRules::Type::PROXY_LIST_PER_SCHEME,
+          nullptr,
+          "PROXY myproxy:80",
+          nullptr,
+          nullptr,
+          nullptr,
+      },
 
-    // direct:// as first option for a scheme.
-    {
-      "http=direct://,myhttpproxy; https=direct://",
+      // Specify an HTTP proxy for "ftp://" and a SOCKS proxy for "https://"
+      // urls.
+      {
+          "ftp=ftp-proxy ; https=socks4://foopy",
 
-      ProxyConfig::ProxyRules::Type::PROXY_LIST_PER_SCHEME,
-      NULL,
-      "DIRECT;PROXY myhttpproxy:80",
-      "DIRECT",
-      NULL,
-      NULL,
-    },
+          ProxyConfig::ProxyRules::Type::PROXY_LIST_PER_SCHEME,
+          nullptr,
+          nullptr,
+          "SOCKS foopy:1080",
+          "PROXY ftp-proxy:80",
+          nullptr,
+      },
 
-    // direct:// as a second option for a scheme.
-    {
-      "http=myhttpproxy,direct://",
+      // Give a scheme-specific proxy as well as a non-scheme specific.
+      // The first entry "foopy" takes precedance marking this list as
+      // Type::PROXY_LIST.
+      {
+          "foopy ; ftp=ftp-proxy",
 
-      ProxyConfig::ProxyRules::Type::PROXY_LIST_PER_SCHEME,
-      NULL,
-      "PROXY myhttpproxy:80;DIRECT",
-      NULL,
-      NULL,
-      NULL,
-    },
+          ProxyConfig::ProxyRules::Type::PROXY_LIST,
+          "PROXY foopy:80",
+          nullptr,
+          nullptr,
+          nullptr,
+          nullptr,
+      },
+
+      // Give a scheme-specific proxy as well as a non-scheme specific.
+      // The first entry "ftp=ftp-proxy" takes precedance marking this list as
+      // Type::PROXY_LIST_PER_SCHEME.
+      {
+          "ftp=ftp-proxy ; foopy",
+
+          ProxyConfig::ProxyRules::Type::PROXY_LIST_PER_SCHEME,
+          nullptr,
+          nullptr,
+          nullptr,
+          "PROXY ftp-proxy:80",
+          nullptr,
+      },
+
+      // Include a list of entries for a single scheme.
+      {
+          "ftp=ftp1,ftp2,ftp3",
+
+          ProxyConfig::ProxyRules::Type::PROXY_LIST_PER_SCHEME,
+          nullptr,
+          nullptr,
+          nullptr,
+          "PROXY ftp1:80;PROXY ftp2:80;PROXY ftp3:80",
+          nullptr,
+      },
+
+      // Include multiple entries for the same scheme -- they accumulate.
+      {
+          "http=http1,http2; http=http3",
+
+          ProxyConfig::ProxyRules::Type::PROXY_LIST_PER_SCHEME,
+          nullptr,
+          "PROXY http1:80;PROXY http2:80;PROXY http3:80",
+          nullptr,
+          nullptr,
+          nullptr,
+      },
+
+      // Include lists of entries for multiple schemes.
+      {
+          "ftp=ftp1,ftp2,ftp3 ; http=http1,http2; ",
+
+          ProxyConfig::ProxyRules::Type::PROXY_LIST_PER_SCHEME,
+          nullptr,
+          "PROXY http1:80;PROXY http2:80",
+          nullptr,
+          "PROXY ftp1:80;PROXY ftp2:80;PROXY ftp3:80",
+          nullptr,
+      },
+
+      // Include non-default proxy schemes.
+      {
+          "http=https://secure_proxy; ftp=socks4://socks_proxy; "
+          "https=socks://foo",
+
+          ProxyConfig::ProxyRules::Type::PROXY_LIST_PER_SCHEME,
+          nullptr,
+          "HTTPS secure_proxy:443",
+          "SOCKS5 foo:1080",
+          "SOCKS socks_proxy:1080",
+          nullptr,
+      },
+
+      // Only SOCKS proxy present, others being blank.
+      {
+          "socks=foopy",
+
+          ProxyConfig::ProxyRules::Type::PROXY_LIST_PER_SCHEME,
+          nullptr,
+          nullptr,
+          nullptr,
+          nullptr,
+          "SOCKS foopy:1080",
+      },
+
+      // SOCKS proxy present along with other proxies too
+      {
+          "http=httpproxy ; https=httpsproxy ; ftp=ftpproxy ; socks=foopy ",
+
+          ProxyConfig::ProxyRules::Type::PROXY_LIST_PER_SCHEME,
+          nullptr,
+          "PROXY httpproxy:80",
+          "PROXY httpsproxy:80",
+          "PROXY ftpproxy:80",
+          "SOCKS foopy:1080",
+      },
+
+      // SOCKS proxy (with modifier) present along with some proxies
+      // (FTP being blank)
+      {
+          "http=httpproxy ; https=httpsproxy ; socks=socks5://foopy ",
+
+          ProxyConfig::ProxyRules::Type::PROXY_LIST_PER_SCHEME,
+          nullptr,
+          "PROXY httpproxy:80",
+          "PROXY httpsproxy:80",
+          nullptr,
+          "SOCKS5 foopy:1080",
+      },
+
+      // Include unsupported schemes -- they are discarded.
+      {
+          "crazy=foopy ; foo=bar ; https=myhttpsproxy",
+
+          ProxyConfig::ProxyRules::Type::PROXY_LIST_PER_SCHEME,
+          nullptr,
+          nullptr,
+          "PROXY myhttpsproxy:80",
+          nullptr,
+          nullptr,
+      },
+
+      // direct:// as first option for a scheme.
+      {
+          "http=direct://,myhttpproxy; https=direct://",
+
+          ProxyConfig::ProxyRules::Type::PROXY_LIST_PER_SCHEME,
+          nullptr,
+          "DIRECT;PROXY myhttpproxy:80",
+          "DIRECT",
+          nullptr,
+          nullptr,
+      },
+
+      // direct:// as a second option for a scheme.
+      {
+          "http=myhttpproxy,direct://",
+
+          ProxyConfig::ProxyRules::Type::PROXY_LIST_PER_SCHEME,
+          nullptr,
+          "PROXY myhttpproxy:80;DIRECT",
+          nullptr,
+          nullptr,
+          nullptr,
+      },
 
   };
 
diff --git a/net/proxy_resolution/proxy_resolution_service.cc b/net/proxy_resolution/proxy_resolution_service.cc
index a657d1ff..133bff3 100644
--- a/net/proxy_resolution/proxy_resolution_service.cc
+++ b/net/proxy_resolution/proxy_resolution_service.cc
@@ -431,7 +431,7 @@
  public:
   InitProxyResolver()
       : proxy_resolver_factory_(nullptr),
-        proxy_resolver_(NULL),
+        proxy_resolver_(nullptr),
         resolver_using_auto_detected_script_(nullptr),
         next_state_(STATE_NONE),
         quick_check_enabled_(true) {}
@@ -747,7 +747,7 @@
     // Start the PAC file decider to see if anything has changed.
     // TODO(eroman): Pass a proper NetLog rather than NULL.
     decider_.reset(
-        new PacFileDecider(pac_file_fetcher_, dhcp_pac_file_fetcher_, NULL));
+        new PacFileDecider(pac_file_fetcher_, dhcp_pac_file_fetcher_, nullptr));
     decider_->set_quick_check_enabled(quick_check_enabled_);
     int result = decider_->Start(
         config_, TimeDelta(), proxy_resolver_expects_pac_bytes_,
@@ -844,7 +844,7 @@
 
 // static
 const ProxyResolutionService::PacPollPolicy*
-    ProxyResolutionService::PacFileDeciderPoller::poll_policy_ = NULL;
+    ProxyResolutionService::PacFileDeciderPoller::poll_policy_ = nullptr;
 
 class ProxyResolutionService::RequestImpl
     : public ProxyResolutionService::Request {
@@ -1097,7 +1097,7 @@
   // TODO(eroman): This isn't quite right, won't work if |pc| specifies
   //               a PAC script.
   return CreateUsingSystemProxyResolver(
-      std::make_unique<ProxyConfigServiceFixed>(pc), NULL);
+      std::make_unique<ProxyConfigServiceFixed>(pc), nullptr);
 }
 
 // static
@@ -1339,7 +1339,7 @@
                  base::Unretained(this)),
       fetched_config_.value(), resolver_factory_->expects_pac_bytes(),
       pac_file_fetcher_.get(), dhcp_pac_file_fetcher_.get(), result,
-      init_proxy_resolver_->script_data(), NULL));
+      init_proxy_resolver_->script_data(), nullptr));
   script_poller_->set_quick_check_enabled(quick_check_enabled_);
 
   init_proxy_resolver_.reset();
diff --git a/net/proxy_resolution/proxy_resolver_v8.cc b/net/proxy_resolution/proxy_resolver_v8.cc
index 486b08d..2ac6072 100644
--- a/net/proxy_resolution/proxy_resolver_v8.cc
+++ b/net/proxy_resolution/proxy_resolver_v8.cc
@@ -407,7 +407,7 @@
 
   v8::Isolate* GetSharedIsolateWithoutCreating() {
     base::AutoLock lock(lock_);
-    return holder_ ? holder_->isolate() : NULL;
+    return holder_ ? holder_->isolate() : nullptr;
   }
 
  private:
@@ -567,8 +567,8 @@
     global_template->Set(ASCIILiteralToV8String(isolate_, "isInNetEx"),
                          is_in_net_ex_template);
 
-    v8_context_.Reset(
-        isolate_, v8::Context::New(isolate_, NULL, global_template));
+    v8_context_.Reset(isolate_,
+                      v8::Context::New(isolate_, nullptr, global_template));
 
     v8::Local<v8::Context> context =
         v8::Local<v8::Context>::New(isolate_, v8_context_);
diff --git a/net/proxy_resolution/proxy_resolver_v8_tracing.cc b/net/proxy_resolution/proxy_resolver_v8_tracing.cc
index 8e16acc..5744166c 100644
--- a/net/proxy_resolution/proxy_resolver_v8_tracing.cc
+++ b/net/proxy_resolution/proxy_resolver_v8_tracing.cc
@@ -412,7 +412,7 @@
   event_.Signal();
 
   bindings_.reset();
-  owned_self_reference_ = NULL;
+  owned_self_reference_ = nullptr;
 }
 
 LoadState Job::GetLoadState() const {
@@ -452,7 +452,7 @@
   callback_.Reset();
 
   // For good measure, clear this other user-owned pointer.
-  user_results_ = NULL;
+  user_results_ = nullptr;
 }
 
 ProxyResolverV8* Job::v8_resolver() {
@@ -499,7 +499,7 @@
   std::move(callback).Run(result);
 
   bindings_.reset();
-  owned_self_reference_ = NULL;
+  owned_self_reference_ = nullptr;
 }
 
 void Job::Start(Operation op,
@@ -632,7 +632,7 @@
     return false;
   }
 
-  if (!PostDnsOperationAndWait(host, op, NULL))
+  if (!PostDnsOperationAndWait(host, op, nullptr))
     return false;  // Was cancelled.
 
   CHECK(GetDnsFromLocalCache(host, op, output, &rv));
diff --git a/net/proxy_resolution/proxy_resolver_winhttp.cc b/net/proxy_resolution/proxy_resolver_winhttp.cc
index 4ff81f7e..ecffcd6c 100644
--- a/net/proxy_resolution/proxy_resolver_winhttp.cc
+++ b/net/proxy_resolution/proxy_resolver_winhttp.cc
@@ -76,7 +76,7 @@
 
 ProxyResolverWinHttp::ProxyResolverWinHttp(
     const scoped_refptr<PacFileData>& script_data)
-    : session_handle_(NULL),
+    : session_handle_(nullptr),
       pac_url_(script_data->type() == PacFileData::TYPE_AUTO_DETECT
                    ? GURL("http://wpad/wpad.dat")
                    : script_data->url()) {}
@@ -186,11 +186,9 @@
 
 bool ProxyResolverWinHttp::OpenWinHttpSession() {
   DCHECK(!session_handle_);
-  session_handle_ = WinHttpOpen(NULL,
-                                WINHTTP_ACCESS_TYPE_NO_PROXY,
-                                WINHTTP_NO_PROXY_NAME,
-                                WINHTTP_NO_PROXY_BYPASS,
-                                0);
+  session_handle_ =
+      WinHttpOpen(nullptr, WINHTTP_ACCESS_TYPE_NO_PROXY, WINHTTP_NO_PROXY_NAME,
+                  WINHTTP_NO_PROXY_BYPASS, 0);
   if (!session_handle_)
     return false;
 
@@ -207,7 +205,7 @@
 void ProxyResolverWinHttp::CloseWinHttpSession() {
   if (session_handle_) {
     WinHttpCloseHandle(session_handle_);
-    session_handle_ = NULL;
+    session_handle_ = nullptr;
   }
 }
 
diff --git a/net/quic/bidirectional_stream_quic_impl_unittest.cc b/net/quic/bidirectional_stream_quic_impl_unittest.cc
index b33a44ec..9b23b54 100644
--- a/net/quic/bidirectional_stream_quic_impl_unittest.cc
+++ b/net/quic/bidirectional_stream_quic_impl_unittest.cc
@@ -1744,9 +1744,9 @@
   // Server sends the response headers.
   spdy::SpdyHeaderBlock response_headers = ConstructResponseHeaders("200");
   size_t spdy_response_headers_frame_length;
-  ProcessPacket(
-      ConstructResponseHeadersPacket(2, !kFin, std::move(response_headers),
-                                     &spdy_response_headers_frame_length, 0));
+  ProcessPacket(ConstructResponseHeadersPacket(
+      2, !kFin, std::move(response_headers),
+      &spdy_response_headers_frame_length, nullptr));
 
   delegate->WaitUntilNextCallback(kOnHeadersReceived);
   EXPECT_EQ("200", delegate->response_headers().find(":status")->second);
@@ -2117,9 +2117,9 @@
   // Server sends the response headers.
   spdy::SpdyHeaderBlock response_headers = ConstructResponseHeaders("200");
   size_t spdy_response_headers_frame_length;
-  ProcessPacket(
-      ConstructResponseHeadersPacket(2, !kFin, std::move(response_headers),
-                                     &spdy_response_headers_frame_length, 0));
+  ProcessPacket(ConstructResponseHeadersPacket(
+      2, !kFin, std::move(response_headers),
+      &spdy_response_headers_frame_length, nullptr));
 
   delegate->WaitUntilNextCallback(kOnHeadersReceived);
   EXPECT_EQ("200", delegate->response_headers().find(":status")->second);
diff --git a/net/quic/quic_proxy_client_socket_unittest.cc b/net/quic/quic_proxy_client_socket_unittest.cc
index 182b91a..e0a6bfe 100644
--- a/net/quic/quic_proxy_client_socket_unittest.cc
+++ b/net/quic/quic_proxy_client_socket_unittest.cc
@@ -1420,9 +1420,9 @@
   ResumeAndRun();
 
   ASSERT_FALSE(sock_->IsConnected());
-  ASSERT_EQ(0, sock_->Read(NULL, 1, CompletionOnceCallback()));
-  ASSERT_EQ(0, sock_->Read(NULL, 1, CompletionOnceCallback()));
-  ASSERT_EQ(0, sock_->Read(NULL, 1, CompletionOnceCallback()));
+  ASSERT_EQ(0, sock_->Read(nullptr, 1, CompletionOnceCallback()));
+  ASSERT_EQ(0, sock_->Read(nullptr, 1, CompletionOnceCallback()));
+  ASSERT_EQ(0, sock_->Read(nullptr, 1, CompletionOnceCallback()));
   ASSERT_FALSE(sock_->IsConnectedAndIdle());
 }
 
@@ -1490,8 +1490,8 @@
   ResumeAndRun();
 
   AssertSyncReadEquals(kMsg1, kLen1);
-  ASSERT_EQ(0, sock_->Read(NULL, 1, CompletionOnceCallback()));
-  ASSERT_EQ(0, sock_->Read(NULL, 1, CompletionOnceCallback()));
+  ASSERT_EQ(0, sock_->Read(nullptr, 1, CompletionOnceCallback()));
+  ASSERT_EQ(0, sock_->Read(nullptr, 1, CompletionOnceCallback()));
 
   sock_->Disconnect();
   ASSERT_EQ(ERR_SOCKET_NOT_CONNECTED,
@@ -1753,7 +1753,7 @@
 
  private:
   void OnComplete(int result) {
-    sock_->reset(NULL);
+    sock_->reset(nullptr);
     SetResult(result);
   }
 
diff --git a/net/quic/quic_utils_chromium.h b/net/quic/quic_utils_chromium.h
index 839c6d32..4932bfa 100644
--- a/net/quic/quic_utils_chromium.h
+++ b/net/quic/quic_utils_chromium.h
@@ -61,7 +61,7 @@
     const typename Collection::value_type::first_type& key) {
   typename Collection::const_iterator it = collection.find(key);
   if (it == collection.end()) {
-    return 0;
+    return nullptr;
   }
   return &it->second;
 }
@@ -73,7 +73,7 @@
     const typename Collection::value_type::first_type& key) {
   typename Collection::iterator it = collection.find(key);
   if (it == collection.end()) {
-    return 0;
+    return nullptr;
   }
   return &it->second;
 }
diff --git a/net/server/http_connection.cc b/net/server/http_connection.cc
index a42f23bc..0cf5d1a1 100644
--- a/net/server/http_connection.cc
+++ b/net/server/http_connection.cc
@@ -19,7 +19,7 @@
 }
 
 HttpConnection::ReadIOBuffer::~ReadIOBuffer() {
-  data_ = NULL;  // base_ owns data_.
+  data_ = nullptr;  // base_ owns data_.
 }
 
 int HttpConnection::ReadIOBuffer::GetCapacity() const {
@@ -97,7 +97,7 @@
 }
 
 HttpConnection::QueuedWriteIOBuffer::~QueuedWriteIOBuffer() {
-  data_ = NULL;  // pending_data_ owns data_.
+  data_ = nullptr;  // pending_data_ owns data_.
 }
 
 bool HttpConnection::QueuedWriteIOBuffer::IsEmpty() const {
@@ -134,7 +134,8 @@
     data_ += size;
   } else {  // size == GetSizeToWrite(). Updates data_ to next pending data.
     pending_data_.pop();
-    data_ = IsEmpty() ? NULL : const_cast<char*>(pending_data_.front()->data());
+    data_ =
+        IsEmpty() ? nullptr : const_cast<char*>(pending_data_.front()->data());
   }
   total_size_ -= size;
 }
diff --git a/net/server/http_server.cc b/net/server/http_server.cc
index 4c84b5d..cf711625c 100644
--- a/net/server/http_server.cc
+++ b/net/server/http_server.cc
@@ -73,7 +73,7 @@
     const HttpServerRequestInfo& request,
     NetworkTrafficAnnotationTag traffic_annotation) {
   HttpConnection* connection = FindConnection(connection_id);
-  if (connection == NULL)
+  if (connection == nullptr)
     return;
   DCHECK(connection->web_socket());
   connection->web_socket()->Accept(request, traffic_annotation);
@@ -84,7 +84,7 @@
     const std::string& data,
     NetworkTrafficAnnotationTag traffic_annotation) {
   HttpConnection* connection = FindConnection(connection_id);
-  if (connection == NULL)
+  if (connection == nullptr)
     return;
   DCHECK(connection->web_socket());
   connection->web_socket()->Send(data, traffic_annotation);
@@ -94,7 +94,7 @@
                          const std::string& data,
                          NetworkTrafficAnnotationTag traffic_annotation) {
   HttpConnection* connection = FindConnection(connection_id);
-  if (connection == NULL)
+  if (connection == nullptr)
     return;
 
   bool writing_in_progress = !connection->write_buf()->IsEmpty();
diff --git a/net/server/http_server_unittest.cc b/net/server/http_server_unittest.cc
index 19faad0..06de102f 100644
--- a/net/server/http_server_unittest.cc
+++ b/net/server/http_server_unittest.cc
@@ -67,7 +67,7 @@
   int ConnectAndWait(const IPEndPoint& address) {
     AddressList addresses(address);
     NetLogSource source;
-    socket_.reset(new TCPClientSocket(addresses, NULL, NULL, source));
+    socket_.reset(new TCPClientSocket(addresses, nullptr, nullptr, source));
 
     TestCompletionCallback callback;
     int rv = socket_->Connect(callback.callback());
@@ -177,7 +177,7 @@
 
   void SetUp() override {
     std::unique_ptr<ServerSocket> server_socket(
-        new TCPServerSocket(NULL, NetLogSource()));
+        new TCPServerSocket(nullptr, NetLogSource()));
     server_socket->ListenWithAddressAndPort("127.0.0.1", 0, 1);
     server_.reset(new HttpServer(std::move(server_socket), this));
     ASSERT_THAT(server_->GetLocalAddress(&server_address_), IsOk());
@@ -544,10 +544,7 @@
 
 class MockStreamSocket : public StreamSocket {
  public:
-  MockStreamSocket()
-      : connected_(true),
-        read_buf_(NULL),
-        read_buf_len_(0) {}
+  MockStreamSocket() : connected_(true), read_buf_(nullptr), read_buf_len_(0) {}
 
   // StreamSocket
   int Connect(CompletionOnceCallback callback) override {
@@ -556,7 +553,7 @@
   void Disconnect() override {
     connected_ = false;
     if (!read_callback_.is_null()) {
-      read_buf_ = NULL;
+      read_buf_ = nullptr;
       read_buf_len_ = 0;
       std::move(read_callback_).Run(ERR_CONNECTION_CLOSED);
     }
@@ -625,7 +622,7 @@
     int read_len = std::min(data_len, read_buf_len_);
     memcpy(read_buf_->data(), data, read_len);
     pending_read_data_.assign(data + read_len, data_len - read_len);
-    read_buf_ = NULL;
+    read_buf_ = nullptr;
     read_buf_len_ = 0;
     std::move(read_callback_).Run(read_len);
   }
diff --git a/net/socket/client_socket_handle.cc b/net/socket/client_socket_handle.cc
index 5ee34755..cd9f6f2f 100644
--- a/net/socket/client_socket_handle.cc
+++ b/net/socket/client_socket_handle.cc
@@ -20,8 +20,8 @@
 
 ClientSocketHandle::ClientSocketHandle()
     : is_initialized_(false),
-      pool_(NULL),
-      higher_pool_(NULL),
+      pool_(nullptr),
+      higher_pool_(nullptr),
       reuse_type_(ClientSocketHandle::UNUSED),
       is_ssl_error_(false) {}
 
@@ -74,7 +74,7 @@
   callback_.Reset();
   if (higher_pool_)
     RemoveHigherLayeredPool(higher_pool_);
-  pool_ = NULL;
+  pool_ = nullptr;
   idle_time_ = base::TimeDelta();
   // Connection timing is still needed for handling
   // ERR_HTTPS_PROXY_TUNNEL_RESPONSE_REDIRECT errors.
@@ -126,7 +126,7 @@
   CHECK_EQ(higher_pool_, higher_pool);
   if (pool_) {
     pool_->RemoveHigherLayeredPool(higher_pool);
-    higher_pool_ = NULL;
+    higher_pool_ = nullptr;
   }
 }
 
diff --git a/net/socket/client_socket_pool_base.cc b/net/socket/client_socket_pool_base.cc
index caae809..930311e 100644
--- a/net/socket/client_socket_pool_base.cc
+++ b/net/socket/client_socket_pool_base.cc
@@ -796,7 +796,7 @@
   while (true) {
     // If we have idle sockets, see if we can give one to the top-stalled group.
     std::string top_group_name;
-    Group* top_group = NULL;
+    Group* top_group = nullptr;
     if (!FindTopStalledGroup(&top_group, &top_group_name))
       return;
 
@@ -823,8 +823,8 @@
     Group** group,
     std::string* group_name) const {
   CHECK((group && group_name) || (!group && !group_name));
-  Group* top_group = NULL;
-  const std::string* top_group_name = NULL;
+  Group* top_group = nullptr;
+  const std::string* top_group_name = nullptr;
   bool has_stalled_group = false;
   for (auto i = group_map_.begin(); i != group_map_.end(); ++i) {
     Group* curr_group = i->second;
@@ -1018,7 +1018,7 @@
 bool ClientSocketPoolBaseHelper::CloseOneIdleSocket() {
   if (idle_socket_count() == 0)
     return false;
-  return CloseOneIdleSocketExceptInGroup(NULL);
+  return CloseOneIdleSocketExceptInGroup(nullptr);
 }
 
 bool ClientSocketPoolBaseHelper::CloseOneIdleSocketExceptInGroup(
diff --git a/net/socket/client_socket_pool_base.h b/net/socket/client_socket_pool_base.h
index 774b5a55..b32e351b 100644
--- a/net/socket/client_socket_pool_base.h
+++ b/net/socket/client_socket_pool_base.h
@@ -296,7 +296,7 @@
  private:
   // Entry for a persistent socket which became idle at time |start_time|.
   struct IdleSocket {
-    IdleSocket() : socket(NULL) {}
+    IdleSocket() : socket(nullptr) {}
 
     // An idle socket can't be used if it is disconnected or has been used
     // before and has received data unexpectedly (hence no longer idle).  The
diff --git a/net/socket/client_socket_pool_base_unittest.cc b/net/socket/client_socket_pool_base_unittest.cc
index dba6485..14bcc532 100644
--- a/net/socket/client_socket_pool_base_unittest.cc
+++ b/net/socket/client_socket_pool_base_unittest.cc
@@ -360,8 +360,8 @@
 
   int ConnectInternal() override {
     AddressList ignored;
-    client_socket_factory_->CreateTransportClientSocket(ignored, NULL, NULL,
-                                                        NetLogSource());
+    client_socket_factory_->CreateTransportClientSocket(
+        ignored, nullptr, nullptr, NetLogSource());
     switch (job_type_) {
       case kMockJob:
         return DoConnect(true /* successful */, false /* sync */,
@@ -537,7 +537,7 @@
             net_log,
             nullptr /* websocket_endpoint_lock_manager */),
         job_type_(TestConnectJob::kMockJob),
-        job_types_(NULL),
+        job_types_(nullptr),
         client_socket_factory_(client_socket_factory) {}
 
   ~TestConnectJobFactory() override = default;
@@ -876,7 +876,7 @@
                   log.bound()));
   EXPECT_FALSE(handle.socket());
   EXPECT_FALSE(handle.is_ssl_error());
-  EXPECT_TRUE(handle.ssl_error_response_info().headers.get() == NULL);
+  EXPECT_TRUE(handle.ssl_error_response_info().headers.get() == nullptr);
   TestLoadTimingInfoNotConnected(handle);
 
   TestNetLogEntry::List entries;
@@ -1885,7 +1885,7 @@
   EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle));
   EXPECT_THAT(callback.WaitForResult(), IsError(ERR_CONNECTION_FAILED));
   EXPECT_FALSE(handle.is_ssl_error());
-  EXPECT_TRUE(handle.ssl_error_response_info().headers.get() == NULL);
+  EXPECT_TRUE(handle.ssl_error_response_info().headers.get() == nullptr);
 
   TestNetLogEntry::List entries;
   log.GetEntries(&entries);
@@ -2292,7 +2292,7 @@
   EXPECT_FALSE(handle.is_initialized());
   EXPECT_FALSE(handle.socket());
   EXPECT_TRUE(handle.is_ssl_error());
-  EXPECT_FALSE(handle.ssl_error_response_info().headers.get() == NULL);
+  EXPECT_FALSE(handle.ssl_error_response_info().headers.get() == nullptr);
 }
 
 TEST_F(ClientSocketPoolBaseTest, AdditionalErrorStateAsynchronous) {
@@ -2313,7 +2313,7 @@
   EXPECT_FALSE(handle.is_initialized());
   EXPECT_FALSE(handle.socket());
   EXPECT_TRUE(handle.is_ssl_error());
-  EXPECT_FALSE(handle.ssl_error_response_info().headers.get() == NULL);
+  EXPECT_FALSE(handle.ssl_error_response_info().headers.get() == nullptr);
 }
 
 // Make sure we can reuse sockets.
@@ -2336,7 +2336,7 @@
   ASSERT_THAT(callback.WaitForResult(), IsOk());
 
   // Use and release the socket.
-  EXPECT_EQ(1, handle.socket()->Write(NULL, 1, CompletionOnceCallback(),
+  EXPECT_EQ(1, handle.socket()->Write(nullptr, 1, CompletionOnceCallback(),
                                       TRAFFIC_ANNOTATION_FOR_TESTS));
   TestLoadTimingInfoConnectedNotReused(handle);
   handle.Reset();
@@ -2402,7 +2402,7 @@
   handle.Reset();
   ASSERT_THAT(callback2.WaitForResult(), IsOk());
   // Use the socket.
-  EXPECT_EQ(1, handle2.socket()->Write(NULL, 1, CompletionOnceCallback(),
+  EXPECT_EQ(1, handle2.socket()->Write(nullptr, 1, CompletionOnceCallback(),
                                        TRAFFIC_ANNOTATION_FOR_TESTS));
   handle2.Reset();
 
@@ -2666,7 +2666,8 @@
   EXPECT_FALSE(req.handle()->is_initialized());
   EXPECT_FALSE(req.handle()->socket());
   EXPECT_TRUE(req.handle()->is_ssl_error());
-  EXPECT_FALSE(req.handle()->ssl_error_response_info().headers.get() == NULL);
+  EXPECT_FALSE(req.handle()->ssl_error_response_info().headers.get() ==
+               nullptr);
 }
 
 // http://crbug.com/44724 regression test.
@@ -3203,9 +3204,9 @@
   EXPECT_THAT(callback3.WaitForResult(), IsOk());
 
   // Use the socket.
-  EXPECT_EQ(1, handle1.socket()->Write(NULL, 1, CompletionOnceCallback(),
+  EXPECT_EQ(1, handle1.socket()->Write(nullptr, 1, CompletionOnceCallback(),
                                        TRAFFIC_ANNOTATION_FOR_TESTS));
-  EXPECT_EQ(1, handle3.socket()->Write(NULL, 1, CompletionOnceCallback(),
+  EXPECT_EQ(1, handle3.socket()->Write(nullptr, 1, CompletionOnceCallback(),
                                        TRAFFIC_ANNOTATION_FOR_TESTS));
 
   handle1.Reset();
@@ -3914,7 +3915,7 @@
   EXPECT_EQ(1, pool_->NumActiveSocketsInGroup("a"));
 
   // Drain the pending read.
-  EXPECT_EQ(1, handle.socket()->Read(NULL, 1, CompletionOnceCallback()));
+  EXPECT_EQ(1, handle.socket()->Read(nullptr, 1, CompletionOnceCallback()));
 
   TestLoadTimingInfoConnectedReused(handle);
   handle.Reset();
diff --git a/net/socket/client_socket_pool_manager.cc b/net/socket/client_socket_pool_manager.cc
index dcfd7f9..d59710b0 100644
--- a/net/socket/client_socket_pool_manager.cc
+++ b/net/socket/client_socket_pool_manager.cc
@@ -129,9 +129,9 @@
             resolution_callback);
         // Set ssl_params, and unset proxy_tcp_params
         ssl_params = new SSLSocketParams(
-            proxy_tcp_params, NULL, NULL, proxy_server.host_port_pair(),
+            proxy_tcp_params, nullptr, nullptr, proxy_server.host_port_pair(),
             ssl_config_for_proxy, PRIVACY_MODE_DISABLED);
-        proxy_tcp_params = NULL;
+        proxy_tcp_params = nullptr;
       }
 
       if (!proxy_info.is_quic()) {
@@ -428,7 +428,7 @@
       proxy_info, quic::QUIC_VERSION_UNSUPPORTED, ssl_config_for_origin,
       ssl_config_for_proxy,
       /*force_tunnel=*/false, privacy_mode, SocketTag(), net_log,
-      num_preconnect_streams, NULL, HttpNetworkSession::NORMAL_SOCKET_POOL,
+      num_preconnect_streams, nullptr, HttpNetworkSession::NORMAL_SOCKET_POOL,
       OnHostResolutionCallback(), CompletionOnceCallback(),
       ClientSocketPool::ProxyAuthCallback());
 }
diff --git a/net/socket/sequenced_socket_data_unittest.cc b/net/socket/sequenced_socket_data_unittest.cc
index 1d08a05..97562f1 100644
--- a/net/socket/sequenced_socket_data_unittest.cc
+++ b/net/socket/sequenced_socket_data_unittest.cc
@@ -664,7 +664,7 @@
   for (int i = 0; i < gtest_failures.size(); ++i) {
     const ::testing::TestPartResult& result =
         gtest_failures.GetTestPartResult(i);
-    EXPECT_TRUE(strstr(result.message(), kExpectedFailures[i]) != NULL);
+    EXPECT_TRUE(strstr(result.message(), kExpectedFailures[i]) != nullptr);
   }
 
   set_expect_eof(false);
diff --git a/net/socket/socket_test_util.cc b/net/socket/socket_test_util.cc
index 7ecb940..a234ab5 100644
--- a/net/socket/socket_test_util.cc
+++ b/net/socket/socket_test_util.cc
@@ -321,8 +321,8 @@
 SSLSocketDataProvider::SSLSocketDataProvider(IoMode mode, int result)
     : connect(mode, result),
       next_proto(kProtoUnknown),
-      cert_request_info(NULL),
-      channel_id_service(NULL),
+      cert_request_info(nullptr),
+      channel_id_service(nullptr),
       expected_ssl_version_min(kDefaultSSLVersionMin),
       expected_ssl_version_max(kDefaultSSLVersionMax) {
   SSLConnectionStatusSetVersion(SSL_CONNECTION_VERSION_TLS1_3,
@@ -913,7 +913,7 @@
       read_data_(SYNCHRONOUS, ERR_UNEXPECTED),
       need_read_data_(true),
       peer_closed_connection_(false),
-      pending_read_buf_(NULL),
+      pending_read_buf_(nullptr),
       pending_read_buf_len_(0),
       was_used_to_convey_data_(false),
       enable_read_if_ready_(false) {
@@ -1482,7 +1482,7 @@
 }
 
 void MockSSLClientSocket::Disconnect() {
-  if (stream_socket_ != NULL)
+  if (stream_socket_ != nullptr)
     stream_socket_->Disconnect();
 }
 
@@ -1582,7 +1582,7 @@
 
 crypto::ECPrivateKey* MockSSLClientSocket::GetChannelIDKey() const {
   NOTREACHED();
-  return NULL;
+  return nullptr;
 }
 
 void MockSSLClientSocket::RunCallbackAsync(CompletionOnceCallback callback,
@@ -1619,7 +1619,7 @@
       need_read_data_(true),
       source_port_(123),
       network_(NetworkChangeNotifier::kInvalidNetworkHandle),
-      pending_read_buf_(NULL),
+      pending_read_buf_(nullptr),
       pending_read_buf_len_(0),
       net_log_(NetLogWithSource::Make(net_log, NetLogSourceType::NONE)),
       weak_factory_(this) {
@@ -1903,7 +1903,7 @@
   scoped_refptr<IOBuffer> buf = pending_read_buf_;
   int buf_len = pending_read_buf_len_;
   CompletionOnceCallback callback = std::move(pending_read_callback_);
-  pending_read_buf_ = NULL;
+  pending_read_buf_ = nullptr;
   pending_read_buf_len_ = 0;
 
   int result = read_data_.result;
@@ -2031,7 +2031,7 @@
   if (handle != handle_)
     return false;
   socket_.reset();
-  handle_ = NULL;
+  handle_ = nullptr;
   user_callback_.Reset();
   return true;
 }
@@ -2060,7 +2060,7 @@
     handle_->set_connection_attempts(attempts);
   }
 
-  handle_ = NULL;
+  handle_ = nullptr;
 
   if (!user_callback_.is_null()) {
     std::move(user_callback_).Run(rv);
@@ -2110,7 +2110,7 @@
   last_request_priority_ = priority;
   std::unique_ptr<StreamSocket> socket =
       client_socket_factory_->CreateTransportClientSocket(
-          AddressList(), NULL, net_log.net_log(), NetLogSource());
+          AddressList(), nullptr, net_log.net_log(), NetLogSource());
   MockConnectJob* job = new MockConnectJob(
       std::move(socket), handle, socket_tag, std::move(callback), priority);
   job_list_.push_back(base::WrapUnique(job));
diff --git a/net/socket/socket_test_util.h b/net/socket/socket_test_util.h
index 4dd63f7..b08ca4a5 100644
--- a/net/socket/socket_test_util.h
+++ b/net/socket/socket_test_util.h
@@ -120,7 +120,7 @@
   MockReadWrite()
       : mode(SYNCHRONOUS),
         result(0),
-        data(NULL),
+        data(nullptr),
         data_len(0),
         sequence_number(0) {}
 
@@ -128,7 +128,7 @@
   MockReadWrite(IoMode io_mode, int result)
       : mode(io_mode),
         result(result),
-        data(NULL),
+        data(nullptr),
         data_len(0),
         sequence_number(0) {}
 
@@ -136,7 +136,7 @@
   MockReadWrite(IoMode io_mode, int result, int seq)
       : mode(io_mode),
         result(result),
-        data(NULL),
+        data(nullptr),
         data_len(0),
         sequence_number(seq) {}
 
diff --git a/net/socket/socks5_client_socket_unittest.cc b/net/socket/socks5_client_socket_unittest.cc
index f497b1a..4d76dd3 100644
--- a/net/socket/socks5_client_socket_unittest.cc
+++ b/net/socket/socks5_client_socket_unittest.cc
@@ -204,7 +204,8 @@
         MockRead(SYNCHRONOUS, kSOCKS5OkResponse, kSOCKS5OkResponseLength)
     };
 
-    user_sock_ = BuildMockSocket(data_reads, data_writes, hostname, 80, NULL);
+    user_sock_ =
+        BuildMockSocket(data_reads, data_writes, hostname, 80, nullptr);
 
     int rv = user_sock_->Connect(callback_.callback());
     EXPECT_THAT(rv, IsOk());
@@ -225,7 +226,7 @@
   MockWrite data_writes[] = {MockWrite()};
   MockRead data_reads[] = {MockRead()};
   user_sock_ =
-      BuildMockSocket(data_reads, data_writes, large_host_name, 80, NULL);
+      BuildMockSocket(data_reads, data_writes, large_host_name, 80, nullptr);
 
   // Try to connect -- should fail (without having read/written anything to
   // the transport socket first) because the hostname is too long.
diff --git a/net/socket/socks_client_socket_unittest.cc b/net/socket/socks_client_socket_unittest.cc
index 14f68216..13838e8 100644
--- a/net/socket/socks_client_socket_unittest.cc
+++ b/net/socket/socks_client_socket_unittest.cc
@@ -386,7 +386,7 @@
   MockRead data_reads[] = { MockRead(SYNCHRONOUS, "", 0) };
 
   user_sock_ = BuildMockSocket(data_reads, data_writes, hanging_resolver.get(),
-                               "foo", 80, NULL);
+                               "foo", 80, nullptr);
 
   // Start connecting (will get stuck waiting for the host to resolve).
   int rv = user_sock_->Connect(callback_.callback());
@@ -410,7 +410,7 @@
   const char kHostName[] = "::1";
 
   user_sock_ = BuildMockSocket(base::span<MockRead>(), base::span<MockWrite>(),
-                               host_resolver_.get(), kHostName, 80, NULL);
+                               host_resolver_.get(), kHostName, 80, nullptr);
 
   EXPECT_EQ(ERR_NAME_NOT_RESOLVED,
             callback_.GetResult(user_sock_->Connect(callback_.callback())));
@@ -421,10 +421,10 @@
   const char kHostName[] = "::1";
 
   std::unique_ptr<HostResolver> host_resolver(
-      HostResolver::CreateSystemResolver(HostResolver::Options(), NULL));
+      HostResolver::CreateSystemResolver(HostResolver::Options(), nullptr));
 
   user_sock_ = BuildMockSocket(base::span<MockRead>(), base::span<MockWrite>(),
-                               host_resolver.get(), kHostName, 80, NULL);
+                               host_resolver.get(), kHostName, 80, nullptr);
 
   EXPECT_EQ(ERR_NAME_NOT_RESOLVED,
             callback_.GetResult(user_sock_->Connect(callback_.callback())));
diff --git a/net/socket/ssl_client_socket_impl.cc b/net/socket/ssl_client_socket_impl.cc
index c49a65e..6389a56f 100644
--- a/net/socket/ssl_client_socket_impl.cc
+++ b/net/socket/ssl_client_socket_impl.cc
@@ -298,10 +298,11 @@
 
   SSLContext() {
     crypto::EnsureOpenSSLInit();
-    ssl_socket_data_index_ = SSL_get_ex_new_index(0, 0, 0, 0, 0);
+    ssl_socket_data_index_ =
+        SSL_get_ex_new_index(0, nullptr, nullptr, nullptr, nullptr);
     DCHECK_NE(ssl_socket_data_index_, -1);
     ssl_ctx_.reset(SSL_CTX_new(TLS_with_buffers_method()));
-    SSL_CTX_set_cert_cb(ssl_ctx_.get(), ClientCertRequestCallback, NULL);
+    SSL_CTX_set_cert_cb(ssl_ctx_.get(), ClientCertRequestCallback, nullptr);
 
     // Verifies the server certificate even on resumed sessions.
     SSL_CTX_set_reverify_on_resume(ssl_ctx_.get(), 1);
@@ -510,9 +511,9 @@
   user_connect_callback_.Reset();
   user_read_callback_.Reset();
   user_write_callback_.Reset();
-  user_read_buf_ = NULL;
+  user_read_buf_ = nullptr;
   user_read_buf_len_ = 0;
-  user_write_buf_ = NULL;
+  user_write_buf_ = nullptr;
   user_write_buf_len_ = 0;
 
   stream_socket_->Disconnect();
@@ -741,7 +742,7 @@
   } else {
     if (rv > 0)
       was_ever_used_ = true;
-    user_write_buf_ = NULL;
+    user_write_buf_ = nullptr;
     user_write_buf_len_ = 0;
   }
 
@@ -875,7 +876,7 @@
     std::vector<uint8_t> wire_protos =
         SerializeNextProtos(ssl_config_.alpn_protos);
     SSL_set_alpn_protos(ssl_.get(),
-                        wire_protos.empty() ? NULL : &wire_protos[0],
+                        wire_protos.empty() ? nullptr : &wire_protos[0],
                         wire_protos.size());
   }
 
@@ -907,7 +908,7 @@
   // up front.
   if (rv > 0)
     was_ever_used_ = true;
-  user_write_buf_ = NULL;
+  user_write_buf_ = nullptr;
   user_write_buf_len_ = 0;
   std::move(user_write_callback_).Run(rv);
 }
@@ -972,7 +973,7 @@
     ssl_client_session_cache_->ResetLookupCount(GetSessionCacheKey());
   }
 
-  const uint8_t* alpn_proto = NULL;
+  const uint8_t* alpn_proto = nullptr;
   unsigned alpn_len = 0;
   SSL_get0_alpn_selected(ssl_.get(), &alpn_proto, &alpn_len);
   if (alpn_len > 0) {
diff --git a/net/socket/ssl_client_socket_unittest.cc b/net/socket/ssl_client_socket_unittest.cc
index 1eb85616..b7ab581 100644
--- a/net/socket/ssl_client_socket_unittest.cc
+++ b/net/socket/ssl_client_socket_unittest.cc
@@ -594,7 +594,7 @@
                      base::Unretained(this)),
       TRAFFIC_ANNOTATION_FOR_TESTS);
 
-  pending_write_buf_ = NULL;
+  pending_write_buf_ = nullptr;
   pending_write_len_ = -1;
   if (rv != ERR_IO_PENDING) {
     std::move(pending_write_callback_).Run(rv);
@@ -696,7 +696,7 @@
   void OnComplete(int result) {
     if (socket_) {
       delete socket_;
-      socket_ = NULL;
+      socket_ = nullptr;
     } else {
       ADD_FAILURE() << "Deleting socket twice";
     }
@@ -872,7 +872,7 @@
       const HostPortPair& host_port_pair,
       int* result) {
     std::unique_ptr<StreamSocket> transport(
-        new TCPClientSocket(addr_, NULL, &log_, NetLogSource()));
+        new TCPClientSocket(addr_, nullptr, &log_, NetLogSource()));
     int rv = callback_.GetResult(transport->Connect(callback_.callback()));
     if (rv != OK) {
       LOG(ERROR) << "Could not connect to SpawnedTestServer";
@@ -996,16 +996,16 @@
     SpawnedTestServer spawned_test_server(SpawnedTestServer::TYPE_HTTPS,
                                           ssl_options, base::FilePath());
     if (!spawned_test_server.Start())
-      return NULL;
+      return nullptr;
 
     AddressList addr;
     if (!spawned_test_server.GetAddressList(&addr))
-      return NULL;
+      return nullptr;
 
     TestCompletionCallback callback;
     TestNetLog log;
     std::unique_ptr<StreamSocket> transport(
-        new TCPClientSocket(addr, NULL, &log, NetLogSource()));
+        new TCPClientSocket(addr, nullptr, &log, NetLogSource()));
     int rv = callback.GetResult(transport->Connect(callback.callback()));
     EXPECT_THAT(rv, IsOk());
 
@@ -1051,7 +1051,7 @@
     CHECK(spawned_test_server());
 
     std::unique_ptr<StreamSocket> real_transport(
-        new TCPClientSocket(addr(), NULL, NULL, NetLogSource()));
+        new TCPClientSocket(addr(), nullptr, nullptr, NetLogSource()));
     std::unique_ptr<FakeBlockingStreamSocket> transport(
         new FakeBlockingStreamSocket(std::move(real_transport)));
     int rv = callback->GetResult(transport->Connect(callback->callback()));
@@ -1092,7 +1092,7 @@
     ASSERT_TRUE(StartTestServer(server_options));
 
     TestCompletionCallback callback;
-    FakeBlockingStreamSocket* raw_transport = NULL;
+    FakeBlockingStreamSocket* raw_transport = nullptr;
     std::unique_ptr<SSLClientSocket> sock;
     ASSERT_NO_FATAL_FAILURE(CreateAndConnectUntilServerFinishedReceived(
         client_config, &callback, &raw_transport, &sock));
@@ -1218,7 +1218,7 @@
     ssl_config.early_data_enabled = early_data_enabled;
 
     real_transport_.reset(
-        new TCPClientSocket(address_, NULL, NULL, NetLogSource()));
+        new TCPClientSocket(address_, nullptr, nullptr, NetLogSource()));
     std::unique_ptr<FakeBlockingStreamSocket> transport(
         new FakeBlockingStreamSocket(std::move(real_transport_)));
     FakeBlockingStreamSocket* raw_transport = transport.get();
@@ -1354,7 +1354,7 @@
   TestCompletionCallback callback;
   TestNetLog log;
   std::unique_ptr<StreamSocket> transport(
-      new TCPClientSocket(addr(), NULL, &log, NetLogSource()));
+      new TCPClientSocket(addr(), nullptr, &log, NetLogSource()));
   int rv = callback.GetResult(transport->Connect(callback.callback()));
   EXPECT_THAT(rv, IsOk());
 
@@ -1532,7 +1532,7 @@
   // TODO(davidben): Add a test which requires them and verify the error.
   SSLConfig ssl_config;
   ssl_config.send_client_cert = true;
-  ssl_config.client_cert = NULL;
+  ssl_config.client_cert = nullptr;
 
   int rv;
   ASSERT_TRUE(CreateAndConnectSSLClientSocket(ssl_config, &rv));
@@ -1561,7 +1561,7 @@
 
   TestCompletionCallback callback;
   std::unique_ptr<StreamSocket> transport(
-      new TCPClientSocket(addr(), NULL, NULL, NetLogSource()));
+      new TCPClientSocket(addr(), nullptr, nullptr, NetLogSource()));
   EXPECT_EQ(0, transport->GetTotalReceivedBytes());
 
   int rv = callback.GetResult(transport->Connect(callback.callback()));
@@ -1618,7 +1618,7 @@
 
   TestCompletionCallback callback;
   std::unique_ptr<StreamSocket> real_transport(
-      new TCPClientSocket(addr(), NULL, NULL, NetLogSource()));
+      new TCPClientSocket(addr(), nullptr, nullptr, NetLogSource()));
   std::unique_ptr<SynchronousErrorStreamSocket> transport(
       new SynchronousErrorStreamSocket(std::move(real_transport)));
   int rv = callback.GetResult(transport->Connect(callback.callback()));
@@ -1649,7 +1649,7 @@
 
   TestCompletionCallback callback;
   std::unique_ptr<StreamSocket> real_transport(
-      new TCPClientSocket(addr(), NULL, NULL, NetLogSource()));
+      new TCPClientSocket(addr(), nullptr, nullptr, NetLogSource()));
   std::unique_ptr<SynchronousErrorStreamSocket> transport(
       new SynchronousErrorStreamSocket(std::move(real_transport)));
   int rv = callback.GetResult(transport->Connect(callback.callback()));
@@ -1701,7 +1701,7 @@
 
   TestCompletionCallback callback;
   std::unique_ptr<StreamSocket> real_transport(
-      new TCPClientSocket(addr(), NULL, NULL, NetLogSource()));
+      new TCPClientSocket(addr(), nullptr, nullptr, NetLogSource()));
   // Note: |error_socket|'s ownership is handed to |transport|, but a pointer
   // is retained in order to configure additional errors.
   std::unique_ptr<SynchronousErrorStreamSocket> error_socket(
@@ -1770,7 +1770,7 @@
 
   TestCompletionCallback callback;
   std::unique_ptr<StreamSocket> real_transport(
-      new TCPClientSocket(addr(), NULL, NULL, NetLogSource()));
+      new TCPClientSocket(addr(), nullptr, nullptr, NetLogSource()));
   // Note: intermediate sockets' ownership are handed to |sock|, but a pointer
   // is retained in order to query them.
   std::unique_ptr<SynchronousErrorStreamSocket> error_socket(
@@ -1874,7 +1874,7 @@
 
   TestCompletionCallback callback;
   std::unique_ptr<StreamSocket> real_transport(
-      new TCPClientSocket(addr(), NULL, NULL, NetLogSource()));
+      new TCPClientSocket(addr(), nullptr, nullptr, NetLogSource()));
   // Note: |error_socket|'s ownership is handed to |transport|, but a pointer
   // is retained in order to configure additional errors.
   std::unique_ptr<SynchronousErrorStreamSocket> error_socket(
@@ -1960,7 +1960,7 @@
 
   TestCompletionCallback callback;
   std::unique_ptr<StreamSocket> real_transport(
-      new TCPClientSocket(addr(), NULL, NULL, NetLogSource()));
+      new TCPClientSocket(addr(), nullptr, nullptr, NetLogSource()));
   // Note: |error_socket|'s ownership is handed to |transport|, but a pointer
   // is retained in order to configure additional errors.
   std::unique_ptr<SynchronousErrorStreamSocket> error_socket(
@@ -2051,7 +2051,7 @@
 
   TestCompletionCallback callback;
   std::unique_ptr<StreamSocket> real_transport(
-      new TCPClientSocket(addr(), NULL, NULL, NetLogSource()));
+      new TCPClientSocket(addr(), nullptr, nullptr, NetLogSource()));
   std::unique_ptr<SynchronousErrorStreamSocket> transport(
       new SynchronousErrorStreamSocket(std::move(real_transport)));
   int rv = callback.GetResult(transport->Connect(callback.callback()));
@@ -2077,7 +2077,7 @@
 
   TestCompletionCallback callback;
   std::unique_ptr<StreamSocket> real_transport(
-      new TCPClientSocket(addr(), NULL, NULL, NetLogSource()));
+      new TCPClientSocket(addr(), nullptr, nullptr, NetLogSource()));
   std::unique_ptr<SynchronousErrorStreamSocket> transport(
       new SynchronousErrorStreamSocket(std::move(real_transport)));
   int rv = callback.GetResult(transport->Connect(callback.callback()));
@@ -2110,7 +2110,7 @@
 
   TestCompletionCallback callback;
   std::unique_ptr<StreamSocket> real_transport(
-      new TCPClientSocket(addr(), NULL, NULL, NetLogSource()));
+      new TCPClientSocket(addr(), nullptr, nullptr, NetLogSource()));
   std::unique_ptr<SynchronousErrorStreamSocket> error_socket(
       new SynchronousErrorStreamSocket(std::move(real_transport)));
   SynchronousErrorStreamSocket* raw_error_socket = error_socket.get();
@@ -2193,7 +2193,7 @@
   TestCompletionCallback callback;
 
   std::unique_ptr<StreamSocket> real_transport(
-      new TCPClientSocket(addr(), NULL, NULL, NetLogSource()));
+      new TCPClientSocket(addr(), nullptr, nullptr, NetLogSource()));
   std::unique_ptr<ReadBufferingStreamSocket> transport(
       new ReadBufferingStreamSocket(std::move(real_transport)));
   ReadBufferingStreamSocket* raw_transport = transport.get();
@@ -2266,7 +2266,7 @@
   TestNetLog log;
   log.SetCaptureMode(NetLogCaptureMode::IncludeSocketBytes());
   std::unique_ptr<StreamSocket> transport(
-      new TCPClientSocket(addr(), NULL, &log, NetLogSource()));
+      new TCPClientSocket(addr(), nullptr, &log, NetLogSource()));
   int rv = callback.GetResult(transport->Connect(callback.callback()));
   EXPECT_THAT(rv, IsOk());
 
@@ -2335,7 +2335,7 @@
 
   TestCompletionCallback callback;
   std::unique_ptr<StreamSocket> transport(
-      new MockTCPClientSocket(addr(), NULL, &data));
+      new MockTCPClientSocket(addr(), nullptr, &data));
   int rv = callback.GetResult(transport->Connect(callback.callback()));
   EXPECT_THAT(rv, IsOk());
 
@@ -2380,7 +2380,7 @@
 
   TestCompletionCallback callback;
   std::unique_ptr<StreamSocket> transport(
-      new TCPClientSocket(addr(), NULL, NULL, NetLogSource()));
+      new TCPClientSocket(addr(), nullptr, nullptr, NetLogSource()));
   int rv = callback.GetResult(transport->Connect(callback.callback()));
   EXPECT_THAT(rv, IsOk());
 
@@ -2556,7 +2556,7 @@
   // Load and install the root for the validated chain.
   scoped_refptr<X509Certificate> root_cert = ImportCertFromFile(
       GetTestCertsDirectory(), "redundant-validated-chain-root.pem");
-  ASSERT_NE(static_cast<X509Certificate*>(NULL), root_cert.get());
+  ASSERT_NE(static_cast<X509Certificate*>(nullptr), root_cert.get());
   ScopedTestRoot scoped_root(root_cert.get());
 
   // Set up a test server with CERT_CHAIN_WRONG_ROOT.
@@ -2942,7 +2942,7 @@
 
   TestCompletionCallback callback;
   std::unique_ptr<StreamSocket> real_transport(
-      new TCPClientSocket(addr(), NULL, NULL, NetLogSource()));
+      new TCPClientSocket(addr(), nullptr, nullptr, NetLogSource()));
   std::unique_ptr<FakeBlockingStreamSocket> transport(
       new FakeBlockingStreamSocket(std::move(real_transport)));
   FakeBlockingStreamSocket* raw_transport = transport.get();
@@ -3001,7 +3001,7 @@
 
   // Using a different HostPortPair uses a different session cache key.
   std::unique_ptr<StreamSocket> transport(
-      new TCPClientSocket(addr(), NULL, &log_, NetLogSource()));
+      new TCPClientSocket(addr(), nullptr, &log_, NetLogSource()));
   TestCompletionCallback callback;
   ASSERT_THAT(callback.GetResult(transport->Connect(callback.callback())),
               IsOk());
@@ -3104,7 +3104,7 @@
   // Failed connections pass through.
   TestCompletionCallback callback;
   std::unique_ptr<StreamSocket> real_transport(
-      new TCPClientSocket(addr(), NULL, NULL, NetLogSource()));
+      new TCPClientSocket(addr(), nullptr, nullptr, NetLogSource()));
   std::unique_ptr<SynchronousErrorStreamSocket> transport(
       new SynchronousErrorStreamSocket(std::move(real_transport)));
   rv = callback.GetResult(transport->Connect(callback.callback()));
@@ -3228,7 +3228,7 @@
 
   // Start a handshake up to the server Finished message.
   TestCompletionCallback callback;
-  FakeBlockingStreamSocket* raw_transport1 = NULL;
+  FakeBlockingStreamSocket* raw_transport1 = nullptr;
   std::unique_ptr<SSLClientSocket> sock1;
   ASSERT_NO_FATAL_FAILURE(CreateAndConnectUntilServerFinishedReceived(
       client_config, &callback, &raw_transport1, &sock1));
@@ -3282,7 +3282,7 @@
 
   // Start a handshake up to the server Finished message.
   TestCompletionCallback callback;
-  FakeBlockingStreamSocket* raw_transport1 = NULL;
+  FakeBlockingStreamSocket* raw_transport1 = nullptr;
   std::unique_ptr<SSLClientSocket> sock1;
   ASSERT_NO_FATAL_FAILURE(CreateAndConnectUntilServerFinishedReceived(
       client_config, &callback, &raw_transport1, &sock1));
@@ -4109,7 +4109,7 @@
 
   TestCompletionCallback callback;
   std::unique_ptr<StreamSocket> real_transport(
-      new TCPClientSocket(addr(), NULL, NULL, NetLogSource()));
+      new TCPClientSocket(addr(), nullptr, nullptr, NetLogSource()));
   std::unique_ptr<FakeBlockingStreamSocket> transport(
       new FakeBlockingStreamSocket(std::move(real_transport)));
   FakeBlockingStreamSocket* raw_transport = transport.get();
@@ -4142,7 +4142,7 @@
 
   TestCompletionCallback callback;
   std::unique_ptr<StreamSocket> real_transport(
-      new TCPClientSocket(addr(), NULL, NULL, NetLogSource()));
+      new TCPClientSocket(addr(), nullptr, nullptr, NetLogSource()));
   std::unique_ptr<FakeBlockingStreamSocket> transport(
       new FakeBlockingStreamSocket(std::move(real_transport)));
   FakeBlockingStreamSocket* raw_transport = transport.get();
@@ -4190,7 +4190,7 @@
 
   TestCompletionCallback callback;
   std::unique_ptr<StreamSocket> real_transport(
-      new TCPClientSocket(addr(), NULL, NULL, NetLogSource()));
+      new TCPClientSocket(addr(), nullptr, nullptr, NetLogSource()));
   std::unique_ptr<FakeBlockingStreamSocket> transport(
       new FakeBlockingStreamSocket(std::move(real_transport)));
   FakeBlockingStreamSocket* raw_transport = transport.get();
@@ -4239,7 +4239,7 @@
 
   TestCompletionCallback callback;
   std::unique_ptr<StreamSocket> real_transport(
-      new TCPClientSocket(addr(), NULL, NULL, NetLogSource()));
+      new TCPClientSocket(addr(), nullptr, nullptr, NetLogSource()));
   std::unique_ptr<FakeBlockingStreamSocket> transport(
       new FakeBlockingStreamSocket(std::move(real_transport)));
   FakeBlockingStreamSocket* raw_transport = transport.get();
@@ -4289,7 +4289,7 @@
 
   TestCompletionCallback callback;
   std::unique_ptr<StreamSocket> real_transport(
-      new TCPClientSocket(addr(), NULL, NULL, NetLogSource()));
+      new TCPClientSocket(addr(), nullptr, nullptr, NetLogSource()));
   std::unique_ptr<FakeBlockingStreamSocket> transport(
       new FakeBlockingStreamSocket(std::move(real_transport)));
   FakeBlockingStreamSocket* raw_transport = transport.get();
@@ -4335,7 +4335,7 @@
 
   TestCompletionCallback callback;
   std::unique_ptr<StreamSocket> real_transport(
-      new TCPClientSocket(addr(), NULL, NULL, NetLogSource()));
+      new TCPClientSocket(addr(), nullptr, nullptr, NetLogSource()));
   std::unique_ptr<FakeBlockingStreamSocket> transport(
       new FakeBlockingStreamSocket(std::move(real_transport)));
   FakeBlockingStreamSocket* raw_transport = transport.get();
@@ -4710,7 +4710,7 @@
 
 TEST_P(SSLClientSocketReadTest, IdleAfterRead) {
   // Set up a TCP server.
-  TCPServerSocket server_listener(NULL, NetLogSource());
+  TCPServerSocket server_listener(nullptr, NetLogSource());
   ASSERT_THAT(
       server_listener.Listen(IPEndPoint(IPAddress::IPv4Localhost(), 0), 1),
       IsOk());
@@ -4725,7 +4725,7 @@
 
   TestCompletionCallback client_callback;
   std::unique_ptr<TCPClientSocket> client_transport(new TCPClientSocket(
-      AddressList(server_address), NULL, NULL, NetLogSource()));
+      AddressList(server_address), nullptr, nullptr, NetLogSource()));
   int client_rv = client_transport->Connect(client_callback.callback());
 
   EXPECT_THAT(server_callback.GetResult(server_rv), IsOk());
@@ -4790,7 +4790,7 @@
 
   TestNetLog log;
   std::unique_ptr<StreamSocket> transport(
-      new TCPClientSocket(addr(), NULL, &log, NetLogSource()));
+      new TCPClientSocket(addr(), nullptr, &log, NetLogSource()));
 
   MockTaggingStreamSocket* tagging_sock =
       new MockTaggingStreamSocket(std::move(transport));
diff --git a/net/socket/ssl_server_socket_impl.cc b/net/socket/ssl_server_socket_impl.cc
index 6386a1f..bb3e4fc8 100644
--- a/net/socket/ssl_server_socket_impl.cc
+++ b/net/socket/ssl_server_socket_impl.cc
@@ -44,7 +44,8 @@
  public:
   static SocketDataIndex* GetInstance();
   SocketDataIndex() {
-    ssl_socket_data_index_ = SSL_get_ex_new_index(0, 0, 0, 0, 0);
+    ssl_socket_data_index_ =
+        SSL_get_ex_new_index(0, nullptr, nullptr, nullptr, nullptr);
   }
 
   // This is the index used with SSL_get_ex_data to retrieve the owner
@@ -405,7 +406,7 @@
   if (rv == ERR_IO_PENDING) {
     user_read_callback_ = std::move(callback);
   } else {
-    user_read_buf_ = NULL;
+    user_read_buf_ = nullptr;
     user_read_buf_len_ = 0;
   }
 
@@ -429,7 +430,7 @@
   if (rv == ERR_IO_PENDING) {
     user_write_callback_ = std::move(callback);
   } else {
-    user_write_buf_ = NULL;
+    user_write_buf_ = nullptr;
     user_write_buf_len_ = 0;
   }
   return rv;
@@ -701,7 +702,7 @@
   DCHECK(rv != ERR_IO_PENDING);
   DCHECK(!user_read_callback_.is_null());
 
-  user_read_buf_ = NULL;
+  user_read_buf_ = nullptr;
   user_read_buf_len_ = 0;
   std::move(user_read_callback_).Run(rv);
 }
@@ -710,7 +711,7 @@
   DCHECK(rv != ERR_IO_PENDING);
   DCHECK(!user_write_callback_.is_null());
 
-  user_write_buf_ = NULL;
+  user_write_buf_ = nullptr;
   user_write_buf_len_ = 0;
   std::move(user_write_callback_).Run(rv);
 }
diff --git a/net/socket/ssl_server_socket_unittest.cc b/net/socket/ssl_server_socket_unittest.cc
index c5d55f6..967d384d 100644
--- a/net/socket/ssl_server_socket_unittest.cc
+++ b/net/socket/ssl_server_socket_unittest.cc
@@ -175,7 +175,7 @@
       return;
 
     int copied = PropagateData(read_buf_, read_buf_len_);
-    read_buf_ = NULL;
+    read_buf_ = nullptr;
     read_buf_len_ = 0;
     std::move(read_callback_).Run(copied);
   }
diff --git a/net/socket/tcp_client_socket_unittest.cc b/net/socket/tcp_client_socket_unittest.cc
index 766174f..60508c3b 100644
--- a/net/socket/tcp_client_socket_unittest.cc
+++ b/net/socket/tcp_client_socket_unittest.cc
@@ -86,7 +86,7 @@
 
   IPAddress external_ip(72, 14, 213, 105);
   TCPClientSocket socket(AddressList::CreateFromIPAddress(external_ip, 80),
-                         NULL, NULL, NetLogSource());
+                         nullptr, nullptr, NetLogSource());
 
   EXPECT_THAT(socket.Bind(IPEndPoint(IPAddress::IPv4Localhost(), 0)), IsOk());
 
@@ -101,7 +101,7 @@
 // Bind a socket to the IPv4 loopback interface and try to connect to
 // the IPv6 loopback interface, verify that connection fails.
 TEST(TCPClientSocketTest, BindLoopbackToIPv6) {
-  TCPServerSocket server(NULL, NetLogSource());
+  TCPServerSocket server(nullptr, NetLogSource());
   int listen_result =
       server.Listen(IPEndPoint(IPAddress::IPv6Localhost(), 0), 1);
   if (listen_result != OK) {
@@ -112,7 +112,7 @@
 
   IPEndPoint server_address;
   ASSERT_THAT(server.GetLocalAddress(&server_address), IsOk());
-  TCPClientSocket socket(AddressList(server_address), NULL, NULL,
+  TCPClientSocket socket(AddressList(server_address), nullptr, nullptr,
                          NetLogSource());
 
   EXPECT_THAT(socket.Bind(IPEndPoint(IPAddress::IPv4Localhost(), 0)), IsOk());
@@ -213,7 +213,7 @@
 
   TCPClientSocket socket(
       AddressList::CreateFromIPAddressList(ip_list, "example.com"),
-      std::move(watcher), NULL, NetLogSource());
+      std::move(watcher), nullptr, NetLogSource());
 
   EXPECT_THAT(socket.Bind(IPEndPoint(IPAddress::IPv4Localhost(), 0)), IsOk());
 
diff --git a/net/socket/tcp_socket_win.cc b/net/socket/tcp_socket_win.cc
index 6b323b8..3e6ecb8 100644
--- a/net/socket/tcp_socket_win.cc
+++ b/net/socket/tcp_socket_win.cc
@@ -51,8 +51,8 @@
   };
   DWORD bytes_returned = 0xABAB;
   int rv = WSAIoctl(socket, SIO_KEEPALIVE_VALS, &keepalive_vals,
-                    sizeof(keepalive_vals), NULL, 0,
-                    &bytes_returned, NULL, NULL);
+                    sizeof(keepalive_vals), nullptr, 0, &bytes_returned,
+                    nullptr, nullptr);
   int os_error = WSAGetLastError();
   DCHECK(!rv) << "Could not enable TCP Keep-Alive for socket: " << socket
               << " [error: " << os_error << "].";
@@ -259,8 +259,8 @@
     : socket_(INVALID_SOCKET),
       socket_performance_watcher_(std::move(socket_performance_watcher)),
       accept_event_(WSA_INVALID_EVENT),
-      accept_socket_(NULL),
-      accept_address_(NULL),
+      accept_socket_(nullptr),
+      accept_address_(nullptr),
       waiting_connect_(false),
       waiting_read_(false),
       waiting_write_(false),
@@ -566,7 +566,7 @@
   AssertEventNotSignaled(core_->write_overlapped_.hEvent);
   DWORD num;
   int rv = WSASend(socket_, &write_buffer, 1, &num, 0,
-                   &core_->write_overlapped_, NULL);
+                   &core_->write_overlapped_, nullptr);
   int os_error = WSAGetLastError();
   if (rv == 0) {
     if (ResetEventIfSignaled(core_->write_overlapped_.hEvent)) {
@@ -786,7 +786,7 @@
     return net_error;
   }
   std::unique_ptr<TCPSocketWin> tcp_socket(
-      new TCPSocketWin(NULL, net_log_.net_log(), net_log_.source()));
+      new TCPSocketWin(nullptr, net_log_.net_log(), net_log_.source()));
   int adopt_result = tcp_socket->AdoptConnectedSocket(new_socket, ip_end_point);
   if (adopt_result != OK) {
     net_log_.EndEventWithNetErrorCode(NetLogEventType::TCP_ACCEPT,
@@ -810,8 +810,8 @@
   if (ev.lNetworkEvents & FD_ACCEPT) {
     int result = AcceptInternal(accept_socket_, accept_address_);
     if (result != ERR_IO_PENDING) {
-      accept_socket_ = NULL;
-      accept_address_ = NULL;
+      accept_socket_ = nullptr;
+      accept_address_ = nullptr;
       std::move(accept_callback_).Run(result);
     }
   } else {
@@ -992,7 +992,7 @@
     }
   }
 
-  core_->write_iobuffer_ = NULL;
+  core_->write_iobuffer_ = nullptr;
 
   DCHECK_NE(rv, ERR_IO_PENDING);
   std::move(write_callback_).Run(rv);
diff --git a/net/socket/transport_client_socket_pool_test_util.cc b/net/socket/transport_client_socket_pool_test_util.cc
index e3c5155ef..d540dd8 100644
--- a/net/socket/transport_client_socket_pool_test_util.cc
+++ b/net/socket/transport_client_socket_pool_test_util.cc
@@ -371,7 +371,7 @@
     : net_log_(net_log),
       allocation_count_(0),
       client_socket_type_(MOCK_CLIENT_SOCKET),
-      client_socket_types_(NULL),
+      client_socket_types_(nullptr),
       client_socket_index_(0),
       client_socket_index_max_(0),
       delay_(base::TimeDelta::FromMilliseconds(
diff --git a/net/socket/transport_client_socket_unittest.cc b/net/socket/transport_client_socket_unittest.cc
index 9c98a1bf..f1583a6 100644
--- a/net/socket/transport_client_socket_unittest.cc
+++ b/net/socket/transport_client_socket_unittest.cc
@@ -106,7 +106,7 @@
   ::testing::TestWithParam<ClientSocketTestTypes>::SetUp();
 
   // Open a server socket on an ephemeral port.
-  listen_sock_.reset(new TCPServerSocket(NULL, NetLogSource()));
+  listen_sock_.reset(new TCPServerSocket(nullptr, NetLogSource()));
   IPEndPoint local_address(IPAddress::IPv4Localhost(), 0);
   ASSERT_THAT(listen_sock_->Listen(local_address, 1), IsOk());
   // Get the server's address (including the actual port number).
@@ -118,7 +118,7 @@
 
   AddressList addr = AddressList::CreateFromIPAddress(
       IPAddress::IPv4Localhost(), listen_port_);
-  sock_ = socket_factory_->CreateTransportClientSocket(addr, NULL, &net_log_,
+  sock_ = socket_factory_->CreateTransportClientSocket(addr, nullptr, &net_log_,
                                                        NetLogSource());
 }
 
diff --git a/net/socket/udp_socket_unittest.cc b/net/socket/udp_socket_unittest.cc
index 6a994d3..cfe06c7 100644
--- a/net/socket/udp_socket_unittest.cc
+++ b/net/socket/udp_socket_unittest.cc
@@ -542,7 +542,7 @@
 
 TEST_F(UDPSocketTest, ServerGetLocalAddress) {
   IPEndPoint bind_address(IPAddress::IPv4Localhost(), 0);
-  UDPServerSocket server(NULL, NetLogSource());
+  UDPServerSocket server(nullptr, NetLogSource());
   int rv = server.Listen(bind_address);
   EXPECT_THAT(rv, IsOk());
 
@@ -557,7 +557,7 @@
 
 TEST_F(UDPSocketTest, ServerGetPeerAddress) {
   IPEndPoint bind_address(IPAddress::IPv4Localhost(), 0);
-  UDPServerSocket server(NULL, NetLogSource());
+  UDPServerSocket server(nullptr, NetLogSource());
   int rv = server.Listen(bind_address);
   EXPECT_THAT(rv, IsOk());
 
@@ -612,7 +612,7 @@
 // Close the socket while read is pending.
 TEST_F(UDPSocketTest, CloseWithPendingRead) {
   IPEndPoint bind_address(IPAddress::IPv4Localhost(), 0);
-  UDPServerSocket server(NULL, NetLogSource());
+  UDPServerSocket server(nullptr, NetLogSource());
   int rv = server.Listen(bind_address);
   EXPECT_THAT(rv, IsOk());
 
@@ -1200,7 +1200,7 @@
 
   // Setup the server to listen.
   IPEndPoint server_address(IPAddress::IPv4Localhost(), 0 /* port */);
-  UDPServerSocket server(NULL, NetLogSource());
+  UDPServerSocket server(nullptr, NetLogSource());
   server.AllowAddressReuse();
   ASSERT_THAT(server.Listen(server_address), IsOk());
   // Get bound port.
@@ -1241,7 +1241,7 @@
 
   // Setup the server to listen.
   IPEndPoint server_address(IPAddress::IPv4Localhost(), 0 /* port */);
-  UDPServerSocket server(NULL, NetLogSource());
+  UDPServerSocket server(nullptr, NetLogSource());
   server.AllowAddressReuse();
   ASSERT_THAT(server.Listen(server_address), IsOk());
   // Get bound port.
diff --git a/net/socket/udp_socket_win.cc b/net/socket/udp_socket_win.cc
index f2d99ab..8bc2497 100644
--- a/net/socket/udp_socket_win.cc
+++ b/net/socket/udp_socket_win.cc
@@ -1333,7 +1333,7 @@
 
   if (qos_handle_) {
     api_->CloseHandle(qos_handle_);
-    qos_handle_ = NULL;
+    qos_handle_ = nullptr;
   }
 
   handle_is_initializing_ = true;
@@ -1349,7 +1349,7 @@
   version.MajorVersion = 1;
   version.MinorVersion = 0;
 
-  HANDLE handle = NULL;
+  HANDLE handle = nullptr;
 
   // No access to net_log_ so swallow any errors here.
   api->CreateHandle(&version, &handle);
diff --git a/net/socket/udp_socket_win.h b/net/socket/udp_socket_win.h
index 28adb1a0..0d6b448 100644
--- a/net/socket/udp_socket_win.h
+++ b/net/socket/udp_socket_win.h
@@ -141,7 +141,7 @@
   // The remote addresses currently in the flow.
   std::set<IPEndPoint> configured_;
 
-  HANDLE qos_handle_ = NULL;
+  HANDLE qos_handle_ = nullptr;
   bool handle_is_initializing_ = false;
   // 0 means no flow has been constructed.
   QOS_FLOWID flow_id_ = 0;
diff --git a/net/spdy/buffered_spdy_framer.cc b/net/spdy/buffered_spdy_framer.cc
index bef1ffe..ec01527 100644
--- a/net/spdy/buffered_spdy_framer.cc
+++ b/net/spdy/buffered_spdy_framer.cc
@@ -24,7 +24,7 @@
                                        const NetLogWithSource& net_log,
                                        TimeFunc time_func)
     : spdy_framer_(spdy::SpdyFramer::ENABLE_COMPRESSION),
-      visitor_(NULL),
+      visitor_(nullptr),
       frames_received_(0),
       max_header_list_size_(max_header_list_size),
       net_log_(net_log),
@@ -138,7 +138,7 @@
                     << control_frame_fields_->type;
       break;
   }
-  control_frame_fields_.reset(NULL);
+  control_frame_fields_.reset(nullptr);
 }
 
 void BufferedSpdyFramer::OnSettings() {
diff --git a/net/spdy/spdy_buffer.cc b/net/spdy/spdy_buffer.cc
index 0342cc6..f286b28e 100644
--- a/net/spdy/spdy_buffer.cc
+++ b/net/spdy/spdy_buffer.cc
@@ -51,7 +51,7 @@
  private:
   ~SharedFrameIOBuffer() override {
     // Prevent ~IOBuffer() from trying to delete |data_|.
-    data_ = NULL;
+    data_ = nullptr;
   }
 
   const scoped_refptr<SharedFrame> shared_frame_;
diff --git a/net/spdy/spdy_http_stream.cc b/net/spdy/spdy_http_stream.cc
index a4ef27f..8d7ea84 100644
--- a/net/spdy/spdy_http_stream.cc
+++ b/net/spdy/spdy_http_stream.cc
@@ -111,8 +111,8 @@
       closed_stream_id_(0),
       closed_stream_received_bytes_(0),
       closed_stream_sent_bytes_(0),
-      request_info_(NULL),
-      response_info_(NULL),
+      request_info_(nullptr),
+      response_info_(nullptr),
       response_headers_complete_(false),
       upload_stream_in_progress_(false),
       user_buffer_len_(0),
@@ -312,7 +312,7 @@
     *response = *(push_response_info_.get());
     push_response_info_.reset();
   } else {
-    DCHECK_EQ(static_cast<HttpResponseInfo*>(NULL), response_info_);
+    DCHECK_EQ(static_cast<HttpResponseInfo*>(nullptr), response_info_);
   }
 
   response_info_ = response;
diff --git a/net/spdy/spdy_network_transaction_unittest.cc b/net/spdy/spdy_network_transaction_unittest.cc
index 36bb9bcb..55b1355 100644
--- a/net/spdy/spdy_network_transaction_unittest.cc
+++ b/net/spdy/spdy_network_transaction_unittest.cc
@@ -2057,14 +2057,15 @@
   spdy::SpdySerializedFrame rst(
       spdy_util_.ConstructSpdyRstStream(1, spdy::ERROR_CODE_CANCEL));
   MockWrite writes[] = {
-      CreateMockWrite(req, 0, SYNCHRONOUS), MockWrite(SYNCHRONOUS, 0, 0, 2),
+      CreateMockWrite(req, 0, SYNCHRONOUS),
+      MockWrite(SYNCHRONOUS, nullptr, 0, 2),
       CreateMockWrite(rst, 3, SYNCHRONOUS),
   };
 
   spdy::SpdySerializedFrame resp(
       spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
   MockRead reads[] = {
-      CreateMockRead(resp, 1, ASYNC), MockRead(ASYNC, 0, 0, 4)  // EOF
+      CreateMockRead(resp, 1, ASYNC), MockRead(ASYNC, nullptr, 0, 4)  // EOF
   };
 
   SequencedSocketData data(reads, writes);
@@ -2270,7 +2271,7 @@
   spdy::SpdySerializedFrame resp(
       spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
   MockRead reads[] = {
-      CreateMockRead(resp, 1, ASYNC), MockRead(ASYNC, 0, 0, 3)  // EOF
+      CreateMockRead(resp, 1, ASYNC), MockRead(ASYNC, nullptr, 0, 3)  // EOF
   };
 
   SequencedSocketData data(reads, writes);
@@ -2317,10 +2318,10 @@
       MockRead(ASYNC, reinterpret_cast<const char*>(kGetBodyFrame2),
                base::size(kGetBodyFrame2), 3),
       MockRead(ASYNC, ERR_IO_PENDING, 4),  // Force a pause
-      MockRead(ASYNC, 0, 0, 5),            // EOF
+      MockRead(ASYNC, nullptr, 0, 5),      // EOF
   };
   MockRead reads2[] = {
-      CreateMockRead(resp, 1), MockRead(ASYNC, 0, 0, 2),  // EOF
+      CreateMockRead(resp, 1), MockRead(ASYNC, nullptr, 0, 2),  // EOF
   };
 
   SequencedSocketData data(reads, writes);
@@ -2368,8 +2369,8 @@
   spdy::SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true));
   MockRead reads[] = {
       CreateMockRead(resp, 1),
-      MockRead(ASYNC, ERR_IO_PENDING, 2),                 // Force a pause
-      CreateMockRead(body, 3), MockRead(ASYNC, 0, 0, 4),  // EOF
+      MockRead(ASYNC, ERR_IO_PENDING, 2),                       // Force a pause
+      CreateMockRead(body, 3), MockRead(ASYNC, nullptr, 0, 4),  // EOF
   };
 
   SequencedSocketData data(reads, writes);
@@ -2423,7 +2424,7 @@
   MockRead response_headers(CreateMockRead(resp, 1));
   MockRead reads[] = {
       response_headers, CreateMockRead(response_body_frame, 2),
-      MockRead(ASYNC, 0, 0, 3)  // EOF
+      MockRead(ASYNC, nullptr, 0, 3)  // EOF
   };
   SequencedSocketData data(reads, writes);
 
@@ -5125,7 +5126,7 @@
       MockRead(SYNCHRONOUS, kHTTP200, base::size(kHTTP200) - 1, 1),
       CreateMockRead(resp, 3),
       CreateMockRead(body, 4),
-      MockRead(ASYNC, 0, 0, 5),
+      MockRead(ASYNC, nullptr, 0, 5),
   };
   SequencedSocketData data(reads, writes);
 
diff --git a/net/spdy/spdy_proxy_client_socket.cc b/net/spdy/spdy_proxy_client_socket.cc
index a8df026..e25c7be 100644
--- a/net/spdy/spdy_proxy_client_socket.cc
+++ b/net/spdy/spdy_proxy_client_socket.cc
@@ -67,7 +67,7 @@
 }
 
 const HttpResponseInfo* SpdyProxyClientSocket::GetConnectResponseInfo() const {
-  return response_.headers.get() ? &response_ : NULL;
+  return response_.headers.get() ? &response_ : nullptr;
 }
 
 const scoped_refptr<HttpAuthController>&
@@ -121,7 +121,7 @@
 
 void SpdyProxyClientSocket::Disconnect() {
   read_buffer_queue_.Clear();
-  user_buffer_ = NULL;
+  user_buffer_ = nullptr;
   user_buffer_len_ = 0;
   read_callback_.Reset();
 
@@ -464,7 +464,7 @@
     read_buffer_queue_.Enqueue(std::move(buffer));
   } else {
     net_log_.AddByteTransferEvent(NetLogEventType::SOCKET_BYTES_RECEIVED, 0,
-                                  NULL);
+                                  nullptr);
   }
 
   if (read_callback_) {
diff --git a/net/spdy/spdy_proxy_client_socket_unittest.cc b/net/spdy/spdy_proxy_client_socket_unittest.cc
index f4103f1..7252716 100644
--- a/net/spdy/spdy_proxy_client_socket_unittest.cc
+++ b/net/spdy/spdy_proxy_client_socket_unittest.cc
@@ -205,7 +205,7 @@
 };
 
 SpdyProxyClientSocketTest::SpdyProxyClientSocketTest()
-    : read_buf_(NULL),
+    : read_buf_(nullptr),
       connect_data_(SYNCHRONOUS, OK),
       user_agent_(kUserAgent),
       url_(kRequestUrl),
@@ -280,7 +280,7 @@
       CreateStreamSynchronously(
           SPDY_BIDIRECTIONAL_STREAM, spdy_session_, url_, LOWEST,
           net_log_.bound()));
-  ASSERT_TRUE(spdy_stream.get() != NULL);
+  ASSERT_TRUE(spdy_stream.get() != nullptr);
 
   // Create the SpdyProxyClientSocket.
   sock_ = std::make_unique<SpdyProxyClientSocket>(
@@ -313,7 +313,7 @@
 
 void SpdyProxyClientSocketTest::AssertConnectionEstablished() {
   const HttpResponseInfo* response = sock_->GetConnectResponseInfo();
-  ASSERT_TRUE(response != NULL);
+  ASSERT_TRUE(response != nullptr);
   ASSERT_EQ(200, response->headers->response_code());
 }
 
@@ -528,7 +528,7 @@
   AssertConnectFails(ERR_PROXY_AUTH_REQUESTED);
 
   const HttpResponseInfo* response = sock_->GetConnectResponseInfo();
-  ASSERT_TRUE(response != NULL);
+  ASSERT_TRUE(response != nullptr);
   ASSERT_EQ(407, response->headers->response_code());
 }
 
@@ -569,7 +569,7 @@
   AssertConnectFails(ERR_HTTPS_PROXY_TUNNEL_RESPONSE_REDIRECT);
 
   const HttpResponseInfo* response = sock_->GetConnectResponseInfo();
-  ASSERT_TRUE(response != NULL);
+  ASSERT_TRUE(response != nullptr);
 
   const HttpResponseHeaders* headers = response->headers.get();
   ASSERT_EQ(302, headers->response_code());
@@ -1166,10 +1166,10 @@
 
   if (use_read_if_ready()) {
     ASSERT_EQ(ERR_SOCKET_NOT_CONNECTED,
-              sock_->ReadIfReady(NULL, 1, CompletionOnceCallback()));
+              sock_->ReadIfReady(nullptr, 1, CompletionOnceCallback()));
   } else {
     ASSERT_EQ(ERR_SOCKET_NOT_CONNECTED,
-              sock_->Read(NULL, 1, CompletionOnceCallback()));
+              sock_->Read(nullptr, 1, CompletionOnceCallback()));
   }
 
   // Let the RST_STREAM write while |rst| is in-scope.
@@ -1202,11 +1202,11 @@
   ASSERT_EQ(kLen1, sock_->Read(buf.get(), kLen1, CompletionOnceCallback()));
   ASSERT_EQ(std::string(kMsg1, kLen1), std::string(buf->data(), kLen1));
 
-  ASSERT_EQ(0, sock_->Read(NULL, 1, CompletionOnceCallback()));
-  ASSERT_EQ(0, sock_->Read(NULL, 1, CompletionOnceCallback()));
+  ASSERT_EQ(0, sock_->Read(nullptr, 1, CompletionOnceCallback()));
+  ASSERT_EQ(0, sock_->Read(nullptr, 1, CompletionOnceCallback()));
   sock_->Disconnect();
   ASSERT_EQ(ERR_SOCKET_NOT_CONNECTED,
-            sock_->Read(NULL, 1, CompletionOnceCallback()));
+            sock_->Read(nullptr, 1, CompletionOnceCallback()));
 }
 
 // Calling Write() on a closed socket is an error
@@ -1484,7 +1484,7 @@
 
  private:
   void OnComplete(int result) {
-    sock_->reset(NULL);
+    sock_->reset(nullptr);
     SetResult(result);
   }
 
diff --git a/net/spdy/spdy_session.cc b/net/spdy/spdy_session.cc
index f14d05f..294f6aef9 100644
--- a/net/spdy/spdy_session.cc
+++ b/net/spdy/spdy_session.cc
@@ -841,7 +841,7 @@
     NetLog* net_log)
     : in_io_loop_(false),
       spdy_session_key_(spdy_session_key),
-      pool_(NULL),
+      pool_(nullptr),
       http_server_properties_(http_server_properties),
       transport_security_state_(transport_security_state),
       ssl_config_service_(ssl_config_service),
diff --git a/net/spdy/spdy_session_pool_unittest.cc b/net/spdy/spdy_session_pool_unittest.cc
index d294ff9..39d24c6 100644
--- a/net/spdy/spdy_session_pool_unittest.cc
+++ b/net/spdy/spdy_session_pool_unittest.cc
@@ -53,7 +53,7 @@
     SPDY_POOL_CLOSE_IDLE_SESSIONS,
   };
 
-  SpdySessionPoolTest() : spdy_session_pool_(NULL) {}
+  SpdySessionPoolTest() : spdy_session_pool_(nullptr) {}
 
   void CreateNetworkSession() {
     http_session_ = SpdySessionDependencies::SpdyCreateSession(&session_deps_);
diff --git a/net/spdy/spdy_stream.cc b/net/spdy/spdy_stream.cc
index f871d64..d09d808 100644
--- a/net/spdy/spdy_stream.cc
+++ b/net/spdy/spdy_stream.cc
@@ -100,7 +100,7 @@
       recv_window_size_(max_recv_window_size),
       unacked_recv_window_bytes_(0),
       session_(session),
-      delegate_(NULL),
+      delegate_(nullptr),
       request_headers_valid_(false),
       pending_send_status_(MORE_DATA_TO_SEND),
       request_time_(base::Time::Now()),
@@ -167,7 +167,7 @@
     std::unique_ptr<SpdyBuffer> buffer = std::move(pending_recv_data_.at(0));
     pending_recv_data_.erase(pending_recv_data_.begin());
 
-    bool eof = (buffer == NULL);
+    bool eof = (buffer == nullptr);
 
     CHECK(delegate_);
     delegate_->OnDataReceived(std::move(buffer));
@@ -204,7 +204,7 @@
 
 void SpdyStream::DetachDelegate() {
   DCHECK(!IsClosed());
-  delegate_ = NULL;
+  delegate_ = nullptr;
   Cancel(ERR_ABORTED);
 }
 
@@ -533,7 +533,7 @@
     if (buffer) {
       pending_recv_data_.push_back(std::move(buffer));
     } else {
-      pending_recv_data_.push_back(NULL);
+      pending_recv_data_.push_back(nullptr);
       // Note: we leave the stream open in the session until the stream
       //       is claimed.
     }
@@ -663,7 +663,7 @@
     QueueNextDataFrame();
     return ERR_IO_PENDING;
   } else {
-    pending_send_data_ = NULL;
+    pending_send_data_ = nullptr;
     return OK;
   }
 }
@@ -686,7 +686,7 @@
     }
   }
   Delegate* delegate = delegate_;
-  delegate_ = NULL;
+  delegate_ = nullptr;
   if (delegate)
     delegate->OnClose(status);
   // Unset |stream_id_| last so that the delegate can look it up.
diff --git a/net/ssl/channel_id_service.cc b/net/ssl/channel_id_service.cc
index cfe70ca..cd7e891 100644
--- a/net/ssl/channel_id_service.cc
+++ b/net/ssl/channel_id_service.cc
@@ -158,8 +158,7 @@
   bool create_if_missing_;
 };
 
-ChannelIDService::Request::Request() : service_(NULL) {
-}
+ChannelIDService::Request::Request() : service_(nullptr) {}
 
 ChannelIDService::Request::~Request() {
   Cancel();
@@ -170,7 +169,7 @@
     callback_.Reset();
     job_->CancelRequest(this);
 
-    service_ = NULL;
+    service_ = nullptr;
   }
 }
 
@@ -179,7 +178,7 @@
     CompletionOnceCallback callback,
     std::unique_ptr<crypto::ECPrivateKey>* key,
     ChannelIDServiceJob* job) {
-  DCHECK(service_ == NULL);
+  DCHECK(service_ == nullptr);
   service_ = service;
   callback_ = std::move(callback);
   key_ = key;
@@ -189,7 +188,7 @@
 void ChannelIDService::Request::Post(
     int error,
     std::unique_ptr<crypto::ECPrivateKey> key) {
-  service_ = NULL;
+  service_ = nullptr;
   DCHECK(!callback_.is_null());
   if (key)
     *key_ = std::move(key);
diff --git a/net/ssl/channel_id_service_unittest.cc b/net/ssl/channel_id_service_unittest.cc
index 97373cb..4e48cb8 100644
--- a/net/ssl/channel_id_service_unittest.cc
+++ b/net/ssl/channel_id_service_unittest.cc
@@ -44,7 +44,7 @@
     : public DefaultChannelIDStore {
  public:
   MockChannelIDStoreWithAsyncGet()
-      : DefaultChannelIDStore(NULL), channel_id_count_(0) {}
+      : DefaultChannelIDStore(nullptr), channel_id_count_(0) {}
 
   int GetChannelID(const std::string& server_identifier,
                    std::unique_ptr<crypto::ECPrivateKey>* key_result,
@@ -91,7 +91,7 @@
 class ChannelIDServiceTest : public TestWithScopedTaskEnvironment {
  public:
   ChannelIDServiceTest()
-      : service_(new ChannelIDService(new DefaultChannelIDStore(NULL))) {}
+      : service_(new ChannelIDService(new DefaultChannelIDStore(nullptr))) {}
 
  protected:
   std::unique_ptr<ChannelIDService> service_;
diff --git a/net/ssl/client_cert_store_win.cc b/net/ssl/client_cert_store_win.cc
index 6e3845d..fed21b8f 100644
--- a/net/ssl/client_cert_store_win.cc
+++ b/net/ssl/client_cert_store_win.cc
@@ -93,7 +93,7 @@
   }
 
   // Verify the current time is within the certificate's validity period.
-  if (CertVerifyTimeValidity(NULL, cert_context->pCertInfo) != 0)
+  if (CertVerifyTimeValidity(nullptr, cert_context->pCertInfo) != 0)
     return FALSE;
 
   // Verify private key metadata is associated with this certificate.
@@ -102,7 +102,7 @@
   // CertFindChainInStore()?
   DWORD size = 0;
   if (!CertGetCertificateContextProperty(
-          cert_context, CERT_KEY_PROV_INFO_PROP_ID, NULL, &size)) {
+          cert_context, CERT_KEY_PROV_INFO_PROP_ID, nullptr, &size)) {
     return FALSE;
   }
 
@@ -134,7 +134,7 @@
       reinterpret_cast<CERT_NAME_BLOB*>(issuers.data());
   find_by_issuer_para.pfnFindCallback = ClientCertFindCallback;
 
-  PCCERT_CHAIN_CONTEXT chain_context = NULL;
+  PCCERT_CHAIN_CONTEXT chain_context = nullptr;
   DWORD find_flags = CERT_CHAIN_FIND_BY_ISSUER_CACHE_ONLY_FLAG |
                      CERT_CHAIN_FIND_BY_ISSUER_CACHE_ONLY_URL_FLAG;
   for (;;) {
@@ -155,10 +155,9 @@
     PCCERT_CONTEXT cert_context =
         chain_context->rgpChain[0]->rgpElement[0]->pCertContext;
     // Copy the certificate, so that it is valid after |cert_store| is closed.
-    PCCERT_CONTEXT cert_context2 = NULL;
-    BOOL ok = CertAddCertificateContextToStore(NULL, cert_context,
-                                               CERT_STORE_ADD_USE_EXISTING,
-                                               &cert_context2);
+    PCCERT_CONTEXT cert_context2 = nullptr;
+    BOOL ok = CertAddCertificateContextToStore(
+        nullptr, cert_context, CERT_STORE_ADD_USE_EXISTING, &cert_context2);
     if (!ok) {
       NOTREACHED();
       continue;
@@ -169,8 +168,8 @@
     for (DWORD i = 1; i < chain_context->rgpChain[0]->cElement; ++i) {
       PCCERT_CONTEXT chain_intermediate =
           chain_context->rgpChain[0]->rgpElement[i]->pCertContext;
-      PCCERT_CONTEXT copied_intermediate = NULL;
-      ok = CertAddCertificateContextToStore(NULL, chain_intermediate,
+      PCCERT_CONTEXT copied_intermediate = nullptr;
+      ok = CertAddCertificateContextToStore(nullptr, chain_intermediate,
                                             CERT_STORE_ADD_USE_EXISTING,
                                             &copied_intermediate);
       if (ok)
@@ -270,15 +269,15 @@
     const CertificateList& input_certs,
     const SSLCertRequestInfo& request,
     ClientCertIdentityList* selected_identities) {
-  ScopedHCERTSTORE test_store(CertOpenStore(CERT_STORE_PROV_MEMORY, 0, NULL, 0,
-                                            NULL));
+  ScopedHCERTSTORE test_store(
+      CertOpenStore(CERT_STORE_PROV_MEMORY, 0, NULL, 0, nullptr));
   if (!test_store)
     return false;
 
   // Add available certificates to the test store.
   for (const auto& input_cert : input_certs) {
     // Add the certificate to the test store.
-    PCCERT_CONTEXT cert = NULL;
+    PCCERT_CONTEXT cert = nullptr;
     if (!CertAddEncodedCertificateToStore(
             test_store, X509_ASN_ENCODING,
             reinterpret_cast<const BYTE*>(
diff --git a/net/ssl/default_channel_id_store_unittest.cc b/net/ssl/default_channel_id_store_unittest.cc
index 0ec71ced..1fbe5e8 100644
--- a/net/ssl/default_channel_id_store_unittest.cc
+++ b/net/ssl/default_channel_id_store_unittest.cc
@@ -163,7 +163,7 @@
 //TODO(mattm): add more tests of without a persistent store?
 TEST_F(DefaultChannelIDStoreTest, TestSettingAndGetting) {
   // No persistent store, all calls will be synchronous.
-  DefaultChannelIDStore store(NULL);
+  DefaultChannelIDStore store(nullptr);
   std::unique_ptr<crypto::ECPrivateKey> expected_key(
       crypto::ECPrivateKey::Create());
 
diff --git a/net/ssl/openssl_ssl_util.cc b/net/ssl/openssl_ssl_util.cc
index 0e4e0ac..16b5f1d 100644
--- a/net/ssl/openssl_ssl_util.cc
+++ b/net/ssl/openssl_ssl_util.cc
@@ -138,7 +138,7 @@
     dict->SetInteger("error_lib", ERR_GET_LIB(error_info.error_code));
     dict->SetInteger("error_reason", ERR_GET_REASON(error_info.error_code));
   }
-  if (error_info.file != NULL)
+  if (error_info.file != nullptr)
     dict->SetString("file", error_info.file);
   if (error_info.line != 0)
     dict->SetInteger("line", error_info.line);
diff --git a/net/ssl/openssl_ssl_util.h b/net/ssl/openssl_ssl_util.h
index a511a82..e205d56 100644
--- a/net/ssl/openssl_ssl_util.h
+++ b/net/ssl/openssl_ssl_util.h
@@ -48,7 +48,7 @@
 
 // Helper struct to store information about an OpenSSL error stack entry.
 struct OpenSSLErrorInfo {
-  OpenSSLErrorInfo() : error_code(0), file(NULL), line(0) {}
+  OpenSSLErrorInfo() : error_code(0), file(nullptr), line(0) {}
 
   uint32_t error_code;
   const char* file;
diff --git a/net/ssl/ssl_info.h b/net/ssl/ssl_info.h
index d9d0a3e..d126ef1 100644
--- a/net/ssl/ssl_info.h
+++ b/net/ssl/ssl_info.h
@@ -43,7 +43,7 @@
 
   void Reset();
 
-  bool is_valid() const { return cert.get() != NULL; }
+  bool is_valid() const { return cert.get() != nullptr; }
 
   // Adds the specified |error| to the cert status.
   void SetCertError(int error);
diff --git a/net/ssl/ssl_platform_key_win.cc b/net/ssl/ssl_platform_key_win.cc
index f028084225..04a6b11 100644
--- a/net/ssl/ssl_platform_key_win.cc
+++ b/net/ssl/ssl_platform_key_win.cc
@@ -249,8 +249,8 @@
       return ERR_SSL_CLIENT_AUTH_SIGNATURE_FAILED;
     }
 
-    BCRYPT_PKCS1_PADDING_INFO pkcs1_padding_info = {0};
-    BCRYPT_PSS_PADDING_INFO pss_padding_info = {0};
+    BCRYPT_PKCS1_PADDING_INFO pkcs1_padding_info = {nullptr};
+    BCRYPT_PSS_PADDING_INFO pss_padding_info = {nullptr};
     void* padding_info = nullptr;
     DWORD flags = 0;
     if (SSL_get_signature_algorithm_key_type(algorithm) == EVP_PKEY_RSA) {
diff --git a/net/ssl/test_ssl_private_key.cc b/net/ssl/test_ssl_private_key.cc
index a0d2aa9..aad199d 100644
--- a/net/ssl/test_ssl_private_key.cc
+++ b/net/ssl/test_ssl_private_key.cc
@@ -55,7 +55,8 @@
       }
     }
     size_t sig_len = 0;
-    if (!EVP_DigestSign(ctx.get(), NULL, &sig_len, input.data(), input.size()))
+    if (!EVP_DigestSign(ctx.get(), nullptr, &sig_len, input.data(),
+                        input.size()))
       return ERR_SSL_CLIENT_AUTH_SIGNATURE_FAILED;
     signature->resize(sig_len);
     if (!EVP_DigestSign(ctx.get(), signature->data(), &sig_len, input.data(),
diff --git a/net/test/cert_test_util.cc b/net/test/cert_test_util.cc
index 0e96958..415d685 100644
--- a/net/test/cert_test_util.cc
+++ b/net/test/cert_test_util.cc
@@ -51,7 +51,7 @@
   CertificateList certs = CreateCertificateListFromFile(
       certs_dir, cert_file, format);
   if (certs.empty())
-    return NULL;
+    return nullptr;
 
   std::vector<bssl::UniquePtr<CRYPTO_BUFFER>> intermediates;
   for (size_t i = 1; i < certs.size(); ++i)
@@ -69,13 +69,13 @@
   base::FilePath cert_path = certs_dir.AppendASCII(cert_file);
   std::string cert_data;
   if (!base::ReadFileToString(cert_path, &cert_data))
-    return NULL;
+    return nullptr;
 
   CertificateList certs_in_file =
       X509Certificate::CreateCertificateListFromBytes(
           cert_data.data(), cert_data.size(), X509Certificate::FORMAT_AUTO);
   if (certs_in_file.empty())
-    return NULL;
+    return nullptr;
   return certs_in_file[0];
 }
 
diff --git a/net/test/ct_test_util.cc b/net/test/ct_test_util.cc
index 9013684..28f6ca3a 100644
--- a/net/test/ct_test_util.cc
+++ b/net/test/ct_test_util.cc
@@ -216,7 +216,7 @@
 }
 
 void GetX509CertSCT(scoped_refptr<SignedCertificateTimestamp>* sct_ref) {
-  CHECK(sct_ref != NULL);
+  CHECK(sct_ref != nullptr);
   *sct_ref = new SignedCertificateTimestamp();
   SignedCertificateTimestamp *const sct(sct_ref->get());
   sct->version = ct::SignedCertificateTimestamp::V1;
@@ -233,7 +233,7 @@
 }
 
 void GetPrecertSCT(scoped_refptr<SignedCertificateTimestamp>* sct_ref) {
-  CHECK(sct_ref != NULL);
+  CHECK(sct_ref != nullptr);
   *sct_ref = new SignedCertificateTimestamp();
   SignedCertificateTimestamp *const sct(sct_ref->get());
   sct->version = ct::SignedCertificateTimestamp::V1;
diff --git a/net/test/embedded_test_server/embedded_test_server.h b/net/test/embedded_test_server/embedded_test_server.h
index c467cea0..e758c06 100644
--- a/net/test/embedded_test_server/embedded_test_server.h
+++ b/net/test/embedded_test_server/embedded_test_server.h
@@ -161,9 +161,7 @@
   bool ShutdownAndWaitUntilComplete() WARN_UNUSED_RESULT;
 
   // Checks if the server has started listening for incoming connections.
-  bool Started() const {
-    return listen_socket_.get() != NULL;
-  }
+  bool Started() const { return listen_socket_.get() != nullptr; }
 
   static base::FilePath GetRootCertPemPath();
 
diff --git a/net/test/embedded_test_server/embedded_test_server_unittest.cc b/net/test/embedded_test_server/embedded_test_server_unittest.cc
index 318fd6e4..85155ca1 100644
--- a/net/test/embedded_test_server/embedded_test_server_unittest.cc
+++ b/net/test/embedded_test_server/embedded_test_server_unittest.cc
@@ -318,7 +318,7 @@
 
   std::unique_ptr<StreamSocket> socket =
       ClientSocketFactory::GetDefaultFactory()->CreateTransportClientSocket(
-          address_list, NULL, &net_log, NetLogSource());
+          address_list, nullptr, &net_log, NetLogSource());
   TestCompletionCallback callback;
   ASSERT_THAT(callback.GetResult(socket->Connect(callback.callback())), IsOk());
 
diff --git a/net/test/net_test_suite.cc b/net/test/net_test_suite.cc
index ff4a288..6ef5f7c8 100644
--- a/net/test/net_test_suite.cc
+++ b/net/test/net_test_suite.cc
@@ -41,7 +41,7 @@
 }
 
 void NetTestSuite::InitializeTestThreadNoNetworkChangeNotifier() {
-  host_resolver_proc_ = new net::RuleBasedHostResolverProc(NULL);
+  host_resolver_proc_ = new net::RuleBasedHostResolverProc(nullptr);
   scoped_host_resolver_proc_.Init(host_resolver_proc_.get());
   // In case any attempts are made to resolve host names, force them all to
   // be mapped to localhost.  This prevents DNS queries from being sent in
diff --git a/net/test/spawned_test_server/base_test_server.cc b/net/test/spawned_test_server/base_test_server.cc
index 48ad354..1236b8b 100644
--- a/net/test/spawned_test_server/base_test_server.cc
+++ b/net/test/spawned_test_server/base_test_server.cc
@@ -354,7 +354,7 @@
   DCHECK(address_list);
 
   std::unique_ptr<HostResolver> resolver(
-      HostResolver::CreateDefaultResolver(NULL));
+      HostResolver::CreateDefaultResolver(nullptr));
 
   // Limit the lookup to IPv4 (DnsQueryType::A). When started with the default
   // address of kLocalhost, testserver.py only supports IPv4.
diff --git a/net/test/spawned_test_server/local_test_server.cc b/net/test/spawned_test_server/local_test_server.cc
index 84a03055..c430773 100644
--- a/net/test/spawned_test_server/local_test_server.cc
+++ b/net/test/spawned_test_server/local_test_server.cc
@@ -205,7 +205,7 @@
 
     // Add arguments from a list.
     if (value.is_list()) {
-      const base::ListValue* list = NULL;
+      const base::ListValue* list = nullptr;
       if (!value.GetAsList(&list) || !list || list->empty())
         return false;
       for (auto list_it = list->begin(); list_it != list->end(); ++list_it) {
diff --git a/net/test/spawned_test_server/local_test_server_win.cc b/net/test/spawned_test_server/local_test_server_win.cc
index 06a9401..e6fcbf7 100644
--- a/net/test/spawned_test_server/local_test_server_win.cc
+++ b/net/test/spawned_test_server/local_test_server_win.cc
@@ -34,8 +34,7 @@
   DWORD bytes_written = 0;
   LOG(WARNING) << "Timeout reached; unblocking pipe by writing "
                << size << " bytes";
-  CHECK(WriteFile(handle, unblock_data.data(), size, &bytes_written,
-                  NULL));
+  CHECK(WriteFile(handle, unblock_data.data(), size, &bytes_written, nullptr));
   CHECK_EQ(size, bytes_written);
   *unblocked = true;
 }
@@ -61,7 +60,7 @@
   while (bytes_read < bytes_max) {
     DWORD num_bytes;
     if (!ReadFile(read_fd, buffer + bytes_read, bytes_max - bytes_read,
-                  &num_bytes, NULL)) {
+                  &num_bytes, nullptr)) {
       PLOG(ERROR) << "ReadFile failed";
       return false;
     }
@@ -97,9 +96,9 @@
   if (!AddCommandLineArguments(&python_command))
     return false;
 
-  HANDLE child_read = NULL;
-  HANDLE child_write = NULL;
-  if (!CreatePipe(&child_read, &child_write, NULL, 0)) {
+  HANDLE child_read = nullptr;
+  HANDLE child_write = nullptr;
+  if (!CreatePipe(&child_read, &child_write, nullptr, 0)) {
     PLOG(ERROR) << "Failed to create pipe";
     return false;
   }
diff --git a/net/test/url_request/url_request_slow_download_job.cc b/net/test/url_request/url_request_slow_download_job.cc
index efce74d7..3b54373 100644
--- a/net/test/url_request/url_request_slow_download_job.cc
+++ b/net/test/url_request/url_request_slow_download_job.cc
@@ -216,12 +216,12 @@
 void URLRequestSlowDownloadJob::CheckDoneStatus() {
   if (should_finish_download_) {
     VLOG(10) << __FUNCTION__ << " called w/ should_finish_download_ set.";
-    DCHECK(NULL != buffer_.get());
+    DCHECK(nullptr != buffer_.get());
     int bytes_written = 0;
     ReadStatus status =
         FillBufferHelper(buffer_.get(), buffer_size_, &bytes_written);
     DCHECK_EQ(BUFFER_FILLED, status);
-    buffer_ = NULL;  // Release the reference.
+    buffer_ = nullptr;  // Release the reference.
     ReadRawDataComplete(bytes_written);
   } else if (should_error_download_) {
     VLOG(10) << __FUNCTION__ << " called w/ should_finish_ownload_ set.";
diff --git a/net/third_party/uri_template/uri_template.h b/net/third_party/uri_template/uri_template.h
index 00d7b9a..c091252a 100644
--- a/net/third_party/uri_template/uri_template.h
+++ b/net/third_party/uri_template/uri_template.h
@@ -49,7 +49,7 @@
     const string& template_uri,
     const std::unordered_map<string, string>& parameters,
     string* target,
-    std::set<string>* vars_found = NULL);
+    std::set<string>* vars_found = nullptr);
 
 }  // namespace uri_template
 
diff --git a/net/third_party/uri_template/uri_template_test.cc b/net/third_party/uri_template/uri_template_test.cc
index b2e6909e..3dfc772 100644
--- a/net/third_party/uri_template/uri_template_test.cc
+++ b/net/third_party/uri_template/uri_template_test.cc
@@ -43,7 +43,7 @@
 void CheckExpansion(const string& uri_template,
                     const string& expected_expansion,
                     bool expected_validity = true,
-                    const std::set<string>* expected_vars = NULL) {
+                    const std::set<string>* expected_vars = nullptr) {
   string result;
   std::set<string> vars_found;
   EXPECT_EQ(expected_validity,
diff --git a/net/tools/crash_cache/crash_cache.cc b/net/tools/crash_cache/crash_cache.cc
index dad16a25..aea9609 100644
--- a/net/tools/crash_cache/crash_cache.cc
+++ b/net/tools/crash_cache/crash_cache.cc
@@ -272,7 +272,7 @@
 
   // Work with a tiny index table (16 entries).
   disk_cache::BackendImpl* cache = new disk_cache::BackendImpl(
-      path, 0xf, cache_thread->task_runner().get(), NULL);
+      path, 0xf, cache_thread->task_runner().get(), nullptr);
   if (!cache->SetMaxSize(0x100000))
     return GENERIC;
 
diff --git a/net/tools/dns_fuzz_stub/dns_fuzz_stub.cc b/net/tools/dns_fuzz_stub/dns_fuzz_stub.cc
index 395ab97..cd3f9a3 100644
--- a/net/tools/dns_fuzz_stub/dns_fuzz_stub.cc
+++ b/net/tools/dns_fuzz_stub/dns_fuzz_stub.cc
@@ -36,7 +36,7 @@
 
 void CrashNullPointerDereference(void) {
   // Cause the program to segfault with a NULL pointer dereference
-  int *p = NULL;
+  int* p = nullptr;
   *p = 0;
 }
 
diff --git a/net/tools/dump_cache/dump_files.cc b/net/tools/dump_cache/dump_files.cc
index 0a8ec28..6ff0c87c 100644
--- a/net/tools/dump_cache/dump_files.cc
+++ b/net/tools/dump_cache/dump_files.cc
@@ -161,10 +161,9 @@
   explicit CacheDumper(const base::FilePath& path)
       : path_(path),
         block_files_(path),
-        index_(NULL),
+        index_(nullptr),
         current_hash_(0),
-        next_addr_(0) {
-  }
+        next_addr_(0) {}
 
   bool Init();
 
diff --git a/net/tools/stress_cache/stress_cache.cc b/net/tools/stress_cache/stress_cache.cc
index 2483cebe..e7ead12 100644
--- a/net/tools/stress_cache/stress_cache.cc
+++ b/net/tools/stress_cache/stress_cache.cc
@@ -312,7 +312,7 @@
   g_data = new Data();
   g_data->iteration = iteration;
   g_data->cache = new disk_cache::BackendImpl(
-      path, mask, cache_thread.task_runner().get(), NULL);
+      path, mask, cache_thread.task_runner().get(), nullptr);
   g_data->cache->SetMaxSize(cache_size);
   g_data->cache->SetFlags(disk_cache::kNoLoadProtection);
 
diff --git a/net/url_request/test_url_fetcher_factory.cc b/net/url_request/test_url_fetcher_factory.cc
index 39e1f73..d72be290 100644
--- a/net/url_request/test_url_fetcher_factory.cc
+++ b/net/url_request/test_url_fetcher_factory.cc
@@ -38,15 +38,15 @@
 ScopedURLFetcherFactory::~ScopedURLFetcherFactory() {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
   DCHECK(URLFetcherImpl::factory());
-  URLFetcherImpl::set_factory(NULL);
+  URLFetcherImpl::set_factory(nullptr);
 }
 
 TestURLFetcher::TestURLFetcher(int id, const GURL& url, URLFetcherDelegate* d)
-    : owner_(NULL),
+    : owner_(nullptr),
       id_(id),
       original_url_(url),
       delegate_(d),
-      delegate_for_tests_(NULL),
+      delegate_for_tests_(nullptr),
       did_receive_last_chunk_(false),
       fake_load_flags_(0),
       fake_response_code_(-1),
@@ -328,9 +328,8 @@
 
 TestURLFetcherFactory::TestURLFetcherFactory()
     : ScopedURLFetcherFactory(this),
-      delegate_for_tests_(NULL),
-      remove_fetcher_on_delete_(false) {
-}
+      delegate_for_tests_(nullptr),
+      remove_fetcher_on_delete_(false) {}
 
 TestURLFetcherFactory::~TestURLFetcherFactory() = default;
 
@@ -452,10 +451,10 @@
     NetworkTrafficAnnotationTag traffic_annotation) {
   FakeResponseMap::const_iterator it = fake_responses_.find(url);
   if (it == fake_responses_.end()) {
-    if (default_factory_ == NULL) {
+    if (default_factory_ == nullptr) {
       // If we don't have a baked response for that URL we return NULL.
       DLOG(ERROR) << "No baked response for URL: " << url.spec();
-      return NULL;
+      return nullptr;
     } else {
       return default_factory_->CreateURLFetcher(id, url, request_type, d,
                                                 traffic_annotation);
diff --git a/net/url_request/test_url_request_interceptor.cc b/net/url_request/test_url_request_interceptor.cc
index 6644369..333e5ba 100644
--- a/net/url_request/test_url_request_interceptor.cc
+++ b/net/url_request/test_url_request_interceptor.cc
@@ -102,7 +102,7 @@
     DCHECK(network_task_runner_->RunsTasksInCurrentSequence());
     if (request->url().scheme() != scheme_ ||
         request->url().host() != hostname_) {
-      return NULL;
+      return nullptr;
     }
 
     auto it = responses_.find(request->url());
@@ -116,7 +116,7 @@
       }
       it = ignore_query_responses_.find(url);
       if (it == ignore_query_responses_.end())
-        return NULL;
+        return nullptr;
     }
     {
       base::AutoLock auto_lock(hit_count_lock_);
diff --git a/net/url_request/url_fetcher_core.cc b/net/url_request/url_fetcher_core.cc
index 98b1c32..b3d0a24 100644
--- a/net/url_request/url_fetcher_core.cc
+++ b/net/url_request/url_fetcher_core.cc
@@ -81,7 +81,7 @@
       load_flags_(LOAD_NORMAL),
       allow_credentials_(base::nullopt),
       response_code_(URLFetcher::RESPONSE_CODE_INVALID),
-      url_request_data_key_(NULL),
+      url_request_data_key_(nullptr),
       was_fetched_via_proxy_(false),
       was_cached_(false),
       received_response_content_length_(0),
@@ -126,8 +126,8 @@
   if (delegate_task_runner_)  // May be NULL in tests.
     DCHECK(delegate_task_runner_->RunsTasksInCurrentSequence());
 
-  delegate_ = NULL;
-  fetcher_ = NULL;
+  delegate_ = nullptr;
+  fetcher_ = nullptr;
   if (!network_task_runner_.get())
     return;
   if (network_task_runner_->RunsTasksInCurrentSequence()) {
@@ -368,7 +368,7 @@
 bool URLFetcherCore::GetResponseAsString(
     std::string* out_response_string) const {
   URLFetcherStringWriter* string_writer =
-      response_writer_ ? response_writer_->AsStringWriter() : NULL;
+      response_writer_ ? response_writer_->AsStringWriter() : nullptr;
   if (!string_writer)
     return false;
 
@@ -381,7 +381,7 @@
   DCHECK(delegate_task_runner_->RunsTasksInCurrentSequence());
 
   URLFetcherFileWriter* file_writer =
-      response_writer_ ? response_writer_->AsFileWriter() : NULL;
+      response_writer_ ? response_writer_->AsFileWriter() : nullptr;
   if (!file_writer)
     return false;
 
@@ -714,9 +714,9 @@
   // references to URLFetcher::Core at this point so it may take a while to
   // delete the object, but we cannot delay the destruction of the request
   // context.
-  request_context_getter_ = NULL;
+  request_context_getter_ = nullptr;
   initiator_.reset();
-  url_request_data_key_ = NULL;
+  url_request_data_key_ = nullptr;
   url_request_create_data_callback_.Reset();
   was_cancelled_ = true;
 }
@@ -805,9 +805,9 @@
     return;
   }
 
-  request_context_getter_ = NULL;
+  request_context_getter_ = nullptr;
   initiator_.reset();
-  url_request_data_key_ = NULL;
+  url_request_data_key_ = nullptr;
   url_request_create_data_callback_.Reset();
   bool posted = delegate_task_runner_->PostTask(
       FROM_HERE, base::BindOnce(&URLFetcherCore::OnCompletedURLRequest, this,
diff --git a/net/url_request/url_fetcher_impl.cc b/net/url_request/url_fetcher_impl.cc
index fa72292..6bf491f 100644
--- a/net/url_request/url_fetcher_impl.cc
+++ b/net/url_request/url_fetcher_impl.cc
@@ -15,7 +15,7 @@
 
 namespace net {
 
-static URLFetcherFactory* g_factory = NULL;
+static URLFetcherFactory* g_factory = nullptr;
 
 URLFetcherImpl::URLFetcherImpl(
     const GURL& url,
diff --git a/net/url_request/url_fetcher_response_writer.cc b/net/url_request/url_fetcher_response_writer.cc
index ca0e9f9..02960db 100644
--- a/net/url_request/url_fetcher_response_writer.cc
+++ b/net/url_request/url_fetcher_response_writer.cc
@@ -19,11 +19,11 @@
 namespace net {
 
 URLFetcherStringWriter* URLFetcherResponseWriter::AsStringWriter() {
-  return NULL;
+  return nullptr;
 }
 
 URLFetcherFileWriter* URLFetcherResponseWriter::AsFileWriter() {
-  return NULL;
+  return nullptr;
 }
 
 URLFetcherStringWriter::URLFetcherStringWriter() = default;
diff --git a/net/url_request/url_request.cc b/net/url_request/url_request.cc
index 66a54b3..9507dc7 100644
--- a/net/url_request/url_request.cc
+++ b/net/url_request/url_request.cc
@@ -211,7 +211,7 @@
 }
 
 bool URLRequest::has_upload() const {
-  return upload_data_stream_.get() != NULL;
+  return upload_data_stream_.get() != nullptr;
 }
 
 void URLRequest::SetExtraRequestHeaderByName(const string& name,
@@ -1186,7 +1186,7 @@
   is_redirecting_ = false;
   has_notified_completion_ = true;
   if (network_delegate_)
-    network_delegate_->NotifyCompleted(this, job_.get() != NULL,
+    network_delegate_->NotifyCompleted(this, job_.get() != nullptr,
                                        status_.error());
 }
 
diff --git a/net/url_request/url_request_data_job.cc b/net/url_request/url_request_data_job.cc
index fabf6983..559027c 100644
--- a/net/url_request/url_request_data_job.cc
+++ b/net/url_request/url_request_data_job.cc
@@ -59,7 +59,7 @@
 
   // TODO(tyoshino): Get the headers and export via
   // URLRequestJob::GetResponseInfo().
-  return BuildResponse(url, mime_type, charset, data, NULL);
+  return BuildResponse(url, mime_type, charset, data, nullptr);
 }
 
 URLRequestDataJob::~URLRequestDataJob() = default;
diff --git a/net/url_request/url_request_file_job.cc b/net/url_request/url_request_file_job.cc
index 3a610bfe..bdb7a27 100644
--- a/net/url_request/url_request_file_job.cc
+++ b/net/url_request/url_request_file_job.cc
@@ -134,7 +134,7 @@
 
   base::FilePath new_path = file_path_;
   bool resolved;
-  resolved = base::win::ResolveShortcut(new_path, &new_path, NULL);
+  resolved = base::win::ResolveShortcut(new_path, &new_path, nullptr);
 
   // If shortcut is not resolved successfully, do not redirect.
   if (!resolved)
@@ -322,7 +322,7 @@
   }
 
   OnReadComplete(buf.get(), result);
-  buf = NULL;
+  buf = nullptr;
 
   ReadRawDataComplete(result);
 }
diff --git a/net/url_request/url_request_file_job_unittest.cc b/net/url_request/url_request_file_job_unittest.cc
index 94d14d8..21fa911c 100644
--- a/net/url_request/url_request_file_job_unittest.cc
+++ b/net/url_request/url_request_file_job_unittest.cc
@@ -324,15 +324,15 @@
 }
 
 TEST_F(URLRequestFileJobEventsTest, TinyFile) {
-  RunSuccessfulRequestWithString(std::string("hello world"), NULL);
+  RunSuccessfulRequestWithString(std::string("hello world"), nullptr);
 }
 
 TEST_F(URLRequestFileJobEventsTest, SmallFile) {
-  RunSuccessfulRequestWithString(MakeContentOfSize(17 * 1024), NULL);
+  RunSuccessfulRequestWithString(MakeContentOfSize(17 * 1024), nullptr);
 }
 
 TEST_F(URLRequestFileJobEventsTest, BigFile) {
-  RunSuccessfulRequestWithString(MakeContentOfSize(3 * 1024 * 1024), NULL);
+  RunSuccessfulRequestWithString(MakeContentOfSize(3 * 1024 * 1024), nullptr);
 }
 
 TEST_F(URLRequestFileJobEventsTest, Range) {
diff --git a/net/url_request/url_request_filter.cc b/net/url_request/url_request_filter.cc
index f2cf018e..5a8a7209 100644
--- a/net/url_request/url_request_filter.cc
+++ b/net/url_request/url_request_filter.cc
@@ -36,7 +36,7 @@
 
 }  // namespace
 
-URLRequestFilter* URLRequestFilter::shared_instance_ = NULL;
+URLRequestFilter* URLRequestFilter::shared_instance_ = nullptr;
 
 // static
 URLRequestFilter* URLRequestFilter::GetInstance() {
@@ -114,9 +114,9 @@
     URLRequest* request,
     NetworkDelegate* network_delegate) const {
   DCHECK(base::MessageLoopCurrentForIO::Get());
-  URLRequestJob* job = NULL;
+  URLRequestJob* job = nullptr;
   if (!request->url().is_valid())
-    return NULL;
+    return nullptr;
 
   // Check the hostname map first.
   const std::string hostname = request->url().host();
@@ -149,7 +149,7 @@
 
 URLRequestFilter::~URLRequestFilter() {
   DCHECK(OnMessageLoopForInterceptorRemoval());
-  URLRequestJobFactoryImpl::SetInterceptorForTesting(NULL);
+  URLRequestJobFactoryImpl::SetInterceptorForTesting(nullptr);
 }
 
 }  // namespace net
diff --git a/net/url_request/url_request_filter_unittest.cc b/net/url_request/url_request_filter_unittest.cc
index a34c501..6a88e83 100644
--- a/net/url_request/url_request_filter_unittest.cc
+++ b/net/url_request/url_request_filter_unittest.cc
@@ -73,18 +73,20 @@
       kUrl1, std::unique_ptr<URLRequestInterceptor>(interceptor)));
   {
     std::unique_ptr<URLRequestJob> found(
-        filter->MaybeInterceptRequest(request1.get(), NULL));
+        filter->MaybeInterceptRequest(request1.get(), nullptr));
     EXPECT_TRUE(interceptor->WasLastJobCreated(found.get()));
   }
   EXPECT_EQ(filter->hit_count(), 1);
 
   // Check we don't match other URLs.
-  EXPECT_TRUE(filter->MaybeInterceptRequest(request2.get(), NULL) == NULL);
+  EXPECT_TRUE(filter->MaybeInterceptRequest(request2.get(), nullptr) ==
+              nullptr);
   EXPECT_EQ(1, filter->hit_count());
 
   // Check we can remove URL matching.
   filter->RemoveUrlHandler(kUrl1);
-  EXPECT_TRUE(filter->MaybeInterceptRequest(request1.get(), NULL) == NULL);
+  EXPECT_TRUE(filter->MaybeInterceptRequest(request1.get(), nullptr) ==
+              nullptr);
   EXPECT_EQ(1, filter->hit_count());
 
   // Check hostname matching.
@@ -96,18 +98,20 @@
       std::unique_ptr<URLRequestInterceptor>(interceptor));
   {
     std::unique_ptr<URLRequestJob> found(
-        filter->MaybeInterceptRequest(request1.get(), NULL));
+        filter->MaybeInterceptRequest(request1.get(), nullptr));
     EXPECT_TRUE(interceptor->WasLastJobCreated(found.get()));
   }
   EXPECT_EQ(1, filter->hit_count());
 
   // Check we don't match other hostnames.
-  EXPECT_TRUE(filter->MaybeInterceptRequest(request2.get(), NULL) == NULL);
+  EXPECT_TRUE(filter->MaybeInterceptRequest(request2.get(), nullptr) ==
+              nullptr);
   EXPECT_EQ(1, filter->hit_count());
 
   // Check we can remove hostname matching.
   filter->RemoveHostnameHandler(kUrl1.scheme(), kUrl1.host());
-  EXPECT_TRUE(filter->MaybeInterceptRequest(request1.get(), NULL) == NULL);
+  EXPECT_TRUE(filter->MaybeInterceptRequest(request1.get(), nullptr) ==
+              nullptr);
   EXPECT_EQ(1, filter->hit_count());
 
   filter->ClearHandlers();
diff --git a/net/url_request/url_request_ftp_job.cc b/net/url_request/url_request_ftp_job.cc
index ebfc053..3f5633142 100644
--- a/net/url_request/url_request_ftp_job.cc
+++ b/net/url_request/url_request_ftp_job.cc
@@ -47,7 +47,7 @@
       priority_(DEFAULT_PRIORITY),
       proxy_resolution_service_(
           request_->context()->proxy_resolution_service()),
-      http_response_info_(NULL),
+      http_response_info_(nullptr),
       read_in_progress_(false),
       ftp_transaction_factory_(ftp_transaction_factory),
       ftp_auth_cache_(ftp_auth_cache),
@@ -146,7 +146,7 @@
 }
 
 void URLRequestFtpJob::OnResolveProxyComplete(int result) {
-  proxy_resolve_request_ = NULL;
+  proxy_resolve_request_ = nullptr;
 
   if (result != OK) {
     OnStartCompletedAsync(result);
@@ -383,7 +383,7 @@
   }
   auth_data_->state = AUTH_STATE_NEED_AUTH;
 
-  FtpAuthCache::Entry* cached_auth = NULL;
+  FtpAuthCache::Entry* cached_auth = nullptr;
   if (ftp_transaction_ && ftp_transaction_->GetResponseInfo()->needs_auth)
     cached_auth = ftp_auth_cache_->Lookup(origin);
   if (cached_auth) {
diff --git a/net/url_request/url_request_ftp_job_unittest.cc b/net/url_request/url_request_ftp_job_unittest.cc
index 22f1c45..26239d0 100644
--- a/net/url_request/url_request_ftp_job_unittest.cc
+++ b/net/url_request/url_request_ftp_job_unittest.cc
@@ -126,7 +126,7 @@
 
   void RemoveObserver(Observer* observer) override {
     if (observer_ == observer) {
-      observer_ = NULL;
+      observer_ = nullptr;
     }
   }
 
@@ -148,7 +148,7 @@
   TestURLRequestFtpJob(URLRequest* request,
                        FtpTransactionFactory* ftp_factory,
                        FtpAuthCache* ftp_auth_cache)
-      : URLRequestFtpJob(request, NULL, ftp_factory, ftp_auth_cache) {}
+      : URLRequestFtpJob(request, nullptr, ftp_factory, ftp_auth_cache) {}
   ~TestURLRequestFtpJob() override = default;
 
   using URLRequestFtpJob::SetPriority;
@@ -165,8 +165,8 @@
  protected:
   URLRequestFtpJobPriorityTest()
       : proxy_resolution_service_(std::make_unique<SimpleProxyConfigService>(),
-                                  NULL,
-                                  NULL),
+                                  nullptr,
+                                  nullptr),
         req_(context_.CreateRequest(GURL("ftp://ftp.example.com"),
                                     DEFAULT_PRIORITY,
                                     &delegate_,
diff --git a/net/url_request/url_request_http_job.cc b/net/url_request/url_request_http_job.cc
index 5d55790..b0fac02 100644
--- a/net/url_request/url_request_http_job.cc
+++ b/net/url_request/url_request_http_job.cc
@@ -1239,7 +1239,7 @@
   }
 
   // These will be reset in OnStartCompleted.
-  response_info_ = NULL;
+  response_info_ = nullptr;
   receive_headers_end_ = base::TimeTicks::Now();
   // TODO(davidben,mmenke): We should either reset override_response_headers_
   // here or not call NotifyHeadersReceived a second time on the same response
@@ -1387,7 +1387,7 @@
 
 void URLRequestHttpJob::DoneReadingRedirectResponse() {
   if (transaction_) {
-    if (transaction_->GetResponseInfo()->headers->IsRedirect(NULL)) {
+    if (transaction_->GetResponseInfo()->headers->IsRedirect(nullptr)) {
       // If the original headers indicate a redirect, go ahead and cache the
       // response, even if the |override_response_headers_| are a redirect to
       // another location.
@@ -1396,7 +1396,7 @@
       // Otherwise, |override_response_headers_| must be non-NULL and contain
       // bogus headers indicating a redirect.
       DCHECK(override_response_headers_.get());
-      DCHECK(override_response_headers_->IsRedirect(NULL));
+      DCHECK(override_response_headers_->IsRedirect(nullptr));
       transaction_->StopCaching();
     }
   }
diff --git a/net/url_request/url_request_job_factory_impl.cc b/net/url_request/url_request_job_factory_impl.cc
index c8f540ab..c98a0b24 100644
--- a/net/url_request/url_request_job_factory_impl.cc
+++ b/net/url_request/url_request_job_factory_impl.cc
@@ -14,7 +14,7 @@
 
 namespace {
 
-URLRequestInterceptor* g_interceptor_for_testing = NULL;
+URLRequestInterceptor* g_interceptor_for_testing = nullptr;
 
 }  // namespace
 
@@ -56,7 +56,7 @@
 
   auto it = protocol_handler_map_.find(scheme);
   if (it == protocol_handler_map_.end())
-    return NULL;
+    return nullptr;
   return it->second->MaybeCreateJob(request, network_delegate);
 }
 
diff --git a/net/url_request/url_request_job_manager.cc b/net/url_request/url_request_job_manager.cc
index 7fe0edf2..da609d2 100644
--- a/net/url_request/url_request_job_manager.cc
+++ b/net/url_request/url_request_job_manager.cc
@@ -99,15 +99,15 @@
   DCHECK(IsAllowedThread());
   if (!request->url().is_valid() ||
       request->status().status() == URLRequestStatus::CANCELED) {
-    return NULL;
+    return nullptr;
   }
 
-  const URLRequestJobFactory* job_factory = NULL;
+  const URLRequestJobFactory* job_factory = nullptr;
   job_factory = request->context()->job_factory();
 
   const std::string& scheme = request->url().scheme();  // already lowercase
   if (!job_factory->IsHandledProtocol(scheme))
-    return NULL;
+    return nullptr;
 
   URLRequestJob* job =
       request->context()->job_factory()->MaybeInterceptRedirect(
@@ -115,7 +115,7 @@
   if (job)
     return job;
 
-  return NULL;
+  return nullptr;
 }
 
 URLRequestJob* URLRequestJobManager::MaybeInterceptResponse(
@@ -123,15 +123,15 @@
   DCHECK(IsAllowedThread());
   if (!request->url().is_valid() ||
       request->status().status() == URLRequestStatus::CANCELED) {
-    return NULL;
+    return nullptr;
   }
 
-  const URLRequestJobFactory* job_factory = NULL;
+  const URLRequestJobFactory* job_factory = nullptr;
   job_factory = request->context()->job_factory();
 
   const std::string& scheme = request->url().scheme();  // already lowercase
   if (!job_factory->IsHandledProtocol(scheme))
-    return NULL;
+    return nullptr;
 
   URLRequestJob* job =
       request->context()->job_factory()->MaybeInterceptResponse(
@@ -139,7 +139,7 @@
   if (job)
     return job;
 
-  return NULL;
+  return nullptr;
 }
 
 // static
diff --git a/net/url_request/url_request_job_unittest.cc b/net/url_request/url_request_job_unittest.cc
index c516761..bfd3bbe 100644
--- a/net/url_request/url_request_job_unittest.cc
+++ b/net/url_request/url_request_job_unittest.cc
@@ -111,7 +111,7 @@
     TEST_MODE_NORMAL,
     nullptr,
     nullptr,
-    0,
+    nullptr,
     0,
     OK,
     OK,
@@ -131,7 +131,7 @@
     TEST_MODE_NORMAL,
     nullptr,
     nullptr,
-    0,
+    nullptr,
     0,
     OK,
     OK,
diff --git a/net/url_request/url_request_redirect_job.cc b/net/url_request/url_request_redirect_job.cc
index 6a2c2c6..e53413a 100644
--- a/net/url_request/url_request_redirect_job.cc
+++ b/net/url_request/url_request_redirect_job.cc
@@ -114,7 +114,7 @@
   fake_headers_ = new HttpResponseHeaders(
       HttpUtil::AssembleRawHeaders(header_string.c_str(),
                                    header_string.length()));
-  DCHECK(fake_headers_->IsRedirect(NULL));
+  DCHECK(fake_headers_->IsRedirect(nullptr));
 
   request()->net_log().AddEvent(
       NetLogEventType::URL_REQUEST_FAKE_RESPONSE_HEADERS_CREATED,
diff --git a/net/url_request/url_request_simple_job_unittest.cc b/net/url_request/url_request_simple_job_unittest.cc
index 214dcf9..7a0bc59 100644
--- a/net/url_request/url_request_simple_job_unittest.cc
+++ b/net/url_request/url_request_simple_job_unittest.cc
@@ -143,7 +143,7 @@
 }  // namespace
 
 TEST_F(URLRequestSimpleJobTest, SimpleRequest) {
-  StartRequest(NULL);
+  StartRequest(nullptr);
   EXPECT_THAT(delegate_.request_status(), IsOk());
   EXPECT_EQ(kTestData, delegate_.data_received());
 }
diff --git a/net/url_request/url_request_test_job.cc b/net/url_request/url_request_test_job.cc
index 6e7c1b7..e0eacca 100644
--- a/net/url_request/url_request_test_job.cc
+++ b/net/url_request/url_request_test_job.cc
@@ -154,7 +154,7 @@
       stage_(WAITING),
       priority_(DEFAULT_PRIORITY),
       offset_(0),
-      async_buf_(NULL),
+      async_buf_(nullptr),
       async_buf_size_(0),
       response_headers_length_(0),
       async_reads_(false),
diff --git a/net/url_request/url_request_throttler_entry.cc b/net/url_request/url_request_throttler_entry.cc
index 7af8e9a..7a1d7fc 100644
--- a/net/url_request/url_request_throttler_entry.cc
+++ b/net/url_request/url_request_throttler_entry.cc
@@ -148,7 +148,7 @@
 }
 
 void URLRequestThrottlerEntry::DetachManager() {
-  manager_ = NULL;
+  manager_ = nullptr;
 }
 
 bool URLRequestThrottlerEntry::ShouldRejectRequest(
diff --git a/net/url_request/url_request_throttler_manager.cc b/net/url_request/url_request_throttler_manager.cc
index cf2b0c31..aa35994b 100644
--- a/net/url_request/url_request_throttler_manager.cc
+++ b/net/url_request/url_request_throttler_manager.cc
@@ -38,7 +38,7 @@
   // entries, detach the entries' back-pointer to the manager.
   auto i = url_entries_.begin();
   while (i != url_entries_.end()) {
-    if (i->second.get() != NULL) {
+    if (i->second.get() != nullptr) {
       i->second->DetachManager();
     }
     ++i;
@@ -66,11 +66,11 @@
   // aggressively (i.e. this resets the error count when the entry's URL
   // hasn't been requested in long enough).
   if (entry.get() && entry->IsEntryOutdated()) {
-    entry = NULL;
+    entry = nullptr;
   }
 
   // Create the entry if needed.
-  if (entry.get() == NULL) {
+  if (entry.get() == nullptr) {
     entry = new URLRequestThrottlerEntry(this, url_id);
 
     // We only disable back-off throttling on an entry that we have
diff --git a/net/url_request/url_request_throttler_simulation_unittest.cc b/net/url_request/url_request_throttler_simulation_unittest.cc
index b52ce78..e26e150 100644
--- a/net/url_request/url_request_throttler_simulation_unittest.cc
+++ b/net/url_request/url_request_throttler_simulation_unittest.cc
@@ -127,7 +127,7 @@
         max_experienced_queries_per_tick_(0),
         mock_request_(context_.CreateRequest(GURL(),
                                              DEFAULT_PRIORITY,
-                                             NULL,
+                                             nullptr,
                                              TRAFFIC_ANNOTATION_FOR_TESTS)) {}
 
   void SetDowntime(const TimeTicks& start_time, const TimeDelta& duration) {
@@ -598,8 +598,8 @@
   if (!enable_throttling)
     throttler_entry->DisableBackoffThrottling();
 
-  Requester requester(
-      throttler_entry.get(), average_client_interval, &server, NULL);
+  Requester requester(throttler_entry.get(), average_client_interval, &server,
+                      nullptr);
   requester.SetStartupJitter(duration / 3);
   requester.SetRequestJitter(average_client_interval);
 
diff --git a/net/url_request/url_request_throttler_unittest.cc b/net/url_request/url_request_throttler_unittest.cc
index b9add85..5090c87 100644
--- a/net/url_request/url_request_throttler_unittest.cc
+++ b/net/url_request/url_request_throttler_unittest.cc
@@ -164,7 +164,7 @@
   URLRequestThrottlerEntryTest()
       : request_(context_.CreateRequest(GURL(),
                                         DEFAULT_PRIORITY,
-                                        NULL,
+                                        nullptr,
                                         TRAFFIC_ANNOTATION_FOR_TESTS)) {}
 
   void SetUp() override;
@@ -315,7 +315,7 @@
   URLRequestThrottlerManagerTest()
       : request_(context_.CreateRequest(GURL(),
                                         DEFAULT_PRIORITY,
-                                        NULL,
+                                        nullptr,
                                         TRAFFIC_ANNOTATION_FOR_TESTS)) {}
 
   void SetUp() override { request_->SetLoadFlags(0); }
diff --git a/net/url_request/url_request_unittest.cc b/net/url_request/url_request_unittest.cc
index c6323ed..eb1c0157 100644
--- a/net/url_request/url_request_unittest.cc
+++ b/net/url_request/url_request_unittest.cc
@@ -555,10 +555,9 @@
       retval_(OK),
       auth_retval_(AUTH_REQUIRED_RESPONSE_NO_ACTION),
       block_on_(0),
-      target_auth_credentials_(NULL),
+      target_auth_credentials_(nullptr),
       stage_blocked_for_callback_(NOT_BLOCKED),
-      weak_factory_(this) {
-}
+      weak_factory_(this) {}
 
 void BlockingNetworkDelegate::RunUntilBlocked() {
   base::RunLoop run_loop;
@@ -605,7 +604,7 @@
 void BlockingNetworkDelegate::RunAuthCallback(AuthRequiredResponse response,
                                               AuthCallback callback) {
   if (auth_retval_ == AUTH_REQUIRED_RESPONSE_SET_AUTH) {
-    ASSERT_TRUE(target_auth_credentials_ != NULL);
+    ASSERT_TRUE(target_auth_credentials_ != nullptr);
     *target_auth_credentials_ = auth_credentials_;
   }
   std::move(callback).Run(response);
@@ -1338,7 +1337,7 @@
   }
 
   // Take out mock resource provider.
-  NetModule::SetResourceProvider(NULL);
+  NetModule::SetResourceProvider(nullptr);
 }
 
 TEST_F(URLRequestTest, FileDirOutputSanity) {
@@ -1461,7 +1460,7 @@
   {
     Microsoft::WRL::ComPtr<IShellLink> shell;
     ASSERT_TRUE(SUCCEEDED(::CoCreateInstance(
-        CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&shell))));
+        CLSID_ShellLink, nullptr, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&shell))));
     Microsoft::WRL::ComPtr<IPersistFile> persist;
     ASSERT_TRUE(SUCCEEDED(shell.CopyTo(persist.GetAddressOf())));
     EXPECT_TRUE(SUCCEEDED(shell->SetPath(base::as_wcstr(app_path.value()))));
@@ -1484,14 +1483,14 @@
     GetFileAttributesEx(base::as_wcstr(app_path.value()), GetFileExInfoStandard,
                         &data);
     HANDLE file = CreateFile(base::as_wcstr(app_path.value()), GENERIC_READ,
-                             FILE_SHARE_READ, NULL, OPEN_EXISTING,
-                             FILE_ATTRIBUTE_NORMAL, NULL);
+                             FILE_SHARE_READ, nullptr, OPEN_EXISTING,
+                             FILE_ATTRIBUTE_NORMAL, nullptr);
     EXPECT_NE(INVALID_HANDLE_VALUE, file);
     std::unique_ptr<char[]> buffer(new char[data.nFileSizeLow]);
     DWORD read_size;
     BOOL result;
-    result = ReadFile(file, buffer.get(), data.nFileSizeLow,
-                      &read_size, NULL);
+    result =
+        ReadFile(file, buffer.get(), data.nFileSizeLow, &read_size, nullptr);
     std::string content(buffer.get(), read_size);
     CloseHandle(file);
 
@@ -1827,8 +1826,7 @@
 // Inherit PlatformTest since we require the autorelease pool on Mac OS X.
 class URLRequestInterceptorTest : public URLRequestTest {
  public:
-  URLRequestInterceptorTest() : URLRequestTest(), interceptor_(NULL) {
-  }
+  URLRequestInterceptorTest() : URLRequestTest(), interceptor_(nullptr) {}
 
   ~URLRequestInterceptorTest() override {
     // URLRequestJobs may post clean-up tasks on destruction.
@@ -4541,8 +4539,8 @@
     EXPECT_EQ(307, r->GetResponseCode());
     EXPECT_EQ(307, r->response_headers()->response_code());
     std::string location;
-    ASSERT_TRUE(r->response_headers()->EnumerateHeader(NULL, "Location",
-                                                       &location));
+    ASSERT_TRUE(
+        r->response_headers()->EnumerateHeader(nullptr, "Location", &location));
     EXPECT_EQ(redirect_url, GURL(location));
 
     // Let the request finish.
@@ -4596,8 +4594,8 @@
     EXPECT_EQ(307, r->GetResponseCode());
     EXPECT_EQ(307, r->response_headers()->response_code());
     std::string location;
-    ASSERT_TRUE(r->response_headers()->EnumerateHeader(NULL, "Location",
-                                                       &location));
+    ASSERT_TRUE(
+        r->response_headers()->EnumerateHeader(nullptr, "Location", &location));
     EXPECT_EQ(redirect_url, GURL(location));
 
     // Let the request finish.
@@ -4660,8 +4658,8 @@
     EXPECT_EQ(307, r->GetResponseCode());
     EXPECT_EQ(307, r->response_headers()->response_code());
     std::string location;
-    ASSERT_TRUE(r->response_headers()->EnumerateHeader(NULL, "Location",
-                                                       &location));
+    ASSERT_TRUE(
+        r->response_headers()->EnumerateHeader(nullptr, "Location", &location));
     EXPECT_EQ(redirect_url, GURL(location));
 
     // Let the request finish.
@@ -5812,7 +5810,7 @@
 
   TestDelegate request_delegate;
   TestURLRequestContext context(true);
-  context.set_network_delegate(NULL);
+  context.set_network_delegate(nullptr);
   context.set_net_log(&net_log_);
   context.Init();
 
@@ -6048,7 +6046,7 @@
   AsyncLoggingUrlRequestDelegate request_delegate(
       AsyncLoggingUrlRequestDelegate::NO_CANCEL);
   TestURLRequestContext context(true);
-  context.set_network_delegate(NULL);
+  context.set_network_delegate(nullptr);
   context.set_net_log(&net_log_);
   context.Init();
 
@@ -6107,7 +6105,7 @@
   AsyncLoggingUrlRequestDelegate request_delegate(
       AsyncLoggingUrlRequestDelegate::NO_CANCEL);
   TestURLRequestContext context(true);
-  context.set_network_delegate(NULL);
+  context.set_network_delegate(nullptr);
   context.set_net_log(&net_log_);
   context.Init();
 
@@ -6165,7 +6163,7 @@
     AsyncLoggingUrlRequestDelegate request_delegate(cancel_stage);
     TestNetLog net_log;
     TestURLRequestContext context(true);
-    context.set_network_delegate(NULL);
+    context.set_network_delegate(nullptr);
     context.set_net_log(&net_log);
     context.Init();
 
@@ -8944,7 +8942,7 @@
   context.Init();
   // We override the HttpUserAgentSettings after initialization because empty
   // entries get overridden by Init().
-  context.set_http_user_agent_settings(NULL);
+  context.set_http_user_agent_settings(nullptr);
 
   struct {
     const char* request;
@@ -9207,8 +9205,8 @@
   // TODO(bengr): Merge this with the URLRequestInterceptorHTTPTest fixture,
   // ideally remove the dependency on URLRequestTestJob, and maybe move these
   // tests into the factory tests.
-  URLRequestInterceptorTestHTTP() : URLRequestTestHTTP(), interceptor_(NULL) {
-  }
+  URLRequestInterceptorTestHTTP()
+      : URLRequestTestHTTP(), interceptor_(nullptr) {}
 
   void SetUpFactory() override {
     interceptor_ = new MockURLRequestInterceptor();
@@ -9988,11 +9986,12 @@
 
   const HttpResponseHeaders* headers = req->response_headers();
   std::string redirect_location;
-  EXPECT_TRUE(headers->EnumerateHeader(NULL, "Location", &redirect_location));
+  EXPECT_TRUE(
+      headers->EnumerateHeader(nullptr, "Location", &redirect_location));
   EXPECT_EQ(hsts_https_url.spec(), redirect_location);
 
   std::string received_cors_header;
-  EXPECT_TRUE(headers->EnumerateHeader(NULL, "Access-Control-Allow-Origin",
+  EXPECT_TRUE(headers->EnumerateHeader(nullptr, "Access-Control-Allow-Origin",
                                        &received_cors_header));
   EXPECT_EQ(kOriginHeaderValue, received_cors_header);
 }
@@ -10745,7 +10744,7 @@
 
     scoped_refptr<X509Certificate> root_cert =
         ImportCertFromFile(GetTestCertsDirectory(), "ocsp-test-root.pem");
-    CHECK_NE(static_cast<X509Certificate*>(NULL), root_cert.get());
+    CHECK_NE(static_cast<X509Certificate*>(nullptr), root_cert.get());
     test_root_.reset(new ScopedTestRoot(root_cert.get()));
 
 #if defined(OS_ANDROID) || defined(USE_BUILTIN_CERT_VERIFIER)
diff --git a/net/websockets/websocket_basic_stream.cc b/net/websockets/websocket_basic_stream.cc
index d9d45b65..0fa933d 100644
--- a/net/websockets/websocket_basic_stream.cc
+++ b/net/websockets/websocket_basic_stream.cc
@@ -107,7 +107,7 @@
       generate_websocket_masking_key_(&GenerateWebSocketMaskingKey) {
   // http_read_buffer_ should not be set if it contains no data.
   if (http_read_buffer_.get() && http_read_buffer_->offset() == 0)
-    http_read_buffer_ = NULL;
+    http_read_buffer_ = nullptr;
   DCHECK(connection_->is_initialized());
 }
 
@@ -321,10 +321,10 @@
 int WebSocketBasicStream::ConvertChunkToFrame(
     std::unique_ptr<WebSocketFrameChunk> chunk,
     std::unique_ptr<WebSocketFrame>* frame) {
-  DCHECK(frame->get() == NULL);
+  DCHECK(frame->get() == nullptr);
   bool is_first_chunk = false;
   if (chunk->header) {
-    DCHECK(current_frame_header_ == NULL)
+    DCHECK(current_frame_header_ == nullptr)
         << "Received the header for a new frame without notification that "
         << "the previous frame was complete (bug in WebSocketFrameParser?)";
     is_first_chunk = true;
@@ -384,7 +384,7 @@
       memcpy(body->data(),
              incomplete_control_frame_body_->StartOfBuffer(),
              body_size);
-      incomplete_control_frame_body_ = NULL;  // Frame now complete.
+      incomplete_control_frame_body_ = nullptr;  // Frame now complete.
       DCHECK(is_final_chunk);
       *frame = CreateFrame(is_final_chunk, body);
       return OK;
diff --git a/net/websockets/websocket_channel.cc b/net/websockets/websocket_channel.cc
index f8045bff..69bcd78 100644
--- a/net/websockets/websocket_channel.cc
+++ b/net/websockets/websocket_channel.cc
@@ -888,7 +888,7 @@
     // This call is not redundant when size == 0 because it tells us what
     // the current state is.
     StreamingUtf8Validator::State state = incoming_utf8_validator_.AddBytes(
-        size ? data_buffer->data() : NULL, static_cast<size_t>(size));
+        size ? data_buffer->data() : nullptr, static_cast<size_t>(size));
     if (state == StreamingUtf8Validator::INVALID ||
         (state == StreamingUtf8Validator::VALID_MIDPOINT && final)) {
       FailChannel("Could not decode a text frame as UTF-8.",
diff --git a/net/websockets/websocket_deflate_stream.cc b/net/websockets/websocket_deflate_stream.cc
index ac20c1b..aefc853 100644
--- a/net/websockets/websocket_deflate_stream.cc
+++ b/net/websockets/websocket_deflate_stream.cc
@@ -284,7 +284,7 @@
   frames->swap(frames_passed);
   for (size_t i = 0; i < frames_passed.size(); ++i) {
     std::unique_ptr<WebSocketFrame> frame(std::move(frames_passed[i]));
-    frames_passed[i] = NULL;
+    frames_passed[i] = nullptr;
     DVLOG(3) << "Input frame: opcode=" << frame->header.opcode
              << " final=" << frame->header.final
              << " reserved1=" << frame->header.reserved1
diff --git a/net/websockets/websocket_deflate_stream_test.cc b/net/websockets/websocket_deflate_stream_test.cc
index 1caa4cd0..0b98bb5 100644
--- a/net/websockets/websocket_deflate_stream_test.cc
+++ b/net/websockets/websocket_deflate_stream_test.cc
@@ -243,9 +243,7 @@
 
 class WebSocketDeflateStreamTest : public ::testing::Test {
  public:
-  WebSocketDeflateStreamTest()
-      : mock_stream_(NULL),
-        predictor_(NULL) {}
+  WebSocketDeflateStreamTest() : mock_stream_(nullptr), predictor_(nullptr) {}
   ~WebSocketDeflateStreamTest() override = default;
 
   void SetUp() override {
diff --git a/net/websockets/websocket_deflater.cc b/net/websockets/websocket_deflater.cc
index 27b3399..e79926c 100644
--- a/net/websockets/websocket_deflater.cc
+++ b/net/websockets/websocket_deflater.cc
@@ -21,7 +21,7 @@
 WebSocketDeflater::~WebSocketDeflater() {
   if (stream_) {
     deflateEnd(stream_.get());
-    stream_.reset(NULL);
+    stream_.reset(nullptr);
   }
 }
 
@@ -92,7 +92,7 @@
     ResetContext();
     return true;
   }
-  stream_->next_in = NULL;
+  stream_->next_in = nullptr;
   stream_->avail_in = 0;
 
   int result = Deflate(Z_SYNC_FLUSH);
diff --git a/net/websockets/websocket_frame_parser_test.cc b/net/websockets/websocket_frame_parser_test.cc
index 6ff9668..61c0be5 100644
--- a/net/websockets/websocket_frame_parser_test.cc
+++ b/net/websockets/websocket_frame_parser_test.cc
@@ -56,9 +56,9 @@
   EXPECT_EQ(kWebSocketNormalClosure, parser.websocket_error());
   ASSERT_EQ(1u, frames.size());
   WebSocketFrameChunk* frame = frames[0].get();
-  ASSERT_TRUE(frame != NULL);
+  ASSERT_TRUE(frame != nullptr);
   const WebSocketFrameHeader* header = frame->header.get();
-  EXPECT_TRUE(header != NULL);
+  EXPECT_TRUE(header != nullptr);
   if (header) {
     EXPECT_TRUE(header->final);
     EXPECT_FALSE(header->reserved1);
@@ -83,9 +83,9 @@
   EXPECT_EQ(kWebSocketNormalClosure, parser.websocket_error());
   ASSERT_EQ(1u, frames.size());
   WebSocketFrameChunk* frame = frames[0].get();
-  ASSERT_TRUE(frame != NULL);
+  ASSERT_TRUE(frame != nullptr);
   const WebSocketFrameHeader* header = frame->header.get();
-  EXPECT_TRUE(header != NULL);
+  EXPECT_TRUE(header != nullptr);
   if (header) {
     EXPECT_TRUE(header->final);
     EXPECT_FALSE(header->reserved1);
@@ -143,7 +143,7 @@
 
   for (int i = 0; i < kNumInputs; ++i) {
     WebSocketFrameChunk* frame = frames[i].get();
-    EXPECT_TRUE(frame != NULL);
+    EXPECT_TRUE(frame != nullptr);
     if (!frame)
       continue;
     EXPECT_TRUE(frame->final_chunk);
@@ -155,7 +155,7 @@
         frame->data->data()));
 
     const WebSocketFrameHeader* header = frame->header.get();
-    EXPECT_TRUE(header != NULL);
+    EXPECT_TRUE(header != nullptr);
     if (!header)
       continue;
     EXPECT_TRUE(header->final);
@@ -189,7 +189,7 @@
     if (frames1.size() != 1u)
       continue;
     WebSocketFrameChunk* frame1 = frames1[0].get();
-    EXPECT_TRUE(frame1 != NULL);
+    EXPECT_TRUE(frame1 != nullptr);
     if (!frame1)
       continue;
     EXPECT_FALSE(frame1->final_chunk);
@@ -201,7 +201,7 @@
           std::equal(expected1.begin(), expected1.end(), frame1->data->data()));
     }
     const WebSocketFrameHeader* header1 = frame1->header.get();
-    EXPECT_TRUE(header1 != NULL);
+    EXPECT_TRUE(header1 != nullptr);
     if (!header1)
       continue;
     EXPECT_TRUE(header1->final);
@@ -219,7 +219,7 @@
     if (frames2.size() != 1u)
       continue;
     WebSocketFrameChunk* frame2 = frames2[0].get();
-    EXPECT_TRUE(frame2 != NULL);
+    EXPECT_TRUE(frame2 != nullptr);
     if (!frame2)
       continue;
     EXPECT_TRUE(frame2->final_chunk);
@@ -231,7 +231,7 @@
           std::equal(expected2.begin(), expected2.end(), frame2->data->data()));
     }
     const WebSocketFrameHeader* header2 = frame2->header.get();
-    EXPECT_TRUE(header2 == NULL);
+    EXPECT_TRUE(header2 == nullptr);
   }
 }
 
@@ -256,7 +256,7 @@
     if (frames1.size() != 1u)
       continue;
     WebSocketFrameChunk* frame1 = frames1[0].get();
-    EXPECT_TRUE(frame1 != NULL);
+    EXPECT_TRUE(frame1 != nullptr);
     if (!frame1)
       continue;
     EXPECT_FALSE(frame1->final_chunk);
@@ -268,7 +268,7 @@
           std::equal(expected1.begin(), expected1.end(), frame1->data->data()));
     }
     const WebSocketFrameHeader* header1 = frame1->header.get();
-    EXPECT_TRUE(header1 != NULL);
+    EXPECT_TRUE(header1 != nullptr);
     if (!header1)
       continue;
     EXPECT_TRUE(header1->final);
@@ -286,7 +286,7 @@
     if (frames2.size() != 1u)
       continue;
     WebSocketFrameChunk* frame2 = frames2[0].get();
-    EXPECT_TRUE(frame2 != NULL);
+    EXPECT_TRUE(frame2 != nullptr);
     if (!frame2)
       continue;
     EXPECT_TRUE(frame2->final_chunk);
@@ -298,7 +298,7 @@
           std::equal(expected2.begin(), expected2.end(), frame2->data->data()));
     }
     const WebSocketFrameHeader* header2 = frame2->header.get();
-    EXPECT_TRUE(header2 == NULL);
+    EXPECT_TRUE(header2 == nullptr);
   }
 }
 
@@ -328,7 +328,7 @@
     if (frames.size() != 1u)
       continue;
     WebSocketFrameChunk* frame = frames[0].get();
-    EXPECT_TRUE(frame != NULL);
+    EXPECT_TRUE(frame != nullptr);
     if (!frame)
       continue;
     if (frame_length == input_payload_size) {
@@ -347,7 +347,7 @@
                              frame->data->data()));
     }
     const WebSocketFrameHeader* header = frame->header.get();
-    EXPECT_TRUE(header != NULL);
+    EXPECT_TRUE(header != nullptr);
     if (!header)
       continue;
     EXPECT_TRUE(header->final);
@@ -392,7 +392,7 @@
     if (frames.size() != 1u)
       continue;
     WebSocketFrameChunk* frame = frames[0].get();
-    EXPECT_TRUE(frame != NULL);
+    EXPECT_TRUE(frame != nullptr);
     if (!frame)
       continue;
     if (frame_length == 0u) {
@@ -402,7 +402,7 @@
     }
     EXPECT_EQ(NULL, frame->data.get());
     const WebSocketFrameHeader* header = frame->header.get();
-    EXPECT_TRUE(header != NULL);
+    EXPECT_TRUE(header != nullptr);
     if (!header)
       continue;
     EXPECT_TRUE(header->final);
@@ -494,13 +494,13 @@
     if (frames.size() != 1u)
       continue;
     WebSocketFrameChunk* frame = frames[0].get();
-    EXPECT_TRUE(frame != NULL);
+    EXPECT_TRUE(frame != nullptr);
     if (!frame)
       continue;
     EXPECT_TRUE(frame->final_chunk);
     EXPECT_EQ(NULL, frame->data.get());
     const WebSocketFrameHeader* header = frame->header.get();
-    EXPECT_TRUE(header != NULL);
+    EXPECT_TRUE(header != nullptr);
     if (!header)
       continue;
     EXPECT_TRUE(header->final);
@@ -550,13 +550,13 @@
     if (frames.size() != 1u)
       continue;
     WebSocketFrameChunk* frame = frames[0].get();
-    EXPECT_TRUE(frame != NULL);
+    EXPECT_TRUE(frame != nullptr);
     if (!frame)
       continue;
     EXPECT_TRUE(frame->final_chunk);
     EXPECT_EQ(NULL, frame->data.get());
     const WebSocketFrameHeader* header = frame->header.get();
-    EXPECT_TRUE(header != NULL);
+    EXPECT_TRUE(header != nullptr);
     if (!header)
       continue;
     EXPECT_EQ(final, header->final);
diff --git a/net/websockets/websocket_frame_test.cc b/net/websockets/websocket_frame_test.cc
index 24fa405..9184155 100644
--- a/net/websockets/websocket_frame_test.cc
+++ b/net/websockets/websocket_frame_test.cc
@@ -44,8 +44,8 @@
         kTests[i].frame_header + kTests[i].frame_header_length);
     std::vector<char> output(expected_output.size());
     EXPECT_EQ(static_cast<int>(expected_output.size()),
-              WriteWebSocketFrameHeader(
-                  header, NULL, &output.front(), output.size()));
+              WriteWebSocketFrameHeader(header, nullptr, &output.front(),
+                                        output.size()));
     EXPECT_EQ(expected_output, output);
   }
 }
@@ -132,8 +132,8 @@
         kTests[i].frame_header + kTests[i].frame_header_length);
     std::vector<char> output(expected_output.size());
     EXPECT_EQ(static_cast<int>(expected_output.size()),
-              WriteWebSocketFrameHeader(
-                  header, NULL, &output.front(), output.size()));
+              WriteWebSocketFrameHeader(header, nullptr, &output.front(),
+                                        output.size()));
     EXPECT_EQ(expected_output, output);
   }
 }
@@ -171,8 +171,8 @@
         kTests[i].frame_header + kTests[i].frame_header_length);
     std::vector<char> output(expected_output.size());
     EXPECT_EQ(static_cast<int>(expected_output.size()),
-              WriteWebSocketFrameHeader(
-                  header, NULL, &output.front(), output.size()));
+              WriteWebSocketFrameHeader(header, nullptr, &output.front(),
+                                        output.size()));
     EXPECT_EQ(expected_output, output);
   }
 }
@@ -208,10 +208,9 @@
 
     char dummy_buffer[14];
     // Set an insufficient size to |buffer_size|.
-    EXPECT_EQ(
-        ERR_INVALID_ARGUMENT,
-        WriteWebSocketFrameHeader(
-            header, NULL, dummy_buffer, kTests[i].expected_header_size - 1));
+    EXPECT_EQ(ERR_INVALID_ARGUMENT,
+              WriteWebSocketFrameHeader(header, nullptr, dummy_buffer,
+                                        kTests[i].expected_header_size - 1));
   }
 }
 
@@ -247,10 +246,9 @@
                                  kTests[i].input + kTests[i].data_length);
     std::vector<char> expected_output(kTests[i].output,
                                       kTests[i].output + kTests[i].data_length);
-    MaskWebSocketFramePayload(masking_key,
-                              kTests[i].frame_offset,
-                              frame_data.empty() ? NULL : &frame_data.front(),
-                              frame_data.size());
+    MaskWebSocketFramePayload(
+        masking_key, kTests[i].frame_offset,
+        frame_data.empty() ? nullptr : &frame_data.front(), frame_data.size());
     EXPECT_EQ(expected_output, frame_data);
   }
 }
diff --git a/net/websockets/websocket_inflater.cc b/net/websockets/websocket_inflater.cc
index 7f04781..6b61f497 100644
--- a/net/websockets/websocket_inflater.cc
+++ b/net/websockets/websocket_inflater.cc
@@ -96,7 +96,7 @@
     num_bytes_copied += num_bytes_to_copy;
     int result = InflateChokedInput();
     if (result != Z_OK && result != Z_BUF_ERROR)
-      return NULL;
+      return nullptr;
   }
   buffer->Shrink(num_bytes_copied);
   return buffer;
@@ -144,7 +144,7 @@
 
 int WebSocketInflater::InflateChokedInput() {
   if (input_queue_.IsEmpty())
-    return InflateWithFlush(NULL, 0);
+    return InflateWithFlush(nullptr, 0);
 
   int result = Z_BUF_ERROR;
   while (!input_queue_.IsEmpty()) {
