diff --git a/DEPS b/DEPS
index 39e5ab1..2b667b55 100644
--- a/DEPS
+++ b/DEPS
@@ -78,7 +78,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
-  'v8_revision': 'f4f2b219905f3cf2df2a376a6986fd3e3d8341ae',
+  'v8_revision': 'b0cb35c7c2a189e1594deb6cd83b6fb25bd0e2aa',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling swarming_client
   # and whatever else without interference from each other.
diff --git a/android_webview/tools/system_webview_shell/test/data/webexposed/not-webview-exposed.txt b/android_webview/tools/system_webview_shell/test/data/webexposed/not-webview-exposed.txt
index 98fd97cf..3adcef5 100644
--- a/android_webview/tools/system_webview_shell/test/data/webexposed/not-webview-exposed.txt
+++ b/android_webview/tools/system_webview_shell/test/data/webexposed/not-webview-exposed.txt
@@ -39,7 +39,7 @@
 # remoteplayback api not supported in webview crbug.com/521319
 interface RemotePlayback : EventTarget
 
-# web payments api not enabled in webiew, crbug.com/667069
+# web payments api not enabled in webview, crbug.com/667069
 interface HTMLIFrameElement : HTMLElement
     getter allowPaymentRequest
     setter allowPaymentRequest
@@ -53,13 +53,15 @@
     getter disableRemotePlayback       # crbug.com/521319
     getter remote                      # crbug.com/521319
 
-# permissions API (crbug.com/490120), presentation API (crbug.com/521319) and
-# custom scheme handlers (crbug.com/589502) not supported in webview 
+# permissions API (crbug.com/490120), presentation API (crbug.com/521319),
+# share API (crbug.com/765923) and custom scheme handlers (crbug.com/589502)
+# not supported in webview
 interface Navigator
     getter permissions                 # crbug.com/490120
     getter presentation                # crbug.com/521319
     method registerProtocolHandler     # crbug.com/589502
     method unregisterProtocolHandler   # crbug.com/589502
+    method share                       # crbug.com/765923
 
 # notifications not yet supported in webview, crbug.com/551446
 interface ServiceWorkerRegistration : EventTarget
diff --git a/base/win/com_init_check_hook.h b/base/win/com_init_check_hook.h
index c064eea1..c9982335 100644
--- a/base/win/com_init_check_hook.h
+++ b/base/win/com_init_check_hook.h
@@ -19,7 +19,8 @@
 
 #if DCHECK_IS_ON() && defined(ARCH_CPU_X86_FAMILY) &&             \
     defined(ARCH_CPU_32_BITS) && !defined(GOOGLE_CHROME_BUILD) && \
-    !defined(OFFICIAL_BUILD)
+    !defined(OFFICIAL_BUILD) &&                                   \
+    !defined(COM_INIT_CHECK_HOOK_DISABLED)  // See crbug/737090 for details.
 #define COM_INIT_CHECK_HOOK_ENABLED
 #endif
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeBackupWatcher.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeBackupWatcher.java
index 4cb204c..2e8fac5 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeBackupWatcher.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeBackupWatcher.java
@@ -18,7 +18,7 @@
  * Class for watching for changes to the Android preferences that are backed up using Android
  * key/value backup.
  */
-@JNINamespace("chrome::android")
+@JNINamespace("android")
 public class ChromeBackupWatcher {
     private BackupManager mBackupManager;
 
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index c1c503a3..0628342 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -2213,11 +2213,6 @@
      flag_descriptions::kV8CacheStrategiesForCacheStorageName,
      flag_descriptions::kV8CacheStrategiesForCacheStorageDescription, kOsAll,
      MULTI_VALUE_TYPE(kV8CacheStrategiesForCacheStorageChoices)},
-    {"enable-clear-browsing-data-counters",
-     flag_descriptions::kEnableClearBrowsingDataCountersName,
-     flag_descriptions::kEnableClearBrowsingDataCountersDescription, kOsAll,
-     ENABLE_DISABLE_VALUE_TYPE(switches::kEnableClearBrowsingDataCounters,
-                               switches::kDisableClearBrowsingDataCounters)},
     {"simplified-fullscreen-ui", flag_descriptions::kSimplifiedFullscreenUiName,
      flag_descriptions::kSimplifiedFullscreenUiDescription,
      kOsWin | kOsLinux | kOsCrOS,
diff --git a/chrome/browser/android/chrome_backup_agent.cc b/chrome/browser/android/chrome_backup_agent.cc
index cb4f8927..4e475329 100644
--- a/chrome/browser/android/chrome_backup_agent.cc
+++ b/chrome/browser/android/chrome_backup_agent.cc
@@ -46,8 +46,8 @@
 static base::android::ScopedJavaLocalRef<jobjectArray> GetBoolBackupNames(
     JNIEnv* env,
     const base::android::JavaParamRef<jobject>& jcaller) {
-  return base::android::ToJavaArrayOfStrings(
-      env, chrome::android::GetBackupPrefNames());
+  return base::android::ToJavaArrayOfStrings(env,
+                                             android::GetBackupPrefNames());
 }
 
 static base::android::ScopedJavaLocalRef<jbooleanArray> GetBoolBackupValues(
@@ -86,7 +86,6 @@
   prefs->CommitPendingWrite();
 }
 
-namespace chrome {
 namespace android {
 
 std::vector<std::string> GetBackupPrefNames() {
@@ -115,4 +114,3 @@
 }
 
 }  //  namespace android
-}  //  namespace chrome
diff --git a/chrome/browser/android/chrome_backup_agent.h b/chrome/browser/android/chrome_backup_agent.h
index 3a03cd0..829bbc3 100644
--- a/chrome/browser/android/chrome_backup_agent.h
+++ b/chrome/browser/android/chrome_backup_agent.h
@@ -10,7 +10,6 @@
 
 #include "base/android/jni_android.h"
 
-namespace chrome {
 namespace android {
 
 std::vector<std::string> GetBackupPrefNames();
@@ -29,6 +28,5 @@
     const base::android::JavaParamRef<jbooleanArray>& values);
 
 }  //  namespace android
-}  //  namespace chrome
 
 #endif  // CHROME_BROWSER_ANDROID_CHROME_BACKUP_AGENT_H_
diff --git a/chrome/browser/android/chrome_backup_agent_unittest.cc b/chrome/browser/android/chrome_backup_agent_unittest.cc
index bdd901c..8c46de5 100644
--- a/chrome/browser/android/chrome_backup_agent_unittest.cc
+++ b/chrome/browser/android/chrome_backup_agent_unittest.cc
@@ -21,7 +21,6 @@
 #include "content/public/test/test_browser_thread_bundle.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-namespace chrome {
 namespace android {
 
 using base::android::AppendJavaStringArrayToStringVector;
@@ -139,4 +138,3 @@
 }
 
 }  //  namespace android
-}  //  namespace chrome
diff --git a/chrome/browser/android/chrome_backup_watcher.cc b/chrome/browser/android/chrome_backup_watcher.cc
index da084fe..02b340f 100644
--- a/chrome/browser/android/chrome_backup_watcher.cc
+++ b/chrome/browser/android/chrome_backup_watcher.cc
@@ -7,7 +7,6 @@
 #include "chrome/browser/profiles/profile.h"
 #include "jni/ChromeBackupWatcher_jni.h"
 
-namespace chrome {
 namespace android {
 
 namespace {
@@ -35,4 +34,3 @@
 ChromeBackupWatcher::~ChromeBackupWatcher() {}
 
 }  //  namespace android
-}  //  namespace chrome
diff --git a/chrome/browser/android/chrome_backup_watcher.h b/chrome/browser/android/chrome_backup_watcher.h
index d8eab67..7fe305e 100644
--- a/chrome/browser/android/chrome_backup_watcher.h
+++ b/chrome/browser/android/chrome_backup_watcher.h
@@ -15,7 +15,6 @@
 
 class Profile;
 
-namespace chrome {
 namespace android {
 
 // Watch the preferences that we back up using Android Backup, so that we can
@@ -32,5 +31,4 @@
 };
 
 }  //  namespace android
-}  //  namespace chrome
 #endif  // CHROME_BROWSER_ANDROID_CHROME_BACKUP_WATCHER_H_
diff --git a/chrome/browser/browsing_data/browsing_data_counter_factory.cc b/chrome/browser/browsing_data/browsing_data_counter_factory.cc
index 532abf1..82c279ad 100644
--- a/chrome/browser/browsing_data/browsing_data_counter_factory.cc
+++ b/chrome/browser/browsing_data/browsing_data_counter_factory.cc
@@ -51,9 +51,6 @@
 std::unique_ptr<browsing_data::BrowsingDataCounter>
 BrowsingDataCounterFactory::GetForProfileAndPref(Profile* profile,
                                                  const std::string& pref_name) {
-  if (!AreCountersEnabled())
-    return nullptr;
-
   if (pref_name == browsing_data::prefs::kDeleteBrowsingHistory) {
     return base::MakeUnique<browsing_data::HistoryCounter>(
         HistoryServiceFactory::GetForProfile(
diff --git a/chrome/browser/browsing_data/browsing_data_counter_utils.cc b/chrome/browser/browsing_data/browsing_data_counter_utils.cc
index 589988a..5fe9d3f 100644
--- a/chrome/browser/browsing_data/browsing_data_counter_utils.cc
+++ b/chrome/browser/browsing_data/browsing_data_counter_utils.cc
@@ -28,21 +28,6 @@
 #endif
 
 
-bool AreCountersEnabled() {
-  if (base::CommandLine::ForCurrentProcess()->HasSwitch(
-          switches::kEnableClearBrowsingDataCounters)) {
-    return true;
-  }
-
-  if (base::CommandLine::ForCurrentProcess()->HasSwitch(
-          switches::kDisableClearBrowsingDataCounters)) {
-    return false;
-  }
-
-  // Enabled by default.
-  return true;
-}
-
 bool IsSiteDataCounterEnabled() {
   // Only use the site data counter for the new CBD ui.
   return base::FeatureList::IsEnabled(features::kTabsInCbd);
diff --git a/chrome/browser/browsing_data/browsing_data_counter_utils.h b/chrome/browser/browsing_data/browsing_data_counter_utils.h
index a6a417b..480d0c2 100644
--- a/chrome/browser/browsing_data/browsing_data_counter_utils.h
+++ b/chrome/browser/browsing_data/browsing_data_counter_utils.h
@@ -9,9 +9,6 @@
 #include "components/browsing_data/core/browsing_data_utils.h"
 #include "components/browsing_data/core/counters/browsing_data_counter.h"
 
-// Whether the browsing data counters experiment is enabled.
-bool AreCountersEnabled();
-
 // Whether the site data counter is enabled.
 bool IsSiteDataCounterEnabled();
 
diff --git a/chrome/browser/chrome_browser_main_android.cc b/chrome/browser/chrome_browser_main_android.cc
index 15f5810..0530c9e4 100644
--- a/chrome/browser/chrome_browser_main_android.cc
+++ b/chrome/browser/chrome_browser_main_android.cc
@@ -94,7 +94,7 @@
 
   // Start watching the preferences that need to be backed up backup using
   // Android backup, so that we create a new backup if they change.
-  backup_watcher_.reset(new chrome::android::ChromeBackupWatcher(profile()));
+  backup_watcher_.reset(new android::ChromeBackupWatcher(profile()));
 }
 
 void ChromeBrowserMainPartsAndroid::PreEarlyInitialization() {
diff --git a/chrome/browser/chrome_browser_main_android.h b/chrome/browser/chrome_browser_main_android.h
index b1325399..ad8ea32 100644
--- a/chrome/browser/chrome_browser_main_android.h
+++ b/chrome/browser/chrome_browser_main_android.h
@@ -26,7 +26,7 @@
 
  private:
   std::unique_ptr<base::MessageLoop> main_message_loop_;
-  std::unique_ptr<chrome::android::ChromeBackupWatcher> backup_watcher_;
+  std::unique_ptr<android::ChromeBackupWatcher> backup_watcher_;
 
   DISALLOW_COPY_AND_ASSIGN(ChromeBrowserMainPartsAndroid);
 };
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index aee74d5..bbe3e91 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -326,11 +326,6 @@
 const char kEnableBrotliDescription[] =
     "Enable Brotli Content-Encoding support.";
 
-const char kEnableClearBrowsingDataCountersName[] =
-    "Enable Clear browsing data counters.";
-const char kEnableClearBrowsingDataCountersDescription[] =
-    "Shows data volume counters in the Clear browsing data dialog.";
-
 const char kEnableClientLoFiName[] = "Client-side Lo-Fi previews";
 
 const char kEnableClientLoFiDescription[] =
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index 62181f78..078876b 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -222,9 +222,6 @@
 extern const char kEnableBrotliName[];
 extern const char kEnableBrotliDescription[];
 
-extern const char kEnableClearBrowsingDataCountersName[];
-extern const char kEnableClearBrowsingDataCountersDescription[];
-
 extern const char kEnableClientLoFiName[];
 extern const char kEnableClientLoFiDescription[];
 
diff --git a/chrome/browser/net/network_context_configuration_browsertest.cc b/chrome/browser/net/network_context_configuration_browsertest.cc
index cd937e4..ebe0c8f 100644
--- a/chrome/browser/net/network_context_configuration_browsertest.cc
+++ b/chrome/browser/net/network_context_configuration_browsertest.cc
@@ -311,7 +311,7 @@
   EXPECT_TRUE(mojo::common::BlockingCopyToString(client.response_body_release(),
                                                  &response_body));
   client.RunUntilComplete();
-  EXPECT_EQ(net::OK, client.status().error_code);
+  EXPECT_EQ(net::OK, client.completion_status().error_code);
 
   // The response body from the above test should only appear in the view-cache
   // result if there is an on-disk cache.
diff --git a/chrome/common/chrome_switches.cc b/chrome/common/chrome_switches.cc
index e4104b8..4dca90b 100644
--- a/chrome/common/chrome_switches.cc
+++ b/chrome/common/chrome_switches.cc
@@ -190,10 +190,6 @@
 const char kDisableCastStreamingHWEncoding[] =
     "disable-cast-streaming-hw-encoding";
 
-// Disables data volume counters in the Clear Browsing Data dialog.
-const char kDisableClearBrowsingDataCounters[] =
-    "disable-clear-browsing-data-counters";
-
 // Disables the client-side phishing detection feature. Note that even if
 // client-side phishing detection is enabled, it will only be active if the
 // user has opted in to UMA stats and SafeBrowsing is enabled in the
@@ -296,10 +292,6 @@
 // Enables the multi-level undo system for bookmarks.
 const char kEnableBookmarkUndo[]            = "enable-bookmark-undo";
 
-// Enables data volume counters in the Clear Browsing Data dialog.
-const char kEnableClearBrowsingDataCounters[] =
-    "enable-clear-browsing-data-counters";
-
 // This applies only when the process type is "service". Enables the Cloud Print
 // Proxy component within the service process.
 const char kEnableCloudPrintProxy[]         = "enable-cloud-print-proxy";
diff --git a/chrome/common/chrome_switches.h b/chrome/common/chrome_switches.h
index 7ce8c30..e5bab429 100644
--- a/chrome/common/chrome_switches.h
+++ b/chrome/common/chrome_switches.h
@@ -73,7 +73,6 @@
 extern const char kDisableBackgroundNetworking[];
 extern const char kDisableBundledPpapiFlash[];
 extern const char kDisableCastStreamingHWEncoding[];
-extern const char kDisableClearBrowsingDataCounters[];
 extern const char kDisableClientSidePhishingDetection[];
 extern const char kDisableComponentExtensionsWithBackgroundPages[];
 extern const char kDisableComponentUpdate[];
@@ -100,7 +99,6 @@
 extern const char kEasyUnlockAppPath[];
 extern const char kEnableAudioDebugRecordingsFromExtension[];
 extern const char kEnableBookmarkUndo[];
-extern const char kEnableClearBrowsingDataCounters[];
 extern const char kEnableCloudPrintProxy[];
 extern const char kEnableDeviceDiscoveryNotifications[];
 extern const char kEnableDevToolsExperiments[];
diff --git a/chrome/renderer/extensions/extension_localization_peer.cc b/chrome/renderer/extensions/extension_localization_peer.cc
index 8da32e9..d7cab95 100644
--- a/chrome/renderer/extensions/extension_localization_peer.cc
+++ b/chrome/renderer/extensions/extension_localization_peer.cc
@@ -17,7 +17,7 @@
 #include "ipc/ipc_sender.h"
 #include "net/base/net_errors.h"
 #include "net/http/http_response_headers.h"
-#include "services/network/public/cpp/url_loader_status.h"
+#include "services/network/public/cpp/url_loader_completion_status.h"
 
 namespace {
 
@@ -91,12 +91,12 @@
 }
 
 void ExtensionLocalizationPeer::OnCompletedRequest(
-    const network::URLLoaderStatus& status) {
+    const network::URLLoaderCompletionStatus& status) {
   // Give sub-classes a chance at altering the data.
   if (status.error_code != net::OK) {
     // We failed to load the resource.
     original_peer_->OnReceivedResponse(response_info_);
-    network::URLLoaderStatus aborted_status(status);
+    network::URLLoaderCompletionStatus aborted_status(status);
     aborted_status.error_code = net::ERR_ABORTED;
     original_peer_->OnCompletedRequest(aborted_status);
     return;
diff --git a/chrome/renderer/extensions/extension_localization_peer.h b/chrome/renderer/extensions/extension_localization_peer.h
index c39cf77..82226e6 100644
--- a/chrome/renderer/extensions/extension_localization_peer.h
+++ b/chrome/renderer/extensions/extension_localization_peer.h
@@ -43,7 +43,8 @@
   void OnDownloadedData(int len, int encoded_data_length) override {}
   void OnReceivedData(std::unique_ptr<ReceivedData> data) override;
   void OnTransferSizeUpdated(int transfer_size_diff) override;
-  void OnCompletedRequest(const network::URLLoaderStatus& status) override;
+  void OnCompletedRequest(
+      const network::URLLoaderCompletionStatus& status) override;
 
  private:
   friend class ExtensionLocalizationPeerTest;
diff --git a/chrome/renderer/extensions/extension_localization_peer_unittest.cc b/chrome/renderer/extensions/extension_localization_peer_unittest.cc
index 817dcb0d..62cd578 100644
--- a/chrome/renderer/extensions/extension_localization_peer_unittest.cc
+++ b/chrome/renderer/extensions/extension_localization_peer_unittest.cc
@@ -19,7 +19,7 @@
 #include "net/base/net_errors.h"
 #include "net/url_request/redirect_info.h"
 #include "net/url_request/url_request_status.h"
-#include "services/network/public/cpp/url_loader_status.h"
+#include "services/network/public/cpp/url_loader_completion_status.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -78,7 +78,7 @@
   MOCK_METHOD2(OnReceivedDataInternal, void(const char* data, int data_length));
   MOCK_METHOD1(OnTransferSizeUpdated, void(int transfer_size_diff));
   MOCK_METHOD1(OnCompletedRequest,
-               void(const network::URLLoaderStatus& status));
+               void(const network::URLLoaderCompletionStatus& status));
 
  private:
   DISALLOW_COPY_AND_ASSIGN(MockRequestPeer);
@@ -147,7 +147,7 @@
   SetUpExtensionLocalizationPeer("text/css", GURL(kExtensionUrl_1));
 
   EXPECT_CALL(*original_peer_, OnReceivedResponse(_));
-  network::URLLoaderStatus status(net::ERR_ABORTED);
+  network::URLLoaderCompletionStatus status(net::ERR_ABORTED);
   EXPECT_CALL(*original_peer_, OnCompletedRequest(status));
 
   filter_peer_->OnCompletedRequest(status);
@@ -160,7 +160,7 @@
   EXPECT_CALL(*sender_, Send(_)).Times(0);
 
   EXPECT_CALL(*original_peer_, OnReceivedResponse(_));
-  network::URLLoaderStatus status(net::OK);
+  network::URLLoaderCompletionStatus status(net::OK);
   EXPECT_CALL(*original_peer_, OnCompletedRequest(status));
 
   filter_peer_->OnCompletedRequest(status);
@@ -178,7 +178,7 @@
   EXPECT_CALL(*original_peer_,
               OnReceivedDataInternal(StrEq(data.c_str()), data.length()))
       .Times(1);
-  network::URLLoaderStatus status(net::OK);
+  network::URLLoaderCompletionStatus status(net::OK);
   EXPECT_CALL(*original_peer_, OnCompletedRequest(status)).Times(1);
 
   filter_peer_->OnCompletedRequest(status);
@@ -215,7 +215,7 @@
   EXPECT_CALL(*original_peer_,
               OnReceivedDataInternal(StrEq(data.c_str()), data.length()));
 
-  network::URLLoaderStatus status(net::OK);
+  network::URLLoaderCompletionStatus status(net::OK);
   EXPECT_CALL(*original_peer_, OnCompletedRequest(status));
 
   filter_peer_->OnCompletedRequest(status);
@@ -241,7 +241,7 @@
   EXPECT_CALL(*original_peer_,
               OnReceivedDataInternal(StrEq(message.c_str()), message.length()));
 
-  network::URLLoaderStatus status(net::OK);
+  network::URLLoaderCompletionStatus status(net::OK);
   EXPECT_CALL(*original_peer_, OnCompletedRequest(status));
 
   filter_peer_->OnCompletedRequest(status);
diff --git a/chrome/renderer/security_filter_peer.cc b/chrome/renderer/security_filter_peer.cc
index 5081b91f..8202932 100644
--- a/chrome/renderer/security_filter_peer.cc
+++ b/chrome/renderer/security_filter_peer.cc
@@ -14,7 +14,7 @@
 #include "content/public/renderer/fixed_received_data.h"
 #include "net/base/net_errors.h"
 #include "net/http/http_response_headers.h"
-#include "services/network/public/cpp/url_loader_status.h"
+#include "services/network/public/cpp/url_loader_completion_status.h"
 #include "ui/base/l10n/l10n_util.h"
 
 SecurityFilterPeer::SecurityFilterPeer(
@@ -138,7 +138,7 @@
 }
 
 void ReplaceContentPeer::OnCompletedRequest(
-    const network::URLLoaderStatus& status) {
+    const network::URLLoaderCompletionStatus& status) {
   content::ResourceResponseInfo info;
   ProcessResponseInfo(info, &info, mime_type_);
   info.content_length = static_cast<int>(data_.size());
@@ -147,7 +147,7 @@
     original_peer_->OnReceivedData(base::MakeUnique<content::FixedReceivedData>(
         data_.data(), data_.size()));
   }
-  network::URLLoaderStatus ok_status(status);
+  network::URLLoaderCompletionStatus ok_status(status);
   ok_status.error_code = net::OK;
   original_peer_->OnCompletedRequest(ok_status);
 }
diff --git a/chrome/renderer/security_filter_peer.h b/chrome/renderer/security_filter_peer.h
index 776bd117..05f77aa 100644
--- a/chrome/renderer/security_filter_peer.h
+++ b/chrome/renderer/security_filter_peer.h
@@ -66,7 +66,8 @@
   // content::RequestPeer Implementation.
   void OnReceivedResponse(const content::ResourceResponseInfo& info) override;
   void OnReceivedData(std::unique_ptr<ReceivedData> data) override;
-  void OnCompletedRequest(const network::URLLoaderStatus& status) override;
+  void OnCompletedRequest(
+      const network::URLLoaderCompletionStatus& status) override;
 
  private:
   content::ResourceResponseInfo response_info_;
diff --git a/chrome/test/data/window.close.html b/chrome/test/data/window.close.html
index e534082b..b53cf4a 100644
--- a/chrome/test/data/window.close.html
+++ b/chrome/test/data/window.close.html
@@ -31,7 +31,7 @@
     function test4() {
       console.log("test4");
       openPopups();
-      setTimeout(closePopupsAndDone, 250);
+      setTimeout(closePopupsAndDone, 1);
     }
 
     function openPopups() {
diff --git a/chromeos/dbus/fake_shill_device_client.cc b/chromeos/dbus/fake_shill_device_client.cc
index 3751981..8511828f 100644
--- a/chromeos/dbus/fake_shill_device_client.cc
+++ b/chromeos/dbus/fake_shill_device_client.cc
@@ -389,7 +389,7 @@
   DBusThreadManager::Get()->GetShillManagerClient()->GetTestInterface()->
       AddDevice(device_path);
 
-  base::DictionaryValue* properties = GetDeviceProperties(device_path);
+  base::Value* properties = GetDeviceProperties(device_path);
   properties->SetKey(shill::kTypeProperty, base::Value(type));
   properties->SetKey(shill::kNameProperty, base::Value(name));
   properties->SetKey(shill::kDBusObjectProperty, base::Value(device_path));
@@ -521,21 +521,18 @@
 
 void FakeShillDeviceClient::SetSimLockStatus(const std::string& device_path,
                                              const SimLockStatus& status) {
-  base::DictionaryValue* device_properties = NULL;
-  if (!stub_devices_.GetDictionaryWithoutPathExpansion(device_path,
-                                                       &device_properties)) {
+  base::Value* device_properties =
+      stub_devices_.FindKeyOfType(device_path, base::Value::Type::DICTIONARY);
+
+  if (!device_properties) {
     NOTREACHED() << "Device not found: " << device_path;
     return;
   }
 
-  base::DictionaryValue* simlock_dict = nullptr;
-  if (!device_properties->GetDictionaryWithoutPathExpansion(
-          shill::kSIMLockStatusProperty, &simlock_dict)) {
-    simlock_dict = device_properties->SetDictionaryWithoutPathExpansion(
-        shill::kSIMLockStatusProperty,
-        std::make_unique<base::DictionaryValue>());
-  }
-  simlock_dict->Clear();
+  base::Value* simlock_dict =
+      device_properties->SetKey(shill::kSIMLockStatusProperty,
+                                base::Value(base::Value::Type::DICTIONARY));
+
   simlock_dict->SetKey(shill::kSIMLockTypeProperty, base::Value(status.type));
   simlock_dict->SetKey(shill::kSIMLockRetriesLeftProperty,
                        base::Value(status.retries_left));
@@ -642,15 +639,14 @@
     observer.OnPropertyChanged(property, *value);
 }
 
-base::DictionaryValue* FakeShillDeviceClient::GetDeviceProperties(
+base::Value* FakeShillDeviceClient::GetDeviceProperties(
     const std::string& device_path) {
-  base::DictionaryValue* properties = NULL;
-  if (!stub_devices_.GetDictionaryWithoutPathExpansion(
-      device_path, &properties)) {
-    properties = stub_devices_.SetDictionaryWithoutPathExpansion(
-        device_path, std::make_unique<base::DictionaryValue>());
-  }
-  return properties;
+  base::Value* properties =
+      stub_devices_.FindKeyOfType(device_path, base::Value::Type::DICTIONARY);
+  if (properties)
+    return properties;
+  return stub_devices_.SetKey(device_path,
+                              base::Value(base::Value::Type::DICTIONARY));
 }
 
 FakeShillDeviceClient::PropertyObserverList&
diff --git a/chromeos/dbus/fake_shill_device_client.h b/chromeos/dbus/fake_shill_device_client.h
index efc96b1..0355d7e 100644
--- a/chromeos/dbus/fake_shill_device_client.h
+++ b/chromeos/dbus/fake_shill_device_client.h
@@ -140,7 +140,7 @@
 
   void NotifyObserversPropertyChanged(const dbus::ObjectPath& device_path,
                                       const std::string& property);
-  base::DictionaryValue* GetDeviceProperties(const std::string& device_path);
+  base::Value* GetDeviceProperties(const std::string& device_path);
   PropertyObserverList& GetObserverList(const dbus::ObjectPath& device_path);
 
   // Dictionary of <device_name, Dictionary>.
diff --git a/chromeos/dbus/fake_shill_ipconfig_client.cc b/chromeos/dbus/fake_shill_ipconfig_client.cc
index d540214..7879ec1 100644
--- a/chromeos/dbus/fake_shill_ipconfig_client.cc
+++ b/chromeos/dbus/fake_shill_ipconfig_client.cc
@@ -61,12 +61,13 @@
                                           const std::string& name,
                                           const base::Value& value,
                                           VoidDBusMethodCallback callback) {
-  base::DictionaryValue* dict = NULL;
-  if (!ipconfigs_.GetDictionaryWithoutPathExpansion(ipconfig_path.value(),
-                                                    &dict)) {
-    dict = ipconfigs_.SetDictionaryWithoutPathExpansion(
-        ipconfig_path.value(), std::make_unique<base::DictionaryValue>());
+  base::Value* dict = ipconfigs_.FindKeyOfType(ipconfig_path.value(),
+                                               base::Value::Type::DICTIONARY);
+  if (!dict) {
+    dict = ipconfigs_.SetKey(ipconfig_path.value(),
+                             base::Value(base::Value::Type::DICTIONARY));
   }
+
   // Update existing ip config stub object's properties.
   dict->SetKey(name, value.Clone());
   base::ThreadTaskRunnerHandle::Get()->PostTask(
diff --git a/chromeos/dbus/fake_shill_service_client.cc b/chromeos/dbus/fake_shill_service_client.cc
index 3028f68e..b92d611 100644
--- a/chromeos/dbus/fake_shill_service_client.cc
+++ b/chromeos/dbus/fake_shill_service_client.cc
@@ -402,10 +402,8 @@
     std::string key = property;
     if (base::StartsWith(property, "Provider.", case_sensitive))
       key = property.substr(strlen("Provider."));
-    base::DictionaryValue* provider =
-        new_properties.SetDictionaryWithoutPathExpansion(
-            shill::kProviderProperty,
-            std::make_unique<base::DictionaryValue>());
+    base::Value* provider = new_properties.SetKey(
+        shill::kProviderProperty, base::Value(base::Value::Type::DICTIONARY));
     provider->SetKey(key, value.Clone());
     changed_property = shill::kProviderProperty;
   } else if (value.GetType() == base::Value::Type::DICTIONARY) {
diff --git a/chromeos/network/client_cert_util.cc b/chromeos/network/client_cert_util.cc
index 561035d3..8260a21 100644
--- a/chromeos/network/client_cert_util.cc
+++ b/chromeos/network/client_cert_util.cc
@@ -186,7 +186,7 @@
 void SetShillProperties(const ConfigType cert_config_type,
                         const int tpm_slot,
                         const std::string& pkcs11_id,
-                        base::DictionaryValue* properties) {
+                        base::Value* properties) {
   switch (cert_config_type) {
     case CONFIG_TYPE_NONE: {
       return;
@@ -224,7 +224,7 @@
 }
 
 void SetEmptyShillProperties(const ConfigType cert_config_type,
-                             base::DictionaryValue* properties) {
+                             base::Value* properties) {
   switch (cert_config_type) {
     case CONFIG_TYPE_NONE: {
       return;
diff --git a/chromeos/network/client_cert_util.h b/chromeos/network/client_cert_util.h
index 1911dfe..19b9c16 100644
--- a/chromeos/network/client_cert_util.h
+++ b/chromeos/network/client_cert_util.h
@@ -14,6 +14,7 @@
 #include "components/onc/onc_constants.h"
 
 namespace base {
+class Value;
 class DictionaryValue;
 }
 
@@ -91,12 +92,12 @@
 CHROMEOS_EXPORT void SetShillProperties(const ConfigType cert_config_type,
                                         const int tpm_slot,
                                         const std::string& pkcs11_id,
-                                        base::DictionaryValue* properties);
+                                        base::Value* properties);
 
 // Like SetShillProperties but instead sets the properties to empty strings.
 // This should be used to clear previously set client certificate properties.
 CHROMEOS_EXPORT void SetEmptyShillProperties(const ConfigType cert_config_type,
-                                             base::DictionaryValue* properties);
+                                             base::Value* properties);
 
 // Returns true if all required configuration properties are set and not empty.
 bool IsCertificateConfigured(const client_cert::ConfigType cert_config_type,
diff --git a/chromeos/network/device_state.cc b/chromeos/network/device_state.cc
index 60ccefd..9ada46827 100644
--- a/chromeos/network/device_state.cc
+++ b/chromeos/network/device_state.cc
@@ -123,20 +123,11 @@
   return false;
 }
 
-void DeviceState::IPConfigPropertiesChanged(
-    const std::string& ip_config_path,
-    const base::DictionaryValue& properties) {
-  base::DictionaryValue* ip_config = nullptr;
-  if (ip_configs_.GetDictionaryWithoutPathExpansion(
-          ip_config_path, &ip_config)) {
-    NET_LOG_EVENT("IPConfig Updated: " + ip_config_path, path());
-    ip_config->Clear();
-  } else {
-    NET_LOG_EVENT("IPConfig Added: " + ip_config_path, path());
-    ip_config = ip_configs_.SetDictionaryWithoutPathExpansion(
-        ip_config_path, std::make_unique<base::DictionaryValue>());
-  }
-  ip_config->MergeDictionary(&properties);
+void DeviceState::IPConfigPropertiesChanged(const std::string& ip_config_path,
+                                            const base::Value& properties) {
+  NET_LOG(EVENT) << "IPConfig for: " << path()
+                 << " Changed: " << ip_config_path;
+  ip_configs_.SetKey(ip_config_path, properties.Clone());
 }
 
 std::string DeviceState::GetName() const {
diff --git a/chromeos/network/device_state.h b/chromeos/network/device_state.h
index 973cb625..bdb695ba 100644
--- a/chromeos/network/device_state.h
+++ b/chromeos/network/device_state.h
@@ -28,7 +28,7 @@
                        const base::Value& value) override;
 
   void IPConfigPropertiesChanged(const std::string& ip_config_path,
-                                 const base::DictionaryValue& properties);
+                                 const base::Value& properties);
 
   // Accessors
   const std::string& mac_address() const { return mac_address_; }
diff --git a/chromeos/network/onc/onc_translator_onc_to_shill.cc b/chromeos/network/onc/onc_translator_onc_to_shill.cc
index 834c40c..7c3e2d7d 100644
--- a/chromeos/network/onc/onc_translator_onc_to_shill.cc
+++ b/chromeos/network/onc/onc_translator_onc_to_shill.cc
@@ -433,25 +433,22 @@
 // results are written to |shill_dictionary|.
 void TranslateONCHierarchy(const OncValueSignature& signature,
                            const base::DictionaryValue& onc_object,
-                           base::DictionaryValue* shill_dictionary) {
-  base::DictionaryValue* target_shill_dictionary = shill_dictionary;
-  std::vector<std::string> path_to_shill_dictionary =
+                           base::Value* shill_dictionary) {
+  const std::vector<std::string> path =
       GetPathToNestedShillDictionary(signature);
-  for (std::vector<std::string>::const_iterator it =
-           path_to_shill_dictionary.begin();
-       it != path_to_shill_dictionary.end(); ++it) {
-    base::DictionaryValue* nested_shill_dict = NULL;
-    if (!target_shill_dictionary->GetDictionaryWithoutPathExpansion(
-            *it, &nested_shill_dict)) {
-      nested_shill_dict =
-          target_shill_dictionary->SetDictionaryWithoutPathExpansion(
-              *it, std::make_unique<base::DictionaryValue>());
-    }
-    target_shill_dictionary = nested_shill_dict;
+  const std::vector<base::StringPiece> path_pieces(path.begin(), path.end());
+  base::Value* target_shill_dictionary = shill_dictionary->FindPathOfType(
+      path_pieces, base::Value::Type::DICTIONARY);
+  if (!target_shill_dictionary) {
+    target_shill_dictionary = shill_dictionary->SetPath(
+        path_pieces, base::Value(base::Value::Type::DICTIONARY));
   }
+
   // Translates fields of |onc_object| and writes them to
   // |target_shill_dictionary_| nested in |shill_dictionary|.
-  LocalTranslator translator(signature, onc_object, target_shill_dictionary);
+  LocalTranslator translator(
+      signature, onc_object,
+      static_cast<base::DictionaryValue*>(target_shill_dictionary));
   translator.TranslateFields();
 
   // Recurse into nested objects.
diff --git a/chromeos/network/onc/onc_translator_shill_to_onc.cc b/chromeos/network/onc/onc_translator_shill_to_onc.cc
index 4062454..2198fd2 100644
--- a/chromeos/network/onc/onc_translator_shill_to_onc.cc
+++ b/chromeos/network/onc/onc_translator_shill_to_onc.cc
@@ -731,13 +731,7 @@
     const std::string& onc_dictionary_name,
     const std::string& onc_field_name,
     const base::Value& value) {
-  base::DictionaryValue* nested = nullptr;
-  if (!onc_object_->GetDictionaryWithoutPathExpansion(onc_dictionary_name,
-                                                      &nested)) {
-    nested = onc_object_->SetDictionaryWithoutPathExpansion(
-        onc_dictionary_name, std::make_unique<base::DictionaryValue>());
-  }
-  nested->SetKey(onc_field_name, value.Clone());
+  onc_object_->SetPath({onc_dictionary_name, onc_field_name}, value.Clone());
 }
 
 void ShillToONCTranslator::TranslateAndAddListOfObjects(
diff --git a/chromeos/network/policy_util.cc b/chromeos/network/policy_util.cc
index 14940b9f..6ea9807 100644
--- a/chromeos/network/policy_util.cc
+++ b/chromeos/network/policy_util.cc
@@ -161,22 +161,15 @@
   return autoconnect;
 }
 
-base::DictionaryValue* GetOrCreateDictionary(const std::string& key,
-                                             base::DictionaryValue* dict) {
-  base::DictionaryValue* inner_dict = NULL;
-  if (!dict->GetDictionaryWithoutPathExpansion(key, &inner_dict)) {
-    inner_dict = dict->SetDictionaryWithoutPathExpansion(
-        key, std::make_unique<base::DictionaryValue>());
-  }
-  return inner_dict;
-}
-
-base::DictionaryValue* GetOrCreateNestedDictionary(
-    const std::string& key1,
-    const std::string& key2,
-    base::DictionaryValue* dict) {
-  base::DictionaryValue* inner_dict = GetOrCreateDictionary(key1, dict);
-  return GetOrCreateDictionary(key2, inner_dict);
+base::Value* GetOrCreateNestedDictionary(const std::string& key1,
+                                         const std::string& key2,
+                                         base::Value* dict) {
+  base::Value* inner_dict =
+      dict->FindPathOfType({key1, key2}, base::Value::Type::DICTIONARY);
+  if (inner_dict)
+    return inner_dict;
+  return dict->SetPath({key1, key2},
+                       base::Value(base::Value::Type::DICTIONARY));
 }
 
 void ApplyGlobalAutoconnectPolicy(
@@ -192,7 +185,7 @@
 
   // Managed dictionaries don't contain empty dictionaries (see onc_merger.cc),
   // so add the Autoconnect dictionary in case Shill didn't report a value.
-  base::DictionaryValue* auto_connect_dictionary = NULL;
+  base::Value* auto_connect_dictionary = nullptr;
   if (type == ::onc::network_type::kWiFi) {
     auto_connect_dictionary =
         GetOrCreateNestedDictionary(::onc::network_config::kWiFi,
diff --git a/content/browser/appcache/appcache_subresource_url_factory.cc b/content/browser/appcache/appcache_subresource_url_factory.cc
index 7f11fb74..fdda849 100644
--- a/content/browser/appcache/appcache_subresource_url_factory.cc
+++ b/content/browser/appcache/appcache_subresource_url_factory.cc
@@ -71,7 +71,8 @@
 
   void Start() {
     if (!host_) {
-      remote_client_->OnComplete(network::URLLoaderStatus(net::ERR_FAILED));
+      remote_client_->OnComplete(
+          network::URLLoaderCompletionStatus(net::ERR_FAILED));
       return;
     }
     handler_ = host_->CreateRequestHandler(
@@ -200,7 +201,8 @@
                          const ResourceResponseHead& response_head) override {
     DCHECK(network_loader_) << "appcache loader does not produce redirects";
     if (!redirect_limit_--) {
-      OnComplete(network::URLLoaderStatus(net::ERR_TOO_MANY_REDIRECTS));
+      OnComplete(
+          network::URLLoaderCompletionStatus(net::ERR_TOO_MANY_REDIRECTS));
       return;
     }
     if (!handler_) {
@@ -246,7 +248,7 @@
     remote_client_->OnStartLoadingResponseBody(std::move(body));
   }
 
-  void OnComplete(const network::URLLoaderStatus& status) override {
+  void OnComplete(const network::URLLoaderCompletionStatus& status) override {
     if (!network_loader_ || !handler_ || did_receive_network_response_ ||
         status.error_code == net::OK) {
       remote_client_->OnComplete(status);
@@ -258,7 +260,7 @@
                        weak_factory_.GetWeakPtr(), status));
   }
 
-  void ContinueOnComplete(const network::URLLoaderStatus& status,
+  void ContinueOnComplete(const network::URLLoaderCompletionStatus& status,
                           StartLoaderCallback start_function) {
     if (start_function)
       CreateAndStartAppCacheLoader(std::move(start_function));
diff --git a/content/browser/appcache/appcache_update_job_unittest.cc b/content/browser/appcache/appcache_update_job_unittest.cc
index 39669773..baa648a 100644
--- a/content/browser/appcache/appcache_update_job_unittest.cc
+++ b/content/browser/appcache/appcache_update_job_unittest.cc
@@ -608,7 +608,7 @@
                                 traffic_annotation) override {
     if (url_request.url.host() == "failme" ||
         url_request.url.host() == "testme") {
-      client->OnComplete(network::URLLoaderStatus(-100));
+      client->OnComplete(network::URLLoaderCompletionStatus(-100));
       return;
     }
 
diff --git a/content/browser/appcache/appcache_update_url_loader_request.cc b/content/browser/appcache/appcache_update_url_loader_request.cc
index 3e66fda..72a9a0b 100644
--- a/content/browser/appcache/appcache_update_url_loader_request.cc
+++ b/content/browser/appcache/appcache_update_url_loader_request.cc
@@ -161,7 +161,7 @@
 }
 
 void AppCacheUpdateJob::UpdateURLLoaderRequest::OnComplete(
-    const network::URLLoaderStatus& status) {
+    const network::URLLoaderCompletionStatus& status) {
   response_status_ = status;
   // We inform the URLFetcher about a failure only here. For the success case
   // OnResponseCompleted() is invoked by URLFetcher::OnReadCompleted().
diff --git a/content/browser/appcache/appcache_update_url_loader_request.h b/content/browser/appcache/appcache_update_url_loader_request.h
index 582814e..a8aabc4 100644
--- a/content/browser/appcache/appcache_update_url_loader_request.h
+++ b/content/browser/appcache/appcache_update_url_loader_request.h
@@ -67,7 +67,7 @@
   void OnTransferSizeUpdated(int32_t transfer_size_diff) override;
   void OnStartLoadingResponseBody(
       mojo::ScopedDataPipeConsumerHandle body) override;
-  void OnComplete(const network::URLLoaderStatus& status) override;
+  void OnComplete(const network::URLLoaderCompletionStatus& status) override;
 
  private:
   UpdateURLLoaderRequest(URLLoaderFactoryGetter* loader_factory_getter,
@@ -92,7 +92,7 @@
 
   ResourceRequest request_;
   ResourceResponseHead response_;
-  network::URLLoaderStatus response_status_;
+  network::URLLoaderCompletionStatus response_status_;
   // Response details.
   std::unique_ptr<net::HttpResponseInfo> http_response_info_;
   // Binds the URLLoaderClient interface to the channel.
diff --git a/content/browser/appcache/appcache_url_loader_job.cc b/content/browser/appcache/appcache_url_loader_job.cc
index bb47f1a..a7aeb018 100644
--- a/content/browser/appcache/appcache_url_loader_job.cc
+++ b/content/browser/appcache/appcache_url_loader_job.cc
@@ -319,7 +319,7 @@
   if (AppCacheRequestHandler::IsRunningInTests())
     return;
 
-  network::URLLoaderStatus status(error_code);
+  network::URLLoaderCompletionStatus status(error_code);
   if (!error_code) {
     const net::HttpResponseInfo* http_info =
         is_range_request() ? range_response_info_.get()
diff --git a/content/browser/blob_storage/blob_internals_url_loader.cc b/content/browser/blob_storage/blob_internals_url_loader.cc
index 218291c..b5e2c98 100644
--- a/content/browser/blob_storage/blob_internals_url_loader.cc
+++ b/content/browser/blob_storage/blob_internals_url_loader.cc
@@ -40,7 +40,7 @@
   CHECK_EQ(result, MOJO_RESULT_OK);
 
   client->OnStartLoadingResponseBody(std::move(data_pipe.consumer_handle));
-  network::URLLoaderStatus status(net::OK);
+  network::URLLoaderCompletionStatus status(net::OK);
   status.encoded_data_length = output.size();
   status.encoded_body_length = output.size();
   client->OnComplete(status);
diff --git a/content/browser/blob_storage/blob_url_loader_factory.cc b/content/browser/blob_storage/blob_url_loader_factory.cc
index 50eb7714..ec5c43f6 100644
--- a/content/browser/blob_storage/blob_url_loader_factory.cc
+++ b/content/browser/blob_storage/blob_url_loader_factory.cc
@@ -189,7 +189,7 @@
           status_code, nullptr, nullptr, 0, 0);
       client_->OnReceiveResponse(response, base::nullopt, nullptr);
     }
-    network::URLLoaderStatus status;
+    network::URLLoaderCompletionStatus status;
     // TODO(kinuko): We should probably set the error_code here,
     // while it makes existing tests fail. crbug.com/732750
     status.completion_time = base::TimeTicks::Now();
diff --git a/content/browser/blob_storage/blob_url_unittest.cc b/content/browser/blob_storage/blob_url_unittest.cc
index f5fbe22..8640a946d 100644
--- a/content/browser/blob_storage/blob_url_unittest.cc
+++ b/content/browser/blob_storage/blob_url_unittest.cc
@@ -300,7 +300,7 @@
       }
       response_headers_ = url_loader_client.response_head().headers;
       response_metadata_ = url_loader_client.cached_metadata();
-      response_error_code_ = url_loader_client.status().error_code;
+      response_error_code_ = url_loader_client.completion_status().error_code;
     } else {
       std::unique_ptr<net::URLRequest> request =
           url_request_context_.CreateRequest(url, net::DEFAULT_PRIORITY,
diff --git a/content/browser/devtools/protocol/network_handler.cc b/content/browser/devtools/protocol/network_handler.cc
index ffa8f89..9ab8b5c 100644
--- a/content/browser/devtools/protocol/network_handler.cc
+++ b/content/browser/devtools/protocol/network_handler.cc
@@ -49,7 +49,7 @@
 #include "net/http/http_util.h"
 #include "net/url_request/url_request_context.h"
 #include "net/url_request/url_request_context_getter.h"
-#include "services/network/public/cpp/url_loader_status.h"
+#include "services/network/public/cpp/url_loader_completion_status.h"
 
 namespace content {
 namespace protocol {
@@ -1053,7 +1053,7 @@
 
 void NetworkHandler::NavigationPreloadCompleted(
     const std::string& request_id,
-    const network::URLLoaderStatus& status) {
+    const network::URLLoaderCompletionStatus& status) {
   if (!enabled_)
     return;
   if (status.error_code != net::OK) {
diff --git a/content/browser/devtools/protocol/network_handler.h b/content/browser/devtools/protocol/network_handler.h
index a1e9ef2..76a06e5 100644
--- a/content/browser/devtools/protocol/network_handler.h
+++ b/content/browser/devtools/protocol/network_handler.h
@@ -23,7 +23,7 @@
 }  // namespace net
 
 namespace network {
-struct URLLoaderStatus;
+struct URLLoaderCompletionStatus;
 }  // namespace network
 
 namespace content {
@@ -125,7 +125,7 @@
                                          const ResourceResponseHead& head);
   void NavigationPreloadCompleted(
       const std::string& request_id,
-      const network::URLLoaderStatus& completion_status);
+      const network::URLLoaderCompletionStatus& completion_status);
   void NavigationFailed(NavigationRequest* navigation_request);
 
   bool enabled() const { return enabled_; }
diff --git a/content/browser/devtools/service_worker_devtools_agent_host.cc b/content/browser/devtools/service_worker_devtools_agent_host.cc
index 7431c51d4..63fb561 100644
--- a/content/browser/devtools/service_worker_devtools_agent_host.cc
+++ b/content/browser/devtools/service_worker_devtools_agent_host.cc
@@ -137,7 +137,7 @@
 
 void ServiceWorkerDevToolsAgentHost::NavigationPreloadCompleted(
     const std::string& request_id,
-    const network::URLLoaderStatus& status) {
+    const network::URLLoaderCompletionStatus& status) {
   for (auto* network : protocol::NetworkHandler::ForAgentHost(this))
     network->NavigationPreloadCompleted(request_id, status);
 }
diff --git a/content/browser/devtools/service_worker_devtools_agent_host.h b/content/browser/devtools/service_worker_devtools_agent_host.h
index 2ba72ab1..c0acba1 100644
--- a/content/browser/devtools/service_worker_devtools_agent_host.h
+++ b/content/browser/devtools/service_worker_devtools_agent_host.h
@@ -15,7 +15,7 @@
 #include "content/browser/devtools/worker_devtools_agent_host.h"
 
 namespace network {
-struct URLLoaderStatus;
+struct URLLoaderCompletionStatus;
 }
 
 namespace content {
@@ -56,8 +56,9 @@
   void NavigationPreloadResponseReceived(const std::string& request_id,
                                          const GURL& url,
                                          const ResourceResponseHead& head);
-  void NavigationPreloadCompleted(const std::string& request_id,
-                                  const network::URLLoaderStatus& status);
+  void NavigationPreloadCompleted(
+      const std::string& request_id,
+      const network::URLLoaderCompletionStatus& status);
 
   int64_t service_worker_version_id() const;
   GURL scope() const;
diff --git a/content/browser/download/download_manager_impl.cc b/content/browser/download/download_manager_impl.cc
index a9b092c..370b88f 100644
--- a/content/browser/download/download_manager_impl.cc
+++ b/content/browser/download/download_manager_impl.cc
@@ -200,7 +200,7 @@
     std::unique_ptr<ResourceRequest> resource_request,
     std::unique_ptr<ThrottlingURLLoader> url_loader,
     std::vector<GURL> url_chain,
-    base::Optional<network::URLLoaderStatus> status) {
+    base::Optional<network::URLLoaderCompletionStatus> status) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
   DownloadManagerImpl::UniqueUrlDownloadHandlerPtr resource_downloader(
       ResourceDownloader::InterceptNavigationResponse(
diff --git a/content/browser/download/download_response_handler.cc b/content/browser/download/download_response_handler.cc
index 495740a6..4fe28a5 100644
--- a/content/browser/download/download_response_handler.cc
+++ b/content/browser/download/download_response_handler.cc
@@ -144,7 +144,7 @@
     // middle box. Trigger another interruption so that the DownloadItem can
     // retry.
     abort_reason_ = DOWNLOAD_INTERRUPT_REASON_SERVER_UNREACHABLE;
-    OnComplete(network::URLLoaderStatus(net::OK));
+    OnComplete(network::URLLoaderCompletionStatus(net::OK));
     return;
   }
   url_chain_.push_back(redirect_info.new_url);
@@ -180,7 +180,7 @@
 }
 
 void DownloadResponseHandler::OnComplete(
-    const network::URLLoaderStatus& status) {
+    const network::URLLoaderCompletionStatus& status) {
   DownloadInterruptReason reason = HandleRequestCompletionStatus(
       static_cast<net::Error>(status.error_code), has_strong_validators_,
       cert_status_, abort_reason_);
diff --git a/content/browser/download/download_response_handler.h b/content/browser/download/download_response_handler.h
index 99fd2dcc..99ba960 100644
--- a/content/browser/download/download_response_handler.h
+++ b/content/browser/download/download_response_handler.h
@@ -56,7 +56,7 @@
   void OnTransferSizeUpdated(int32_t transfer_size_diff) override;
   void OnStartLoadingResponseBody(
       mojo::ScopedDataPipeConsumerHandle body) override;
-  void OnComplete(const network::URLLoaderStatus& status) override;
+  void OnComplete(const network::URLLoaderCompletionStatus& status) override;
 
   // Sets the URL chain when the download is intercepted from navigation.
   void SetURLChain(std::vector<GURL> url_chain);
diff --git a/content/browser/download/resource_downloader.cc b/content/browser/download/resource_downloader.cc
index e90619ef..40443672 100644
--- a/content/browser/download/resource_downloader.cc
+++ b/content/browser/download/resource_downloader.cc
@@ -86,7 +86,7 @@
     int frame_tree_node_id,
     std::unique_ptr<ThrottlingURLLoader> url_loader,
     std::vector<GURL> url_chain,
-    base::Optional<network::URLLoaderStatus> status) {
+    base::Optional<network::URLLoaderCompletionStatus> status) {
   auto downloader = std::make_unique<ResourceDownloader>(
       delegate, std::move(resource_request),
       std::make_unique<DownloadSaveInfo>(), content::DownloadItem::kInvalidId,
@@ -154,7 +154,7 @@
     const SSLStatus& ssl_status,
     int frame_tree_node_id,
     std::vector<GURL> url_chain,
-    base::Optional<network::URLLoaderStatus> status) {
+    base::Optional<network::URLLoaderCompletionStatus> status) {
   url_loader_ = std::move(url_loader);
   url_loader_->set_forwarding_client(&response_handler_);
   net::SSLInfo info;
diff --git a/content/browser/download/resource_downloader.h b/content/browser/download/resource_downloader.h
index 95080573..ba43904 100644
--- a/content/browser/download/resource_downloader.h
+++ b/content/browser/download/resource_downloader.h
@@ -41,7 +41,7 @@
       int frame_tree_node_id,
       std::unique_ptr<ThrottlingURLLoader> url_loader,
       std::vector<GURL> url_chain,
-      base::Optional<network::URLLoaderStatus> status);
+      base::Optional<network::URLLoaderCompletionStatus> status);
 
   ResourceDownloader(base::WeakPtr<UrlDownloadHandler::Delegate> delegate,
                      std::unique_ptr<ResourceRequest> resource_request,
@@ -66,13 +66,14 @@
              std::unique_ptr<DownloadUrlParameters> download_url_parameters);
 
   // Intercepts the navigation response and takes ownership of the |url_loader|.
-  void InterceptResponse(std::unique_ptr<ThrottlingURLLoader> url_loader,
-                         const scoped_refptr<ResourceResponse>& response,
-                         mojo::ScopedDataPipeConsumerHandle consumer_handle,
-                         const SSLStatus& ssl_status,
-                         int frame_tree_node_id,
-                         std::vector<GURL> url_chain,
-                         base::Optional<network::URLLoaderStatus> status);
+  void InterceptResponse(
+      std::unique_ptr<ThrottlingURLLoader> url_loader,
+      const scoped_refptr<ResourceResponse>& response,
+      mojo::ScopedDataPipeConsumerHandle consumer_handle,
+      const SSLStatus& ssl_status,
+      int frame_tree_node_id,
+      std::vector<GURL> url_chain,
+      base::Optional<network::URLLoaderCompletionStatus> status);
 
   base::WeakPtr<UrlDownloadHandler::Delegate> delegate_;
 
diff --git a/content/browser/file_url_loader_factory.cc b/content/browser/file_url_loader_factory.cc
index 9ff24ac..28b6cd8 100644
--- a/content/browser/file_url_loader_factory.cc
+++ b/content/browser/file_url_loader_factory.cc
@@ -122,25 +122,27 @@
     client.Bind(std::move(client_info));
 
     if (!net::FileURLToFilePath(request.url, &path_)) {
-      client->OnComplete(network::URLLoaderStatus(net::ERR_FAILED));
+      client->OnComplete(network::URLLoaderCompletionStatus(net::ERR_FAILED));
       return;
     }
 
     base::File::Info info;
     if (!base::GetFileInfo(path_, &info) || !info.is_directory) {
-      client->OnComplete(network::URLLoaderStatus(net::ERR_FILE_NOT_FOUND));
+      client->OnComplete(
+          network::URLLoaderCompletionStatus(net::ERR_FILE_NOT_FOUND));
       return;
     }
 
     if (!GetContentClient()->browser()->IsFileAccessAllowed(
             path_, base::MakeAbsoluteFilePath(path_), profile_path)) {
-      client->OnComplete(network::URLLoaderStatus(net::ERR_ACCESS_DENIED));
+      client->OnComplete(
+          network::URLLoaderCompletionStatus(net::ERR_ACCESS_DENIED));
       return;
     }
 
     mojo::DataPipe pipe(kDefaultFileUrlPipeSize);
     if (!pipe.consumer_handle.is_valid()) {
-      client->OnComplete(network::URLLoaderStatus(net::ERR_FAILED));
+      client->OnComplete(network::URLLoaderCompletionStatus(net::ERR_FAILED));
       return;
     }
 
@@ -253,7 +255,7 @@
       completion_status = net::ERR_FAILED;
     }
 
-    client_->OnComplete(network::URLLoaderStatus(completion_status));
+    client_->OnComplete(network::URLLoaderCompletionStatus(completion_status));
     client_.reset();
     MaybeDeleteSelf();
   }
@@ -321,19 +323,21 @@
 
     base::FilePath path;
     if (!net::FileURLToFilePath(request.url, &path)) {
-      client->OnComplete(network::URLLoaderStatus(net::ERR_FAILED));
+      client->OnComplete(network::URLLoaderCompletionStatus(net::ERR_FAILED));
       return;
     }
 
     base::File::Info info;
     if (!base::GetFileInfo(path, &info)) {
-      client->OnComplete(network::URLLoaderStatus(net::ERR_FILE_NOT_FOUND));
+      client->OnComplete(
+          network::URLLoaderCompletionStatus(net::ERR_FILE_NOT_FOUND));
       return;
     }
 
     if (info.is_directory) {
       if (directory_loading_policy == DirectoryLoadingPolicy::kFail) {
-        client->OnComplete(network::URLLoaderStatus(net::ERR_FILE_NOT_FOUND));
+        client->OnComplete(
+            network::URLLoaderCompletionStatus(net::ERR_FILE_NOT_FOUND));
         return;
       }
 
@@ -393,13 +397,14 @@
     if (file_access_policy == FileAccessPolicy::kRestricted &&
         !GetContentClient()->browser()->IsFileAccessAllowed(
             path, base::MakeAbsoluteFilePath(path), profile_path)) {
-      client->OnComplete(network::URLLoaderStatus(net::ERR_ACCESS_DENIED));
+      client->OnComplete(
+          network::URLLoaderCompletionStatus(net::ERR_ACCESS_DENIED));
       return;
     }
 
     mojo::DataPipe pipe(kDefaultFileUrlPipeSize);
     if (!pipe.consumer_handle.is_valid()) {
-      client->OnComplete(network::URLLoaderStatus(net::ERR_FAILED));
+      client->OnComplete(network::URLLoaderCompletionStatus(net::ERR_FAILED));
       return;
     }
 
@@ -414,7 +419,7 @@
     int initial_read_result =
         file.ReadAtCurrentPos(initial_read_buffer, net::kMaxBytesToSniff);
     if (initial_read_result < 0) {
-      client->OnComplete(network::URLLoaderStatus(net::ERR_FAILED));
+      client->OnComplete(network::URLLoaderCompletionStatus(net::ERR_FAILED));
       return;
     }
     size_t initial_read_size = static_cast<size_t>(initial_read_result);
@@ -436,8 +441,8 @@
       }
 
       if (fail) {
-        client->OnComplete(
-            network::URLLoaderStatus(net::ERR_REQUEST_RANGE_NOT_SATISFIABLE));
+        client->OnComplete(network::URLLoaderCompletionStatus(
+            net::ERR_REQUEST_RANGE_NOT_SATISFIABLE));
         return;
       }
     }
@@ -513,9 +518,9 @@
 
   void OnFileWritten(MojoResult result) {
     if (result == MOJO_RESULT_OK)
-      client_->OnComplete(network::URLLoaderStatus(net::OK));
+      client_->OnComplete(network::URLLoaderCompletionStatus(net::OK));
     else
-      client_->OnComplete(network::URLLoaderStatus(net::ERR_FAILED));
+      client_->OnComplete(network::URLLoaderCompletionStatus(net::ERR_FAILED));
     client_.reset();
     MaybeDeleteSelf();
   }
diff --git a/content/browser/histogram_internals_url_loader.cc b/content/browser/histogram_internals_url_loader.cc
index 357783f7..b69269a3 100644
--- a/content/browser/histogram_internals_url_loader.cc
+++ b/content/browser/histogram_internals_url_loader.cc
@@ -26,7 +26,7 @@
   CHECK(mojo::common::BlockingCopyFromString(data, data_pipe.producer_handle));
 
   client->OnStartLoadingResponseBody(std::move(data_pipe.consumer_handle));
-  network::URLLoaderStatus status(net::OK);
+  network::URLLoaderCompletionStatus status(net::OK);
   status.encoded_data_length = data.size();
   status.encoded_body_length = data.size();
   client->OnComplete(status);
diff --git a/content/browser/loader/async_resource_handler.cc b/content/browser/loader/async_resource_handler.cc
index e8c8ae9..5316de1 100644
--- a/content/browser/loader/async_resource_handler.cc
+++ b/content/browser/loader/async_resource_handler.cc
@@ -29,7 +29,7 @@
 #include "net/base/load_flags.h"
 #include "net/base/upload_progress.h"
 #include "net/url_request/redirect_info.h"
-#include "services/network/public/cpp/url_loader_status.h"
+#include "services/network/public/cpp/url_loader_completion_status.h"
 
 using base::TimeDelta;
 using base::TimeTicks;
@@ -348,7 +348,7 @@
 
   DCHECK(request_status.status() != net::URLRequestStatus::IO_PENDING);
 
-  network::URLLoaderStatus loader_status;
+  network::URLLoaderCompletionStatus loader_status;
   loader_status.error_code = error_code;
   loader_status.exists_in_cache = request()->response_info().was_cached;
   loader_status.completion_time = TimeTicks::Now();
diff --git a/content/browser/loader/async_resource_handler_unittest.cc b/content/browser/loader/async_resource_handler_unittest.cc
index 5c660018..6e5fdc4 100644
--- a/content/browser/loader/async_resource_handler_unittest.cc
+++ b/content/browser/loader/async_resource_handler_unittest.cc
@@ -268,7 +268,7 @@
   ASSERT_EQ(ResourceMsg_RequestComplete::ID, messages[3]->type());
   ResourceMsg_RequestComplete::Param completion_params;
   ResourceMsg_RequestComplete::Read(messages[3].get(), &completion_params);
-  network::URLLoaderStatus status = std::get<1>(completion_params);
+  network::URLLoaderCompletionStatus status = std::get<1>(completion_params);
 
   EXPECT_EQ(TotalReceivedBytes(kDataSize), status.encoded_data_length);
   EXPECT_EQ(kDataSize, status.encoded_body_length);
@@ -296,7 +296,7 @@
   ASSERT_EQ(ResourceMsg_RequestComplete::ID, messages[4]->type());
   ResourceMsg_RequestComplete::Param completion_params;
   ResourceMsg_RequestComplete::Read(messages[4].get(), &completion_params);
-  network::URLLoaderStatus status = std::get<1>(completion_params);
+  network::URLLoaderCompletionStatus status = std::get<1>(completion_params);
   EXPECT_EQ(TotalReceivedBytes(kDataSize), status.encoded_data_length);
   EXPECT_EQ(kDataSize, status.encoded_body_length);
 }
diff --git a/content/browser/loader/mojo_async_resource_handler.cc b/content/browser/loader/mojo_async_resource_handler.cc
index 9406661..6a0c5e0 100644
--- a/content/browser/loader/mojo_async_resource_handler.cc
+++ b/content/browser/loader/mojo_async_resource_handler.cc
@@ -26,7 +26,7 @@
 #include "net/base/mime_sniffer.h"
 #include "net/base/net_errors.h"
 #include "net/url_request/redirect_info.h"
-#include "services/network/public/cpp/url_loader_status.h"
+#include "services/network/public/cpp/url_loader_completion_status.h"
 
 namespace content {
 namespace {
@@ -440,7 +440,7 @@
 
   DCHECK_NE(request_status.status(), net::URLRequestStatus::IO_PENDING);
 
-  network::URLLoaderStatus loader_status;
+  network::URLLoaderCompletionStatus loader_status;
   loader_status.error_code = error_code;
   loader_status.exists_in_cache = request()->response_info().was_cached;
   loader_status.completion_time = base::TimeTicks::Now();
diff --git a/content/browser/loader/mojo_async_resource_handler_unittest.cc b/content/browser/loader/mojo_async_resource_handler_unittest.cc
index 0e8e8fa..4557913 100644
--- a/content/browser/loader/mojo_async_resource_handler_unittest.cc
+++ b/content/browser/loader/mojo_async_resource_handler_unittest.cc
@@ -54,7 +54,7 @@
 #include "net/url_request/url_request_context.h"
 #include "net/url_request/url_request_status.h"
 #include "net/url_request/url_request_test_util.h"
-#include "services/network/public/cpp/url_loader_status.h"
+#include "services/network/public/cpp/url_loader_completion_status.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/base/page_transition_types.h"
 
@@ -617,11 +617,11 @@
 
   url_loader_client_.RunUntilComplete();
   EXPECT_TRUE(url_loader_client_.has_received_completion());
-  EXPECT_EQ(net::OK, url_loader_client_.status().error_code);
-  EXPECT_LE(now1, url_loader_client_.status().completion_time);
-  EXPECT_LE(url_loader_client_.status().completion_time, now2);
+  EXPECT_EQ(net::OK, url_loader_client_.completion_status().error_code);
+  EXPECT_LE(now1, url_loader_client_.completion_status().completion_time);
+  EXPECT_LE(url_loader_client_.completion_status().completion_time, now2);
   EXPECT_EQ(request_->GetTotalReceivedBytes(),
-            url_loader_client_.status().encoded_data_length);
+            url_loader_client_.completion_status().encoded_data_length);
 }
 
 // This test case sets different status values from OnResponseCompleted.
@@ -647,11 +647,12 @@
 
   url_loader_client_.RunUntilComplete();
   EXPECT_TRUE(url_loader_client_.has_received_completion());
-  EXPECT_EQ(net::ERR_ABORTED, url_loader_client_.status().error_code);
-  EXPECT_LE(now1, url_loader_client_.status().completion_time);
-  EXPECT_LE(url_loader_client_.status().completion_time, now2);
+  EXPECT_EQ(net::ERR_ABORTED,
+            url_loader_client_.completion_status().error_code);
+  EXPECT_LE(now1, url_loader_client_.completion_status().completion_time);
+  EXPECT_LE(url_loader_client_.completion_status().completion_time, now2);
   EXPECT_EQ(request_->GetTotalReceivedBytes(),
-            url_loader_client_.status().encoded_data_length);
+            url_loader_client_.completion_status().encoded_data_length);
 }
 
 TEST_F(MojoAsyncResourceHandlerTest, OnResponseCompletedWithCanceledTimedOut) {
@@ -664,7 +665,8 @@
 
   url_loader_client_.RunUntilComplete();
   EXPECT_TRUE(url_loader_client_.has_received_completion());
-  EXPECT_EQ(net::ERR_TIMED_OUT, url_loader_client_.status().error_code);
+  EXPECT_EQ(net::ERR_TIMED_OUT,
+            url_loader_client_.completion_status().error_code);
 }
 
 TEST_F(MojoAsyncResourceHandlerTest, OnResponseCompletedWithFailedTimedOut) {
@@ -677,7 +679,8 @@
 
   url_loader_client_.RunUntilComplete();
   EXPECT_TRUE(url_loader_client_.has_received_completion());
-  EXPECT_EQ(net::ERR_TIMED_OUT, url_loader_client_.status().error_code);
+  EXPECT_EQ(net::ERR_TIMED_OUT,
+            url_loader_client_.completion_status().error_code);
 }
 
 TEST_F(MojoAsyncResourceHandlerTest, ResponseCompletionShouldCloseDataPipe) {
@@ -695,7 +698,7 @@
 
   url_loader_client_.RunUntilComplete();
   EXPECT_TRUE(url_loader_client_.has_received_completion());
-  EXPECT_EQ(net::OK, url_loader_client_.status().error_code);
+  EXPECT_EQ(net::OK, url_loader_client_.completion_status().error_code);
 
   while (true) {
     char buffer[16];
@@ -727,7 +730,7 @@
 
   url_loader_client_.RunUntilComplete();
   EXPECT_TRUE(url_loader_client_.has_received_completion());
-  EXPECT_EQ(net::ERR_FAILED, url_loader_client_.status().error_code);
+  EXPECT_EQ(net::ERR_FAILED, url_loader_client_.completion_status().error_code);
 
   std::string actual;
   while (true) {
@@ -1153,7 +1156,8 @@
 
   ASSERT_FALSE(url_loader_client_.has_received_completion());
   url_loader_client_.RunUntilComplete();
-  EXPECT_EQ(net::ERR_ABORTED, url_loader_client_.status().error_code);
+  EXPECT_EQ(net::ERR_ABORTED,
+            url_loader_client_.completion_status().error_code);
 
   while (true) {
     char buffer[16];
@@ -1226,7 +1230,7 @@
 
   ASSERT_TRUE(url_loader_client_.has_received_response());
   ASSERT_TRUE(url_loader_client_.has_received_completion());
-  EXPECT_EQ(net::OK, url_loader_client_.status().error_code);
+  EXPECT_EQ(net::OK, url_loader_client_.completion_status().error_code);
 }
 
 // Test the case where th other process tells the ResourceHandler to follow a
@@ -1267,7 +1271,7 @@
 
   ASSERT_FALSE(url_loader_client_.has_received_completion());
   url_loader_client_.RunUntilComplete();
-  EXPECT_EQ(net::OK, url_loader_client_.status().error_code);
+  EXPECT_EQ(net::OK, url_loader_client_.completion_status().error_code);
 
   std::string body;
   while (true) {
@@ -1317,7 +1321,7 @@
 
   ASSERT_FALSE(url_loader_client_.has_received_completion());
   url_loader_client_.RunUntilComplete();
-  EXPECT_EQ(net::OK, url_loader_client_.status().error_code);
+  EXPECT_EQ(net::OK, url_loader_client_.completion_status().error_code);
 
   std::string body;
   while (true) {
diff --git a/content/browser/loader/navigation_url_loader.h b/content/browser/loader/navigation_url_loader.h
index 75a0cec..bb784aa 100644
--- a/content/browser/loader/navigation_url_loader.h
+++ b/content/browser/loader/navigation_url_loader.h
@@ -12,7 +12,7 @@
 #include "base/macros.h"
 #include "base/optional.h"
 #include "content/common/content_export.h"
-#include "services/network/public/cpp/url_loader_status.h"
+#include "services/network/public/cpp/url_loader_completion_status.h"
 
 class GURL;
 
@@ -68,11 +68,11 @@
   // network service is enabled. Args: the initial resource request,
   // the URLLoader for sending the request, url chain, optional completion
   // status if it has already been received.
-  using NavigationInterceptionCB =
-      base::OnceCallback<void(std::unique_ptr<ResourceRequest>,
-                              std::unique_ptr<ThrottlingURLLoader>,
-                              std::vector<GURL>,
-                              base::Optional<network::URLLoaderStatus>)>;
+  using NavigationInterceptionCB = base::OnceCallback<void(
+      std::unique_ptr<ResourceRequest>,
+      std::unique_ptr<ThrottlingURLLoader>,
+      std::vector<GURL>,
+      base::Optional<network::URLLoaderCompletionStatus>)>;
 
   // This method is called to intercept the url response. Caller is responsible
   // for handling the URLLoader later on. The callback should be called on the
diff --git a/content/browser/loader/navigation_url_loader_network_service.cc b/content/browser/loader/navigation_url_loader_network_service.cc
index 3e4eae2..00c8d6d8 100644
--- a/content/browser/loader/navigation_url_loader_network_service.cc
+++ b/content/browser/loader/navigation_url_loader_network_service.cc
@@ -386,7 +386,8 @@
   void OnReceiveRedirect(const net::RedirectInfo& redirect_info,
                          const ResourceResponseHead& head) override {
     if (--redirect_limit_ == 0) {
-      OnComplete(network::URLLoaderStatus(net::ERR_TOO_MANY_REDIRECTS));
+      OnComplete(
+          network::URLLoaderCompletionStatus(net::ERR_TOO_MANY_REDIRECTS));
       return;
     }
 
@@ -425,7 +426,7 @@
             owner_, base::Passed(&body)));
   }
 
-  void OnComplete(const network::URLLoaderStatus& status) override {
+  void OnComplete(const network::URLLoaderCompletionStatus& status) override {
     if (status.error_code != net::OK && !received_response_) {
       // If the default loader (network) was used to handle the URL load
       // request we need to see if the handlers want to potentially create a
@@ -508,7 +509,7 @@
   // the case that the response is intercepted by download, and OnComplete() is
   // already called while we are transferring the |url_loader_| and response
   // body to download code.
-  base::Optional<network::URLLoaderStatus> status_;
+  base::Optional<network::URLLoaderCompletionStatus> status_;
 
   DISALLOW_COPY_AND_ASSIGN(URLLoaderRequestController);
 };
@@ -689,7 +690,7 @@
 }
 
 void NavigationURLLoaderNetworkService::OnComplete(
-    const network::URLLoaderStatus& status) {
+    const network::URLLoaderCompletionStatus& status) {
   if (status.error_code == net::OK)
     return;
 
diff --git a/content/browser/loader/navigation_url_loader_network_service.h b/content/browser/loader/navigation_url_loader_network_service.h
index f60c5c8..a5ddfedf 100644
--- a/content/browser/loader/navigation_url_loader_network_service.h
+++ b/content/browser/loader/navigation_url_loader_network_service.h
@@ -53,7 +53,7 @@
   void OnReceiveRedirect(const net::RedirectInfo& redirect_info,
                          scoped_refptr<ResourceResponse> response);
   void OnStartLoadingResponseBody(mojo::ScopedDataPipeConsumerHandle body);
-  void OnComplete(const network::URLLoaderStatus& status);
+  void OnComplete(const network::URLLoaderCompletionStatus& status);
 
  private:
   class URLLoaderRequestController;
diff --git a/content/browser/loader/resource_dispatcher_host_impl.cc b/content/browser/loader/resource_dispatcher_host_impl.cc
index 54b5889..ced877e 100644
--- a/content/browser/loader/resource_dispatcher_host_impl.cc
+++ b/content/browser/loader/resource_dispatcher_host_impl.cc
@@ -114,7 +114,7 @@
 #include "net/url_request/url_request_context_getter.h"
 #include "net/url_request/url_request_job_factory.h"
 #include "ppapi/features/features.h"
-#include "services/network/public/cpp/url_loader_status.h"
+#include "services/network/public/cpp/url_loader_completion_status.h"
 #include "storage/browser/blob/blob_data_handle.h"
 #include "storage/browser/blob/blob_storage_context.h"
 #include "storage/browser/blob/blob_url_request_job_factory.h"
@@ -182,7 +182,7 @@
     sync_result_handler.Run(&result);
   } else {
     // Tell the renderer that this request was disallowed.
-    network::URLLoaderStatus status;
+    network::URLLoaderCompletionStatus status;
     status.error_code = net::ERR_ABORTED;
     status.exists_in_cache = false;
     // No security info needed, connection not established.
diff --git a/content/browser/loader/url_loader_factory_impl_unittest.cc b/content/browser/loader/url_loader_factory_impl_unittest.cc
index 6af8835..63314d6 100644
--- a/content/browser/loader/url_loader_factory_impl_unittest.cc
+++ b/content/browser/loader/url_loader_factory_impl_unittest.cc
@@ -51,7 +51,7 @@
 #include "net/test/url_request/url_request_slow_download_job.h"
 #include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
 #include "net/url_request/url_request_filter.h"
-#include "services/network/public/cpp/url_loader_status.h"
+#include "services/network/public/cpp/url_loader_completion_status.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "url/gurl.h"
 #include "url/origin.h"
@@ -196,7 +196,7 @@
   client.response_head().headers->GetNormalizedHeader("content-type",
                                                       &content_type);
   EXPECT_EQ("text/html", content_type);
-  EXPECT_EQ(0, client.status().error_code);
+  EXPECT_EQ(0, client.completion_status().error_code);
 
   std::string contents;
   while (true) {
@@ -217,13 +217,13 @@
   EXPECT_EQ(expected, contents);
   EXPECT_EQ(static_cast<int64_t>(expected.size()) +
                 client.response_head().encoded_data_length,
-            client.status().encoded_data_length);
+            client.completion_status().encoded_data_length);
   EXPECT_EQ(static_cast<int64_t>(expected.size()),
-            client.status().encoded_body_length);
+            client.completion_status().encoded_body_length);
   // OnTransferSizeUpdated is not dispatched as report_raw_headers is not set.
   EXPECT_EQ(0, client.body_transfer_size());
   EXPECT_GT(client.response_head().encoded_data_length, 0);
-  EXPECT_GT(client.status().encoded_data_length, 0);
+  EXPECT_GT(client.completion_status().encoded_data_length, 0);
 }
 
 TEST_P(URLLoaderFactoryImplTest, GetFailedResponse) {
@@ -250,9 +250,9 @@
   ASSERT_FALSE(client.has_received_response());
   ASSERT_FALSE(client.response_body().is_valid());
 
-  EXPECT_EQ(net::ERR_TIMED_OUT, client.status().error_code);
-  EXPECT_EQ(0, client.status().encoded_data_length);
-  EXPECT_EQ(0, client.status().encoded_body_length);
+  EXPECT_EQ(net::ERR_TIMED_OUT, client.completion_status().error_code);
+  EXPECT_EQ(0, client.completion_status().encoded_data_length);
+  EXPECT_EQ(0, client.completion_status().encoded_body_length);
 }
 
 // In this case, the loading fails after receiving a response.
@@ -280,9 +280,9 @@
   ASSERT_FALSE(client.has_received_response());
   ASSERT_FALSE(client.response_body().is_valid());
 
-  EXPECT_EQ(net::ERR_TIMED_OUT, client.status().error_code);
-  EXPECT_GT(client.status().encoded_data_length, 0);
-  EXPECT_EQ(0, client.status().encoded_body_length);
+  EXPECT_EQ(net::ERR_TIMED_OUT, client.completion_status().error_code);
+  EXPECT_GT(client.completion_status().encoded_data_length, 0);
+  EXPECT_EQ(0, client.completion_status().encoded_body_length);
 }
 
 // This test tests a case where resource loading is cancelled before started.
@@ -308,7 +308,7 @@
   ASSERT_FALSE(client.has_received_response());
   ASSERT_FALSE(client.response_body().is_valid());
 
-  EXPECT_EQ(net::ERR_ABORTED, client.status().error_code);
+  EXPECT_EQ(net::ERR_ABORTED, client.completion_status().error_code);
 }
 
 // This test tests a case where resource loading is cancelled before started.
@@ -337,7 +337,7 @@
   ASSERT_FALSE(client.has_received_response());
   ASSERT_FALSE(client.response_body().is_valid());
 
-  EXPECT_EQ(net::ERR_ABORTED, client.status().error_code);
+  EXPECT_EQ(net::ERR_ABORTED, client.completion_status().error_code);
 }
 
 TEST_P(URLLoaderFactoryImplTest, DownloadToFile) {
@@ -387,7 +387,7 @@
   client.response_head().headers->GetNormalizedHeader("content-type",
                                                       &content_type);
   EXPECT_EQ("text/html", content_type);
-  EXPECT_EQ(0, client.status().error_code);
+  EXPECT_EQ(0, client.completion_status().error_code);
 
   std::string contents;
   base::ReadFileToString(client.response_head().download_file_path, &contents);
@@ -403,9 +403,9 @@
   EXPECT_EQ(expected, contents);
   EXPECT_EQ(static_cast<int64_t>(expected.size()) +
                 client.response_head().encoded_data_length,
-            client.status().encoded_data_length);
+            client.completion_status().encoded_data_length);
   EXPECT_EQ(static_cast<int64_t>(expected.size()),
-            client.status().encoded_body_length);
+            client.completion_status().encoded_body_length);
 }
 
 TEST_P(URLLoaderFactoryImplTest, DownloadToFileFailure) {
@@ -464,7 +464,7 @@
   ASSERT_TRUE(client.has_received_completion());
 
   EXPECT_EQ(200, client.response_head().headers->response_code());
-  EXPECT_EQ(net::ERR_ABORTED, client.status().error_code);
+  EXPECT_EQ(net::ERR_ABORTED, client.completion_status().error_code);
 }
 
 TEST_P(URLLoaderFactoryImplTest, OnTransferSizeUpdated) {
@@ -514,15 +514,16 @@
       &expected_encoded_body);
 
   EXPECT_GT(client.response_head().encoded_data_length, 0);
-  EXPECT_GT(client.status().encoded_data_length, 0);
+  EXPECT_GT(client.completion_status().encoded_data_length, 0);
   EXPECT_EQ(static_cast<int64_t>(expected_encoded_body.size()),
             client.body_transfer_size());
   EXPECT_EQ(200, client.response_head().headers->response_code());
   EXPECT_EQ(
       client.response_head().encoded_data_length + client.body_transfer_size(),
-      client.status().encoded_data_length);
+      client.completion_status().encoded_data_length);
   EXPECT_NE(client.body_transfer_size(), static_cast<int64_t>(contents.size()));
-  EXPECT_EQ(client.body_transfer_size(), client.status().encoded_body_length);
+  EXPECT_EQ(client.body_transfer_size(),
+            client.completion_status().encoded_body_length);
   EXPECT_EQ(contents, "Hello World!\n");
 }
 
diff --git a/content/browser/service_worker/service_worker_fetch_dispatcher.cc b/content/browser/service_worker/service_worker_fetch_dispatcher.cc
index 8e79851a..a9f970d 100644
--- a/content/browser/service_worker/service_worker_fetch_dispatcher.cc
+++ b/content/browser/service_worker/service_worker_fetch_dispatcher.cc
@@ -117,7 +117,7 @@
 }
 
 void NotifyNavigationPreloadCompletedOnUI(
-    const network::URLLoaderStatus& status,
+    const network::URLLoaderCompletionStatus& status,
     const std::pair<int, int>& worker_id,
     const std::string& request_id) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
@@ -145,7 +145,7 @@
   ~DelegatingURLLoaderClient() override {
     if (!completed_) {
       // Let the service worker know that the request has been canceled.
-      network::URLLoaderStatus status;
+      network::URLLoaderCompletionStatus status;
       status.error_code = net::ERR_ABORTED;
       client_->OnComplete(status);
       AddDevToolsCallback(
@@ -193,7 +193,7 @@
     client_->OnReceiveRedirect(redirect_info, head);
     AddDevToolsCallback(
         base::Bind(&NotifyNavigationPreloadResponseReceivedOnUI, url_, head));
-    network::URLLoaderStatus status;
+    network::URLLoaderCompletionStatus status;
     AddDevToolsCallback(
         base::Bind(&NotifyNavigationPreloadCompletedOnUI, status));
   }
@@ -201,7 +201,7 @@
       mojo::ScopedDataPipeConsumerHandle body) override {
     client_->OnStartLoadingResponseBody(std::move(body));
   }
-  void OnComplete(const network::URLLoaderStatus& status) override {
+  void OnComplete(const network::URLLoaderCompletionStatus& status) override {
     if (completed_)
       return;
     completed_ = true;
diff --git a/content/browser/service_worker/service_worker_script_url_loader.cc b/content/browser/service_worker/service_worker_script_url_loader.cc
index 7758758..6b668c7 100644
--- a/content/browser/service_worker/service_worker_script_url_loader.cc
+++ b/content/browser/service_worker/service_worker_script_url_loader.cc
@@ -128,7 +128,7 @@
     const base::Optional<net::SSLInfo>& ssl_info,
     mojom::DownloadedTempFilePtr downloaded_file) {
   if (!version_->context() || version_->is_redundant()) {
-    CommitCompleted(network::URLLoaderStatus(net::ERR_FAILED));
+    CommitCompleted(network::URLLoaderCompletionStatus(net::ERR_FAILED));
     return;
   }
 
@@ -152,7 +152,8 @@
     // Non-2XX HTTP status code is handled as an error.
     // TODO(nhiroki): Show an error message equivalent to kBadHTTPResponseError
     // in service_worker_write_to_cache_job.cc.
-    CommitCompleted(network::URLLoaderStatus(net::ERR_INVALID_RESPONSE));
+    CommitCompleted(
+        network::URLLoaderCompletionStatus(net::ERR_INVALID_RESPONSE));
     return;
   }
 
@@ -163,7 +164,8 @@
   if (net::IsCertStatusError(response_head.cert_status)) {
     // TODO(nhiroki): Show an error message equivalent to kSSLError in
     // service_worker_write_to_cache_job.cc.
-    CommitCompleted(network::URLLoaderStatus(net::ERR_INSECURE_RESPONSE));
+    CommitCompleted(
+        network::URLLoaderCompletionStatus(net::ERR_INSECURE_RESPONSE));
     return;
   }
 
@@ -171,7 +173,8 @@
     if (!blink::IsSupportedJavascriptMimeType(response_head.mime_type)) {
       // TODO(nhiroki): Show an error message equivalent to kNoMIMEError or
       // kBadMIMEError in service_worker_write_to_cache_job.cc.
-      CommitCompleted(network::URLLoaderStatus(net::ERR_INSECURE_RESPONSE));
+      CommitCompleted(
+          network::URLLoaderCompletionStatus(net::ERR_INSECURE_RESPONSE));
       return;
     }
 
@@ -186,7 +189,8 @@
             version_->scope(), request_url_,
             has_header ? &service_worker_allowed : nullptr, &error_message)) {
       // TODO(nhiroki): Report |error_message|.
-      CommitCompleted(network::URLLoaderStatus(net::ERR_INSECURE_RESPONSE));
+      CommitCompleted(
+          network::URLLoaderCompletionStatus(net::ERR_INSECURE_RESPONSE));
       return;
     }
 
@@ -210,7 +214,7 @@
   //
   // TODO(nhiroki): Show an error message equivalent to kRedirectError in
   // service_worker_write_to_cache_job.cc.
-  CommitCompleted(network::URLLoaderStatus(net::ERR_UNSAFE_REDIRECT));
+  CommitCompleted(network::URLLoaderCompletionStatus(net::ERR_UNSAFE_REDIRECT));
 }
 
 void ServiceWorkerScriptURLLoader::OnDataDownloaded(int64_t data_len,
@@ -242,7 +246,7 @@
   mojo::ScopedDataPipeConsumerHandle client_consumer;
   if (mojo::CreateDataPipe(nullptr, &client_producer_, &client_consumer) !=
       MOJO_RESULT_OK) {
-    CommitCompleted(network::URLLoaderStatus(net::ERR_FAILED));
+    CommitCompleted(network::URLLoaderCompletionStatus(net::ERR_FAILED));
     return;
   }
 
@@ -254,7 +258,7 @@
 }
 
 void ServiceWorkerScriptURLLoader::OnComplete(
-    const network::URLLoaderStatus& status) {
+    const network::URLLoaderCompletionStatus& status) {
   if (status.error_code != net::OK) {
     CommitCompleted(status);
     return;
@@ -271,7 +275,7 @@
       // storage.
       return;
     case State::kWroteData:
-      CommitCompleted(network::URLLoaderStatus(net::OK));
+      CommitCompleted(network::URLLoaderCompletionStatus(net::OK));
       return;
   }
   NOTREACHED() << static_cast<int>(state_);
@@ -320,7 +324,7 @@
 void ServiceWorkerScriptURLLoader::OnWriteHeadersComplete(net::Error error) {
   DCHECK_NE(net::ERR_IO_PENDING, error);
   if (error != net::OK) {
-    CommitCompleted(network::URLLoaderStatus(error));
+    CommitCompleted(network::URLLoaderCompletionStatus(error));
     return;
   }
   AdvanceState(State::kWroteHeaders);
@@ -363,7 +367,7 @@
       // notified via OnComplete().
       AdvanceState(State::kWroteData);
       if (network_load_completed_)
-        CommitCompleted(network::URLLoaderStatus(net::OK));
+        CommitCompleted(network::URLLoaderCompletionStatus(net::OK));
       return;
     case MOJO_RESULT_SHOULD_WAIT:
       network_watcher_.ArmOrNotify();
@@ -387,7 +391,7 @@
     case MOJO_RESULT_OK:
       break;
     case MOJO_RESULT_FAILED_PRECONDITION:
-      CommitCompleted(network::URLLoaderStatus(net::ERR_FAILED));
+      CommitCompleted(network::URLLoaderCompletionStatus(net::ERR_FAILED));
       return;
     case MOJO_RESULT_SHOULD_WAIT:
       // No data was written to |client_producer_| because the pipe was full.
@@ -423,7 +427,7 @@
     net::Error error) {
   DCHECK_NE(net::ERR_IO_PENDING, error);
   if (error != net::OK) {
-    CommitCompleted(network::URLLoaderStatus(error));
+    CommitCompleted(network::URLLoaderCompletionStatus(error));
     return;
   }
   DCHECK(pending_buffer);
@@ -434,7 +438,7 @@
 }
 
 void ServiceWorkerScriptURLLoader::CommitCompleted(
-    const network::URLLoaderStatus& status) {
+    const network::URLLoaderCompletionStatus& status) {
   AdvanceState(State::kCompleted);
   net::Error error_code = static_cast<net::Error>(status.error_code);
   int bytes_written = -1;
diff --git a/content/browser/service_worker/service_worker_script_url_loader.h b/content/browser/service_worker/service_worker_script_url_loader.h
index db3fd6b..f7b9c60 100644
--- a/content/browser/service_worker/service_worker_script_url_loader.h
+++ b/content/browser/service_worker/service_worker_script_url_loader.h
@@ -80,7 +80,7 @@
   void OnTransferSizeUpdated(int32_t transfer_size_diff) override;
   void OnStartLoadingResponseBody(
       mojo::ScopedDataPipeConsumerHandle body) override;
-  void OnComplete(const network::URLLoaderStatus& status) override;
+  void OnComplete(const network::URLLoaderCompletionStatus& status) override;
 
   // Buffer size for reading script data from network.
   const static uint32_t kReadBufferSize;
@@ -117,7 +117,7 @@
 
   // This is the last method that is called on this class. Notifies the final
   // result to |client_| and clears all mojo connections etc.
-  void CommitCompleted(const network::URLLoaderStatus& status);
+  void CommitCompleted(const network::URLLoaderCompletionStatus& status);
 
   const GURL request_url_;
 
diff --git a/content/browser/service_worker/service_worker_script_url_loader_unittest.cc b/content/browser/service_worker/service_worker_script_url_loader_unittest.cc
index c2297a35..def50b02 100644
--- a/content/browser/service_worker/service_worker_script_url_loader_unittest.cc
+++ b/content/browser/service_worker/service_worker_script_url_loader_unittest.cc
@@ -22,7 +22,7 @@
 #include "net/traffic_annotation/network_traffic_annotation.h"
 #include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
 #include "net/url_request/redirect_info.h"
-#include "services/network/public/cpp/url_loader_status.h"
+#include "services/network/public/cpp/url_loader_completion_status.h"
 #include "third_party/WebKit/public/platform/modules/serviceworker/service_worker_registration.mojom.h"
 
 namespace content {
@@ -110,7 +110,7 @@
     ASSERT_EQ(MOJO_RESULT_OK, result);
     client->OnStartLoadingResponseBody(std::move(data_pipe.consumer_handle));
 
-    network::URLLoaderStatus status;
+    network::URLLoaderCompletionStatus status;
     status.error_code = net::OK;
     client->OnComplete(status);
   }
@@ -267,7 +267,7 @@
   SetUpRegistration(kScriptURL);
   DoRequest(kScriptURL);
   client_.RunUntilComplete();
-  EXPECT_EQ(net::OK, client_.status().error_code);
+  EXPECT_EQ(net::OK, client_.completion_status().error_code);
 
   // The client should have received the response.
   EXPECT_TRUE(client_.has_received_response());
@@ -291,7 +291,7 @@
   SetUpRegistration(kScriptURL);
   DoRequest(kScriptURL);
   client_.RunUntilComplete();
-  EXPECT_EQ(net::OK, client_.status().error_code);
+  EXPECT_EQ(net::OK, client_.completion_status().error_code);
 
   // The client should have received the response.
   EXPECT_TRUE(client_.has_received_response());
@@ -321,7 +321,7 @@
   SetUpRegistration(kScriptURL);
   DoRequest(kScriptURL);
   client_.RunUntilComplete();
-  EXPECT_EQ(net::OK, client_.status().error_code);
+  EXPECT_EQ(net::OK, client_.completion_status().error_code);
 
   // The client should have received the response.
   EXPECT_TRUE(client_.has_received_response());
@@ -345,7 +345,7 @@
   client_.RunUntilComplete();
 
   // The request should be failed because of the 404 response.
-  EXPECT_EQ(net::ERR_INVALID_RESPONSE, client_.status().error_code);
+  EXPECT_EQ(net::ERR_INVALID_RESPONSE, client_.completion_status().error_code);
   EXPECT_FALSE(client_.has_received_response());
 
   // The response shouldn't be stored in the storage.
@@ -363,7 +363,7 @@
   client_.RunUntilComplete();
 
   // The request should be failed because of the redirected response.
-  EXPECT_EQ(net::ERR_UNSAFE_REDIRECT, client_.status().error_code);
+  EXPECT_EQ(net::ERR_UNSAFE_REDIRECT, client_.completion_status().error_code);
   EXPECT_FALSE(client_.has_received_response());
 
   // The response shouldn't be stored in the storage.
@@ -383,7 +383,7 @@
 
   // The request should be failed because of the response with the certificate
   // error.
-  EXPECT_EQ(net::ERR_INSECURE_RESPONSE, client_.status().error_code);
+  EXPECT_EQ(net::ERR_INSECURE_RESPONSE, client_.completion_status().error_code);
   EXPECT_FALSE(client_.has_received_response());
 
   // The response shouldn't be stored in the storage.
@@ -400,7 +400,7 @@
   client_.RunUntilComplete();
 
   // The request should be failed because of the response with no MIME type.
-  EXPECT_EQ(net::ERR_INSECURE_RESPONSE, client_.status().error_code);
+  EXPECT_EQ(net::ERR_INSECURE_RESPONSE, client_.completion_status().error_code);
   EXPECT_FALSE(client_.has_received_response());
 
   // The response shouldn't be stored in the storage.
@@ -419,7 +419,7 @@
 
   // The request should be failed because of the response with the bad MIME
   // type.
-  EXPECT_EQ(net::ERR_INSECURE_RESPONSE, client_.status().error_code);
+  EXPECT_EQ(net::ERR_INSECURE_RESPONSE, client_.completion_status().error_code);
   EXPECT_FALSE(client_.has_received_response());
 
   // The response shouldn't be stored in the storage.
@@ -440,7 +440,7 @@
   SetUpRegistration(kScriptURL, kScope);
   DoRequest(kScriptURL);
   client_.RunUntilComplete();
-  EXPECT_EQ(net::OK, client_.status().error_code);
+  EXPECT_EQ(net::OK, client_.completion_status().error_code);
 
   // The client should have received the response.
   EXPECT_TRUE(client_.has_received_response());
@@ -469,7 +469,7 @@
   client_.RunUntilComplete();
 
   // The request should be failed because the scope is not allowed.
-  EXPECT_EQ(net::ERR_INSECURE_RESPONSE, client_.status().error_code);
+  EXPECT_EQ(net::ERR_INSECURE_RESPONSE, client_.completion_status().error_code);
   EXPECT_FALSE(client_.has_received_response());
 
   // The response shouldn't be stored in the storage.
@@ -488,7 +488,7 @@
   client_.RunUntilComplete();
 
   // The request should be aborted.
-  EXPECT_EQ(net::ERR_FAILED, client_.status().error_code);
+  EXPECT_EQ(net::ERR_FAILED, client_.completion_status().error_code);
   EXPECT_FALSE(client_.has_received_response());
 
   // The response shouldn't be stored in the storage.
diff --git a/content/browser/service_worker/service_worker_url_loader_job.cc b/content/browser/service_worker/service_worker_url_loader_job.cc
index adfb08cb..06be04e 100644
--- a/content/browser/service_worker/service_worker_url_loader_job.cc
+++ b/content/browser/service_worker/service_worker_url_loader_job.cc
@@ -135,7 +135,8 @@
   fetch_dispatcher_.reset();
   stream_waiter_.reset();
 
-  url_loader_client_->OnComplete(network::URLLoaderStatus(net::ERR_ABORTED));
+  url_loader_client_->OnComplete(
+      network::URLLoaderCompletionStatus(net::ERR_ABORTED));
   url_loader_client_.reset();
 }
 
@@ -194,7 +195,8 @@
   // |stream_waiter_| calls this when done.
   stream_waiter_.reset();
 
-  url_loader_client_->OnComplete(network::URLLoaderStatus(error_code));
+  url_loader_client_->OnComplete(
+      network::URLLoaderCompletionStatus(error_code));
 }
 
 void ServiceWorkerURLLoaderJob::ReturnNetworkError() {
@@ -408,7 +410,7 @@
 }
 
 void ServiceWorkerURLLoaderJob::OnComplete(
-    const network::URLLoaderStatus& status) {
+    const network::URLLoaderCompletionStatus& status) {
   DCHECK_EQ(Status::kSentHeader, status_);
   DCHECK(url_loader_client_.is_bound());
   status_ = Status::kCompleted;
diff --git a/content/browser/service_worker/service_worker_url_loader_job.h b/content/browser/service_worker/service_worker_url_loader_job.h
index e8f45ad..2502e16 100644
--- a/content/browser/service_worker/service_worker_url_loader_job.h
+++ b/content/browser/service_worker/service_worker_url_loader_job.h
@@ -155,7 +155,7 @@
   void OnTransferSizeUpdated(int32_t transfer_size_diff) override;
   void OnStartLoadingResponseBody(
       mojo::ScopedDataPipeConsumerHandle body) override;
-  void OnComplete(const network::URLLoaderStatus& status) override;
+  void OnComplete(const network::URLLoaderCompletionStatus& status) override;
 
   ResponseType response_type_ = ResponseType::NOT_DETERMINED;
   LoaderCallback loader_callback_;
diff --git a/content/browser/service_worker/service_worker_url_loader_job_unittest.cc b/content/browser/service_worker/service_worker_url_loader_job_unittest.cc
index 27228076..6d4d34bc3 100644
--- a/content/browser/service_worker/service_worker_url_loader_job_unittest.cc
+++ b/content/browser/service_worker/service_worker_url_loader_job_unittest.cc
@@ -93,7 +93,7 @@
     // We could call OnResponseStream() here, but for simplicity, don't do
     // anything until OnComplete().
   }
-  void OnComplete(const network::URLLoaderStatus& status) override {
+  void OnComplete(const network::URLLoaderCompletionStatus& status) override {
     blink::mojom::ServiceWorkerStreamCallbackPtr stream_callback;
     auto stream_handle = blink::mojom::ServiceWorkerStreamHandle::New();
     stream_handle->callback_request = mojo::MakeRequest(&stream_callback);
@@ -183,7 +183,7 @@
                                          MOJO_WRITE_DATA_FLAG_ALL_OR_NONE);
     client->OnStartLoadingResponseBody(std::move(data_pipe.consumer_handle));
 
-    network::URLLoaderStatus status;
+    network::URLLoaderCompletionStatus status;
     status.error_code = net::OK;
     client->OnComplete(status);
   }
@@ -626,7 +626,7 @@
   EXPECT_EQ(JobResult::kHandledRequest, result);
   client_.RunUntilComplete();
 
-  EXPECT_EQ(net::OK, client_.status().error_code);
+  EXPECT_EQ(net::OK, client_.completion_status().error_code);
   const ResourceResponseHead& info = client_.response_head();
   EXPECT_EQ(200, info.headers->response_code());
   ExpectResponseInfo(info, *CreateResponseInfoFromServiceWorker());
@@ -641,7 +641,7 @@
   EXPECT_EQ(JobResult::kHandledRequest, result);
 
   client_.RunUntilComplete();
-  EXPECT_EQ(net::ERR_FAILED, client_.status().error_code);
+  EXPECT_EQ(net::ERR_FAILED, client_.completion_status().error_code);
 }
 
 // Test that the request body is passed to the fetch event.
@@ -739,7 +739,7 @@
   data_pipe.producer_handle.reset();
 
   client_.RunUntilComplete();
-  EXPECT_EQ(net::OK, client_.status().error_code);
+  EXPECT_EQ(net::OK, client_.completion_status().error_code);
 
   // Test the body.
   std::string response;
@@ -777,7 +777,7 @@
   data_pipe.producer_handle.reset();
 
   client_.RunUntilComplete();
-  EXPECT_EQ(net::ERR_ABORTED, client_.status().error_code);
+  EXPECT_EQ(net::ERR_ABORTED, client_.completion_status().error_code);
 
   // Test the body.
   std::string response;
@@ -828,7 +828,7 @@
 
   client_.RunUntilComplete();
   EXPECT_FALSE(data_pipe.consumer_handle.is_valid());
-  EXPECT_EQ(net::ERR_ABORTED, client_.status().error_code);
+  EXPECT_EQ(net::ERR_ABORTED, client_.completion_status().error_code);
 }
 
 // Test when the service worker responds with network fallback.
@@ -854,7 +854,7 @@
   EXPECT_EQ(JobResult::kHandledRequest, result);
 
   client_.RunUntilComplete();
-  EXPECT_EQ(net::ERR_FAILED, client_.status().error_code);
+  EXPECT_EQ(net::ERR_FAILED, client_.completion_status().error_code);
 }
 
 // Test when dispatching the fetch event to the service worker failed.
@@ -923,7 +923,7 @@
   ASSERT_EQ(JobResult::kHandledRequest, result);
   client_.RunUntilComplete();
 
-  EXPECT_EQ(net::OK, client_.status().error_code);
+  EXPECT_EQ(net::OK, client_.completion_status().error_code);
   const ResourceResponseHead& info = client_.response_head();
   EXPECT_EQ(200, info.headers->response_code());
 
diff --git a/content/browser/site_per_process_browsertest.cc b/content/browser/site_per_process_browsertest.cc
index 4cab8b1..4ece6a3 100644
--- a/content/browser/site_per_process_browsertest.cc
+++ b/content/browser/site_per_process_browsertest.cc
@@ -2881,7 +2881,7 @@
 class FailingURLLoaderImpl : public mojom::URLLoader {
  public:
   explicit FailingURLLoaderImpl(mojom::URLLoaderClientPtr client) {
-    network::URLLoaderStatus status;
+    network::URLLoaderCompletionStatus status;
     status.error_code = net::ERR_NOT_IMPLEMENTED;
     client->OnComplete(status);
   }
diff --git a/content/browser/webui/network_error_url_loader.cc b/content/browser/webui/network_error_url_loader.cc
index ae4697a9..5771f7a 100644
--- a/content/browser/webui/network_error_url_loader.cc
+++ b/content/browser/webui/network_error_url_loader.cc
@@ -29,7 +29,7 @@
     }
   }
 
-  network::URLLoaderStatus status;
+  network::URLLoaderCompletionStatus status;
   status.error_code = net_error;
   client->OnComplete(status);
 }
diff --git a/content/browser/webui/web_ui_url_loader_factory.cc b/content/browser/webui/web_ui_url_loader_factory.cc
index 082c4a6..b2d97832 100644
--- a/content/browser/webui/web_ui_url_loader_factory.cc
+++ b/content/browser/webui/web_ui_url_loader_factory.cc
@@ -48,7 +48,7 @@
   mojom::URLLoaderClientPtr client;
   client.Bind(std::move(client_info));
 
-  network::URLLoaderStatus status;
+  network::URLLoaderCompletionStatus status;
   status.error_code = error_code;
   client->OnComplete(status);
 }
@@ -112,7 +112,7 @@
   CHECK_EQ(result, MOJO_RESULT_OK);
 
   client->OnStartLoadingResponseBody(std::move(data_pipe.consumer_handle));
-  network::URLLoaderStatus status(net::OK);
+  network::URLLoaderCompletionStatus status(net::OK);
   status.encoded_data_length = output_size;
   status.encoded_body_length = output_size;
   client->OnComplete(status);
@@ -237,7 +237,7 @@
     if (request.url.scheme() != scheme_) {
       ReceivedBadMessage(render_frame_host_->GetProcess(),
                          bad_message::WEBUI_BAD_SCHEME_ACCESS);
-      client->OnComplete(network::URLLoaderStatus(net::ERR_FAILED));
+      client->OnComplete(network::URLLoaderCompletionStatus(net::ERR_FAILED));
       return;
     }
 
diff --git a/content/common/resource_messages.h b/content/common/resource_messages.h
index ea29b50a..a581a12 100644
--- a/content/common/resource_messages.h
+++ b/content/common/resource_messages.h
@@ -30,7 +30,7 @@
 #include "net/traffic_annotation/network_traffic_annotation.h"
 #include "net/url_request/redirect_info.h"
 #include "services/network/public/cpp/cors_error_status.h"
-#include "services/network/public/cpp/url_loader_status.h"
+#include "services/network/public/cpp/url_loader_completion_status.h"
 #include "services/network/public/interfaces/fetch_api.mojom.h"
 #include "third_party/WebKit/public/platform/WebMixedContentContextType.h"
 
@@ -300,7 +300,7 @@
   IPC_STRUCT_TRAITS_MEMBER(related_response_headers)
 IPC_STRUCT_TRAITS_END()
 
-IPC_STRUCT_TRAITS_BEGIN(network::URLLoaderStatus)
+IPC_STRUCT_TRAITS_BEGIN(network::URLLoaderCompletionStatus)
   IPC_STRUCT_TRAITS_MEMBER(error_code)
   IPC_STRUCT_TRAITS_MEMBER(exists_in_cache)
   IPC_STRUCT_TRAITS_MEMBER(completion_time)
@@ -373,7 +373,7 @@
 // Sent when the request has been completed.
 IPC_MESSAGE_CONTROL2(ResourceMsg_RequestComplete,
                      int /* request_id */,
-                     network::URLLoaderStatus)
+                     network::URLLoaderCompletionStatus)
 
 // Resource messages sent from the renderer to the browser.
 
diff --git a/content/common/throttling_url_loader.cc b/content/common/throttling_url_loader.cc
index 7d4cac5..cfa211a 100644
--- a/content/common/throttling_url_loader.cc
+++ b/content/common/throttling_url_loader.cc
@@ -421,7 +421,8 @@
   forwarding_client_->OnStartLoadingResponseBody(std::move(body));
 }
 
-void ThrottlingURLLoader::OnComplete(const network::URLLoaderStatus& status) {
+void ThrottlingURLLoader::OnComplete(
+    const network::URLLoaderCompletionStatus& status) {
   DCHECK_EQ(DEFERRED_NONE, deferred_stage_);
   DCHECK(!loader_cancelled_);
 
@@ -444,7 +445,7 @@
   if (loader_cancelled_)
     return;
 
-  network::URLLoaderStatus status;
+  network::URLLoaderCompletionStatus status;
   status.error_code = error_code;
   status.completion_time = base::TimeTicks::Now();
 
diff --git a/content/common/throttling_url_loader.h b/content/common/throttling_url_loader.h
index d1140a7..d0f2b53 100644
--- a/content/common/throttling_url_loader.h
+++ b/content/common/throttling_url_loader.h
@@ -132,7 +132,7 @@
   void OnTransferSizeUpdated(int32_t transfer_size_diff) override;
   void OnStartLoadingResponseBody(
       mojo::ScopedDataPipeConsumerHandle body) override;
-  void OnComplete(const network::URLLoaderStatus& status) override;
+  void OnComplete(const network::URLLoaderCompletionStatus& status) override;
 
   void OnClientConnectionError();
 
diff --git a/content/common/throttling_url_loader_unittest.cc b/content/common/throttling_url_loader_unittest.cc
index 4164d99..73de5378 100644
--- a/content/common/throttling_url_loader_unittest.cc
+++ b/content/common/throttling_url_loader_unittest.cc
@@ -57,7 +57,7 @@
   }
 
   void NotifyClientOnComplete(int error_code) {
-    network::URLLoaderStatus data;
+    network::URLLoaderCompletionStatus data;
     data.error_code = error_code;
     client_ptr_->OnComplete(data);
   }
@@ -154,7 +154,7 @@
   void OnTransferSizeUpdated(int32_t transfer_size_diff) override {}
   void OnStartLoadingResponseBody(
       mojo::ScopedDataPipeConsumerHandle body) override {}
-  void OnComplete(const network::URLLoaderStatus& status) override {
+  void OnComplete(const network::URLLoaderCompletionStatus& status) override {
     on_complete_called_++;
     if (on_complete_callback_)
       on_complete_callback_.Run(status.error_code);
diff --git a/content/network/cache_url_loader.cc b/content/network/cache_url_loader.cc
index e07fd244..6225f1a 100644
--- a/content/network/cache_url_loader.cc
+++ b/content/network/cache_url_loader.cc
@@ -61,7 +61,7 @@
         mojo::common::BlockingCopyFromString(data_, data_pipe.producer_handle));
 
     client_->OnStartLoadingResponseBody(std::move(data_pipe.consumer_handle));
-    network::URLLoaderStatus status(net::OK);
+    network::URLLoaderCompletionStatus status(net::OK);
     status.encoded_data_length = data_.size();
     status.encoded_body_length = data_.size();
     client_->OnComplete(status);
diff --git a/content/network/network_service_unittest.cc b/content/network/network_service_unittest.cc
index 3eaf4be1..f64b82c 100644
--- a/content/network/network_service_unittest.cc
+++ b/content/network/network_service_unittest.cc
@@ -183,7 +183,7 @@
 // works.
 TEST_F(NetworkServiceTestWithService, Basic) {
   LoadURL(test_server()->GetURL("/echo"));
-  EXPECT_EQ(net::OK, client()->status().error_code);
+  EXPECT_EQ(net::OK, client()->completion_status().error_code);
 }
 
 // Verifies that raw headers are only reported if requested.
@@ -283,20 +283,21 @@
 
   StartLoadingURL(request, 0);
   client()->RunUntilComplete();
-  EXPECT_EQ(net::OK, client()->status().error_code);
+  EXPECT_EQ(net::OK, client()->completion_status().error_code);
 
   request.headers.AddHeaderFromString(
       "X-DevTools-Emulate-Network-Conditions-Client-Id: 42");
   StartLoadingURL(request, 0);
   client()->RunUntilComplete();
-  EXPECT_EQ(net::ERR_INTERNET_DISCONNECTED, client()->status().error_code);
+  EXPECT_EQ(net::ERR_INTERNET_DISCONNECTED,
+            client()->completion_status().error_code);
 
   network_conditions = mojom::NetworkConditions::New();
   network_conditions->offline = false;
   context()->SetNetworkConditions("42", std::move(network_conditions));
   StartLoadingURL(request, 0);
   client()->RunUntilComplete();
-  EXPECT_EQ(net::OK, client()->status().error_code);
+  EXPECT_EQ(net::OK, client()->completion_status().error_code);
 
   network_conditions = mojom::NetworkConditions::New();
   network_conditions->offline = true;
@@ -306,11 +307,12 @@
       "X-DevTools-Emulate-Network-Conditions-Client-Id: 42");
   StartLoadingURL(request, 0);
   client()->RunUntilComplete();
-  EXPECT_EQ(net::ERR_INTERNET_DISCONNECTED, client()->status().error_code);
+  EXPECT_EQ(net::ERR_INTERNET_DISCONNECTED,
+            client()->completion_status().error_code);
   context()->SetNetworkConditions("42", nullptr);
   StartLoadingURL(request, 0);
   client()->RunUntilComplete();
-  EXPECT_EQ(net::OK, client()->status().error_code);
+  EXPECT_EQ(net::OK, client()->completion_status().error_code);
 }
 
 class TestNetworkChangeManagerClient
diff --git a/content/network/url_loader.cc b/content/network/url_loader.cc
index d719c31..c7a470c 100644
--- a/content/network/url_loader.cc
+++ b/content/network/url_loader.cc
@@ -632,7 +632,7 @@
   if (consumer_handle_.is_valid())
     SendResponseToClient();
 
-  network::URLLoaderStatus status;
+  network::URLLoaderCompletionStatus status;
   status.error_code = error_code;
   status.exists_in_cache = url_request_->response_info().was_cached;
   status.completion_time = base::TimeTicks::Now();
diff --git a/content/network/url_loader_unittest.cc b/content/network/url_loader_unittest.cc
index 66f88768..1619ce1 100644
--- a/content/network/url_loader_unittest.cc
+++ b/content/network/url_loader_unittest.cc
@@ -200,10 +200,11 @@
     client_.RunUntilComplete();
     if (body) {
       EXPECT_EQ(body->size(),
-                static_cast<size_t>(client()->status().decoded_body_length));
+                static_cast<size_t>(
+                    client()->completion_status().decoded_body_length));
     }
 
-    return client_.status().error_code;
+    return client_.completion_status().error_code;
   }
 
   void LoadAndCompareFile(const std::string& path) {
@@ -223,14 +224,17 @@
     EXPECT_EQ(expected, body);
     // The file isn't compressed, so both encoded and decoded body lengths
     // should match the read body length.
-    EXPECT_EQ(expected.size(),
-              static_cast<size_t>(client()->status().decoded_body_length));
-    EXPECT_EQ(expected.size(),
-              static_cast<size_t>(client()->status().encoded_body_length));
+    EXPECT_EQ(
+        expected.size(),
+        static_cast<size_t>(client()->completion_status().decoded_body_length));
+    EXPECT_EQ(
+        expected.size(),
+        static_cast<size_t>(client()->completion_status().encoded_body_length));
     // Over the wire length should include headers, so should be longer.
     // TODO(mmenke): Worth adding better tests for encoded_data_length?
-    EXPECT_LT(expected.size(),
-              static_cast<size_t>(client()->status().encoded_data_length));
+    EXPECT_LT(
+        expected.size(),
+        static_cast<size_t>(client()->completion_status().encoded_data_length));
   }
 
   // Adds a MultipleWritesInterceptor for MultipleWritesInterceptor::GetURL()
@@ -426,11 +430,11 @@
   EXPECT_EQ("Body", body);
   // Deflating a 4-byte string should result in a longer string - main thing to
   // check here, though, is that the two lengths are of different.
-  EXPECT_LT(client()->status().decoded_body_length,
-            client()->status().encoded_body_length);
+  EXPECT_LT(client()->completion_status().decoded_body_length,
+            client()->completion_status().encoded_body_length);
   // Over the wire length should include headers, so should be longer.
-  EXPECT_LT(client()->status().encoded_body_length,
-            client()->status().encoded_data_length);
+  EXPECT_LT(client()->completion_status().encoded_body_length,
+            client()->completion_status().encoded_data_length);
 }
 
 TEST_F(URLLoaderTest, ErrorBeforeHeaders) {
diff --git a/content/public/common/simple_url_loader.cc b/content/public/common/simple_url_loader.cc
index c26d75c..1e97402a 100644
--- a/content/public/common/simple_url_loader.cc
+++ b/content/public/common/simple_url_loader.cc
@@ -98,8 +98,8 @@
   // net::OK, the pipe was closed and all data received was successfully
   // handled. This could indicate an error, concellation, or completion. To
   // determine which case this is, the size will also be compared to the size
-  // reported in network::URLLoaderStatus(), if network::URLLoaderStatus
-  // indicates a success.
+  // reported in network::URLLoaderCompletionStatus(), if
+  // network::URLLoaderCompletionStatus indicates a success.
   void OnBodyHandlerDone(net::Error error, int64_t received_body_size);
 
   // Finished the request with the provided error code, after freeing Mojo
@@ -115,7 +115,8 @@
     ~RequestState() = default;
 
     bool request_completed = false;
-    // The expected total size of the body, taken from network::URLLoaderStatus.
+    // The expected total size of the body, taken from
+    // network::URLLoaderCompletionStatus.
     int64_t expected_body_size = 0;
 
     bool body_started = false;
@@ -162,7 +163,7 @@
                         OnUploadProgressCallback ack_callback) override;
   void OnStartLoadingResponseBody(
       mojo::ScopedDataPipeConsumerHandle body) override;
-  void OnComplete(const network::URLLoaderStatus& status) override;
+  void OnComplete(const network::URLLoaderCompletionStatus& status) override;
 
   // Bound to the URLLoaderClient message pipe (|client_binding_|) via
   // set_connection_error_handler.
@@ -783,8 +784,8 @@
     BodyAsStringCallback body_as_string_callback) {
   body_handler_ = std::make_unique<SaveToStringBodyHandler>(
       this, std::move(body_as_string_callback),
-      // int64_t because network::URLLoaderStatus::decoded_body_length is an
-      // int64_t, not a size_t.
+      // int64_t because network::URLLoaderCompletionStatus::decoded_body_length
+      // is an int64_t, not a size_t.
       std::numeric_limits<int64_t>::max());
   Start(resource_request, url_loader_factory, annotation_tag);
 }
@@ -1037,7 +1038,8 @@
   body_handler_->OnStartLoadingResponseBody(std::move(body));
 }
 
-void SimpleURLLoaderImpl::OnComplete(const network::URLLoaderStatus& status) {
+void SimpleURLLoaderImpl::OnComplete(
+    const network::URLLoaderCompletionStatus& status) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   // Request should not have been completed yet.
   DCHECK(!request_state_->finished);
@@ -1111,8 +1113,8 @@
       request_state_->net_error = net::ERR_FAILED;
     } else {
       // The caller provided more data through the pipe than it reported in
-      // network::URLLoaderStatus, so the URLLoader is violating the API
-      // contract. Just fail the request.
+      // network::URLLoaderCompletionStatus, so the URLLoader is violating the
+      // API contract. Just fail the request.
       request_state_->net_error = net::ERR_UNEXPECTED;
     }
   }
diff --git a/content/public/common/simple_url_loader_unittest.cc b/content/public/common/simple_url_loader_unittest.cc
index 06852424a..064f2b74 100644
--- a/content/public/common/simple_url_loader_unittest.cc
+++ b/content/public/common/simple_url_loader_unittest.cc
@@ -42,7 +42,7 @@
 #include "net/test/embedded_test_server/http_response.h"
 #include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
 #include "net/url_request/redirect_info.h"
-#include "services/network/public/cpp/url_loader_status.h"
+#include "services/network/public/cpp/url_loader_completion_status.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "url/gurl.h"
 
@@ -913,14 +913,14 @@
           break;
         }
         case TestLoaderEvent::kResponseComplete: {
-          network::URLLoaderStatus status;
+          network::URLLoaderCompletionStatus status;
           status.error_code = net::OK;
           status.decoded_body_length = CountBytesToSend();
           client_->OnComplete(status);
           break;
         }
         case TestLoaderEvent::kResponseCompleteFailed: {
-          network::URLLoaderStatus status;
+          network::URLLoaderCompletionStatus status;
           // Use an error that SimpleURLLoader doesn't create itself, so clear
           // when this is the source of the error code.
           status.error_code = net::ERR_TIMED_OUT;
@@ -929,14 +929,14 @@
           break;
         }
         case TestLoaderEvent::kResponseCompleteNetworkChanged: {
-          network::URLLoaderStatus status;
+          network::URLLoaderCompletionStatus status;
           status.error_code = net::ERR_NETWORK_CHANGED;
           status.decoded_body_length = CountBytesToSend();
           client_->OnComplete(status);
           break;
         }
         case TestLoaderEvent::kResponseCompleteTruncated: {
-          network::URLLoaderStatus status;
+          network::URLLoaderCompletionStatus status;
           status.error_code = net::OK;
           status.decoded_body_length = CountBytesToSend() + 1;
           client_->OnComplete(status);
@@ -945,7 +945,7 @@
         case TestLoaderEvent::kResponseCompleteWithExtraData: {
           // Make sure |decoded_body_length| doesn't underflow.
           DCHECK_GT(CountBytesToSend(), 0u);
-          network::URLLoaderStatus status;
+          network::URLLoaderCompletionStatus status;
           status.error_code = net::OK;
           status.decoded_body_length = CountBytesToSend() - 1;
           client_->OnComplete(status);
diff --git a/content/public/common/typemaps.gni b/content/public/common/typemaps.gni
index 004ec91..a76a2db 100644
--- a/content/public/common/typemaps.gni
+++ b/content/public/common/typemaps.gni
@@ -9,7 +9,7 @@
   "//content/public/common/referrer.typemap",
   "//content/public/common/resource_type.typemap",
   "//content/public/common/ssl_info.typemap",
-  "//content/public/common/url_loader_status.typemap",
+  "//content/public/common/url_loader_completion_status.typemap",
   "//content/public/common/url_request.typemap",
   "//content/public/common/url_request_redirect_info.typemap",
   "//content/public/common/url_response_head.typemap",
diff --git a/content/public/common/url_loader.mojom b/content/public/common/url_loader.mojom
index 8e349ae..faec8cf6 100644
--- a/content/public/common/url_loader.mojom
+++ b/content/public/common/url_loader.mojom
@@ -20,7 +20,7 @@
 struct CORSErrorStatus;
 
 [Native]
-struct URLLoaderStatus;
+struct URLLoaderCompletionStatus;
 
 // This enum corresponds to net::RequestPriority. See its comments for details.
 enum RequestPriority {
@@ -108,6 +108,6 @@
 
   // Called when the loading completes. No notification will be dispatched for
   // this client after this message arrives.
-  OnComplete(URLLoaderStatus status);
+  OnComplete(URLLoaderCompletionStatus status);
 };
 
diff --git a/content/public/common/url_loader_status.typemap b/content/public/common/url_loader_completion_status.typemap
similarity index 68%
rename from content/public/common/url_loader_status.typemap
rename to content/public/common/url_loader_completion_status.typemap
index 007bbb4..18b46bc5 100644
--- a/content/public/common/url_loader_status.typemap
+++ b/content/public/common/url_loader_completion_status.typemap
@@ -3,7 +3,8 @@
 # found in the LICENSE file.
 
 mojom = "//content/public/common/url_loader.mojom"
-public_headers = [ "//services/network/public/cpp/url_loader_status.h" ]
+public_headers =
+    [ "//services/network/public/cpp/url_loader_completion_status.h" ]
 traits_headers = [ "//content/common/resource_messages.h" ]
 deps = [
   "//content:export",
@@ -11,4 +12,4 @@
   "//services/network/public/cpp",
   "//third_party/WebKit/public:blink_headers",
 ]
-type_mappings = [ "content.mojom.URLLoaderStatus=network::URLLoaderStatus" ]
+type_mappings = [ "content.mojom.URLLoaderCompletionStatus=network::URLLoaderCompletionStatus" ]
diff --git a/content/public/renderer/request_peer.h b/content/public/renderer/request_peer.h
index 48cc44b..888bd86 100644
--- a/content/public/renderer/request_peer.h
+++ b/content/public/renderer/request_peer.h
@@ -17,7 +17,7 @@
 }
 
 namespace network {
-struct URLLoaderStatus;
+struct URLLoaderCompletionStatus;
 }
 
 namespace content {
@@ -93,7 +93,8 @@
 
   // Called when the response is complete.  This method signals completion of
   // the resource load.
-  virtual void OnCompletedRequest(const network::URLLoaderStatus& status) = 0;
+  virtual void OnCompletedRequest(
+      const network::URLLoaderCompletionStatus& status) = 0;
 
   virtual ~RequestPeer() {}
 };
diff --git a/content/public/test/test_url_loader_client.cc b/content/public/test/test_url_loader_client.cc
index 8b01754..95e2962 100644
--- a/content/public/test/test_url_loader_client.cc
+++ b/content/public/test/test_url_loader_client.cc
@@ -100,10 +100,11 @@
     quit_closure_for_on_start_loading_response_body_.Run();
 }
 
-void TestURLLoaderClient::OnComplete(const network::URLLoaderStatus& status) {
+void TestURLLoaderClient::OnComplete(
+    const network::URLLoaderCompletionStatus& status) {
   EXPECT_FALSE(has_received_completion_);
   has_received_completion_ = true;
-  status_ = status;
+  completion_status_ = status;
   if (quit_closure_for_on_complete_)
     quit_closure_for_on_complete_.Run();
 }
diff --git a/content/public/test/test_url_loader_client.h b/content/public/test/test_url_loader_client.h
index b42a059..fd5557f0 100644
--- a/content/public/test/test_url_loader_client.h
+++ b/content/public/test/test_url_loader_client.h
@@ -16,7 +16,7 @@
 #include "mojo/public/c/system/data_pipe.h"
 #include "mojo/public/cpp/bindings/binding.h"
 #include "net/url_request/redirect_info.h"
-#include "services/network/public/cpp/url_loader_status.h"
+#include "services/network/public/cpp/url_loader_completion_status.h"
 
 namespace content {
 
@@ -46,7 +46,7 @@
                         OnUploadProgressCallback ack_callback) override;
   void OnStartLoadingResponseBody(
       mojo::ScopedDataPipeConsumerHandle body) override;
-  void OnComplete(const network::URLLoaderStatus& status) override;
+  void OnComplete(const network::URLLoaderCompletionStatus& status) override;
 
   bool has_received_response() const { return has_received_response_; }
   bool has_received_redirect() const { return has_received_redirect_; }
@@ -66,7 +66,9 @@
   mojo::ScopedDataPipeConsumerHandle response_body_release() {
     return std::move(response_body_);
   }
-  const network::URLLoaderStatus& status() const { return status_; }
+  const network::URLLoaderCompletionStatus& completion_status() const {
+    return completion_status_;
+  }
   int64_t download_data_length() const { return download_data_length_; }
   int64_t encoded_download_data_length() const {
     return encoded_download_data_length_;
@@ -102,7 +104,7 @@
   net::RedirectInfo redirect_info_;
   std::string cached_metadata_;
   mojo::ScopedDataPipeConsumerHandle response_body_;
-  network::URLLoaderStatus status_;
+  network::URLLoaderCompletionStatus completion_status_;
   bool has_received_response_ = false;
   bool has_received_redirect_ = false;
   bool has_data_downloaded_ = false;
diff --git a/content/renderer/fetchers/resource_fetcher_impl.cc b/content/renderer/fetchers/resource_fetcher_impl.cc
index fe771871..c52e16af 100644
--- a/content/renderer/fetchers/resource_fetcher_impl.cc
+++ b/content/renderer/fetchers/resource_fetcher_impl.cc
@@ -208,7 +208,7 @@
             base::Unretained(this)));
     ReadDataPipe();
   }
-  void OnComplete(const network::URLLoaderStatus& status) override {
+  void OnComplete(const network::URLLoaderCompletionStatus& status) override {
     // When Cancel() sets |complete_|, OnComplete() may be called.
     if (completed_)
       return;
diff --git a/content/renderer/loader/cors_url_loader.cc b/content/renderer/loader/cors_url_loader.cc
index 883e0e1..5cc36f8 100644
--- a/content/renderer/loader/cors_url_loader.cc
+++ b/content/renderer/loader/cors_url_loader.cc
@@ -59,7 +59,7 @@
 
   if (fetch_cors_flag_ &&
       fetch_request_mode_ == FetchRequestMode::kSameOrigin) {
-    forwarding_client_->OnComplete(network::URLLoaderStatus(
+    forwarding_client_->OnComplete(network::URLLoaderCompletionStatus(
         network::CORSErrorStatus(CORSError::kDisallowedByMode)));
     return;
   }
@@ -124,7 +124,7 @@
     if (cors_error) {
       // TODO(toyoshim): Generate related_response_headers here.
       network::CORSErrorStatus cors_error_status(*cors_error);
-      HandleComplete(network::URLLoaderStatus(cors_error_status));
+      HandleComplete(network::URLLoaderCompletionStatus(cors_error_status));
       return;
     }
   }
@@ -189,7 +189,8 @@
   forwarding_client_->OnStartLoadingResponseBody(std::move(body));
 }
 
-void CORSURLLoader::OnComplete(const network::URLLoaderStatus& status) {
+void CORSURLLoader::OnComplete(
+    const network::URLLoaderCompletionStatus& status) {
   DCHECK(network_loader_);
   DCHECK(forwarding_client_);
   DCHECK(!is_waiting_follow_redirect_call_);
@@ -205,7 +206,8 @@
   forwarding_client_.reset();
 }
 
-void CORSURLLoader::HandleComplete(const network::URLLoaderStatus& status) {
+void CORSURLLoader::HandleComplete(
+    const network::URLLoaderCompletionStatus& status) {
   forwarding_client_->OnComplete(status);
   forwarding_client_.reset();
 
diff --git a/content/renderer/loader/cors_url_loader.h b/content/renderer/loader/cors_url_loader.h
index a4fc75cf..7683194 100644
--- a/content/renderer/loader/cors_url_loader.h
+++ b/content/renderer/loader/cors_url_loader.h
@@ -55,7 +55,7 @@
   void OnTransferSizeUpdated(int32_t transfer_size_diff) override;
   void OnStartLoadingResponseBody(
       mojo::ScopedDataPipeConsumerHandle body) override;
-  void OnComplete(const network::URLLoaderStatus& status) override;
+  void OnComplete(const network::URLLoaderCompletionStatus& status) override;
 
  private:
   // Called when there is a connection error on the upstream pipe used for the
@@ -63,7 +63,7 @@
   void OnUpstreamConnectionError();
 
   // Handles OnComplete() callback.
-  void HandleComplete(const network::URLLoaderStatus& status);
+  void HandleComplete(const network::URLLoaderCompletionStatus& status);
 
   // This raw URLLoaderFactory pointer is shared with the CORSURLLoaderFactory
   // that created and owns this object.
diff --git a/content/renderer/loader/cors_url_loader_unittest.cc b/content/renderer/loader/cors_url_loader_unittest.cc
index d54dfffc..a60c52d 100644
--- a/content/renderer/loader/cors_url_loader_unittest.cc
+++ b/content/renderer/loader/cors_url_loader_unittest.cc
@@ -41,7 +41,7 @@
 
   void NotifyClientOnComplete(int error_code) {
     DCHECK(client_ptr_);
-    client_ptr_->OnComplete(network::URLLoaderStatus(error_code));
+    client_ptr_->OnComplete(network::URLLoaderCompletionStatus(error_code));
   }
 
   bool IsCreateLoaderAndStartCalled() { return !!client_ptr_; }
@@ -149,7 +149,7 @@
   EXPECT_FALSE(client().has_received_redirect());
   EXPECT_TRUE(client().has_received_response());
   EXPECT_TRUE(client().has_received_completion());
-  EXPECT_EQ(net::OK, client().status().error_code);
+  EXPECT_EQ(net::OK, client().completion_status().error_code);
 }
 
 TEST_F(CORSURLLoaderTest, CrossOriginRequestWithNoCORSMode) {
@@ -166,7 +166,7 @@
   EXPECT_FALSE(client().has_received_redirect());
   EXPECT_TRUE(client().has_received_response());
   EXPECT_TRUE(client().has_received_completion());
-  EXPECT_EQ(net::OK, client().status().error_code);
+  EXPECT_EQ(net::OK, client().completion_status().error_code);
 }
 
 TEST_F(CORSURLLoaderTest, CrossOriginRequestFetchRequestModeSameOrigin) {
@@ -182,10 +182,10 @@
   EXPECT_FALSE(IsNetworkLoaderStarted());
   EXPECT_FALSE(client().has_received_redirect());
   EXPECT_FALSE(client().has_received_response());
-  EXPECT_EQ(net::ERR_FAILED, client().status().error_code);
-  ASSERT_TRUE(client().status().cors_error_status);
+  EXPECT_EQ(net::ERR_FAILED, client().completion_status().error_code);
+  ASSERT_TRUE(client().completion_status().cors_error_status);
   EXPECT_EQ(network::mojom::CORSError::kDisallowedByMode,
-            client().status().cors_error_status->cors_error);
+            client().completion_status().cors_error_status->cors_error);
 }
 
 TEST_F(CORSURLLoaderTest, CrossOriginRequestWithCORSModeButMissingCORSHeader) {
@@ -201,10 +201,10 @@
   EXPECT_TRUE(IsNetworkLoaderStarted());
   EXPECT_FALSE(client().has_received_redirect());
   EXPECT_FALSE(client().has_received_response());
-  EXPECT_EQ(net::ERR_FAILED, client().status().error_code);
-  ASSERT_TRUE(client().status().cors_error_status);
+  EXPECT_EQ(net::ERR_FAILED, client().completion_status().error_code);
+  ASSERT_TRUE(client().completion_status().cors_error_status);
   EXPECT_EQ(network::mojom::CORSError::kMissingAllowOriginHeader,
-            client().status().cors_error_status->cors_error);
+            client().completion_status().cors_error_status->cors_error);
 }
 
 TEST_F(CORSURLLoaderTest, CrossOriginRequestWithCORSMode) {
@@ -222,7 +222,7 @@
   EXPECT_FALSE(client().has_received_redirect());
   EXPECT_TRUE(client().has_received_response());
   EXPECT_TRUE(client().has_received_completion());
-  EXPECT_EQ(net::OK, client().status().error_code);
+  EXPECT_EQ(net::OK, client().completion_status().error_code);
 }
 
 TEST_F(CORSURLLoaderTest,
@@ -240,10 +240,10 @@
   EXPECT_TRUE(IsNetworkLoaderStarted());
   EXPECT_FALSE(client().has_received_redirect());
   EXPECT_FALSE(client().has_received_response());
-  EXPECT_EQ(net::ERR_FAILED, client().status().error_code);
-  ASSERT_TRUE(client().status().cors_error_status);
+  EXPECT_EQ(net::ERR_FAILED, client().completion_status().error_code);
+  ASSERT_TRUE(client().completion_status().cors_error_status);
   EXPECT_EQ(network::mojom::CORSError::kAllowOriginMismatch,
-            client().status().cors_error_status->cors_error);
+            client().completion_status().cors_error_status->cors_error);
 }
 
 }  // namespace
diff --git a/content/renderer/loader/resource_dispatcher.cc b/content/renderer/loader/resource_dispatcher.cc
index 77eec19..dce3c4e 100644
--- a/content/renderer/loader/resource_dispatcher.cc
+++ b/content/renderer/loader/resource_dispatcher.cc
@@ -43,7 +43,7 @@
 #include "net/base/net_errors.h"
 #include "net/base/request_priority.h"
 #include "net/http/http_response_headers.h"
-#include "services/network/public/cpp/url_loader_status.h"
+#include "services/network/public/cpp/url_loader_completion_status.h"
 
 namespace content {
 
@@ -340,7 +340,7 @@
 
 void ResourceDispatcher::OnRequestComplete(
     int request_id,
-    const network::URLLoaderStatus& status) {
+    const network::URLLoaderCompletionStatus& status) {
   TRACE_EVENT0("loader", "ResourceDispatcher::OnRequestComplete");
 
   PendingRequestInfo* request_info = GetPendingRequestInfo(request_id);
@@ -369,7 +369,7 @@
   // TODO(kinuko): Revisit here. This probably needs to call request_info->peer
   // but the past attempt to change it seems to have caused crashes.
   // (crbug.com/547047)
-  network::URLLoaderStatus renderer_status(status);
+  network::URLLoaderCompletionStatus renderer_status(status);
   renderer_status.completion_time =
       ToRendererCompletionTime(*request_info, status.completion_time);
   peer->OnCompletedRequest(renderer_status);
@@ -775,7 +775,7 @@
 
   // Call OnComplete now too, as it won't get called on the client.
   // TODO(kinuko): Fill this properly.
-  network::URLLoaderStatus status;
+  network::URLLoaderCompletionStatus status;
   status.error_code = net::OK;
   status.exists_in_cache = false;
   status.completion_time = base::TimeTicks::Now();
diff --git a/content/renderer/loader/resource_dispatcher.h b/content/renderer/loader/resource_dispatcher.h
index 3c22cecb..e375ec6 100644
--- a/content/renderer/loader/resource_dispatcher.h
+++ b/content/renderer/loader/resource_dispatcher.h
@@ -39,7 +39,7 @@
 }
 
 namespace network {
-struct URLLoaderStatus;
+struct URLLoaderCompletionStatus;
 }
 
 namespace content {
@@ -242,7 +242,7 @@
                       int encoded_data_length);
   void OnDownloadedData(int request_id, int data_len, int encoded_data_length);
   void OnRequestComplete(int request_id,
-                         const network::URLLoaderStatus& status);
+                         const network::URLLoaderCompletionStatus& status);
 
   // Dispatch the message to one of the message response handlers.
   void DispatchMessage(const IPC::Message& message);
diff --git a/content/renderer/loader/resource_dispatcher_unittest.cc b/content/renderer/loader/resource_dispatcher_unittest.cc
index 972dccb..2c3009b 100644
--- a/content/renderer/loader/resource_dispatcher_unittest.cc
+++ b/content/renderer/loader/resource_dispatcher_unittest.cc
@@ -37,7 +37,7 @@
 #include "net/base/request_priority.h"
 #include "net/http/http_response_headers.h"
 #include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
-#include "services/network/public/cpp/url_loader_status.h"
+#include "services/network/public/cpp/url_loader_completion_status.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/WebKit/public/platform/WebReferrerPolicy.h"
 #include "url/gurl.h"
@@ -193,7 +193,7 @@
   }
 
   void NotifyRequestComplete(int request_id, size_t total_size) {
-    network::URLLoaderStatus status;
+    network::URLLoaderCompletionStatus status;
     status.error_code = net::OK;
     status.exists_in_cache = false;
     status.encoded_data_length = total_size;
@@ -426,7 +426,8 @@
     }
     void OnTransferSizeUpdated(int transfer_size_diff) override {}
 
-    void OnCompletedRequest(const network::URLLoaderStatus& status) override {
+    void OnCompletedRequest(
+        const network::URLLoaderCompletionStatus& status) override {
       original_peer_->OnReceivedResponse(response_info_);
       if (!data_.empty()) {
         original_peer_->OnReceivedData(
diff --git a/content/renderer/loader/sync_load_context.cc b/content/renderer/loader/sync_load_context.cc
index edd13b3d..b367bda 100644
--- a/content/renderer/loader/sync_load_context.cc
+++ b/content/renderer/loader/sync_load_context.cc
@@ -99,7 +99,7 @@
 void SyncLoadContext::OnTransferSizeUpdated(int transfer_size_diff) {}
 
 void SyncLoadContext::OnCompletedRequest(
-    const network::URLLoaderStatus& status) {
+    const network::URLLoaderCompletionStatus& status) {
   response_->error_code = status.error_code;
   if (status.cors_error_status)
     response_->cors_error = status.cors_error_status->cors_error;
diff --git a/content/renderer/loader/sync_load_context.h b/content/renderer/loader/sync_load_context.h
index 4df890d..d02549e 100644
--- a/content/renderer/loader/sync_load_context.h
+++ b/content/renderer/loader/sync_load_context.h
@@ -56,7 +56,8 @@
   void OnDownloadedData(int len, int encoded_data_length) override;
   void OnReceivedData(std::unique_ptr<ReceivedData> data) override;
   void OnTransferSizeUpdated(int transfer_size_diff) override;
-  void OnCompletedRequest(const network::URLLoaderStatus& status) override;
+  void OnCompletedRequest(
+      const network::URLLoaderCompletionStatus& status) override;
 
   // This raw pointer will remain valid for the lifetime of this object because
   // it remains on the stack until |event_| is signaled.
diff --git a/content/renderer/loader/test_request_peer.cc b/content/renderer/loader/test_request_peer.cc
index 6080915..70d16c1d 100644
--- a/content/renderer/loader/test_request_peer.cc
+++ b/content/renderer/loader/test_request_peer.cc
@@ -81,7 +81,7 @@
 }
 
 void TestRequestPeer::OnCompletedRequest(
-    const network::URLLoaderStatus& status) {
+    const network::URLLoaderCompletionStatus& status) {
   if (context_->cancelled)
     return;
   EXPECT_TRUE(context_->received_response);
diff --git a/content/renderer/loader/test_request_peer.h b/content/renderer/loader/test_request_peer.h
index b90d14a..4ff4a521 100644
--- a/content/renderer/loader/test_request_peer.h
+++ b/content/renderer/loader/test_request_peer.h
@@ -38,7 +38,8 @@
   void OnReceivedData(std::unique_ptr<ReceivedData> data) override;
   void OnTransferSizeUpdated(int transfer_size_diff) override;
   void OnReceivedCachedMetadata(const char* data, int len) override;
-  void OnCompletedRequest(const network::URLLoaderStatus& status) override;
+  void OnCompletedRequest(
+      const network::URLLoaderCompletionStatus& status) override;
 
   struct Context final {
     Context();
diff --git a/content/renderer/loader/url_loader_client_impl.cc b/content/renderer/loader/url_loader_client_impl.cc
index a4c48499..885b798 100644
--- a/content/renderer/loader/url_loader_client_impl.cc
+++ b/content/renderer/loader/url_loader_client_impl.cc
@@ -173,7 +173,8 @@
   body_consumer_->OnReadable(MOJO_RESULT_OK);
 }
 
-void URLLoaderClientImpl::OnComplete(const network::URLLoaderStatus& status) {
+void URLLoaderClientImpl::OnComplete(
+    const network::URLLoaderCompletionStatus& status) {
   if (!body_consumer_) {
     if (NeedsStoringMessage()) {
       StoreAndDispatch(ResourceMsg_RequestComplete(request_id_, status));
diff --git a/content/renderer/loader/url_loader_client_impl.h b/content/renderer/loader/url_loader_client_impl.h
index c2082a7..e474354 100644
--- a/content/renderer/loader/url_loader_client_impl.h
+++ b/content/renderer/loader/url_loader_client_impl.h
@@ -24,7 +24,7 @@
 }  // namespace net
 
 namespace network {
-struct URLLoaderStatus;
+struct URLLoaderCompletionStatus;
 }  // namespace network
 
 namespace content {
@@ -63,7 +63,7 @@
   void OnTransferSizeUpdated(int32_t transfer_size_diff) override;
   void OnStartLoadingResponseBody(
       mojo::ScopedDataPipeConsumerHandle body) override;
-  void OnComplete(const network::URLLoaderStatus& status) override;
+  void OnComplete(const network::URLLoaderCompletionStatus& status) override;
 
  private:
   bool NeedsStoringMessage() const;
diff --git a/content/renderer/loader/url_loader_client_impl_unittest.cc b/content/renderer/loader/url_loader_client_impl_unittest.cc
index 9c62c37..572a0cf 100644
--- a/content/renderer/loader/url_loader_client_impl_unittest.cc
+++ b/content/renderer/loader/url_loader_client_impl_unittest.cc
@@ -176,7 +176,7 @@
 
 TEST_F(URLLoaderClientImplTest, OnCompleteWithoutResponseBody) {
   ResourceResponseHead response_head;
-  network::URLLoaderStatus status;
+  network::URLLoaderCompletionStatus status;
 
   url_loader_client_->OnReceiveResponse(response_head, base::nullopt, nullptr);
   url_loader_client_->OnComplete(status);
@@ -190,7 +190,7 @@
 
 TEST_F(URLLoaderClientImplTest, OnCompleteWithResponseBody) {
   ResourceResponseHead response_head;
-  network::URLLoaderStatus status;
+  network::URLLoaderCompletionStatus status;
 
   url_loader_client_->OnReceiveResponse(response_head, base::nullopt, nullptr);
   mojo::DataPipe data_pipe(DataPipeOptions());
@@ -224,7 +224,7 @@
 // restore the order.
 TEST_F(URLLoaderClientImplTest, OnCompleteShouldBeTheLastMessage) {
   ResourceResponseHead response_head;
-  network::URLLoaderStatus status;
+  network::URLLoaderCompletionStatus status;
 
   url_loader_client_->OnReceiveResponse(response_head, base::nullopt, nullptr);
   mojo::DataPipe data_pipe(DataPipeOptions());
@@ -256,7 +256,7 @@
   request_peer_context_.cancel_on_receive_response = true;
 
   ResourceResponseHead response_head;
-  network::URLLoaderStatus status;
+  network::URLLoaderCompletionStatus status;
 
   url_loader_client_->OnReceiveResponse(response_head, base::nullopt, nullptr);
   mojo::DataPipe data_pipe(DataPipeOptions());
@@ -278,7 +278,7 @@
   request_peer_context_.cancel_on_receive_data = true;
 
   ResourceResponseHead response_head;
-  network::URLLoaderStatus status;
+  network::URLLoaderCompletionStatus status;
 
   mojo::DataPipe data_pipe(DataPipeOptions());
   uint32_t size = 5;
@@ -306,7 +306,7 @@
 
 TEST_F(URLLoaderClientImplTest, Defer) {
   ResourceResponseHead response_head;
-  network::URLLoaderStatus status;
+  network::URLLoaderCompletionStatus status;
 
   url_loader_client_->OnReceiveResponse(response_head, base::nullopt, nullptr);
   url_loader_client_->OnComplete(status);
@@ -331,7 +331,7 @@
 
 TEST_F(URLLoaderClientImplTest, DeferWithResponseBody) {
   ResourceResponseHead response_head;
-  network::URLLoaderStatus status;
+  network::URLLoaderCompletionStatus status;
 
   url_loader_client_->OnReceiveResponse(response_head, base::nullopt, nullptr);
   mojo::DataPipe data_pipe(DataPipeOptions());
@@ -372,7 +372,7 @@
 // we have a separate test.
 TEST_F(URLLoaderClientImplTest, DeferWithTransferSizeUpdated) {
   ResourceResponseHead response_head;
-  network::URLLoaderStatus status;
+  network::URLLoaderCompletionStatus status;
 
   url_loader_client_->OnReceiveResponse(response_head, base::nullopt, nullptr);
   mojo::DataPipe data_pipe(DataPipeOptions());
@@ -419,7 +419,7 @@
 
   net::RedirectInfo redirect_info;
   ResourceResponseHead response_head;
-  network::URLLoaderStatus status;
+  network::URLLoaderCompletionStatus status;
 
   url_loader_client_->OnReceiveRedirect(redirect_info, response_head);
   url_loader_client_->OnReceiveResponse(response_head, base::nullopt, nullptr);
@@ -481,7 +481,7 @@
   request_peer_context_.defer_on_transfer_size_updated = true;
 
   ResourceResponseHead response_head;
-  network::URLLoaderStatus status;
+  network::URLLoaderCompletionStatus status;
 
   url_loader_client_->OnReceiveResponse(response_head, base::nullopt, nullptr);
 
diff --git a/content/renderer/loader/url_response_body_consumer.cc b/content/renderer/loader/url_response_body_consumer.cc
index 975901b..0ffa014 100644
--- a/content/renderer/loader/url_response_body_consumer.cc
+++ b/content/renderer/loader/url_response_body_consumer.cc
@@ -12,7 +12,7 @@
 #include "content/public/renderer/request_peer.h"
 #include "content/renderer/loader/resource_dispatcher.h"
 #include "content/renderer/loader/site_isolation_stats_gatherer.h"
-#include "services/network/public/cpp/url_loader_status.h"
+#include "services/network/public/cpp/url_loader_completion_status.h"
 
 namespace content {
 
@@ -61,7 +61,7 @@
 URLResponseBodyConsumer::~URLResponseBodyConsumer() {}
 
 void URLResponseBodyConsumer::OnComplete(
-    const network::URLLoaderStatus& status) {
+    const network::URLLoaderCompletionStatus& status) {
   if (has_been_cancelled_)
     return;
   has_received_completion_ = true;
diff --git a/content/renderer/loader/url_response_body_consumer.h b/content/renderer/loader/url_response_body_consumer.h
index e11ae709..d99d257 100644
--- a/content/renderer/loader/url_response_body_consumer.h
+++ b/content/renderer/loader/url_response_body_consumer.h
@@ -21,7 +21,7 @@
 #include "mojo/public/cpp/system/simple_watcher.h"
 
 namespace network {
-struct URLLoaderStatus;
+struct URLLoaderCompletionStatus;
 }  // namespace network
 
 namespace content {
@@ -44,7 +44,7 @@
   // ResourceDispatcher when the both following conditions hold:
   //  1) This function has been called and the completion status is set, and
   //  2) All data is read from the handle.
-  void OnComplete(const network::URLLoaderStatus& status);
+  void OnComplete(const network::URLLoaderCompletionStatus& status);
 
   // Cancels watching the handle and dispatches an error to the
   // ResourceDispatcher. This function does nothing if the reading is already
@@ -79,7 +79,7 @@
   ResourceDispatcher* resource_dispatcher_;
   mojo::ScopedDataPipeConsumerHandle handle_;
   mojo::SimpleWatcher handle_watcher_;
-  network::URLLoaderStatus status_;
+  network::URLLoaderCompletionStatus status_;
   scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
 
   bool has_received_completion_ = false;
diff --git a/content/renderer/loader/url_response_body_consumer_unittest.cc b/content/renderer/loader/url_response_body_consumer_unittest.cc
index c527196..3b26571 100644
--- a/content/renderer/loader/url_response_body_consumer_unittest.cc
+++ b/content/renderer/loader/url_response_body_consumer_unittest.cc
@@ -20,7 +20,7 @@
 #include "content/renderer/loader/resource_dispatcher.h"
 #include "net/base/request_priority.h"
 #include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
-#include "services/network/public/cpp/url_loader_status.h"
+#include "services/network/public/cpp/url_loader_completion_status.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "url/gurl.h"
 #include "url/origin.h"
@@ -64,7 +64,8 @@
 
   void OnTransferSizeUpdated(int transfer_size_diff) override {}
 
-  void OnCompletedRequest(const network::URLLoaderStatus& status) override {
+  void OnCompletedRequest(
+      const network::URLLoaderCompletionStatus& status) override {
     EXPECT_FALSE(context_->complete);
     context_->complete = true;
     context_->error_code = status.error_code;
@@ -188,7 +189,7 @@
       message_loop_.task_runner()));
   consumer->ArmOrNotify();
 
-  consumer->OnComplete(network::URLLoaderStatus());
+  consumer->OnComplete(network::URLLoaderCompletionStatus());
   mojo::ScopedDataPipeProducerHandle writer =
       std::move(data_pipe.producer_handle);
   std::string buffer = "hello";
@@ -223,7 +224,7 @@
       message_loop_.task_runner()));
   consumer->ArmOrNotify();
 
-  consumer->OnComplete(network::URLLoaderStatus());
+  consumer->OnComplete(network::URLLoaderCompletionStatus());
   mojo::ScopedDataPipeProducerHandle writer =
       std::move(data_pipe.producer_handle);
   std::string buffer = "hello";
@@ -255,7 +256,7 @@
       message_loop_.task_runner()));
   consumer->ArmOrNotify();
 
-  network::URLLoaderStatus status;
+  network::URLLoaderCompletionStatus status;
   status.error_code = net::ERR_FAILED;
   data_pipe.producer_handle.reset();
   consumer->OnComplete(status);
diff --git a/content/renderer/loader/web_url_loader_impl.cc b/content/renderer/loader/web_url_loader_impl.cc
index f9f06d0..27b6dcae 100644
--- a/content/renderer/loader/web_url_loader_impl.cc
+++ b/content/renderer/loader/web_url_loader_impl.cc
@@ -410,7 +410,7 @@
   void OnReceivedData(std::unique_ptr<ReceivedData> data);
   void OnTransferSizeUpdated(int transfer_size_diff);
   void OnReceivedCachedMetadata(const char* data, int len);
-  void OnCompletedRequest(const network::URLLoaderStatus& status);
+  void OnCompletedRequest(const network::URLLoaderCompletionStatus& status);
 
  private:
   friend class base::RefCounted<Context>;
@@ -468,7 +468,8 @@
   void OnReceivedData(std::unique_ptr<ReceivedData> data) override;
   void OnTransferSizeUpdated(int transfer_size_diff) override;
   void OnReceivedCachedMetadata(const char* data, int len) override;
-  void OnCompletedRequest(const network::URLLoaderStatus& status) override;
+  void OnCompletedRequest(
+      const network::URLLoaderCompletionStatus& status) override;
 
  private:
   scoped_refptr<Context> context_;
@@ -881,7 +882,7 @@
 }
 
 void WebURLLoaderImpl::Context::OnCompletedRequest(
-    const network::URLLoaderStatus& status) {
+    const network::URLLoaderCompletionStatus& status) {
   int64_t total_transfer_size = status.encoded_data_length;
   int64_t encoded_body_size = status.encoded_body_length;
 
@@ -1017,7 +1018,7 @@
       OnReceivedData(std::make_unique<FixedReceivedData>(data.data(), size));
   }
 
-  network::URLLoaderStatus status(error_code);
+  network::URLLoaderCompletionStatus status(error_code);
   status.encoded_body_length = data.size();
   status.decoded_body_length = data.size();
   OnCompletedRequest(status);
@@ -1067,7 +1068,7 @@
 }
 
 void WebURLLoaderImpl::RequestPeerImpl::OnCompletedRequest(
-    const network::URLLoaderStatus& status) {
+    const network::URLLoaderCompletionStatus& status) {
   context_->OnCompletedRequest(status);
 }
 
diff --git a/content/renderer/loader/web_url_loader_impl_unittest.cc b/content/renderer/loader/web_url_loader_impl_unittest.cc
index 107f740..5b096cf 100644
--- a/content/renderer/loader/web_url_loader_impl_unittest.cc
+++ b/content/renderer/loader/web_url_loader_impl_unittest.cc
@@ -351,7 +351,7 @@
 
   void DoCompleteRequest() {
     EXPECT_FALSE(client()->did_finish());
-    network::URLLoaderStatus status(net::OK);
+    network::URLLoaderCompletionStatus status(net::OK);
     status.encoded_data_length = arraysize(kTestData);
     status.encoded_body_length = arraysize(kTestData);
     status.decoded_body_length = arraysize(kTestData);
@@ -363,7 +363,7 @@
 
   void DoFailRequest() {
     EXPECT_FALSE(client()->did_finish());
-    network::URLLoaderStatus status(net::ERR_FAILED);
+    network::URLLoaderCompletionStatus status(net::ERR_FAILED);
     status.encoded_data_length = arraysize(kTestData);
     status.encoded_body_length = arraysize(kTestData);
     status.decoded_body_length = arraysize(kTestData);
@@ -592,7 +592,7 @@
   // cancel in DoReceiveDataFtp, before the request finishes.
   client()->set_delete_on_receive_data();
 
-  network::URLLoaderStatus status(net::OK);
+  network::URLLoaderCompletionStatus status(net::OK);
   status.encoded_data_length = arraysize(kTestData);
   status.encoded_body_length = arraysize(kTestData);
   status.decoded_body_length = arraysize(kTestData);
diff --git a/content/renderer/service_worker/service_worker_context_client.cc b/content/renderer/service_worker/service_worker_context_client.cc
index a2900f8..8e3d49a 100644
--- a/content/renderer/service_worker/service_worker_context_client.cc
+++ b/content/renderer/service_worker/service_worker_context_client.cc
@@ -556,7 +556,7 @@
     MaybeReportResponseToClient();
   }
 
-  void OnComplete(const network::URLLoaderStatus& status) override {
+  void OnComplete(const network::URLLoaderCompletionStatus& status) override {
     if (status.error_code != net::OK) {
       std::string message;
       std::string unsanitized_message;
diff --git a/content/renderer/service_worker/service_worker_subresource_loader.cc b/content/renderer/service_worker/service_worker_subresource_loader.cc
index 75673d22..d0adb67 100644
--- a/content/renderer/service_worker/service_worker_subresource_loader.cc
+++ b/content/renderer/service_worker/service_worker_subresource_loader.cc
@@ -120,7 +120,7 @@
     url_loader_client_->OnStartLoadingResponseBody(std::move(body));
   }
 
-  void OnComplete(const network::URLLoaderStatus& status) override {
+  void OnComplete(const network::URLLoaderCompletionStatus& status) override {
     DCHECK(url_loader_client_.is_bound());
     url_loader_client_->OnComplete(status);
   }
@@ -440,7 +440,7 @@
   DCHECK_LT(status_, Status::kCompleted);
   DCHECK(url_loader_client_.is_bound());
   status_ = Status::kCompleted;
-  network::URLLoaderStatus status;
+  network::URLLoaderCompletionStatus status;
   status.error_code = error_code;
   status.completion_time = base::TimeTicks::Now();
   url_loader_client_->OnComplete(status);
@@ -539,7 +539,7 @@
 }
 
 void ServiceWorkerSubresourceLoader::OnComplete(
-    const network::URLLoaderStatus& status) {
+    const network::URLLoaderCompletionStatus& status) {
   DCHECK_EQ(Status::kSentHeader, status_);
   DCHECK(url_loader_client_.is_bound());
   status_ = Status::kCompleted;
diff --git a/content/renderer/service_worker/service_worker_subresource_loader.h b/content/renderer/service_worker/service_worker_subresource_loader.h
index 2bff883..6f52f4b 100644
--- a/content/renderer/service_worker/service_worker_subresource_loader.h
+++ b/content/renderer/service_worker/service_worker_subresource_loader.h
@@ -115,7 +115,7 @@
   void OnTransferSizeUpdated(int32_t transfer_size_diff) override;
   void OnStartLoadingResponseBody(
       mojo::ScopedDataPipeConsumerHandle body) override;
-  void OnComplete(const network::URLLoaderStatus& status) override;
+  void OnComplete(const network::URLLoaderCompletionStatus& status) override;
 
   ResourceResponseHead response_head_;
   base::Optional<net::RedirectInfo> redirect_info_;
diff --git a/content/renderer/service_worker/service_worker_subresource_loader_unittest.cc b/content/renderer/service_worker/service_worker_subresource_loader_unittest.cc
index 4882780..ebb4b79f 100644
--- a/content/renderer/service_worker/service_worker_subresource_loader_unittest.cc
+++ b/content/renderer/service_worker/service_worker_subresource_loader_unittest.cc
@@ -62,7 +62,7 @@
                                          MOJO_WRITE_DATA_FLAG_ALL_OR_NONE);
     client->OnStartLoadingResponseBody(std::move(data_pipe.consumer_handle));
 
-    network::URLLoaderStatus status;
+    network::URLLoaderCompletionStatus status;
     status.error_code = net::OK;
     client->OnComplete(status);
   }
@@ -391,7 +391,7 @@
   StartRequest(factory.get(), request, &loader, &client);
   client->RunUntilComplete();
 
-  EXPECT_EQ(net::ERR_FAILED, client->status().error_code);
+  EXPECT_EQ(net::ERR_FAILED, client->completion_status().error_code);
 }
 
 TEST_F(ServiceWorkerSubresourceLoaderTest, DropController) {
@@ -523,7 +523,7 @@
   // inflight fetch event.
   EXPECT_EQ(2, fake_container_host_.get_controller_service_worker_count());
   EXPECT_TRUE(client->has_received_completion());
-  EXPECT_EQ(net::ERR_FAILED, client->status().error_code);
+  EXPECT_EQ(net::ERR_FAILED, client->completion_status().error_code);
 }
 
 TEST_F(ServiceWorkerSubresourceLoaderTest, StreamResponse) {
@@ -569,7 +569,7 @@
   data_pipe.producer_handle.reset();
 
   client->RunUntilComplete();
-  EXPECT_EQ(net::OK, client->status().error_code);
+  EXPECT_EQ(net::OK, client->completion_status().error_code);
 
   // Test the body.
   std::string response;
@@ -616,7 +616,7 @@
   StartRequest(factory.get(), request, &loader, &client);
   client->RunUntilComplete();
 
-  EXPECT_EQ(net::ERR_FAILED, client->status().error_code);
+  EXPECT_EQ(net::ERR_FAILED, client->completion_status().error_code);
 }
 
 TEST_F(ServiceWorkerSubresourceLoaderTest, RedirectResponse) {
@@ -634,7 +634,7 @@
   StartRequest(factory.get(), request, &loader, &client);
   client->RunUntilRedirectReceived();
 
-  EXPECT_EQ(net::OK, client->status().error_code);
+  EXPECT_EQ(net::OK, client->completion_status().error_code);
   EXPECT_TRUE(client->has_received_redirect());
   {
     const net::RedirectInfo& redirect_info = client->redirect_info();
@@ -649,7 +649,7 @@
   loader->FollowRedirect();
   client->RunUntilRedirectReceived();
 
-  EXPECT_EQ(net::OK, client->status().error_code);
+  EXPECT_EQ(net::OK, client->completion_status().error_code);
   EXPECT_TRUE(client->has_received_redirect());
   {
     const net::RedirectInfo& redirect_info = client->redirect_info();
@@ -683,7 +683,7 @@
   data_pipe.producer_handle.reset();
 
   client->RunUntilComplete();
-  EXPECT_EQ(net::OK, client->status().error_code);
+  EXPECT_EQ(net::OK, client->completion_status().error_code);
 
   // Test the body.
   std::string response;
@@ -719,7 +719,7 @@
     client->RunUntilRedirectReceived();
 
     EXPECT_TRUE(client->has_received_redirect());
-    EXPECT_EQ(net::OK, client->status().error_code);
+    EXPECT_EQ(net::OK, client->completion_status().error_code);
     const net::RedirectInfo& redirect_info = client->redirect_info();
     EXPECT_EQ(302, redirect_info.status_code);
     EXPECT_EQ("GET", redirect_info.new_method);
@@ -737,7 +737,8 @@
 
   // Fetch can't follow the redirect response 21 times.
   EXPECT_FALSE(client->has_received_redirect());
-  EXPECT_EQ(net::ERR_TOO_MANY_REDIRECTS, client->status().error_code);
+  EXPECT_EQ(net::ERR_TOO_MANY_REDIRECTS,
+            client->completion_status().error_code);
 }
 
 // Test when the service worker responds with network fallback to CORS request.
diff --git a/extensions/browser/extension_protocols.cc b/extensions/browser/extension_protocols.cc
index 0c12e886..9a734d4 100644
--- a/extensions/browser/extension_protocols.cc
+++ b/extensions/browser/extension_protocols.cc
@@ -75,7 +75,7 @@
 #include "net/url_request/url_request_error_job.h"
 #include "net/url_request/url_request_file_job.h"
 #include "net/url_request/url_request_simple_job.h"
-#include "services/network/public/cpp/url_loader_status.h"
+#include "services/network/public/cpp/url_loader_completion_status.h"
 #include "url/url_util.h"
 
 using content::ResourceRequestInfo;
@@ -703,7 +703,8 @@
             util::IsIncognitoEnabled(extension_id, browser_context),
             registry->enabled_extensions(),
             *ProcessMap::Get(browser_context))) {
-      client->OnComplete(network::URLLoaderStatus(net::ERR_BLOCKED_BY_CLIENT));
+      client->OnComplete(
+          network::URLLoaderCompletionStatus(net::ERR_BLOCKED_BY_CLIENT));
       return;
     }
 
@@ -711,7 +712,7 @@
     if (!GetDirectoryForExtensionURL(request.url, extension_id, extension,
                                      registry->disabled_extensions(),
                                      &directory_path)) {
-      client->OnComplete(network::URLLoaderStatus(net::ERR_FAILED));
+      client->OnComplete(network::URLLoaderCompletionStatus(net::ERR_FAILED));
       return;
     }
 
@@ -746,13 +747,13 @@
       MojoResult result = pipe.producer_handle->WriteData(
           contents.data(), &size, MOJO_WRITE_DATA_FLAG_NONE);
       if (result != MOJO_RESULT_OK || size < contents.size()) {
-        client->OnComplete(network::URLLoaderStatus(net::ERR_FAILED));
+        client->OnComplete(network::URLLoaderCompletionStatus(net::ERR_FAILED));
         return;
       }
 
       client->OnReceiveResponse(head, base::nullopt, nullptr);
       client->OnStartLoadingResponseBody(std::move(pipe.consumer_handle));
-      client->OnComplete(network::URLLoaderStatus(net::OK));
+      client->OnComplete(network::URLLoaderCompletionStatus(net::OK));
       return;
     }
 
@@ -767,7 +768,8 @@
     // files there are internal implementation details that should not be
     // considered part of the extension.
     if (base::FilePath(kMetadataFolder).IsParent(relative_path)) {
-      client->OnComplete(network::URLLoaderStatus(net::ERR_FILE_NOT_FOUND));
+      client->OnComplete(
+          network::URLLoaderCompletionStatus(net::ERR_FILE_NOT_FOUND));
       return;
     }
 
@@ -788,7 +790,7 @@
         relative_path = base::FilePath::FromUTF8Unsafe(new_relative_path);
       } else {
         client->OnComplete(
-            network::URLLoaderStatus(net::ERR_BLOCKED_BY_CLIENT));
+            network::URLLoaderCompletionStatus(net::ERR_BLOCKED_BY_CLIENT));
         return;
       }
     }
diff --git a/gpu/tools/compositor_model_bench/compositor_model_bench.cc b/gpu/tools/compositor_model_bench/compositor_model_bench.cc
index d93841e..6b2ee21 100644
--- a/gpu/tools/compositor_model_bench/compositor_model_bench.cc
+++ b/gpu/tools/compositor_model_bench/compositor_model_bench.cc
@@ -13,9 +13,6 @@
 #include <sys/file.h>
 #include <sys/stat.h>
 #include <sys/types.h>
-#include <X11/keysym.h>
-#include <X11/Xlib.h>
-#include <X11/Xutil.h>
 
 #include <string>
 #include <utility>
@@ -37,6 +34,7 @@
 #include "gpu/tools/compositor_model_bench/render_model_utils.h"
 #include "gpu/tools/compositor_model_bench/render_models.h"
 #include "gpu/tools/compositor_model_bench/render_tree.h"
+#include "ui/gfx/x/x11.h"
 #include "ui/gl/init/gl_factory.h"
 
 using base::TimeTicks;
@@ -159,7 +157,7 @@
 
     // Get properties of the screen.
     int screen = DefaultScreen(display_);
-    int root_window = RootWindow(display_, screen);
+    int root_window = XRootWindow(display_, screen);
 
     // Creates the window.
     window_ = XCreateSimpleWindow(display_,
@@ -200,7 +198,7 @@
 
     for (int i = 0; i < visual_info_count && !gl_context_; ++i) {
       gl_context_ = glXCreateContext(display_, visual_info_list + i, 0,
-                                     True /* Direct rendering */);
+                                     x11::True /* Direct rendering */);
     }
 
     XFree(visual_info_list);
@@ -251,11 +249,8 @@
 
     XExposeEvent ev = { Expose, 0, 1, display_, window_,
                         0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, 0 };
-    XSendEvent(display_,
-      window_,
-      False,
-      ExposureMask,
-      reinterpret_cast<XEvent*>(&ev));
+    XSendEvent(display_, window_, x11::False, ExposureMask,
+               reinterpret_cast<XEvent*>(&ev));
 
     base::ThreadTaskRunnerHandle::Get()->PostTask(
         FROM_HERE,
diff --git a/headless/test/data/render/delayed_completion.html b/headless/test/data/render/delayed_completion.html
new file mode 100644
index 0000000..28caa2c7
--- /dev/null
+++ b/headless/test/data/render/delayed_completion.html
@@ -0,0 +1,13 @@
+<html>
+  <body>
+    <script type="text/javascript">
+      setTimeout(() => {
+        var div = document.getElementById("content");
+        var p = document.createElement("p");
+        p.textContent = "delayed text";
+        div.appendChild(p);
+      }, 3000);
+    </script>
+  </body>
+  <div id="content"/>
+</html>
diff --git a/headless/test/headless_render_browsertest.cc b/headless/test/headless_render_browsertest.cc
index 7228adc..0250a791 100644
--- a/headless/test/headless_render_browsertest.cc
+++ b/headless/test/headless_render_browsertest.cc
@@ -14,6 +14,10 @@
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
+#define HEADLESS_RENDER_BROWSERTEST(clazz)                  \
+  class HeadlessRenderBrowserTest##clazz : public clazz {}; \
+  HEADLESS_ASYNC_DEVTOOLED_TEST_F(HeadlessRenderBrowserTest##clazz)
+
 namespace headless {
 
 namespace {
@@ -46,21 +50,6 @@
 bool IsText(const DOMNode& node) {
   return HasType(3, node);
 }
-bool IsTagWithName(const char* name, const DOMNode& node) {
-  return IsTag(node) && HasName(name, node);
-}
-
-std::vector<std::string> Structure(const GetSnapshotResult* snapshot) {
-  return ElementsView<std::string, DOMNode>(
-      *snapshot->GetDomNodes(), IsTag,
-      [](const auto& node) { return node.GetNodeName(); });
-}
-
-std::vector<std::string> Contents(const GetSnapshotResult* snapshot) {
-  return ElementsView<std::string, DOMNode>(
-      *snapshot->GetDomNodes(), IsText,
-      [](const auto& node) { return node.GetNodeValue(); });
-}
 
 std::vector<std::string> TextLayout(const GetSnapshotResult* snapshot) {
   return ElementsView<std::string, LayoutTreeNode>(
@@ -76,6 +65,13 @@
       *snapshot->GetDomNodes(), filter, [](const auto& n) { return &n; });
 }
 
+std::vector<const DOMNode*> FindTags(const GetSnapshotResult* snapshot,
+                                     const char* name = nullptr) {
+  return FilterDOM(snapshot, [name](const auto& n) {
+    return IsTag(n) && (!name || HasName(name, n));
+  });
+}
+
 size_t IndexInDOM(const GetSnapshotResult* snapshot, const DOMNode* node) {
   for (size_t i = 0; i < snapshot->GetDomNodes()->size(); ++i) {
     if (snapshot->GetDomNodes()->at(i).get() == node)
@@ -113,57 +109,54 @@
 class HelloWorldTest : public HeadlessRenderTest {
  private:
   GURL GetPageUrl(HeadlessDevToolsClient* client) override {
-    return embedded_test_server()->GetURL("/hello.html");
+    return GetURL("/hello.html");
   }
 
   void VerifyDom(GetSnapshotResult* dom_snapshot) override {
-    EXPECT_THAT(Structure(dom_snapshot),
-                ElementsAre("HTML", "HEAD", "BODY", "H1"));
-    EXPECT_THAT(Contents(dom_snapshot),
-                ElementsAre("Hello headless world!", "\n"));
+    EXPECT_THAT(FindTags(dom_snapshot),
+                ElementsAre(NodeName("HTML"), NodeName("HEAD"),
+                            NodeName("BODY"), NodeName("H1")));
+    EXPECT_THAT(
+        FilterDOM(dom_snapshot, IsText),
+        ElementsAre(NodeValue("Hello headless world!"), NodeValue("\n")));
     EXPECT_THAT(TextLayout(dom_snapshot), ElementsAre("Hello headless world!"));
-    AllDone();
   }
 };
-HEADLESS_ASYNC_DEVTOOLED_TEST_F(HelloWorldTest);
+HEADLESS_RENDER_BROWSERTEST(HelloWorldTest);
 
 class TimeoutTest : public HeadlessRenderTest {
  private:
+  void OnPageRenderCompleted() override {
+    // Never complete.
+  }
+
   GURL GetPageUrl(HeadlessDevToolsClient* client) override {
-    base::RunLoop run_loop;
-    client->GetPage()->Disable(run_loop.QuitClosure());
-    base::MessageLoop::ScopedNestableTaskAllower nest_loop(
-        base::MessageLoop::current());
-    run_loop.Run();
-    return embedded_test_server()->GetURL("/hello.html");
+    return GetURL("/hello.html");
   }
 
   void VerifyDom(GetSnapshotResult* dom_snapshot) override {
     FAIL() << "Should not reach here";
   }
 
-  void OnTimeout() override { AllDone(); }
+  void OnTimeout() override { SetTestCompleted(); }
 };
-HEADLESS_ASYNC_DEVTOOLED_TEST_F(TimeoutTest);
+HEADLESS_RENDER_BROWSERTEST(TimeoutTest);
 
 class JavaScriptOverrideTitle_JsEnabled : public HeadlessRenderTest {
  private:
   GURL GetPageUrl(HeadlessDevToolsClient* client) override {
-    return embedded_test_server()->GetURL(
-        "/render/javascript_override_title.html");
+    return GetURL("/render/javascript_override_title.html");
   }
 
   void VerifyDom(GetSnapshotResult* dom_snapshot) override {
-    auto dom = FilterDOM(
-        dom_snapshot, [](const auto& n) { return IsTagWithName("TITLE", n); });
+    auto dom = FindTags(dom_snapshot, "TITLE");
     ASSERT_THAT(dom, ElementsAre(NodeName("TITLE")));
     size_t pos = IndexInDOM(dom_snapshot, dom[0]);
     const DOMNode* value = GetAt(dom_snapshot, pos + 1);
     EXPECT_THAT(value, NodeValue("JavaScript is on"));
-    AllDone();
   }
 };
-HEADLESS_ASYNC_DEVTOOLED_TEST_F(JavaScriptOverrideTitle_JsEnabled);
+HEADLESS_RENDER_BROWSERTEST(JavaScriptOverrideTitle_JsEnabled);
 
 class JavaScriptOverrideTitle_JsDisabled : public HeadlessRenderTest {
  private:
@@ -173,21 +166,18 @@
   }
 
   GURL GetPageUrl(HeadlessDevToolsClient* client) override {
-    return embedded_test_server()->GetURL(
-        "/render/javascript_override_title.html");
+    return GetURL("/render/javascript_override_title.html");
   }
 
   void VerifyDom(GetSnapshotResult* dom_snapshot) override {
-    auto dom = FilterDOM(
-        dom_snapshot, [](const auto& n) { return IsTagWithName("TITLE", n); });
+    auto dom = FindTags(dom_snapshot, "TITLE");
     ASSERT_THAT(dom, ElementsAre(NodeName("TITLE")));
     size_t pos = IndexInDOM(dom_snapshot, dom[0]);
     const DOMNode* value = GetAt(dom_snapshot, pos + 1);
     EXPECT_THAT(value, NodeValue("JavaScript is off"));
-    AllDone();
   }
 };
-HEADLESS_ASYNC_DEVTOOLED_TEST_F(JavaScriptOverrideTitle_JsDisabled);
+HEADLESS_RENDER_BROWSERTEST(JavaScriptOverrideTitle_JsDisabled);
 
 class JavaScriptConsoleErrors : public HeadlessRenderTest,
                                 public runtime::ExperimentalObserver {
@@ -204,7 +194,7 @@
     base::MessageLoop::ScopedNestableTaskAllower nest_loop(
         base::MessageLoop::current());
     run_loop.Run();
-    return embedded_test_server()->GetURL("/render/console_errors.html");
+    return GetURL("/render/console_errors.html");
   }
 
   void OnConsoleAPICalled(
@@ -229,9 +219,36 @@
                             StartsWith("Uncaught ReferenceError: func1"),
                             StartsWith("Uncaught ReferenceError: func2"),
                             StartsWith("Uncaught ReferenceError: func3")));
-    AllDone();
   }
 };
-HEADLESS_ASYNC_DEVTOOLED_TEST_F(JavaScriptConsoleErrors);
+HEADLESS_RENDER_BROWSERTEST(JavaScriptConsoleErrors);
+
+class DelayedCompletion : public HeadlessRenderTest {
+ private:
+  base::TimeTicks start_;
+
+  GURL GetPageUrl(HeadlessDevToolsClient* client) override {
+    start_ = base::TimeTicks::Now();
+    return GetURL("/render/delayed_completion.html");
+  }
+
+  void VerifyDom(GetSnapshotResult* dom_snapshot) override {
+    base::TimeTicks end = base::TimeTicks::Now();
+    EXPECT_THAT(
+        FindTags(dom_snapshot),
+        ElementsAre(NodeName("HTML"), NodeName("HEAD"), NodeName("BODY"),
+                    NodeName("SCRIPT"), NodeName("DIV"), NodeName("P")));
+    auto dom = FindTags(dom_snapshot, "P");
+    ASSERT_THAT(dom, ElementsAre(NodeName("P")));
+    size_t pos = IndexInDOM(dom_snapshot, dom[0]);
+    const DOMNode* value = GetAt(dom_snapshot, pos + 1);
+    EXPECT_THAT(value, NodeValue("delayed text"));
+    // The page delays output for 3 seconds. Due to virtual time this should
+    // take significantly less actual time.
+    base::TimeDelta passed = end - start_;
+    EXPECT_THAT(passed.InSecondsF(), testing::Le(2.9f));
+  }
+};
+HEADLESS_RENDER_BROWSERTEST(DelayedCompletion);
 
 }  // namespace headless
diff --git a/headless/test/headless_render_test.cc b/headless/test/headless_render_test.cc
index 1934b17..0f7412b 100644
--- a/headless/test/headless_render_test.cc
+++ b/headless/test/headless_render_test.cc
@@ -6,30 +6,39 @@
 
 #include "headless/public/devtools/domains/dom_snapshot.h"
 #include "headless/public/headless_devtools_client.h"
+#include "headless/public/util/virtual_time_controller.h"
 #include "net/url_request/url_request.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace headless {
 
+namespace {
+void SetVirtualTimePolicyDoneCallback(
+    base::RunLoop* run_loop,
+    std::unique_ptr<emulation::SetVirtualTimePolicyResult>) {
+  run_loop->Quit();
+}
+}  // namespace
+
 HeadlessRenderTest::HeadlessRenderTest() : weak_ptr_factory_(this) {}
 
 HeadlessRenderTest::~HeadlessRenderTest() {}
 
 void HeadlessRenderTest::PostRunAsynchronousTest() {
   // Make sure the test did complete.
-  EXPECT_TRUE(done_called_) << "The test did not finish. AllDone() not called.";
+  EXPECT_EQ(FINISHED, state_) << "The test did not finish.";
 }
 
 void HeadlessRenderTest::RunDevTooledTest() {
   EXPECT_TRUE(embedded_test_server()->Start());
-  base::RunLoop run_loop;
+
+  virtual_time_controller_ =
+      std::make_unique<VirtualTimeController>(devtools_client_.get());
+
   devtools_client_->GetPage()->GetExperimental()->AddObserver(this);
   devtools_client_->GetNetwork()->GetExperimental()->AddObserver(this);
-  devtools_client_->GetPage()->Enable(run_loop.QuitClosure());
-  base::MessageLoop::ScopedNestableTaskAllower nest_loop(
-      base::MessageLoop::current());
-  run_loop.Run();
-  devtools_client_->GetNetwork()->Enable();
+  devtools_client_->GetPage()->Enable(Sync());
+  devtools_client_->GetNetwork()->Enable(Sync());
 
   std::unique_ptr<headless::network::RequestPattern> match_all =
       headless::network::RequestPattern::Builder().SetUrlPattern("*").Build();
@@ -41,16 +50,34 @@
           .Build());
 
   GURL url = GetPageUrl(devtools_client_.get());
+
+  // Pause virtual time until we actually start loading content.
+  {
+    base::RunLoop run_loop;
+    devtools_client_->GetEmulation()->GetExperimental()->SetVirtualTimePolicy(
+        emulation::SetVirtualTimePolicyParams::Builder()
+            .SetPolicy(emulation::VirtualTimePolicy::PAUSE)
+            .Build(),
+        base::Bind(&SetVirtualTimePolicyDoneCallback, &run_loop));
+    base::MessageLoop::ScopedNestableTaskAllower nest_loop(
+        base::MessageLoop::current());
+    run_loop.Run();
+  }
+
+  state_ = STARTING;
   devtools_client_->GetPage()->Navigate(url.spec());
   browser()->BrowserMainThread()->PostDelayedTask(
       FROM_HERE,
       base::Bind(&HeadlessRenderTest::HandleTimeout,
                  weak_ptr_factory_.GetWeakPtr()),
       base::TimeDelta::FromSeconds(10));
+
+  // The caller will loop until FinishAsynchronousTest() is called either
+  // from OnGetDomSnapshotDone() or from HandleTimeout().
 }
 
 void HeadlessRenderTest::OnTimeout() {
-  FAIL() << "Renderer timeout";
+  ADD_FAILURE() << "Rendering timed out!";
 }
 
 void HeadlessRenderTest::CustomizeHeadlessBrowserContext(
@@ -71,14 +98,15 @@
                                           bool canceled_by_devtools) {
   if (canceled_by_devtools)
     return;
-  FAIL() << "Network request failed: " << net_error << " for "
-         << request->url().spec();
+  ADD_FAILURE() << "Network request failed: " << net_error << " for "
+                << request->url().spec();
 }
 
 void HeadlessRenderTest::OnRequestIntercepted(
     const network::RequestInterceptedParams& params) {
+  CHECK_NE(INIT, state_);
   if (params.GetIsNavigationRequest())
-    navigation_requested_ = true;
+    navigation_performed_ = true;
   requests_.push_back(params.Clone());
   // Allow the navigation to proceed.
   devtools_client_->GetNetwork()->GetExperimental()->ContinueInterceptedRequest(
@@ -87,8 +115,33 @@
           .Build());
 }
 
-void HeadlessRenderTest::OnLoadEventFired(
-    const page::LoadEventFiredParams& params) {
+void HeadlessRenderTest::OnLoadEventFired(const page::LoadEventFiredParams&) {
+  CHECK_NE(INIT, state_);
+  if (state_ == LOADING || state_ == STARTING) {
+    state_ = RENDERING;
+  }
+}
+
+void HeadlessRenderTest::OnFrameStartedLoading(
+    const page::FrameStartedLoadingParams&) {
+  CHECK_NE(INIT, state_);
+  if (state_ == STARTING) {
+    state_ = LOADING;
+    virtual_time_controller_->GrantVirtualTimeBudget(
+        emulation::VirtualTimePolicy::PAUSE_IF_NETWORK_FETCHES_PENDING, 5000,
+        base::Closure(),
+        base::Bind(&HeadlessRenderTest::HandleVirtualTimeExhausted,
+                   weak_ptr_factory_.GetWeakPtr()));
+  }
+}
+
+void HeadlessRenderTest::OnPageRenderCompleted() {
+  CHECK(navigation_performed_);
+  CHECK_GE(state_, LOADING);
+  if (state_ >= DONE)
+    return;
+  state_ = DONE;
+
   devtools_client_->GetDOMSnapshot()->GetExperimental()->GetSnapshot(
       dom_snapshot::GetSnapshotParams::Builder()
           .SetComputedStyleWhitelist(std::vector<std::string>())
@@ -97,19 +150,25 @@
                  weak_ptr_factory_.GetWeakPtr()));
 }
 
+void HeadlessRenderTest::HandleVirtualTimeExhausted() {
+  if (state_ < DONE) {
+    OnPageRenderCompleted();
+  }
+}
+
 void HeadlessRenderTest::OnGetDomSnapshotDone(
     std::unique_ptr<dom_snapshot::GetSnapshotResult> result) {
-  EXPECT_TRUE(navigation_requested_);
+  CHECK_EQ(DONE, state_);
+  state_ = FINISHED;
+  FinishAsynchronousTest();
   VerifyDom(result.get());
-  if (done_called_)
-    FinishAsynchronousTest();
 }
 
 void HeadlessRenderTest::HandleTimeout() {
-  if (!done_called_)
+  if (state_ != FINISHED) {
+    FinishAsynchronousTest();
     OnTimeout();
-  EXPECT_TRUE(done_called_);
-  FinishAsynchronousTest();
+  }
 }
 
 }  // namespace headless
diff --git a/headless/test/headless_render_test.h b/headless/test/headless_render_test.h
index 0b661e1..cc8f005 100644
--- a/headless/test/headless_render_test.h
+++ b/headless/test/headless_render_test.h
@@ -9,6 +9,7 @@
 #include <string>
 
 #include "base/macros.h"
+#include "headless/public/devtools/domains/emulation.h"
 #include "headless/public/devtools/domains/network.h"
 #include "headless/public/devtools/domains/page.h"
 #include "headless/public/headless_browser.h"
@@ -19,6 +20,7 @@
 
 namespace headless {
 class HeadlessDevToolsClient;
+class VirtualTimeController;
 namespace dom_snapshot {
 class GetSnapshotResult;
 }  // namespace dom_snapshot
@@ -32,16 +34,39 @@
   void RunDevTooledTest() override;
 
  protected:
+  // Automatically waits in destructor until callback is called.
+  class Sync {
+   public:
+    Sync() {}
+    ~Sync() {
+      base::MessageLoop::ScopedNestableTaskAllower nest_loop(
+          base::MessageLoop::current());
+      run_loop.Run();
+    }
+    operator base::Closure() { return run_loop.QuitClosure(); }
+
+   private:
+    base::RunLoop run_loop;
+    DISALLOW_COPY_AND_ASSIGN(Sync);
+  };
+
   HeadlessRenderTest();
   ~HeadlessRenderTest() override;
 
+  void SetTestCompleted() { state_ = FINISHED; }
+  GURL GetURL(const std::string& path) const {
+    return embedded_test_server()->GetURL(path);
+  }
+
   void PostRunAsynchronousTest() override;
 
   virtual GURL GetPageUrl(HeadlessDevToolsClient* client) = 0;
   virtual void VerifyDom(dom_snapshot::GetSnapshotResult* dom_snapshot) = 0;
+
+  virtual void OnPageRenderCompleted();
   virtual void OnTimeout();
+
   virtual void OverrideWebPreferences(WebPreferences* preferences);
-  void AllDone() { done_called_ = true; }
 
   void CustomizeHeadlessBrowserContext(
       HeadlessBrowserContext::Builder& builder) override;
@@ -53,6 +78,8 @@
 
   // page::ExperimentalObserver implementation:
   void OnLoadEventFired(const page::LoadEventFiredParams& params) override;
+  void OnFrameStartedLoading(
+      const page::FrameStartedLoadingParams& params) override;
 
   // network::ExperimentalObserver
   void OnRequestIntercepted(
@@ -61,12 +88,23 @@
   std::vector<std::unique_ptr<network::RequestInterceptedParams>> requests_;
 
  private:
+  void HandleVirtualTimeExhausted();
   void OnGetDomSnapshotDone(
       std::unique_ptr<dom_snapshot::GetSnapshotResult> result);
   void HandleTimeout();
 
-  bool navigation_requested_ = false;
-  bool done_called_ = false;
+  enum State {
+    INIT,       // Setting up the client, no navigation performed yet.
+    STARTING,   // Navigation request issued but URL not being loaded yet.
+    LOADING,    // URL was requested but resources are not fully loaded yet.
+    RENDERING,  // Main resources were loaded but page is still being rendered.
+    DONE,       // Page considered to be fully rendered.
+    FINISHED,   // Test has finished.
+  };
+  State state_ = INIT;
+
+  std::unique_ptr<VirtualTimeController> virtual_time_controller_;
+  bool navigation_performed_ = false;
 
   base::WeakPtrFactory<HeadlessRenderTest> weak_ptr_factory_;
 
diff --git a/ios/chrome/app/spotlight/BUILD.gn b/ios/chrome/app/spotlight/BUILD.gn
index dde51d7..721505b 100644
--- a/ios/chrome/app/spotlight/BUILD.gn
+++ b/ios/chrome/app/spotlight/BUILD.gn
@@ -29,11 +29,11 @@
     "//ios/chrome/app/strings",
     "//ios/chrome/browser",
     "//ios/chrome/browser/bookmarks",
+    "//ios/chrome/browser/content_suggestions",
     "//ios/chrome/browser/favicon",
     "//ios/chrome/browser/history",
     "//ios/chrome/browser/suggestions",
     "//ios/chrome/browser/sync",
-    "//ios/chrome/browser/ui/ntp:ntp_internal",
     "//ios/chrome/common/app_group",
     "//ios/public/provider/chrome/browser",
     "//ios/public/provider/chrome/browser/spotlight",
diff --git a/ios/chrome/app/spotlight/topsites_spotlight_manager.mm b/ios/chrome/app/spotlight/topsites_spotlight_manager.mm
index 7cc1cf2..36a7288 100644
--- a/ios/chrome/app/spotlight/topsites_spotlight_manager.mm
+++ b/ios/chrome/app/spotlight/topsites_spotlight_manager.mm
@@ -15,12 +15,12 @@
 #include "components/history/core/browser/top_sites_observer.h"
 #include "components/suggestions/suggestions_service.h"
 #include "ios/chrome/browser/bookmarks/bookmark_model_factory.h"
+#import "ios/chrome/browser/content_suggestions/content_suggestions_mediator.h"
 #include "ios/chrome/browser/favicon/ios_chrome_large_icon_service_factory.h"
 #include "ios/chrome/browser/history/top_sites_factory.h"
 #include "ios/chrome/browser/suggestions/suggestions_service_factory.h"
 #include "ios/chrome/browser/sync/ios_chrome_profile_sync_service_factory.h"
 #include "ios/chrome/browser/sync/sync_observer_bridge.h"
-#include "ios/chrome/browser/ui/ntp/google_landing_mediator.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
@@ -239,7 +239,7 @@
 - (void)onMostVisitedURLsAvailable:
     (const history::MostVisitedURLList&)top_sites {
   NSUInteger sitesToIndex =
-      MIN(top_sites.size(), [GoogleLandingMediator maxSitesShown]);
+      MIN(top_sites.size(), [ContentSuggestionsMediator maxSitesShown]);
   for (size_t i = 0; i < sitesToIndex; i++) {
     const GURL& URL = top_sites[i].url;
 
@@ -257,7 +257,8 @@
     (const suggestions::SuggestionsProfile&)suggestionsProfile {
   size_t size = suggestionsProfile.suggestions_size();
   if (size) {
-    NSUInteger sitesToIndex = MIN(size, [GoogleLandingMediator maxSitesShown]);
+    NSUInteger sitesToIndex =
+        MIN(size, [ContentSuggestionsMediator maxSitesShown]);
     for (size_t i = 0; i < sitesToIndex; i++) {
       const suggestions::ChromeSuggestion& suggestion =
           suggestionsProfile.suggestions(i);
diff --git a/ios/chrome/browser/content_suggestions/content_suggestions_coordinator.mm b/ios/chrome/browser/content_suggestions/content_suggestions_coordinator.mm
index 3994ad98..faec047 100644
--- a/ios/chrome/browser/content_suggestions/content_suggestions_coordinator.mm
+++ b/ios/chrome/browser/content_suggestions/content_suggestions_coordinator.mm
@@ -134,6 +134,9 @@
   self.contentSuggestionsMediator.commandHandler = self.NTPMediator;
   self.contentSuggestionsMediator.headerProvider = self.headerController;
 
+  self.headerController.promoCanShow =
+      [self.contentSuggestionsMediator notificationPromo]->CanShow();
+
   self.metricsRecorder = [[ContentSuggestionsMetricsRecorder alloc] init];
   self.metricsRecorder.delegate = self.contentSuggestionsMediator;
 
diff --git a/ios/chrome/browser/content_suggestions/content_suggestions_header_view_controller.h b/ios/chrome/browser/content_suggestions/content_suggestions_header_view_controller.h
index 1f8f557..f276265 100644
--- a/ios/chrome/browser/content_suggestions/content_suggestions_header_view_controller.h
+++ b/ios/chrome/browser/content_suggestions/content_suggestions_header_view_controller.h
@@ -43,6 +43,9 @@
 // Whether the Google logo or doodle is being shown.
 @property(nonatomic, assign) BOOL logoIsShowing;
 
+// |YES| if a what's new promo can be displayed.
+@property(nonatomic, assign) BOOL promoCanShow;
+
 // |YES| if its view is visible.  When set to |NO| various UI updates are
 // ignored.
 @property(nonatomic, assign) BOOL isShowing;
diff --git a/ios/chrome/browser/content_suggestions/content_suggestions_header_view_controller.mm b/ios/chrome/browser/content_suggestions/content_suggestions_header_view_controller.mm
index cda469b2..7975dd8c 100644
--- a/ios/chrome/browser/content_suggestions/content_suggestions_header_view_controller.mm
+++ b/ios/chrome/browser/content_suggestions/content_suggestions_header_view_controller.mm
@@ -45,9 +45,6 @@
 // |YES| if this consumer is has voice search enabled.
 @property(nonatomic, assign) BOOL voiceSearchIsEnabled;
 
-// |YES| if a what's new promo can be displayed.
-@property(nonatomic, assign) BOOL promoCanShow;
-
 // Exposes view and methods to drive the doodle.
 @property(nonatomic, weak) id<LogoVendor> logoVendor;
 
@@ -59,13 +56,6 @@
 // pushed into the header view.
 @property(nonatomic, assign) BOOL canGoBack;
 
-// Gets the icon of a what's new promo.
-// TODO(crbug.com/694750): This should not be WhatsNewIcon.
-@property(nonatomic, assign) WhatsNewIcon promoIcon;
-
-// Gets the text of a what's new promo.
-@property(nonatomic, copy) NSString* promoText;
-
 // The number of tabs to show in the google landing fake toolbar.
 @property(nonatomic, assign) int tabCount;
 
@@ -94,8 +84,6 @@
 @synthesize promoCanShow = _promoCanShow;
 @synthesize canGoForward = _canGoForward;
 @synthesize canGoBack = _canGoBack;
-@synthesize promoIcon = _promoIcon;
-@synthesize promoText = _promoText;
 @synthesize isShowing = _isShowing;
 @synthesize omniboxFocused = _omniboxFocused;
 @synthesize tabCount = _tabCount;
@@ -394,18 +382,6 @@
   [self updateLogoAndFakeboxDisplay];
 }
 
-- (void)setMaximumMostVisitedSitesShown:
-    (NSUInteger)maximumMostVisitedSitesShown {
-}
-
-- (void)mostVisitedDataUpdated {
-  // Do nothing as it is handled in the ContentSuggestionsMediator.
-}
-
-- (void)mostVisitedIconMadeAvailableAtIndex:(NSUInteger)index {
-  // Do nothing as it is handled in the ContentSuggestionsMediator.
-}
-
 - (void)setTabCount:(int)tabCount {
   _tabCount = tabCount;
   [self.headerView setToolbarTabCount:tabCount];
diff --git a/ios/chrome/browser/content_suggestions/content_suggestions_mediator.h b/ios/chrome/browser/content_suggestions/content_suggestions_mediator.h
index 35abe31..f60d97fc 100644
--- a/ios/chrome/browser/content_suggestions/content_suggestions_mediator.h
+++ b/ios/chrome/browser/content_suggestions/content_suggestions_mediator.h
@@ -73,6 +73,9 @@
 // Whitelists the URL from the Most Visited sites.
 - (void)whitelistMostVisitedURL:(GURL)URL;
 
+// Get the maximum number of sites shown.
++ (NSUInteger)maxSitesShown;
+
 @end
 
 #endif  // IOS_CHROME_BROWSER_CONTENT_SUGGESTIONS_CONTENT_SUGGESTIONS_MEDIATOR_H_
diff --git a/ios/chrome/browser/content_suggestions/content_suggestions_mediator.mm b/ios/chrome/browser/content_suggestions/content_suggestions_mediator.mm
index 361819f..bf19030f 100644
--- a/ios/chrome/browser/content_suggestions/content_suggestions_mediator.mm
+++ b/ios/chrome/browser/content_suggestions/content_suggestions_mediator.mm
@@ -175,6 +175,10 @@
   self.faviconMediator.dataSink = dataSink;
 }
 
++ (NSUInteger)maxSitesShown {
+  return kMaxNumMostVisitedTiles;
+}
+
 #pragma mark - ContentSuggestionsDataSource
 
 - (NSArray<ContentSuggestionsSectionInformation*>*)sectionsInfo {
diff --git a/ios/chrome/browser/ui/browser_list/browser_list_session_service_impl.mm b/ios/chrome/browser/ui/browser_list/browser_list_session_service_impl.mm
index 819d1a5..5d71807 100644
--- a/ios/chrome/browser/ui/browser_list/browser_list_session_service_impl.mm
+++ b/ios/chrome/browser/ui/browser_list/browser_list_session_service_impl.mm
@@ -10,6 +10,7 @@
 #include "base/callback.h"
 #include "base/logging.h"
 #include "base/memory/ptr_util.h"
+#include "base/scoped_observer.h"
 #include "ios/chrome/browser/chrome_url_constants.h"
 #import "ios/chrome/browser/sessions/session_ios.h"
 #import "ios/chrome/browser/sessions/session_service_ios.h"
@@ -31,54 +32,12 @@
 
 namespace {
 
-// BrowserListSessionServiceWebStateObserver observes a WebState and invokes
-// |closure| when a new navigation item is committed.
-class BrowserListSessionServiceWebStateObserver : public web::WebStateObserver {
- public:
-  explicit BrowserListSessionServiceWebStateObserver(
-      const base::RepeatingClosure& closure);
-  ~BrowserListSessionServiceWebStateObserver() override;
-
-  // Changes the observed WebState to |web_state|.
-  void ObserveWebState(web::WebState* web_state);
-
-  // web::WebStateObserver implementation.
-  void NavigationItemCommitted(
-      web::WebState* web_state,
-      const web::LoadCommittedDetails& load_details) override;
-
- private:
-  base::RepeatingClosure closure_;
-
-  DISALLOW_COPY_AND_ASSIGN(BrowserListSessionServiceWebStateObserver);
-};
-
-BrowserListSessionServiceWebStateObserver::
-    BrowserListSessionServiceWebStateObserver(
-        const base::RepeatingClosure& closure)
-    : WebStateObserver(), closure_(closure) {
-  DCHECK(!closure_.is_null());
-}
-
-BrowserListSessionServiceWebStateObserver::
-    ~BrowserListSessionServiceWebStateObserver() = default;
-
-void BrowserListSessionServiceWebStateObserver::ObserveWebState(
-    web::WebState* web_state) {
-  WebStateObserver::Observe(web_state);
-}
-
-void BrowserListSessionServiceWebStateObserver::NavigationItemCommitted(
-    web::WebState* web_state,
-    const web::LoadCommittedDetails& load_details) {
-  closure_.Run();
-}
-
 // BrowserListSessionServiceWebStateListObserver observes a WebStateList and
 // invokes |closure| when the active WebState changes or a navigation item is
 // committed in the active WebState.
 class BrowserListSessionServiceWebStateListObserver
-    : public WebStateListObserver {
+    : public WebStateListObserver,
+      public web::WebStateObserver {
  public:
   BrowserListSessionServiceWebStateListObserver(
       WebStateList* web_state_list,
@@ -92,10 +51,16 @@
                            int active_index,
                            bool user_action) override;
 
+  // web::WebStateObserver implementation.
+  void NavigationItemCommitted(
+      web::WebState* web_state,
+      const web::LoadCommittedDetails& load_details) override;
+  void WebStateDestroyed(web::WebState* web_state) override;
+
  private:
   WebStateList* web_state_list_;
   base::RepeatingClosure closure_;
-  BrowserListSessionServiceWebStateObserver observer_;
+  ScopedObserver<web::WebState, web::WebStateObserver> scoped_observer_;
 
   DISALLOW_COPY_AND_ASSIGN(BrowserListSessionServiceWebStateListObserver);
 };
@@ -104,19 +69,20 @@
     BrowserListSessionServiceWebStateListObserver(
         WebStateList* web_state_list,
         const base::RepeatingClosure& closure)
-    : web_state_list_(web_state_list), closure_(closure), observer_(closure) {
+    : web_state_list_(web_state_list),
+      closure_(closure),
+      scoped_observer_(this) {
   DCHECK(!closure_.is_null());
   web_state_list_->AddObserver(this);
   if (web_state_list_->active_index() != WebStateList::kInvalidIndex) {
-    WebStateActivatedAt(web_state_list_, nullptr,
-                        web_state_list_->GetActiveWebState(),
-                        web_state_list_->active_index(), false);
+    scoped_observer_.Add(web_state_list_->GetActiveWebState());
   }
 }
 
 BrowserListSessionServiceWebStateListObserver::
     ~BrowserListSessionServiceWebStateListObserver() {
   web_state_list_->RemoveObserver(this);
+  scoped_observer_.RemoveAll();
 }
 
 void BrowserListSessionServiceWebStateListObserver::WebStateActivatedAt(
@@ -125,9 +91,24 @@
     web::WebState* new_web_state,
     int active_index,
     bool user_action) {
-  if (old_web_state)
+  if (old_web_state) {
+    scoped_observer_.Remove(old_web_state);
     closure_.Run();
-  observer_.ObserveWebState(new_web_state);
+  }
+  if (new_web_state) {
+    scoped_observer_.Add(new_web_state);
+  }
+}
+
+void BrowserListSessionServiceWebStateListObserver::NavigationItemCommitted(
+    web::WebState* web_state,
+    const web::LoadCommittedDetails& load_details) {
+  closure_.Run();
+}
+
+void BrowserListSessionServiceWebStateListObserver::WebStateDestroyed(
+    web::WebState* web_state) {
+  NOTREACHED();
 }
 
 // BrowserListSessionServiceBrowserListObserver observes a BrowserList and
diff --git a/ios/chrome/browser/ui/ntp/BUILD.gn b/ios/chrome/browser/ui/ntp/BUILD.gn
index 1d4c8ed..065a0bae2 100644
--- a/ios/chrome/browser/ui/ntp/BUILD.gn
+++ b/ios/chrome/browser/ui/ntp/BUILD.gn
@@ -15,7 +15,6 @@
 source_set("ntp_header") {
   configs += [ "//build/config/compiler:enable_arc" ]
   sources = [
-    "google_landing_data_source.h",
     "new_tab_page_header_view.h",
     "new_tab_page_header_view.mm",
     "new_tab_page_toolbar_controller.h",
diff --git a/ios/chrome/browser/ui/ntp/google_landing_consumer.h b/ios/chrome/browser/ui/ntp/google_landing_consumer.h
index 87768db..c51e6724 100644
--- a/ios/chrome/browser/ui/ntp/google_landing_consumer.h
+++ b/ios/chrome/browser/ui/ntp/google_landing_consumer.h
@@ -24,20 +24,6 @@
 // |YES| if this consumer is has voice search enabled.
 - (void)setVoiceSearchIsEnabled:(BOOL)voiceSearchIsEnabled;
 
-// Sets the maximum number of sites shown.
-- (void)setMaximumMostVisitedSitesShown:
-    (NSUInteger)maximumMostVisitedSitesShown;
-
-// Sets the text of a what's new promo.
-- (void)setPromoText:(NSString*)promoText;
-
-// Sets the icon of a what's new promo.
-// TODO(crbug.com/694750): This should not be WhatsNewIcon.
-- (void)setPromoIcon:(WhatsNewIcon)promoIcon;
-
-// |YES| if a what's new promo can be displayed.
-- (void)setPromoCanShow:(BOOL)promoCanShow;
-
 // The number of tabs to show in the google landing fake toolbar.
 - (void)setTabCount:(int)tabCount;
 
@@ -47,14 +33,6 @@
 // |YES| if the google landing toolbar can show the back arrow.
 - (void)setCanGoBack:(BOOL)canGoBack;
 
-// TODO(crbug.com/694750): This should be replaced with consumer suitable data
-// type property.
-// Tells the consumer to that most visited data updated.
-- (void)mostVisitedDataUpdated;
-
-// Tells the consumer a most visited icon was updated.
-- (void)mostVisitedIconMadeAvailableAtIndex:(NSUInteger)index;
-
 // TODO(crbug.com/694750): These two calls can be made with dispatcher instead.
 // The location bar has lost focus.
 - (void)locationBarResignsFirstResponder;
diff --git a/ios/chrome/browser/ui/ntp/google_landing_data_source.h b/ios/chrome/browser/ui/ntp/google_landing_data_source.h
deleted file mode 100644
index f223377..0000000
--- a/ios/chrome/browser/ui/ntp/google_landing_data_source.h
+++ /dev/null
@@ -1,75 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef IOS_CHROME_BROWSER_UI_NTP_GOOGLE_LANDING_DATA_SOURCE_H_
-#define IOS_CHROME_BROWSER_UI_NTP_GOOGLE_LANDING_DATA_SOURCE_H_
-
-#import <Foundation/Foundation.h>
-#import <UIKit/UIKit.h>
-
-#include "components/ntp_tiles/ntp_tile.h"
-#import "ios/chrome/browser/ui/favicon/favicon_attributes.h"
-#include "url/gurl.h"
-
-@class FaviconAttributes;
-class ReadingListModel;
-class LargeIconCache;
-namespace favicon {
-class LargeIconService;
-}
-
-// DataSource for the google landing controller.
-// TODO(crbug.com/694750): Most everything here can be moved to dispatcher.
-@protocol GoogleLandingDataSource
-
-// Removes a blacklisted URL in both |_mostVisitedData|.
-- (void)removeBlacklistedURL:(const GURL&)url;
-
-// Adds URL to the blacklist in both |_mostVisitedData|.
-- (void)addBlacklistedURL:(const GURL&)url;
-
-// Logs a histogram due to a Most Visited item being opened.
-- (void)logMostVisitedClick:(const NSUInteger)visitedIndex
-          faviconAttributes:(FaviconAttributes*)faviconAttributes;
-
-// Called when a what's new promo is viewed.
-- (void)promoViewed;
-
-// Called when a what's new promo is tapped.
-- (void)promoTapped;
-
-// TODO(crbug.com/694750): The following two methods should be moved to the
-// consumer, and converted into types more suitable for a consumer.
-// Gets an a most visited NTP tile at |index|.
-- (ntp_tiles::NTPTile)mostVisitedAtIndex:(NSUInteger)index;
-
-// Gets the number of most visited entries.
-- (NSUInteger)mostVisitedSize;
-
-// TODO(crbug.com/694750): The following three properties will be removed in
-// subsequent CLs, with data provided via GoogleDataConsumer into types more
-// suitable for a consumer.
-
-// Gets the reading list model.
-- (ReadingListModel*)readingListModel;
-
-// Gets the large icon cache.
-- (LargeIconCache*)largeIconCache;
-
-// Gets the large icon service.
-- (favicon::LargeIconService*)largeIconService;
-
-// Asynchronously gets the favicon for |URL| with size |size| and calls
-// |imageCallback| with the |favicon| image if it's valid, or |fallbackCallback|
-// if there is valid fallback data with the |textColor| and |backgroundColor|
-// for the fallback icon to use. |isDefaultColor| is true if a default color
-// should be used instead of |backgroundColor|.
-- (void)getFaviconForPageURL:(const GURL&)URL
-                        size:(CGFloat)size
-                    useCache:(BOOL)useCache
-                    callback:(void (^)(FaviconAttributes*))callback;
-
-@end
-
-#endif  // IOS_CHROME_BROWSER_UI_NTP_GOOGLE_LANDING_DATA_SOURCE_H_
diff --git a/ios/chrome/browser/ui/ntp/google_landing_mediator.h b/ios/chrome/browser/ui/ntp/google_landing_mediator.h
index 09d23af..6c6257e9 100644
--- a/ios/chrome/browser/ui/ntp/google_landing_mediator.h
+++ b/ios/chrome/browser/ui/ntp/google_landing_mediator.h
@@ -7,8 +7,6 @@
 
 #import <Foundation/Foundation.h>
 
-#import "ios/chrome/browser/ui/ntp/google_landing_data_source.h"
-
 @protocol BrowserCommands;
 @protocol GoogleLandingConsumer;
 @protocol OmniboxFocuser;
@@ -20,7 +18,7 @@
 }
 
 // A mediator object that provides various data sources for google landing.
-@interface GoogleLandingMediator : NSObject<GoogleLandingDataSource>
+@interface GoogleLandingMediator : NSObject
 
 - (nullable instancetype)
 initWithBrowserState:(nonnull ios::ChromeBrowserState*)browserState
@@ -40,9 +38,6 @@
 // Stop listening to any observers and other cleanup functionality.
 - (void)shutdown;
 
-// Get the maximum number of sites shown.
-+ (NSUInteger)maxSitesShown;
-
 @end
 
 #endif  // IOS_CHROME_BROWSER_UI_NTP_GOOGLE_LANDING_MEDIATOR_H_
diff --git a/ios/chrome/browser/ui/ntp/google_landing_mediator.mm b/ios/chrome/browser/ui/ntp/google_landing_mediator.mm
index 02c6c7d9..26d82c6 100644
--- a/ios/chrome/browser/ui/ntp/google_landing_mediator.mm
+++ b/ios/chrome/browser/ui/ntp/google_landing_mediator.mm
@@ -49,21 +49,6 @@
 #error "This file requires ARC support."
 #endif
 
-using base::UserMetricsAction;
-
-namespace {
-
-// The What's New promo command that shows the Bookmarks Manager.
-const char kBookmarkCommand[] = "bookmark";
-
-// The What's New promo command that launches Rate This App.
-const char kRateThisAppCommand[] = "ratethisapp";
-
-const CGFloat kFaviconMinSize = 32;
-const NSInteger kMaxNumMostVisitedFavicons = 8;
-
-}  // namespace
-
 @interface GoogleLandingMediator (UsedBySearchEngineObserver)
 // Check to see if the logo visibility should change.
 - (void)updateShowLogo;
@@ -101,15 +86,10 @@
 
 }  // namespace google_landing
 
-@interface GoogleLandingMediator ()<GoogleLandingDataSource,
-                                    MostVisitedSitesObserving,
-                                    WebStateListObserving> {
+@interface GoogleLandingMediator ()<WebStateListObserving> {
   // The ChromeBrowserState associated with this mediator.
   ios::ChromeBrowserState* _browserState;  // Weak.
 
-  // |YES| if impressions were logged already and shouldn't be logged again.
-  BOOL _recordedPageImpression;
-
   // Controller to fetch and show doodles or a default Google logo.
   id<LogoVendor> _doodleController;
 
@@ -117,33 +97,10 @@
   std::unique_ptr<google_landing::SearchEngineObserver> _observer;
   TemplateURLService* _templateURLService;  // weak
 
-  // A MostVisitedSites::Observer bridge object to get notified of most visited
-  // sites changes.
-  std::unique_ptr<ntp_tiles::MostVisitedSitesObserverBridge>
-      _mostVisitedObserverBridge;
-
-  std::unique_ptr<ntp_tiles::MostVisitedSites> _mostVisitedSites;
-
-  // Most visited data from the MostVisitedSites service currently in use.
-  ntp_tiles::NTPTilesVector _mostVisitedData;
-
-  // Most visited data from the MostVisitedSites service (copied upon receiving
-  // the callback), not yet used by the collection. It will be used after a user
-  // interaction.
-  ntp_tiles::NTPTilesVector _freshMostVisitedData;
-
-  // Most visited data used for logging the tiles impression. The data are
-  // copied when receiving the first non-empty data. This copy is used to make
-  // sure only the data received the first time are logged, and only once.
-  ntp_tiles::NTPTilesVector _mostVisitedDataForLogging;
-
   // Observes the WebStateList so that this mediator can update the UI when the
   // active WebState changes.
   std::unique_ptr<WebStateListObserverBridge> _webStateListObserver;
 
-  // What's new promo.
-  std::unique_ptr<NotificationPromoWhatsNew> _notificationPromo;
-
   // Used to cancel tasks for the LargeIconService.
   base::CancelableTaskTracker _cancelable_task_tracker;
 }
@@ -182,8 +139,6 @@
   [self.consumer setVoiceSearchIsEnabled:ios::GetChromeBrowserProvider()
                                              ->GetVoiceSearchProvider()
                                              ->IsVoiceSearchEnabled()];
-  [self.consumer
-      setMaximumMostVisitedSitesShown:[GoogleLandingMediator maxSitesShown]];
   [self.consumer setTabCount:self.webStateList->count()];
   web::WebState* webState = _webStateList->GetActiveWebState();
   if (webState) {
@@ -203,16 +158,6 @@
   [_consumer setLogoVendor:_doodleController];
   [self updateShowLogo];
 
-  // Set up most visited sites.  This call may have the side effect of
-  // triggering -onMostVisitedURLsAvailable immediately, which can load the
-  // view before dataSource is set.
-  _mostVisitedSites =
-      IOSMostVisitedSitesFactory::NewForBrowserState(_browserState);
-  _mostVisitedObserverBridge.reset(
-      new ntp_tiles::MostVisitedSitesObserverBridge(self));
-  _mostVisitedSites->SetMostVisitedURLsObserver(
-      _mostVisitedObserverBridge.get(), [GoogleLandingMediator maxSitesShown]);
-
   // Set up notifications;
   NSNotificationCenter* defaultCenter = [NSNotificationCenter defaultCenter];
   [defaultCenter addObserver:self.consumer
@@ -223,15 +168,6 @@
                     selector:@selector(locationBarResignsFirstResponder)
                         name:kLocationBarResignsFirstResponderNotification
                       object:nil];
-
-  // Set up what's new.
-  _notificationPromo.reset(
-      new NotificationPromoWhatsNew(GetApplicationContext()->GetLocalState()));
-  _notificationPromo->Init();
-  [self.consumer setPromoText:[base::SysUTF8ToNSString(
-                                  _notificationPromo->promo_text()) copy]];
-  [self.consumer setPromoIcon:_notificationPromo->icon()];
-  [self.consumer setPromoCanShow:_notificationPromo->CanShow()];
 }
 
 - (void)updateShowLogo {
@@ -246,106 +182,6 @@
   [self.consumer setLogoIsShowing:showLogo];
 }
 
-+ (NSUInteger)maxSitesShown {
-  return kMaxNumMostVisitedFavicons;
-}
-
-#pragma mark - MostVisitedSitesObserving
-
-- (void)onMostVisitedURLsAvailable:(const ntp_tiles::NTPTilesVector&)data {
-  if (_mostVisitedData.size() > 0) {
-    // If some content is already displayed to the user, do not update it to
-    // prevent updating the all the tiles without any action from the user.
-    _freshMostVisitedData = data;
-    return;
-  }
-
-  _mostVisitedData = data;
-  [self.consumer mostVisitedDataUpdated];
-
-  if (data.size() && !_recordedPageImpression) {
-    _recordedPageImpression = YES;
-    _mostVisitedDataForLogging = data;
-    ntp_tiles::metrics::RecordPageImpression(data.size());
-  }
-}
-
-- (void)onIconMadeAvailable:(const GURL&)siteUrl {
-  for (size_t i = 0; i < _mostVisitedData.size(); ++i) {
-    const ntp_tiles::NTPTile& ntpTile = _mostVisitedData[i];
-    if (ntpTile.url == siteUrl) {
-      [self.consumer mostVisitedIconMadeAvailableAtIndex:i];
-      break;
-    }
-  }
-}
-
-- (void)getFaviconForPageURL:(const GURL&)URL
-                        size:(CGFloat)size
-                    useCache:(BOOL)useCache
-                    callback:(void (^)(FaviconAttributes*))callback {
-  __weak GoogleLandingMediator* weakSelf = self;
-  GURL localURL = URL;  // Persisting for use in block below.
-  void (^faviconBlock)(const favicon_base::LargeIconResult&) = ^(
-      const favicon_base::LargeIconResult& result) {
-    // TODO(crbug.com/773627): Use FaviconAttributesProvider just like many
-    // other mediators.
-    FaviconAttributesWithPayload* attributes = nil;
-
-    if (result.bitmap.is_valid()) {
-      scoped_refptr<base::RefCountedMemory> data =
-          result.bitmap.bitmap_data.get();
-      UIImage* favicon = [UIImage
-          imageWithData:[NSData dataWithBytes:data->front() length:data->size()]
-                  scale:[UIScreen mainScreen].scale];
-      attributes = [FaviconAttributesWithPayload attributesWithImage:favicon];
-      attributes.iconType = result.bitmap.icon_type;
-      if (callback) {
-        callback(attributes);
-      }
-    } else if (result.fallback_icon_style) {
-      UIColor* backgroundColor = skia::UIColorFromSkColor(
-          result.fallback_icon_style->background_color);
-      UIColor* textColor =
-          skia::UIColorFromSkColor(result.fallback_icon_style->text_color);
-      BOOL isDefaultColor =
-          result.fallback_icon_style->is_default_background_color;
-      NSString* monogram =
-          base::SysUTF16ToNSString(favicon::GetFallbackIconText(localURL));
-      attributes =
-          [FaviconAttributesWithPayload attributesWithMonogram:monogram
-                                                     textColor:textColor
-                                               backgroundColor:backgroundColor
-                                        defaultBackgroundColor:isDefaultColor];
-      if (callback) {
-        callback(attributes);
-      }
-    }
-
-    GoogleLandingMediator* strongSelf = weakSelf;
-    if (strongSelf) {
-      if (result.bitmap.is_valid() || result.fallback_icon_style) {
-        [strongSelf largeIconCache]->SetCachedResult(localURL, result);
-      }
-      [strongSelf faviconWithAttributes:attributes fetchedForURL:localURL];
-    }
-  };
-
-  if (useCache) {
-    std::unique_ptr<favicon_base::LargeIconResult> cached_result =
-        [self largeIconCache]->GetCachedResult(URL);
-    if (cached_result) {
-      faviconBlock(*cached_result);
-    }
-  }
-
-  CGFloat faviconSize = [UIScreen mainScreen].scale * size;
-  CGFloat faviconMinSize = [UIScreen mainScreen].scale * kFaviconMinSize;
-  [self largeIconService]->GetLargeIconOrFallbackStyle(
-      URL, faviconMinSize, faviconSize, base::BindBlockArc(faviconBlock),
-      &_cancelable_task_tracker);
-}
-
 #pragma mark - WebStateListObserving
 
 - (void)webStateList:(WebStateList*)webStateList
@@ -377,106 +213,4 @@
   }
 }
 
-#pragma mark - GoogleLandingDataSource
-
-- (void)addBlacklistedURL:(const GURL&)url {
-  _mostVisitedSites->AddOrRemoveBlacklistedUrl(url, true);
-  [self useFreshData];
-}
-
-- (void)removeBlacklistedURL:(const GURL&)url {
-  _mostVisitedSites->AddOrRemoveBlacklistedUrl(url, false);
-  [self useFreshData];
-}
-
-- (ntp_tiles::NTPTile)mostVisitedAtIndex:(NSUInteger)index {
-  return _mostVisitedData[index];
-}
-
-- (NSUInteger)mostVisitedSize {
-  return _mostVisitedData.size();
-}
-
-- (void)logMostVisitedClick:(const NSUInteger)visitedIndex
-          faviconAttributes:(FaviconAttributes*)faviconAttributes {
-  new_tab_page_uma::RecordAction(
-      _browserState, new_tab_page_uma::ACTION_OPENED_MOST_VISITED_ENTRY);
-  base::RecordAction(UserMetricsAction("MobileNTPMostVisited"));
-  const ntp_tiles::NTPTile& tile = _mostVisitedData[visitedIndex];
-  RecordNTPTileClick(visitedIndex, tile.source, tile.title_source,
-                     faviconAttributes, tile.data_generation_time, tile.url);
-}
-
-- (ReadingListModel*)readingListModel {
-  return ReadingListModelFactory::GetForBrowserState(_browserState);
-}
-
-- (LargeIconCache*)largeIconCache {
-  return IOSChromeLargeIconCacheFactory::GetForBrowserState(_browserState);
-}
-
-- (favicon::LargeIconService*)largeIconService {
-  return IOSChromeLargeIconServiceFactory::GetForBrowserState(_browserState);
-}
-
-- (void)promoViewed {
-  DCHECK(_notificationPromo);
-  _notificationPromo->HandleViewed();
-  [self.consumer setPromoCanShow:_notificationPromo->CanShow()];
-}
-
-// TODO(crbug.com/761096) : Promo handling should be DRY and tested.
-- (void)promoTapped {
-  DCHECK(_notificationPromo);
-  _notificationPromo->HandleClosed();
-  [self.consumer setPromoCanShow:_notificationPromo->CanShow()];
-
-  if (_notificationPromo->IsURLPromo()) {
-    [self.dispatcher webPageOrderedOpen:_notificationPromo->url()
-                               referrer:web::Referrer()
-                           inBackground:NO
-                               appendTo:kCurrentTab];
-    return;
-  }
-
-  if (_notificationPromo->IsChromeCommandPromo()) {
-    std::string command = _notificationPromo->command();
-    if (command == kBookmarkCommand) {
-      [self.dispatcher showBookmarksManager];
-    } else if (command == kRateThisAppCommand) {
-      [self.dispatcher showRateThisAppDialog];
-    } else {
-      NOTREACHED() << "Promo command is not valid.";
-    }
-    return;
-  }
-  NOTREACHED() << "Promo type is neither URL or command.";
-}
-
-#pragma mark - Private
-
-// If there is some fresh most visited tiles, they become the current tiles and
-// the consumer gets notified.
-- (void)useFreshData {
-  _mostVisitedData = _freshMostVisitedData;
-  [self.consumer mostVisitedDataUpdated];
-}
-
-// If it is the first time we see the favicon corresponding to |URL|, we log the
-// |attributes| impression.
-- (void)faviconWithAttributes:(FaviconAttributes*)attributes
-                fetchedForURL:(const GURL&)URL {
-  for (size_t i = 0; i < _mostVisitedDataForLogging.size(); ++i) {
-    ntp_tiles::NTPTile& ntpTile = _mostVisitedDataForLogging[i];
-    if (ntpTile.url == URL) {
-      RecordNTPTileImpression(i, ntpTile.source, ntpTile.title_source,
-                              attributes, ntpTile.data_generation_time,
-                              ntpTile.url);
-      // Reset the URL to be sure to log the impression only once.
-      ntpTile.url = GURL();
-      break;
-    }
-  }
-}
-
 @end
diff --git a/ios/chrome/browser/ui/ntp/new_tab_page_header_view.mm b/ios/chrome/browser/ui/ntp/new_tab_page_header_view.mm
index aa4aa53..5ae7855 100644
--- a/ios/chrome/browser/ui/ntp/new_tab_page_header_view.mm
+++ b/ios/chrome/browser/ui/ntp/new_tab_page_header_view.mm
@@ -9,7 +9,6 @@
 #import "ios/chrome/browser/tabs/tab_model_observer.h"
 #import "ios/chrome/browser/ui/content_suggestions/content_suggestions_collection_utils.h"
 #import "ios/chrome/browser/ui/image_util.h"
-#import "ios/chrome/browser/ui/ntp/google_landing_data_source.h"
 #import "ios/chrome/browser/ui/ntp/new_tab_page_header_constants.h"
 #import "ios/chrome/browser/ui/ntp/new_tab_page_toolbar_controller.h"
 #import "ios/chrome/browser/ui/toolbar/public/toolbar_utils.h"
diff --git a/ios/chrome/browser/ui/ntp/new_tab_page_toolbar_controller.mm b/ios/chrome/browser/ui/ntp/new_tab_page_toolbar_controller.mm
index d17080b..5afcf9c 100644
--- a/ios/chrome/browser/ui/ntp/new_tab_page_toolbar_controller.mm
+++ b/ios/chrome/browser/ui/ntp/new_tab_page_toolbar_controller.mm
@@ -11,7 +11,6 @@
 #include "components/toolbar/toolbar_model.h"
 #import "ios/chrome/browser/ui/commands/application_commands.h"
 #import "ios/chrome/browser/ui/commands/browser_commands.h"
-#import "ios/chrome/browser/ui/ntp/google_landing_data_source.h"
 #import "ios/chrome/browser/ui/rtl_geometry.h"
 #import "ios/chrome/browser/ui/toolbar/omnibox_focuser.h"
 #import "ios/chrome/browser/ui/toolbar/public/toolbar_controller_constants.h"
diff --git a/ios/chrome/browser/ui/sad_tab/sad_tab_legacy_coordinator.mm b/ios/chrome/browser/ui/sad_tab/sad_tab_legacy_coordinator.mm
index 4ac7e5e4..523dc14 100644
--- a/ios/chrome/browser/ui/sad_tab/sad_tab_legacy_coordinator.mm
+++ b/ios/chrome/browser/ui/sad_tab/sad_tab_legacy_coordinator.mm
@@ -27,17 +27,18 @@
 #pragma mark - SadTabTabHelperDelegate
 
 - (void)sadTabTabHelper:(SadTabTabHelper*)tabHelper
-    presentSadTabForRepeatedFailure:(BOOL)repeatedFailure {
+    presentSadTabForWebState:(web::WebState*)webState
+             repeatedFailure:(BOOL)repeatedFailure {
   // Create a SadTabView so |webstate| presents it.
   SadTabView* sadTabview = [[SadTabView alloc]
            initWithMode:repeatedFailure ? SadTabViewMode::FEEDBACK
                                         : SadTabViewMode::RELOAD
-      navigationManager:tabHelper->web_state()->GetNavigationManager()];
+      navigationManager:webState->GetNavigationManager()];
   sadTabview.dispatcher = static_cast<id<ApplicationCommands>>(self.dispatcher);
   sadTabview.actionDelegate = self;
   CRWContentView* contentView =
       [[CRWGenericContentView alloc] initWithView:sadTabview];
-  tabHelper->web_state()->ShowTransientContentView(contentView);
+  webState->ShowTransientContentView(contentView);
 }
 
 @end
diff --git a/ios/chrome/browser/ui/settings/block_popups_collection_view_controller.mm b/ios/chrome/browser/ui/settings/block_popups_collection_view_controller.mm
index b617751..63c5805 100644
--- a/ios/chrome/browser/ui/settings/block_popups_collection_view_controller.mm
+++ b/ios/chrome/browser/ui/settings/block_popups_collection_view_controller.mm
@@ -180,6 +180,9 @@
     _exceptions.Remove(urlIndex, NULL);
   }
 
+  // Update the edit button appearance, in case all exceptions were removed.
+  [self updateEditButton];
+
   // Must call super at the end of the child implementation.
   [super collectionView:collectionView willDeleteItemsAtIndexPaths:indexPaths];
 }
diff --git a/ios/chrome/browser/web/sad_tab_tab_helper.h b/ios/chrome/browser/web/sad_tab_tab_helper.h
index 808b2785..92699c36 100644
--- a/ios/chrome/browser/web/sad_tab_tab_helper.h
+++ b/ios/chrome/browser/web/sad_tab_tab_helper.h
@@ -78,6 +78,10 @@
   // to be considered a repeat failure.
   static const double kDefaultRepeatFailureInterval;
 
+  // The WebState this instance is observing. Will be null after
+  // WebStateDestroyed has been called.
+  web::WebState* web_state_ = nullptr;
+
   // Stores the last URL that caused a renderer crash,
   // used to detect repeated crashes.
   GURL last_failed_url_;
diff --git a/ios/chrome/browser/web/sad_tab_tab_helper.mm b/ios/chrome/browser/web/sad_tab_tab_helper.mm
index 9da2af8..4f68a64 100644
--- a/ios/chrome/browser/web/sad_tab_tab_helper.mm
+++ b/ios/chrome/browser/web/sad_tab_tab_helper.mm
@@ -7,6 +7,7 @@
 #import <Foundation/Foundation.h>
 #import <UIKit/UIKit.h>
 
+#include "base/logging.h"
 #include "base/memory/ptr_util.h"
 #include "base/strings/sys_string_conversions.h"
 #include "ios/chrome/browser/chrome_url_constants.h"
@@ -38,14 +39,16 @@
 SadTabTabHelper::SadTabTabHelper(web::WebState* web_state,
                                  double repeat_failure_interval,
                                  id<SadTabTabHelperDelegate> delegate)
-    : web::WebStateObserver(web_state),
+    : web_state_(web_state),
       repeat_failure_interval_(repeat_failure_interval),
       delegate_(delegate) {
+  web_state_->AddObserver(this);
   AddApplicationDidBecomeActiveObserver();
 }
 
 SadTabTabHelper::~SadTabTabHelper() {
   DCHECK(!application_did_become_active_observer_);
+  DCHECK(!web_state_);
 }
 
 void SadTabTabHelper::CreateForWebState(web::WebState* web_state,
@@ -73,6 +76,7 @@
 }
 
 void SadTabTabHelper::WasShown(web::WebState* web_state) {
+  DCHECK_EQ(web_state_, web_state);
   if (requires_reload_on_becoming_visible_) {
     ReloadTab();
     requires_reload_on_becoming_visible_ = false;
@@ -80,6 +84,7 @@
 }
 
 void SadTabTabHelper::RenderProcessGone(web::WebState* web_state) {
+  DCHECK_EQ(web_state_, web_state);
   if (!web_state->IsVisible()) {
     requires_reload_on_becoming_visible_ = true;
     return;
@@ -99,6 +104,7 @@
 void SadTabTabHelper::DidFinishNavigation(
     web::WebState* web_state,
     web::NavigationContext* navigation_context) {
+  DCHECK_EQ(web_state_, web_state);
   if (navigation_context->GetUrl().host() == kChromeUICrashHost &&
       navigation_context->GetUrl().scheme() == kChromeUIScheme) {
     PresentSadTab(navigation_context->GetUrl());
@@ -106,6 +112,9 @@
 }
 
 void SadTabTabHelper::WebStateDestroyed(web::WebState* web_state) {
+  DCHECK_EQ(web_state_, web_state);
+  web_state_->RemoveObserver(this);
+  web_state_ = nullptr;
   RemoveApplicationDidBecomeActiveObserver();
 }
 
@@ -120,22 +129,23 @@
        seconds_since_last_failure < repeat_failure_interval_);
 
   [delegate_ sadTabTabHelper:this
-      presentSadTabForRepeatedFailure:repeated_failure];
+      presentSadTabForWebState:web_state_
+               repeatedFailure:repeated_failure];
 
   last_failed_url_ = url_causing_failure;
   last_failed_timer_ = base::MakeUnique<base::ElapsedTimer>();
 }
 
 void SadTabTabHelper::ReloadTab() {
-  PagePlaceholderTabHelper::FromWebState(web_state())
+  PagePlaceholderTabHelper::FromWebState(web_state_)
       ->AddPlaceholderForNextNavigation();
-  web_state()->GetNavigationManager()->LoadIfNecessary();
+  web_state_->GetNavigationManager()->LoadIfNecessary();
 }
 
 void SadTabTabHelper::OnAppDidBecomeActive() {
   if (!requires_reload_on_becoming_active_)
     return;
-  if (web_state()->IsVisible()) {
+  if (web_state_->IsVisible()) {
     ReloadTab();
   } else {
     requires_reload_on_becoming_visible_ = true;
diff --git a/ios/chrome/browser/web/sad_tab_tab_helper_delegate.h b/ios/chrome/browser/web/sad_tab_tab_helper_delegate.h
index 84275d5..bb1a5eb 100644
--- a/ios/chrome/browser/web/sad_tab_tab_helper_delegate.h
+++ b/ios/chrome/browser/web/sad_tab_tab_helper_delegate.h
@@ -9,12 +9,17 @@
 
 class SadTabTabHelper;
 
+namespace web {
+class WebState;
+}
+
 // Delegate for SadTabTabHelper.
 @protocol SadTabTabHelperDelegate<NSObject>
 
 // Asks the delegate to present a SadTabView.
 - (void)sadTabTabHelper:(SadTabTabHelper*)tabHelper
-    presentSadTabForRepeatedFailure:(BOOL)repeatedFailure;
+    presentSadTabForWebState:(web::WebState*)webState
+             repeatedFailure:(BOOL)repeatedFailure;
 
 @end
 
diff --git a/ios/chrome/browser/web/sad_tab_tab_helper_unittest.mm b/ios/chrome/browser/web/sad_tab_tab_helper_unittest.mm
index ef6d10a..70a78311 100644
--- a/ios/chrome/browser/web/sad_tab_tab_helper_unittest.mm
+++ b/ios/chrome/browser/web/sad_tab_tab_helper_unittest.mm
@@ -33,11 +33,12 @@
 @synthesize repeatedFailure = _repeatedFailure;
 
 - (void)sadTabTabHelper:(SadTabTabHelper*)tabHelper
-    presentSadTabForRepeatedFailure:(BOOL)repeatedFailure {
+    presentSadTabForWebState:(web::WebState*)webState
+             repeatedFailure:(BOOL)repeatedFailure {
   self.repeatedFailure = repeatedFailure;
   CRWContentView* contentView = [[CRWGenericContentView alloc]
       initWithView:[[UIView alloc] initWithFrame:CGRectZero]];
-  tabHelper->web_state()->ShowTransientContentView(contentView);
+  webState->ShowTransientContentView(contentView);
 }
 
 @end
diff --git a/ios/web/test/web_int_test.h b/ios/web/test/web_int_test.h
index 4bd312eb..65f8451 100644
--- a/ios/web/test/web_int_test.h
+++ b/ios/web/test/web_int_test.h
@@ -8,6 +8,7 @@
 #import <WebKit/WebKit.h>
 
 #import "base/ios/block_types.h"
+#include "base/macros.h"
 #import "ios/web/public/navigation_manager.h"
 #import "ios/web/public/test/fakes/test_web_state_delegate.h"
 #include "ios/web/public/test/web_test.h"
@@ -17,8 +18,6 @@
 
 namespace web {
 
-class IntTestWebStateObserver;
-
 // A test fixture for integration tests that need to bring up the HttpServer.
 class WebIntTest : public WebTest {
  protected:
@@ -69,8 +68,8 @@
  private:
   // WebState used to load pages.
   std::unique_ptr<WebState> web_state_;
-  // WebStateObserver used to wait for page loads.
-  std::unique_ptr<IntTestWebStateObserver> observer_;
+
+  DISALLOW_COPY_AND_ASSIGN(WebIntTest);
 };
 
 }  // namespace web
diff --git a/ios/web/test/web_int_test.mm b/ios/web/test/web_int_test.mm
index e692b2a..93feb74b 100644
--- a/ios/web/test/web_int_test.mm
+++ b/ios/web/test/web_int_test.mm
@@ -6,6 +6,7 @@
 
 #import "base/ios/block_types.h"
 #include "base/memory/ptr_util.h"
+#include "base/scoped_observer.h"
 #import "base/test/ios/wait_util.h"
 #import "ios/web/public/test/http_server/http_server.h"
 #import "ios/web/public/test/js_test_util.h"
@@ -21,16 +22,10 @@
 #pragma mark - IntTestWebStateObserver
 
 // WebStateObserver class that is used to track when page loads finish.
-class IntTestWebStateObserver : public web::WebStateObserver {
+class IntTestWebStateObserver : public WebStateObserver {
  public:
-  IntTestWebStateObserver(web::WebState* web_state)
-      : web::WebStateObserver(web_state), page_loaded_(false) {}
-
   // Instructs the observer to listen for page loads for |url|.
-  void ExpectPageLoad(const GURL& url) {
-    expected_url_ = url;
-    page_loaded_ = false;
-  }
+  explicit IntTestWebStateObserver(const GURL& url) : expected_url_(url) {}
 
   // Whether |expected_url_| has been loaded successfully.
   bool IsExpectedPageLoaded() { return page_loaded_; }
@@ -44,9 +39,13 @@
     page_loaded_ = true;
   }
 
+  void WebStateDestroyed(web::WebState* web_state) override { NOTREACHED(); }
+
  private:
   GURL expected_url_;
-  bool page_loaded_;
+  bool page_loaded_ = false;
+
+  DISALLOW_COPY_AND_ASSIGN(IntTestWebStateObserver);
 };
 
 #pragma mark - WebIntTest
@@ -95,11 +94,18 @@
 void WebIntTest::ExecuteBlockAndWaitForLoad(const GURL& url,
                                             ProceduralBlock block) {
   DCHECK(block);
-  observer_ = base::MakeUnique<IntTestWebStateObserver>(web_state());
-  observer_->ExpectPageLoad(url);
+
+  IntTestWebStateObserver observer(url);
+  ScopedObserver<WebState, WebStateObserver> scoped_observer(&observer);
+  scoped_observer.Add(web_state());
+
   block();
+
+  // Need to use a pointer to |observer| as the block wants to capture it by
+  // value (even if marked with __block) which would not work.
+  IntTestWebStateObserver* observer_ptr = &observer;
   base::test::ios::WaitUntilCondition(^bool {
-    return observer_->IsExpectedPageLoaded();
+    return observer_ptr->IsExpectedPageLoaded();
   });
 }
 
diff --git a/ios/web/web_state/favicon_callbacks_inttest.mm b/ios/web/web_state/favicon_callbacks_inttest.mm
index 6875c2e..c3314107 100644
--- a/ios/web/web_state/favicon_callbacks_inttest.mm
+++ b/ios/web/web_state/favicon_callbacks_inttest.mm
@@ -2,10 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include "base/logging.h"
 #include "base/memory/ptr_util.h"
 #include "ios/web/public/favicon_url.h"
 #import "ios/web/public/test/web_test_with_web_state.h"
-#include "ios/web/public/web_state/web_state_observer.h"
+#import "ios/web/public/web_state/web_state.h"
+#import "ios/web/public/web_state/web_state_observer.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
@@ -16,10 +18,10 @@
 namespace {
 
 // Observes and waits for FaviconUrlUpdated call.
-class FaviconUrlObserver : public web::WebStateObserver {
+class FaviconUrlObserver : public WebStateObserver {
  public:
-  explicit FaviconUrlObserver(web::WebState* web_state)
-      : web::WebStateObserver(web_state) {}
+  FaviconUrlObserver() = default;
+
   // Returns vavicon url candidates received in FaviconUrlUpdated.
   const std::vector<FaviconURL>& favicon_url_candidates() const {
     return favicon_url_candidates_;
@@ -27,39 +29,56 @@
   // Returns true if FaviconUrlUpdated was called.
   bool favicon_url_updated() const { return favicon_url_updated_; }
   // WebStateObserver overrides:
-  void FaviconUrlUpdated(web::WebState* web_state,
+  void FaviconUrlUpdated(WebState* web_state,
                          const std::vector<FaviconURL>& candidates) override {
     favicon_url_candidates_ = candidates;
     favicon_url_updated_ = true;
   }
+  void WebStateDestroyed(WebState* web_state) override { NOTREACHED(); }
 
  private:
   bool favicon_url_updated_ = false;
   std::vector<FaviconURL> favicon_url_candidates_;
+
+  DISALLOW_COPY_AND_ASSIGN(FaviconUrlObserver);
 };
 
 }  // namespace
 
 // Test fixture for WebStateDelegate::FaviconUrlUpdated and integration tests.
 class FaviconCallbackTest : public web::WebTestWithWebState {
+ public:
+  FaviconCallbackTest() = default;
+
  protected:
   void SetUp() override {
     web::WebTestWithWebState::SetUp();
-    observer_ = base::MakeUnique<FaviconUrlObserver>(web_state());
+    web_state()->AddObserver(observer());
   }
-  std::unique_ptr<FaviconUrlObserver> observer_;
+  void TearDown() override {
+    web_state()->RemoveObserver(observer());
+    web::WebTestWithWebState::TearDown();
+  }
+
+  FaviconUrlObserver* observer() { return &observer_; }
+
+ private:
+  FaviconUrlObserver observer_;
+
+  DISALLOW_COPY_AND_ASSIGN(FaviconCallbackTest);
 };
 
 // Tests page with shortcut icon link.
 TEST_F(FaviconCallbackTest, ShortcutIconFavicon) {
-  ASSERT_TRUE(observer_->favicon_url_candidates().empty());
+  ASSERT_TRUE(observer()->favicon_url_candidates().empty());
   LoadHtml(@"<link rel='shortcut icon' href='http://fav.ico'>");
 
   WaitForCondition(^{
-    return observer_->favicon_url_updated();
+    return observer()->favicon_url_updated();
   });
 
-  const std::vector<FaviconURL>& favicons = observer_->favicon_url_candidates();
+  const std::vector<FaviconURL>& favicons =
+      observer()->favicon_url_candidates();
   ASSERT_EQ(1U, favicons.size());
   EXPECT_EQ(GURL("http://fav.ico"), favicons[0].icon_url);
   EXPECT_EQ(FaviconURL::IconType::kFavicon, favicons[0].icon_type);
@@ -68,14 +87,15 @@
 
 // Tests page with icon link.
 TEST_F(FaviconCallbackTest, IconFavicon) {
-  ASSERT_TRUE(observer_->favicon_url_candidates().empty());
+  ASSERT_TRUE(observer()->favicon_url_candidates().empty());
   LoadHtml(@"<link rel='icon' href='http://fav.ico'>");
 
   WaitForCondition(^{
-    return observer_->favicon_url_updated();
+    return observer()->favicon_url_updated();
   });
 
-  const std::vector<FaviconURL>& favicons = observer_->favicon_url_candidates();
+  const std::vector<FaviconURL>& favicons =
+      observer()->favicon_url_candidates();
   ASSERT_EQ(1U, favicons.size());
   EXPECT_EQ(GURL("http://fav.ico"), favicons[0].icon_url);
   EXPECT_EQ(FaviconURL::IconType::kFavicon, favicons[0].icon_type);
@@ -84,15 +104,16 @@
 
 // Tests page with apple-touch-icon link.
 TEST_F(FaviconCallbackTest, AppleTouchIconFavicon) {
-  ASSERT_TRUE(observer_->favicon_url_candidates().empty());
+  ASSERT_TRUE(observer()->favicon_url_candidates().empty());
   LoadHtml(@"<link rel='apple-touch-icon' href='http://fav.ico'>",
            GURL("https://chromium.test"));
 
   WaitForCondition(^{
-    return observer_->favicon_url_updated();
+    return observer()->favicon_url_updated();
   });
 
-  const std::vector<FaviconURL>& favicons = observer_->favicon_url_candidates();
+  const std::vector<FaviconURL>& favicons =
+      observer()->favicon_url_candidates();
   ASSERT_EQ(2U, favicons.size());
   EXPECT_EQ(GURL("http://fav.ico"), favicons[0].icon_url);
   EXPECT_EQ(FaviconURL::IconType::kTouchIcon, favicons[0].icon_type);
@@ -104,15 +125,16 @@
 
 // Tests page with apple-touch-icon-precomposed link.
 TEST_F(FaviconCallbackTest, AppleTouchIconPrecomposedFavicon) {
-  ASSERT_TRUE(observer_->favicon_url_candidates().empty());
+  ASSERT_TRUE(observer()->favicon_url_candidates().empty());
   LoadHtml(@"<link rel='apple-touch-icon-precomposed' href='http://fav.ico'>",
            GURL("https://chromium.test"));
 
   WaitForCondition(^{
-    return observer_->favicon_url_updated();
+    return observer()->favicon_url_updated();
   });
 
-  const std::vector<FaviconURL>& favicons = observer_->favicon_url_candidates();
+  const std::vector<FaviconURL>& favicons =
+      observer()->favicon_url_candidates();
   ASSERT_EQ(2U, favicons.size());
   EXPECT_EQ(GURL("http://fav.ico"), favicons[0].icon_url);
   EXPECT_EQ(FaviconURL::IconType::kTouchPrecomposedIcon, favicons[0].icon_type);
@@ -124,14 +146,15 @@
 
 // Tests page without favicon link.
 TEST_F(FaviconCallbackTest, NoFavicon) {
-  ASSERT_TRUE(observer_->favicon_url_candidates().empty());
+  ASSERT_TRUE(observer()->favicon_url_candidates().empty());
   LoadHtml(@"<html></html>", GURL("https://chromium.test/test/test.html"));
 
   WaitForCondition(^{
-    return observer_->favicon_url_updated();
+    return observer()->favicon_url_updated();
   });
 
-  const std::vector<FaviconURL>& favicons = observer_->favicon_url_candidates();
+  const std::vector<FaviconURL>& favicons =
+      observer()->favicon_url_candidates();
   ASSERT_EQ(1U, favicons.size());
   EXPECT_EQ(GURL("https://chromium.test/favicon.ico"), favicons[0].icon_url);
   EXPECT_EQ(FaviconURL::IconType::kFavicon, favicons[0].icon_type);
@@ -140,17 +163,18 @@
 
 // Tests page with multiple favicon links.
 TEST_F(FaviconCallbackTest, MultipleFavicons) {
-  ASSERT_TRUE(observer_->favicon_url_candidates().empty());
+  ASSERT_TRUE(observer()->favicon_url_candidates().empty());
   LoadHtml(@"<link rel='shortcut icon' href='http://fav.ico'>"
             "<link rel='icon' href='http://fav1.ico'>"
             "<link rel='apple-touch-icon' href='http://fav2.ico'>"
             "<link rel='apple-touch-icon-precomposed' href='http://fav3.ico'>");
 
   WaitForCondition(^{
-    return observer_->favicon_url_updated();
+    return observer()->favicon_url_updated();
   });
 
-  const std::vector<FaviconURL>& favicons = observer_->favicon_url_candidates();
+  const std::vector<FaviconURL>& favicons =
+      observer()->favicon_url_candidates();
   ASSERT_EQ(4U, favicons.size());
   EXPECT_EQ(GURL("http://fav.ico"), favicons[0].icon_url);
   EXPECT_EQ(FaviconURL::IconType::kFavicon, favicons[0].icon_type);
@@ -168,15 +192,16 @@
 
 // Tests page with invalid favicon url.
 TEST_F(FaviconCallbackTest, InvalidFaviconUrl) {
-  ASSERT_TRUE(observer_->favicon_url_candidates().empty());
+  ASSERT_TRUE(observer()->favicon_url_candidates().empty());
   LoadHtml(@"<html><head><link rel='icon' href='http://'></head></html>",
            GURL("https://chromium.test"));
 
   WaitForCondition(^{
-    return observer_->favicon_url_updated();
+    return observer()->favicon_url_updated();
   });
 
-  const std::vector<FaviconURL>& favicons = observer_->favicon_url_candidates();
+  const std::vector<FaviconURL>& favicons =
+      observer()->favicon_url_candidates();
   ASSERT_EQ(1U, favicons.size());
   EXPECT_EQ(GURL("https://chromium.test/favicon.ico"), favicons[0].icon_url);
   EXPECT_EQ(FaviconURL::IconType::kFavicon, favicons[0].icon_type);
@@ -185,14 +210,15 @@
 
 // Tests page with empty favicon url.
 TEST_F(FaviconCallbackTest, EmptyFaviconUrl) {
-  ASSERT_TRUE(observer_->favicon_url_candidates().empty());
+  ASSERT_TRUE(observer()->favicon_url_candidates().empty());
   LoadHtml(@"<head><link rel='icon' href=''></head>");
 
   WaitForCondition(^{
-    return observer_->favicon_url_updated();
+    return observer()->favicon_url_updated();
   });
 
-  const std::vector<FaviconURL>& favicons = observer_->favicon_url_candidates();
+  const std::vector<FaviconURL>& favicons =
+      observer()->favicon_url_candidates();
   ASSERT_EQ(1U, favicons.size());
   // TODO(crbug.com/721852): This result is not correct.
   EXPECT_EQ(GURL("https://chromium.test/"), favicons[0].icon_url);
diff --git a/ios/web_view/internal/translate/web_view_translate_client.mm b/ios/web_view/internal/translate/web_view_translate_client.mm
index 3cefeadd..02d310f6 100644
--- a/ios/web_view/internal/translate/web_view_translate_client.mm
+++ b/ios/web_view/internal/translate/web_view_translate_client.mm
@@ -46,8 +46,7 @@
 }  // namespace
 
 WebViewTranslateClient::WebViewTranslateClient(web::WebState* web_state)
-    : web::WebStateObserver(web_state),
-      translate_manager_(base::MakeUnique<translate::TranslateManager>(
+    : translate_manager_(base::MakeUnique<translate::TranslateManager>(
           this,
           WebViewTranslateRankerFactory::GetForBrowserState(
               WebViewBrowserState::FromBrowserState(GetMainBrowserState())),
@@ -55,7 +54,9 @@
               WebViewBrowserState::FromBrowserState(GetMainBrowserState())))),
       translate_driver_(web_state,
                         web_state->GetNavigationManager(),
-                        translate_manager_.get()) {}
+                        translate_manager_.get()) {
+  web_state->AddObserver(this);
+}
 
 WebViewTranslateClient::~WebViewTranslateClient() = default;
 
@@ -90,7 +91,6 @@
 
 std::unique_ptr<translate::TranslatePrefs>
 WebViewTranslateClient::GetTranslatePrefs() {
-  DCHECK(web_state());
   return base::MakeUnique<translate::TranslatePrefs>(
       GetPrefs(), prefs::kAcceptLanguages, nullptr);
 }
@@ -129,6 +129,7 @@
 }
 
 void WebViewTranslateClient::WebStateDestroyed(web::WebState* web_state) {
+  web_state->RemoveObserver(this);
   // Translation process can be interrupted.
   // Destroying the TranslateManager now guarantees that it never has to deal
   // with nullptr WebState.
diff --git a/media/audio/BUILD.gn b/media/audio/BUILD.gn
index e3258c8..b56339f 100644
--- a/media/audio/BUILD.gn
+++ b/media/audio/BUILD.gn
@@ -333,6 +333,8 @@
   sources = [
     "audio_device_info_accessor_for_tests.cc",
     "audio_device_info_accessor_for_tests.h",
+    "audio_system_test_util.cc",
+    "audio_system_test_util.h",
     "audio_unittest_util.cc",
     "audio_unittest_util.h",
     "mock_audio_manager.cc",
diff --git a/media/audio/audio_system_impl_unittest.cc b/media/audio/audio_system_impl_unittest.cc
index 43e0783..b712b24 100644
--- a/media/audio/audio_system_impl_unittest.cc
+++ b/media/audio/audio_system_impl_unittest.cc
@@ -3,353 +3,50 @@
 // found in the LICENSE file.
 
 #include "media/audio/audio_system_impl.h"
-#include "base/memory/ptr_util.h"
 #include "base/message_loop/message_loop.h"
-#include "base/run_loop.h"
-#include "base/single_thread_task_runner.h"
-#include "base/task_runner_util.h"
-#include "base/threading/thread.h"
-#include "base/threading/thread_checker.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "media/audio/audio_device_description.h"
+#include "media/audio/audio_system_test_util.h"
 #include "media/audio/audio_thread_impl.h"
 #include "media/audio/mock_audio_manager.h"
 #include "media/audio/test_audio_thread.h"
-#include "media/base/test_helpers.h"
-#include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-namespace {
-const char* kNonDefaultDeviceId = "non-default-device-id";
-}
-
 namespace media {
 
-bool operator==(const AudioDeviceDescription& lhs,
-                const AudioDeviceDescription& rhs) {
-  return lhs.device_name == rhs.device_name && lhs.unique_id == rhs.unique_id &&
-         lhs.group_id == rhs.group_id;
-}
-
 // TODO(olka): These are the only tests for AudioSystemHelper. Make sure that
 // AudioSystemHelper is tested if AudioSystemImpl goes away.
-class AudioSystemImplTest : public testing::TestWithParam<bool> {
+
+// Typed tests cannot be parametrized, so using template parameter instead of
+// inheriting from TestWithParams<>
+template <bool use_audio_thread>
+class AudioSystemImplTestBase : public testing::Test {
  public:
-  AudioSystemImplTest()
-      : use_audio_thread_(GetParam()),
-        input_params_(AudioParameters::AUDIO_PCM_LINEAR,
-                      CHANNEL_LAYOUT_MONO,
-                      AudioParameters::kTelephoneSampleRate,
-                      16,
-                      AudioParameters::kTelephoneSampleRate / 10),
-        output_params_(AudioParameters::AUDIO_PCM_LINEAR,
-                       CHANNEL_LAYOUT_MONO,
-                       AudioParameters::kTelephoneSampleRate,
-                       16,
-                       AudioParameters::kTelephoneSampleRate / 20),
-        default_output_params_(AudioParameters::AUDIO_PCM_LINEAR,
-                               CHANNEL_LAYOUT_MONO,
-                               AudioParameters::kTelephoneSampleRate,
-                               16,
-                               AudioParameters::kTelephoneSampleRate / 30) {
-    audio_manager_ = base::MakeUnique<MockAudioManager>(
-        base::MakeUnique<TestAudioThread>(use_audio_thread_));
-    audio_manager_->SetInputStreamParameters(input_params_);
-    audio_manager_->SetOutputStreamParameters(output_params_);
-    audio_manager_->SetDefaultOutputStreamParameters(default_output_params_);
+  AudioSystemImplTestBase() {}
 
-    auto get_device_descriptions = [](const AudioDeviceDescriptions* source,
-                                      AudioDeviceDescriptions* destination) {
-      destination->insert(destination->end(), source->begin(), source->end());
-    };
+  ~AudioSystemImplTestBase() override {}
 
-    audio_manager_->SetInputDeviceDescriptionsCallback(
-        base::Bind(get_device_descriptions,
-                   base::Unretained(&input_device_descriptions_)));
-    audio_manager_->SetOutputDeviceDescriptionsCallback(
-        base::Bind(get_device_descriptions,
-                   base::Unretained(&output_device_descriptions_)));
-
+  void SetUp() override {
+    audio_manager_ = std::make_unique<MockAudioManager>(
+        std::make_unique<TestAudioThread>(use_audio_thread));
     audio_system_ = std::make_unique<AudioSystemImpl>(audio_manager_.get());
   }
-
-  ~AudioSystemImplTest() override { audio_manager_->Shutdown(); }
-
-  void OnAudioParams(const base::Optional<AudioParameters>& expected,
-                     const base::Optional<AudioParameters>& received) {
-    EXPECT_TRUE(thread_checker_.CalledOnValidThread());
-    if (expected) {
-      EXPECT_TRUE(received);
-      EXPECT_EQ(expected->AsHumanReadableString(),
-                received->AsHumanReadableString());
-    } else {
-      EXPECT_FALSE(received);
-    }
-    AudioParametersReceived();
-  }
-
-  void OnHasInputDevices(bool result) {
-    EXPECT_TRUE(thread_checker_.CalledOnValidThread());
-    HasInputDevicesCallback(result);
-  }
-
-  void OnHasOutputDevices(bool result) {
-    EXPECT_TRUE(thread_checker_.CalledOnValidThread());
-    HasOutputDevicesCallback(result);
-  }
-
-  void OnGetDeviceDescriptions(
-      const AudioDeviceDescriptions& expected_descriptions,
-      AudioDeviceDescriptions descriptions) {
-    EXPECT_TRUE(thread_checker_.CalledOnValidThread());
-    EXPECT_EQ(expected_descriptions, descriptions);
-    DeviceDescriptionsReceived();
-  }
-
-  void OnInputDeviceInfo(
-      const base::Optional<AudioParameters>& expected_input,
-      const base::Optional<AudioParameters>& expected_associated_output,
-      const std::string& expected_associated_device_id,
-      const base::Optional<AudioParameters>& input,
-      const base::Optional<AudioParameters>& associated_output,
-      const std::string& associated_device_id) {
-    EXPECT_TRUE(thread_checker_.CalledOnValidThread());
-    if (expected_input) {
-      EXPECT_TRUE(input);
-      EXPECT_EQ(expected_input->AsHumanReadableString(),
-                input->AsHumanReadableString());
-    } else {
-      EXPECT_FALSE(input);
-    }
-    if (expected_associated_output) {
-      EXPECT_TRUE(associated_output);
-      EXPECT_EQ(expected_associated_output->AsHumanReadableString(),
-                associated_output->AsHumanReadableString());
-    } else {
-      EXPECT_FALSE(associated_output);
-    }
-    EXPECT_EQ(expected_associated_device_id, associated_device_id);
-    InputDeviceInfoReceived();
-  }
-
-  void WaitForCallback() {
-    if (!use_audio_thread_) {
-      base::RunLoop().RunUntilIdle();
-      return;
-    }
-    WaitableMessageLoopEvent event;
-    audio_manager_->GetTaskRunner()->PostTaskAndReply(
-        FROM_HERE, base::Bind(&base::DoNothing), event.GetClosure());
-    // Runs the loop and waits for the |audio_thread_| to call event's closure,
-    // which means AudioSystem reply containing device parameters is already
-    // queued on the main thread.
-    event.RunAndWait();
-    base::RunLoop().RunUntilIdle();
-  }
-
-  // Mocks to verify that AudioSystem replied with an expected callback.
-  MOCK_METHOD0(AudioParametersReceived, void(void));
-  MOCK_METHOD1(HasInputDevicesCallback, void(bool));
-  MOCK_METHOD1(HasOutputDevicesCallback, void(bool));
-  MOCK_METHOD0(DeviceDescriptionsReceived, void(void));
-  MOCK_METHOD1(AssociatedOutputDeviceIDReceived, void(const std::string&));
-  MOCK_METHOD0(InputDeviceInfoReceived, void(void));
+  void TearDown() override { audio_manager_->Shutdown(); }
 
  protected:
+  MockAudioManager* audio_manager() { return audio_manager_.get(); }
+  AudioSystem* audio_system() { return audio_system_.get(); }
+
   base::MessageLoop message_loop_;
-  base::ThreadChecker thread_checker_;
-  bool use_audio_thread_;
   std::unique_ptr<MockAudioManager> audio_manager_;
   std::unique_ptr<AudioSystem> audio_system_;
-  AudioParameters input_params_;
-  AudioParameters output_params_;
-  AudioParameters default_output_params_;
-  AudioDeviceDescriptions input_device_descriptions_;
-  AudioDeviceDescriptions output_device_descriptions_;
+  // AudioSystemTester tester_;
 };
 
-TEST_P(AudioSystemImplTest, GetInputStreamParameters) {
-  EXPECT_CALL(*this, AudioParametersReceived());
-  audio_system_->GetInputStreamParameters(
-      AudioDeviceDescription::kDefaultDeviceId,
-      base::Bind(&AudioSystemImplTest::OnAudioParams, base::Unretained(this),
-                 input_params_));
-  WaitForCallback();
-}
+using AudioSystemTestBaseVariations =
+    testing::Types<AudioSystemImplTestBase<false>,
+                   AudioSystemImplTestBase<true>>;
 
-TEST_P(AudioSystemImplTest, GetInputStreamParametersNoDevice) {
-  audio_manager_->SetHasInputDevices(false);
-  EXPECT_CALL(*this, AudioParametersReceived());
-  audio_system_->GetInputStreamParameters(
-      AudioDeviceDescription::kDefaultDeviceId,
-      base::Bind(&AudioSystemImplTest::OnAudioParams, base::Unretained(this),
-                 base::Optional<AudioParameters>()));
-  WaitForCallback();
-}
-
-TEST_P(AudioSystemImplTest, GetOutputStreamParameters) {
-  EXPECT_CALL(*this, AudioParametersReceived());
-  audio_system_->GetOutputStreamParameters(
-      kNonDefaultDeviceId, base::Bind(&AudioSystemImplTest::OnAudioParams,
-                                      base::Unretained(this), output_params_));
-  WaitForCallback();
-}
-
-TEST_P(AudioSystemImplTest, GetDefaultOutputStreamParameters) {
-  EXPECT_CALL(*this, AudioParametersReceived());
-  audio_system_->GetOutputStreamParameters(
-      AudioDeviceDescription::kDefaultDeviceId,
-      base::Bind(&AudioSystemImplTest::OnAudioParams, base::Unretained(this),
-                 default_output_params_));
-  WaitForCallback();
-}
-
-TEST_P(AudioSystemImplTest, GetOutputStreamParametersNoDevice) {
-  audio_manager_->SetHasOutputDevices(false);
-  EXPECT_CALL(*this, AudioParametersReceived()).Times(2);
-
-  audio_system_->GetOutputStreamParameters(
-      AudioDeviceDescription::kDefaultDeviceId,
-      base::Bind(&AudioSystemImplTest::OnAudioParams, base::Unretained(this),
-                 base::Optional<AudioParameters>()));
-  WaitForCallback();
-
-  audio_system_->GetOutputStreamParameters(
-      kNonDefaultDeviceId,
-      base::Bind(&AudioSystemImplTest::OnAudioParams, base::Unretained(this),
-                 base::Optional<AudioParameters>()));
-  WaitForCallback();
-}
-
-TEST_P(AudioSystemImplTest, HasInputDevices) {
-  EXPECT_CALL(*this, HasInputDevicesCallback(true));
-  audio_system_->HasInputDevices(base::Bind(
-      &AudioSystemImplTest::OnHasInputDevices, base::Unretained(this)));
-  WaitForCallback();
-}
-
-TEST_P(AudioSystemImplTest, HasNoInputDevices) {
-  audio_manager_->SetHasInputDevices(false);
-  EXPECT_CALL(*this, HasInputDevicesCallback(false));
-  audio_system_->HasInputDevices(base::Bind(
-      &AudioSystemImplTest::OnHasInputDevices, base::Unretained(this)));
-  WaitForCallback();
-}
-
-TEST_P(AudioSystemImplTest, HasOutputDevices) {
-  EXPECT_CALL(*this, HasOutputDevicesCallback(true));
-  audio_system_->HasOutputDevices(base::Bind(
-      &AudioSystemImplTest::OnHasOutputDevices, base::Unretained(this)));
-  WaitForCallback();
-}
-
-TEST_P(AudioSystemImplTest, HasNoOutputDevices) {
-  audio_manager_->SetHasOutputDevices(false);
-  EXPECT_CALL(*this, HasOutputDevicesCallback(false));
-  audio_system_->HasOutputDevices(base::Bind(
-      &AudioSystemImplTest::OnHasOutputDevices, base::Unretained(this)));
-  WaitForCallback();
-}
-
-TEST_P(AudioSystemImplTest, GetInputDeviceDescriptionsNoInputDevices) {
-  output_device_descriptions_.emplace_back("output_device_name",
-                                           "output_device_id", "group_id");
-  EXPECT_EQ(0, static_cast<int>(input_device_descriptions_.size()));
-  EXPECT_EQ(1, static_cast<int>(output_device_descriptions_.size()));
-  EXPECT_CALL(*this, DeviceDescriptionsReceived());
-  audio_system_->GetDeviceDescriptions(
-      true, base::Bind(&AudioSystemImplTest::OnGetDeviceDescriptions,
-                       base::Unretained(this), input_device_descriptions_));
-  WaitForCallback();
-}
-
-TEST_P(AudioSystemImplTest, GetInputDeviceDescriptions) {
-  output_device_descriptions_.emplace_back("output_device_name",
-                                           "output_device_id", "group_id");
-  input_device_descriptions_.emplace_back("input_device_name1",
-                                          "input_device_id1", "group_id1");
-  input_device_descriptions_.emplace_back("input_device_name2",
-                                          "input_device_id2", "group_id2");
-  EXPECT_EQ(2, static_cast<int>(input_device_descriptions_.size()));
-  EXPECT_EQ(1, static_cast<int>(output_device_descriptions_.size()));
-  EXPECT_CALL(*this, DeviceDescriptionsReceived());
-  audio_system_->GetDeviceDescriptions(
-      true, base::Bind(&AudioSystemImplTest::OnGetDeviceDescriptions,
-                       base::Unretained(this), input_device_descriptions_));
-  WaitForCallback();
-}
-
-TEST_P(AudioSystemImplTest, GetOutputDeviceDescriptionsNoInputDevices) {
-  input_device_descriptions_.emplace_back("input_device_name",
-                                          "input_device_id", "group_id");
-  EXPECT_EQ(0, static_cast<int>(output_device_descriptions_.size()));
-  EXPECT_EQ(1, static_cast<int>(input_device_descriptions_.size()));
-  EXPECT_CALL(*this, DeviceDescriptionsReceived());
-  audio_system_->GetDeviceDescriptions(
-      false, base::Bind(&AudioSystemImplTest::OnGetDeviceDescriptions,
-                        base::Unretained(this), output_device_descriptions_));
-  WaitForCallback();
-}
-
-TEST_P(AudioSystemImplTest, GetOutputDeviceDescriptions) {
-  input_device_descriptions_.emplace_back("input_device_name",
-                                          "input_device_id", "group_id");
-  output_device_descriptions_.emplace_back("output_device_name1",
-                                           "output_device_id1", "group_id1");
-  output_device_descriptions_.emplace_back("output_device_name2",
-                                           "output_device_id2", "group_id2");
-  EXPECT_EQ(2, static_cast<int>(output_device_descriptions_.size()));
-  EXPECT_EQ(1, static_cast<int>(input_device_descriptions_.size()));
-  EXPECT_CALL(*this, DeviceDescriptionsReceived());
-  audio_system_->GetDeviceDescriptions(
-      false, base::Bind(&AudioSystemImplTest::OnGetDeviceDescriptions,
-                        base::Unretained(this), output_device_descriptions_));
-  WaitForCallback();
-}
-
-TEST_P(AudioSystemImplTest, GetAssociatedOutputDeviceID) {
-  const std::string associated_id("associated_id");
-  audio_manager_->SetAssociatedOutputDeviceIDCallback(
-      base::Bind([](const std::string& result,
-                    const std::string&) -> std::string { return result; },
-                 associated_id));
-
-  EXPECT_CALL(*this, AssociatedOutputDeviceIDReceived(associated_id));
-
-  audio_system_->GetAssociatedOutputDeviceID(
-      std::string(),
-      base::Bind(&AudioSystemImplTest::AssociatedOutputDeviceIDReceived,
-                 base::Unretained(this)));
-  WaitForCallback();
-}
-
-TEST_P(AudioSystemImplTest, GetInputDeviceInfoNoAssociation) {
-  EXPECT_CALL(*this, InputDeviceInfoReceived());
-
-  audio_system_->GetInputDeviceInfo(
-      kNonDefaultDeviceId,
-      base::Bind(&AudioSystemImplTest::OnInputDeviceInfo,
-                 base::Unretained(this), input_params_,
-                 base::Optional<AudioParameters>(), std::string()));
-  WaitForCallback();
-}
-
-TEST_P(AudioSystemImplTest, GetInputDeviceInfoWithAssociation) {
-  EXPECT_CALL(*this, InputDeviceInfoReceived());
-
-  const std::string associated_id("associated_id");
-  audio_manager_->SetAssociatedOutputDeviceIDCallback(
-      base::Bind([](const std::string& result,
-                    const std::string&) -> std::string { return result; },
-                 associated_id));
-
-  audio_system_->GetInputDeviceInfo(
-      kNonDefaultDeviceId, base::Bind(&AudioSystemImplTest::OnInputDeviceInfo,
-                                      base::Unretained(this), input_params_,
-                                      output_params_, associated_id));
-  WaitForCallback();
-}
-
-INSTANTIATE_TEST_CASE_P(, AudioSystemImplTest, testing::Values(false, true));
+INSTANTIATE_TYPED_TEST_CASE_P(AudioSystemImpl,
+                              AudioSystemTestTemplate,
+                              AudioSystemTestBaseVariations);
 
 }  // namespace media
diff --git a/media/audio/audio_system_test_util.cc b/media/audio/audio_system_test_util.cc
new file mode 100644
index 0000000..89a3625
--- /dev/null
+++ b/media/audio/audio_system_test_util.cc
@@ -0,0 +1,147 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "media/audio/audio_system_test_util.h"
+
+#include "base/bind.h"
+#include "base/memory/ptr_util.h"
+
+namespace media {
+
+bool operator==(const AudioDeviceDescription& lhs,
+                const AudioDeviceDescription& rhs) {
+  return lhs.device_name == rhs.device_name && lhs.unique_id == rhs.unique_id &&
+         lhs.group_id == rhs.group_id;
+}
+
+AudioSystem::OnAudioParamsCallback
+AudioSystemCallbackExpectations::GetAudioParamsCallback(
+    const base::Location& location,
+    base::OnceClosure on_cb_received,
+    const base::Optional<AudioParameters>& expected_params) {
+  return base::BindOnce(&AudioSystemCallbackExpectations::OnAudioParams,
+                        base::Unretained(this), location.ToString(),
+                        std::move(on_cb_received), expected_params);
+}
+
+AudioSystem::OnBoolCallback AudioSystemCallbackExpectations::GetBoolCallback(
+    const base::Location& location,
+    base::OnceClosure on_cb_received,
+    bool expected) {
+  return base::BindOnce(&AudioSystemCallbackExpectations::OnBool,
+                        base::Unretained(this), location.ToString(),
+                        std::move(on_cb_received), expected);
+}
+
+AudioSystem::OnDeviceDescriptionsCallback
+AudioSystemCallbackExpectations::GetDeviceDescriptionsCallback(
+    const base::Location& location,
+    base::OnceClosure on_cb_received,
+    const AudioDeviceDescriptions& expected_descriptions) {
+  return base::BindOnce(&AudioSystemCallbackExpectations::OnDeviceDescriptions,
+                        base::Unretained(this), location.ToString(),
+                        std::move(on_cb_received), expected_descriptions);
+}
+
+AudioSystem::OnInputDeviceInfoCallback
+AudioSystemCallbackExpectations::GetInputDeviceInfoCallback(
+    const base::Location& location,
+    base::OnceClosure on_cb_received,
+    const base::Optional<AudioParameters>& expected_input,
+    const base::Optional<AudioParameters>& expected_associated_output,
+    const std::string& expected_associated_device_id) {
+  return base::BindOnce(&AudioSystemCallbackExpectations::OnInputDeviceInfo,
+                        base::Unretained(this), location.ToString(),
+                        std::move(on_cb_received), expected_input,
+                        expected_associated_output,
+                        expected_associated_device_id);
+}
+
+AudioSystem::OnDeviceIdCallback
+AudioSystemCallbackExpectations::GetDeviceIdCallback(
+    const base::Location& location,
+    base::OnceClosure on_cb_received,
+    const std::string& expected_id) {
+  return base::BindOnce(&AudioSystemCallbackExpectations::OnDeviceId,
+                        base::Unretained(this), location.ToString(),
+                        std::move(on_cb_received), expected_id);
+}
+
+void AudioSystemCallbackExpectations::OnAudioParams(
+    const std::string& from_here,
+    base::OnceClosure on_cb_received,
+    const base::Optional<AudioParameters>& expected,
+    const base::Optional<AudioParameters>& received) {
+  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_) << from_here;
+  if (expected) {
+    EXPECT_TRUE(received) << from_here;
+    EXPECT_EQ(expected->AsHumanReadableString(),
+              received->AsHumanReadableString())
+        << from_here;
+  } else {
+    EXPECT_FALSE(received) << from_here;
+  }
+  std::move(on_cb_received).Run();
+}
+
+void AudioSystemCallbackExpectations::OnBool(const std::string& from_here,
+                                             base::OnceClosure on_cb_received,
+                                             bool expected,
+                                             bool result) {
+  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_) << from_here;
+  EXPECT_EQ(expected, result) << from_here;
+  std::move(on_cb_received).Run();
+}
+
+void AudioSystemCallbackExpectations::OnDeviceDescriptions(
+    const std::string& from_here,
+    base::OnceClosure on_cb_received,
+    const AudioDeviceDescriptions& expected_descriptions,
+    AudioDeviceDescriptions descriptions) {
+  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_) << from_here;
+  EXPECT_EQ(expected_descriptions, descriptions);
+  std::move(on_cb_received).Run();
+}
+
+void AudioSystemCallbackExpectations::OnInputDeviceInfo(
+    const std::string& from_here,
+    base::OnceClosure on_cb_received,
+    const base::Optional<AudioParameters>& expected_input,
+    const base::Optional<AudioParameters>& expected_associated_output,
+    const std::string& expected_associated_device_id,
+    const base::Optional<AudioParameters>& input,
+    const base::Optional<AudioParameters>& associated_output,
+    const std::string& associated_device_id) {
+  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_) << from_here;
+  if (expected_input) {
+    EXPECT_TRUE(input) << from_here;
+    EXPECT_EQ(expected_input->AsHumanReadableString(),
+              input->AsHumanReadableString())
+        << from_here;
+  } else {
+    EXPECT_FALSE(input) << from_here;
+  }
+  if (expected_associated_output) {
+    EXPECT_TRUE(associated_output) << from_here;
+    EXPECT_EQ(expected_associated_output->AsHumanReadableString(),
+              associated_output->AsHumanReadableString())
+        << from_here;
+  } else {
+    EXPECT_FALSE(associated_output) << from_here;
+  }
+  EXPECT_EQ(expected_associated_device_id, associated_device_id) << from_here;
+  std::move(on_cb_received).Run();
+}
+
+void AudioSystemCallbackExpectations::OnDeviceId(
+    const std::string& from_here,
+    base::OnceClosure on_cb_received,
+    const std::string& expected_id,
+    const std::string& result_id) {
+  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_) << from_here;
+  EXPECT_EQ(expected_id, result_id) << from_here;
+  std::move(on_cb_received).Run();
+}
+
+}  // namespace media
diff --git a/media/audio/audio_system_test_util.h b/media/audio/audio_system_test_util.h
new file mode 100644
index 0000000..1f20388
--- /dev/null
+++ b/media/audio/audio_system_test_util.h
@@ -0,0 +1,370 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef MEDIA_AUDIO_AUDIO_SYSTEM_TEST_UTIL_H_
+#define MEDIA_AUDIO_AUDIO_SYSTEM_TEST_UTIL_H_
+
+#include "base/bind.h"
+#include "base/location.h"
+#include "base/macros.h"
+#include "base/message_loop/message_loop.h"
+#include "base/optional.h"
+#include "base/run_loop.h"
+#include "base/threading/thread_checker.h"
+#include "media/audio/audio_device_description.h"
+#include "media/audio/audio_system.h"
+#include "media/audio/mock_audio_manager.h"
+#include "media/base/audio_parameters.h"
+#include "testing/gmock/include/gmock/gmock.h"
+
+namespace media {
+
+// For tests only. Creates AudioSystem callbacks to be passed to AudioSystem
+// methods. When AudioSystem calls such a callback, it verifies treading
+// expectations and checks recieved parameters against expected values passed
+// during its creation. After that it calls |on_cb_received| closure.
+// Note AudioSystemCallbackExpectations object must outlive all the callbacks
+// it produced, since they contain raw pointers to it.
+class AudioSystemCallbackExpectations {
+ public:
+  AudioSystemCallbackExpectations() = default;
+  AudioSystem::OnAudioParamsCallback GetAudioParamsCallback(
+      const base::Location& location,
+      base::OnceClosure on_cb_received,
+      const base::Optional<AudioParameters>& expected_params);
+
+  AudioSystem::OnBoolCallback GetBoolCallback(const base::Location& location,
+                                              base::OnceClosure on_cb_received,
+                                              bool expected);
+
+  AudioSystem::OnDeviceDescriptionsCallback GetDeviceDescriptionsCallback(
+      const base::Location& location,
+      base::OnceClosure on_cb_received,
+      const AudioDeviceDescriptions& expected_descriptions);
+
+  AudioSystem::OnInputDeviceInfoCallback GetInputDeviceInfoCallback(
+      const base::Location& location,
+      base::OnceClosure on_cb_received,
+      const base::Optional<AudioParameters>& expected_input,
+      const base::Optional<AudioParameters>& expected_associated_output,
+      const std::string& expected_associated_device_id);
+
+  AudioSystem::OnDeviceIdCallback GetDeviceIdCallback(
+      const base::Location& location,
+      base::OnceClosure on_cb_received,
+      const std::string& expected_id);
+
+ private:
+  // Methods to verify correctness of received data.
+  void OnAudioParams(const std::string& from_here,
+                     base::OnceClosure on_cb_received,
+                     const base::Optional<AudioParameters>& expected,
+                     const base::Optional<AudioParameters>& received);
+
+  void OnBool(const std::string& from_here,
+              base::OnceClosure on_cb_received,
+              bool expected,
+              bool result);
+
+  void OnDeviceDescriptions(
+      const std::string& from_here,
+      base::OnceClosure on_cb_received,
+      const AudioDeviceDescriptions& expected_descriptions,
+      AudioDeviceDescriptions descriptions);
+
+  void OnInputDeviceInfo(
+      const std::string& from_here,
+      base::OnceClosure on_cb_received,
+      const base::Optional<AudioParameters>& expected_input,
+      const base::Optional<AudioParameters>& expected_associated_output,
+      const std::string& expected_associated_device_id,
+      const base::Optional<AudioParameters>& input,
+      const base::Optional<AudioParameters>& associated_output,
+      const std::string& associated_device_id);
+
+  void OnDeviceId(const std::string& from_here,
+                  base::OnceClosure on_cb_received,
+                  const std::string& expected_id,
+                  const std::string& result_id);
+
+  THREAD_CHECKER(thread_checker_);
+  DISALLOW_COPY_AND_ASSIGN(AudioSystemCallbackExpectations);
+};
+
+// Template test case to test AudioSystem implementations.
+template <class T>
+class AudioSystemTestTemplate : public T {
+ public:
+  AudioSystemTestTemplate() {}
+  ~AudioSystemTestTemplate() override {}
+
+  void SetUp() override {
+    T::SetUp();
+    input_params_ =
+        AudioParameters(AudioParameters::AUDIO_PCM_LINEAR, CHANNEL_LAYOUT_MONO,
+                        AudioParameters::kTelephoneSampleRate, 16,
+                        AudioParameters::kTelephoneSampleRate / 10);
+    output_params_ =
+        AudioParameters(AudioParameters::AUDIO_PCM_LINEAR, CHANNEL_LAYOUT_MONO,
+                        AudioParameters::kTelephoneSampleRate, 16,
+                        AudioParameters::kTelephoneSampleRate / 20);
+    default_output_params_ =
+        AudioParameters(AudioParameters::AUDIO_PCM_LINEAR, CHANNEL_LAYOUT_MONO,
+                        AudioParameters::kTelephoneSampleRate, 16,
+                        AudioParameters::kTelephoneSampleRate / 30);
+    audio_manager()->SetInputStreamParameters(input_params_);
+    audio_manager()->SetOutputStreamParameters(output_params_);
+    audio_manager()->SetDefaultOutputStreamParameters(default_output_params_);
+
+    auto get_device_descriptions = [](const AudioDeviceDescriptions* source,
+                                      AudioDeviceDescriptions* destination) {
+      destination->insert(destination->end(), source->begin(), source->end());
+    };
+
+    audio_manager()->SetInputDeviceDescriptionsCallback(
+        base::Bind(get_device_descriptions,
+                   base::Unretained(&input_device_descriptions_)));
+    audio_manager()->SetOutputDeviceDescriptionsCallback(
+        base::Bind(get_device_descriptions,
+                   base::Unretained(&output_device_descriptions_)));
+  }
+
+ protected:
+  MockAudioManager* audio_manager() { return T::audio_manager(); }
+  AudioSystem* audio_system() { return T::audio_system(); }
+
+  AudioSystemCallbackExpectations expectations_;
+  AudioParameters input_params_;
+  AudioParameters output_params_;
+  AudioParameters default_output_params_;
+  AudioDeviceDescriptions input_device_descriptions_;
+  AudioDeviceDescriptions output_device_descriptions_;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(AudioSystemTestTemplate);
+};
+
+TYPED_TEST_CASE_P(AudioSystemTestTemplate);
+
+TYPED_TEST_P(AudioSystemTestTemplate, GetInputStreamParametersNormal) {
+  base::RunLoop wait_loop;
+  this->audio_system()->GetInputStreamParameters(
+      AudioDeviceDescription::kDefaultDeviceId,
+      this->expectations_.GetAudioParamsCallback(
+          FROM_HERE, wait_loop.QuitClosure(), this->input_params_));
+  wait_loop.Run();
+}
+
+TYPED_TEST_P(AudioSystemTestTemplate, GetInputStreamParametersNoDevice) {
+  this->audio_manager()->SetHasInputDevices(false);
+
+  base::RunLoop wait_loop;
+  this->audio_system()->GetInputStreamParameters(
+      AudioDeviceDescription::kDefaultDeviceId,
+      this->expectations_.GetAudioParamsCallback(
+          FROM_HERE, wait_loop.QuitClosure(),
+          base::Optional<AudioParameters>()));
+  wait_loop.Run();
+}
+
+TYPED_TEST_P(AudioSystemTestTemplate, GetOutputStreamParameters) {
+  base::RunLoop wait_loop;
+  this->audio_system()->GetOutputStreamParameters(
+      "non-default-device-id",
+      this->expectations_.GetAudioParamsCallback(
+          FROM_HERE, wait_loop.QuitClosure(), this->output_params_));
+  wait_loop.Run();
+}
+
+TYPED_TEST_P(AudioSystemTestTemplate, GetDefaultOutputStreamParameters) {
+  base::RunLoop wait_loop;
+  this->audio_system()->GetOutputStreamParameters(
+      AudioDeviceDescription::kDefaultDeviceId,
+      this->expectations_.GetAudioParamsCallback(
+          FROM_HERE, wait_loop.QuitClosure(), this->default_output_params_));
+  wait_loop.Run();
+}
+
+TYPED_TEST_P(AudioSystemTestTemplate,
+             GetOutputStreamParametersForDefaultDeviceNoDevices) {
+  this->audio_manager()->SetHasOutputDevices(false);
+  base::RunLoop wait_loop;
+  this->audio_system()->GetOutputStreamParameters(
+      AudioDeviceDescription::kDefaultDeviceId,
+      this->expectations_.GetAudioParamsCallback(
+          FROM_HERE, wait_loop.QuitClosure(),
+          base::Optional<AudioParameters>()));
+  wait_loop.Run();
+}
+
+TYPED_TEST_P(AudioSystemTestTemplate,
+             GetOutputStreamParametersForNonDefaultDeviceNoDevices) {
+  this->audio_manager()->SetHasOutputDevices(false);
+  base::RunLoop wait_loop;
+  this->audio_system()->GetOutputStreamParameters(
+      "non-default-device-id", this->expectations_.GetAudioParamsCallback(
+                                   FROM_HERE, wait_loop.QuitClosure(),
+                                   base::Optional<AudioParameters>()));
+  wait_loop.Run();
+}
+
+TYPED_TEST_P(AudioSystemTestTemplate, HasInputDevices) {
+  base::RunLoop wait_loop;
+  this->audio_system()->HasInputDevices(this->expectations_.GetBoolCallback(
+      FROM_HERE, wait_loop.QuitClosure(), true));
+  wait_loop.Run();
+}
+
+TYPED_TEST_P(AudioSystemTestTemplate, HasNoInputDevices) {
+  this->audio_manager()->SetHasInputDevices(false);
+  base::RunLoop wait_loop;
+  this->audio_system()->HasInputDevices(this->expectations_.GetBoolCallback(
+      FROM_HERE, wait_loop.QuitClosure(), false));
+  wait_loop.Run();
+}
+
+TYPED_TEST_P(AudioSystemTestTemplate, HasOutputDevices) {
+  base::RunLoop wait_loop;
+  this->audio_system()->HasOutputDevices(this->expectations_.GetBoolCallback(
+      FROM_HERE, wait_loop.QuitClosure(), true));
+  wait_loop.Run();
+}
+
+TYPED_TEST_P(AudioSystemTestTemplate, HasNoOutputDevices) {
+  this->audio_manager()->SetHasOutputDevices(false);
+  base::RunLoop wait_loop;
+  this->audio_system()->HasOutputDevices(this->expectations_.GetBoolCallback(
+      FROM_HERE, wait_loop.QuitClosure(), false));
+  wait_loop.Run();
+}
+
+TYPED_TEST_P(AudioSystemTestTemplate,
+             GetInputDeviceDescriptionsNoInputDevices) {
+  this->output_device_descriptions_.emplace_back(
+      "output_device_name", "output_device_id", "group_id");
+  EXPECT_EQ(0, static_cast<int>(this->input_device_descriptions_.size()));
+  EXPECT_EQ(1, static_cast<int>(this->output_device_descriptions_.size()));
+
+  base::RunLoop wait_loop;
+  this->audio_system()->GetDeviceDescriptions(
+      true, this->expectations_.GetDeviceDescriptionsCallback(
+                FROM_HERE, wait_loop.QuitClosure(),
+                this->input_device_descriptions_));
+  wait_loop.Run();
+}
+
+TYPED_TEST_P(AudioSystemTestTemplate, GetInputDeviceDescriptions) {
+  this->output_device_descriptions_.emplace_back(
+      "output_device_name", "output_device_id", "group_id");
+  this->input_device_descriptions_.emplace_back(
+      "input_device_name1", "input_device_id1", "group_id1");
+  this->input_device_descriptions_.emplace_back(
+      "input_device_name2", "input_device_id2", "group_id2");
+  EXPECT_EQ(2, static_cast<int>(this->input_device_descriptions_.size()));
+  EXPECT_EQ(1, static_cast<int>(this->output_device_descriptions_.size()));
+
+  base::RunLoop wait_loop;
+  this->audio_system()->GetDeviceDescriptions(
+      true, this->expectations_.GetDeviceDescriptionsCallback(
+                FROM_HERE, wait_loop.QuitClosure(),
+                this->input_device_descriptions_));
+  wait_loop.Run();
+}
+
+TYPED_TEST_P(AudioSystemTestTemplate,
+             GetOutputDeviceDescriptionsNoInputDevices) {
+  this->input_device_descriptions_.emplace_back("input_device_name",
+                                                "input_device_id", "group_id");
+  EXPECT_EQ(0, static_cast<int>(this->output_device_descriptions_.size()));
+  EXPECT_EQ(1, static_cast<int>(this->input_device_descriptions_.size()));
+
+  base::RunLoop wait_loop;
+  this->audio_system()->GetDeviceDescriptions(
+      false, this->expectations_.GetDeviceDescriptionsCallback(
+                 FROM_HERE, wait_loop.QuitClosure(),
+                 this->output_device_descriptions_));
+  wait_loop.Run();
+}
+
+TYPED_TEST_P(AudioSystemTestTemplate, GetOutputDeviceDescriptions) {
+  this->input_device_descriptions_.emplace_back("input_device_name",
+                                                "input_device_id", "group_id");
+  this->output_device_descriptions_.emplace_back(
+      "output_device_name1", "output_device_id1", "group_id1");
+  this->output_device_descriptions_.emplace_back(
+      "output_device_name2", "output_device_id2", "group_id2");
+  EXPECT_EQ(2, static_cast<int>(this->output_device_descriptions_.size()));
+  EXPECT_EQ(1, static_cast<int>(this->input_device_descriptions_.size()));
+
+  base::RunLoop wait_loop;
+  this->audio_system()->GetDeviceDescriptions(
+      false, this->expectations_.GetDeviceDescriptionsCallback(
+                 FROM_HERE, wait_loop.QuitClosure(),
+                 this->output_device_descriptions_));
+  wait_loop.Run();
+}
+
+TYPED_TEST_P(AudioSystemTestTemplate, GetAssociatedOutputDeviceID) {
+  const std::string associated_id("associated_id");
+  this->audio_manager()->SetAssociatedOutputDeviceIDCallback(
+      base::Bind([](const std::string& result,
+                    const std::string&) -> std::string { return result; },
+                 associated_id));
+
+  base::RunLoop wait_loop;
+  this->audio_system()->GetAssociatedOutputDeviceID(
+      std::string(), this->expectations_.GetDeviceIdCallback(
+                         FROM_HERE, wait_loop.QuitClosure(), associated_id));
+  wait_loop.Run();
+}
+
+TYPED_TEST_P(AudioSystemTestTemplate, GetInputDeviceInfoNoAssociation) {
+  base::RunLoop wait_loop;
+  this->audio_system()->GetInputDeviceInfo(
+      "non-default-device-id",
+      this->expectations_.GetInputDeviceInfoCallback(
+          FROM_HERE, wait_loop.QuitClosure(), this->input_params_,
+          base::Optional<AudioParameters>(), std::string()));
+  wait_loop.Run();
+}
+
+TYPED_TEST_P(AudioSystemTestTemplate, GetInputDeviceInfoWithAssociation) {
+  const std::string associated_id("associated_id");
+  this->audio_manager()->SetAssociatedOutputDeviceIDCallback(
+      base::Bind([](const std::string& result,
+                    const std::string&) -> std::string { return result; },
+                 associated_id));
+
+  base::RunLoop wait_loop;
+  this->audio_system()->GetInputDeviceInfo(
+      "non-default-device-id",
+      this->expectations_.GetInputDeviceInfoCallback(
+          FROM_HERE, wait_loop.QuitClosure(), this->input_params_,
+          this->output_params_, associated_id));
+  wait_loop.Run();
+}
+
+REGISTER_TYPED_TEST_CASE_P(
+    AudioSystemTestTemplate,
+    GetInputStreamParametersNormal,
+    GetInputStreamParametersNoDevice,
+    GetOutputStreamParameters,
+    GetDefaultOutputStreamParameters,
+    GetOutputStreamParametersForDefaultDeviceNoDevices,
+    GetOutputStreamParametersForNonDefaultDeviceNoDevices,
+    HasInputDevices,
+    HasNoInputDevices,
+    HasOutputDevices,
+    HasNoOutputDevices,
+    GetInputDeviceDescriptionsNoInputDevices,
+    GetInputDeviceDescriptions,
+    GetOutputDeviceDescriptionsNoInputDevices,
+    GetOutputDeviceDescriptions,
+    GetAssociatedOutputDeviceID,
+    GetInputDeviceInfoNoAssociation,
+    GetInputDeviceInfoWithAssociation);
+
+}  // namespace media
+
+#endif  // MEDIA_AUDIO_AUDIO_SYSTEM_TEST_UTIL_H_
diff --git a/services/network/public/cpp/BUILD.gn b/services/network/public/cpp/BUILD.gn
index a2df10ec..b9318813 100644
--- a/services/network/public/cpp/BUILD.gn
+++ b/services/network/public/cpp/BUILD.gn
@@ -10,8 +10,8 @@
     "cors_error_status.h",
     "net_adapters.cc",
     "net_adapters.h",
-    "url_loader_status.cc",
-    "url_loader_status.h",
+    "url_loader_completion_status.cc",
+    "url_loader_completion_status.h",
   ]
 
   deps = [
diff --git a/services/network/public/cpp/url_loader_completion_status.cc b/services/network/public/cpp/url_loader_completion_status.cc
new file mode 100644
index 0000000..8183d5b
--- /dev/null
+++ b/services/network/public/cpp/url_loader_completion_status.cc
@@ -0,0 +1,37 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "services/network/public/cpp/url_loader_completion_status.h"
+
+#include "net/base/net_errors.h"
+
+namespace network {
+
+URLLoaderCompletionStatus::URLLoaderCompletionStatus() = default;
+URLLoaderCompletionStatus::URLLoaderCompletionStatus(
+    const URLLoaderCompletionStatus& status) = default;
+
+URLLoaderCompletionStatus::URLLoaderCompletionStatus(int error_code)
+    : error_code(error_code), completion_time(base::TimeTicks::Now()) {}
+
+URLLoaderCompletionStatus::URLLoaderCompletionStatus(
+    const CORSErrorStatus& error)
+    : URLLoaderCompletionStatus(net::ERR_FAILED) {
+  cors_error_status = error;
+}
+
+URLLoaderCompletionStatus::~URLLoaderCompletionStatus() = default;
+
+bool URLLoaderCompletionStatus::operator==(
+    const URLLoaderCompletionStatus& rhs) const {
+  return error_code == rhs.error_code &&
+         exists_in_cache == rhs.exists_in_cache &&
+         completion_time == rhs.completion_time &&
+         encoded_data_length == rhs.encoded_data_length &&
+         encoded_body_length == rhs.encoded_body_length &&
+         decoded_body_length == rhs.decoded_body_length &&
+         cors_error_status == rhs.cors_error_status;
+}
+
+}  // namespace network
diff --git a/services/network/public/cpp/url_loader_status.h b/services/network/public/cpp/url_loader_completion_status.h
similarity index 69%
rename from services/network/public/cpp/url_loader_status.h
rename to services/network/public/cpp/url_loader_completion_status.h
index 0c08a8ba..2c39f8c 100644
--- a/services/network/public/cpp/url_loader_status.h
+++ b/services/network/public/cpp/url_loader_completion_status.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef SERVICES_NETWORK_PUBLIC_CPP_URL_LOADER_STATUS_H_
-#define SERVICES_NETWORK_PUBLIC_CPP_URL_LOADER_STATUS_H_
+#ifndef SERVICES_NETWORK_PUBLIC_CPP_URL_LOADER_COMPLETION_STATUS_H_
+#define SERVICES_NETWORK_PUBLIC_CPP_URL_LOADER_COMPLETION_STATUS_H_
 
 #include <stdint.h>
 
@@ -15,21 +15,21 @@
 
 namespace network {
 
-struct URLLoaderStatus {
-  URLLoaderStatus();
-  URLLoaderStatus(const URLLoaderStatus& status);
+struct URLLoaderCompletionStatus {
+  URLLoaderCompletionStatus();
+  URLLoaderCompletionStatus(const URLLoaderCompletionStatus& status);
 
   // Sets |error_code| to |error_code| and base::TimeTicks::Now() to
   // |completion_time|.
-  explicit URLLoaderStatus(int error_code);
+  explicit URLLoaderCompletionStatus(int error_code);
 
   // Sets ERR_FAILED to |error_code|, |error| to |cors_error_status|, and
   // base::TimeTicks::Now() to |completion_time|.
-  explicit URLLoaderStatus(const CORSErrorStatus& error);
+  explicit URLLoaderCompletionStatus(const CORSErrorStatus& error);
 
-  ~URLLoaderStatus();
+  ~URLLoaderCompletionStatus();
 
-  bool operator==(const URLLoaderStatus& rhs) const;
+  bool operator==(const URLLoaderCompletionStatus& rhs) const;
 
   // The error code. ERR_FAILED is set for CORS errors.
   int error_code = 0;
@@ -55,4 +55,4 @@
 
 }  // namespace network
 
-#endif  // SERVICES_NETWORK_PUBLIC_CPP_URL_LOADER_STATUS_H_
+#endif  // SERVICES_NETWORK_PUBLIC_CPP_URL_LOADER_COMPLETION_STATUS_H_
diff --git a/services/network/public/cpp/url_loader_status.cc b/services/network/public/cpp/url_loader_status.cc
deleted file mode 100644
index 6b4f7dc..0000000
--- a/services/network/public/cpp/url_loader_status.cc
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "services/network/public/cpp/url_loader_status.h"
-
-#include "net/base/net_errors.h"
-
-namespace network {
-
-URLLoaderStatus::URLLoaderStatus() = default;
-URLLoaderStatus::URLLoaderStatus(const URLLoaderStatus& status) = default;
-
-URLLoaderStatus::URLLoaderStatus(int error_code)
-    : error_code(error_code), completion_time(base::TimeTicks::Now()) {}
-
-URLLoaderStatus::URLLoaderStatus(const CORSErrorStatus& error)
-    : URLLoaderStatus(net::ERR_FAILED) {
-  cors_error_status = error;
-}
-
-URLLoaderStatus::~URLLoaderStatus() = default;
-
-bool URLLoaderStatus::operator==(const URLLoaderStatus& rhs) const {
-  return error_code == rhs.error_code &&
-         exists_in_cache == rhs.exists_in_cache &&
-         completion_time == rhs.completion_time &&
-         encoded_data_length == rhs.encoded_data_length &&
-         encoded_body_length == rhs.encoded_body_length &&
-         decoded_body_length == rhs.decoded_body_length &&
-         cors_error_status == rhs.cors_error_status;
-}
-
-}  // namespace network
diff --git a/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json b/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json
index b130dd7..ca5f00f 100644
--- a/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json
+++ b/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json
@@ -4987,6 +4987,12 @@
      {}
     ]
    ],
+   "wake-lock/wakelock-applicability-manual.https.html": [
+    [
+     "/wake-lock/wakelock-applicability-manual.https.html",
+     {}
+    ]
+   ],
    "web-nfc/nfc_hw_disabled-manual.https.html": [
     [
      "/web-nfc/nfc_hw_disabled-manual.https.html",
@@ -142962,6 +142968,16 @@
      {}
     ]
    ],
+   "wake-lock/wakelock-applicability-manual.https-expected.txt": [
+    [
+     {}
+    ]
+   ],
+   "wake-lock/wakelock-cancel-twice.https-expected.txt": [
+    [
+     {}
+    ]
+   ],
    "wake-lock/wakelock-disabled-by-feature-policy.https.sub-expected.txt": [
     [
      {}
@@ -142972,6 +142988,11 @@
      {}
     ]
    ],
+   "wake-lock/wakelock-document-hidden.https-expected.txt": [
+    [
+     {}
+    ]
+   ],
    "wake-lock/wakelock-enabled-by-feature-policy-attribute-redirect-on-load.https.sub-expected.txt": [
     [
      {}
@@ -206282,12 +206303,24 @@
      {}
     ]
    ],
+   "wake-lock/wakelock-cancel-twice.https.html": [
+    [
+     "/wake-lock/wakelock-cancel-twice.https.html",
+     {}
+    ]
+   ],
    "wake-lock/wakelock-disabled-by-feature-policy.https.sub.html": [
     [
      "/wake-lock/wakelock-disabled-by-feature-policy.https.sub.html",
      {}
     ]
    ],
+   "wake-lock/wakelock-document-hidden.https.html": [
+    [
+     "/wake-lock/wakelock-document-hidden.https.html",
+     {}
+    ]
+   ],
    "wake-lock/wakelock-enabled-by-feature-policy-attribute-redirect-on-load.https.sub.html": [
     [
      "/wake-lock/wakelock-enabled-by-feature-policy-attribute-redirect-on-load.https.sub.html",
@@ -206312,6 +206345,12 @@
      {}
     ]
    ],
+   "wake-lock/wakelock-insecure-context.html": [
+    [
+     "/wake-lock/wakelock-insecure-context.html",
+     {}
+    ]
+   ],
    "wake-lock/wakelock-object-is-independent.https.html": [
     [
      "/wake-lock/wakelock-object-is-independent.https.html",
@@ -227176,7 +227215,7 @@
    "testharness"
   ],
   "content-security-policy/nonce-hiding/script-nonces-hidden.tentative.html": [
-   "c3265d6ead066201f712aa06beac162f365dd058",
+   "44982a605aaef57edfd9bbd9af98b1eee8d9ba1d",
    "testharness"
   ],
   "content-security-policy/nonce-hiding/script-nonces-hidden.tentative.html.headers": [
@@ -334004,7 +334043,23 @@
    "support"
   ],
   "wake-lock/wakelock-api.https.html": [
-   "a80557f44c8381495d80030ee8868153bfffd3da",
+   "0718abe7cc05382646dc83e5085bf5a35c025e6c",
+   "testharness"
+  ],
+  "wake-lock/wakelock-applicability-manual.https-expected.txt": [
+   "001b1c6dafec13d79e84d0e990b36400321d1166",
+   "support"
+  ],
+  "wake-lock/wakelock-applicability-manual.https.html": [
+   "bbed9a382c8e9a9a26f7690b06fdbffc5ef4a794",
+   "manual"
+  ],
+  "wake-lock/wakelock-cancel-twice.https-expected.txt": [
+   "b0a5425f36a26991382f7deaa17f0262530aeddb",
+   "support"
+  ],
+  "wake-lock/wakelock-cancel-twice.https.html": [
+   "a9850a6eb525af1c37e06686df1b8a075f2456f8",
    "testharness"
   ],
   "wake-lock/wakelock-disabled-by-feature-policy.https.sub-expected.txt": [
@@ -334012,19 +334067,27 @@
    "support"
   ],
   "wake-lock/wakelock-disabled-by-feature-policy.https.sub.html": [
-   "5ba667dc3f35e64b39be7cc938cf1cb93fc6f464",
+   "d3786da8619cfc0409f979235af29e587e4c41bc",
    "testharness"
   ],
   "wake-lock/wakelock-disabled-by-feature-policy.https.sub.html.headers": [
    "199fe1ce290a8570204cc58027f7b808d7ef3500",
    "support"
   ],
+  "wake-lock/wakelock-document-hidden.https-expected.txt": [
+   "34fda95115e3de9c927032516d9b996f9584a90f",
+   "support"
+  ],
+  "wake-lock/wakelock-document-hidden.https.html": [
+   "ae8838e5fb164218f7dbf431546ed20b820f7c0c",
+   "testharness"
+  ],
   "wake-lock/wakelock-enabled-by-feature-policy-attribute-redirect-on-load.https.sub-expected.txt": [
    "b9b36598f6223282e87cdd447354edb1b2630587",
    "support"
   ],
   "wake-lock/wakelock-enabled-by-feature-policy-attribute-redirect-on-load.https.sub.html": [
-   "bba2a95be9eeba9a4b67a9db92dc7d793fc26759",
+   "6f7fd8d684092ad53058a2bdfe4ae4070a18e290",
    "testharness"
   ],
   "wake-lock/wakelock-enabled-by-feature-policy-attribute.https.sub-expected.txt": [
@@ -334032,7 +334095,7 @@
    "support"
   ],
   "wake-lock/wakelock-enabled-by-feature-policy-attribute.https.sub.html": [
-   "37f30f21addedbe30955eefe22f65302a2a97ed5",
+   "ca6f005d18f1193fc1bc141d58e76248e93b66d8",
    "testharness"
   ],
   "wake-lock/wakelock-enabled-by-feature-policy.https.sub-expected.txt": [
@@ -334040,7 +334103,7 @@
    "support"
   ],
   "wake-lock/wakelock-enabled-by-feature-policy.https.sub.html": [
-   "ee3386a75ce86ebec42032712acde03ebc064eda",
+   "98b988fc7fd156c756c4c430f2c50cd0110a124a",
    "testharness"
   ],
   "wake-lock/wakelock-enabled-by-feature-policy.https.sub.html.headers": [
@@ -334052,19 +334115,23 @@
    "support"
   ],
   "wake-lock/wakelock-enabled-on-self-origin-by-feature-policy.https.sub.html": [
-   "328c6459efefdb2ed1f33522c8c51c5aa2aa1496",
+   "f928dc7732050e52152ccfb1c5a9a4282216b70f",
    "testharness"
   ],
   "wake-lock/wakelock-enabled-on-self-origin-by-feature-policy.https.sub.html.headers": [
    "7a77973dc947ef10abe33be288fd610c42d96e97",
    "support"
   ],
+  "wake-lock/wakelock-insecure-context.html": [
+   "527a75868eab39b899113cae81601630f9850790",
+   "testharness"
+  ],
   "wake-lock/wakelock-object-is-independent.https-expected.txt": [
    "9f2c345a6fb831bc47a611af405f2bc0311a7fed",
    "support"
   ],
   "wake-lock/wakelock-object-is-independent.https.html": [
-   "b104d9af062710134b69474008b583706eee7978",
+   "7db6e3ce66953a719bda56bf0ecee5a8d26a7292",
    "testharness"
   ],
   "wake-lock/wakelock-onactivechange.https-expected.txt": [
@@ -334072,7 +334139,7 @@
    "support"
   ],
   "wake-lock/wakelock-onactivechange.https.html": [
-   "c85d61aca951edc5378028c1c120222683744de6",
+   "cbf4c5d6351e01ccc1a3e0e3e05afb16968a7edd",
    "testharness"
   ],
   "wake-lock/wakelock-type.https-expected.txt": [
@@ -334080,7 +334147,7 @@
    "support"
   ],
   "wake-lock/wakelock-type.https.html": [
-   "6fac8079855d7aedb52aee508cb866de51c41c0c",
+   "583647213b49b7bc67cad08192db3e6abcd1de9f",
    "testharness"
   ],
   "wasm/OWNERS": [
@@ -334216,7 +334283,7 @@
    "testharness"
   ],
   "web-animations/interfaces/Animatable/animate-expected.txt": [
-   "707c644d1e5279e7095a7a305ea3bc027fdebcb8",
+   "f2e65323cc15eb82b823b690c9d0c17af75f40a5",
    "support"
   ],
   "web-animations/interfaces/Animatable/animate-no-browsing-context-expected.txt": [
@@ -334388,7 +334455,7 @@
    "testharness"
   ],
   "web-animations/interfaces/KeyframeEffect/composite-expected.txt": [
-   "5d6cef64e481d6e8b69f6185ce28b91df51ce56f",
+   "c0ce440ef3789beb3a286bd7ca17e8c6ba93b792",
    "support"
   ],
   "web-animations/interfaces/KeyframeEffect/composite.html": [
@@ -334396,7 +334463,7 @@
    "testharness"
   ],
   "web-animations/interfaces/KeyframeEffect/constructor-expected.txt": [
-   "d99b9c7011dfcff6e549fedde0373904ca300d01",
+   "9cc22f3feaca7e591174fb228a7aeef4555d37fd",
    "support"
   ],
   "web-animations/interfaces/KeyframeEffect/constructor.html": [
@@ -334420,7 +334487,7 @@
    "testharness"
   ],
   "web-animations/interfaces/KeyframeEffect/idlharness-expected.txt": [
-   "d7766e1ed6c7c5dd32b4ca6460019108ca8c4a46",
+   "93130453baea226469caa4968ea606fb451dc463",
    "support"
   ],
   "web-animations/interfaces/KeyframeEffect/idlharness.html": [
@@ -334436,7 +334503,7 @@
    "testharness"
   ],
   "web-animations/interfaces/KeyframeEffect/processing-a-keyframes-argument-001-expected.txt": [
-   "9c2cf2cc6957e6b5a22790dcd0adffea335b3b9a",
+   "88a298fef74ba67db89a318016d6a669e28522e4",
    "support"
   ],
   "web-animations/interfaces/KeyframeEffect/processing-a-keyframes-argument-001.html": [
@@ -334444,7 +334511,7 @@
    "testharness"
   ],
   "web-animations/interfaces/KeyframeEffect/processing-a-keyframes-argument-002-expected.txt": [
-   "136ca9ffd56cc7ad79aa9a1810217178a528cfac",
+   "e1bdc2f4e3956dc0fd6cb498419e5a43855a7a12",
    "support"
   ],
   "web-animations/interfaces/KeyframeEffect/processing-a-keyframes-argument-002.html": [
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css-contain/contain-style-counters-ref.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-contain/contain-style-counters-ref.html
similarity index 100%
rename from third_party/WebKit/LayoutTests/external/wpt/css-contain/contain-style-counters-ref.html
rename to third_party/WebKit/LayoutTests/external/wpt/css/css-contain/contain-style-counters-ref.html
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css-contain/contain-style-counters.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-contain/contain-style-counters.html
similarity index 100%
rename from third_party/WebKit/LayoutTests/external/wpt/css-contain/contain-style-counters.html
rename to third_party/WebKit/LayoutTests/external/wpt/css/css-contain/contain-style-counters.html
diff --git a/third_party/WebKit/LayoutTests/external/wpt/wake-lock/wakelock-api.https.html b/third_party/WebKit/LayoutTests/external/wpt/wake-lock/wakelock-api.https.html
index bce4e149..00d5b19 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/wake-lock/wakelock-api.https.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/wake-lock/wakelock-api.https.html
@@ -2,8 +2,8 @@
 <meta charset="utf-8">
 <title>Wake Lock API Test</title>
 <link rel="help" href="https://w3c.github.io/wake-lock/">
-<script src=/resources/testharness.js></script>
-<script src=/resources/testharnessreport.js></script>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
 
 <script>
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/wake-lock/wakelock-applicability-manual.https-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/wake-lock/wakelock-applicability-manual.https-expected.txt
new file mode 100644
index 0000000..86dbd74
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/wake-lock/wakelock-applicability-manual.https-expected.txt
@@ -0,0 +1,5 @@
+This is a testharness.js-based test.
+FAIL The screen wake lock isn't applicable after the screen is manually swiched off by the user until it is switched on again. promise_test: Unhandled rejection with value: object "TypeError: navigator.getWakeLock is not a function"
+FAIL Manually switching off the screen will not affect the applicability of the system wake lock. promise_test: Unhandled rejection with value: object "TypeError: navigator.getWakeLock is not a function"
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/external/wpt/wake-lock/wakelock-applicability-manual.https.html b/third_party/WebKit/LayoutTests/external/wpt/wake-lock/wakelock-applicability-manual.https.html
new file mode 100644
index 0000000..5dbd278
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/wake-lock/wakelock-applicability-manual.https.html
@@ -0,0 +1,51 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>wake lock applicability test</title>
+<link rel="help" href="https://w3c.github.io/wake-lock/#dfn-the-wake-lock-is-applicable">
+<meta name="flags" content="interact">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<p>
+  Lock and turn off the screen, then turn on and unlock the screen.
+</p>
+<p>
+  Note: All the actions need to be done in 60 seconds, otherwise it will get TIMEOUT.
+</p>
+<script>
+
+setup({ explicit_timeout: true });
+
+promise_test(async t => {
+  const wakeLock = await navigator.getWakeLock("screen");
+  const request = wakeLock.createRequest();
+  assert_true(wakeLock.active, "the active is true when wake lock is acquired");
+  const eventWatcher = new EventWatcher(t, document, "visibilitychange")
+
+  //lock screen to fire 'visibilitychange'
+  await eventWatcher.wait_for("visibilitychange");
+  assert_true(document.hidden, "document is hidden when screen is locked");
+  assert_false(wakeLock.active, "the screen wake lock is not active when screen is switched off");
+
+  //unlock screen to fire 'visibilitychange'
+  await eventWatcher.wait_for("visibilitychange");
+  assert_false(document.hidden, "document is visiable when screen is unlocked");
+  assert_true(wakeLock.active, "the screen wake lock is active when screen is switched on again");
+  request.cancel();
+}, "The screen wake lock isn't applicable after the screen is manually swiched off"
+  + " by the user until it is switched on again.");
+
+
+promise_test(async t => {
+  const wakeLock = await navigator.getWakeLock("system");
+  const request = wakeLock.createRequest();
+  assert_true(wakeLock.active, "the active is true when wake lock is acquired");
+  const eventWatcher = new EventWatcher(t, document, "visibilitychange")
+
+  //lock screen to fire 'visibilitychange'
+  await eventWatcher.wait_for("visibilitychange");
+  assert_true(document.hidden, "document is hidden when screen is locked");
+  assert_true(wakeLock.active, "the system wake lock is still active when screen is switched off");
+  request.cancel();
+}, "Manually switching off the screen will not affect the applicability of the system wake lock.");
+
+</script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/wake-lock/wakelock-cancel-twice.https-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/wake-lock/wakelock-cancel-twice.https-expected.txt
new file mode 100644
index 0000000..ffcce73a
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/wake-lock/wakelock-cancel-twice.https-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL no exception is thrown when invoking cancel() twice promise_test: Unhandled rejection with value: object "TypeError: navigator.getWakeLock is not a function"
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/external/wpt/wake-lock/wakelock-cancel-twice.https.html b/third_party/WebKit/LayoutTests/external/wpt/wake-lock/wakelock-cancel-twice.https.html
new file mode 100644
index 0000000..68e8a195
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/wake-lock/wakelock-cancel-twice.https.html
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>no exception is thrown when invoking cancel() twice</title>
+<link rel="help" href="https://w3c.github.io/wake-lock/#dom-wakelockrequest-cancel">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+
+promise_test(async t => {
+  const wakeLock = await navigator.getWakeLock("screen");
+  const request = wakeLock.createRequest();
+  assert_true(wakeLock.active, "the activate is true when wake lock is acquired");
+  request.cancel();
+  assert_false(wakeLock.active, "the activate is false when wake lock is released");
+  //If the cancel() method has already been invoked on this object,
+  //abort these steps, no error fired
+  request.cancel();
+}, "no exception is thrown when invoking cancel() twice");
+
+</script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/wake-lock/wakelock-disabled-by-feature-policy.https.sub.html b/third_party/WebKit/LayoutTests/external/wpt/wake-lock/wakelock-disabled-by-feature-policy.https.sub.html
index 440e793..75064767 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/wake-lock/wakelock-disabled-by-feature-policy.https.sub.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/wake-lock/wakelock-disabled-by-feature-policy.https.sub.html
@@ -1,8 +1,8 @@
 <!DOCTYPE html>
 <body>
-<script src=/resources/testharness.js></script>
-<script src=/resources/testharnessreport.js></script>
-<script src=/feature-policy/resources/featurepolicy.js></script>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/feature-policy/resources/featurepolicy.js"></script>
 <script>
   "use strict";
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/wake-lock/wakelock-document-hidden.https-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/wake-lock/wakelock-document-hidden.https-expected.txt
new file mode 100644
index 0000000..e40f1fd
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/wake-lock/wakelock-document-hidden.https-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL Test that screen wake lock will not be actived in hidden document promise_test: Unhandled rejection with value: object "TypeError: navigator.getWakeLock is not a function"
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/external/wpt/wake-lock/wakelock-document-hidden.https.html b/third_party/WebKit/LayoutTests/external/wpt/wake-lock/wakelock-document-hidden.https.html
new file mode 100644
index 0000000..6bb406a1
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/wake-lock/wakelock-document-hidden.https.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>screen wake lock will not be actived in hidden document</title>
+<link rel="help" href="https://w3c.github.io/wake-lock/#dfn-requesting-the-wake-lock">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+
+promise_test(async t => {
+  const wakeLock = await navigator.getWakeLock("screen");
+  const request = wakeLock.createRequest();
+  assert_true(wakeLock.active, "the active is true when wake lock is acquired");
+  const eventWatcher = new EventWatcher(t, document, "visibilitychange");
+  const win = window.open("about:blank", "_blank");
+
+  await eventWatcher.wait_for("visibilitychange");
+  assert_true(document.hidden, "document is hidden when new window is opened");
+  assert_false(wakeLock.active, "the active is false when document is hidden");
+  win.close();
+
+  await eventWatcher.wait_for("visibilitychange");
+  assert_false(document.hidden, "document is visiable when new window is closed");
+  assert_true(wakeLock.active, "the active is true when document regains visibility");
+  request.cancel();
+}, "Test that screen wake lock will not be actived in hidden document");
+
+</script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/wake-lock/wakelock-enabled-by-feature-policy-attribute-redirect-on-load.https.sub.html b/third_party/WebKit/LayoutTests/external/wpt/wake-lock/wakelock-enabled-by-feature-policy-attribute-redirect-on-load.https.sub.html
index 24502f1eb..74875937 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/wake-lock/wakelock-enabled-by-feature-policy-attribute-redirect-on-load.https.sub.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/wake-lock/wakelock-enabled-by-feature-policy-attribute-redirect-on-load.https.sub.html
@@ -1,8 +1,8 @@
 <!DOCTYPE html>
 <body>
-<script src=/resources/testharness.js></script>
-<script src=/resources/testharnessreport.js></script>
-<script src=/feature-policy/resources/featurepolicy.js></script>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/feature-policy/resources/featurepolicy.js"></script>
 <script>
   "use strict";
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/wake-lock/wakelock-enabled-by-feature-policy-attribute.https.sub.html b/third_party/WebKit/LayoutTests/external/wpt/wake-lock/wakelock-enabled-by-feature-policy-attribute.https.sub.html
index 36cfaca..185f5ad1 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/wake-lock/wakelock-enabled-by-feature-policy-attribute.https.sub.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/wake-lock/wakelock-enabled-by-feature-policy-attribute.https.sub.html
@@ -1,8 +1,8 @@
 <!DOCTYPE html>
 <body>
-<script src=/resources/testharness.js></script>
-<script src=/resources/testharnessreport.js></script>
-<script src=/feature-policy/resources/featurepolicy.js></script>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/feature-policy/resources/featurepolicy.js"></script>
 <script>
   "use strict";
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/wake-lock/wakelock-enabled-by-feature-policy.https.sub.html b/third_party/WebKit/LayoutTests/external/wpt/wake-lock/wakelock-enabled-by-feature-policy.https.sub.html
index 83c63fb..eb49be5 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/wake-lock/wakelock-enabled-by-feature-policy.https.sub.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/wake-lock/wakelock-enabled-by-feature-policy.https.sub.html
@@ -1,8 +1,8 @@
 <!DOCTYPE html>
 <body>
-<script src=/resources/testharness.js></script>
-<script src=/resources/testharnessreport.js></script>
-<script src=/feature-policy/resources/featurepolicy.js></script>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/feature-policy/resources/featurepolicy.js"></script>
 <script>
   "use strict";
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/wake-lock/wakelock-enabled-on-self-origin-by-feature-policy.https.sub.html b/third_party/WebKit/LayoutTests/external/wpt/wake-lock/wakelock-enabled-on-self-origin-by-feature-policy.https.sub.html
index 646d8680..dbd8ec9 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/wake-lock/wakelock-enabled-on-self-origin-by-feature-policy.https.sub.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/wake-lock/wakelock-enabled-on-self-origin-by-feature-policy.https.sub.html
@@ -1,8 +1,8 @@
 <!DOCTYPE html>
 <body>
-<script src=/resources/testharness.js></script>
-<script src=/resources/testharnessreport.js></script>
-<script src=/feature-policy/resources/featurepolicy.js></script>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/feature-policy/resources/featurepolicy.js"></script>
 
 <script>
   "use strict";
diff --git a/third_party/WebKit/LayoutTests/external/wpt/wake-lock/wakelock-insecure-context.html b/third_party/WebKit/LayoutTests/external/wpt/wake-lock/wakelock-insecure-context.html
new file mode 100644
index 0000000..8d728f8
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/wake-lock/wakelock-insecure-context.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Wake Lock API is not exposed in an insecure context</title>
+<link rel="help" href="https://w3c.github.io/wake-lock/#wake-locks">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+
+test(t => {
+  assert_false("getWakeLock" in navigator, "'getWakeLock' must not be exposed");
+}, "Wake Lock API is not exposed in an insecure context");
+
+</script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/wake-lock/wakelock-object-is-independent.https.html b/third_party/WebKit/LayoutTests/external/wpt/wake-lock/wakelock-object-is-independent.https.html
index c781830..f0493ee 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/wake-lock/wakelock-object-is-independent.https.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/wake-lock/wakelock-object-is-independent.https.html
@@ -2,8 +2,8 @@
 <meta charset="utf-8">
 <title>WakeLock object is independent</title>
 <link rel="help" href="https://w3c.github.io/wake-lock/">
-<script src=/resources/testharness.js></script>
-<script src=/resources/testharnessreport.js></script>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
 
 <body>
 <script id="iframe" type="text/plain">
diff --git a/third_party/WebKit/LayoutTests/external/wpt/wake-lock/wakelock-onactivechange.https.html b/third_party/WebKit/LayoutTests/external/wpt/wake-lock/wakelock-onactivechange.https.html
index dc5c7ebe..899b9b78 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/wake-lock/wakelock-onactivechange.https.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/wake-lock/wakelock-onactivechange.https.html
@@ -2,8 +2,8 @@
 <meta charset="utf-8">
 <title>Wake Lock 'onactivechange' Test</title>
 <link rel="help" href="https://w3c.github.io/wake-lock/">
-<script src=/resources/testharness.js></script>
-<script src=/resources/testharnessreport.js></script>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
 
 <script>
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/wake-lock/wakelock-type.https.html b/third_party/WebKit/LayoutTests/external/wpt/wake-lock/wakelock-type.https.html
index 969e2f2..70aa129a 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/wake-lock/wakelock-type.https.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/wake-lock/wakelock-type.https.html
@@ -2,8 +2,8 @@
 <meta charset="utf-8">
 <title>WakeLockType Test</title>
 <link rel="help" href="https://w3c.github.io/wake-lock/">
-<script src=/resources/testharness.js></script>
-<script src=/resources/testharnessreport.js></script>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
 
 <script>
 
diff --git a/third_party/WebKit/Source/core/html/HTMLFrameSetElement.cpp b/third_party/WebKit/Source/core/html/HTMLFrameSetElement.cpp
index 1d6bc21..da5eca7 100644
--- a/third_party/WebKit/Source/core/html/HTMLFrameSetElement.cpp
+++ b/third_party/WebKit/Source/core/html/HTMLFrameSetElement.cpp
@@ -31,6 +31,7 @@
 #include "core/events/MouseEvent.h"
 #include "core/frame/LocalFrame.h"
 #include "core/frame/LocalFrameClient.h"
+#include "core/frame/UseCounter.h"
 #include "core/html/HTMLCollection.h"
 #include "core/html/HTMLFrameElement.h"
 #include "core/html_names.h"
@@ -297,7 +298,13 @@
   Document* document = ToHTMLFrameElement(frame_element)->contentDocument();
   if (!document || !document->GetFrame())
     return nullptr;
-  return document->domWindow();
+
+  LocalDOMWindow* window = document->domWindow();
+  if (window) {
+    UseCounter::Count(
+        *document, WebFeature::kHTMLFrameSetElementNonNullAnonymousNamedGetter);
+  }
+  return window;
 }
 
 }  // namespace blink
diff --git a/third_party/WebKit/Source/core/layout/ng/geometry/ng_physical_offset.cc b/third_party/WebKit/Source/core/layout/ng/geometry/ng_physical_offset.cc
index 3b8269f..de468e7 100644
--- a/third_party/WebKit/Source/core/layout/ng/geometry/ng_physical_offset.cc
+++ b/third_party/WebKit/Source/core/layout/ng/geometry/ng_physical_offset.cc
@@ -74,6 +74,10 @@
 NGPhysicalOffset::NGPhysicalOffset(const LayoutPoint& source)
     : left(source.X()), top(source.Y()) {}
 
+LayoutPoint NGPhysicalOffset::ToLayoutPoint() const {
+  return {left, top};
+}
+
 String NGPhysicalOffset::ToString() const {
   return String::Format("%d,%d", left.ToInt(), top.ToInt());
 }
diff --git a/third_party/WebKit/Source/core/layout/ng/geometry/ng_physical_offset.h b/third_party/WebKit/Source/core/layout/ng/geometry/ng_physical_offset.h
index e8d29a6..db136a35 100644
--- a/third_party/WebKit/Source/core/layout/ng/geometry/ng_physical_offset.h
+++ b/third_party/WebKit/Source/core/layout/ng/geometry/ng_physical_offset.h
@@ -46,6 +46,10 @@
   // logical/physical distinctions.
   explicit NGPhysicalOffset(const LayoutPoint&);
 
+  // Conversions from/to existing code. New code prefers type safety for
+  // logical/physical distinctions.
+  LayoutPoint ToLayoutPoint() const;
+
   String ToString() const;
 };
 
diff --git a/third_party/WebKit/Source/modules/media_capabilities/MediaCapabilities.idl b/third_party/WebKit/Source/modules/media_capabilities/MediaCapabilities.idl
index 21def833..92971bcb 100644
--- a/third_party/WebKit/Source/modules/media_capabilities/MediaCapabilities.idl
+++ b/third_party/WebKit/Source/modules/media_capabilities/MediaCapabilities.idl
@@ -6,7 +6,7 @@
 
 [
     Exposed=Window,
-    RuntimeEnabled=MediaCapabilities
+    OriginTrialEnabled=MediaCapabilities
 ] interface MediaCapabilities {
     [CallWith=ScriptState] Promise<MediaCapabilitiesInfo> decodingInfo(MediaDecodingConfiguration configuration);
     [CallWith=ScriptState] Promise<MediaCapabilitiesInfo> encodingInfo(
diff --git a/third_party/WebKit/Source/modules/media_capabilities/MediaCapabilitiesInfo.idl b/third_party/WebKit/Source/modules/media_capabilities/MediaCapabilitiesInfo.idl
index 6feab9a..3c4bdc5 100644
--- a/third_party/WebKit/Source/modules/media_capabilities/MediaCapabilitiesInfo.idl
+++ b/third_party/WebKit/Source/modules/media_capabilities/MediaCapabilitiesInfo.idl
@@ -6,7 +6,7 @@
 
 [
     Exposed=Window,
-    RuntimeEnabled=MediaCapabilities
+    OriginTrialEnabled=MediaCapabilities
 ] interface MediaCapabilitiesInfo {
     readonly attribute boolean supported;
     readonly attribute boolean smooth;
diff --git a/third_party/WebKit/Source/modules/media_capabilities/NavigatorMediaCapabilities.idl b/third_party/WebKit/Source/modules/media_capabilities/NavigatorMediaCapabilities.idl
index ed04a7e..5f421af 100644
--- a/third_party/WebKit/Source/modules/media_capabilities/NavigatorMediaCapabilities.idl
+++ b/third_party/WebKit/Source/modules/media_capabilities/NavigatorMediaCapabilities.idl
@@ -7,7 +7,7 @@
 [
     Exposed=Window,
     ImplementedAs=NavigatorMediaCapabilities,
-    RuntimeEnabled=MediaCapabilities
+    OriginTrialEnabled=MediaCapabilities
 ] partial interface Navigator {
     [SameObject] readonly attribute MediaCapabilities mediaCapabilities;
 };
diff --git a/third_party/WebKit/Source/platform/runtime_enabled_features.json5 b/third_party/WebKit/Source/platform/runtime_enabled_features.json5
index 9d4dbc8..623c1b5 100644
--- a/third_party/WebKit/Source/platform/runtime_enabled_features.json5
+++ b/third_party/WebKit/Source/platform/runtime_enabled_features.json5
@@ -564,6 +564,7 @@
     },
     {
       name: "MediaCapabilities",
+      origin_trial_feature_name: "MediaCapabilities",
       status: "experimental",
     },
     {
diff --git a/third_party/WebKit/public/platform/web_feature.mojom b/third_party/WebKit/public/platform/web_feature.mojom
index d30652d..ddc619b 100644
--- a/third_party/WebKit/public/platform/web_feature.mojom
+++ b/third_party/WebKit/public/platform/web_feature.mojom
@@ -1760,6 +1760,7 @@
   kLinkRelModulePreload = 2232,
   kPerformanceMeasurePassedInObject = 2233,
   kPerformanceMeasurePassedInNavigationTiming = 2234,
+  kHTMLFrameSetElementNonNullAnonymousNamedGetter = 2235,
 
   // Add new features immediately above this line. Don't change assigned
   // numbers of any item, and don't reuse removed slots.
diff --git a/tools/android/BUILD.gn b/tools/android/BUILD.gn
index 8ad3d39..3fdc092d 100644
--- a/tools/android/BUILD.gn
+++ b/tools/android/BUILD.gn
@@ -17,6 +17,7 @@
     "//tools/android/md5sum",
     "//tools/android/memtrack_helper:memtrack_helper",
     "//tools/perf:run_benchmark_wrapper",
+    "//tools/perf/clear_system_cache",
   ]
 }
 
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index 4af0aec..43a4faf 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -16975,6 +16975,7 @@
   <int value="2232" label="LinkRelModulePreload"/>
   <int value="2233" label="PerformanceMeasurePassedInObject"/>
   <int value="2234" label="PerformanceMeasurePassedInNavigationTiming"/>
+  <int value="2235" label="HTMLFrameSetElementNonNullAnonymousNamedGetter"/>
 </enum>
 
 <enum name="FeedbackSource">
diff --git a/ui/PRESUBMIT.py b/ui/PRESUBMIT.py
index 2f2d842..2cd860d 100644
--- a/ui/PRESUBMIT.py
+++ b/ui/PRESUBMIT.py
@@ -41,10 +41,35 @@
             (f.LocalPath(), line_number)))
   return errors
 
+def CheckX11HeaderUsage(input_api, output_api):
+  """X11 headers pollute the global namespace with macros for common
+names so instead code should include "ui/gfx/x/x11.h" which hide the
+dangerous macros inside the x11 namespace."""
+
+  # Only check files in ui/gl and ui/gfx for now since that is the
+  # only code converted.
+
+  source_file_filter = lambda x: input_api.FilterSourceFile(
+    x,
+    white_list=tuple([r'.*ui.(gfx|gl)..*\.(cc|h)$']))
+  errors = []
+  x11_include_pattern = input_api.re.compile(r'#include\s+<X11/.*\.h>')
+  for f in input_api.AffectedSourceFiles(source_file_filter):
+    if f.LocalPath().endswith(input_api.os_path.normpath("ui/gfx/x11.h")):
+      # This is the only file that is allowed to include X11 headers.
+      continue
+    for line_number, line in f.ChangedContents():
+      if input_api.re.search(x11_include_pattern, line):
+        errors.append(output_api.PresubmitError(
+          '%s:%d includes an X11 header. Include "ui/gfx/x/x11.h" instead.' %
+          (f.LocalPath(), line_number)))
+  return errors
+
 
 def CheckChange(input_api, output_api):
   results = []
   results += CheckUniquePtr(input_api, output_api)
+  results += CheckX11HeaderUsage(input_api, output_api)
   return results
 
 
diff --git a/ui/accessibility/platform/ax_platform_node_auralinux.cc b/ui/accessibility/platform/ax_platform_node_auralinux.cc
index f41ac3d..60b5a12 100644
--- a/ui/accessibility/platform/ax_platform_node_auralinux.cc
+++ b/ui/accessibility/platform/ax_platform_node_auralinux.cc
@@ -8,6 +8,7 @@
 
 #include "base/command_line.h"
 #include "base/strings/sys_string_conversions.h"
+#include "ui/accessibility/ax_action_data.h"
 #include "ui/accessibility/ax_node_data.h"
 #include "ui/accessibility/platform/atk_util_auralinux.h"
 #include "ui/accessibility/platform/ax_platform_node_delegate.h"
@@ -286,12 +287,25 @@
   return obj->HitTestSync(x, y, coord_type);
 }
 
+static gboolean ax_platform_node_auralinux_grab_focus(
+    AtkComponent* atk_component) {
+  g_return_val_if_fail(ATK_IS_COMPONENT(atk_component), FALSE);
+  AtkObject* atk_object = ATK_OBJECT(atk_component);
+  ui::AXPlatformNodeAuraLinux* obj =
+      AtkObjectToAXPlatformNodeAuraLinux(atk_object);
+  if (!obj)
+    return FALSE;
+
+  return obj->GrabFocus();
+}
+
 void ax_component_interface_base_init(AtkComponentIface* iface) {
   iface->get_extents = ax_platform_node_auralinux_get_extents;
   iface->get_position = ax_platform_node_auralinux_get_position;
   iface->get_size = ax_platform_node_auralinux_get_size;
   iface->ref_accessible_at_point =
       ax_platform_node_auralinux_ref_accessible_at_point;
+  iface->grab_focus = ax_platform_node_auralinux_grab_focus;
 }
 
 static const GInterfaceInfo ComponentInfo = {
@@ -777,4 +791,10 @@
   return delegate_->HitTestSync(x, y);
 }
 
+bool AXPlatformNodeAuraLinux::GrabFocus() {
+  AXActionData action_data;
+  action_data.action = AX_ACTION_FOCUS;
+  return delegate_->AccessibilityPerformAction(action_data);
+}
+
 }  // namespace ui
diff --git a/ui/accessibility/platform/ax_platform_node_auralinux.h b/ui/accessibility/platform/ax_platform_node_auralinux.h
index 015487be..5fc52ba 100644
--- a/ui/accessibility/platform/ax_platform_node_auralinux.h
+++ b/ui/accessibility/platform/ax_platform_node_auralinux.h
@@ -36,6 +36,7 @@
   gfx::NativeViewAccessible HitTestSync(gint x,
                                         gint y,
                                         AtkCoordType coord_type);
+  bool GrabFocus();
 
   void SetExtentsRelativeToAtkCoordinateType(
       gint* x, gint* y, gint* width, gint* height,
diff --git a/ui/gfx/x/x11.h b/ui/gfx/x/x11.h
index 1cf3db8..1e51aff4 100644
--- a/ui/gfx/x/x11.h
+++ b/ui/gfx/x/x11.h
@@ -15,13 +15,6 @@
 // central X11 headers can be included.
 #include <X11/Xlib.h>
 
-// TODO(bratell): ui/gl headers sometimes indirectly include Xlib.h
-// and then undef Bool. If that has happened, then the include above
-// has no effect and Bool will be missing for the rest of the
-// includes. This will be fixed when ui/gl uses ui/gfx/x/x11.h (this
-// file) but it's not 100% trivial.
-#define Bool int
-
 // And the rest so that nobody needs to include them manually...
 #include <X11/Xatom.h>
 #include <X11/Xcursor/Xcursor.h>
diff --git a/ui/gl/gl_bindings.cc b/ui/gl/gl_bindings.cc
index 05c4549..52e4515 100644
--- a/ui/gl/gl_bindings.cc
+++ b/ui/gl/gl_bindings.cc
@@ -4,6 +4,10 @@
 
 #include "build/build_config.h"
 
+#if defined(USE_X11)
+#include "ui/gfx/x/x11.h"
+#endif  // USE_X11
+
 #if defined(USE_EGL)
 #include <EGL/egl.h>
 #endif
@@ -11,7 +15,7 @@
 #include "ui/gl/gl_bindings.h"
 
 #if defined(USE_GLX)
-#include "ui/gfx/x/x11_types.h"  // nogncheck
+#include "ui/gfx/x/x11_types.h"
 #endif
 
 #if defined(OS_WIN)
diff --git a/ui/gl/gl_bindings.h b/ui/gl/gl_bindings.h
index 54d47c2..2fc96618 100644
--- a/ui/gl/gl_bindings.h
+++ b/ui/gl/gl_bindings.h
@@ -5,10 +5,9 @@
 #ifndef UI_GL_GL_BINDINGS_H_
 #define UI_GL_GL_BINDINGS_H_
 
+#include "build/build_config.h"
+
 // Includes the platform independent and platform dependent GL headers.
-// Only include this in cc files. It pulls in system headers, including
-// the X11 headers on linux, which define all kinds of macros that are
-// liable to cause conflicts.
 
 // GL headers may include inttypes.h and so we need to ensure that
 // __STDC_FORMAT_MACROS is defined in order for //base/format_macros.h to
@@ -17,6 +16,17 @@
 #if defined(OS_POSIX) && !defined(__STDC_FORMAT_MACROS)
 #define __STDC_FORMAT_MACROS
 #endif
+#if defined(USE_GLX)
+// Must be included before GL headers or they might pollute the global
+// namespace with X11 macros indirectly.
+#include "ui/gfx/x/x11.h"
+
+// GL headers expect Bool and Status this to be defined but we avoid
+// defining them since they clash with too much code. Instead we have
+// to add them temporarily here and undef them again below.
+#define Bool int
+#define Status int
+#endif  // USE_GLX
 
 #include <GL/gl.h>
 #include <GL/glext.h>
@@ -40,14 +50,11 @@
 #elif defined(USE_GLX)
 #include <GL/glx.h>
 #include <GL/glxext.h>
-#endif
 
-// Undefine some macros defined by X headers. This is why this file should only
-// be included in .cc files.
+// Done with these temporary macros now
 #undef Bool
-#undef None
 #undef Status
-
+#endif
 
 // GLES2 defines not part of Desktop GL
 // Shader Precision-Specified Types
diff --git a/ui/gl/gl_context_egl.cc b/ui/gl/gl_context_egl.cc
index 5f8ff35..8e7043a 100644
--- a/ui/gl/gl_context_egl.cc
+++ b/ui/gl/gl_context_egl.cc
@@ -10,17 +10,19 @@
 #include "base/logging.h"
 #include "base/trace_event/trace_event.h"
 #include "build/build_config.h"
+
+#if defined(USE_X11)
+// Must be included before khronos headers or they will pollute the
+// global scope with X11 macros.
+#include "ui/gfx/x/x11.h"
+#endif
+
 #include "third_party/khronos/EGL/egl.h"
 #include "third_party/khronos/EGL/eglext.h"
 #include "ui/gl/egl_util.h"
 #include "ui/gl/gl_bindings.h"
 #include "ui/gl/gl_surface_egl.h"
 
-#if defined(USE_X11)
-extern "C" {
-#include <X11/Xlib.h>
-}
-#endif
 
 #ifndef EGL_CHROMIUM_create_context_bind_generates_resource
 #define EGL_CHROMIUM_create_context_bind_generates_resource 1
diff --git a/ui/gl/gl_context_glx.cc b/ui/gl/gl_context_glx.cc
index b185b2c..abbe288 100644
--- a/ui/gl/gl_context_glx.cc
+++ b/ui/gl/gl_context_glx.cc
@@ -4,15 +4,13 @@
 
 #include "ui/gl/gl_context_glx.h"
 
-extern "C" {
-#include <X11/Xlib.h>
-}
 #include <memory>
 
 #include "base/command_line.h"
 #include "base/logging.h"
 #include "base/numerics/safe_conversions.h"
 #include "base/trace_event/trace_event.h"
+#include "ui/gfx/x/x11.h"
 #include "ui/gl/GL/glextchromium.h"
 #include "ui/gl/gl_bindings.h"
 #include "ui/gl/gl_implementation.h"
@@ -59,10 +57,10 @@
   // errors can be generated. To prevent these errors from crashing our process,
   // we simply ignore them and only look if the GLXContext was created.
   // Sync to ensure any errors generated are processed.
-  XSync(display, False);
+  XSync(display, x11::False);
   auto old_error_handler = XSetErrorHandler(IgnoreX11Errors);
-  GLXContext context =
-      glXCreateContextAttribsARB(display, config, share, True, attribs.data());
+  GLXContext context = glXCreateContextAttribsARB(display, config, share,
+                                                  x11::True, attribs.data());
   XSetErrorHandler(old_error_handler);
 
   return context;
@@ -183,11 +181,8 @@
   } else {
     DVLOG(1) << "GLX_ARB_create_context not supported.";
     context_ = glXCreateNewContext(
-       display_,
-       static_cast<GLXFBConfig>(compatible_surface->GetConfig()),
-       GLX_RGBA_TYPE,
-       share_handle,
-       True);
+        display_, static_cast<GLXFBConfig>(compatible_surface->GetConfig()),
+        GLX_RGBA_TYPE, share_handle, x11::True);
     if (!context_) {
       LOG(ERROR) << "Failed to create GL context with glXCreateNewContext.";
       return false;
diff --git a/ui/gl/gl_context_glx_unittest.cc b/ui/gl/gl_context_glx_unittest.cc
index f840106..25478c7 100644
--- a/ui/gl/gl_context_glx_unittest.cc
+++ b/ui/gl/gl_context_glx_unittest.cc
@@ -6,14 +6,13 @@
 
 #include "base/memory/scoped_refptr.h"
 #include "testing/gtest/include/gtest/gtest.h"
+#include "ui/gfx/x/x11.h"
 #include "ui/gfx/x/x11_error_tracker.h"
 #include "ui/gfx/x/x11_types.h"
 #include "ui/gl/gl_surface_glx_x11.h"
 #include "ui/gl/init/gl_factory.h"
 #include "ui/gl/test/gl_image_test_support.h"
 
-#include <X11/Xlib.h>
-
 namespace gl {
 
 TEST(GLContextGLXTest, DoNotDestroyOnFailedMakeCurrent) {
@@ -25,7 +24,7 @@
   XSetWindowAttributes swa;
   memset(&swa, 0, sizeof(swa));
   swa.background_pixmap = 0;
-  swa.override_redirect = True;
+  swa.override_redirect = x11::True;
   auto xwindow = XCreateWindow(xdisplay, DefaultRootWindow(xdisplay), 0, 0, 10,
                                10,              // x, y, width, height
                                0,               // border width
@@ -77,7 +76,7 @@
   // not destroyed.
   ASSERT_TRUE(context->GetHandle());
   surface = nullptr;
-  XSync(xdisplay, True);
+  XSync(xdisplay, x11::True);
 }
 
 }  // namespace gl
diff --git a/ui/gl/gl_image_glx.cc b/ui/gl/gl_image_glx.cc
index 341e33d..4c4ba1a2 100644
--- a/ui/gl/gl_image_glx.cc
+++ b/ui/gl/gl_image_glx.cc
@@ -2,13 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-extern "C" {
-#include <X11/Xlib.h>
-}
-
 #include <memory>
 
 #include "base/logging.h"
+#include "ui/gfx/x/x11.h"
 #include "ui/gl/gl_bindings.h"
 #include "ui/gl/gl_image_glx.h"
 #include "ui/gl/gl_surface_glx.h"
diff --git a/ui/gl/gl_surface_egl.cc b/ui/gl/gl_surface_egl.cc
index 5fc0277..c84994b 100644
--- a/ui/gl/gl_surface_egl.cc
+++ b/ui/gl/gl_surface_egl.cc
@@ -35,10 +35,8 @@
 #include "ui/gl/sync_control_vsync_provider.h"
 
 #if defined(USE_X11)
-extern "C" {
-#include <X11/Xlib.h>
-#define Status int
-}
+#include "ui/gfx/x/x11.h"
+
 #include "ui/base/x/x11_util_internal.h"  // nogncheck
 #endif
 
diff --git a/ui/gl/gl_surface_egl_x11.cc b/ui/gl/gl_surface_egl_x11.cc
index 4d0cd090..78fa83f 100644
--- a/ui/gl/gl_surface_egl_x11.cc
+++ b/ui/gl/gl_surface_egl_x11.cc
@@ -5,12 +5,9 @@
 #include "ui/gl/gl_surface_egl_x11.h"
 
 #include "ui/events/platform/platform_event_source.h"
+#include "ui/gfx/x/x11.h"
 #include "ui/gl/egl_util.h"
 
-extern "C" {
-#include <X11/Xlib.h>
-}
-
 using ui::GetLastEGLErrorString;
 using ui::PlatformEvent;
 using ui::PlatformEventSource;
@@ -167,7 +164,7 @@
   x_event.xexpose.window = parent_window_;
 
   Display* x11_display = GetNativeDisplay();
-  XSendEvent(x11_display, parent_window_, False, ExposureMask, &x_event);
+  XSendEvent(x11_display, parent_window_, x11::False, ExposureMask, &x_event);
   XFlush(x11_display);
   return ui::POST_DISPATCH_STOP_PROPAGATION;
 }
diff --git a/ui/gl/gl_surface_glx.cc b/ui/gl/gl_surface_glx.cc
index e647e4c..529941fa 100644
--- a/ui/gl/gl_surface_glx.cc
+++ b/ui/gl/gl_surface_glx.cc
@@ -4,9 +4,6 @@
 
 #include "ui/gl/gl_surface_glx.h"
 
-extern "C" {
-#include <X11/Xlib.h>
-}
 #include <memory>
 
 #include "base/command_line.h"
@@ -25,6 +22,7 @@
 #include "base/trace_event/trace_event.h"
 #include "build/build_config.h"
 #include "ui/events/platform/platform_event_source.h"
+#include "ui/gfx/x/x11.h"
 #include "ui/gfx/x/x11_connection.h"
 #include "ui/gfx/x/x11_types.h"
 #include "ui/gl/gl_bindings.h"
@@ -115,7 +113,7 @@
 bool CreateDummyWindow(Display* display) {
   DCHECK(display);
   gfx::AcceleratedWidget parent_window =
-      RootWindow(display, DefaultScreen(display));
+      XRootWindow(display, DefaultScreen(display));
   gfx::AcceleratedWidget window =
       XCreateWindow(display, parent_window, 0, 0, 1, 1, 0, CopyFromParent,
                     InputOutput, CopyFromParent, 0, nullptr);
@@ -217,7 +215,7 @@
         vsync_lock_() {
     // This ensures that creation of |parent_window_| has occured when this shim
     // is executing in the same thread as the call to create |parent_window_|.
-    XSync(g_display, False);
+    XSync(g_display, x11::False);
   }
 
   virtual ~SGIVideoSyncProviderThreadShim() {
@@ -257,8 +255,8 @@
 
     // Create the context only once for all vsync providers.
     if (!context_) {
-      context_ =
-        glXCreateNewContext(display_, config, GLX_RGBA_TYPE, nullptr, True);
+      context_ = glXCreateNewContext(display_, config, GLX_RGBA_TYPE, nullptr,
+                                     x11::True);
       if (!context_)
         LOG(ERROR) << "video_sync: glXCreateNewContext failed";
     }
@@ -687,7 +685,8 @@
 void NativeViewGLSurfaceGLX::ForwardExposeEvent(XEvent* event) {
   XEvent forwarded_event = *event;
   forwarded_event.xexpose.window = parent_window_;
-  XSendEvent(g_display, parent_window_, False, ExposureMask, &forwarded_event);
+  XSendEvent(g_display, parent_window_, x11::False, ExposureMask,
+             &forwarded_event);
   XFlush(g_display);
 }
 
diff --git a/ui/gl/gl_surface_glx_x11.cc b/ui/gl/gl_surface_glx_x11.cc
index dd912778..39d98e2 100644
--- a/ui/gl/gl_surface_glx_x11.cc
+++ b/ui/gl/gl_surface_glx_x11.cc
@@ -4,9 +4,8 @@
 
 #include "ui/gl/gl_surface_glx_x11.h"
 
-#include <X11/Xlib.h>
-
 #include "ui/events/platform/platform_event_source.h"
+#include "ui/gfx/x/x11.h"
 #include "ui/gfx/x/x11_types.h"
 
 namespace gl {
diff --git a/ui/gl/gl_surface_osmesa_x11.cc b/ui/gl/gl_surface_osmesa_x11.cc
index 988d3c6..130eaac4 100644
--- a/ui/gl/gl_surface_osmesa_x11.cc
+++ b/ui/gl/gl_surface_osmesa_x11.cc
@@ -73,7 +73,7 @@
     window_graphics_context_ = NULL;
   }
 
-  XSync(xdisplay_, False);
+  XSync(xdisplay_, x11::False);
 }
 
 bool GLSurfaceOSMesaX11::Resize(const gfx::Size& new_size,
diff --git a/ui/gl/gl_surface_osmesa_x11.h b/ui/gl/gl_surface_osmesa_x11.h
index e51fbc8..01f59635 100644
--- a/ui/gl/gl_surface_osmesa_x11.h
+++ b/ui/gl/gl_surface_osmesa_x11.h
@@ -5,10 +5,9 @@
 #ifndef UI_GL_GL_SURFACE_OSMESA_X11_H_
 #define UI_GL_GL_SURFACE_OSMESA_X11_H_
 
-#include <X11/Xlib.h>
-
 #include "base/macros.h"
 #include "ui/gfx/native_widget_types.h"
+#include "ui/gfx/x/x11.h"
 #include "ui/gl/gl_export.h"
 #include "ui/gl/gl_surface.h"
 #include "ui/gl/gl_surface_osmesa.h"
diff --git a/ui/gl/gl_visual_picker_glx.h b/ui/gl/gl_visual_picker_glx.h
index bc0ca178..6ee25f6 100644
--- a/ui/gl/gl_visual_picker_glx.h
+++ b/ui/gl/gl_visual_picker_glx.h
@@ -5,11 +5,10 @@
 #ifndef UI_GL_GL_VISUAL_PICKER_GLX_H_
 #define UI_GL_GL_VISUAL_PICKER_GLX_H_
 
-#include <X11/Xutil.h>
-
 #include <vector>
 
 #include "base/macros.h"
+#include "ui/gfx/x/x11.h"
 #include "ui/gfx/x/x11_types.h"
 #include "ui/gl/gl_export.h"
 
diff --git a/ui/gl/init/gl_initializer_x11.cc b/ui/gl/init/gl_initializer_x11.cc
index 2392e65..90a62c6 100644
--- a/ui/gl/init/gl_initializer_x11.cc
+++ b/ui/gl/init/gl_initializer_x11.cc
@@ -10,6 +10,7 @@
 #include "base/threading/thread_restrictions.h"
 #include "build/build_config.h"
 #include "ui/gfx/switches.h"
+#include "ui/gfx/x/x11.h"
 #include "ui/gfx/x/x11_types.h"
 #include "ui/gl/gl_bindings.h"
 #include "ui/gl/gl_egl_api_implementation.h"
diff --git a/ui/gl/test/gl_surface_test_support.cc b/ui/gl/test/gl_surface_test_support.cc
index dcf153b..0ae16504 100644
--- a/ui/gl/test/gl_surface_test_support.cc
+++ b/ui/gl/test/gl_surface_test_support.cc
@@ -20,7 +20,7 @@
 #endif
 
 #if defined(USE_X11)
-#include <X11/Xlib.h>
+#include "ui/gfx/x/x11.h"
 #endif
 
 namespace gl {