diff --git a/DEPS b/DEPS
index 2ba3113..828304e 100644
--- a/DEPS
+++ b/DEPS
@@ -167,11 +167,11 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling Skia
   # and whatever else without interference from each other.
-  'skia_revision': '9e951cd782c4dd3cec36c05dd7448ebfc415a389',
+  'skia_revision': '4c82a9fc83a5b2a18c1daa251121f8cb324f2d9d',
   # 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': '35874570ba6306d2d41a6b0a468ab7e41c99ed2e',
+  'v8_revision': '14b4bc0d0f1dfa2c7e420c60f86443ffbb301286',
   # 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.
@@ -179,11 +179,11 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling ANGLE
   # and whatever else without interference from each other.
-  'angle_revision': '6b60dfd80e3dc3fe13eb1b9bcaf8b36f30e20b45',
+  'angle_revision': '1ba72546da4ce83b340fdd965655010b75c749db',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling SwiftShader
   # and whatever else without interference from each other.
-  'swiftshader_revision': 'a580e2d761c1994a42e01866cfca5e318a67d12c',
+  'swiftshader_revision': '23463e8bb77fbc536ae4621ae28e328e8715103d',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling PDFium
   # and whatever else without interference from each other.
@@ -306,7 +306,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
-  'quiche_revision': 'f518a2641c6d0b2e6cc130024e3f8a45771393c4',
+  'quiche_revision': 'ef79a5fa1b2c3303dc1dae969482ead934be85a8',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling ios_webkit
   # and whatever else without interference from each other.
@@ -862,7 +862,7 @@
 
   # Build tools for Chrome OS. Note: This depends on third_party/pyelftools.
   'src/third_party/chromite': {
-      'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '34ff91ec6f44e0fc5d90c70f2ed1a4d117d8c009',
+      'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + 'bd5145058235319ea6d2652b1f1d2daf785502cf',
       'condition': 'checkout_linux',
   },
 
@@ -877,7 +877,7 @@
 
   # For Linux and Chromium OS.
   'src/third_party/cros_system_api': {
-      'url': Var('chromium_git') + '/chromiumos/platform2/system_api.git' + '@' + '9b9ccf7ac88ac67a2fe88bf9beeb0b07cf163d76',
+      'url': Var('chromium_git') + '/chromiumos/platform2/system_api.git' + '@' + '61297bd64bfd78f9d4288ab44e28976b53f369f2',
       'condition': 'checkout_linux',
   },
 
@@ -887,7 +887,7 @@
   },
 
   'src/third_party/depot_tools':
-    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + 'aa4d8a75604db8a824c82cca0e6f8001e6b11723',
+    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + 'd696f201295e38d907b4d8c03f9f270581b0e07c',
 
   'src/third_party/devtools-node-modules':
     Var('chromium_git') + '/external/github.com/ChromeDevTools/devtools-node-modules' + '@' + Var('devtools_node_modules_revision'),
@@ -1087,6 +1087,17 @@
       'condition': 'checkout_android',
   },
 
+  'src/third_party/jdk': {
+      'packages': [
+          {
+              'package': 'chromium/third_party/jdk',
+              'version': 'rfJtuH296mzs7BYOgmQkpz-7ydXtpLKeO15qDDMaa5cC',
+          },
+      ],
+      'condition': 'host_os == "linux" and checkout_android',
+      'dep_type': 'cipd',
+  },
+
   'src/third_party/jsoncpp/source':
     Var('chromium_git') + '/external/github.com/open-source-parsers/jsoncpp.git'
       + '@' + '645250b6690785be60ab6780ce4b58698d884d11', # release 1.9.1
@@ -1521,7 +1532,7 @@
     Var('chromium_git') + '/v8/v8.git' + '@' +  Var('v8_revision'),
 
   'src-internal': {
-    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@40ba239931e22de2d9e066fa3b8095062816120a',
+    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@d1f79f968fc009d6ae76f0f231863432649ef3d5',
     'condition': 'checkout_src_internal',
   },
 
diff --git a/PRESUBMIT.py b/PRESUBMIT.py
index 4d792e8..6f5b5b8 100644
--- a/PRESUBMIT.py
+++ b/PRESUBMIT.py
@@ -1357,7 +1357,6 @@
     'net/tools/testserver/testserver.pydeps',
     'testing/scripts/run_android_wpt.pydeps',
     'third_party/android_platform/development/scripts/stack.pydeps',
-    'tools/android/avd/avd.pydeps',
 ]
 
 
diff --git a/android_webview/BUILD.gn b/android_webview/BUILD.gn
index 9317afe..738efb1 100644
--- a/android_webview/BUILD.gn
+++ b/android_webview/BUILD.gn
@@ -57,8 +57,6 @@
     "java/src/org/chromium/android_webview/AwFeatureList.java",
     "java/src/org/chromium/android_webview/AwFormDatabase.java",
     "java/src/org/chromium/android_webview/AwHttpAuthHandler.java",
-    "java/src/org/chromium/android_webview/AwMetricsLogUploader.java",
-    "java/src/org/chromium/android_webview/AwMetricsServiceClient.java",
     "java/src/org/chromium/android_webview/AwPdfExporter.java",
     "java/src/org/chromium/android_webview/AwProxyController.java",
     "java/src/org/chromium/android_webview/AwQuotaManagerBridge.java",
@@ -77,6 +75,8 @@
     "java/src/org/chromium/android_webview/gfx/AwGLFunctor.java",
     "java/src/org/chromium/android_webview/gfx/AwPicture.java",
     "java/src/org/chromium/android_webview/gfx/JavaBrowserViewRendererHelper.java",
+    "java/src/org/chromium/android_webview/metrics/AwMetricsLogUploader.java",
+    "java/src/org/chromium/android_webview/metrics/AwMetricsServiceClient.java",
     "java/src/org/chromium/android_webview/permission/AwPermissionRequest.java",
   ]
 
@@ -537,8 +537,6 @@
     "java/src/org/chromium/android_webview/AwHistogramRecorder.java",
     "java/src/org/chromium/android_webview/AwHttpAuthHandler.java",
     "java/src/org/chromium/android_webview/AwLayoutSizer.java",
-    "java/src/org/chromium/android_webview/AwMetricsLogUploader.java",
-    "java/src/org/chromium/android_webview/AwMetricsServiceClient.java",
     "java/src/org/chromium/android_webview/AwNetworkChangeNotifierRegistrationPolicy.java",
     "java/src/org/chromium/android_webview/AwPdfExporter.java",
     "java/src/org/chromium/android_webview/AwPrintDocumentAdapter.java",
@@ -594,6 +592,8 @@
     "java/src/org/chromium/android_webview/gfx/AwGLFunctor.java",
     "java/src/org/chromium/android_webview/gfx/AwPicture.java",
     "java/src/org/chromium/android_webview/gfx/JavaBrowserViewRendererHelper.java",
+    "java/src/org/chromium/android_webview/metrics/AwMetricsLogUploader.java",
+    "java/src/org/chromium/android_webview/metrics/AwMetricsServiceClient.java",
     "java/src/org/chromium/android_webview/permission/AwGeolocationCallback.java",
     "java/src/org/chromium/android_webview/permission/AwPermissionRequest.java",
     "java/src/org/chromium/android_webview/policy/AwPolicyProvider.java",
diff --git a/android_webview/browser/BUILD.gn b/android_webview/browser/BUILD.gn
index ef9748c..c7773448 100644
--- a/android_webview/browser/BUILD.gn
+++ b/android_webview/browser/BUILD.gn
@@ -68,10 +68,6 @@
     "aw_javascript_dialog_manager.h",
     "aw_media_url_interceptor.cc",
     "aw_media_url_interceptor.h",
-    "aw_metrics_log_uploader.cc",
-    "aw_metrics_log_uploader.h",
-    "aw_metrics_service_client.cc",
-    "aw_metrics_service_client.h",
     "aw_pdf_exporter.cc",
     "aw_pdf_exporter.h",
     "aw_permission_manager.cc",
@@ -119,8 +115,6 @@
     "js_java_interaction/js_reply_proxy.h",
     "js_java_interaction/js_to_java_messaging.cc",
     "js_java_interaction/js_to_java_messaging.h",
-    "memory_metrics_logger.cc",
-    "memory_metrics_logger.h",
     "network_service/android_stream_reader_url_loader.cc",
     "network_service/android_stream_reader_url_loader.h",
     "network_service/aw_network_change_notifier.cc",
@@ -189,6 +183,7 @@
     "//android_webview:browser_jni_headers",
     "//android_webview:generate_components_strings",
     "//android_webview/browser/gfx",
+    "//android_webview/browser/metrics",
     "//android_webview/common",
     "//android_webview/common:common_mojom",
     "//base",
@@ -203,9 +198,6 @@
     "//components/google/core/common",
     "//components/heap_profiling",
     "//components/metrics",
-    "//components/metrics:gpu",
-    "//components/metrics:net",
-    "//components/metrics:ui",
     "//components/minidump_uploader",
     "//components/navigation_interception",
     "//components/page_load_metrics/browser",
@@ -244,7 +236,6 @@
     "//media/mojo:buildflags",
     "//printing",
     "//services/preferences/tracked",
-    "//services/resource_coordinator/public/cpp/memory_instrumentation:browser",
     "//third_party/crashpad/crashpad/client",
     "//ui/android",
     "//ui/gl",
diff --git a/android_webview/browser/aw_browser_context.cc b/android_webview/browser/aw_browser_context.cc
index 8c7a368..8b476e0 100644
--- a/android_webview/browser/aw_browser_context.cc
+++ b/android_webview/browser/aw_browser_context.cc
@@ -12,12 +12,12 @@
 #include "android_webview/browser/aw_content_browser_client.h"
 #include "android_webview/browser/aw_download_manager_delegate.h"
 #include "android_webview/browser/aw_form_database_service.h"
-#include "android_webview/browser/aw_metrics_service_client.h"
 #include "android_webview/browser/aw_permission_manager.h"
 #include "android_webview/browser/aw_quota_manager_bridge.h"
 #include "android_webview/browser/aw_resource_context.h"
 #include "android_webview/browser/aw_web_ui_controller_factory.h"
 #include "android_webview/browser/cookie_manager.h"
+#include "android_webview/browser/metrics/aw_metrics_service_client.h"
 #include "android_webview/browser/network_service/net_helpers.h"
 #include "android_webview/browser/safe_browsing/aw_safe_browsing_whitelist_manager.h"
 #include "android_webview/browser_jni_headers/AwBrowserContext_jni.h"
diff --git a/android_webview/browser/aw_browser_main_parts.cc b/android_webview/browser/aw_browser_main_parts.cc
index abf1cca..a607a10 100644
--- a/android_webview/browser/aw_browser_main_parts.cc
+++ b/android_webview/browser/aw_browser_main_parts.cc
@@ -12,9 +12,9 @@
 #include "android_webview/browser/aw_browser_context.h"
 #include "android_webview/browser/aw_browser_terminator.h"
 #include "android_webview/browser/aw_content_browser_client.h"
-#include "android_webview/browser/aw_metrics_service_client.h"
 #include "android_webview/browser/aw_web_ui_controller_factory.h"
-#include "android_webview/browser/memory_metrics_logger.h"
+#include "android_webview/browser/metrics/aw_metrics_service_client.h"
+#include "android_webview/browser/metrics/memory_metrics_logger.h"
 #include "android_webview/browser/network_service/aw_network_change_notifier_factory.h"
 #include "android_webview/common/aw_descriptors.h"
 #include "android_webview/common/aw_paths.h"
diff --git a/android_webview/browser/aw_feature_list_creator.cc b/android_webview/browser/aw_feature_list_creator.cc
index 225599e..21d08d1 100644
--- a/android_webview/browser/aw_feature_list_creator.cc
+++ b/android_webview/browser/aw_feature_list_creator.cc
@@ -12,8 +12,8 @@
 
 #include "android_webview/browser/aw_browser_context.h"
 #include "android_webview/browser/aw_browser_process.h"
-#include "android_webview/browser/aw_metrics_service_client.h"
 #include "android_webview/browser/aw_variations_seed_bridge.h"
+#include "android_webview/browser/metrics/aw_metrics_service_client.h"
 #include "base/base_switches.h"
 #include "base/bind.h"
 #include "base/bind_helpers.h"
diff --git a/android_webview/browser/metrics/BUILD.gn b/android_webview/browser/metrics/BUILD.gn
new file mode 100644
index 0000000..3283d27
--- /dev/null
+++ b/android_webview/browser/metrics/BUILD.gn
@@ -0,0 +1,28 @@
+# Copyright 2019 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.
+
+source_set("metrics") {
+  sources = [
+    "aw_metrics_log_uploader.cc",
+    "aw_metrics_log_uploader.h",
+    "aw_metrics_service_client.cc",
+    "aw_metrics_service_client.h",
+    "memory_metrics_logger.cc",
+    "memory_metrics_logger.h",
+  ]
+  deps = [
+    "//android_webview:browser_jni_headers",
+    "//android_webview/common",
+    "//base",
+    "//components/metrics",
+    "//components/metrics:gpu",
+    "//components/metrics:net",
+    "//components/metrics:ui",
+    "//components/prefs",
+    "//components/version_info",
+    "//components/version_info/android:channel_getter",
+    "//content/public/browser",
+    "//services/resource_coordinator/public/cpp/memory_instrumentation:browser",
+  ]
+}
diff --git a/android_webview/browser/metrics/OWNERS b/android_webview/browser/metrics/OWNERS
new file mode 100644
index 0000000..bb91825
--- /dev/null
+++ b/android_webview/browser/metrics/OWNERS
@@ -0,0 +1,4 @@
+ntfschr@chromium.org
+
+# TEAM: android-webview-dev@chromium.org
+# COMPONENT: Mobile>WebView
diff --git a/android_webview/browser/aw_metrics_log_uploader.cc b/android_webview/browser/metrics/aw_metrics_log_uploader.cc
similarity index 96%
rename from android_webview/browser/aw_metrics_log_uploader.cc
rename to android_webview/browser/metrics/aw_metrics_log_uploader.cc
index 3230508..ec34e4e 100644
--- a/android_webview/browser/aw_metrics_log_uploader.cc
+++ b/android_webview/browser/metrics/aw_metrics_log_uploader.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "android_webview/browser/aw_metrics_log_uploader.h"
+#include "android_webview/browser/metrics/aw_metrics_log_uploader.h"
 
 #include "android_webview/browser_jni_headers/AwMetricsLogUploader_jni.h"
 #include "base/android/jni_array.h"
diff --git a/android_webview/browser/aw_metrics_log_uploader.h b/android_webview/browser/metrics/aw_metrics_log_uploader.h
similarity index 85%
rename from android_webview/browser/aw_metrics_log_uploader.h
rename to android_webview/browser/metrics/aw_metrics_log_uploader.h
index b57aedb..4a7e457d 100644
--- a/android_webview/browser/aw_metrics_log_uploader.h
+++ b/android_webview/browser/metrics/aw_metrics_log_uploader.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 ANDROID_WEBVIEW_BROWSER_AW_METRICS_LOG_UPLOADER_H_
-#define ANDROID_WEBVIEW_BROWSER_AW_METRICS_LOG_UPLOADER_H_
+#ifndef ANDROID_WEBVIEW_BROWSER_METRICS_AW_METRICS_LOG_UPLOADER_H_
+#define ANDROID_WEBVIEW_BROWSER_METRICS_AW_METRICS_LOG_UPLOADER_H_
 
 #include <jni.h>
 #include <string>
@@ -37,4 +37,4 @@
 
 }  // namespace android_webview
 
-#endif  // ANDROID_WEBVIEW_BROWSER_AW_METRICS_LOG_UPLOADER_H_
+#endif  // ANDROID_WEBVIEW_BROWSER_METRICS_AW_METRICS_LOG_UPLOADER_H_
diff --git a/android_webview/browser/aw_metrics_service_client.cc b/android_webview/browser/metrics/aw_metrics_service_client.cc
similarity index 98%
rename from android_webview/browser/aw_metrics_service_client.cc
rename to android_webview/browser/metrics/aw_metrics_service_client.cc
index 717a88a..e117d98 100644
--- a/android_webview/browser/aw_metrics_service_client.cc
+++ b/android_webview/browser/metrics/aw_metrics_service_client.cc
@@ -2,13 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "android_webview/browser/aw_metrics_service_client.h"
+#include "android_webview/browser/metrics/aw_metrics_service_client.h"
 
 #include <jni.h>
 #include <cstdint>
 #include <memory>
 
-#include "android_webview/browser/aw_metrics_log_uploader.h"
+#include "android_webview/browser/metrics/aw_metrics_log_uploader.h"
 #include "android_webview/browser_jni_headers/AwMetricsServiceClient_jni.h"
 #include "android_webview/common/aw_features.h"
 #include "base/android/jni_android.h"
diff --git a/android_webview/browser/aw_metrics_service_client.h b/android_webview/browser/metrics/aw_metrics_service_client.h
similarity index 95%
rename from android_webview/browser/aw_metrics_service_client.h
rename to android_webview/browser/metrics/aw_metrics_service_client.h
index 38ce133..1c8b4e1 100644
--- a/android_webview/browser/aw_metrics_service_client.h
+++ b/android_webview/browser/metrics/aw_metrics_service_client.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 ANDROID_WEBVIEW_BROWSER_AW_METRICS_SERVICE_CLIENT_H_
-#define ANDROID_WEBVIEW_BROWSER_AW_METRICS_SERVICE_CLIENT_H_
+#ifndef ANDROID_WEBVIEW_BROWSER_METRICS_AW_METRICS_SERVICE_CLIENT_H_
+#define ANDROID_WEBVIEW_BROWSER_METRICS_AW_METRICS_SERVICE_CLIENT_H_
 
 #include <memory>
 #include <string>
@@ -91,7 +91,7 @@
   void Initialize(PrefService* pref_service);
   void SetHaveMetricsConsent(bool user_consent, bool app_consent);
   std::unique_ptr<const base::FieldTrial::EntropyProvider>
-      CreateLowEntropyProvider();
+  CreateLowEntropyProvider();
 
   // metrics::EnabledStateProvider
   bool IsConsentGiven() const override;
@@ -141,4 +141,4 @@
 
 }  // namespace android_webview
 
-#endif  // ANDROID_WEBVIEW_BROWSER_AW_METRICS_SERVICE_CLIENT_H_
+#endif  // ANDROID_WEBVIEW_BROWSER_METRICS_AW_METRICS_SERVICE_CLIENT_H_
diff --git a/android_webview/browser/aw_metrics_service_client_unittest.cc b/android_webview/browser/metrics/aw_metrics_service_client_unittest.cc
similarity index 98%
rename from android_webview/browser/aw_metrics_service_client_unittest.cc
rename to android_webview/browser/metrics/aw_metrics_service_client_unittest.cc
index d75a5e0..cb937e9 100644
--- a/android_webview/browser/aw_metrics_service_client_unittest.cc
+++ b/android_webview/browser/metrics/aw_metrics_service_client_unittest.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "android_webview/browser/aw_metrics_service_client.h"
+#include "android_webview/browser/metrics/aw_metrics_service_client.h"
 
 #include "base/command_line.h"
 #include "base/macros.h"
diff --git a/android_webview/browser/memory_metrics_logger.cc b/android_webview/browser/metrics/memory_metrics_logger.cc
similarity index 98%
rename from android_webview/browser/memory_metrics_logger.cc
rename to android_webview/browser/metrics/memory_metrics_logger.cc
index ef1ec918..71a6930 100644
--- a/android_webview/browser/memory_metrics_logger.cc
+++ b/android_webview/browser/metrics/memory_metrics_logger.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "android_webview/browser/memory_metrics_logger.h"
+#include "android_webview/browser/metrics/memory_metrics_logger.h"
 
 #include "base/bind.h"
 #include "base/bind_helpers.h"
diff --git a/android_webview/browser/memory_metrics_logger.h b/android_webview/browser/metrics/memory_metrics_logger.h
similarity index 89%
rename from android_webview/browser/memory_metrics_logger.h
rename to android_webview/browser/metrics/memory_metrics_logger.h
index 33cf80a..0e8c198f 100644
--- a/android_webview/browser/memory_metrics_logger.h
+++ b/android_webview/browser/metrics/memory_metrics_logger.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 ANDROID_WEBVIEW_BROWSER_MEMORY_METRICS_LOGGER_H_
-#define ANDROID_WEBVIEW_BROWSER_MEMORY_METRICS_LOGGER_H_
+#ifndef ANDROID_WEBVIEW_BROWSER_METRICS_MEMORY_METRICS_LOGGER_H_
+#define ANDROID_WEBVIEW_BROWSER_METRICS_MEMORY_METRICS_LOGGER_H_
 
 #include <jni.h>
 #include <memory>
@@ -56,4 +56,4 @@
 
 }  // namespace android_webview
 
-#endif  // ANDROID_WEBVIEW_BROWSER_MEMORY_METRICS_LOGGER_H_
+#endif  // ANDROID_WEBVIEW_BROWSER_METRICS_MEMORY_METRICS_LOGGER_H_
diff --git a/android_webview/java/src/org/chromium/android_webview/AwBrowserProcess.java b/android_webview/java/src/org/chromium/android_webview/AwBrowserProcess.java
index e3b8ace..82b16eb 100644
--- a/android_webview/java/src/org/chromium/android_webview/AwBrowserProcess.java
+++ b/android_webview/java/src/org/chromium/android_webview/AwBrowserProcess.java
@@ -17,6 +17,7 @@
 import org.chromium.android_webview.common.CommandLineUtil;
 import org.chromium.android_webview.common.PlatformServiceBridge;
 import org.chromium.android_webview.common.ServiceNames;
+import org.chromium.android_webview.metrics.AwMetricsServiceClient;
 import org.chromium.android_webview.policy.AwPolicyProvider;
 import org.chromium.android_webview.services.ICrashReceiverService;
 import org.chromium.base.CommandLine;
diff --git a/android_webview/java/src/org/chromium/android_webview/WebMessageListenerHolder.java b/android_webview/java/src/org/chromium/android_webview/WebMessageListenerHolder.java
index b730e16..abbdbad9 100644
--- a/android_webview/java/src/org/chromium/android_webview/WebMessageListenerHolder.java
+++ b/android_webview/java/src/org/chromium/android_webview/WebMessageListenerHolder.java
@@ -5,7 +5,8 @@
 package org.chromium.android_webview;
 
 import android.net.Uri;
-import android.support.annotation.NonNull;
+
+import androidx.annotation.NonNull;
 
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.annotations.JNINamespace;
diff --git a/android_webview/java/src/org/chromium/android_webview/AwMetricsLogUploader.java b/android_webview/java/src/org/chromium/android_webview/metrics/AwMetricsLogUploader.java
similarity index 94%
rename from android_webview/java/src/org/chromium/android_webview/AwMetricsLogUploader.java
rename to android_webview/java/src/org/chromium/android_webview/metrics/AwMetricsLogUploader.java
index 43122da..b75f8edd 100644
--- a/android_webview/java/src/org/chromium/android_webview/AwMetricsLogUploader.java
+++ b/android_webview/java/src/org/chromium/android_webview/metrics/AwMetricsLogUploader.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.android_webview;
+package org.chromium.android_webview.metrics;
 
 import org.chromium.android_webview.common.PlatformServiceBridge;
 import org.chromium.base.annotations.CalledByNative;
diff --git a/android_webview/java/src/org/chromium/android_webview/AwMetricsServiceClient.java b/android_webview/java/src/org/chromium/android_webview/metrics/AwMetricsServiceClient.java
similarity index 98%
rename from android_webview/java/src/org/chromium/android_webview/AwMetricsServiceClient.java
rename to android_webview/java/src/org/chromium/android_webview/metrics/AwMetricsServiceClient.java
index ce44aacf..02c9e85 100644
--- a/android_webview/java/src/org/chromium/android_webview/AwMetricsServiceClient.java
+++ b/android_webview/java/src/org/chromium/android_webview/metrics/AwMetricsServiceClient.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.android_webview;
+package org.chromium.android_webview.metrics;
 
 import android.content.Context;
 import android.content.pm.ApplicationInfo;
diff --git a/android_webview/java/src/org/chromium/android_webview/metrics/OWNERS b/android_webview/java/src/org/chromium/android_webview/metrics/OWNERS
new file mode 100644
index 0000000..f4b67ee
--- /dev/null
+++ b/android_webview/java/src/org/chromium/android_webview/metrics/OWNERS
@@ -0,0 +1 @@
+file://android_webview/browser/metrics/OWNERS
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/memory_metrics_logger_test.cc b/android_webview/javatests/src/org/chromium/android_webview/test/memory_metrics_logger_test.cc
index d9ae9e32..e97ad2d3 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/memory_metrics_logger_test.cc
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/memory_metrics_logger_test.cc
@@ -4,7 +4,7 @@
 
 #include "android_webview/test/webview_instrumentation_test_native_jni/MemoryMetricsLoggerTest_jni.h"
 
-#include "android_webview/browser/memory_metrics_logger.h"
+#include "android_webview/browser/metrics/memory_metrics_logger.h"
 #include "base/run_loop.h"
 #include "base/test/bind_test_util.h"
 #include "base/test/task_environment.h"
diff --git a/android_webview/test/BUILD.gn b/android_webview/test/BUILD.gn
index edcbb600..e810a83 100644
--- a/android_webview/test/BUILD.gn
+++ b/android_webview/test/BUILD.gn
@@ -337,6 +337,7 @@
 }
 
 generate_jni("webview_instrumentation_test_native_jni") {
+  testonly = true
   sources = [
     "../javatests/src/org/chromium/android_webview/test/MemoryMetricsLoggerTest.java",
   ]
@@ -350,6 +351,7 @@
   deps = [
     ":webview_instrumentation_test_native_jni",
     "//android_webview/browser",
+    "//android_webview/browser/metrics",
     "//base",
     "//base/test:test_support",
   ]
@@ -362,6 +364,7 @@
     ":android_webview_unittests_jni",
     "//android_webview/browser",
     "//android_webview/browser/gfx",
+    "//android_webview/browser/metrics",
     "//base/test:test_support",
     "//components/autofill/core/browser",
     "//components/metrics",
@@ -384,7 +387,6 @@
     "../browser/aw_contents_client_bridge_unittest.cc",
     "../browser/aw_form_database_service_unittest.cc",
     "../browser/aw_media_url_interceptor_unittest.cc",
-    "../browser/aw_metrics_service_client_unittest.cc",
     "../browser/aw_permission_manager_unittest.cc",
     "../browser/gfx/browser_view_renderer_unittest.cc",
     "../browser/gfx/test/fake_window.cc",
@@ -392,6 +394,7 @@
     "../browser/gfx/test/rendering_test.cc",
     "../browser/gfx/test/rendering_test.h",
     "../browser/input_stream_unittest.cc",
+    "../browser/metrics/aw_metrics_service_client_unittest.cc",
     "../browser/network_service/android_stream_reader_url_loader_unittest.cc",
     "../browser/network_service/input_stream_reader_unittest.cc",
     "../browser/permission/media_access_permission_request_unittest.cc",
@@ -424,6 +427,7 @@
 }
 
 generate_jni("android_webview_unittests_jni") {
+  testonly = true
   sources = [
     "../unittestjava/src/org/chromium/android_webview/unittest/InputStreamUnittest.java",
     "../unittestjava/src/org/chromium/android_webview/unittest/MockAwContentsClientBridge.java",
diff --git a/android_webview/test/embedded_test_server/BUILD.gn b/android_webview/test/embedded_test_server/BUILD.gn
index 297c3a8d..e6252b6 100644
--- a/android_webview/test/embedded_test_server/BUILD.gn
+++ b/android_webview/test/embedded_test_server/BUILD.gn
@@ -23,6 +23,7 @@
 }
 
 generate_jni("aw_net_jni_headers") {
+  testonly = true
   sources = [
     "java/src/org/chromium/android_webview/test/AwEmbeddedTestServerImpl.java",
   ]
diff --git a/ash/app_list/views/apps_container_view.cc b/ash/app_list/views/apps_container_view.cc
index e70eb96..b3b481c 100644
--- a/ash/app_list/views/apps_container_view.cc
+++ b/ash/app_list/views/apps_container_view.cc
@@ -213,6 +213,10 @@
   if (app_list_state == ash::AppListViewState::kClosed)
     return;
 
+  set_can_process_events_within_subtree(
+      app_list_state == ash::AppListViewState::kFullscreenAllApps ||
+      app_list_state == ash::AppListViewState::kPeeking);
+
   apps_grid_view_->UpdateControlVisibility(app_list_state, is_in_drag);
   page_switcher_->SetVisible(
       is_in_drag ||
diff --git a/ash/home_screen/home_launcher_gesture_handler.cc b/ash/home_screen/home_launcher_gesture_handler.cc
index 84c908a..31df4476 100644
--- a/ash/home_screen/home_launcher_gesture_handler.cc
+++ b/ash/home_screen/home_launcher_gesture_handler.cc
@@ -32,6 +32,7 @@
 #include "base/metrics/user_metrics.h"
 #include "base/numerics/ranges.h"
 #include "ui/aura/client/window_types.h"
+#include "ui/aura/scoped_window_event_targeting_blocker.h"
 #include "ui/base/hit_test.h"
 #include "ui/compositor/scoped_layer_animation_settings.h"
 #include "ui/gfx/animation/tween.h"
@@ -228,15 +229,14 @@
  public:
   explicit ScopedWindowModifier(aura::Window* window) : window_(window) {
     DCHECK(window_);
-    original_event_targeting_policy_ = window_->event_targeting_policy();
-    window_->SetEventTargetingPolicy(aura::EventTargetingPolicy::kNone);
+    event_targeting_blocker_ =
+        std::make_unique<aura::ScopedWindowEventTargetingBlocker>(window_);
   }
   ~ScopedWindowModifier() override {
     for (const auto& descendant : transient_descendants_values_)
       descendant.first->RemoveObserver(this);
 
     ResetOpacityAndTransform();
-    window_->SetEventTargetingPolicy(original_event_targeting_policy_);
   }
 
   bool IsAnimating() const {
@@ -324,7 +324,8 @@
   // For the duration of this object |window_| event targeting policy will be
   // sent to kNone. Store the original so we can change it back when destroying
   // this object.
-  aura::EventTargetingPolicy original_event_targeting_policy_;
+  std::unique_ptr<aura::ScopedWindowEventTargetingBlocker>
+      event_targeting_blocker_;
 
   DISALLOW_COPY_AND_ASSIGN(ScopedWindowModifier);
 };
diff --git a/ash/wm/overview/overview_session.cc b/ash/wm/overview/overview_session.cc
index dff9bd9..4d13894 100644
--- a/ash/wm/overview/overview_session.cc
+++ b/ash/wm/overview/overview_session.cc
@@ -996,10 +996,9 @@
     grid->SetBoundsAndUpdatePositions(
         GetGridBoundsInScreen(const_cast<aura::Window*>(grid->root_window()),
                               /*divider_changed=*/true),
-        /*ignored_items=*/{}, /*animate=*/true);
+        /*ignored_items=*/{}, /*animate=*/false);
   }
-  PositionWindows(/*animate=*/false);
-  UpdateNoWindowsWidget();
+  RefreshNoWindowsWidgetBounds(/*animate=*/false);
 }
 
 void OverviewSession::ResetFocusRestoreWindow(bool focus) {
@@ -1084,7 +1083,7 @@
                               /*divider_changed=*/false),
         /*ignored_items=*/{}, /*animate=*/false);
   }
-  UpdateNoWindowsWidget();
+  RefreshNoWindowsWidgetBounds(/*animate=*/false);
 }
 
 void OverviewSession::UpdateNoWindowsWidget() {
diff --git a/ash/wm/overview/scoped_overview_transform_window.cc b/ash/wm/overview/scoped_overview_transform_window.cc
index b59cf355..25d4339 100644
--- a/ash/wm/overview/scoped_overview_transform_window.cc
+++ b/ash/wm/overview/scoped_overview_transform_window.cc
@@ -29,6 +29,7 @@
 #include "base/threading/thread_task_runner_handle.h"
 #include "ui/aura/client/aura_constants.h"
 #include "ui/aura/client/transient_window_client.h"
+#include "ui/aura/scoped_window_event_targeting_blocker.h"
 #include "ui/aura/window.h"
 #include "ui/compositor/layer.h"
 #include "ui/compositor/layer_observer.h"
@@ -111,8 +112,9 @@
 
   std::vector<aura::Window*> transient_children_to_hide;
   for (auto* transient : GetTransientTreeIterator(window)) {
-    targeting_policy_map_[transient] = transient->event_targeting_policy();
-    transient->SetEventTargetingPolicy(aura::EventTargetingPolicy::kNone);
+    event_targeting_blocker_map_[transient] =
+        std::make_unique<aura::ScopedWindowEventTargetingBlocker>(transient);
+
     transient->SetProperty(kIsShowingInOverviewKey, true);
 
     // Hide transient children which have been specified to be hidden in
@@ -160,10 +162,8 @@
 ScopedOverviewTransformWindow::~ScopedOverviewTransformWindow() {
   for (auto* transient : GetTransientTreeIterator(window_)) {
     transient->ClearProperty(kIsShowingInOverviewKey);
-    DCHECK(targeting_policy_map_.contains(transient));
-    auto it = targeting_policy_map_.find(transient);
-    transient->SetEventTargetingPolicy(it->second);
-    targeting_policy_map_.erase(it);
+    DCHECK(event_targeting_blocker_map_.contains(transient));
+    event_targeting_blocker_map_.erase(transient);
   }
 
   // No need to update the clip since we're about to restore it to
@@ -425,10 +425,11 @@
   if (parent != window_ && !::wm::HasTransientAncestor(parent, window_))
     return;
 
-  DCHECK(!targeting_policy_map_.contains(transient_child));
-  targeting_policy_map_[transient_child] =
-      transient_child->event_targeting_policy();
-  transient_child->SetEventTargetingPolicy(aura::EventTargetingPolicy::kNone);
+  DCHECK(!event_targeting_blocker_map_.contains(transient_child));
+  event_targeting_blocker_map_[transient_child] =
+      std::make_unique<aura::ScopedWindowEventTargetingBlocker>(
+          transient_child);
+  transient_child->SetProperty(kIsShowingInOverviewKey, true);
 }
 
 void ScopedOverviewTransformWindow::OnTransientChildWindowRemoved(
@@ -437,10 +438,9 @@
   if (parent != window_ && !::wm::HasTransientAncestor(parent, window_))
     return;
 
-  DCHECK(targeting_policy_map_.contains(transient_child));
-  auto it = targeting_policy_map_.find(transient_child);
-  transient_child->SetEventTargetingPolicy(it->second);
-  targeting_policy_map_.erase(it);
+  transient_child->ClearProperty(kIsShowingInOverviewKey);
+  DCHECK(event_targeting_blocker_map_.contains(transient_child));
+  event_targeting_blocker_map_.erase(transient_child);
 }
 
 void ScopedOverviewTransformWindow::CloseWidget() {
diff --git a/ash/wm/overview/scoped_overview_transform_window.h b/ash/wm/overview/scoped_overview_transform_window.h
index d283d6b8..7f5827ec 100644
--- a/ash/wm/overview/scoped_overview_transform_window.h
+++ b/ash/wm/overview/scoped_overview_transform_window.h
@@ -21,9 +21,11 @@
 #include "ui/gfx/transform.h"
 
 namespace aura {
+
 class Window;
-enum class EventTargetingPolicy;
-}
+class ScopedWindowEventTargetingBlocker;
+
+}  // namespace aura
 
 namespace ui {
 class Layer;
@@ -182,8 +184,6 @@
   // The original opacity of the window before entering overview mode.
   float original_opacity_;
 
-  aura::EventTargetingPolicy original_event_targeting_policy_;
-
   // Specifies how the window is laid out in the grid.
   GridWindowFillMode type_ = GridWindowFillMode::kNormal;
 
@@ -200,8 +200,9 @@
   // For the duration of this object |window_| and its transient childrens'
   // event targeting policy will be sent to NONE. Store the originals so we can
   // change it back when destroying |this|.
-  base::flat_map<aura::Window*, aura::EventTargetingPolicy>
-      targeting_policy_map_;
+  base::flat_map<aura::Window*,
+                 std::unique_ptr<aura::ScopedWindowEventTargetingBlocker>>
+      event_targeting_blocker_map_;
 
   // The original mask layer of the window before entering overview mode.
   ui::Layer* original_mask_layer_ = nullptr;
diff --git a/base/android/java/templates/BuildConfig.template b/base/android/java/templates/BuildConfig.template
index 32bddbc..64dbe44a 100644
--- a/base/android/java/templates/BuildConfig.template
+++ b/base/android/java/templates/BuildConfig.template
@@ -68,4 +68,10 @@
 #else
     public static MAYBE_FINAL int MIN_SDK_VERSION = 1;
 #endif
+
+#if defined(_IS_BUNDLE)
+    public static MAYBE_FINAL boolean IS_BUNDLE = true;
+#else
+    public static MAYBE_FINAL boolean IS_BUNDLE MAYBE_FALSE;
+#endif
 }
diff --git a/base/file_version_info_win_unittest.cc b/base/file_version_info_win_unittest.cc
index 6c81bb7..0bab8568 100644
--- a/base/file_version_info_win_unittest.cc
+++ b/base/file_version_info_win_unittest.cc
@@ -16,6 +16,7 @@
 #include "base/path_service.h"
 #include "base/scoped_native_library.h"
 #include "base/strings/string_util.h"
+#include "build/build_config.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 using base::FilePath;
@@ -157,6 +158,9 @@
             version_info_win->GetFileVersion());
 }
 
+#if defined(ARCH_CPU_64_BITS)
+// TODO(bug_1011439): Change no_version_info.dll to 32 bit, so this test will
+// work for 32-bit Windows as well.
 TYPED_TEST(FileVersionInfoTest, NoVersionInfo) {
   FilePath dll_path = GetTestDataPath();
   dll_path = dll_path.AppendASCII("no_version_info.dll");
@@ -164,3 +168,4 @@
   TypeParam factory(dll_path);
   ASSERT_FALSE(factory.Create());
 }
+#endif
diff --git a/base/test/BUILD.gn b/base/test/BUILD.gn
index ad5af73d..53ea803 100644
--- a/base/test/BUILD.gn
+++ b/base/test/BUILD.gn
@@ -456,6 +456,7 @@
 
 if (is_android) {
   generate_jni("base_unittests_jni_headers") {
+    testonly = true
     sources = [
       "android/java/src/org/chromium/base/ContentUriTestUtils.java",
       "android/java/src/org/chromium/base/JavaHandlerThreadHelpers.java",
@@ -463,6 +464,7 @@
   }
 
   generate_jni("test_support_jni_headers") {
+    testonly = true
     sources = [
       "android/java/src/org/chromium/base/MainReturnCodeResult.java",
       "android/java/src/org/chromium/base/MultiprocessTestClientLauncher.java",
diff --git a/build/android/BUILD.gn b/build/android/BUILD.gn
index 8abd1a72..4f36326 100644
--- a/build/android/BUILD.gn
+++ b/build/android/BUILD.gn
@@ -93,15 +93,11 @@
     data += [
       "//third_party/android_build_tools/bundletool/bundletool-all-0.10.3.jar",
     ]
-    data_deps += [
-      "//third_party/android_platform/development/scripts:stack_py",
-      "//tools/android/avd:avd_py",
-    ]
+    data_deps +=
+        [ "//third_party/android_platform/development/scripts:stack_py" ]
     if (is_asan) {
       data_deps += [ "//tools/android/asan/third_party:asan_device_setup" ]
     }
-  } else {
-    pydeps_sources_assignment_filters = [ "../../tools/android/*" ]
   }
 
   # Proguard is needed only when using apks (rather than native executables).
diff --git a/build/android/PRESUBMIT.py b/build/android/PRESUBMIT.py
index 32ccfac..8eb0792 100644
--- a/build/android/PRESUBMIT.py
+++ b/build/android/PRESUBMIT.py
@@ -10,8 +10,6 @@
 
 
 def CommonChecks(input_api, output_api):
-  output = []
-
   build_android_dir = input_api.PresubmitLocalPath()
 
   def J(*dirs):
@@ -19,32 +17,38 @@
     return input_api.os_path.join(build_android_dir, *dirs)
 
   build_pys = [
+      r'gn/.*\.py$',
       r'gyp/.*\.py$',
-      r'gn/.*\.py',
   ]
-  output.extend(input_api.canned_checks.RunPylint(
-      input_api,
-      output_api,
-      pylintrc='pylintrc',
-      black_list=build_pys,
-      extra_paths_list=[
-          J(),
-          J('gyp'),
-          J('buildbot'),
-          J('..', 'util', 'lib', 'common'),
-          J('..', '..', 'third_party', 'catapult', 'common', 'py_trace_event'),
-          J('..', '..', 'third_party', 'catapult', 'common', 'py_utils'),
-          J('..', '..', 'third_party', 'catapult', 'devil'),
-          J('..', '..', 'third_party', 'catapult', 'tracing'),
-          J('..', '..', 'third_party', 'depot_tools'),
-          J('..', '..', 'third_party', 'colorama', 'src'),
-          J('..', '..', 'third_party', 'pymock'),
-      ]))
-  output.extend(input_api.canned_checks.RunPylint(
-      input_api,
-      output_api,
-      white_list=build_pys,
-      extra_paths_list=[J('gyp'), J('gn')]))
+  tests = []
+  tests.extend(
+      input_api.canned_checks.GetPylint(
+          input_api,
+          output_api,
+          pylintrc='pylintrc',
+          black_list=[
+              r'.*_pb2\.py',
+          ] + build_pys,
+          extra_paths_list=[
+              J(),
+              J('gyp'),
+              J('buildbot'),
+              J('..', 'util', 'lib', 'common'),
+              J('..', '..', 'third_party', 'catapult', 'common',
+                'py_trace_event'),
+              J('..', '..', 'third_party', 'catapult', 'common', 'py_utils'),
+              J('..', '..', 'third_party', 'catapult', 'devil'),
+              J('..', '..', 'third_party', 'catapult', 'tracing'),
+              J('..', '..', 'third_party', 'depot_tools'),
+              J('..', '..', 'third_party', 'colorama', 'src'),
+              J('..', '..', 'third_party', 'pymock'),
+          ]))
+  tests.extend(
+      input_api.canned_checks.GetPylint(
+          input_api,
+          output_api,
+          white_list=build_pys,
+          extra_paths_list=[J('gyp'), J('gn')]))
 
   # Disabled due to http://crbug.com/410936
   #output.extend(input_api.canned_checks.RunUnitTestsInDirectory(
@@ -55,8 +59,8 @@
       'PYTHONPATH': build_android_dir,
       'PYTHONDONTWRITEBYTECODE': '1',
   })
-  output.extend(
-      input_api.canned_checks.RunUnitTests(
+  tests.extend(
+      input_api.canned_checks.GetUnitTests(
           input_api,
           output_api,
           unit_tests=[
@@ -88,7 +92,7 @@
           ],
           env=pylib_test_env))
 
-  return output
+  return input_api.RunTests(tests)
 
 
 def CheckChangeOnUpload(input_api, output_api):
diff --git a/build/android/pylib/local/emulator/avd.py b/build/android/pylib/local/emulator/avd.py
new file mode 100644
index 0000000..cbc72c48
--- /dev/null
+++ b/build/android/pylib/local/emulator/avd.py
@@ -0,0 +1,469 @@
+# Copyright 2019 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.
+
+import contextlib
+import json
+import logging
+import os
+import socket
+import stat
+import subprocess
+import threading
+
+from google.protobuf import text_format  # pylint: disable=import-error
+
+from devil.android import device_utils
+from devil.android.sdk import adb_wrapper
+from devil.utils import cmd_helper
+from devil.utils import timeout_retry
+from py_utils import tempfile_ext
+from pylib import constants
+from pylib.local.emulator.proto import avd_pb2
+
+_ALL_PACKAGES = object()
+_DEFAULT_AVDMANAGER_PATH = os.path.join(constants.ANDROID_SDK_ROOT, 'tools',
+                                        'bin', 'avdmanager')
+
+
+class AvdException(Exception):
+  """Raised when this module has a problem interacting with an AVD."""
+
+  def __init__(self, summary, command=None, stdout=None, stderr=None):
+    message_parts = [summary]
+    if command:
+      message_parts.append('  command: %s' % ' '.join(command))
+    if stdout:
+      message_parts.append('  stdout:')
+      message_parts.extend('    %s' % line for line in stdout.splitlines())
+    if stderr:
+      message_parts.append('  stderr:')
+      message_parts.extend('    %s' % line for line in stderr.splitlines())
+
+    super(AvdException, self).__init__('\n'.join(message_parts))
+
+
+def _Load(avd_proto_path):
+  """Loads an Avd proto from a textpb file at the given path.
+
+  Should not be called outside of this module.
+
+  Args:
+    avd_proto_path: path to a textpb file containing an Avd message.
+  """
+  with open(avd_proto_path) as avd_proto_file:
+    return text_format.Merge(avd_proto_file.read(), avd_pb2.Avd())
+
+
+class _AvdManagerAgent(object):
+  """Private utility for interacting with avdmanager."""
+
+  def __init__(self, avd_home, sdk_root):
+    """Create an _AvdManagerAgent.
+
+    Args:
+      avd_home: path to ANDROID_AVD_HOME directory.
+        Typically something like /path/to/dir/.android/avd
+      sdk_root: path to SDK root directory.
+    """
+    self._avd_home = avd_home
+    self._sdk_root = sdk_root
+
+    self._env = dict(os.environ)
+
+    # avdmanager, like many tools that have evolved from `android`
+    # (http://bit.ly/2m9JiTx), uses toolsdir to find the SDK root.
+    # Pass avdmanager a fake directory under the directory in which
+    # we install the system images s.t. avdmanager can find the
+    # system images.
+    fake_tools_dir = os.path.join(self._sdk_root, 'non-existent-tools')
+    self._env.update({
+        'ANDROID_AVD_HOME':
+        self._avd_home,
+        'AVDMANAGER_OPTS':
+        '-Dcom.android.sdkmanager.toolsdir=%s' % fake_tools_dir,
+    })
+
+  def Create(self, avd_name, system_image, force=False):
+    """Call `avdmanager create`.
+
+    Args:
+      avd_name: name of the AVD to create.
+      system_image: system image to use for the AVD.
+      force: whether to force creation, overwriting any existing
+        AVD with the same name.
+    """
+    create_cmd = [
+        _DEFAULT_AVDMANAGER_PATH,
+        '-v',
+        'create',
+        'avd',
+        '-n',
+        avd_name,
+        '-k',
+        system_image,
+    ]
+    if force:
+      create_cmd += ['--force']
+
+    create_proc = cmd_helper.Popen(
+        create_cmd,
+        stdin=subprocess.PIPE,
+        stdout=subprocess.PIPE,
+        stderr=subprocess.PIPE,
+        env=self._env)
+    output, error = create_proc.communicate(input='\n')
+    if create_proc.returncode != 0:
+      raise AvdException(
+          'AVD creation failed',
+          command=create_cmd,
+          stdout=output,
+          stderr=error)
+
+    for line in output.splitlines():
+      logging.info('  %s', line)
+
+  def Delete(self, avd_name):
+    """Call `avdmanager delete`.
+
+    Args:
+      avd_name: name of the AVD to delete.
+    """
+    delete_cmd = [
+        _DEFAULT_AVDMANAGER_PATH,
+        '-v',
+        'delete',
+        'avd',
+        '-n',
+        avd_name,
+    ]
+    try:
+      for line in cmd_helper.IterCmdOutputLines(delete_cmd, env=self._env):
+        logging.info('  %s', line)
+    except subprocess.CalledProcessError as e:
+      raise AvdException('AVD deletion failed: %s' % str(e), command=delete_cmd)
+
+
+class AvdConfig(object):
+  """Represents a particular AVD configuration.
+
+  This class supports creation, installation, and execution of an AVD
+  from a given Avd proto message, as defined in
+  //build/android/pylib/local/emulator/proto/avd.proto.
+  """
+
+  def __init__(self, avd_proto_path):
+    """Create an AvdConfig object.
+
+    Args:
+      avd_proto_path: path to a textpb file containing an Avd message.
+    """
+    self._config = _Load(avd_proto_path)
+
+    self._emulator_home = os.path.join(constants.DIR_SOURCE_ROOT,
+                                       self._config.avd_package.dest_path)
+    self._emulator_sdk_root = os.path.join(
+        constants.DIR_SOURCE_ROOT, self._config.emulator_package.dest_path)
+    self._emulator_path = os.path.join(self._emulator_sdk_root, 'emulator',
+                                       'emulator')
+
+    self._initialized = False
+    self._initializer_lock = threading.Lock()
+
+  def Create(self,
+             force=False,
+             snapshot=False,
+             keep=False,
+             cipd_json_output=None):
+    """Create an instance of the AVD CIPD package.
+
+    This method:
+     - installs the requisite system image
+     - creates the AVD
+     - modifies the AVD's ini files to support running chromium tests
+       in chromium infrastructure
+     - optionally starts & stops the AVD for snapshotting (default no)
+     - creates and uploads an instance of the AVD CIPD package
+     - optionally deletes the AVD (default yes)
+
+    Args:
+      force: bool indicating whether to force create the AVD.
+      snapshot: bool indicating whether to snapshot the AVD before creating
+        the CIPD package.
+      keep: bool indicating whether to keep the AVD after creating
+        the CIPD package.
+      cipd_json_output: string path to pass to `cipd create` via -json-output.
+    """
+    logging.info('Installing required packages.')
+    self.Install(packages=[
+        self._config.emulator_package,
+        self._config.system_image_package,
+    ])
+
+    android_avd_home = os.path.join(self._emulator_home, 'avd')
+
+    if not os.path.exists(android_avd_home):
+      os.makedirs(android_avd_home)
+
+    avd_manager = _AvdManagerAgent(
+        avd_home=android_avd_home, sdk_root=self._emulator_sdk_root)
+
+    logging.info('Creating AVD.')
+    avd_manager.Create(
+        avd_name=self._config.avd_name,
+        system_image=self._config.system_image_name,
+        force=force)
+
+    try:
+      logging.info('Modifying AVD configuration.')
+
+      root_ini = os.path.join(android_avd_home,
+                              '%s.ini' % self._config.avd_name)
+      avd_dir = os.path.join(android_avd_home, '%s.avd' % self._config.avd_name)
+      config_ini = os.path.join(avd_dir, 'config.ini')
+
+      with open(root_ini, 'a') as root_ini_file:
+        root_ini_file.write('path.rel=avd/%s.avd\n' % self._config.avd_name)
+
+      with open(config_ini, 'a') as config_ini_file:
+        config_ini_file.write('disk.dataPartition.size=4G\n')
+
+      # Start & stop the AVD.
+      self._Initialize()
+      instance = _AvdInstance(self._emulator_path, self._config.avd_name,
+                              self._emulator_home)
+      instance.Start(read_only=not snapshot)
+      device_utils.DeviceUtils(instance.serial).WaitUntilFullyBooted(
+          timeout=180, retries=0)
+      instance.Stop()
+
+      package_def_content = {
+          'package':
+          self._config.avd_package.package_name,
+          'root':
+          self._emulator_home,
+          'install_mode':
+          'copy',
+          'data': [
+              {
+                  'dir': os.path.relpath(avd_dir, self._emulator_home)
+              },
+              {
+                  'file': os.path.relpath(root_ini, self._emulator_home)
+              },
+          ],
+      }
+
+      logging.info('Creating AVD CIPD package.')
+      logging.debug('ensure file content: %s',
+                    json.dumps(package_def_content, indent=2))
+
+      with tempfile_ext.TemporaryFileName(suffix='.json') as package_def_path:
+        with open(package_def_path, 'w') as package_def_file:
+          json.dump(package_def_content, package_def_file)
+
+        logging.info('  %s', self._config.avd_package.package_name)
+        cipd_create_cmd = [
+            'cipd',
+            'create',
+            '-pkg-def',
+            package_def_path,
+        ]
+        if cipd_json_output:
+          cipd_create_cmd.extend([
+              '-json-output',
+              cipd_json_output,
+          ])
+        try:
+          for line in cmd_helper.IterCmdOutputLines(cipd_create_cmd):
+            logging.info('    %s', line)
+        except subprocess.CalledProcessError as e:
+          raise AvdException(
+              'CIPD package creation failed: %s' % str(e),
+              command=cipd_create_cmd)
+
+    finally:
+      if not keep:
+        logging.info('Deleting AVD.')
+        avd_manager.Delete(avd_name=self._config.avd_name)
+
+  def Install(self, packages=_ALL_PACKAGES):
+    """Installs the requested CIPD packages.
+
+    Returns: None
+    Raises: AvdException on failure to install.
+    """
+    pkgs_by_dir = {}
+    if packages is _ALL_PACKAGES:
+      packages = [
+          self._config.avd_package,
+          self._config.emulator_package,
+          self._config.system_image_package,
+      ]
+    for pkg in packages:
+      if not pkg.dest_path in pkgs_by_dir:
+        pkgs_by_dir[pkg.dest_path] = []
+      pkgs_by_dir[pkg.dest_path].append(pkg)
+
+    for pkg_dir, pkgs in pkgs_by_dir.iteritems():
+      logging.info('Installing packages in %s', pkg_dir)
+      cipd_root = os.path.join(constants.DIR_SOURCE_ROOT, pkg_dir)
+      if not os.path.exists(cipd_root):
+        os.makedirs(cipd_root)
+      ensure_path = os.path.join(cipd_root, '.ensure')
+      with open(ensure_path, 'w') as ensure_file:
+        # Make CIPD ensure that all files are present, even if
+        # it thinks the package is installed.
+        ensure_file.write('$ParanoidMode CheckPresence\n\n')
+        for pkg in pkgs:
+          ensure_file.write('%s %s\n' % (pkg.package_name, pkg.version))
+          logging.info('  %s %s', pkg.package_name, pkg.version)
+      ensure_cmd = [
+          'cipd',
+          'ensure',
+          '-ensure-file',
+          ensure_path,
+          '-root',
+          cipd_root,
+      ]
+      try:
+        for line in cmd_helper.IterCmdOutputLines(ensure_cmd):
+          logging.info('    %s', line)
+      except subprocess.CalledProcessError as e:
+        raise AvdException(
+            'Failed to install CIPD package %s: %s' % (pkg.package_name,
+                                                       str(e)),
+            command=ensure_cmd)
+
+    # The emulator requires that some files are writable.
+    for dirname, _, filenames in os.walk(self._emulator_home):
+      for f in filenames:
+        path = os.path.join(dirname, f)
+        if (os.lstat(path).st_mode &
+            (stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO) == stat.S_IRUSR):
+          os.chmod(path, stat.S_IRUSR | stat.S_IWUSR)
+
+  def _Initialize(self):
+    if self._initialized:
+      return
+
+    with self._initializer_lock:
+      if self._initialized:
+        return
+
+      # Emulator start-up looks for the adb daemon. Make sure it's running.
+      adb_wrapper.AdbWrapper.StartServer()
+
+      # Emulator start-up tries to check for the SDK root by looking for
+      # platforms/ and platform-tools/. Ensure they exist.
+      # See http://bit.ly/2YAkyFE for context.
+      required_dirs = [
+          os.path.join(self._emulator_sdk_root, 'platforms'),
+          os.path.join(self._emulator_sdk_root, 'platform-tools'),
+      ]
+      for d in required_dirs:
+        if not os.path.exists(d):
+          os.makedirs(d)
+
+  def CreateInstance(self):
+    """Creates an AVD instance without starting it.
+
+    Returns:
+      An _AvdInstance.
+    """
+    self._Initialize()
+    return _AvdInstance(self._emulator_path, self._config.avd_name,
+                        self._emulator_home)
+
+  def StartInstance(self):
+    """Starts an AVD instance.
+
+    Returns:
+      An _AvdInstance.
+    """
+    instance = self.CreateInstance()
+    instance.Start()
+    return instance
+
+
+class _AvdInstance(object):
+  """Represents a single running instance of an AVD.
+
+  This class should only be created directly by AvdConfig.StartInstance,
+  but its other methods can be freely called.
+  """
+
+  def __init__(self, emulator_path, avd_name, emulator_home):
+    """Create an _AvdInstance object.
+
+    Args:
+      emulator_path: path to the emulator binary.
+      avd_name: name of the AVD to run.
+      emulator_home: path to the emulator home directory.
+    """
+    self._avd_name = avd_name
+    self._emulator_home = emulator_home
+    self._emulator_path = emulator_path
+    self._emulator_proc = None
+    self._emulator_serial = None
+    self._sink = None
+
+  def __str__(self):
+    return '%s|%s' % (self._avd_name, (self._emulator_serial or id(self)))
+
+  def Start(self, read_only=True):
+    """Starts the emulator running an instance of the given AVD."""
+    with tempfile_ext.TemporaryFileName() as socket_path, (contextlib.closing(
+        socket.socket(socket.AF_UNIX))) as sock:
+      sock.bind(socket_path)
+      emulator_cmd = [
+          self._emulator_path, '-avd', self._avd_name, '-report-console',
+          'unix:%s' % socket_path, '-no-window'
+      ]
+      if read_only:
+        emulator_cmd += [
+            '-read-only',
+        ]
+      emulator_env = {}
+      if self._emulator_home:
+        emulator_env['ANDROID_EMULATOR_HOME'] = self._emulator_home
+      sock.listen(1)
+
+      logging.info('Starting emulator.')
+
+      # TODO(jbudorick): Add support for logging emulator stdout & stderr at
+      # higher logging levels.
+      self._sink = open('/dev/null', 'w')
+      self._emulator_proc = cmd_helper.Popen(
+          emulator_cmd, stdout=self._sink, stderr=self._sink, env=emulator_env)
+
+      # Waits for the emulator to report its serial as requested via
+      # -report-console. See http://bit.ly/2lK3L18 for more.
+      def listen_for_serial(s):
+        logging.info('Waiting for connection from emulator.')
+        with contextlib.closing(s.accept()[0]) as conn:
+          val = conn.recv(1024)
+          return 'emulator-%d' % int(val)
+
+      try:
+        self._emulator_serial = timeout_retry.Run(
+            listen_for_serial, timeout=30, retries=0, args=[sock])
+        logging.info('%s started', self._emulator_serial)
+      except Exception as e:
+        self.Stop()
+        raise AvdException('Emulator failed to start: %s' % str(e))
+
+  def Stop(self):
+    """Stops the emulator process."""
+    if self._emulator_proc:
+      if self._emulator_proc.poll() is None:
+        self._emulator_proc.terminate()
+        self._emulator_proc.wait()
+      self._emulator_proc = None
+    if self._sink:
+      self._sink.close()
+      self._sink = None
+
+  @property
+  def serial(self):
+    return self._emulator_serial
diff --git a/build/android/pylib/local/emulator/local_emulator_environment.py b/build/android/pylib/local/emulator/local_emulator_environment.py
index c39827e..24eed16 100644
--- a/build/android/pylib/local/emulator/local_emulator_environment.py
+++ b/build/android/pylib/local/emulator/local_emulator_environment.py
@@ -3,17 +3,10 @@
 # found in the LICENSE file.
 
 import logging
-import os
 
 from devil.utils import parallelizer
-from pylib.constants import host_paths
 from pylib.local.device import local_device_environment
-
-AVD_DIR_PATH = os.path.join(host_paths.DIR_SOURCE_ROOT, 'tools', 'android',
-                            'avd')
-with host_paths.SysPath(AVD_DIR_PATH):
-  import avd  # pylint: disable=import-error
-
+from pylib.local.emulator import avd
 
 # Mirroring https://bit.ly/2OjuxcS#23
 _MAX_ANDROID_EMULATORS = 16
diff --git a/tools/android/avd/proto/__init__.py b/build/android/pylib/local/emulator/proto/__init__.py
similarity index 100%
rename from tools/android/avd/proto/__init__.py
rename to build/android/pylib/local/emulator/proto/__init__.py
diff --git a/tools/android/avd/proto/avd.proto b/build/android/pylib/local/emulator/proto/avd.proto
similarity index 100%
rename from tools/android/avd/proto/avd.proto
rename to build/android/pylib/local/emulator/proto/avd.proto
diff --git a/build/android/pylib/local/emulator/proto/avd_pb2.py b/build/android/pylib/local/emulator/proto/avd_pb2.py
new file mode 100644
index 0000000..c264e6d1
--- /dev/null
+++ b/build/android/pylib/local/emulator/proto/avd_pb2.py
@@ -0,0 +1,218 @@
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: avd.proto
+
+import sys
+_b = sys.version_info[0] < 3 and (lambda x: x) or (lambda x: x.encode('latin1'))
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+from google.protobuf import descriptor_pb2
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+    name='avd.proto',
+    package='tools.android.avd.proto',
+    syntax='proto3',
+    serialized_pb=_b(
+        '\n\tavd.proto\x12\x17tools.android.avd.proto\"G\n\x0b\x43IPDPackage\x12\x14\n\x0cpackage_name\x18\x01 \x01(\t\x12\x0f\n\x07version\x18\x02 \x01(\t\x12\x11\n\tdest_path\x18\x03 \x01(\t\"\xf1\x01\n\x03\x41vd\x12>\n\x10\x65mulator_package\x18\x01 \x01(\x0b\x32$.tools.android.avd.proto.CIPDPackage\x12\x42\n\x14system_image_package\x18\x02 \x01(\x0b\x32$.tools.android.avd.proto.CIPDPackage\x12\x19\n\x11system_image_name\x18\x03 \x01(\t\x12\x39\n\x0b\x61vd_package\x18\x04 \x01(\x0b\x32$.tools.android.avd.proto.CIPDPackage\x12\x10\n\x08\x61vd_name\x18\x05 \x01(\tb\x06proto3'
+    ))
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+_CIPDPACKAGE = _descriptor.Descriptor(
+    name='CIPDPackage',
+    full_name='tools.android.avd.proto.CIPDPackage',
+    filename=None,
+    file=DESCRIPTOR,
+    containing_type=None,
+    fields=[
+        _descriptor.FieldDescriptor(
+            name='package_name',
+            full_name='tools.android.avd.proto.CIPDPackage.package_name',
+            index=0,
+            number=1,
+            type=9,
+            cpp_type=9,
+            label=1,
+            has_default_value=False,
+            default_value=_b("").decode('utf-8'),
+            message_type=None,
+            enum_type=None,
+            containing_type=None,
+            is_extension=False,
+            extension_scope=None,
+            options=None),
+        _descriptor.FieldDescriptor(
+            name='version',
+            full_name='tools.android.avd.proto.CIPDPackage.version',
+            index=1,
+            number=2,
+            type=9,
+            cpp_type=9,
+            label=1,
+            has_default_value=False,
+            default_value=_b("").decode('utf-8'),
+            message_type=None,
+            enum_type=None,
+            containing_type=None,
+            is_extension=False,
+            extension_scope=None,
+            options=None),
+        _descriptor.FieldDescriptor(
+            name='dest_path',
+            full_name='tools.android.avd.proto.CIPDPackage.dest_path',
+            index=2,
+            number=3,
+            type=9,
+            cpp_type=9,
+            label=1,
+            has_default_value=False,
+            default_value=_b("").decode('utf-8'),
+            message_type=None,
+            enum_type=None,
+            containing_type=None,
+            is_extension=False,
+            extension_scope=None,
+            options=None),
+    ],
+    extensions=[],
+    nested_types=[],
+    enum_types=[],
+    options=None,
+    is_extendable=False,
+    syntax='proto3',
+    extension_ranges=[],
+    oneofs=[],
+    serialized_start=38,
+    serialized_end=109,
+)
+
+_AVD = _descriptor.Descriptor(
+    name='Avd',
+    full_name='tools.android.avd.proto.Avd',
+    filename=None,
+    file=DESCRIPTOR,
+    containing_type=None,
+    fields=[
+        _descriptor.FieldDescriptor(
+            name='emulator_package',
+            full_name='tools.android.avd.proto.Avd.emulator_package',
+            index=0,
+            number=1,
+            type=11,
+            cpp_type=10,
+            label=1,
+            has_default_value=False,
+            default_value=None,
+            message_type=None,
+            enum_type=None,
+            containing_type=None,
+            is_extension=False,
+            extension_scope=None,
+            options=None),
+        _descriptor.FieldDescriptor(
+            name='system_image_package',
+            full_name='tools.android.avd.proto.Avd.system_image_package',
+            index=1,
+            number=2,
+            type=11,
+            cpp_type=10,
+            label=1,
+            has_default_value=False,
+            default_value=None,
+            message_type=None,
+            enum_type=None,
+            containing_type=None,
+            is_extension=False,
+            extension_scope=None,
+            options=None),
+        _descriptor.FieldDescriptor(
+            name='system_image_name',
+            full_name='tools.android.avd.proto.Avd.system_image_name',
+            index=2,
+            number=3,
+            type=9,
+            cpp_type=9,
+            label=1,
+            has_default_value=False,
+            default_value=_b("").decode('utf-8'),
+            message_type=None,
+            enum_type=None,
+            containing_type=None,
+            is_extension=False,
+            extension_scope=None,
+            options=None),
+        _descriptor.FieldDescriptor(
+            name='avd_package',
+            full_name='tools.android.avd.proto.Avd.avd_package',
+            index=3,
+            number=4,
+            type=11,
+            cpp_type=10,
+            label=1,
+            has_default_value=False,
+            default_value=None,
+            message_type=None,
+            enum_type=None,
+            containing_type=None,
+            is_extension=False,
+            extension_scope=None,
+            options=None),
+        _descriptor.FieldDescriptor(
+            name='avd_name',
+            full_name='tools.android.avd.proto.Avd.avd_name',
+            index=4,
+            number=5,
+            type=9,
+            cpp_type=9,
+            label=1,
+            has_default_value=False,
+            default_value=_b("").decode('utf-8'),
+            message_type=None,
+            enum_type=None,
+            containing_type=None,
+            is_extension=False,
+            extension_scope=None,
+            options=None),
+    ],
+    extensions=[],
+    nested_types=[],
+    enum_types=[],
+    options=None,
+    is_extendable=False,
+    syntax='proto3',
+    extension_ranges=[],
+    oneofs=[],
+    serialized_start=112,
+    serialized_end=353,
+)
+
+_AVD.fields_by_name['emulator_package'].message_type = _CIPDPACKAGE
+_AVD.fields_by_name['system_image_package'].message_type = _CIPDPACKAGE
+_AVD.fields_by_name['avd_package'].message_type = _CIPDPACKAGE
+DESCRIPTOR.message_types_by_name['CIPDPackage'] = _CIPDPACKAGE
+DESCRIPTOR.message_types_by_name['Avd'] = _AVD
+
+CIPDPackage = _reflection.GeneratedProtocolMessageType(
+    'CIPDPackage',
+    (_message.Message, ),
+    dict(
+        DESCRIPTOR=_CIPDPACKAGE,
+        __module__='avd_pb2'
+        # @@protoc_insertion_point(class_scope:tools.android.avd.proto.CIPDPackage)
+    ))
+_sym_db.RegisterMessage(CIPDPackage)
+
+Avd = _reflection.GeneratedProtocolMessageType(
+    'Avd',
+    (_message.Message, ),
+    dict(
+        DESCRIPTOR=_AVD,
+        __module__='avd_pb2'
+        # @@protoc_insertion_point(class_scope:tools.android.avd.proto.Avd)
+    ))
+_sym_db.RegisterMessage(Avd)
+
+# @@protoc_insertion_point(module_scope)
diff --git a/build/android/test_runner.pydeps b/build/android/test_runner.pydeps
index f19d9b9..e4b118c 100644
--- a/build/android/test_runner.pydeps
+++ b/build/android/test_runner.pydeps
@@ -118,9 +118,6 @@
 ../../third_party/markupsafe/__init__.py
 ../../third_party/markupsafe/_compat.py
 ../../third_party/markupsafe/_native.py
-../../tools/android/avd/avd.py
-../../tools/android/avd/proto/__init__.py
-../../tools/android/avd/proto/avd_pb2.py
 ../../tools/swarming_client/libs/__init__.py
 ../../tools/swarming_client/libs/logdog/__init__.py
 ../../tools/swarming_client/libs/logdog/bootstrap.py
@@ -172,7 +169,10 @@
 pylib/local/device/local_device_monkey_test_run.py
 pylib/local/device/local_device_test_run.py
 pylib/local/emulator/__init__.py
+pylib/local/emulator/avd.py
 pylib/local/emulator/local_emulator_environment.py
+pylib/local/emulator/proto/__init__.py
+pylib/local/emulator/proto/avd_pb2.py
 pylib/local/local_test_server_spawner.py
 pylib/local/machine/__init__.py
 pylib/local/machine/local_machine_environment.py
diff --git a/build/config/android/rules.gni b/build/config/android/rules.gni
index e74291a..0fa7024 100644
--- a/build/config/android/rules.gni
+++ b/build/config/android/rules.gni
@@ -1985,6 +1985,10 @@
         defines += [ "_IS_CHROME_BRANDED" ]
       }
 
+      if (defined(invoker.is_bundle_module) && invoker.is_bundle_module) {
+        defines += [ "_IS_BUNDLE" ]
+      }
+
       if (invoker.use_final_fields) {
         forward_variables_from(invoker,
                                [
@@ -2698,7 +2702,11 @@
 
     if (_generate_buildconfig_java) {
       generate_build_config_srcjar("${_template_name}__build_config_srcjar") {
-        forward_variables_from(invoker, [ "min_sdk_version" ])
+        forward_variables_from(invoker,
+                               [
+                                 "is_bundle_module",
+                                 "min_sdk_version",
+                               ])
         use_final_fields = true
         enable_multidex = _enable_multidex
         if (defined(invoker.product_version_resources_dep)) {
diff --git a/build/config/fuchsia/BUILD.gn b/build/config/fuchsia/BUILD.gn
index 888be8c..9a0ca69 100644
--- a/build/config/fuchsia/BUILD.gn
+++ b/build/config/fuchsia/BUILD.gn
@@ -3,7 +3,7 @@
 # found in the LICENSE file.
 
 import("//build/config/fuchsia/config.gni")
-import("//build/config/fuchsia/rules.gni")
+import("//build/config/fuchsia/generate_runner_scripts.gni")
 import("//build/config/sysroot.gni")
 
 assert(is_fuchsia)
diff --git a/build/config/fuchsia/generate_runner_scripts.gni b/build/config/fuchsia/generate_runner_scripts.gni
new file mode 100644
index 0000000..2a8bc0a6
--- /dev/null
+++ b/build/config/fuchsia/generate_runner_scripts.gni
@@ -0,0 +1,195 @@
+# Copyright 2018 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.
+
+assert(is_fuchsia)
+
+import("//build/config/chromecast_build.gni")
+import("//build/config/fuchsia/config.gni")
+import("//build/config/fuchsia/package.gni")
+import("//build/config/sysroot.gni")
+import("//build/util/generate_wrapper.gni")
+
+declare_args() {
+  # Sets the Fuchsia Amber repository which will be used by default by the
+  # generated installation scripts. If not specified, then no default directory
+  # will be used.
+  default_fuchsia_build_dir_for_installation = ""
+}
+
+# Generates a script which deploys and optionally executes a package on a
+# device.
+#
+# Parameters:
+#   package: The package() target which will be run.
+#   package_name_override: Specifies the name of the generated package, if its
+#       name is different than the |package| target name. This value must match
+#       package_name_override in the |package| target.
+#   package_deps: An array of [package, package_name_override] array pairs
+#       which specify additional dependency packages to be installed
+#       prior to execution.
+#   runner_script: The runner script implementation to use, relative to
+#       "build/fuchsia". Defaults to "test_runner.py".
+#   install_only: If true, executing the script will only install the package
+#       on the device, but not run it.
+template("fuchsia_package_runner") {
+  forward_variables_from(invoker, [ "runner_script" ])
+
+  if (defined(invoker.package_name_override)) {
+    _pkg_shortname = invoker.package_name_override
+  } else {
+    _pkg_shortname = get_label_info(invoker.package, "name")
+  }
+
+  _pkg_dir = "$root_out_dir/gen/" + get_label_info(invoker.package, "dir") +
+             "/" + _pkg_shortname
+  _manifest_path = "$_pkg_dir/${_pkg_shortname}.archive_manifest"
+  _package_path = "$_pkg_dir/${_pkg_shortname}.far"
+
+  generated_run_pkg_script_path = "$root_build_dir/bin/run_${_pkg_shortname}"
+  generated_install_pkg_script_path =
+      "$root_build_dir/bin/install_$_pkg_shortname"
+
+  _generate_runner_target = "${target_name}__generate_runner"
+  _generate_installer_target = "${target_name}__generate_installer"
+
+  # Generates a script which installs and runs a test.
+  generate_wrapper(_generate_runner_target) {
+    forward_variables_from(invoker,
+                           [
+                             "target",
+                             "testonly",
+                           ])
+
+    if (defined(runner_script)) {
+      executable = rebase_path(runner_script)
+    } else {
+      executable = rebase_path("//build/fuchsia/test_runner.py")
+    }
+    wrapper_script = generated_run_pkg_script_path
+
+    deps = [
+      invoker.package,
+    ]
+    if (defined(invoker.deps)) {
+      deps += invoker.deps
+    }
+
+    data_deps = [
+      invoker.package,
+    ]
+
+    # Declares the files that are needed for test execution on the
+    # swarming test client.
+    data = [
+      _manifest_path,
+      "//build/fuchsia/",
+      "//build/util/lib/",
+      "//third_party/llvm-build/Release+Asserts/bin/llvm-symbolizer",
+      "${qemu_root}/",
+      "${fuchsia_sdk}/tools/fvm",
+      "${fuchsia_sdk}/tools/pm",
+      "${fuchsia_sdk}/tools/symbolize",
+      "${fuchsia_sdk}/tools/zbi",
+      "${fuchsia_sdk}/.build-id/",
+      "${boot_image_root}/qemu/qemu-kernel.kernel",
+      "${boot_image_root}/qemu/storage-full.blk",
+      "${boot_image_root}/qemu/zircon-a.zbi",
+    ]
+
+    executable_args = []
+
+    package_paths = [ rebase_path(_package_path, root_build_dir) ]
+    if (defined(invoker.package_deps)) {
+      foreach(package_dep, invoker.package_deps) {
+        package_dep_target = package_dep[0]
+        package_dep_name = package_dep[1]
+
+        deps += [ package_dep_target ]
+        package_dep_path = rebase_path(
+                get_label_info(package_dep_target, "target_gen_dir") + "/" +
+                    package_dep_name + "/" + package_dep_name + ".far",
+                root_build_dir)
+        package_paths += [ package_dep_path ]
+      }
+    }
+
+    foreach(package_path, package_paths) {
+      executable_args += [
+        "--package",
+        "@WrappedPath(${package_path})",
+      ]
+    }
+
+    executable_args += [
+      "--output-directory",
+      "@WrappedPath(.)",
+      "--target-cpu",
+      target_cpu,
+      "--package-name",
+      _pkg_shortname,
+    ]
+
+    if (defined(invoker.use_test_server) && invoker.use_test_server) {
+      executable_args += [ "--enable-test-server" ]
+    }
+  }
+
+  # Produces a script which installs a package and its dependencies into the
+  # Amber repository of a pre-existing Fuchsia build directory.
+  generate_wrapper(_generate_installer_target) {
+    forward_variables_from(invoker, [ "testonly" ])
+
+    executable = rebase_path("//build/fuchsia/deploy_to_amber_repo.py")
+    wrapper_script = generated_install_pkg_script_path
+
+    deps = [
+      invoker.package,
+    ]
+    if (defined(invoker.deps)) {
+      deps += invoker.deps
+    }
+
+    # Build a list of all packages to install, and pass the list to the runner
+    # script.
+    package_paths = [ rebase_path(_package_path, root_build_dir) ]
+    if (defined(invoker.package_deps)) {
+      foreach(package_dep, invoker.package_deps) {
+        package_dep_target = package_dep[0]
+        package_dep_name = package_dep[1]
+
+        deps += [ package_dep_target ]
+        package_dep_path = rebase_path(
+                get_label_info(package_dep_target, "target_gen_dir") + "/" +
+                    package_dep_name + "/" + package_dep_name + ".far",
+                root_build_dir)
+        package_paths += [ package_dep_path ]
+      }
+    }
+    executable_args = []
+    foreach(package_path, package_paths) {
+      executable_args += [
+        "--package",
+        "@WrappedPath(${package_path})",
+      ]
+
+      if (default_fuchsia_build_dir_for_installation != "") {
+        executable_args += [
+          "--fuchsia-out-dir",
+          default_fuchsia_build_dir_for_installation,
+        ]
+      }
+    }
+  }
+
+  group(target_name) {
+    forward_variables_from(invoker, [ "testonly" ])
+    deps = [
+      ":${_generate_installer_target}",
+    ]
+
+    if (!defined(invoker.install_only) || invoker.install_only == false) {
+      deps += [ ":${_generate_runner_target}" ]
+    }
+  }
+}
diff --git a/build/config/fuchsia/rules.gni b/build/config/fuchsia/rules.gni
index f7edfdc..689e130b 100644
--- a/build/config/fuchsia/rules.gni
+++ b/build/config/fuchsia/rules.gni
@@ -1,163 +1,5 @@
-# Copyright 2018 The Chromium Authors. All rights reserved.
+# Copyright 2019 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.
 
-assert(is_fuchsia)
-
-import("//build/config/chromecast_build.gni")
-import("//build/config/fuchsia/config.gni")
-import("//build/config/fuchsia/package.gni")
-import("//build/config/sysroot.gni")
-import("//build/util/generate_wrapper.gni")
-
-# Generates a script which deploys and executes a package on a device.
-#
-# Parameters:
-#   package: The package() target which will be run.
-#   package_name_override: Specifies the name of the generated package, if its
-#       name is different than the |package| target name. This value must match
-#       package_name_override in the |package| target.
-#   package_deps: An array of [package, package_name_override] array pairs
-#       which specify additional dependency packages to be installed
-#       prior to execution.
-#   runner_script: The runner script implementation to use, relative to
-#       "build/fuchsia". Defaults to "exe_runner.py".
-#   install_only: If true, executing the script will only install the package
-#       on the device, but not run it.
-template("fuchsia_package_runner") {
-  forward_variables_from(invoker, [ "runner_script" ])
-
-  if (defined(invoker.package_name_override)) {
-    _pkg_shortname = invoker.package_name_override
-  } else {
-    _pkg_shortname = get_label_info(invoker.package, "name")
-  }
-
-  _pkg_dir = "$root_out_dir/gen/" + get_label_info(invoker.package, "dir") +
-             "/" + _pkg_shortname
-  _manifest_path = "$_pkg_dir/${_pkg_shortname}.archive_manifest"
-  _package_path = "$_pkg_dir/${_pkg_shortname}.far"
-
-  if (!defined(runner_script)) {
-    runner_script = "//build/fuchsia/exe_runner.py"
-  }
-
-  generated_run_pkg_script_path = "$root_build_dir/bin/run_${_pkg_shortname}"
-  generated_install_pkg_script_path =
-      "$root_build_dir/bin/install_$_pkg_shortname"
-
-  _generate_runner_target = "${target_name}__generate_runner"
-  _generate_installer_target = "${target_name}__generate_installer"
-  _generate_template = "${target_name}__generate_template"
-
-  # Generates a script to install and optionally run a package.
-  #
-  # Parameters:
-  #   |install_only|: If true, builds a script that only installs a package.
-  #   |script_path|: The path of the script to generate.
-  template(_generate_template) {
-    generate_wrapper(target_name) {
-      forward_variables_from(invoker,
-                             [
-                               "install_only",
-                               "script_path",
-                               "target",
-                               "testonly",
-                             ])
-
-      executable = runner_script
-      wrapper_script = script_path
-
-      deps = [
-        invoker.package,
-      ]
-
-      if (defined(invoker.deps)) {
-        deps += invoker.deps
-      }
-
-      # Declares the files that are needed for test execution on the
-      # swarming test client.
-      data = [
-        _manifest_path,
-        "//build/fuchsia/",
-        "//build/util/lib/",
-        "//third_party/llvm-build/Release+Asserts/bin/llvm-symbolizer",
-        "${qemu_root}/",
-        "${fuchsia_sdk}/tools/fvm",
-        "${fuchsia_sdk}/tools/pm",
-        "${fuchsia_sdk}/tools/symbolize",
-        "${fuchsia_sdk}/tools/zbi",
-        "${fuchsia_sdk}/.build-id/",
-        "${boot_image_root}/qemu/qemu-kernel.kernel",
-        "${boot_image_root}/qemu/storage-full.blk",
-        "${boot_image_root}/qemu/zircon-a.zbi",
-      ]
-
-      data_deps = [
-        invoker.package,
-      ]
-
-      executable_args = []
-
-      if (defined(invoker.package_deps)) {
-        foreach(cur_package, invoker.package_deps) {
-          deps += [ cur_package[0] ]
-          dep_package_path =
-              get_label_info(cur_package[0], "target_gen_dir") + "/" +
-              cur_package[1] + "/" + cur_package[1] + ".far"
-          _rebased_dep_package_path =
-              rebase_path(dep_package_path, root_build_dir)
-          executable_args += [
-            "--package-dep",
-            "@WrappedPath(${_rebased_dep_package_path})",
-          ]
-        }
-      }
-
-      _rebased_package_path = rebase_path(_package_path, root_build_dir)
-      executable_args += [
-        "--output-directory",
-        "@WrappedPath(.)",
-        "--target-cpu",
-        target_cpu,
-        "--package",
-        "@WrappedPath(${_rebased_package_path})",
-        "--package-name",
-        _pkg_shortname,
-      ]
-
-      if (defined(invoker.use_test_server) && invoker.use_test_server) {
-        executable_args += [ "--enable-test-server" ]
-      }
-
-      if (defined(install_only) && install_only) {
-        executable_args += [ "--install-only" ]
-      }
-    }
-  }
-
-  target(_generate_template, _generate_runner_target) {
-    forward_variables_from(invoker, "*")
-    script_path = generated_run_pkg_script_path
-  }
-
-  target(_generate_template, _generate_installer_target) {
-    forward_variables_from(invoker, "*")
-    script_path = generated_install_pkg_script_path
-    install_only = true
-  }
-
-  # Build the installer script, and the runner for non-|install_only| targets.
-  group(target_name) {
-    forward_variables_from(invoker, [ "testonly" ])
-    deps = [
-      ":${_generate_installer_target}",
-    ]
-
-    # Generate a runner script if the target is not install-only.
-    if (!defined(invoker.install_only)) {
-      deps += [ ":${_generate_runner_target}" ]
-    }
-  }
-}
+import("//build/config/fuchsia/generate_runner_scripts.gni")
diff --git a/build/config/python.gni b/build/config/python.gni
index 15c4574..0fb8bd4 100644
--- a/build/config/python.gni
+++ b/build/config/python.gni
@@ -22,9 +22,6 @@
 #
 # Variables
 #   pydeps_file: Path to .pydeps file to read sources from (optional).
-#   pydeps_sources_assignment_filters: Additional sources_assignment_filters to
-#     use when reading the contents of the pydeps file. Unused if pydeps_file
-#     isn't set. (optional)
 #   data: Additional files to include in data. E.g. non-.py files needed by the
 #         library, or .py files that are conditionally / lazily imported.
 #
@@ -47,12 +44,7 @@
       _py_files = read_file(invoker.pydeps_file, "list lines")
 
       # Filter out comments.
-      pydeps_sources_assignment_filters = [ "#*" ]
-      if (defined(invoker.pydeps_sources_assignment_filters)) {
-        pydeps_sources_assignment_filters +=
-            invoker.pydeps_sources_assignment_filters
-      }
-      set_sources_assignment_filter(pydeps_sources_assignment_filters)
+      set_sources_assignment_filter([ "#*" ])
       sources = _py_files
 
       # Dependencies are listed relative to the pydeps file directory, but data
diff --git a/build/fuchsia/common.py b/build/fuchsia/common.py
index b9ef6ae..7dd3d52c 100644
--- a/build/fuchsia/common.py
+++ b/build/fuchsia/common.py
@@ -15,6 +15,8 @@
 IMAGES_ROOT = os.path.join(DIR_SOURCE_ROOT, 'third_party', 'fuchsia-sdk',
                            'images')
 
+_PM = os.path.join(SDK_ROOT, 'tools', 'pm')
+
 def EnsurePathExists(path):
   """Checks that the file |path| exists on the filesystem and returns the path
   if it does, raising an exception otherwise."""
@@ -86,3 +88,11 @@
   port = sock.getsockname()[1]
   sock.close()
   return port
+
+
+def PublishPackage(package_path, tuf_root):
+  """Publishes a combined FAR package to a TUF repository root."""
+
+  subprocess.check_call(
+      [_PM, 'publish', '-a', '-f', package_path, '-r', tuf_root, '-vt', '-v'],
+      stderr=subprocess.STDOUT)
diff --git a/build/fuchsia/common_args.py b/build/fuchsia/common_args.py
index 4430182..7716771 100644
--- a/build/fuchsia/common_args.py
+++ b/build/fuchsia/common_args.py
@@ -15,16 +15,12 @@
   across test and executable target types."""
 
   common_args = arg_parser.add_argument_group('common', 'Common arguments')
-  common_args.add_argument('--package',
-                           type=os.path.realpath, required=True,
-                           help='Path to the package to execute.')
+  common_args.add_argument('--package', action='append', required=True,
+                           help='Paths of the packages to install, including '
+                                'all dependencies.')
   common_args.add_argument('--package-name', required=True,
                            help='Name of the package to execute, defined in ' +
                                 'package metadata.')
-  common_args.add_argument('--package-dep', action='append', default=[],
-                           help='Path to an additional package to install.')
-  common_args.add_argument('--install-only', action='store_true', default=False,
-                           help='Install the packages but do not run them.')
   common_args.add_argument('--output-directory',
                            type=os.path.realpath, required=True,
                            help=('Path to the directory in which build files '
diff --git a/build/fuchsia/deploy_to_amber_repo.py b/build/fuchsia/deploy_to_amber_repo.py
new file mode 100755
index 0000000..6f36e0a6
--- /dev/null
+++ b/build/fuchsia/deploy_to_amber_repo.py
@@ -0,0 +1,47 @@
+#!/usr/bin/env python
+#
+# Copyright 2019 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.
+
+"""Deploys Fuchsia packages to an Amber repository in a Fuchsia
+build output directory."""
+
+import argparse
+import os
+import sys
+
+from common import PublishPackage
+
+
+def main():
+  parser = argparse.ArgumentParser()
+  parser.add_argument('--package', action='append', required=True,
+                      help='Paths to packages to install.')
+  parser.add_argument('--fuchsia-out-dir', nargs='+',
+                      help='Path to a Fuchsia build output directory. '
+                           'If more than one outdir is supplied, the last one '
+                           'in the sequence will be used.')
+  args = parser.parse_args()
+  assert args.package
+
+  if not args.fuchsia_out_dir or len(args.fuchsia_out_dir) == 0:
+    sys.stderr.write('No Fuchsia build output directory was specified.\n' +
+                     'To resolve this, Use the commandline argument ' +
+                     '--fuchsia-out-dir\nor set the GN arg ' +
+                     '"default_fuchsia_build_dir_for_installation".\n')
+    return 1
+
+  fuchsia_out_dir = args.fuchsia_out_dir.pop()
+  tuf_root = os.path.join(fuchsia_out_dir, 'amber-files')
+  print('Installing packages in Amber repo %s...' % tuf_root)
+  for package in args.package:
+    PublishPackage(package, os.path.expanduser(tuf_root))
+
+  print('Installation success.')
+
+  return 0
+
+
+if __name__ == '__main__':
+  sys.exit(main())
diff --git a/build/fuchsia/linux.sdk.sha1 b/build/fuchsia/linux.sdk.sha1
index d6cb689..5f30743 100644
--- a/build/fuchsia/linux.sdk.sha1
+++ b/build/fuchsia/linux.sdk.sha1
@@ -1 +1 @@
-8900518552241941952
\ No newline at end of file
+8900492300904953840
\ No newline at end of file
diff --git a/build/fuchsia/mac.sdk.sha1 b/build/fuchsia/mac.sdk.sha1
index 1faa8072..057cb8f 100644
--- a/build/fuchsia/mac.sdk.sha1
+++ b/build/fuchsia/mac.sdk.sha1
@@ -1 +1 @@
-8900523953382962080
\ No newline at end of file
+8900493005257945968
\ No newline at end of file
diff --git a/build/fuchsia/run_package.py b/build/fuchsia/run_package.py
index 6e3a5d2..2e0846d 100644
--- a/build/fuchsia/run_package.py
+++ b/build/fuchsia/run_package.py
@@ -117,7 +117,6 @@
 class RunPackageArgs:
   """RunPackage() configuration arguments structure.
 
-  install_only: If set, skips the package execution step.
   symbolizer_config: A newline delimited list of source files contained
       in the package. Omitting this parameter will disable symbolization.
   system_logging: If set, connects a system log reader to the target.
@@ -125,7 +124,6 @@
       installation. Defaults to staging into '/data'.
   """
   def __init__(self):
-    self.install_only = False
     self.symbolizer_config = None
     self.system_logging = False
     self.target_staging_path = '/data'
@@ -133,7 +131,6 @@
   @staticmethod
   def FromCommonArgs(args):
     run_package_args = RunPackageArgs()
-    run_package_args.install_only = args.install_only
     run_package_args.system_logging = args.include_system_logs
     run_package_args.target_staging_path = args.target_staging_path
     return run_package_args
@@ -151,15 +148,15 @@
       print(line.rstrip())
 
 
-def RunPackage(output_dir, target, package_path, package_name,
-               package_deps, package_args, args):
+def RunPackage(output_dir, target, package_paths, package_name,
+               package_args, args):
   """Installs the Fuchsia package at |package_path| on the target,
   executes it with |package_args|, and symbolizes its output.
 
   output_dir: The path containing the build output files.
   target: The deployment Target object that will run the package.
-  package_path: The path to the .far package file.
-  package_name: The name of app specified by package metadata.
+  package_paths: The paths to the .far packages to be installed.
+  package_name: The name of the primary package to run.
   package_args: The arguments which will be passed to the Fuchsia process.
   args: Structure of arguments to configure how the package will be run.
 
@@ -178,16 +175,12 @@
       log_output_thread.daemon = True
       log_output_thread.start()
 
-    target.InstallPackage(package_path, package_name, package_deps)
+    target.InstallPackage(package_paths)
 
     if system_logger:
       log_output_quit_event.set()
       log_output_thread.join(timeout=_JOIN_TIMEOUT_SECS)
 
-    if args.install_only:
-      logging.info('Installation complete.')
-      return
-
     logging.info('Running application.')
     command = ['run', _GetComponentUri(package_name)] + package_args
     process = target.RunCommandPiped(command,
@@ -205,7 +198,7 @@
     build_ids_paths = map(
         lambda package_path: os.path.join(
             os.path.dirname(package_path), 'ids.txt'),
-        [package_path] + package_deps)
+        package_paths)
     output_stream = SymbolizerFilter(output_stream, build_ids_paths)
 
     for next_line in output_stream:
diff --git a/build/fuchsia/target.py b/build/fuchsia/target.py
index 0d29cd1b..b2e1505 100644
--- a/build/fuchsia/target.py
+++ b/build/fuchsia/target.py
@@ -40,14 +40,6 @@
   return (package_info['name'], package_info['version'])
 
 
-def _PublishPackage(tuf_root, package_path):
-  """Publishes a combined FAR package to a TUF repository root."""
-
-  subprocess.check_call(
-      [_PM, 'publish', '-a', '-f', package_path, '-r', tuf_root, '-vt', '-v'],
-      stderr=subprocess.STDOUT)
-
-
 class _MapIsolatedPathsForPackage:
   """Callable object which remaps /data and /tmp paths to their package-specific
      locations."""
@@ -266,15 +258,12 @@
       return 'x86_64'
     raise Exception('Unknown target_cpu %s:' % self._target_cpu)
 
-  def InstallPackage(self, package_path, package_name, package_deps):
+  def InstallPackage(self, package_paths):
     """Installs a package and it's dependencies on the device. If the package is
     already installed then it will be updated to the new version.
 
-    package_path: Path to the .far file to be installed.
-    package_name: Package name.
-    package_deps: List of .far files with the packages that the main package
-                  depends on. These packages are installed or updated as well.
-    """
+    package_paths: Paths to the .far files to install."""
+
     try:
       tuf_root = tempfile.mkdtemp()
       pm_serve_task = None
@@ -289,9 +278,8 @@
            ':%d' % serve_port, '-q'])
 
       # Publish all packages to the serving TUF repository under |tuf_root|.
-      all_packages = [package_path] + package_deps
-      for next_package_path in all_packages:
-        _PublishPackage(tuf_root, next_package_path)
+      for next_package_path in package_paths:
+        common.PublishPackage(next_package_path, tuf_root)
 
       _WaitForPmServeToBeReady(serve_port)
 
@@ -299,7 +287,7 @@
       self._RegisterAmberRepository(tuf_root, remote_port)
 
       # Install all packages.
-      for next_package_path in all_packages:
+      for next_package_path in package_paths:
         install_package_name, package_version = \
             _GetPackageInfo(next_package_path)
         logging.info('Installing %s version %s.' %
diff --git a/build/fuchsia/test_runner.py b/build/fuchsia/test_runner.py
index 669de83..6efa46f 100755
--- a/build/fuchsia/test_runner.py
+++ b/build/fuchsia/test_runner.py
@@ -123,7 +123,7 @@
     run_package_args = RunPackageArgs.FromCommonArgs(args)
     returncode = RunPackage(
         args.output_directory, target, args.package, args.package_name,
-        args.package_dep, child_args, run_package_args)
+        child_args, run_package_args)
 
     if test_server:
       test_server.Stop()
diff --git a/chrome/VERSION b/chrome/VERSION
index 311b0f3..1ae5797 100644
--- a/chrome/VERSION
+++ b/chrome/VERSION
@@ -1,4 +1,4 @@
 MAJOR=79
 MINOR=0
-BUILD=3933
+BUILD=3934
 PATCH=0
diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn
index c466072d8..1030494 100644
--- a/chrome/android/BUILD.gn
+++ b/chrome/android/BUILD.gn
@@ -738,9 +738,6 @@
     "//testing/buildbot/filters:chrome_junit_tests_filters",
   ]
 
-  srcjar_deps =
-      [ "//components/module_installer/android:module_installer_build_config" ]
-
   package_name = chrome_public_manifest_package
 }
 
@@ -1531,6 +1528,7 @@
 ]
 
 generate_jni("test_support_jni_headers") {
+  testonly = true
   sources = [
     "javatests/src/org/chromium/chrome/browser/ServicificationBackgroundService.java",
     "javatests/src/org/chromium/chrome/browser/offlinepages/OfflineTestUtil.java",
diff --git a/chrome/android/chrome_public_apk_tmpl.gni b/chrome/android/chrome_public_apk_tmpl.gni
index 17797eb..1023e174 100644
--- a/chrome/android/chrome_public_apk_tmpl.gni
+++ b/chrome/android/chrome_public_apk_tmpl.gni
@@ -232,24 +232,18 @@
       }
     }
 
-    # Only bundles can install modules. Therefore, include stub implementation
-    # for all other targets to save some binary size.
-    if (_target_type == "android_app_bundle_module") {
-      srcjar_deps = [ "//components/module_installer/android:module_installer_bundle_build_config" ]
-    } else {  # |_target_type| is "android_apk" or "instrumentation_test_apk".
-      if (dfmify_dev_ui) {
-        # Native resource split moves resources out of resources.pak, but this
-        # is a DFM feature, which APKs don't use. To make the resources split
-        # available for APKs, add dependencies to (1) Java classes, (2)
-        # resources of the resource split's DFM (e.g., DevUI DFM). The Java
-        # classes tells Chrome that the DFM is installed, which then causes the
-        # included resources to be loaded when needed.
-        deps += [
-          "//chrome/android/features/dev_ui:java",  # (1) from above.
-          "//chrome/android/features/dev_ui:pak_assets",  # (2) from above.
-        ]
-      }
-      srcjar_deps = [ "//components/module_installer/android:module_installer_apk_build_config" ]
+    if (dfmify_dev_ui && (_target_type == "android_apk" ||
+                          _target_type == "instrumentation_test_apk")) {
+      # Native resource split moves resources out of resources.pak, but this
+      # is a DFM feature, which APKs don't use. To make the resources split
+      # available for APKs, add dependencies to (1) Java classes, (2)
+      # resources of the resource split's DFM (e.g., DevUI DFM). The Java
+      # classes tells Chrome that the DFM is installed, which then causes the
+      # included resources to be loaded when needed.
+      deps += [
+        "//chrome/android/features/dev_ui:java",  # (1) from above.
+        "//chrome/android/features/dev_ui:pak_assets",  # (2) from above.
+      ]
     }
 
     if (!is_java_debug) {
diff --git a/chrome/android/features/autofill_assistant/BUILD.gn b/chrome/android/features/autofill_assistant/BUILD.gn
index 49c8c00..8e62f8e 100644
--- a/chrome/android/features/autofill_assistant/BUILD.gn
+++ b/chrome/android/features/autofill_assistant/BUILD.gn
@@ -164,6 +164,7 @@
 }
 
 generate_jni("test_support_jni_headers") {
+  testonly = true
   sources = [
     "javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantTestService.java",
   ]
diff --git a/chrome/android/features/keyboard_accessory/BUILD.gn b/chrome/android/features/keyboard_accessory/BUILD.gn
index bad4404..8170c50 100644
--- a/chrome/android/features/keyboard_accessory/BUILD.gn
+++ b/chrome/android/features/keyboard_accessory/BUILD.gn
@@ -102,7 +102,4 @@
     "//third_party/junit",
     "//third_party/mockito:mockito_java",
   ]
-
-  srcjar_deps =
-      [ "//components/module_installer/android:module_installer_build_config" ]
 }
diff --git a/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceMediator.java b/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceMediator.java
index 74db206..1eb2e558 100644
--- a/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceMediator.java
+++ b/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceMediator.java
@@ -5,6 +5,7 @@
 package org.chromium.chrome.features.start_surface;
 
 import static org.chromium.chrome.browser.tasks.TasksSurfaceProperties.IS_FAKE_SEARCH_BOX_VISIBLE;
+import static org.chromium.chrome.browser.tasks.TasksSurfaceProperties.IS_INCOGNITO;
 import static org.chromium.chrome.browser.tasks.TasksSurfaceProperties.MORE_TABS_CLICK_LISTENER;
 import static org.chromium.chrome.browser.tasks.TasksSurfaceProperties.MV_TILES_VISIBLE;
 import static org.chromium.chrome.features.start_surface.StartSurfaceProperties.BOTTOM_BAR_CLICKLISTENER;
@@ -123,6 +124,7 @@
                     updateIncognitoMode(newModel.isIncognito());
                 }
             });
+            mPropertyModel.set(IS_INCOGNITO, mIsIncognito);
 
             mPropertyModel.set(
                     BOTTOM_BAR_CLICKLISTENER, new StartSurfaceProperties.BottomBarClickListener() {
@@ -193,6 +195,7 @@
 
     void setSecondaryTasksSurfacePropertyModel(PropertyModel propertyModel) {
         mSecondaryTasksSurfacePropertyModel = propertyModel;
+        mSecondaryTasksSurfacePropertyModel.set(IS_INCOGNITO, mIsIncognito);
 
         // Secondary tasks surface is used for more Tabs or incognito mode single pane, where MV
         // tiles should be invisible.
@@ -395,6 +398,11 @@
             if (mIsIncognito) setExploreSurfaceVisibility(false);
         }
 
+        mPropertyModel.set(IS_INCOGNITO, mIsIncognito);
+        if (mSecondaryTasksSurfacePropertyModel != null) {
+            mSecondaryTasksSurfacePropertyModel.set(IS_INCOGNITO, mIsIncognito);
+        }
+
         notifyStateChange();
     }
 
diff --git a/chrome/android/features/tab_ui/java/res/drawable-v21/fake_search_box_bg_incognito.xml b/chrome/android/features/tab_ui/java/res/drawable-v21/fake_search_box_bg_incognito.xml
new file mode 100644
index 0000000..895fb81
--- /dev/null
+++ b/chrome/android/features/tab_ui/java/res/drawable-v21/fake_search_box_bg_incognito.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright 2019 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.
+-->
+<ripple xmlns:android="http://schemas.android.com/apk/res/android"
+    android:color="@color/toolbar_text_box_background_incognito" >
+
+    <item
+        android:drawable="@drawable/fake_search_box_text_box_bg_incognito"/>
+
+</ripple>
diff --git a/chrome/android/features/tab_ui/java/res/drawable/fake_search_box_text_box_bg_incognito.xml b/chrome/android/features/tab_ui/java/res/drawable/fake_search_box_text_box_bg_incognito.xml
new file mode 100644
index 0000000..737f4ee
--- /dev/null
+++ b/chrome/android/features/tab_ui/java/res/drawable/fake_search_box_text_box_bg_incognito.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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. -->
+
+<shape
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle" >
+    <solid android:color="@color/toolbar_text_box_background_incognito" />
+    <size
+        android:width="@dimen/modern_toolbar_background_size"
+        android:height="@dimen/modern_toolbar_background_size" />
+    <corners android:radius="@dimen/modern_toolbar_background_corner_radius" />
+</shape>
diff --git a/chrome/android/features/tab_ui/java/res/values/drawables.xml b/chrome/android/features/tab_ui/java/res/values/drawables.xml
new file mode 100644
index 0000000..5edf473
--- /dev/null
+++ b/chrome/android/features/tab_ui/java/res/values/drawables.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright 2019 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. -->
+
+<resources>
+    <drawable name="fake_search_box_bg_incognito">@drawable/fake_search_box_text_box_bg_incognito</drawable>
+</resources>
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/TasksSurfaceMediator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/TasksSurfaceMediator.java
index e0c2a9f..d52ebc6d4 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/TasksSurfaceMediator.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/TasksSurfaceMediator.java
@@ -43,6 +43,6 @@
 
         // TODO(crbug.com/982018): Enable voice recognition button in the fake search box.
         // TODO(crbug.com/982018): Enable long press and paste search in the fake search box.
-        // TODO(crbug.com/982018): Change the fake search box in incognito and dark mode.
+        // TODO(crbug.com/982018): Change the fake search box in dark mode.
     }
 }
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/TasksSurfaceProperties.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/TasksSurfaceProperties.java
index 826ff36..6cc4c9e 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/TasksSurfaceProperties.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/TasksSurfaceProperties.java
@@ -17,6 +17,8 @@
 
     public static final PropertyModel.WritableBooleanPropertyKey IS_FAKE_SEARCH_BOX_VISIBLE =
             new PropertyModel.WritableBooleanPropertyKey();
+    public static final PropertyModel.WritableBooleanPropertyKey IS_INCOGNITO =
+            new PropertyModel.WritableBooleanPropertyKey();
     public static final PropertyModel.WritableBooleanPropertyKey IS_TAB_CAROUSEL =
             new PropertyModel.WritableBooleanPropertyKey();
     public static final PropertyModel
@@ -30,6 +32,6 @@
             new PropertyModel.WritableObjectPropertyKey<View.OnClickListener>();
     public static final PropertyModel.WritableBooleanPropertyKey MV_TILES_VISIBLE = IS_VISIBLE;
     public static final PropertyKey[] ALL_KEYS = new PropertyKey[] {IS_FAKE_SEARCH_BOX_VISIBLE,
-            IS_TAB_CAROUSEL, IS_VOICE_RECOGNITION_BUTTON_VISIBLE, FAKE_SEARCH_BOX_CLICK_LISTENER,
-            MORE_TABS_CLICK_LISTENER, MV_TILES_VISIBLE};
+            IS_INCOGNITO, IS_TAB_CAROUSEL, IS_VOICE_RECOGNITION_BUTTON_VISIBLE,
+            FAKE_SEARCH_BOX_CLICK_LISTENER, MORE_TABS_CLICK_LISTENER, MV_TILES_VISIBLE};
 }
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/TasksView.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/TasksView.java
index f1809a9..24a083d 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/TasksView.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/TasksView.java
@@ -5,21 +5,27 @@
 package org.chromium.chrome.browser.tasks;
 
 import android.content.Context;
+import android.content.res.Resources;
 import android.support.v4.view.MarginLayoutParamsCompat;
 import android.util.AttributeSet;
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.FrameLayout;
 import android.widget.LinearLayout;
+import android.widget.TextView;
 
 import androidx.annotation.Nullable;
 
+import org.chromium.base.ApiCompatibilityUtils;
+import org.chromium.chrome.browser.util.ColorUtils;
 import org.chromium.chrome.tab_ui.R;
 
 // The view of the tasks surface.
 class TasksView extends LinearLayout {
     private final Context mContext;
     private FrameLayout mTabSwitcherContainer;
+    private View mSearchBox;
+    private TextView mSearchBoxText;
 
     /** Default constructor needed to inflate via XML. */
     public TasksView(Context context, AttributeSet attrs) {
@@ -32,6 +38,8 @@
         super.onFinishInflate();
 
         mTabSwitcherContainer = (FrameLayout) findViewById(R.id.tab_switcher_container);
+        mSearchBox = findViewById(R.id.search_box);
+        mSearchBoxText = (TextView) mSearchBox.findViewById(R.id.search_box_text);
     }
 
     ViewGroup getTabSwitcherContainer() {
@@ -64,7 +72,7 @@
      * @param listener The given listener.
      */
     void setFakeSearchBoxClickListener(@Nullable View.OnClickListener listener) {
-        findViewById(R.id.search_box_text).setOnClickListener(listener);
+        mSearchBoxText.setOnClickListener(listener);
     }
 
     /**
@@ -72,7 +80,7 @@
      * @param isVisible Whether it's visible.
      */
     void setFakeSearchBoxVisibility(boolean isVisible) {
-        findViewById(R.id.search_box).setVisibility(isVisible ? View.VISIBLE : View.GONE);
+        mSearchBox.setVisibility(isVisible ? View.VISIBLE : View.GONE);
     }
 
     /**
@@ -96,4 +104,19 @@
     void setMoreTabsOnClickListener(@Nullable View.OnClickListener listener) {
         findViewById(R.id.more_tabs).setOnClickListener(listener);
     }
-}
\ No newline at end of file
+
+    /**
+     * Set the incognito state.
+     * @param isIncognito Whether it's in incognito mode.
+     */
+    void setIncognitoMode(boolean isIncognito) {
+        Resources resources = mContext.getResources();
+        setBackgroundColor(ColorUtils.getPrimaryBackgroundColor(resources, isIncognito));
+        mSearchBox.setBackgroundResource(
+                isIncognito ? R.drawable.fake_search_box_bg_incognito : R.drawable.ntp_search_box);
+        int hintTextColor = isIncognito
+                ? ApiCompatibilityUtils.getColor(resources, R.color.locationbar_light_hint_text)
+                : ApiCompatibilityUtils.getColor(resources, R.color.locationbar_dark_hint_text);
+        mSearchBoxText.setHintTextColor(hintTextColor);
+    }
+}
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/TasksViewBinder.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/TasksViewBinder.java
index fb2b2d5e..8c2becd 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/TasksViewBinder.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/TasksViewBinder.java
@@ -6,6 +6,7 @@
 
 import static org.chromium.chrome.browser.tasks.TasksSurfaceProperties.FAKE_SEARCH_BOX_CLICK_LISTENER;
 import static org.chromium.chrome.browser.tasks.TasksSurfaceProperties.IS_FAKE_SEARCH_BOX_VISIBLE;
+import static org.chromium.chrome.browser.tasks.TasksSurfaceProperties.IS_INCOGNITO;
 import static org.chromium.chrome.browser.tasks.TasksSurfaceProperties.IS_TAB_CAROUSEL;
 import static org.chromium.chrome.browser.tasks.TasksSurfaceProperties.IS_VOICE_RECOGNITION_BUTTON_VISIBLE;
 import static org.chromium.chrome.browser.tasks.TasksSurfaceProperties.MORE_TABS_CLICK_LISTENER;
@@ -23,6 +24,8 @@
             view.setFakeSearchBoxClickListener(model.get(FAKE_SEARCH_BOX_CLICK_LISTENER));
         } else if (propertyKey == IS_FAKE_SEARCH_BOX_VISIBLE) {
             view.setFakeSearchBoxVisibility(model.get(IS_FAKE_SEARCH_BOX_VISIBLE));
+        } else if (propertyKey == IS_INCOGNITO) {
+            view.setIncognitoMode(model.get(IS_INCOGNITO));
         } else if (propertyKey == IS_TAB_CAROUSEL) {
             view.setIsTabCarousel(model.get(IS_TAB_CAROUSEL));
         } else if (propertyKey == IS_VOICE_RECOGNITION_BUTTON_VISIBLE) {
diff --git a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedConfiguration.java b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedConfiguration.java
index f78447f..058b01e 100644
--- a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedConfiguration.java
+++ b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedConfiguration.java
@@ -37,6 +37,10 @@
     /** Default value for whether to consumer synthetic tokens on restore. */
     public static final boolean CONSUME_SYNTHETIC_TOKENS_WHILE_RESTORING_DEFAULT = false;
 
+    private static final String DEFAULT_ACTION_TTL_SECONDS = "default_action_ttl_seconds";
+    /** Default value for the TTL of default action (3 days). */
+    public static final long DEFAULT_ACTION_TTL_SECONDS_DEFAULT = 259200;
+
     private static final String FEED_ACTION_SERVER_ENDPOINT = "feed_action_server_endpoint";
     /** Default value for the endpoint used for recording uploaded actions to the server. */
     public static final String FEED_ACTION_SERVER_ENDPOINT_DEFAULT =
@@ -185,6 +189,14 @@
                 CONSUME_SYNTHETIC_TOKENS_WHILE_RESTORING_DEFAULT);
     }
 
+    /** @return The TTL (in seconds) for the default action. */
+    @VisibleForTesting
+    static long getDefaultActionTtlSeconds() {
+        return ChromeFeatureList.getFieldTrialParamByFeatureAsInt(
+                ChromeFeatureList.INTEREST_FEED_CONTENT_SUGGESTIONS, DEFAULT_ACTION_TTL_SECONDS,
+                (int) DEFAULT_ACTION_TTL_SECONDS_DEFAULT);
+    }
+
     /** @return The endpoint used for recording uploaded actions to the server. */
     @VisibleForTesting
     static String getFeedActionServerEndpoint() {
@@ -418,6 +430,8 @@
                         FeedConfiguration.getConsumeSyntheticTokens())
                 .put(ConfigKey.CONSUME_SYNTHETIC_TOKENS_WHILE_RESTORING,
                         FeedConfiguration.getConsumeSyntheticTokensWhileRestoring())
+                .put(ConfigKey.DEFAULT_ACTION_TTL_SECONDS,
+                        FeedConfiguration.getDefaultActionTtlSeconds())
                 .put(ConfigKey.FEED_ACTION_SERVER_ENDPOINT,
                         FeedConfiguration.getFeedActionServerEndpoint())
                 .put(ConfigKey.FEED_ACTION_SERVER_MAX_ACTIONS_PER_REQUEST,
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java
index daca55a..d81b4075 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java
@@ -2016,6 +2016,10 @@
 
         TextBubble.dismissBubbles();
         if (VrModuleProvider.getDelegate().onBackPressed()) return;
+
+        ArDelegate arDelegate = ArDelegateProvider.getDelegate();
+        if (arDelegate != null && arDelegate.onBackPressed()) return;
+
         if (mCompositorViewHolder != null) {
             LayoutManager layoutManager = mCompositorViewHolder.getLayoutManager();
             if (layoutManager != null && layoutManager.onBackPressed()) return;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/banners/AppBannerUiDelegateAndroid.java b/chrome/android/java/src/org/chromium/chrome/browser/banners/AppBannerUiDelegateAndroid.java
index 1c27991..ba4518c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/banners/AppBannerUiDelegateAndroid.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/banners/AppBannerUiDelegateAndroid.java
@@ -16,6 +16,7 @@
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.annotations.JNINamespace;
 import org.chromium.base.annotations.NativeMethods;
+import org.chromium.chrome.browser.ShortcutHelper;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.webapps.addtohomescreen.AddToHomescreenDialogView;
 import org.chromium.chrome.browser.webapps.addtohomescreen.AddToHomescreenProperties;
@@ -137,13 +138,22 @@
     }
 
     @CalledByNative
-    private boolean showWebAppDialog(String title, Bitmap iconBitmap, String url) {
+    private boolean showWebAppDialog(
+            String title, Bitmap iconBitmap, String url, boolean maskable) {
         mViewModel = createViewModel();
         mViewModel.set(AddToHomescreenProperties.TITLE, title);
-        mViewModel.set(AddToHomescreenProperties.ICON, new Pair<>(iconBitmap, false));
         mViewModel.set(AddToHomescreenProperties.TYPE, AddToHomescreenProperties.AppType.WEB_APK);
         mViewModel.set(AddToHomescreenProperties.CAN_SUBMIT, true);
         mViewModel.set(AddToHomescreenProperties.URL, url);
+
+        // Because web standards specify the circular mask's radius to be 40% of icon dimension,
+        // while Android specifies it to be around 30%, we can't simply let Android mask it. We'll
+        // need to mask the bitmap ourselves and pass it as a non-maskable icon.
+        boolean shouldMaskIcon = maskable && ShortcutHelper.doesAndroidSupportMaskableIcons();
+        if (shouldMaskIcon) {
+            iconBitmap = ShortcutHelper.createHomeScreenIconFromWebIcon(iconBitmap, shouldMaskIcon);
+        }
+        mViewModel.set(AddToHomescreenProperties.ICON, new Pair<>(iconBitmap, shouldMaskIcon));
         return true;
     }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorView.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorView.java
index 481391a..3fe71bf 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorView.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorView.java
@@ -344,6 +344,16 @@
         // We do know that if we do get one, then it will be for the surface that we just requested.
     }
 
+    /**
+     * Enables/disables immersive AR overlay mode, a variant of overlay video mode.
+     * @param enabled Whether to enter or leave overlay immersive ar mode.
+     */
+    public void setOverlayImmersiveArMode(boolean enabled) {
+        setOverlayVideoMode(enabled);
+        CompositorViewJni.get().setOverlayImmersiveArMode(
+                mNativeCompositorView, CompositorView.this, enabled);
+    }
+
     private int getSurfacePixelFormat() {
         if (mOverlayVideoEnabled || mAlwaysTranslucent) {
             return PixelFormat.TRANSLUCENT;
@@ -620,6 +630,8 @@
         void setNeedsComposite(long nativeCompositorView, CompositorView caller);
         void setLayoutBounds(long nativeCompositorView, CompositorView caller);
         void setOverlayVideoMode(long nativeCompositorView, CompositorView caller, boolean enabled);
+        void setOverlayImmersiveArMode(
+                long nativeCompositorView, CompositorView caller, boolean enabled);
         void setSceneLayer(long nativeCompositorView, CompositorView caller, SceneLayer sceneLayer);
         void setCompositorWindow(
                 long nativeCompositorView, CompositorView caller, WindowAndroid window);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadActivity.java
index 1b1cced..b725dec 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadActivity.java
@@ -13,6 +13,7 @@
 import org.chromium.chrome.browser.download.home.DownloadManagerCoordinator;
 import org.chromium.chrome.browser.download.home.DownloadManagerCoordinatorFactory;
 import org.chromium.chrome.browser.download.home.DownloadManagerUiConfig;
+import org.chromium.chrome.browser.download.home.filter.Filters;
 import org.chromium.chrome.browser.download.items.OfflineContentAggregatorNotificationBridgeUiFactory;
 import org.chromium.chrome.browser.modaldialog.AppModalPresenter;
 import org.chromium.chrome.browser.util.IntentUtils;
@@ -74,8 +75,8 @@
         mCurrentUrl = savedInstanceState == null
                 ? UrlConstants.DOWNLOADS_URL
                 : savedInstanceState.getString(BUNDLE_KEY_CURRENT_URL);
+        if (showPrefetchContent) mCurrentUrl = Filters.toUrl(Filters.FilterType.PREFETCHED);
         mDownloadCoordinator.updateForUrl(mCurrentUrl);
-        if (showPrefetchContent) mDownloadCoordinator.showPrefetchSection();
     }
 
     @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/home/DownloadManagerCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/download/home/DownloadManagerCoordinator.java
index c2b57d5..3f3f6ad 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/home/DownloadManagerCoordinator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/home/DownloadManagerCoordinator.java
@@ -37,12 +37,6 @@
     /** To be called to push the url containing internal state to the coordinator. */
     void updateForUrl(String url);
 
-    /**
-     * To be called to automatically show the prefetched content section of the download manager.
-     * TODO(dtrainor): This should be deprecated in place of {@link #updateForUrl(String)}.
-     */
-    void showPrefetchSection();
-
     /** Adds {@code observer} to be notified of url state changes. */
     void addObserver(Observer observer);
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/home/DownloadManagerCoordinatorImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/download/home/DownloadManagerCoordinatorImpl.java
index 9a0ca517..e4d3e896 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/home/DownloadManagerCoordinatorImpl.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/home/DownloadManagerCoordinatorImpl.java
@@ -141,11 +141,6 @@
     }
 
     @Override
-    public void showPrefetchSection() {
-        updateForUrl(Filters.toUrl(Filters.FilterType.PREFETCHED));
-    }
-
-    @Override
     public void addObserver(Observer observer) {
         mObservers.addObserver(observer);
     }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/infobar/InstallableAmbientBadgeInfoBar.java b/chrome/android/java/src/org/chromium/chrome/browser/infobar/InstallableAmbientBadgeInfoBar.java
index 43f833a..47f02f6 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/infobar/InstallableAmbientBadgeInfoBar.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/infobar/InstallableAmbientBadgeInfoBar.java
@@ -6,18 +6,25 @@
 
 import static android.view.View.IMPORTANT_FOR_ACCESSIBILITY_NO;
 
+import android.annotation.TargetApi;
 import android.content.res.Resources;
 import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.drawable.AdaptiveIconDrawable;
+import android.graphics.drawable.Icon;
+import android.os.Build;
 import android.view.Gravity;
 import android.view.View;
 import android.widget.ImageView;
 import android.widget.TextView;
 
 import org.chromium.base.ApiCompatibilityUtils;
+import org.chromium.base.ContextUtils;
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.annotations.NativeMethods;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ResourceId;
+import org.chromium.chrome.browser.ShortcutHelper;
 import org.chromium.chrome.browser.ui.widget.text.AccessibleTextView;
 
 /**
@@ -29,10 +36,33 @@
     private boolean mIsHiding;
 
     @CalledByNative
-    private static InfoBar show(
-            int enumeratedIconId, Bitmap iconBitmap, String messageText, String url) {
+    private static InfoBar show(int enumeratedIconId, Bitmap iconBitmap, String messageText,
+            String url, boolean isIconAdaptive) {
         int drawableId = ResourceId.mapToDrawableId(enumeratedIconId);
-        return new InstallableAmbientBadgeInfoBar(drawableId, iconBitmap, messageText, url);
+
+        Bitmap iconBitmapToUse = iconBitmap;
+        if (isIconAdaptive && ShortcutHelper.doesAndroidSupportMaskableIcons()) {
+            iconBitmapToUse = fetchAdaptiveIconBitmap(iconBitmap);
+        }
+
+        return new InstallableAmbientBadgeInfoBar(drawableId, iconBitmapToUse, messageText, url);
+    }
+
+    @TargetApi(Build.VERSION_CODES.O)
+    private static Bitmap fetchAdaptiveIconBitmap(Bitmap bitmap) {
+        Bitmap padded = ShortcutHelper.createHomeScreenIconFromWebIcon(bitmap, true);
+        Icon adaptiveIcon = Icon.createWithAdaptiveBitmap(padded);
+        AdaptiveIconDrawable adaptiveIconDrawable =
+                (AdaptiveIconDrawable) adaptiveIcon.loadDrawable(
+                        ContextUtils.getApplicationContext());
+
+        Bitmap result = Bitmap.createBitmap(adaptiveIconDrawable.getIntrinsicWidth(),
+                adaptiveIconDrawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
+        Canvas canvas = new Canvas(result);
+        adaptiveIconDrawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
+        adaptiveIconDrawable.draw(canvas);
+
+        return result;
     }
 
     @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java
index 8b49fee..e7f9b5d 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java
@@ -1116,7 +1116,7 @@
 
     private void forceOnTextChanged() {
         String textWithoutAutocomplete = mUrlCoordinator.getTextWithoutAutocomplete();
-        String textWithAutocomplete = mUrlCoordinator.getTextWithoutAutocomplete();
+        String textWithAutocomplete = mUrlCoordinator.getTextWithAutocomplete();
         mAutocompleteCoordinator.onTextChanged(textWithoutAutocomplete, textWithAutocomplete);
         mStatusViewCoordinator.onTextChanged(textWithoutAutocomplete, textWithAutocomplete);
     }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/vr/ArCoreJavaUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/vr/ArCoreJavaUtils.java
index 512cc6f..90b0c25 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/vr/ArCoreJavaUtils.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/vr/ArCoreJavaUtils.java
@@ -20,6 +20,9 @@
 
 /**
  * Provides ARCore classes access to java-related app functionality.
+ *
+ * <p>This class provides static methods called by ArDelegateImpl via ArDelegateProvider,
+ * and provides JNI interfaces to/from the C++ AR code.</p>
  */
 @JNINamespace("vr")
 public class ArCoreJavaUtils {
@@ -28,8 +31,19 @@
 
     private long mNativeArCoreJavaUtils;
 
+    // The native ArCoreDevice runtime creates a ArCoreJavaUtils instance in its constructor,
+    // and keeps a strong reference to it for the lifetime of the device. It creates and
+    // owns an ArImmersiveOverlay for the duration of an immersive-ar session, which in
+    // turn contains a reference to ArCoreJavaUtils for making JNI calls back to the device.
     private ArImmersiveOverlay mArImmersiveOverlay;
 
+    // ArDelegateImpl needs to know if there's an active immersive session so that it can handle
+    // back button presses from ChromeActivity's onBackPressed(). It's only set while a session is
+    // in progress, and reset to null on session end. The ArImmersiveOverlay member has a strong
+    // reference to the ChromeActivity, and that shouldn't be retained beyond the duration of a
+    // session.
+    private static ArCoreJavaUtils sActiveSessionInstance;
+
     @CalledByNative
     private static ArCoreJavaUtils create(long nativeArCoreJavaUtils) {
         ThreadUtils.assertOnUiThread();
@@ -60,18 +74,33 @@
     }
 
     @CalledByNative
-    private void startSession(final Tab tab) {
+    private void startSession(final Tab tab, boolean useOverlay) {
         if (DEBUG_LOGS) Log.i(TAG, "startSession");
         mArImmersiveOverlay = new ArImmersiveOverlay();
-        mArImmersiveOverlay.show(tab.getActivity(), this);
+        sActiveSessionInstance = this;
+        mArImmersiveOverlay.show(tab.getActivity(), this, useOverlay);
     }
 
     @CalledByNative
     private void endSession() {
         if (DEBUG_LOGS) Log.i(TAG, "endSession");
-        if (mArImmersiveOverlay != null) {
-            mArImmersiveOverlay.cleanupAndExit();
+        if (mArImmersiveOverlay == null) return;
+
+        mArImmersiveOverlay.cleanupAndExit();
+        mArImmersiveOverlay = null;
+        sActiveSessionInstance = null;
+    }
+
+    // Called from ArDelegateImpl
+    public static boolean onBackPressed() {
+        if (DEBUG_LOGS) Log.i(TAG, "onBackPressed");
+        // If there's an active immersive session, consume the "back" press and shut down the
+        // session.
+        if (sActiveSessionInstance != null) {
+            sActiveSessionInstance.endSession();
+            return true;
         }
+        return false;
     }
 
     public void onDrawingSurfaceReady(Surface surface, int rotation, int width, int height) {
@@ -91,13 +120,16 @@
     public void onDrawingSurfaceDestroyed() {
         if (DEBUG_LOGS) Log.i(TAG, "onDrawingSurfaceDestroyed");
         if (mNativeArCoreJavaUtils == 0) return;
-        mArImmersiveOverlay = null;
         ArCoreJavaUtilsJni.get().onDrawingSurfaceDestroyed(
                 mNativeArCoreJavaUtils, ArCoreJavaUtils.this);
     }
 
     @CalledByNative
     private void onNativeDestroy() {
+        // ArCoreDevice's destructor ends sessions before destroying its native ArCoreSessionUtils
+        // object.
+        assert sActiveSessionInstance == null : "unexpected active session in onNativeDestroy";
+
         mNativeArCoreJavaUtils = 0;
     }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/vr/ArDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/vr/ArDelegate.java
index 6e7015e..2b30786 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/vr/ArDelegate.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/vr/ArDelegate.java
@@ -21,4 +21,9 @@
      * to notify AR that the activity was resumed.
      **/
     public void registerOnResumeActivity(Activity activity);
+
+    /**
+     * Used to let AR immersive mode intercept the Back button to exit immersive mode.
+     */
+    public boolean onBackPressed();
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/vr/ArDelegateImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/vr/ArDelegateImpl.java
index 500cb1c..b3bc916 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/vr/ArDelegateImpl.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/vr/ArDelegateImpl.java
@@ -26,4 +26,9 @@
     public void registerOnResumeActivity(Activity activity) {
         ArCoreInstallUtils.onResumeActivityWithNative(activity);
     }
+
+    @Override
+    public boolean onBackPressed() {
+        return ArCoreJavaUtils.onBackPressed();
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/vr/ArImmersiveOverlay.java b/chrome/android/java/src/org/chromium/chrome/browser/vr/ArImmersiveOverlay.java
index 0b8f550..c3eda20 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/vr/ArImmersiveOverlay.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/vr/ArImmersiveOverlay.java
@@ -8,9 +8,13 @@
 import android.app.Dialog;
 import android.content.DialogInterface;
 import android.content.pm.ActivityInfo;
+import android.graphics.PixelFormat;
+import android.graphics.Point;
+import android.view.Display;
 import android.view.Gravity;
 import android.view.MotionEvent;
 import android.view.SurfaceHolder;
+import android.view.SurfaceView;
 import android.view.View;
 import android.view.ViewGroup;
 
@@ -19,6 +23,9 @@
 import org.chromium.base.Log;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeActivity;
+import org.chromium.chrome.browser.compositor.CompositorView;
+import org.chromium.chrome.browser.tab.EmptyTabObserver;
+import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.content_public.browser.ScreenOrientationDelegate;
 import org.chromium.content_public.browser.ScreenOrientationProvider;
 import org.chromium.ui.widget.Toast;
@@ -38,14 +45,19 @@
     private boolean mCleanupInProgress;
     private SurfaceUiWrapper mSurfaceUi;
 
-    public void show(@NonNull ChromeActivity activity, @NonNull ArCoreJavaUtils caller) {
+    public void show(
+            @NonNull ChromeActivity activity, @NonNull ArCoreJavaUtils caller, boolean useOverlay) {
         if (DEBUG_LOGS) Log.i(TAG, "constructor");
         mArCoreJavaUtils = caller;
         mActivity = activity;
 
         // Choose a concrete implementation to create a drawable Surface and make it fullscreen.
         // It forwards SurfaceHolder callbacks and touch events to this ArImmersiveOverlay object.
-        mSurfaceUi = new SurfaceUiDialog(this);
+        if (useOverlay) {
+            mSurfaceUi = new SurfaceUiCompositor();
+        } else {
+            mSurfaceUi = new SurfaceUiDialog();
+        }
     }
 
     private interface SurfaceUiWrapper {
@@ -64,14 +76,14 @@
                 | View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                 | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
 
-        public SurfaceUiDialog(ArImmersiveOverlay parent) {
+        public SurfaceUiDialog() {
             // Create a fullscreen dialog and use its backing Surface for drawing.
             mDialog = new Dialog(mActivity, android.R.style.Theme_NoTitleBar_Fullscreen);
             mDialog.getWindow().setBackgroundDrawable(null);
-            mDialog.getWindow().takeSurface(parent);
+            mDialog.getWindow().takeSurface(ArImmersiveOverlay.this);
             View view = mDialog.getWindow().getDecorView();
             view.setSystemUiVisibility(VISIBILITY_FLAGS_IMMERSIVE);
-            view.setOnTouchListener(parent);
+            view.setOnTouchListener(ArImmersiveOverlay.this);
             mDialog.setOnCancelListener(this);
             mDialog.getWindow().setLayout(
                     ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
@@ -103,6 +115,52 @@
         }
     }
 
+    private class SurfaceUiCompositor extends EmptyTabObserver implements SurfaceUiWrapper {
+        private SurfaceView mSurfaceView;
+        private CompositorView mCompositorView;
+
+        public SurfaceUiCompositor() {
+            mSurfaceView = new SurfaceView(mActivity);
+            // Keep the camera layer at "default" Z order. Chrome's compositor SurfaceView is in
+            // OverlayVideoMode, putting it in front of that, but behind other non-SurfaceView UI.
+            mSurfaceView.getHolder().setFormat(PixelFormat.TRANSLUCENT);
+            mSurfaceView.getHolder().addCallback(ArImmersiveOverlay.this);
+
+            View content = mActivity.getWindow().findViewById(android.R.id.content);
+            ViewGroup group = (ViewGroup) content.getParent();
+            group.addView(mSurfaceView);
+
+            mCompositorView = mActivity.getCompositorViewHolder().getCompositorView();
+
+            // Enable alpha channel for the compositor and make the background
+            // transparent. (A variant of CompositorView::SetOverlayVideoMode.)
+            if (DEBUG_LOGS) Log.i(TAG, "calling mCompositorView.setOverlayImmersiveArMode(true)");
+            mCompositorView.setOverlayImmersiveArMode(true);
+
+            // Watch for fullscreen exit triggered from JS, this needs to end the session.
+            mActivity.getActivityTab().addObserver(this);
+        }
+
+        @Override // SurfaceUiWrapper
+        public void onSurfaceVisible() {}
+
+        @Override // SurfaceUiWrapper
+        public void destroy() {
+            mActivity.getActivityTab().removeObserver(this);
+            View content = mActivity.getWindow().findViewById(android.R.id.content);
+            ViewGroup group = (ViewGroup) content.getParent();
+            group.removeView(mSurfaceView);
+            mSurfaceView = null;
+            mCompositorView.setOverlayImmersiveArMode(false);
+        }
+
+        @Override // TabObserver
+        public void onExitFullscreenMode(Tab tab) {
+            if (DEBUG_LOGS) Log.i(TAG, "onExitFullscreenMode");
+            cleanupAndExit();
+        }
+    }
+
     @Override // View.OnTouchListener
     public boolean onTouch(View v, MotionEvent ev) {
         // Only forward primary actions, ignore more complex events such as secondary pointer
@@ -143,32 +201,70 @@
 
     @Override // SurfaceHolder.Callback2
     public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
-        // WebXR immersive sessions don't support resize, so use the first reported size.
-        // We shouldn't get resize events since we're using FLAG_LAYOUT_STABLE and are
-        // locking screen orientation.
+        // The surface may not immediately start out at the expected fullscreen size due to
+        // animations or not-yet-hidden navigation bars. WebXR immersive sessions use a fixed-size
+        // frame transport that can't be resized, so we need to pick a single size and stick with it
+        // for the duration of the session. Use the expected fullscreen size for WebXR frame
+        // transport even if the currently-visible part in the surface view is smaller than this. We
+        // shouldn't get resize events since we're using FLAG_LAYOUT_STABLE and are locking screen
+        // orientation.
         if (mSurfaceReportedReady) {
             int rotation = mActivity.getWindowManager().getDefaultDisplay().getRotation();
-            if (DEBUG_LOGS)
+            if (DEBUG_LOGS) {
                 Log.i(TAG,
                         "surfaceChanged ignoring change to width=" + width + " height=" + height
                                 + " rotation=" + rotation);
+            }
             return;
         }
 
-        // Save current orientation mode, and then lock current orientation.
+        // Need to ensure orientation is locked at this point to avoid race conditions. Save current
+        // orientation mode, and then lock current orientation. It's unclear if there's still a risk
+        // of races, for example if an orientation change was already in progress at this point but
+        // wasn't fully processed yet. In that case the user may need to exit and re-enter the
+        // session to get the intended layout.
         ScreenOrientationProvider.getInstance().setOrientationDelegate(this);
         if (mRestoreOrientation == null) {
             mRestoreOrientation = mActivity.getRequestedOrientation();
         }
         mActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED);
 
+        // Display.getRealSize "gets the real size of the display without subtracting any window
+        // decor or applying any compatibility scale factors", and "the size is adjusted based on
+        // the current rotation of the display". This is what we want since the surface and WebXR
+        // frame sizes also use the same current rotation which is now locked, so there's no need to
+        // separately adjust for portrait vs landscape modes.
+        //
+        // While it would be preferable to wait until the surface is at the desired fullscreen
+        // resolution, i.e. via mActivity.getFullscreenManager().getPersistentFullscreenMode(), that
+        // causes a chicken-and-egg problem for SurfaceUiCompositor mode as used for DOM overlay.
+        // Chrome's fullscreen mode is triggered by the Blink side setting an element fullscreen
+        // after the session starts, but the session doesn't start until we report the drawing
+        // surface being ready (including a configured size), so we use this reported size assuming
+        // that's what the fullscreen mode will use.
+        Display display = mActivity.getWindowManager().getDefaultDisplay();
+        Point size = new Point();
+        display.getRealSize(size);
+
+        if (width < size.x || height < size.y) {
+            if (DEBUG_LOGS) {
+                Log.i(TAG,
+                        "surfaceChanged adjusting size from " + width + "x" + height + " to "
+                                + size.x + "x" + size.y);
+            }
+            width = size.x;
+            height = size.y;
+        }
+
         int rotation = mActivity.getWindowManager().getDefaultDisplay().getRotation();
-        if (DEBUG_LOGS)
+        if (DEBUG_LOGS) {
             Log.i(TAG, "surfaceChanged size=" + width + "x" + height + " rotation=" + rotation);
+        }
         mArCoreJavaUtils.onDrawingSurfaceReady(holder.getSurface(), rotation, width, height);
         mSurfaceReportedReady = true;
 
-        // Show a toast with instructions how to exit fullscreen mode now if necessary.
+        // Show the toast with instructions how to exit fullscreen mode now if necessary.
+        // Not needed in DOM overlay mode which uses FullscreenHtmlApiHandler to do so.
         mSurfaceUi.onSurfaceVisible();
     }
 
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/feed/FeedConfigurationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/feed/FeedConfigurationTest.java
index 2f504c1..dddde2a5 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/feed/FeedConfigurationTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/feed/FeedConfigurationTest.java
@@ -42,6 +42,8 @@
                 FeedConfiguration.getConsumeSyntheticTokens());
         Assert.assertEquals(FeedConfiguration.CONSUME_SYNTHETIC_TOKENS_WHILE_RESTORING_DEFAULT,
                 FeedConfiguration.getConsumeSyntheticTokensWhileRestoring());
+        Assert.assertEquals(FeedConfiguration.DEFAULT_ACTION_TTL_SECONDS_DEFAULT,
+                FeedConfiguration.getDefaultActionTtlSeconds());
         Assert.assertEquals(FeedConfiguration.FEED_ACTION_SERVER_ENDPOINT_DEFAULT,
                 FeedConfiguration.getFeedActionServerEndpoint());
         Assert.assertEquals(FeedConfiguration.FEED_ACTION_SERVER_MAX_ACTIONS_PER_REQUEST_DEFAULT,
@@ -139,6 +141,16 @@
     @Feature({"Feed"})
     @CommandLineFlags.
     Add({"enable-features=InterestFeedContentSuggestions<Trial", "force-fieldtrials=Trial/Group",
+            "force-fieldtrial-params=Trial.Group:default_action_ttl_seconds/42"})
+    public void
+    testDefaultActionTTLSeconds() {
+        Assert.assertEquals(42, FeedConfiguration.getDefaultActionTtlSeconds());
+    }
+
+    @Test
+    @Feature({"Feed"})
+    @CommandLineFlags.
+    Add({"enable-features=InterestFeedContentSuggestions<Trial", "force-fieldtrials=Trial/Group",
             "force-fieldtrial-params=Trial.Group:feed_action_server_endpoint/"
                     + "https%3A%2F%2Ffeed%2Egoogle%2Ecom%2Fpath"})
     public void
@@ -401,6 +413,8 @@
                 configuration.getValueOrDefault(ConfigKey.CONSUME_SYNTHETIC_TOKENS, true));
         Assert.assertFalse(configuration.getValueOrDefault(
                 ConfigKey.CONSUME_SYNTHETIC_TOKENS_WHILE_RESTORING, true));
+        Assert.assertEquals((long) FeedConfiguration.DEFAULT_ACTION_TTL_SECONDS_DEFAULT,
+                configuration.getValueOrDefault(ConfigKey.DEFAULT_ACTION_TTL_SECONDS, 0));
         Assert.assertEquals(FeedConfiguration.FEED_ACTION_SERVER_ENDPOINT_DEFAULT,
                 configuration.getValueOrDefault(ConfigKey.FEED_ACTION_SERVER_ENDPOINT, ""));
         Assert.assertEquals(
diff --git a/chrome/app/chromeos_strings.grdp b/chrome/app/chromeos_strings.grdp
index 16fc89eb..d15eb8d 100644
--- a/chrome/app/chromeos_strings.grdp
+++ b/chrome/app/chromeos_strings.grdp
@@ -3100,7 +3100,7 @@
     Related info
   </message>
   <message name="IDS_ASSISTANT_SCREEN_CONTEXT_DESC" desc="Description for assistant screen context optin. This is also used as the sub label for context-enable toggle in Assistant settings page.">
-    Let the Assistant show you info related to what's on your screen
+    Let your Assistant show you info related to what's on your screen
   </message>
   <message name="IDS_ASSISTANT_READY_SCREEN_TITLE" desc="Title for assistant ready screen.">
     Your Assistant is ready
diff --git a/chrome/app/os_settings_strings.grdp b/chrome/app/os_settings_strings.grdp
index 09818d4..ad44b29 100644
--- a/chrome/app/os_settings_strings.grdp
+++ b/chrome/app/os_settings_strings.grdp
@@ -2,6 +2,11 @@
 <!-- Settings-specific strings (included from generated_resources.grd). -->
 <grit-part>
 <if expr="chromeos">
+  <!-- About (OS Settings) -->
+  <message name="IDS_OS_SETTINGS_ABOUT_PAGE_BUILD_DETAILS" desc="Label of the row button that clicks into Build details">
+    Build Details
+  </message>
+
   <!-- People (OS settings) -->
   <message name="IDS_OS_SETTINGS_PROFILE_LABEL" desc="Label underneath the profile's real name, listing the email address and optionally the number of additional accounts">
     {COUNT, plural,
diff --git a/chrome/app/printing_strings.grdp b/chrome/app/printing_strings.grdp
index c7533c1..498470ec 100644
--- a/chrome/app/printing_strings.grdp
+++ b/chrome/app/printing_strings.grdp
@@ -88,10 +88,10 @@
     <message name="IDS_PRINT_PREVIEW_SCALING_LABEL" desc="Scaling option label.">
       Scale
     </message>
-    <message name="IDS_PRINT_PREVIEW_OPTION_DEFAULT_SCALING" desc="Option to print with default (100%) scaling.">
+    <message name="IDS_PRINT_PREVIEW_OPTION_DEFAULT_SCALING" desc="Dropdown option to print with default (100%) scaling.">
       Default
     </message>
-    <message name="IDS_PRINT_PREVIEW_OPTION_CUSTOM_SCALING" desc="Option to print with custom scaling.">
+    <message name="IDS_PRINT_PREVIEW_OPTION_CUSTOM_SCALING" desc="Dropdown option to print with custom scaling.">
       Custom
     </message>
     <message name="IDS_PRINT_PREVIEW_PAGES_PER_SHEET_LABEL" desc="Pages per sheet option label.">
@@ -147,9 +147,12 @@
     <message name="IDS_PRINT_PREVIEW_OPTION_HEADER_FOOTER" desc="Checkbox label that provides a choice to print the headers and footers.">
       Headers and footers
     </message>
-    <message name="IDS_PRINT_PREVIEW_OPTION_FIT_TO_PAGE" desc="Checkbox label shown in print preview page to auto fit the PDF page.">
+    <message name="IDS_PRINT_PREVIEW_OPTION_FIT_TO_PAGE" desc="Dropdown option shown in print preview page to auto fit the PDF page to the paper's printable area.">
       Fit to page
     </message>
+    <message name="IDS_PRINT_PREVIEW_OPTION_FIT_TO_PAPER" desc="Dropdown option shown in print preview page to auto fit the PDF page to the paper size.">
+      Fit to paper size
+    </message>
     <message name="IDS_PRINT_PREVIEW_OPTION_BACKGROUND_COLORS_AND_IMAGES" desc="Checkbox label shown in print preview page to print webpage backgrounds.">
       Background graphics
     </message>
diff --git a/chrome/app/settings_strings.grdp b/chrome/app/settings_strings.grdp
index a85099a..ab5e2dc 100644
--- a/chrome/app/settings_strings.grdp
+++ b/chrome/app/settings_strings.grdp
@@ -27,10 +27,7 @@
   </message>
   <if expr="chromeos">
     <message name="IDS_SETTINGS_ABOUT_PAGE_DETAILED_BUILD_INFO" desc="Label describing the section that shows detailed information about the current Chrome build.">
-      Detailed build information
-    </message>
-    <message name="IDS_SETTINGS_ABOUT_PAGE_ARC_VERSION" desc="Label for ARC version">
-      ARC Version
+      Additional details
     </message>
     <message name="IDS_SETTINGS_ABOUT_PAGE_CHANNEL" desc="The channel label under Detailed build info.">
       Channel
@@ -62,12 +59,6 @@
         Learn more
       <ph name="LINK_END">&lt;/a&gt;</ph>
     </message>
-    <message name="IDS_SETTINGS_ABOUT_PAGE_FIRMWARE" desc="Label used for Chrome OS BIOS firmware version.">
-      Firmware
-    </message>
-    <message name="IDS_SETTINGS_ABOUT_PAGE_PLATFORM" desc="Label for Platform">
-      Platform
-    </message>
     <message name="IDS_SETTINGS_ABOUT_PAGE_RELAUNCH" desc="The label for the relaunch button that relaunches the browser once update is complete">
       Restart
     </message>
@@ -3152,10 +3143,10 @@
     "Ok Google"
   </message>
   <message name="IDS_SETTINGS_GOOGLE_ASSISTANT_ENABLE_HOTWORD_DESCRIPTION" desc="Sub label for hotword-enable toggle.">
-    Access your Assistant any time you say "Ok Google"
+    Access your Assistant when you say "Ok Google."
   </message>
   <message name="IDS_SETTINGS_GOOGLE_ASSISTANT_ENABLE_HOTWORD_WITHOUT_DSP_DESCRIPTION" desc="Sub label for hotword-enable dropdown without DSP support.">
-    Activate the Assistant when anyone says “Ok Google”. To save battery, “Ok Google” is on only when your device is connected to a power source.
+    Access your Assistant when you say "Ok Google." To save battery, choose “On (Recommended.)” Your Assistant will respond only when your device is plugged in or charging.
   </message>
   <message name="IDS_SETTINGS_GOOGLE_ASSISTANT_ENABLE_HOTWORD_WITHOUT_DSP_RECOMMENDED" desc="Default label for hotword-enable dropdown without DSP support.">
     On (Recommended)
@@ -3271,6 +3262,12 @@
   <message name="IDS_SETTINGS_SITE_SETTINGS_IMAGES" desc="Label for the images site settings.">
     Images
   </message>
+  <message name="IDS_SETTINGS_SITE_SETTINGS_INSECURE_CONTENT" desc="Label for the insecure content site settings. This setting controls whether HTTP content will be displayed on HTTPS sites.">
+    Insecure content
+  </message>
+  <message name="IDS_SETTINGS_SITE_SETTINGS_INSECURE_CONTENT_BLOCK" desc="Label explaining that insecure content is blocked by default in secure sites. Insecure content refers to content served over HTTP, secure sites refers to sites served over HTTPS.">
+    Insecure content is blocked by default on secure sites
+  </message>
   <message name="IDS_SETTINGS_SITE_SETTINGS_JAVASCRIPT" desc="Label for the javascript site settings.">
     JavaScript
   </message>
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index 54b17eb..c6f80ac 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -5381,6 +5381,7 @@
 
   if (is_win || is_mac || is_desktop_linux || is_chromeos) {
     deps += [
+      "//chrome/browser/resources/management:polymer3_elements",
       "//chrome/browser/resources/discards:discards_resources_gen",
       "//chrome/browser/ui/webui/discards:mojo_bindings_js",
       "//services/resource_coordinator/public/mojom:mojom_js",
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index 9b7f081..46c5fa3 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -2207,6 +2207,9 @@
     {"webxr-ar-module", flag_descriptions::kWebXrArModuleName,
      flag_descriptions::kWebXrArModuleDescription, kOsAll,
      FEATURE_VALUE_TYPE(features::kWebXrArModule)},
+    {"webxr-ar-dom-overlay", flag_descriptions::kWebXrArDOMOverlayName,
+     flag_descriptions::kWebXrArDOMOverlayDescription, kOsAndroid,
+     FEATURE_VALUE_TYPE(features::kWebXrArDOMOverlay)},
     {"webxr-hit-test", flag_descriptions::kWebXrHitTestName,
      flag_descriptions::kWebXrHitTestDescription, kOsAll,
      FEATURE_VALUE_TYPE(features::kWebXrHitTest)},
@@ -2347,6 +2350,12 @@
      flag_descriptions::kCrosRegionsModeDescription, kOsCrOS,
      MULTI_VALUE_TYPE(kCrosRegionsModeChoices)},
 #endif  // OS_CHROMEOS
+#if defined(OS_WIN)
+    {"enable-aura-tooltips-on-windows",
+     flag_descriptions::kEnableAuraTooltipsOnWindowsName,
+     flag_descriptions::kEnableAuraTooltipsOnWindowsDescription, kOsWin,
+     FEATURE_VALUE_TYPE(views::features::kEnableAuraTooltipsOnWindows)},
+#endif  // OS_WIN
 #if defined(TOOLKIT_VIEWS) || defined(OS_ANDROID)
     {"enable-autofill-credit-card-upload",
      flag_descriptions::kAutofillCreditCardUploadName,
diff --git a/chrome/browser/android/compositor/compositor_view.cc b/chrome/browser/android/compositor/compositor_view.cc
index 0366163..6dca5748 100644
--- a/chrome/browser/android/compositor/compositor_view.cc
+++ b/chrome/browser/android/compositor/compositor_view.cc
@@ -83,7 +83,8 @@
       current_surface_format_(0),
       content_width_(0),
       content_height_(0),
-      overlay_video_mode_(false) {
+      overlay_video_mode_(false),
+      overlay_immersive_ar_mode_(false) {
   content::BrowserChildProcessObserver::Add(this);
   obj_.Reset(env, obj);
   compositor_.reset(content::Compositor::Create(this, window_android));
@@ -224,6 +225,24 @@
   SetNeedsComposite(env, object);
 }
 
+void CompositorView::SetOverlayImmersiveArMode(
+    JNIEnv* env,
+    const JavaParamRef<jobject>& object,
+    bool enabled) {
+  // This mode is a variant of overlay video mode, the Java code is responsible
+  // for calling SetOverlayVideoMode(enabled) first to ensure consistent state.
+  // Check to make sure this didn't get bypassed.
+  DCHECK_EQ(enabled, overlay_video_mode_) << "missing SetOverlayVideoMode call";
+
+  overlay_immersive_ar_mode_ = enabled;
+  // This mode needs a transparent background color.
+  // ContentViewRenderView::SetOverlayVideoMode applies this, but the
+  // CompositorView::SetOverlayVideoMode version in this file doesn't.
+  compositor_->SetBackgroundColor(enabled ? SK_ColorTRANSPARENT
+                                          : SK_ColorWHITE);
+  compositor_->SetNeedsComposite();
+}
+
 void CompositorView::SetSceneLayer(JNIEnv* env,
                                    const JavaParamRef<jobject>& object,
                                    const JavaParamRef<jobject>& jscene_layer) {
@@ -248,7 +267,21 @@
     root_layer_->InsertChild(scene_layer->layer(), 0);
   }
 
-  if (scene_layer) {
+  if (overlay_immersive_ar_mode_) {
+    // Suppress the scene background's default background which breaks
+    // transparency. TODO(https://crbug.com/1002270): Remove this workaround
+    // once the issue with StaticTabSceneLayer's unexpected background is
+    // resolved.
+    bool should_show_background = scene_layer->ShouldShowBackground();
+    SkColor color = scene_layer->GetBackgroundColor();
+    if (should_show_background && color != SK_ColorTRANSPARENT) {
+      DVLOG(1) << "override non-transparent background 0x" << std::hex << color;
+      SetBackground(false, SK_ColorTRANSPARENT);
+    } else {
+      // No override needed, scene doesn't provide an opaque background.
+      SetBackground(should_show_background, color);
+    }
+  } else if (scene_layer) {
     SetBackground(scene_layer->ShouldShowBackground(),
                   scene_layer->GetBackgroundColor());
   } else {
diff --git a/chrome/browser/android/compositor/compositor_view.h b/chrome/browser/android/compositor/compositor_view.h
index 6552a86..35f261a 100644
--- a/chrome/browser/android/compositor/compositor_view.h
+++ b/chrome/browser/android/compositor/compositor_view.h
@@ -80,6 +80,10 @@
   void SetOverlayVideoMode(JNIEnv* env,
                            const base::android::JavaParamRef<jobject>& object,
                            bool enabled);
+  void SetOverlayImmersiveArMode(
+      JNIEnv* env,
+      const base::android::JavaParamRef<jobject>& object,
+      bool enabled);
   void SetSceneLayer(JNIEnv* env,
                      const base::android::JavaParamRef<jobject>& object,
                      const base::android::JavaParamRef<jobject>& jscene_layer);
@@ -124,6 +128,7 @@
   int content_width_;
   int content_height_;
   bool overlay_video_mode_;
+  bool overlay_immersive_ar_mode_;
 
   base::WeakPtrFactory<CompositorView> weak_factory_{this};
 
diff --git a/chrome/browser/android/metrics/BUILD.gn b/chrome/browser/android/metrics/BUILD.gn
index cdb8fca..97f500d 100644
--- a/chrome/browser/android/metrics/BUILD.gn
+++ b/chrome/browser/android/metrics/BUILD.gn
@@ -19,6 +19,7 @@
   }
 
   generate_jni("jni_headers") {
+    testonly = true
     sources = [
       "../../../android/java/src/org/chromium/chrome/browser/metrics/UkmUtilsForTest.java",
     ]
diff --git a/chrome/browser/android/vr/arcore_device/arcore_device.cc b/chrome/browser/android/vr/arcore_device/arcore_device.cc
index 5f78246..62edd69 100644
--- a/chrome/browser/android/vr/arcore_device/arcore_device.cc
+++ b/chrome/browser/android/vr/arcore_device/arcore_device.cc
@@ -4,6 +4,8 @@
 
 #include "chrome/browser/android/vr/arcore_device/arcore_device.h"
 
+#include <algorithm>
+
 #include "base/bind.h"
 #include "base/numerics/math_constants.h"
 #include "base/optional.h"
@@ -101,7 +103,16 @@
                    std::make_unique<vr::ArCoreJavaUtils>()) {}
 
 ArCoreDevice::~ArCoreDevice() {
+  // If there's still a pending session request, reject it.
   CallDeferredRequestSessionCallback(/*success=*/false);
+
+  // Ensure that any active sessions are terminated. Terminating the GL thread
+  // would normally do so via its session_shutdown_callback_, but that happens
+  // asynchronously via CreateMainThreadCallback, and it doesn't seem safe to
+  // depend on all posted tasks being handled before the thread is shut down.
+  // Repeated EndSession calls are a no-op, so it's OK to do this redundantly.
+  OnSessionEnded();
+
   // The GL thread must be terminated since it uses our members. For example,
   // there might still be a posted Initialize() call in flight that uses
   // arcore_session_utils_ and arcore_factory_. Ensure that the thread is
@@ -151,10 +162,14 @@
   }
   session_state_->pending_request_session_callback_ = std::move(callback);
 
+  bool use_dom_overlay = base::Contains(
+      options->enabled_features,
+      device::mojom::XRSessionFeature::DOM_OVERLAY_FOR_HANDHELD_AR);
+
   if (session_state_->is_arcore_gl_thread_initialized_) {
     // First session on a new ArCoreDevice, and it's ready to proceed now.
-    RequestSessionAfterInitialization(options->render_process_id,
-                                      options->render_frame_id);
+    RequestSessionAfterInitialization(
+        options->render_process_id, options->render_frame_id, use_dom_overlay);
   } else {
     if (mailbox_bridge_) {
       // This is a new ArCoreDevice, but its mailbox_bridge_ hasn't finished
@@ -173,12 +188,13 @@
     session_state_->pending_request_session_after_gl_thread_initialized_ =
         base::BindOnce(&ArCoreDevice::RequestSessionAfterInitialization,
                        GetWeakPtr(), options->render_process_id,
-                       options->render_frame_id);
+                       options->render_frame_id, use_dom_overlay);
   }
 }
 
 void ArCoreDevice::RequestSessionAfterInitialization(int render_process_id,
-                                                     int render_frame_id) {
+                                                     int render_frame_id,
+                                                     bool use_overlay) {
   auto ready_callback =
       base::BindRepeating(&ArCoreDevice::OnDrawingSurfaceReady, GetWeakPtr());
   auto touch_callback =
@@ -187,8 +203,9 @@
       base::BindOnce(&ArCoreDevice::OnDrawingSurfaceDestroyed, GetWeakPtr());
 
   arcore_session_utils_->RequestArSession(
-      render_process_id, render_frame_id, std::move(ready_callback),
-      std::move(touch_callback), std::move(destroyed_callback));
+      render_process_id, render_frame_id, use_overlay,
+      std::move(ready_callback), std::move(touch_callback),
+      std::move(destroyed_callback));
 }
 
 void ArCoreDevice::OnDrawingSurfaceReady(gfx::AcceleratedWidget window,
diff --git a/chrome/browser/android/vr/arcore_device/arcore_device.h b/chrome/browser/android/vr/arcore_device/arcore_device.h
index 81b01fb..ef7cd4d 100644
--- a/chrome/browser/android/vr/arcore_device/arcore_device.h
+++ b/chrome/browser/android/vr/arcore_device/arcore_device.h
@@ -85,7 +85,8 @@
   bool IsOnMainThread();
 
   void RequestSessionAfterInitialization(int render_process_id,
-                                         int render_frame_id);
+                                         int render_frame_id,
+                                         bool use_overlay);
   void CallDeferredRequestSessionCallback(bool success);
   void RequestArCoreGlInitialization(gfx::AcceleratedWidget window,
                                      int rotation,
diff --git a/chrome/browser/android/vr/arcore_device/arcore_device_unittest.cc b/chrome/browser/android/vr/arcore_device/arcore_device_unittest.cc
index 738403a..63974d1 100644
--- a/chrome/browser/android/vr/arcore_device/arcore_device_unittest.cc
+++ b/chrome/browser/android/vr/arcore_device/arcore_device_unittest.cc
@@ -89,6 +89,7 @@
   void RequestArSession(
       int render_process_id,
       int render_frame_id,
+      bool use_overlay,
       vr::SurfaceReadyCallback ready_callback,
       vr::SurfaceTouchCallback touch_callback,
       vr::SurfaceDestroyedCallback destroyed_callback) override {
diff --git a/chrome/browser/android/vr/arcore_device/arcore_java_utils.cc b/chrome/browser/android/vr/arcore_device/arcore_java_utils.cc
index e8f1dc0..dce5c25 100644
--- a/chrome/browser/android/vr/arcore_device/arcore_java_utils.cc
+++ b/chrome/browser/android/vr/arcore_device/arcore_java_utils.cc
@@ -42,6 +42,7 @@
 void ArCoreJavaUtils::RequestArSession(
     int render_process_id,
     int render_frame_id,
+    bool use_overlay,
     SurfaceReadyCallback ready_callback,
     SurfaceTouchCallback touch_callback,
     SurfaceDestroyedCallback destroyed_callback) {
@@ -54,7 +55,7 @@
 
   Java_ArCoreJavaUtils_startSession(
       env, j_arcore_java_utils_,
-      getTabFromRenderer(render_process_id, render_frame_id));
+      getTabFromRenderer(render_process_id, render_frame_id), use_overlay);
 }
 
 void ArCoreJavaUtils::EndSession() {
diff --git a/chrome/browser/android/vr/arcore_device/arcore_java_utils.h b/chrome/browser/android/vr/arcore_device/arcore_java_utils.h
index ecd5e2d6..0f47db4 100644
--- a/chrome/browser/android/vr/arcore_device/arcore_java_utils.h
+++ b/chrome/browser/android/vr/arcore_device/arcore_java_utils.h
@@ -23,6 +23,7 @@
   // ArCoreSessionUtils:
   void RequestArSession(int render_process_id,
                         int render_frame_id,
+                        bool use_overlay,
                         SurfaceReadyCallback ready_callback,
                         SurfaceTouchCallback touch_callback,
                         SurfaceDestroyedCallback destroyed_callback) override;
diff --git a/chrome/browser/android/vr/arcore_device/arcore_session_utils.h b/chrome/browser/android/vr/arcore_device/arcore_session_utils.h
index e22027f..37d52d48 100644
--- a/chrome/browser/android/vr/arcore_device/arcore_session_utils.h
+++ b/chrome/browser/android/vr/arcore_device/arcore_session_utils.h
@@ -39,6 +39,7 @@
   virtual void RequestArSession(
       int render_process_id,
       int render_frame_id,
+      bool use_overlay,
       SurfaceReadyCallback ready_callback,
       SurfaceTouchCallback touch_callback,
       SurfaceDestroyedCallback destroyed_callback) = 0;
diff --git a/chrome/browser/banners/app_banner_manager_android.cc b/chrome/browser/banners/app_banner_manager_android.cc
index c274203..34abf55 100644
--- a/chrome/browser/banners/app_banner_manager_android.cc
+++ b/chrome/browser/banners/app_banner_manager_android.cc
@@ -370,7 +370,7 @@
   if (GetVisibleAmbientBadgeInfoBar(infobar_service) == nullptr) {
     InstallableAmbientBadgeInfoBarDelegate::Create(
         web_contents(), weak_factory_.GetWeakPtr(), GetAppName(), primary_icon_,
-        manifest_.start_url);
+        has_maskable_primary_icon_, manifest_.start_url);
   }
 }
 
diff --git a/chrome/browser/banners/app_banner_ui_delegate_android.cc b/chrome/browser/banners/app_banner_ui_delegate_android.cc
index accd879..a733b0c 100644
--- a/chrome/browser/banners/app_banner_ui_delegate_android.cc
+++ b/chrome/browser/banners/app_banner_ui_delegate_android.cc
@@ -209,7 +209,8 @@
                    url_formatter::SchemeDisplay::OMIT_CRYPTOGRAPHIC));
 
   return Java_AppBannerUiDelegateAndroid_showWebAppDialog(
-      env, java_delegate_, java_app_title, java_bitmap, java_app_url);
+      env, java_delegate_, java_app_title, java_bitmap, java_app_url,
+      has_primary_maskable_icon_);
 }
 
 bool AppBannerUiDelegateAndroid::ShowNativeAppDetails() {
diff --git a/chrome/browser/browser_resources.grd b/chrome/browser/browser_resources.grd
index d2d42ae..5f864a3b 100644
--- a/chrome/browser/browser_resources.grd
+++ b/chrome/browser/browser_resources.grd
@@ -324,11 +324,9 @@
       <include name="IDR_POLICY_JS" file="resources\policy\policy.js" type="BINDATA" compress="gzip" />
       <if expr="not is_android">
         <include name="IDR_MANAGEMENT_HTML" file="resources\management\management.html" flattenhtml="true" allowexternalscript="true" type="BINDATA" compress="gzip" />
-        <include name="IDR_MANAGEMENT_UI_HTML" file="resources\management\management_ui.html" flattenhtml="true" allowexternalscript="true" type="BINDATA" compress="gzip" />
-        <include name="IDR_MANAGEMENT_UI_JS" file="resources\management\management_ui.js" type="BINDATA" compress="gzip" preprocess="true" />
-        <include name="IDR_MANAGEMENT_BROWSER_PROXY_HTML" file="resources\management\management_browser_proxy.html" allowexternalscript="true" type="BINDATA" compress="gzip" />
+        <include name="IDR_MANAGEMENT_UI_JS" file="${root_gen_dir}/chrome/browser/resources/management/management_ui.js" use_base_dir="false" type="BINDATA" compress="gzip" preprocess="true" />
         <include name="IDR_MANAGEMENT_BROWSER_PROXY_JS" file="resources\management\management_browser_proxy.js" type="BINDATA" compress="gzip" preprocess="true" />
-        <include name="IDR_MANAGEMENT_ICONS_HTML" file="resources\management\icons.html" type="BINDATA" compress="gzip" preprocess="true" />
+        <include name="IDR_MANAGEMENT_ICONS_JS" file="${root_gen_dir}/chrome/browser/resources/management/icons.js" use_base_dir="false" type="BINDATA" compress="gzip" preprocess="true" />
       </if>
       <include name="IDR_SITE_ENGAGEMENT_HTML" file="resources\engagement\site_engagement.html" flattenhtml="true" allowexternalscript="true" type="BINDATA" compress="gzip" />
       <include name="IDR_SITE_ENGAGEMENT_JS" file="resources\engagement\site_engagement.js" flattenhtml="true" type="BINDATA" compress="gzip" />
diff --git a/chrome/browser/chromeos/BUILD.gn b/chrome/browser/chromeos/BUILD.gn
index b6733d9d..489eeb22 100644
--- a/chrome/browser/chromeos/BUILD.gn
+++ b/chrome/browser/chromeos/BUILD.gn
@@ -451,12 +451,6 @@
     "arc/arc_migration_guide_notification.h",
     "arc/arc_optin_uma.cc",
     "arc/arc_optin_uma.h",
-    "arc/arc_play_store_enabled_preference_handler.cc",
-    "arc/arc_play_store_enabled_preference_handler.h",
-    "arc/arc_service_launcher.cc",
-    "arc/arc_service_launcher.h",
-    "arc/arc_session_manager.cc",
-    "arc/arc_session_manager.h",
     "arc/arc_support_host.cc",
     "arc/arc_support_host.h",
     "arc/arc_util.cc",
@@ -618,6 +612,12 @@
     "arc/screen_capture/arc_screen_capture_bridge.h",
     "arc/screen_capture/arc_screen_capture_session.cc",
     "arc/screen_capture/arc_screen_capture_session.h",
+    "arc/session/arc_play_store_enabled_preference_handler.cc",
+    "arc/session/arc_play_store_enabled_preference_handler.h",
+    "arc/session/arc_service_launcher.cc",
+    "arc/session/arc_service_launcher.h",
+    "arc/session/arc_session_manager.cc",
+    "arc/session/arc_session_manager.h",
     "arc/tracing/arc_app_performance_tracing.cc",
     "arc/tracing/arc_app_performance_tracing.h",
     "arc/tracing/arc_app_performance_tracing_session.cc",
@@ -2432,8 +2432,6 @@
     "arc/app_shortcuts/arc_app_shortcuts_menu_builder_unittest.cc",
     "arc/app_shortcuts/arc_app_shortcuts_request_unittest.cc",
     "arc/arc_migration_guide_notification_unittest.cc",
-    "arc/arc_play_store_enabled_preference_handler_unittest.cc",
-    "arc/arc_session_manager_unittest.cc",
     "arc/arc_support_host_unittest.cc",
     "arc/arc_util_unittest.cc",
     "arc/bluetooth/arc_bluetooth_bridge_unittest.cc",
@@ -2474,6 +2472,8 @@
     "arc/pip/arc_pip_bridge_unittest.cc",
     "arc/policy/arc_policy_bridge_unittest.cc",
     "arc/process/arc_process_unittest.cc",
+    "arc/session/arc_play_store_enabled_preference_handler_unittest.cc",
+    "arc/session/arc_session_manager_unittest.cc",
     "arc/tracing/arc_app_performance_tracing_unittest.cc",
     "arc/tracing/arc_cpu_event_unittest.cc",
     "arc/tracing/arc_graphics_jank_detector_unittest.cc",
diff --git a/chrome/browser/chromeos/account_manager/account_manager_migrator.cc b/chrome/browser/chromeos/account_manager/account_manager_migrator.cc
index 9ec5f9c..a3d51e6b 100644
--- a/chrome/browser/chromeos/account_manager/account_manager_migrator.cc
+++ b/chrome/browser/chromeos/account_manager/account_manager_migrator.cc
@@ -21,9 +21,9 @@
 #include "base/timer/timer.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/chromeos/account_manager/account_manager_util.h"
-#include "chrome/browser/chromeos/arc/arc_session_manager.h"
 #include "chrome/browser/chromeos/arc/arc_util.h"
 #include "chrome/browser/chromeos/arc/auth/arc_auth_service.h"
+#include "chrome/browser/chromeos/arc/session/arc_session_manager.h"
 #include "chrome/browser/chromeos/profiles/profile_helper.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/signin/account_reconcilor_factory.h"
diff --git a/chrome/browser/chromeos/app_mode/arc/arc_kiosk_app_service.h b/chrome/browser/chromeos/app_mode/arc/arc_kiosk_app_service.h
index 2586309..d4e2780a 100644
--- a/chrome/browser/chromeos/app_mode/arc/arc_kiosk_app_service.h
+++ b/chrome/browser/chromeos/app_mode/arc/arc_kiosk_app_service.h
@@ -10,9 +10,9 @@
 #include "base/timer/timer.h"
 #include "chrome/browser/chromeos/app_mode/arc/arc_kiosk_app_launcher.h"
 #include "chrome/browser/chromeos/app_mode/arc/arc_kiosk_app_manager.h"
-#include "chrome/browser/chromeos/arc/arc_session_manager.h"
 #include "chrome/browser/chromeos/arc/kiosk/arc_kiosk_bridge.h"
 #include "chrome/browser/chromeos/arc/policy/arc_policy_bridge.h"
+#include "chrome/browser/chromeos/arc/session/arc_session_manager.h"
 #include "chrome/browser/ui/app_list/arc/arc_app_icon.h"
 #include "chrome/browser/ui/app_list/arc/arc_app_list_prefs.h"
 #include "components/keyed_service/core/keyed_service.h"
diff --git a/chrome/browser/chromeos/apps/apk_web_app_installer_browsertest.cc b/chrome/browser/chromeos/apps/apk_web_app_installer_browsertest.cc
index 1b7cc04..c4c8d79 100644
--- a/chrome/browser/chromeos/apps/apk_web_app_installer_browsertest.cc
+++ b/chrome/browser/chromeos/apps/apk_web_app_installer_browsertest.cc
@@ -16,8 +16,8 @@
 #include "base/test/bind_test_util.h"
 #include "chrome/browser/chromeos/apps/apk_web_app_installer.h"
 #include "chrome/browser/chromeos/apps/apk_web_app_service.h"
-#include "chrome/browser/chromeos/arc/arc_session_manager.h"
 #include "chrome/browser/chromeos/arc/arc_util.h"
+#include "chrome/browser/chromeos/arc/session/arc_session_manager.h"
 #include "chrome/browser/extensions/extension_service.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/app_list/arc/arc_app_test.h"
diff --git a/chrome/browser/chromeos/arc/arc_app_id_provider_impl.cc b/chrome/browser/chromeos/arc/arc_app_id_provider_impl.cc
index caf9ae44..fbcbfef 100644
--- a/chrome/browser/chromeos/arc/arc_app_id_provider_impl.cc
+++ b/chrome/browser/chromeos/arc/arc_app_id_provider_impl.cc
@@ -4,7 +4,7 @@
 
 #include "chrome/browser/chromeos/arc/arc_app_id_provider_impl.h"
 
-#include "chrome/browser/chromeos/arc/arc_session_manager.h"
+#include "chrome/browser/chromeos/arc/session/arc_session_manager.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/app_list/arc/arc_app_list_prefs.h"
 
diff --git a/chrome/browser/chromeos/arc/arc_util.cc b/chrome/browser/chromeos/arc/arc_util.cc
index e2d2006..55b2380 100644
--- a/chrome/browser/chromeos/arc/arc_util.cc
+++ b/chrome/browser/chromeos/arc/arc_util.cc
@@ -22,9 +22,9 @@
 #include "base/system/sys_info.h"
 #include "base/task/post_task.h"
 #include "base/threading/scoped_blocking_call.h"
-#include "chrome/browser/chromeos/arc/arc_session_manager.h"
 #include "chrome/browser/chromeos/arc/arc_web_contents_data.h"
 #include "chrome/browser/chromeos/arc/policy/arc_policy_util.h"
+#include "chrome/browser/chromeos/arc/session/arc_session_manager.h"
 #include "chrome/browser/chromeos/login/configuration_keys.h"
 #include "chrome/browser/chromeos/login/demo_mode/demo_session.h"
 #include "chrome/browser/chromeos/login/demo_mode/demo_setup_controller.h"
diff --git a/chrome/browser/chromeos/arc/arc_util_unittest.cc b/chrome/browser/chromeos/arc/arc_util_unittest.cc
index 7c4e8b8..16bb25b 100644
--- a/chrome/browser/chromeos/arc/arc_util_unittest.cc
+++ b/chrome/browser/chromeos/arc/arc_util_unittest.cc
@@ -14,7 +14,7 @@
 #include "base/test/scoped_feature_list.h"
 #include "base/values.h"
 #include "chrome/browser/chrome_notification_types.h"
-#include "chrome/browser/chromeos/arc/arc_session_manager.h"
+#include "chrome/browser/chromeos/arc/session/arc_session_manager.h"
 #include "chrome/browser/chromeos/login/demo_mode/demo_session.h"
 #include "chrome/browser/chromeos/login/oobe_configuration.h"
 #include "chrome/browser/chromeos/login/ui/fake_login_display_host.h"
diff --git a/chrome/browser/chromeos/arc/auth/arc_auth_service.cc b/chrome/browser/chromeos/arc/auth/arc_auth_service.cc
index ec92827f..340c263 100644
--- a/chrome/browser/chromeos/arc/auth/arc_auth_service.cc
+++ b/chrome/browser/chromeos/arc/auth/arc_auth_service.cc
@@ -16,11 +16,11 @@
 #include "chrome/browser/chromeos/account_manager/account_manager_migrator.h"
 #include "chrome/browser/chromeos/account_manager/account_manager_util.h"
 #include "chrome/browser/chromeos/arc/arc_optin_uma.h"
-#include "chrome/browser/chromeos/arc/arc_session_manager.h"
 #include "chrome/browser/chromeos/arc/arc_util.h"
 #include "chrome/browser/chromeos/arc/auth/arc_background_auth_code_fetcher.h"
 #include "chrome/browser/chromeos/arc/auth/arc_robot_auth_code_fetcher.h"
 #include "chrome/browser/chromeos/arc/policy/arc_policy_util.h"
+#include "chrome/browser/chromeos/arc/session/arc_session_manager.h"
 #include "chrome/browser/chromeos/login/demo_mode/demo_session.h"
 #include "chrome/browser/chromeos/profiles/profile_helper.h"
 #include "chrome/browser/lifetime/application_lifetime.h"
diff --git a/chrome/browser/chromeos/arc/auth/arc_auth_service.h b/chrome/browser/chromeos/arc/auth/arc_auth_service.h
index d66eb89..f7f8adb 100644
--- a/chrome/browser/chromeos/arc/auth/arc_auth_service.h
+++ b/chrome/browser/chromeos/arc/auth/arc_auth_service.h
@@ -14,8 +14,8 @@
 #include "base/memory/ref_counted.h"
 #include "base/memory/weak_ptr.h"
 #include "base/optional.h"
-#include "chrome/browser/chromeos/arc/arc_session_manager.h"
 #include "chrome/browser/chromeos/arc/auth/arc_active_directory_enrollment_token_fetcher.h"
+#include "chrome/browser/chromeos/arc/session/arc_session_manager.h"
 #include "components/arc/mojom/auth.mojom.h"
 #include "components/arc/session/connection_observer.h"
 #include "components/keyed_service/core/keyed_service.h"
diff --git a/chrome/browser/chromeos/arc/auth/arc_auth_service_browsertest.cc b/chrome/browser/chromeos/arc/auth/arc_auth_service_browsertest.cc
index becec50..d6d594b 100644
--- a/chrome/browser/chromeos/arc/auth/arc_auth_service_browsertest.cc
+++ b/chrome/browser/chromeos/arc/auth/arc_auth_service_browsertest.cc
@@ -19,12 +19,12 @@
 #include "base/test/bind_test_util.h"
 #include "base/test/scoped_feature_list.h"
 #include "chrome/browser/browser_process.h"
-#include "chrome/browser/chromeos/arc/arc_service_launcher.h"
-#include "chrome/browser/chromeos/arc/arc_session_manager.h"
 #include "chrome/browser/chromeos/arc/arc_util.h"
 #include "chrome/browser/chromeos/arc/auth/arc_auth_context.h"
 #include "chrome/browser/chromeos/arc/auth/arc_auth_service.h"
 #include "chrome/browser/chromeos/arc/auth/arc_background_auth_code_fetcher.h"
+#include "chrome/browser/chromeos/arc/session/arc_service_launcher.h"
+#include "chrome/browser/chromeos/arc/session/arc_session_manager.h"
 #include "chrome/browser/chromeos/certificate_provider/certificate_provider_service.h"
 #include "chrome/browser/chromeos/certificate_provider/certificate_provider_service_factory.h"
 #include "chrome/browser/chromeos/login/demo_mode/demo_session.h"
diff --git a/chrome/browser/chromeos/arc/auth/arc_robot_auth_code_fetcher_browsertest.cc b/chrome/browser/chromeos/arc/auth/arc_robot_auth_code_fetcher_browsertest.cc
index a22e6c8..585ef94 100644
--- a/chrome/browser/chromeos/arc/auth/arc_robot_auth_code_fetcher_browsertest.cc
+++ b/chrome/browser/chromeos/arc/auth/arc_robot_auth_code_fetcher_browsertest.cc
@@ -13,9 +13,9 @@
 #include "base/task/post_task.h"
 #include "base/test/bind_test_util.h"
 #include "chrome/browser/browser_process.h"
-#include "chrome/browser/chromeos/arc/arc_session_manager.h"
 #include "chrome/browser/chromeos/arc/auth/arc_auth_service.h"
 #include "chrome/browser/chromeos/arc/auth/arc_robot_auth_code_fetcher.h"
+#include "chrome/browser/chromeos/arc/session/arc_session_manager.h"
 #include "chrome/browser/chromeos/login/users/fake_chrome_user_manager.h"
 #include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
 #include "chrome/test/base/in_process_browser_test.h"
diff --git a/chrome/browser/chromeos/arc/boot_phase_monitor/arc_boot_phase_monitor_bridge.h b/chrome/browser/chromeos/arc/boot_phase_monitor/arc_boot_phase_monitor_bridge.h
index 1d92912..8b96b5d 100644
--- a/chrome/browser/chromeos/arc/boot_phase_monitor/arc_boot_phase_monitor_bridge.h
+++ b/chrome/browser/chromeos/arc/boot_phase_monitor/arc_boot_phase_monitor_bridge.h
@@ -13,7 +13,7 @@
 #include "base/observer_list_types.h"
 #include "base/threading/thread_checker.h"
 #include "base/time/time.h"
-#include "chrome/browser/chromeos/arc/arc_session_manager.h"
+#include "chrome/browser/chromeos/arc/session/arc_session_manager.h"
 #include "chrome/browser/sessions/session_restore_observer.h"
 #include "components/account_id/account_id.h"
 #include "components/arc/arc_browser_context_keyed_service_factory_base.h"
diff --git a/chrome/browser/chromeos/arc/enterprise/arc_enterprise_reporting_service.cc b/chrome/browser/chromeos/arc/enterprise/arc_enterprise_reporting_service.cc
index 31b73a2..35c05f3 100644
--- a/chrome/browser/chromeos/arc/enterprise/arc_enterprise_reporting_service.cc
+++ b/chrome/browser/chromeos/arc/enterprise/arc_enterprise_reporting_service.cc
@@ -9,7 +9,7 @@
 #include "base/bind.h"
 #include "base/logging.h"
 #include "base/memory/singleton.h"
-#include "chrome/browser/chromeos/arc/arc_session_manager.h"
+#include "chrome/browser/chromeos/arc/session/arc_session_manager.h"
 #include "components/arc/arc_browser_context_keyed_service_factory_base.h"
 #include "components/arc/arc_service_manager.h"
 #include "components/arc/session/arc_bridge_service.h"
diff --git a/chrome/browser/chromeos/arc/enterprise/cert_store/arc_cert_store_bridge_browsertest.cc b/chrome/browser/chromeos/arc/enterprise/cert_store/arc_cert_store_bridge_browsertest.cc
index b0134b1..7df6808 100644
--- a/chrome/browser/chromeos/arc/enterprise/cert_store/arc_cert_store_bridge_browsertest.cc
+++ b/chrome/browser/chromeos/arc/enterprise/cert_store/arc_cert_store_bridge_browsertest.cc
@@ -12,8 +12,8 @@
 #include "base/json/json_writer.h"
 #include "base/run_loop.h"
 #include "base/threading/thread_restrictions.h"
-#include "chrome/browser/chromeos/arc/arc_service_launcher.h"
 #include "chrome/browser/chromeos/arc/enterprise/cert_store/arc_cert_store_bridge.h"
+#include "chrome/browser/chromeos/arc/session/arc_service_launcher.h"
 #include "chrome/browser/chromeos/login/test/local_policy_test_server_mixin.h"
 #include "chrome/browser/chromeos/platform_keys/key_permissions.h"
 #include "chrome/browser/chromeos/platform_keys/platform_keys.h"
diff --git a/chrome/browser/chromeos/arc/extensions/arc_support_message_host.cc b/chrome/browser/chromeos/arc/extensions/arc_support_message_host.cc
index 64c16803..9c5d9c10 100644
--- a/chrome/browser/chromeos/arc/extensions/arc_support_message_host.cc
+++ b/chrome/browser/chromeos/arc/extensions/arc_support_message_host.cc
@@ -10,8 +10,8 @@
 #include "base/json/json_writer.h"
 #include "base/single_thread_task_runner.h"
 #include "base/threading/thread_task_runner_handle.h"
-#include "chrome/browser/chromeos/arc/arc_session_manager.h"
 #include "chrome/browser/chromeos/arc/arc_support_host.h"
+#include "chrome/browser/chromeos/arc/session/arc_session_manager.h"
 
 namespace arc {
 
diff --git a/chrome/browser/chromeos/arc/fileapi/arc_file_system_operation_runner.h b/chrome/browser/chromeos/arc/fileapi/arc_file_system_operation_runner.h
index aa561d7e..f3d3bfc 100644
--- a/chrome/browser/chromeos/arc/fileapi/arc_file_system_operation_runner.h
+++ b/chrome/browser/chromeos/arc/fileapi/arc_file_system_operation_runner.h
@@ -16,8 +16,8 @@
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
 #include "base/observer_list.h"
-#include "chrome/browser/chromeos/arc/arc_session_manager.h"
 #include "chrome/browser/chromeos/arc/fileapi/arc_file_system_bridge.h"
+#include "chrome/browser/chromeos/arc/session/arc_session_manager.h"
 #include "components/arc/mojom/file_system.mojom.h"
 #include "components/arc/session/connection_observer.h"
 #include "components/keyed_service/core/keyed_service.h"
diff --git a/chrome/browser/chromeos/arc/instance_throttle/arc_boot_phase_throttle_observer.h b/chrome/browser/chromeos/arc/instance_throttle/arc_boot_phase_throttle_observer.h
index 0947e6f..f823869 100644
--- a/chrome/browser/chromeos/arc/instance_throttle/arc_boot_phase_throttle_observer.h
+++ b/chrome/browser/chromeos/arc/instance_throttle/arc_boot_phase_throttle_observer.h
@@ -6,8 +6,8 @@
 #define CHROME_BROWSER_CHROMEOS_ARC_INSTANCE_THROTTLE_ARC_BOOT_PHASE_THROTTLE_OBSERVER_H_
 
 #include "base/macros.h"
-#include "chrome/browser/chromeos/arc/arc_session_manager.h"
 #include "chrome/browser/chromeos/arc/boot_phase_monitor/arc_boot_phase_monitor_bridge.h"
+#include "chrome/browser/chromeos/arc/session/arc_session_manager.h"
 #include "chrome/browser/chromeos/throttle_observer.h"
 #include "chrome/browser/sessions/session_restore_observer.h"
 
diff --git a/chrome/browser/chromeos/arc/instance_throttle/arc_boot_phase_throttle_observer_unittest.cc b/chrome/browser/chromeos/arc/instance_throttle/arc_boot_phase_throttle_observer_unittest.cc
index b932992..b2afccbb 100644
--- a/chrome/browser/chromeos/arc/instance_throttle/arc_boot_phase_throttle_observer_unittest.cc
+++ b/chrome/browser/chromeos/arc/instance_throttle/arc_boot_phase_throttle_observer_unittest.cc
@@ -8,8 +8,8 @@
 
 #include "base/command_line.h"
 #include "base/values.h"
-#include "chrome/browser/chromeos/arc/arc_session_manager.h"
 #include "chrome/browser/chromeos/arc/boot_phase_monitor/arc_boot_phase_monitor_bridge.h"
+#include "chrome/browser/chromeos/arc/session/arc_session_manager.h"
 #include "chrome/browser/chromeos/login/users/fake_chrome_user_manager.h"
 #include "chrome/test/base/testing_profile.h"
 #include "components/arc/arc_prefs.h"
diff --git a/chrome/browser/chromeos/arc/instance_throttle/arc_instance_throttle_unittest.cc b/chrome/browser/chromeos/arc/instance_throttle/arc_instance_throttle_unittest.cc
index a075646..27c5f24 100644
--- a/chrome/browser/chromeos/arc/instance_throttle/arc_instance_throttle_unittest.cc
+++ b/chrome/browser/chromeos/arc/instance_throttle/arc_instance_throttle_unittest.cc
@@ -11,8 +11,8 @@
 #include "base/bind.h"
 #include "base/command_line.h"
 #include "base/test/task_environment.h"
-#include "chrome/browser/chromeos/arc/arc_session_manager.h"
 #include "chrome/browser/chromeos/arc/boot_phase_monitor/arc_boot_phase_monitor_bridge.h"
+#include "chrome/browser/chromeos/arc/session/arc_session_manager.h"
 #include "chrome/browser/chromeos/throttle_observer.h"
 #include "chrome/test/base/testing_profile.h"
 #include "components/arc/arc_prefs.h"
diff --git a/chrome/browser/chromeos/arc/intent_helper/arc_settings_service.h b/chrome/browser/chromeos/arc/intent_helper/arc_settings_service.h
index 63b9fff..026de17 100644
--- a/chrome/browser/chromeos/arc/intent_helper/arc_settings_service.h
+++ b/chrome/browser/chromeos/arc/intent_helper/arc_settings_service.h
@@ -8,7 +8,7 @@
 #include <memory>
 
 #include "base/macros.h"
-#include "chrome/browser/chromeos/arc/arc_session_manager.h"
+#include "chrome/browser/chromeos/arc/session/arc_session_manager.h"
 #include "components/arc/mojom/intent_helper.mojom.h"
 #include "components/arc/session/connection_observer.h"
 #include "components/keyed_service/core/keyed_service.h"
diff --git a/chrome/browser/chromeos/arc/intent_helper/arc_settings_service_unittest.cc b/chrome/browser/chromeos/arc/intent_helper/arc_settings_service_unittest.cc
index e1715b9..32a02c2 100644
--- a/chrome/browser/chromeos/arc/intent_helper/arc_settings_service_unittest.cc
+++ b/chrome/browser/chromeos/arc/intent_helper/arc_settings_service_unittest.cc
@@ -10,7 +10,7 @@
 #include "base/command_line.h"
 #include "base/test/scoped_feature_list.h"
 #include "chrome/browser/chromeos/arc/arc_optin_uma.h"
-#include "chrome/browser/chromeos/arc/arc_session_manager.h"
+#include "chrome/browser/chromeos/arc/session/arc_session_manager.h"
 #include "chrome/browser/chromeos/login/users/fake_chrome_user_manager.h"
 #include "chrome/browser/chromeos/settings/stats_reporting_controller.h"
 #include "chrome/browser/ui/zoom/chrome_zoom_level_prefs.h"
diff --git a/chrome/browser/chromeos/arc/notification/arc_boot_error_notification.h b/chrome/browser/chromeos/arc/notification/arc_boot_error_notification.h
index 12ab395..1a25116 100644
--- a/chrome/browser/chromeos/arc/notification/arc_boot_error_notification.h
+++ b/chrome/browser/chromeos/arc/notification/arc_boot_error_notification.h
@@ -6,7 +6,7 @@
 #define CHROME_BROWSER_CHROMEOS_ARC_NOTIFICATION_ARC_BOOT_ERROR_NOTIFICATION_H_
 
 #include "base/macros.h"
-#include "chrome/browser/chromeos/arc/arc_session_manager.h"
+#include "chrome/browser/chromeos/arc/session/arc_session_manager.h"
 #include "components/keyed_service/core/keyed_service.h"
 
 namespace content {
diff --git a/chrome/browser/chromeos/arc/notification/arc_provision_notification_service.h b/chrome/browser/chromeos/arc/notification/arc_provision_notification_service.h
index 6a50843..1465edff 100644
--- a/chrome/browser/chromeos/arc/notification/arc_provision_notification_service.h
+++ b/chrome/browser/chromeos/arc/notification/arc_provision_notification_service.h
@@ -8,7 +8,7 @@
 #include <memory>
 
 #include "base/macros.h"
-#include "chrome/browser/chromeos/arc/arc_session_manager.h"
+#include "chrome/browser/chromeos/arc/session/arc_session_manager.h"
 #include "components/keyed_service/core/keyed_service.h"
 
 namespace content {
diff --git a/chrome/browser/chromeos/arc/notification/arc_provision_notification_service_unittest.cc b/chrome/browser/chromeos/arc/notification/arc_provision_notification_service_unittest.cc
index bed021a..be2cc07 100644
--- a/chrome/browser/chromeos/arc/notification/arc_provision_notification_service_unittest.cc
+++ b/chrome/browser/chromeos/arc/notification/arc_provision_notification_service_unittest.cc
@@ -11,8 +11,8 @@
 #include "base/command_line.h"
 #include "base/values.h"
 #include "chrome/browser/chromeos/arc/arc_optin_uma.h"
-#include "chrome/browser/chromeos/arc/arc_session_manager.h"
 #include "chrome/browser/chromeos/arc/arc_util.h"
+#include "chrome/browser/chromeos/arc/session/arc_session_manager.h"
 #include "chrome/browser/chromeos/login/ui/fake_login_display_host.h"
 #include "chrome/browser/chromeos/login/users/fake_chrome_user_manager.h"
 #include "chrome/browser/notifications/notification_display_service_tester.h"
diff --git a/chrome/browser/chromeos/arc/notification/arc_supervision_transition_notification.cc b/chrome/browser/chromeos/arc/notification/arc_supervision_transition_notification.cc
index ee7286f..28dd2f0 100644
--- a/chrome/browser/chromeos/arc/notification/arc_supervision_transition_notification.cc
+++ b/chrome/browser/chromeos/arc/notification/arc_supervision_transition_notification.cc
@@ -8,8 +8,8 @@
 #include "base/bind.h"
 #include "base/macros.h"
 #include "chrome/app/vector_icons/vector_icons.h"
-#include "chrome/browser/chromeos/arc/arc_session_manager.h"
 #include "chrome/browser/chromeos/arc/arc_util.h"
+#include "chrome/browser/chromeos/arc/session/arc_session_manager.h"
 #include "chrome/browser/notifications/notification_display_service.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/ash/multi_user/multi_user_util.h"
diff --git a/chrome/browser/chromeos/arc/policy/arc_policy_bridge.cc b/chrome/browser/chromeos/arc/policy/arc_policy_bridge.cc
index 778b2ce..d0ce31b 100644
--- a/chrome/browser/chromeos/arc/policy/arc_policy_bridge.cc
+++ b/chrome/browser/chromeos/arc/policy/arc_policy_bridge.cc
@@ -17,8 +17,8 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
 #include "base/values.h"
-#include "chrome/browser/chromeos/arc/arc_session_manager.h"
 #include "chrome/browser/chromeos/arc/enterprise/cert_store/arc_smart_card_manager_bridge.h"
+#include "chrome/browser/chromeos/arc/session/arc_session_manager.h"
 #include "chrome/browser/chromeos/profiles/profile_helper.h"
 #include "chrome/browser/policy/developer_tools_policy_handler.h"
 #include "chrome/browser/policy/profile_policy_connector.h"
diff --git a/chrome/browser/chromeos/arc/arc_play_store_enabled_preference_handler.cc b/chrome/browser/chromeos/arc/session/arc_play_store_enabled_preference_handler.cc
similarity index 97%
rename from chrome/browser/chromeos/arc/arc_play_store_enabled_preference_handler.cc
rename to chrome/browser/chromeos/arc/session/arc_play_store_enabled_preference_handler.cc
index 0f087b2..972f133 100644
--- a/chrome/browser/chromeos/arc/arc_play_store_enabled_preference_handler.cc
+++ b/chrome/browser/chromeos/arc/session/arc_play_store_enabled_preference_handler.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/chromeos/arc/arc_play_store_enabled_preference_handler.h"
+#include "chrome/browser/chromeos/arc/session/arc_play_store_enabled_preference_handler.h"
 
 #include <string>
 
@@ -10,8 +10,8 @@
 #include "base/command_line.h"
 #include "base/logging.h"
 #include "chrome/browser/chromeos/arc/arc_optin_uma.h"
-#include "chrome/browser/chromeos/arc/arc_session_manager.h"
 #include "chrome/browser/chromeos/arc/arc_util.h"
+#include "chrome/browser/chromeos/arc/session/arc_session_manager.h"
 #include "chrome/browser/consent_auditor/consent_auditor_factory.h"
 #include "chrome/browser/prefs/pref_service_syncable_util.h"
 #include "chrome/browser/profiles/profile.h"
diff --git a/chrome/browser/chromeos/arc/arc_play_store_enabled_preference_handler.h b/chrome/browser/chromeos/arc/session/arc_play_store_enabled_preference_handler.h
similarity index 85%
rename from chrome/browser/chromeos/arc/arc_play_store_enabled_preference_handler.h
rename to chrome/browser/chromeos/arc/session/arc_play_store_enabled_preference_handler.h
index 91e8329..e655e67 100644
--- a/chrome/browser/chromeos/arc/arc_play_store_enabled_preference_handler.h
+++ b/chrome/browser/chromeos/arc/session/arc_play_store_enabled_preference_handler.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 CHROME_BROWSER_CHROMEOS_ARC_ARC_PLAY_STORE_ENABLED_PREFERENCE_HANDLER_H_
-#define CHROME_BROWSER_CHROMEOS_ARC_ARC_PLAY_STORE_ENABLED_PREFERENCE_HANDLER_H_
+#ifndef CHROME_BROWSER_CHROMEOS_ARC_SESSION_ARC_PLAY_STORE_ENABLED_PREFERENCE_HANDLER_H_
+#define CHROME_BROWSER_CHROMEOS_ARC_SESSION_ARC_PLAY_STORE_ENABLED_PREFERENCE_HANDLER_H_
 
 #include <memory>
 
@@ -55,4 +55,4 @@
 
 }  // namespace arc
 
-#endif  // CHROME_BROWSER_CHROMEOS_ARC_ARC_PLAY_STORE_ENABLED_PREFERENCE_HANDLER_H_
+#endif  // CHROME_BROWSER_CHROMEOS_ARC_SESSION_ARC_PLAY_STORE_ENABLED_PREFERENCE_HANDLER_H_
diff --git a/chrome/browser/chromeos/arc/arc_play_store_enabled_preference_handler_unittest.cc b/chrome/browser/chromeos/arc/session/arc_play_store_enabled_preference_handler_unittest.cc
similarity index 97%
rename from chrome/browser/chromeos/arc/arc_play_store_enabled_preference_handler_unittest.cc
rename to chrome/browser/chromeos/arc/session/arc_play_store_enabled_preference_handler_unittest.cc
index 406f831..b1b31bcc 100644
--- a/chrome/browser/chromeos/arc/arc_play_store_enabled_preference_handler_unittest.cc
+++ b/chrome/browser/chromeos/arc/session/arc_play_store_enabled_preference_handler_unittest.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/chromeos/arc/arc_play_store_enabled_preference_handler.h"
+#include "chrome/browser/chromeos/arc/session/arc_play_store_enabled_preference_handler.h"
 
 #include <memory>
 #include <string>
@@ -11,8 +11,8 @@
 #include "base/command_line.h"
 #include "base/files/scoped_temp_dir.h"
 #include "base/run_loop.h"
-#include "chrome/browser/chromeos/arc/arc_session_manager.h"
 #include "chrome/browser/chromeos/arc/arc_util.h"
+#include "chrome/browser/chromeos/arc/session/arc_session_manager.h"
 #include "chrome/browser/chromeos/arc/test/arc_data_removed_waiter.h"
 #include "chrome/browser/chromeos/login/users/fake_chrome_user_manager.h"
 #include "chrome/browser/consent_auditor/consent_auditor_factory.h"
diff --git a/chrome/browser/chromeos/arc/arc_service_launcher.cc b/chrome/browser/chromeos/arc/session/arc_service_launcher.cc
similarity index 97%
rename from chrome/browser/chromeos/arc/arc_service_launcher.cc
rename to chrome/browser/chromeos/arc/session/arc_service_launcher.cc
index 7b52e7f..ad709ae 100644
--- a/chrome/browser/chromeos/arc/arc_service_launcher.cc
+++ b/chrome/browser/chromeos/arc/session/arc_service_launcher.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/chromeos/arc/arc_service_launcher.h"
+#include "chrome/browser/chromeos/arc/session/arc_service_launcher.h"
 
 #include <utility>
 
@@ -14,8 +14,6 @@
 #include "chrome/browser/apps/app_service/arc_apps_factory.h"
 #include "chrome/browser/chromeos/apps/apk_web_app_service.h"
 #include "chrome/browser/chromeos/arc/accessibility/arc_accessibility_helper_bridge.h"
-#include "chrome/browser/chromeos/arc/arc_play_store_enabled_preference_handler.h"
-#include "chrome/browser/chromeos/arc/arc_session_manager.h"
 #include "chrome/browser/chromeos/arc/arc_util.h"
 #include "chrome/browser/chromeos/arc/auth/arc_auth_service.h"
 #include "chrome/browser/chromeos/arc/bluetooth/arc_bluetooth_bridge.h"
@@ -41,6 +39,8 @@
 #include "chrome/browser/chromeos/arc/print_spooler/arc_print_spooler_bridge.h"
 #include "chrome/browser/chromeos/arc/process/arc_process_service.h"
 #include "chrome/browser/chromeos/arc/screen_capture/arc_screen_capture_bridge.h"
+#include "chrome/browser/chromeos/arc/session/arc_play_store_enabled_preference_handler.h"
+#include "chrome/browser/chromeos/arc/session/arc_session_manager.h"
 #include "chrome/browser/chromeos/arc/tracing/arc_app_performance_tracing.h"
 #include "chrome/browser/chromeos/arc/tracing/arc_tracing_bridge.h"
 #include "chrome/browser/chromeos/arc/tts/arc_tts_service.h"
diff --git a/chrome/browser/chromeos/arc/arc_service_launcher.h b/chrome/browser/chromeos/arc/session/arc_service_launcher.h
similarity index 91%
rename from chrome/browser/chromeos/arc/arc_service_launcher.h
rename to chrome/browser/chromeos/arc/session/arc_service_launcher.h
index 02660cb..d9251e05 100644
--- a/chrome/browser/chromeos/arc/arc_service_launcher.h
+++ b/chrome/browser/chromeos/arc/session/arc_service_launcher.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 CHROME_BROWSER_CHROMEOS_ARC_ARC_SERVICE_LAUNCHER_H_
-#define CHROME_BROWSER_CHROMEOS_ARC_ARC_SERVICE_LAUNCHER_H_
+#ifndef CHROME_BROWSER_CHROMEOS_ARC_SESSION_ARC_SERVICE_LAUNCHER_H_
+#define CHROME_BROWSER_CHROMEOS_ARC_SESSION_ARC_SERVICE_LAUNCHER_H_
 
 #include <memory>
 
@@ -70,4 +70,4 @@
 
 }  // namespace arc
 
-#endif  // CHROME_BROWSER_CHROMEOS_ARC_ARC_SERVICE_LAUNCHER_H_
+#endif  // CHROME_BROWSER_CHROMEOS_ARC_SESSION_ARC_SERVICE_LAUNCHER_H_
diff --git a/chrome/browser/chromeos/arc/arc_session_manager.cc b/chrome/browser/chromeos/arc/session/arc_session_manager.cc
similarity index 99%
rename from chrome/browser/chromeos/arc/arc_session_manager.cc
rename to chrome/browser/chromeos/arc/session/arc_session_manager.cc
index 9f9db38..2742271 100644
--- a/chrome/browser/chromeos/arc/arc_session_manager.cc
+++ b/chrome/browser/chromeos/arc/session/arc_session_manager.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/chromeos/arc/arc_session_manager.h"
+#include "chrome/browser/chromeos/arc/session/arc_session_manager.h"
 
 #include <string>
 #include <utility>
diff --git a/chrome/browser/chromeos/arc/arc_session_manager.h b/chrome/browser/chromeos/arc/session/arc_session_manager.h
similarity index 98%
rename from chrome/browser/chromeos/arc/arc_session_manager.h
rename to chrome/browser/chromeos/arc/session/arc_session_manager.h
index d002e682..5ad9eb0 100644
--- a/chrome/browser/chromeos/arc/arc_session_manager.h
+++ b/chrome/browser/chromeos/arc/session/arc_session_manager.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 CHROME_BROWSER_CHROMEOS_ARC_ARC_SESSION_MANAGER_H_
-#define CHROME_BROWSER_CHROMEOS_ARC_ARC_SESSION_MANAGER_H_
+#ifndef CHROME_BROWSER_CHROMEOS_ARC_SESSION_ARC_SESSION_MANAGER_H_
+#define CHROME_BROWSER_CHROMEOS_ARC_SESSION_ARC_SESSION_MANAGER_H_
 
 #include <memory>
 #include <ostream>
@@ -396,4 +396,4 @@
 
 }  // namespace arc
 
-#endif  // CHROME_BROWSER_CHROMEOS_ARC_ARC_SESSION_MANAGER_H_
+#endif  // CHROME_BROWSER_CHROMEOS_ARC_SESSION_ARC_SESSION_MANAGER_H_
diff --git a/chrome/browser/chromeos/arc/arc_session_manager_browsertest.cc b/chrome/browser/chromeos/arc/session/arc_session_manager_browsertest.cc
similarity index 98%
rename from chrome/browser/chromeos/arc/arc_session_manager_browsertest.cc
rename to chrome/browser/chromeos/arc/session/arc_session_manager_browsertest.cc
index a0800fee6..43c457b 100644
--- a/chrome/browser/chromeos/arc/arc_session_manager_browsertest.cc
+++ b/chrome/browser/chromeos/arc/session/arc_session_manager_browsertest.cc
@@ -16,9 +16,9 @@
 #include "base/strings/stringprintf.h"
 #include "base/time/time.h"
 #include "chrome/browser/browser_process.h"
-#include "chrome/browser/chromeos/arc/arc_service_launcher.h"
-#include "chrome/browser/chromeos/arc/arc_session_manager.h"
 #include "chrome/browser/chromeos/arc/arc_util.h"
+#include "chrome/browser/chromeos/arc/session/arc_service_launcher.h"
+#include "chrome/browser/chromeos/arc/session/arc_session_manager.h"
 #include "chrome/browser/chromeos/arc/test/arc_data_removed_waiter.h"
 #include "chrome/browser/chromeos/certificate_provider/certificate_provider_service.h"
 #include "chrome/browser/chromeos/certificate_provider/certificate_provider_service_factory.h"
diff --git a/chrome/browser/chromeos/arc/arc_session_manager_unittest.cc b/chrome/browser/chromeos/arc/session/arc_session_manager_unittest.cc
similarity index 99%
rename from chrome/browser/chromeos/arc/arc_session_manager_unittest.cc
rename to chrome/browser/chromeos/arc/session/arc_session_manager_unittest.cc
index 2b05ed9f..12bd43a 100644
--- a/chrome/browser/chromeos/arc/arc_session_manager_unittest.cc
+++ b/chrome/browser/chromeos/arc/session/arc_session_manager_unittest.cc
@@ -20,10 +20,10 @@
 #include "base/test/scoped_feature_list.h"
 #include "base/values.h"
 #include "chrome/browser/chromeos/arc/arc_optin_uma.h"
-#include "chrome/browser/chromeos/arc/arc_play_store_enabled_preference_handler.h"
-#include "chrome/browser/chromeos/arc/arc_session_manager.h"
 #include "chrome/browser/chromeos/arc/arc_util.h"
 #include "chrome/browser/chromeos/arc/optin/arc_terms_of_service_oobe_negotiator.h"
+#include "chrome/browser/chromeos/arc/session/arc_play_store_enabled_preference_handler.h"
+#include "chrome/browser/chromeos/arc/session/arc_session_manager.h"
 #include "chrome/browser/chromeos/arc/test/arc_data_removed_waiter.h"
 #include "chrome/browser/chromeos/login/ui/fake_login_display_host.h"
 #include "chrome/browser/chromeos/login/users/fake_chrome_user_manager.h"
diff --git a/chrome/browser/chromeos/arc/test/arc_data_removed_waiter.h b/chrome/browser/chromeos/arc/test/arc_data_removed_waiter.h
index 2dfd804..6e85601a 100644
--- a/chrome/browser/chromeos/arc/test/arc_data_removed_waiter.h
+++ b/chrome/browser/chromeos/arc/test/arc_data_removed_waiter.h
@@ -8,7 +8,7 @@
 #include <memory>
 
 #include "base/macros.h"
-#include "chrome/browser/chromeos/arc/arc_session_manager.h"
+#include "chrome/browser/chromeos/arc/session/arc_session_manager.h"
 
 namespace base {
 class RunLoop;
diff --git a/chrome/browser/chromeos/chrome_browser_main_chromeos.cc b/chrome/browser/chromeos/chrome_browser_main_chromeos.cc
index 573dc08..ea21add 100644
--- a/chrome/browser/chromeos/chrome_browser_main_chromeos.cc
+++ b/chrome/browser/chromeos/chrome_browser_main_chromeos.cc
@@ -40,7 +40,7 @@
 #include "chrome/browser/chromeos/app_mode/kiosk_app_launch_error.h"
 #include "chrome/browser/chromeos/app_mode/kiosk_app_manager.h"
 #include "chrome/browser/chromeos/app_mode/kiosk_mode_idle_app_name_notification.h"
-#include "chrome/browser/chromeos/arc/arc_service_launcher.h"
+#include "chrome/browser/chromeos/arc/session/arc_service_launcher.h"
 #include "chrome/browser/chromeos/boot_times_recorder.h"
 #include "chrome/browser/chromeos/crostini/crostini_unsupported_action_notifier.h"
 #include "chrome/browser/chromeos/crostini/crosvm_metrics.h"
diff --git a/chrome/browser/chromeos/dbus/libvda_service_provider.cc b/chrome/browser/chromeos/dbus/libvda_service_provider.cc
index ad05658..855acc7 100644
--- a/chrome/browser/chromeos/dbus/libvda_service_provider.cc
+++ b/chrome/browser/chromeos/dbus/libvda_service_provider.cc
@@ -8,7 +8,7 @@
 #include <utility>
 
 #include "base/bind.h"
-#include "chrome/browser/chromeos/arc/arc_session_manager.h"
+#include "chrome/browser/chromeos/arc/session/arc_session_manager.h"
 #include "chrome/browser/chromeos/arc/video/gpu_arc_video_service_host.h"
 #include "chrome/browser/profiles/profile.h"
 #include "dbus/bus.h"
diff --git a/chrome/browser/chromeos/dbus/virtual_file_request_service_provider.cc b/chrome/browser/chromeos/dbus/virtual_file_request_service_provider.cc
index 43f7481..137ef9f 100644
--- a/chrome/browser/chromeos/dbus/virtual_file_request_service_provider.cc
+++ b/chrome/browser/chromeos/dbus/virtual_file_request_service_provider.cc
@@ -12,8 +12,8 @@
 
 #include "base/bind.h"
 #include "base/files/scoped_file.h"
-#include "chrome/browser/chromeos/arc/arc_session_manager.h"
 #include "chrome/browser/chromeos/arc/fileapi/arc_file_system_bridge.h"
+#include "chrome/browser/chromeos/arc/session/arc_session_manager.h"
 #include "chrome/browser/profiles/profile.h"
 #include "dbus/message.h"
 #include "third_party/cros_system_api/dbus/service_constants.h"
diff --git a/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc b/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc
index 0fc0d91..8bc59f0d 100644
--- a/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc
+++ b/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc
@@ -41,8 +41,8 @@
 #include "chrome/browser/apps/app_service/app_service_proxy.h"
 #include "chrome/browser/apps/app_service/app_service_proxy_factory.h"
 #include "chrome/browser/browser_process.h"
-#include "chrome/browser/chromeos/arc/arc_session_manager.h"
 #include "chrome/browser/chromeos/arc/arc_util.h"
+#include "chrome/browser/chromeos/arc/session/arc_session_manager.h"
 #include "chrome/browser/chromeos/assistant/assistant_util.h"
 #include "chrome/browser/chromeos/crostini/crostini_export_import.h"
 #include "chrome/browser/chromeos/crostini/crostini_installer.h"
diff --git a/chrome/browser/chromeos/extensions/autotest_private/autotest_private_apitest.cc b/chrome/browser/chromeos/extensions/autotest_private/autotest_private_apitest.cc
index 9dbea84..3ac9eb4 100644
--- a/chrome/browser/chromeos/extensions/autotest_private/autotest_private_apitest.cc
+++ b/chrome/browser/chromeos/extensions/autotest_private/autotest_private_apitest.cc
@@ -5,8 +5,8 @@
 #include "base/macros.h"
 
 #include "build/build_config.h"
-#include "chrome/browser/chromeos/arc/arc_session_manager.h"
 #include "chrome/browser/chromeos/arc/arc_util.h"
+#include "chrome/browser/chromeos/arc/session/arc_session_manager.h"
 #include "chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.h"
 #include "chrome/browser/extensions/extension_apitest.h"
 #include "chrome/browser/ui/app_list/arc/arc_app_list_prefs.h"
diff --git a/chrome/browser/chromeos/file_manager/volume_manager.h b/chrome/browser/chromeos/file_manager/volume_manager.h
index 4587bd1..fecd3cb 100644
--- a/chrome/browser/chromeos/file_manager/volume_manager.h
+++ b/chrome/browser/chromeos/file_manager/volume_manager.h
@@ -16,7 +16,7 @@
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
 #include "base/observer_list.h"
-#include "chrome/browser/chromeos/arc/arc_session_manager.h"
+#include "chrome/browser/chromeos/arc/session/arc_session_manager.h"
 #include "chrome/browser/chromeos/drive/drive_integration_service.h"
 #include "chrome/browser/chromeos/file_manager/documents_provider_root_manager.h"
 #include "chrome/browser/chromeos/file_system_provider/icon_set.h"
diff --git a/chrome/browser/chromeos/lock_screen_apps/app_manager_impl_unittest.cc b/chrome/browser/chromeos/lock_screen_apps/app_manager_impl_unittest.cc
index f05b659..fabb7ae 100644
--- a/chrome/browser/chromeos/lock_screen_apps/app_manager_impl_unittest.cc
+++ b/chrome/browser/chromeos/lock_screen_apps/app_manager_impl_unittest.cc
@@ -18,7 +18,7 @@
 #include "base/test/scoped_command_line.h"
 #include "base/test/simple_test_tick_clock.h"
 #include "base/values.h"
-#include "chrome/browser/chromeos/arc/arc_session_manager.h"
+#include "chrome/browser/chromeos/arc/session/arc_session_manager.h"
 #include "chrome/browser/chromeos/lock_screen_apps/fake_lock_screen_profile_creator.h"
 #include "chrome/browser/chromeos/login/users/scoped_test_user_manager.h"
 #include "chrome/browser/chromeos/note_taking_helper.h"
diff --git a/chrome/browser/chromeos/lock_screen_apps/lock_screen_profile_creator_impl_unittest.cc b/chrome/browser/chromeos/lock_screen_apps/lock_screen_profile_creator_impl_unittest.cc
index 8d7943b6..ccd7410 100644
--- a/chrome/browser/chromeos/lock_screen_apps/lock_screen_profile_creator_impl_unittest.cc
+++ b/chrome/browser/chromeos/lock_screen_apps/lock_screen_profile_creator_impl_unittest.cc
@@ -17,7 +17,7 @@
 #include "base/run_loop.h"
 #include "base/test/metrics/histogram_tester.h"
 #include "base/test/simple_test_tick_clock.h"
-#include "chrome/browser/chromeos/arc/arc_session_manager.h"
+#include "chrome/browser/chromeos/arc/session/arc_session_manager.h"
 #include "chrome/browser/chromeos/login/users/scoped_test_user_manager.h"
 #include "chrome/browser/chromeos/note_taking_helper.h"
 #include "chrome/browser/chromeos/profiles/profile_helper.h"
diff --git a/chrome/browser/chromeos/lock_screen_apps/state_controller_unittest.cc b/chrome/browser/chromeos/lock_screen_apps/state_controller_unittest.cc
index ab0e18f..1bfe869 100644
--- a/chrome/browser/chromeos/lock_screen_apps/state_controller_unittest.cc
+++ b/chrome/browser/chromeos/lock_screen_apps/state_controller_unittest.cc
@@ -20,7 +20,7 @@
 #include "base/test/scoped_command_line.h"
 #include "base/test/simple_test_tick_clock.h"
 #include "base/time/time.h"
-#include "chrome/browser/chromeos/arc/arc_session_manager.h"
+#include "chrome/browser/chromeos/arc/session/arc_session_manager.h"
 #include "chrome/browser/chromeos/lock_screen_apps/app_manager.h"
 #include "chrome/browser/chromeos/lock_screen_apps/fake_lock_screen_profile_creator.h"
 #include "chrome/browser/chromeos/lock_screen_apps/first_app_run_toast_manager.h"
diff --git a/chrome/browser/chromeos/login/arc_terms_of_service_browsertest.cc b/chrome/browser/chromeos/login/arc_terms_of_service_browsertest.cc
index ba917309..5052c5a 100644
--- a/chrome/browser/chromeos/login/arc_terms_of_service_browsertest.cc
+++ b/chrome/browser/chromeos/login/arc_terms_of_service_browsertest.cc
@@ -6,8 +6,8 @@
 #include "base/command_line.h"
 #include "base/guid.h"
 #include "base/hash/sha1.h"
-#include "chrome/browser/chromeos/arc/arc_service_launcher.h"
 #include "chrome/browser/chromeos/arc/arc_util.h"
+#include "chrome/browser/chromeos/arc/session/arc_service_launcher.h"
 #include "chrome/browser/chromeos/login/login_wizard.h"
 #include "chrome/browser/chromeos/login/oobe_screen.h"
 #include "chrome/browser/chromeos/login/screens/arc_terms_of_service_screen.h"
diff --git a/chrome/browser/chromeos/login/oobe_interactive_ui_test.cc b/chrome/browser/chromeos/login/oobe_interactive_ui_test.cc
index 81c5b5b4..bbdeb7a 100644
--- a/chrome/browser/chromeos/login/oobe_interactive_ui_test.cc
+++ b/chrome/browser/chromeos/login/oobe_interactive_ui_test.cc
@@ -17,8 +17,8 @@
 #include "build/buildflag.h"
 #include "chrome/browser/chrome_browser_main.h"
 #include "chrome/browser/chrome_browser_main_extra_parts.h"
-#include "chrome/browser/chromeos/arc/arc_service_launcher.h"
-#include "chrome/browser/chromeos/arc/arc_session_manager.h"
+#include "chrome/browser/chromeos/arc/session/arc_service_launcher.h"
+#include "chrome/browser/chromeos/arc/session/arc_session_manager.h"
 #include "chrome/browser/chromeos/extensions/quick_unlock_private/quick_unlock_private_api.h"
 #include "chrome/browser/chromeos/login/quick_unlock/quick_unlock_utils.h"
 #include "chrome/browser/chromeos/login/screens/recommend_apps/recommend_apps_fetcher.h"
diff --git a/chrome/browser/chromeos/login/screens/supervision_transition_screen_browsertest.cc b/chrome/browser/chromeos/login/screens/supervision_transition_screen_browsertest.cc
index cc75e327..aec86c5 100644
--- a/chrome/browser/chromeos/login/screens/supervision_transition_screen_browsertest.cc
+++ b/chrome/browser/chromeos/login/screens/supervision_transition_screen_browsertest.cc
@@ -8,9 +8,9 @@
 #include "ash/public/cpp/login_screen_test_api.h"
 #include "base/run_loop.h"
 #include "base/timer/timer.h"
-#include "chrome/browser/chromeos/arc/arc_service_launcher.h"
-#include "chrome/browser/chromeos/arc/arc_session_manager.h"
 #include "chrome/browser/chromeos/arc/arc_util.h"
+#include "chrome/browser/chromeos/arc/session/arc_service_launcher.h"
+#include "chrome/browser/chromeos/arc/session/arc_session_manager.h"
 #include "chrome/browser/chromeos/login/test/js_checker.h"
 #include "chrome/browser/chromeos/login/test/oobe_screen_waiter.h"
 #include "chrome/browser/chromeos/login/ui/login_display_host.h"
diff --git a/chrome/browser/chromeos/login/session/chrome_session_manager.cc b/chrome/browser/chromeos/login/session/chrome_session_manager.cc
index a72a50c9..a309d33 100644
--- a/chrome/browser/chromeos/login/session/chrome_session_manager.cc
+++ b/chrome/browser/chromeos/login/session/chrome_session_manager.cc
@@ -15,7 +15,7 @@
 #include "chrome/browser/chromeos/app_mode/arc/arc_kiosk_app_manager.h"
 #include "chrome/browser/chromeos/app_mode/kiosk_app_launch_error.h"
 #include "chrome/browser/chromeos/app_mode/kiosk_app_manager.h"
-#include "chrome/browser/chromeos/arc/arc_service_launcher.h"
+#include "chrome/browser/chromeos/arc/session/arc_service_launcher.h"
 #include "chrome/browser/chromeos/boot_times_recorder.h"
 #include "chrome/browser/chromeos/child_accounts/consumer_status_reporting_service_factory.h"
 #include "chrome/browser/chromeos/child_accounts/screen_time_controller_factory.h"
diff --git a/chrome/browser/chromeos/login/session/user_session_manager.cc b/chrome/browser/chromeos/login/session/user_session_manager.cc
index c9bfbb2..0075785 100644
--- a/chrome/browser/chromeos/login/session/user_session_manager.cc
+++ b/chrome/browser/chromeos/login/session/user_session_manager.cc
@@ -39,8 +39,8 @@
 #include "chrome/browser/chromeos/account_manager/account_manager_migrator.h"
 #include "chrome/browser/chromeos/account_manager/account_manager_util.h"
 #include "chrome/browser/chromeos/arc/arc_migration_guide_notification.h"
-#include "chrome/browser/chromeos/arc/arc_service_launcher.h"
 #include "chrome/browser/chromeos/arc/arc_util.h"
+#include "chrome/browser/chromeos/arc/session/arc_service_launcher.h"
 #include "chrome/browser/chromeos/base/locale_util.h"
 #include "chrome/browser/chromeos/boot_times_recorder.h"
 #include "chrome/browser/chromeos/child_accounts/child_policy_observer.h"
diff --git a/chrome/browser/chromeos/note_taking_helper.h b/chrome/browser/chromeos/note_taking_helper.h
index 489980f..e2f087c5 100644
--- a/chrome/browser/chromeos/note_taking_helper.h
+++ b/chrome/browser/chromeos/note_taking_helper.h
@@ -15,7 +15,7 @@
 #include "base/observer_list.h"
 #include "base/optional.h"
 #include "base/scoped_observer.h"
-#include "chrome/browser/chromeos/arc/arc_session_manager.h"
+#include "chrome/browser/chromeos/arc/session/arc_session_manager.h"
 #include "chrome/browser/profiles/profile_manager_observer.h"
 #include "components/arc/intent_helper/arc_intent_helper_observer.h"
 #include "components/arc/mojom/intent_helper.mojom.h"
diff --git a/chrome/browser/chromeos/policy/external_data_handlers/device_native_printers_external_data_handler.cc b/chrome/browser/chromeos/policy/external_data_handlers/device_native_printers_external_data_handler.cc
index 46cad2a..84a5e6a 100644
--- a/chrome/browser/chromeos/policy/external_data_handlers/device_native_printers_external_data_handler.cc
+++ b/chrome/browser/chromeos/policy/external_data_handlers/device_native_printers_external_data_handler.cc
@@ -16,8 +16,7 @@
 namespace {
 
 base::WeakPtr<chromeos::BulkPrintersCalculator> GetBulkPrintersCalculator() {
-  return chromeos::BulkPrintersCalculatorFactory::Get()->GetForDevice(
-      /*create_if_not_exists=*/true);
+  return chromeos::BulkPrintersCalculatorFactory::Get()->GetForDevice();
 }
 
 }  // namespace
diff --git a/chrome/browser/chromeos/policy/external_data_handlers/device_native_printers_external_data_handler_unittest.cc b/chrome/browser/chromeos/policy/external_data_handlers/device_native_printers_external_data_handler_unittest.cc
index 5e3893e..7e2ca52 100644
--- a/chrome/browser/chromeos/policy/external_data_handlers/device_native_printers_external_data_handler_unittest.cc
+++ b/chrome/browser/chromeos/policy/external_data_handlers/device_native_printers_external_data_handler_unittest.cc
@@ -74,7 +74,7 @@
         std::make_unique<DeviceNativePrintersExternalDataHandler>(
             &policy_service_);
     external_printers_ =
-        chromeos::BulkPrintersCalculatorFactory::Get()->GetForDevice(true);
+        chromeos::BulkPrintersCalculatorFactory::Get()->GetForDevice();
     external_printers_->SetAccessMode(
         chromeos::BulkPrintersCalculator::ALL_ACCESS);
   }
diff --git a/chrome/browser/chromeos/policy/external_data_handlers/native_printers_external_data_handler.cc b/chrome/browser/chromeos/policy/external_data_handlers/native_printers_external_data_handler.cc
index c6a1734..db5ed4c 100644
--- a/chrome/browser/chromeos/policy/external_data_handlers/native_printers_external_data_handler.cc
+++ b/chrome/browser/chromeos/policy/external_data_handlers/native_printers_external_data_handler.cc
@@ -19,8 +19,7 @@
 base::WeakPtr<chromeos::BulkPrintersCalculator> GetBulkPrintersCalculator(
     const std::string& user_id) {
   return chromeos::BulkPrintersCalculatorFactory::Get()->GetForAccountId(
-      CloudExternalDataPolicyHandler::GetAccountId(user_id),
-      /*create_if_not_exists=*/true);
+      CloudExternalDataPolicyHandler::GetAccountId(user_id));
 }
 
 }  // namespace
diff --git a/chrome/browser/chromeos/policy/lock_to_single_user_manager.h b/chrome/browser/chromeos/policy/lock_to_single_user_manager.h
index cb41811..e8ee289 100644
--- a/chrome/browser/chromeos/policy/lock_to_single_user_manager.h
+++ b/chrome/browser/chromeos/policy/lock_to_single_user_manager.h
@@ -9,7 +9,7 @@
 #include "base/memory/weak_ptr.h"
 #include "base/optional.h"
 #include "base/scoped_observer.h"
-#include "chrome/browser/chromeos/arc/arc_session_manager.h"
+#include "chrome/browser/chromeos/arc/session/arc_session_manager.h"
 #include "chromeos/dbus/cryptohome/rpc.pb.h"
 #include "components/user_manager/user_manager.h"
 
diff --git a/chrome/browser/chromeos/policy/lock_to_single_user_manager_unittest.cc b/chrome/browser/chromeos/policy/lock_to_single_user_manager_unittest.cc
index 9ce6bf7..3ea9100 100644
--- a/chrome/browser/chromeos/policy/lock_to_single_user_manager_unittest.cc
+++ b/chrome/browser/chromeos/policy/lock_to_single_user_manager_unittest.cc
@@ -8,7 +8,7 @@
 
 #include "base/macros.h"
 #include "base/memory/ptr_util.h"
-#include "chrome/browser/chromeos/arc/arc_session_manager.h"
+#include "chrome/browser/chromeos/arc/session/arc_session_manager.h"
 #include "chrome/browser/chromeos/login/users/fake_chrome_user_manager.h"
 #include "chrome/browser/chromeos/settings/device_settings_service.h"
 #include "chrome/browser/chromeos/settings/scoped_testing_cros_settings.h"
diff --git a/chrome/browser/chromeos/policy/unaffiliated_arc_allowed_browsertest.cc b/chrome/browser/chromeos/policy/unaffiliated_arc_allowed_browsertest.cc
index d34d10c0..501c3fe 100644
--- a/chrome/browser/chromeos/policy/unaffiliated_arc_allowed_browsertest.cc
+++ b/chrome/browser/chromeos/policy/unaffiliated_arc_allowed_browsertest.cc
@@ -9,8 +9,8 @@
 #include "base/macros.h"
 #include "base/run_loop.h"
 #include "base/threading/thread_task_runner_handle.h"
-#include "chrome/browser/chromeos/arc/arc_session_manager.h"
 #include "chrome/browser/chromeos/arc/arc_util.h"
+#include "chrome/browser/chromeos/arc/session/arc_session_manager.h"
 #include "chrome/browser/chromeos/login/ui/login_display_host.h"
 #include "chrome/browser/chromeos/policy/affiliation_test_helper.h"
 #include "chrome/browser/chromeos/policy/device_policy_builder.h"
diff --git a/chrome/browser/chromeos/printing/bulk_printers_calculator_factory.cc b/chrome/browser/chromeos/printing/bulk_printers_calculator_factory.cc
index d0d2283..fd0fbba 100644
--- a/chrome/browser/chromeos/printing/bulk_printers_calculator_factory.cc
+++ b/chrome/browser/chromeos/printing/bulk_printers_calculator_factory.cc
@@ -20,27 +20,23 @@
 }
 
 base::WeakPtr<BulkPrintersCalculator>
-BulkPrintersCalculatorFactory::GetForAccountId(const AccountId& account_id,
-                                               bool create_if_not_exists) {
+BulkPrintersCalculatorFactory::GetForAccountId(const AccountId& account_id) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   auto it = printers_by_user_.find(account_id);
   if (it != printers_by_user_.end())
     return it->second->AsWeakPtr();
-  if (!create_if_not_exists)
-    return nullptr;
   printers_by_user_.emplace(account_id, BulkPrintersCalculator::Create());
   return printers_by_user_[account_id]->AsWeakPtr();
 }
 
 base::WeakPtr<BulkPrintersCalculator>
-BulkPrintersCalculatorFactory::GetForProfile(Profile* profile,
-                                             bool create_if_not_exists) {
+BulkPrintersCalculatorFactory::GetForProfile(Profile* profile) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   const user_manager::User* user =
       ProfileHelper::Get()->GetUserByProfile(profile);
   if (!user)
     return nullptr;
-  return GetForAccountId(user->GetAccountId(), create_if_not_exists);
+  return GetForAccountId(user->GetAccountId());
 }
 
 void BulkPrintersCalculatorFactory::RemoveForUserId(
@@ -50,12 +46,10 @@
 }
 
 base::WeakPtr<BulkPrintersCalculator>
-BulkPrintersCalculatorFactory::GetForDevice(bool create_if_not_exists) {
+BulkPrintersCalculatorFactory::GetForDevice() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   if (device_printers_)
     return device_printers_->AsWeakPtr();
-  if (!create_if_not_exists)
-    return nullptr;
   device_printers_ = BulkPrintersCalculator::Create();
   return device_printers_->AsWeakPtr();
 }
diff --git a/chrome/browser/chromeos/printing/bulk_printers_calculator_factory.h b/chrome/browser/chromeos/printing/bulk_printers_calculator_factory.h
index 00af1c1..a30cc0a 100644
--- a/chrome/browser/chromeos/printing/bulk_printers_calculator_factory.h
+++ b/chrome/browser/chromeos/printing/bulk_printers_calculator_factory.h
@@ -30,32 +30,24 @@
 
   // Returns a WeakPtr to the BulkPrintersCalculator registered for
   // |account_id|.
-  // If requested BulkPrintersCalculator does not exist, the output depends on
-  // the given parameter |create_if_not_exists|. If it is true, the object is
-  // created and registered, otherwise nullptr is returned.
-  // The returned object remains valid until RemoveForUserId or Shutdown is
-  // called.
+  // If requested BulkPrintersCalculator does not exist, the object is
+  // created and registered. The returned object remains valid until
+  // RemoveForUserId or Shutdown is called.
   base::WeakPtr<BulkPrintersCalculator> GetForAccountId(
-      const AccountId& account_id,
-      bool create_if_not_exists);
+      const AccountId& account_id);
 
   // Returns a WeakPtr to the BulkPrintersCalculator registered for |profile|
   // which could be nullptr if |profile| does not map to a valid AccountId.
-  // If requested BulkPrintersCalculator does not exist, the output depends on
-  // the given parameter |create_if_not_exists|. If it is true, the object is
-  // created and registered, otherwise nullptr is returned.
-  // The returned object remains valid until RemoveForUserId or Shutdown is
-  // called.
-  base::WeakPtr<BulkPrintersCalculator> GetForProfile(
-      Profile* profile,
-      bool create_if_not_exists);
+  // If requested BulkPrintersCalculator does not exist, the object is
+  // created and registered. The returned object remains valid until
+  // RemoveForUserId or Shutdown is called.
+  base::WeakPtr<BulkPrintersCalculator> GetForProfile(Profile* profile);
 
   // Returns a WeakPtr to the BulkPrintersCalculator registered for the device.
-  // If requested BulkPrintersCalculator does not exist, the output depends on
-  // the given parameter |create_if_not_exists|. If it is true, the object is
-  // created and registered, otherwise nullptr is returned.
-  // The returned object remains valid until Shutdown is called.
-  base::WeakPtr<BulkPrintersCalculator> GetForDevice(bool create_if_not_exists);
+  // If requested BulkPrintersCalculator does not exist, the object is
+  // created and registered. The returned object remains valid until Shutdown is
+  // called.
+  base::WeakPtr<BulkPrintersCalculator> GetForDevice();
 
   // Deletes the BulkPrintersCalculator registered for |account_id|.
   void RemoveForUserId(const AccountId& account_id);
diff --git a/chrome/browser/chromeos/printing/calculators_policies_binder.cc b/chrome/browser/chromeos/printing/calculators_policies_binder.cc
index 3577ed92..8a5f474 100644
--- a/chrome/browser/chromeos/printing/calculators_policies_binder.cc
+++ b/chrome/browser/chromeos/printing/calculators_policies_binder.cc
@@ -60,8 +60,7 @@
       : settings_(settings), profile_(profile) {
     pref_change_registrar_.Init(profile->GetPrefs());
     // Bind device policies to corresponding instance of BulkPrintersCalculator.
-    device_printers_ = BulkPrintersCalculatorFactory::Get()->GetForDevice(
-        /*create_if_not_exists=*/false);
+    device_printers_ = BulkPrintersCalculatorFactory::Get()->GetForDevice();
     if (device_printers_ && ++(BindingsCount()[device_printers_.get()]) == 1) {
       BindSettings(kDeviceNativePrintersAccessMode,
                    &CalculatorsPoliciesBinderImpl::UpdateDeviceAccessMode);
@@ -71,9 +70,8 @@
                    &CalculatorsPoliciesBinderImpl::UpdateDeviceWhitelist);
     }
     // Bind user policies to corresponding instance of BulkPrintersCalculator.
-    user_printers_ = BulkPrintersCalculatorFactory::Get()->GetForProfile(
-        profile,
-        /*create_if_not_exists=*/false);
+    user_printers_ =
+        BulkPrintersCalculatorFactory::Get()->GetForProfile(profile);
     if (user_printers_ && ++(BindingsCount()[user_printers_.get()]) == 1) {
       BindPref(prefs::kRecommendedNativePrintersAccessMode,
                &CalculatorsPoliciesBinderImpl::UpdateUserAccessMode);
diff --git a/chrome/browser/chromeos/printing/enterprise_printers_provider.cc b/chrome/browser/chromeos/printing/enterprise_printers_provider.cc
index 9610922..d96fb78 100644
--- a/chrome/browser/chromeos/printing/enterprise_printers_provider.cc
+++ b/chrome/browser/chromeos/printing/enterprise_printers_provider.cc
@@ -49,16 +49,14 @@
     // Binds instances of BulkPrintersCalculator to policies.
     policies_binder_ = CalculatorsPoliciesBinder::Create(settings, profile);
     // Get instance of BulkPrintersCalculator for device policies.
-    device_printers_ = BulkPrintersCalculatorFactory::Get()->GetForDevice(
-        /*create_if_not_exists=*/false);
+    device_printers_ = BulkPrintersCalculatorFactory::Get()->GetForDevice();
     if (device_printers_) {
       device_printers_->AddObserver(this);
       RecalculateCompleteFlagForDevicePrinters();
     }
     // Get instance of BulkPrintersCalculator for user policies.
-    user_printers_ = BulkPrintersCalculatorFactory::Get()->GetForProfile(
-        profile,
-        /*create_if_not_exists=*/false);
+    user_printers_ =
+        BulkPrintersCalculatorFactory::Get()->GetForProfile(profile);
     if (user_printers_) {
       user_printers_->AddObserver(this);
       RecalculateCompleteFlagForUserPrinters();
diff --git a/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_api_unittest.cc b/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_api_unittest.cc
index bafb52e..fdbd0c3 100644
--- a/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_api_unittest.cc
+++ b/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_api_unittest.cc
@@ -101,7 +101,7 @@
   TestingBrowserProcess::GetGlobal()->SetSafeBrowsingService(
       safe_browsing_service);
   g_browser_process->safe_browsing_service()->Initialize();
-  safe_browsing_service->AddPrefService(profile()->GetPrefs());
+  safe_browsing_service->OnProfileAdded(profile());
 }
 
 void SafeBrowsingPrivateApiUnitTest::TearDown() {
diff --git a/chrome/browser/extensions/api/tabs/tabs_util_chromeos.cc b/chrome/browser/extensions/api/tabs/tabs_util_chromeos.cc
index 34f303f..9a4b177 100644
--- a/chrome/browser/extensions/api/tabs/tabs_util_chromeos.cc
+++ b/chrome/browser/extensions/api/tabs/tabs_util_chromeos.cc
@@ -9,8 +9,8 @@
 #include "ash/public/cpp/window_properties.h"
 #include "base/metrics/histogram_macros.h"
 #include "chrome/browser/chromeos/accessibility/accessibility_manager.h"
-#include "chrome/browser/chromeos/arc/arc_session_manager.h"
 #include "chrome/browser/chromeos/arc/arc_util.h"
+#include "chrome/browser/chromeos/arc/session/arc_session_manager.h"
 #include "chrome/browser/chromeos/assistant/assistant_util.h"
 #include "chrome/browser/ui/ash/chrome_screenshot_grabber.h"
 #include "chrome/browser/ui/browser.h"
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
index b4a42dd..ba1e866 100644
--- a/chrome/browser/flag-metadata.json
+++ b/chrome/browser/flag-metadata.json
@@ -944,6 +944,11 @@
     "expiry_milestone": 76
   },
   {
+    "name": "enable-aura-tooltips-on-windows",
+    "owners": [ "cliffsmo" ],
+    "expiry_milestone": 78
+  },
+  {
     "name": "enable-autofill-account-wallet-storage",
     "owners": [ "treib", "jsaul@google.com", "butter-team@google.com" ],
     "expiry_milestone": 81
@@ -3449,6 +3454,11 @@
     "expiry_milestone": 82
   },
   {
+    "name": "webxr-ar-dom-overlay",
+    "owners": [ "//third_party/blink/renderer/modules/xr/OWNERS", "xr-dev@chromium.org" ],
+    "expiry_milestone": 81
+  },
+  {
     "name": "webxr-ar-module",
     "owners": [ "//third_party/blink/renderer/modules/xr/OWNERS", "xr-dev@chromium.org" ],
     "expiry_milestone": 82
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index 64bf5c2..bfdf7fd 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -2266,6 +2266,10 @@
     "Enables access to Augmented Reality features defined in the WebXR AR "
     "Module";
 
+const char kWebXrArDOMOverlayName[] = "WebXR AR DOM Overlay";
+const char kWebXrArDOMOverlayDescription[] =
+    "Enables experimental use of a DOM overlay in WebXR AR sessions";
+
 const char kWebXrAnchorsName[] = "WebXR Anchors";
 const char kWebXrAnchorsDescription[] =
     "Enables access to anchors via WebXR API.";
@@ -3010,6 +3014,11 @@
 const char kD3D11VideoDecoderDescription[] =
     "Enables D3D11VideoDecoder for hardware accelerated video decoding.";
 
+const char kEnableAuraTooltipsOnWindowsName[] =
+    "Enable aura tooltips on Windows";
+const char kEnableAuraTooltipsOnWindowsDescription[] =
+    "Enables aura tooltips instead of the native comctl32 tooltips on Windows.";
+
 const char kEnableGpuAppcontainerName[] = "Enable GPU AppContainer Lockdown.";
 const char kEnableGpuAppcontainerDescription[] =
     "Enables the use of an AppContainer for the GPU sandboxed processes to "
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index 39689454..6079115 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -1333,6 +1333,9 @@
 extern const char kWebXrArModuleName[];
 extern const char kWebXrArModuleDescription[];
 
+extern const char kWebXrArDOMOverlayName[];
+extern const char kWebXrArDOMOverlayDescription[];
+
 extern const char kWebXrHitTestName[];
 extern const char kWebXrHitTestDescription[];
 
@@ -1765,6 +1768,9 @@
 extern const char kD3D11VideoDecoderName[];
 extern const char kD3D11VideoDecoderDescription[];
 
+extern const char kEnableAuraTooltipsOnWindowsName[];
+extern const char kEnableAuraTooltipsOnWindowsDescription[];
+
 extern const char kEnableGpuAppcontainerName[];
 extern const char kEnableGpuAppcontainerDescription[];
 
diff --git a/chrome/browser/installable/installable_ambient_badge_infobar_delegate.cc b/chrome/browser/installable/installable_ambient_badge_infobar_delegate.cc
index d973b28e..0ec1864 100644
--- a/chrome/browser/installable/installable_ambient_badge_infobar_delegate.cc
+++ b/chrome/browser/installable/installable_ambient_badge_infobar_delegate.cc
@@ -23,12 +23,14 @@
     base::WeakPtr<Client> weak_client,
     const base::string16& app_name,
     const SkBitmap& primary_icon,
+    const bool is_primary_icon_maskable,
     const GURL& start_url) {
   InfoBarService::FromWebContents(web_contents)
       ->AddInfoBar(std::make_unique<InstallableAmbientBadgeInfoBar>(
           std::unique_ptr<InstallableAmbientBadgeInfoBarDelegate>(
               new InstallableAmbientBadgeInfoBarDelegate(
-                  weak_client, app_name, primary_icon, start_url))));
+                  weak_client, app_name, primary_icon, is_primary_icon_maskable,
+                  start_url))));
 }
 
 void InstallableAmbientBadgeInfoBarDelegate::AddToHomescreen() {
@@ -58,15 +60,21 @@
   return primary_icon_;
 }
 
+bool InstallableAmbientBadgeInfoBarDelegate::GetIsPrimaryIconMaskable() const {
+  return is_primary_icon_maskable_;
+}
+
 InstallableAmbientBadgeInfoBarDelegate::InstallableAmbientBadgeInfoBarDelegate(
     base::WeakPtr<Client> weak_client,
     const base::string16& app_name,
     const SkBitmap& primary_icon,
+    const bool is_primary_icon_maskable,
     const GURL& start_url)
     : infobars::InfoBarDelegate(),
       weak_client_(weak_client),
       app_name_(app_name),
       primary_icon_(primary_icon),
+      is_primary_icon_maskable_(is_primary_icon_maskable),
       start_url_(start_url) {}
 
 infobars::InfoBarDelegate::InfoBarIdentifier
diff --git a/chrome/browser/installable/installable_ambient_badge_infobar_delegate.h b/chrome/browser/installable/installable_ambient_badge_infobar_delegate.h
index c78da41..9263cd1 100644
--- a/chrome/browser/installable/installable_ambient_badge_infobar_delegate.h
+++ b/chrome/browser/installable/installable_ambient_badge_infobar_delegate.h
@@ -39,17 +39,21 @@
                      base::WeakPtr<Client> weak_client,
                      const base::string16& app_name,
                      const SkBitmap& primary_icon,
+                     const bool is_primary_icon_maskable,
+
                      const GURL& start_url);
 
   void AddToHomescreen();
   const base::string16 GetMessageText() const;
   const SkBitmap& GetPrimaryIcon() const;
+  bool GetIsPrimaryIconMaskable() const;
   const GURL& GetUrl() const { return start_url_; }
 
  private:
   InstallableAmbientBadgeInfoBarDelegate(base::WeakPtr<Client> weak_client,
                                          const base::string16& app_name,
                                          const SkBitmap& primary_icon,
+                                         const bool is_primary_icon_maskable,
                                          const GURL& start_url);
 
   // InfoBarDelegate overrides:
@@ -59,6 +63,7 @@
   base::WeakPtr<Client> weak_client_;
   const base::string16 app_name_;
   const SkBitmap primary_icon_;
+  const bool is_primary_icon_maskable_;
   const GURL& start_url_;
 
   DISALLOW_COPY_AND_ASSIGN(InstallableAmbientBadgeInfoBarDelegate);
diff --git a/chrome/browser/lookalikes/safety_tips/reputation_web_contents_observer.cc b/chrome/browser/lookalikes/safety_tips/reputation_web_contents_observer.cc
index 2ef9247..24c87d33 100644
--- a/chrome/browser/lookalikes/safety_tips/reputation_web_contents_observer.cc
+++ b/chrome/browser/lookalikes/safety_tips/reputation_web_contents_observer.cc
@@ -44,6 +44,9 @@
       action_suffix = "DismissWithIgnore";
       warning_dismissed = true;
       break;
+    case safety_tips::SafetyTipInteraction::kLearnMore:
+      action_suffix = "LearnMore";
+      break;
   }
   if (warning_dismissed) {
     base::UmaHistogramCustomTimes(
diff --git a/chrome/browser/lookalikes/safety_tips/safety_tip_infobar_delegate.cc b/chrome/browser/lookalikes/safety_tips/safety_tip_infobar_delegate.cc
index 28147b3..89fb95d 100644
--- a/chrome/browser/lookalikes/safety_tips/safety_tip_infobar_delegate.cc
+++ b/chrome/browser/lookalikes/safety_tips/safety_tip_infobar_delegate.cc
@@ -119,6 +119,5 @@
 }
 
 base::string16 SafetyTipInfoBarDelegate::GetDescriptionText() const {
-  return l10n_util::GetStringUTF16(
-      GetSafetyTipDescriptionId(safety_tip_status_));
+  return GetSafetyTipDescription(safety_tip_status_, suggested_url_);
 }
diff --git a/chrome/browser/lookalikes/safety_tips/safety_tip_ui.h b/chrome/browser/lookalikes/safety_tips/safety_tip_ui.h
index baa3260..f34a9518 100644
--- a/chrome/browser/lookalikes/safety_tips/safety_tip_ui.h
+++ b/chrome/browser/lookalikes/safety_tips/safety_tip_ui.h
@@ -19,7 +19,7 @@
 // Represents the different user interactions with a Safety Tip dialog.
 //
 // These values are persisted to logs. Entries should not be renumbered and
-// numeric values should never be reused.
+// numeric values should never be reused. Keep in sync with SafetyTipStatus.
 enum class SafetyTipInteraction {
   // The user dismissed the safety tip. Every time the user dismisses the
   // dialog, a histogram will be recorded once with this value, and again with a
@@ -33,7 +33,9 @@
   kDismissWithEsc = 3,
   kDismissWithClose = 4,
   kDismissWithIgnore = 5,
-  kMaxValue = kDismissWithIgnore,
+  // The user clicked the 'learn more' button.
+  kLearnMore = 6,
+  kMaxValue = kLearnMore,
 };
 
 // Shows Safety Tip UI using the specified information if it is not already
diff --git a/chrome/browser/lookalikes/safety_tips/safety_tip_ui_helper.cc b/chrome/browser/lookalikes/safety_tips/safety_tip_ui_helper.cc
index ea1b25f..238f63e 100644
--- a/chrome/browser/lookalikes/safety_tips/safety_tip_ui_helper.cc
+++ b/chrome/browser/lookalikes/safety_tips/safety_tip_ui_helper.cc
@@ -7,6 +7,7 @@
 #include "base/metrics/histogram_functions.h"
 #include "build/build_config.h"
 #include "chrome/browser/ssl/security_state_tab_helper.h"
+#include "chrome/common/url_constants.h"
 #include "components/security_interstitials/core/common_string_util.h"
 #include "components/security_state/core/security_state.h"
 #include "components/strings/grit/components_strings.h"
@@ -40,6 +41,15 @@
   web_contents->OpenURL(params);
 }
 
+void OpenHelpCenter(content::WebContents* web_contents) {
+  RecordSafetyTipInteractionHistogram(web_contents,
+                                      SafetyTipInteraction::kLearnMore);
+  web_contents->OpenURL(content::OpenURLParams(
+      GURL(chrome::kSafetyTipHelpCenterURL), content::Referrer(),
+      WindowOpenDisposition::NEW_FOREGROUND_TAB, ui::PAGE_TRANSITION_LINK,
+      false /*is_renderer_initiated*/));
+}
+
 base::string16 GetSafetyTipTitle(
     security_state::SafetyTipStatus safety_tip_status,
     const GURL& url) {
@@ -48,10 +58,14 @@
       return l10n_util::GetStringUTF16(
           IDS_PAGE_INFO_SAFETY_TIP_BAD_REPUTATION_TITLE);
     case security_state::SafetyTipStatus::kLookalike:
+#if defined(OS_ANDROID)
+      return l10n_util::GetStringUTF16(IDS_SAFETY_TIP_ANDROID_LOOKALIKE_TITLE);
+#else
       return l10n_util::GetStringFUTF16(
           IDS_PAGE_INFO_SAFETY_TIP_LOOKALIKE_TITLE,
           security_interstitials::common_string_util::GetFormattedHostName(
               url));
+#endif
     case security_state::SafetyTipStatus::kUnknown:
     case security_state::SafetyTipStatus::kNone:
       NOTREACHED();
@@ -61,33 +75,36 @@
   return base::string16();
 }
 
-int GetSafetyTipDescriptionId(security_state::SafetyTipStatus warning_type) {
+base::string16 GetSafetyTipDescription(
+    security_state::SafetyTipStatus warning_type,
+    const GURL& url) {
   switch (warning_type) {
     case security_state::SafetyTipStatus::kBadReputation:
-      return IDS_PAGE_INFO_SAFETY_TIP_BAD_REPUTATION_DESCRIPTION;
+      return l10n_util::GetStringUTF16(
+          IDS_PAGE_INFO_SAFETY_TIP_BAD_REPUTATION_DESCRIPTION);
     case security_state::SafetyTipStatus::kLookalike:
-      return IDS_PAGE_INFO_SAFETY_TIP_LOOKALIKE_DESCRIPTION;
+      return l10n_util::GetStringFUTF16(
+          IDS_PAGE_INFO_SAFETY_TIP_LOOKALIKE_DESCRIPTION,
+          security_interstitials::common_string_util::GetFormattedHostName(
+              url));
     case security_state::SafetyTipStatus::kNone:
     case security_state::SafetyTipStatus::kUnknown:
       NOTREACHED();
-      return 0;
   }
   NOTREACHED();
-  return 0;
+  return base::string16();
 }
 
 int GetSafetyTipLeaveButtonId(security_state::SafetyTipStatus warning_type) {
   switch (warning_type) {
 #if defined(OS_ANDROID)
     case security_state::SafetyTipStatus::kBadReputation:
-      return IDS_SAFETY_TIP_ANDROID_LEAVE_BUTTON;
     case security_state::SafetyTipStatus::kLookalike:
-      return IDS_SAFETY_TIP_ANDROID_GO_TO_SITE_BUTTON;
+      return IDS_SAFETY_TIP_ANDROID_LEAVE_BUTTON;
 #else
     case security_state::SafetyTipStatus::kBadReputation:
-      return IDS_PAGE_INFO_SAFETY_TIP_LEAVE_BUTTON;
     case security_state::SafetyTipStatus::kLookalike:
-      return IDS_PAGE_INFO_SAFETY_TIP_GO_TO_SITE_BUTTON;
+      return IDS_PAGE_INFO_SAFETY_TIP_LEAVE_BUTTON;
 #endif
     case security_state::SafetyTipStatus::kUnknown:
     case security_state::SafetyTipStatus::kNone:
diff --git a/chrome/browser/lookalikes/safety_tips/safety_tip_ui_helper.h b/chrome/browser/lookalikes/safety_tips/safety_tip_ui_helper.h
index 7485d2d..483818e 100644
--- a/chrome/browser/lookalikes/safety_tips/safety_tip_ui_helper.h
+++ b/chrome/browser/lookalikes/safety_tips/safety_tip_ui_helper.h
@@ -24,16 +24,23 @@
 void RecordSafetyTipInteractionHistogram(content::WebContents* web_contents,
                                          SafetyTipInteraction interaction);
 
-// Invoke action when 'leave site' button is clicked, and records a histogram.
+// Invokes action when 'leave site' button is clicked, and records a histogram.
 // Navigates to a safe URL, replacing the current page in the process.
 void LeaveSite(content::WebContents* web_contents, const GURL& safe_url);
 
+// Invoke action when 'Learn more' button is clicked, and records a histogram.
+// Navigates to the help center URL.
+void OpenHelpCenter(content::WebContents* web_contents);
+
 // Get the titles, descriptions, and button strings or IDs needed to describe
 // the applicable warning type.  Handles both Android and desktop warnings.
-// |url| is used in formatting some strings.
+// |url| is the suggested URL to navigate to, and is used in formatting some
+// strings.
 base::string16 GetSafetyTipTitle(security_state::SafetyTipStatus warning_type,
                                  const GURL& url);
-int GetSafetyTipDescriptionId(security_state::SafetyTipStatus warning_type);
+base::string16 GetSafetyTipDescription(
+    security_state::SafetyTipStatus warning_type,
+    const GURL& url);
 int GetSafetyTipLeaveButtonId(security_state::SafetyTipStatus warning_type);
 
 }  // namespace safety_tips
diff --git a/chrome/browser/policy/policy_browsertest.cc b/chrome/browser/policy/policy_browsertest.cc
index f531072..d0a2d47 100644
--- a/chrome/browser/policy/policy_browsertest.cc
+++ b/chrome/browser/policy/policy_browsertest.cc
@@ -226,7 +226,7 @@
 #include "chrome/browser/chromeos/accessibility/accessibility_manager.h"
 #include "chrome/browser/chromeos/accessibility/magnification_manager.h"
 #include "chrome/browser/chromeos/accessibility/magnifier_type.h"
-#include "chrome/browser/chromeos/arc/arc_session_manager.h"
+#include "chrome/browser/chromeos/arc/session/arc_session_manager.h"
 #include "chrome/browser/chromeos/drive/drive_integration_service.h"
 #include "chrome/browser/chromeos/login/test/js_checker.h"
 #include "chrome/browser/chromeos/note_taking_helper.h"
diff --git a/chrome/browser/prefs/browser_prefs.cc b/chrome/browser/prefs/browser_prefs.cc
index fd5b9c66..09949f2d 100644
--- a/chrome/browser/prefs/browser_prefs.cc
+++ b/chrome/browser/prefs/browser_prefs.cc
@@ -238,8 +238,8 @@
 #include "ash/public/cpp/ash_prefs.h"
 #include "chrome/browser/chromeos/app_mode/arc/arc_kiosk_app_manager.h"
 #include "chrome/browser/chromeos/app_mode/kiosk_app_manager.h"
-#include "chrome/browser/chromeos/arc/arc_session_manager.h"
 #include "chrome/browser/chromeos/arc/policy/arc_policy_bridge.h"
+#include "chrome/browser/chromeos/arc/session/arc_session_manager.h"
 #include "chrome/browser/chromeos/child_accounts/parent_access_code/parent_access_service.h"
 #include "chrome/browser/chromeos/child_accounts/screen_time_controller.h"
 #include "chrome/browser/chromeos/crostini/crostini_pref_names.h"
diff --git a/chrome/browser/profiles/profile_impl.cc b/chrome/browser/profiles/profile_impl.cc
index ebadc1b..ecdc9b0 100644
--- a/chrome/browser/profiles/profile_impl.cc
+++ b/chrome/browser/profiles/profile_impl.cc
@@ -171,7 +171,7 @@
 #include "chrome/browser/chromeos/android_sms/android_sms_pairing_state_tracker_impl.h"
 #include "chrome/browser/chromeos/android_sms/android_sms_service_factory.h"
 #include "chrome/browser/chromeos/arc/accessibility/arc_accessibility_helper_bridge.h"
-#include "chrome/browser/chromeos/arc/arc_service_launcher.h"
+#include "chrome/browser/chromeos/arc/session/arc_service_launcher.h"
 #include "chrome/browser/chromeos/authpolicy/auth_policy_credentials_manager.h"
 #include "chrome/browser/chromeos/cryptauth/gcm_device_info_provider_impl.h"
 #include "chrome/browser/chromeos/device_sync/device_sync_client_factory.h"
diff --git a/chrome/browser/profiles/renderer_updater.cc b/chrome/browser/profiles/renderer_updater.cc
index e0e76c1a..07e6f8d 100644
--- a/chrome/browser/profiles/renderer_updater.cc
+++ b/chrome/browser/profiles/renderer_updater.cc
@@ -29,7 +29,8 @@
 
 #if BUILDFLAG(ENABLE_EXTENSIONS)
 
-// By default, JavaScript, images and autoplay are enabled in guest content.
+// By default, JavaScript, images and autoplay are enabled, and blockable mixed
+// content is blocked in guest content
 void GetGuestViewDefaultContentSettingRules(
     bool incognito,
     RendererContentSettingRules* rules) {
@@ -54,6 +55,11 @@
       base::Value::FromUniquePtrValue(
           content_settings::ContentSettingToValue(CONTENT_SETTING_BLOCK)),
       std::string(), incognito));
+  rules->mixed_content_rules.push_back(ContentSettingPatternSource(
+      ContentSettingsPattern::Wildcard(), ContentSettingsPattern::Wildcard(),
+      base::Value::FromUniquePtrValue(
+          content_settings::ContentSettingToValue(CONTENT_SETTING_BLOCK)),
+      std::string(), incognito));
 }
 
 #endif  // BUILDFLAG(ENABLE_EXTENSIONS)
diff --git a/chrome/browser/resources/chromeos/chromevox/cvox2/background/background_test.extjs b/chrome/browser/resources/chromeos/chromevox/cvox2/background/background_test.extjs
index b06bb83d..478dc922 100644
--- a/chrome/browser/resources/chromeos/chromevox/cvox2/background/background_test.extjs
+++ b/chrome/browser/resources/chromeos/chromevox/cvox2/background/background_test.extjs
@@ -2088,3 +2088,18 @@
     mockFeedback.replay();
   });
 });
+
+TEST_F('ChromeVoxBackgroundTest', 'TableWithAriaRowCol', function() {
+  var mockFeedback = this.createMockFeedback();
+  this.runWithLoadedTree(function() {/*!
+    <div role="table">
+      <div role="row" aria-rowindex=3>
+        <div role="cell">test</div>
+      </div>
+    </div>
+  */}, function(root) {
+    mockFeedback.call(doCmd('fullyDescribe'))
+        .expectSpeech('test', 'row 3 column 1', 'Table , 1 by 1')
+        .replay();
+  });
+});
diff --git a/chrome/browser/resources/chromeos/chromevox/cvox2/background/output.js b/chrome/browser/resources/chromeos/chromevox/cvox2/background/output.js
index 81acba5..29075cf 100644
--- a/chrome/browser/resources/chromeos/chromevox/cvox2/background/output.js
+++ b/chrome/browser/resources/chromeos/chromevox/cvox2/background/output.js
@@ -1492,10 +1492,10 @@
           } else {
             ruleStr.write(token);
             this.format_(
-                node, ` @cell_summary($if($ariaCellRowIndex, $ariaCellRowIndex,
-                    $tableCellRowIndex),
-                $if($ariaCellColumnIndex, $ariaCellColumnIndex,
-                     $tableCellColumnIndex))`,
+                node, `@cell_summary($if($tableCellAriaRowIndex,
+                               $tableCellAriaRowIndex, $tableCellRowIndex),
+                    $if($tableCellAriaColumnIndex, $tableCellAriaColumnIndex,
+                        $tableCellColumnIndex))`,
                 buff, ruleStr);
           }
         } else if (token == 'node') {
diff --git a/chrome/browser/resources/local_ntp/customize.js b/chrome/browser/resources/local_ntp/customize.js
index 5ac3fa5..c691b823 100644
--- a/chrome/browser/resources/local_ntp/customize.js
+++ b/chrome/browser/resources/local_ntp/customize.js
@@ -930,7 +930,7 @@
   if (tile.id === customize.IDS.BACKGROUNDS_DEFAULT_ICON) {
     preview.dataset.hasImage = false;
     preview.style.backgroundImage = '';
-    preview.style.backgroundColor = document.body.style.backgroundColor;
+    preview.style.backgroundColor = 'transparent';
   } else if (tile.id === customize.IDS.BACKGROUNDS_UPLOAD_ICON) {
     // No previews for uploaded images.
     return;
@@ -940,6 +940,9 @@
     const re = /w\d+\-h\d+/;
     preview.style.backgroundImage =
         tile.style.backgroundImage.replace(re, 'w1280-h720');
+    preview.dataset.attributionLine1 = tile.dataset.attributionLine1;
+    preview.dataset.attributionLine2 = tile.dataset.attributionLine2;
+    preview.dataset.attributionActionUrl = tile.dataset.attributionActionUrl;
   }
   background.style.opacity = 0;
   preview.style.opacity = 1;
diff --git a/chrome/browser/resources/local_ntp/local_ntp.css b/chrome/browser/resources/local_ntp/local_ntp.css
index 40de873..3aa33a8 100644
--- a/chrome/browser/resources/local_ntp/local_ntp.css
+++ b/chrome/browser/resources/local_ntp/local_ntp.css
@@ -1868,6 +1868,7 @@
   border: 1px solid rgb(var(--GG200-rgb));
   border-radius: 4px;
   display: none;
+  font-size: 13px;
   height: 64px;
   margin-bottom: 24px;
   max-width: 544px;
@@ -1882,7 +1883,6 @@
 
 #colors-theme.visible {
   display: flex;
-  font-size: small;
 }
 
 #colors-theme > * {
diff --git a/chrome/browser/resources/local_ntp/local_ntp.js b/chrome/browser/resources/local_ntp/local_ntp.js
index 2c3183c..22bda43 100644
--- a/chrome/browser/resources/local_ntp/local_ntp.js
+++ b/chrome/browser/resources/local_ntp/local_ntp.js
@@ -604,6 +604,12 @@
     // backgroundImage is in the form: url("actual url"). Remove everything
     // except the actual url.
     info.imageUrl = preview.style.backgroundImage.slice(5, -2);
+
+    if (preview.dataset.hasImage === 'true') {
+      info.attribution1 = preview.dataset.attributionLine1;
+      info.attribution2 = preview.dataset.attributionLine2;
+      info.attributionActionUrl = preview.dataset.attributionActionUrl;
+    }
   }
   return info;
 }
diff --git a/chrome/browser/resources/management/BUILD.gn b/chrome/browser/resources/management/BUILD.gn
index 82dfd3d..4e27e41 100644
--- a/chrome/browser/resources/management/BUILD.gn
+++ b/chrome/browser/resources/management/BUILD.gn
@@ -3,8 +3,10 @@
 # found in the LICENSE file.
 
 import("//third_party/closure_compiler/compile_js.gni")
+import("//tools/polymer/polymer.gni")
 
 js_type_check("closure_compile") {
+  is_polymer3 = true
   deps = [
     ":management_browser_proxy",
     ":management_ui",
@@ -13,15 +15,34 @@
 
 js_library("management_ui") {
   deps = [
-    "//ui/webui/resources/js:cr",
-    "//ui/webui/resources/js:i18n_behavior",
-    "//ui/webui/resources/js:load_time_data",
-    "//ui/webui/resources/js:web_ui_listener_behavior",
+    "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
+    "//ui/webui/resources/js:i18n_behavior.m",
+    "//ui/webui/resources/js:load_time_data.m",
+    "//ui/webui/resources/js:web_ui_listener_behavior.m",
   ]
 }
 
 js_library("management_browser_proxy") {
   deps = [
-    "//ui/webui/resources/js:cr",
+    "//ui/webui/resources/js:cr.m",
+  ]
+}
+
+polymer_modulizer("management_ui") {
+  js_file = "management_ui.js"
+  html_file = "management_ui.html"
+  html_type = "v3-ready"
+}
+
+polymer_modulizer("icons") {
+  js_file = "icons.js"
+  html_file = "icons.html"
+  html_type = "v3-ready"
+}
+
+group("polymer3_elements") {
+  deps = [
+    ":icons_module",
+    ":management_ui_module",
   ]
 }
diff --git a/chrome/browser/resources/management/icons.html b/chrome/browser/resources/management/icons.html
index 2311bf2..e6a0757 100644
--- a/chrome/browser/resources/management/icons.html
+++ b/chrome/browser/resources/management/icons.html
@@ -1,9 +1,4 @@
-<link rel="import" href="chrome://resources/html/polymer.html">
-
-<link rel="import" href="chrome://resources/polymer/v1_0/iron-iconset-svg/iron-iconset-svg.html">
-
 <!-- Set of the management specific icons -->
-
 <iron-iconset-svg name="management" size="24">
   <svg>
     <defs>
diff --git a/chrome/browser/resources/management/icons.js b/chrome/browser/resources/management/icons.js
new file mode 100644
index 0000000..02ab37aa
--- /dev/null
+++ b/chrome/browser/resources/management/icons.js
@@ -0,0 +1,10 @@
+// Copyright 2019 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.
+
+import 'chrome://resources/polymer/v3_0/iron-iconset-svg/iron-iconset-svg.js';
+
+import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+
+const template = html`{__html_template__}`;
+document.head.appendChild(template.content);
diff --git a/chrome/browser/resources/management/management.html b/chrome/browser/resources/management/management.html
index 8b4f155..aea7f12b 100644
--- a/chrome/browser/resources/management/management.html
+++ b/chrome/browser/resources/management/management.html
@@ -7,7 +7,6 @@
 
   <link rel="stylesheet" href="chrome://resources/css/md_colors.css">
   <link rel="stylesheet" href="chrome://resources/css/text_defaults_md.css">
-  <link rel="import" href="chrome://resources/html/cr.html">
   <style>
     html {
       background: var(--md-background-color);
@@ -30,8 +29,7 @@
     }
   </style>
 
-  <link rel="import" href="management_ui.html">
-  <script src="strings.js"></script>
+  <script type="module" src="management_ui.js"></script>
 </head>
 <body>
   <management-ui></management-ui>
diff --git a/chrome/browser/resources/management/management_browser_proxy.html b/chrome/browser/resources/management/management_browser_proxy.html
deleted file mode 100644
index abaff42..0000000
--- a/chrome/browser/resources/management/management_browser_proxy.html
+++ /dev/null
@@ -1,2 +0,0 @@
-<link rel="import" href="chrome://resources/html/cr.html">
-<script src="management_browser_proxy.js"></script>
diff --git a/chrome/browser/resources/management/management_browser_proxy.js b/chrome/browser/resources/management/management_browser_proxy.js
index a86bbaa7..9c56140 100644
--- a/chrome/browser/resources/management/management_browser_proxy.js
+++ b/chrome/browser/resources/management/management_browser_proxy.js
@@ -2,166 +2,156 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-cr.define('management', function() {
-  /**
-   * @typedef {{
-   *   name: string,
-   *   permissions: !Array<string>
-   * }}
-   */
-  let Extension;
+import {addSingletonGetter, sendWithPromise} from 'chrome://resources/js/cr.m.js';
 
-  /** @enum {string} */
-  const ReportingType = {
-    SECURITY: 'security',
-    DEVICE: 'device',
-    USER: 'user',
-    USER_ACTIVITY: 'user-activity',
-    EXTENSIONS: 'extensions'
-  };
+/**
+ * @typedef {{
+ *   name: string,
+ *   permissions: !Array<string>
+ * }}
+ */
+export let Extension;
 
-  /**
-   * @typedef {{
-   *   messageId: string,
-   *   reportingType: !management.ReportingType,
-   * }}
-   */
-  let BrowserReportingResponse;
+/** @enum {string} */
+export const ReportingType = {
+  SECURITY: 'security',
+  DEVICE: 'device',
+  USER: 'user',
+  USER_ACTIVITY: 'user-activity',
+  EXTENSIONS: 'extensions'
+};
 
-  /**
-   * @typedef {{
-   *   browserManagementNotice: string,
-   *   extensionReportingTitle: string,
-   *   pageSubtitle: string,
-   *   managed: boolean,
-   *   overview: string,
-   *   customerLogo: string,
-   *   threatProtectionDescription: string
-   * }}
-   */
-  let ManagedDataResponse;
+/**
+ * @typedef {{
+ *   messageId: string,
+ *   reportingType: !ReportingType,
+ * }}
+ */
+export let BrowserReportingResponse;
 
-  /**
-   * @typedef {{
-   *  title: string,
-   *  permission: string
-   * }}
-   */
-  let ThreatProtectionPermission;
+/**
+ * @typedef {{
+ *   browserManagementNotice: string,
+ *   extensionReportingTitle: string,
+ *   pageSubtitle: string,
+ *   managed: boolean,
+ *   overview: string,
+ *   customerLogo: string,
+ *   threatProtectionDescription: string
+ * }}
+ */
+let ManagedDataResponse;
 
-  /**
-   * @typedef {{
-   *   info: !Array<!ThreatProtectionPermission>,
-   *   description: string
-   * }}
-   */
-  let ThreatProtectionInfo;
+/**
+ * @typedef {{
+ *  title: string,
+ *  permission: string
+ * }}
+ */
+let ThreatProtectionPermission;
+
+/**
+ * @typedef {{
+ *   info: !Array<!ThreatProtectionPermission>,
+ *   description: string
+ * }}
+ */
+export let ThreatProtectionInfo;
+
+// <if expr="chromeos">
+/**
+ * @enum {string} Look at ToJSDeviceReportingType usage in
+ *    management_ui_handler.cc for more details.
+ */
+export const DeviceReportingType = {
+  SUPERVISED_USER: 'supervised user',
+  DEVICE_ACTIVITY: 'device activity',
+  STATISTIC: 'device statistics',
+  DEVICE: 'device',
+  LOGS: 'logs',
+  PRINT: 'print',
+  CROSTINI: 'crostini'
+};
+
+
+/**
+ * @typedef {{
+ *   messageId: string,
+ *   reportingType: !DeviceReportingType,
+ * }}
+ */
+export let DeviceReportingResponse;
+// </if>
+
+/** @interface */
+export class ManagementBrowserProxy {
+  /** @return {!Promise<!Array<!Extension>>} */
+  getExtensions() {}
 
   // <if expr="chromeos">
   /**
-   * @enum {string} Look at ToJSDeviceReportingType usage in
-   *    management_ui_handler.cc for more details.
+   * @return {!Promise<boolean>} Boolean describing trust root configured
+   *     or not.
    */
-  const DeviceReportingType = {
-    SUPERVISED_USER: 'supervised user',
-    DEVICE_ACTIVITY: 'device activity',
-    STATISTIC: 'device statistics',
-    DEVICE: 'device',
-    LOGS: 'logs',
-    PRINT: 'print',
-    CROSTINI: 'crostini'
-  };
-
+  getLocalTrustRootsInfo() {}
 
   /**
-   * @typedef {{
-   *   messageId: string,
-   *   reportingType: !management.DeviceReportingType,
-   * }}
+   * @return {!Promise<!Array<DeviceReportingResponse>>} List of
+   *     items to display in device reporting section.
    */
-  let DeviceReportingResponse;
+  getDeviceReportingInfo() {}
   // </if>
 
-  /** @interface */
-  class ManagementBrowserProxy {
-    /** @return {!Promise<!Array<!management.Extension>>} */
-    getExtensions() {}
+  /** @return {!Promise<!ManagedDataResponse>} */
+  getContextualManagedData() {}
 
-    // <if expr="chromeos">
-    /**
-     * @return {!Promise<boolean>} Boolean describing trust root configured
-     *     or not.
-     */
-    getLocalTrustRootsInfo() {}
+  /** @return {!Promise<!ThreatProtectionInfo>} */
+  getThreatProtectionInfo() {}
 
-    /**
-     * @return {!Promise<!Array<management.DeviceReportingResponse>>} List of
-     *     items to display in device reporting section.
-     */
-    getDeviceReportingInfo() {}
-    // </if>
+  /**
+   * @return {!Promise<!Array<!BrowserReportingResponse>>} The list
+   *     of browser reporting info messages.
+   */
+  initBrowserReportingInfo() {}
+}
 
-    /** @return {!Promise<!management.ManagedDataResponse>} */
-    getContextualManagedData() {}
-
-    /** @return {!Promise<!management.ThreatProtectionInfo>} */
-    getThreatProtectionInfo() {}
-
-    /**
-     * @return {!Promise<!Array<!management.BrowserReportingResponse>>} The list
-     *     of browser reporting info messages.
-     */
-    initBrowserReportingInfo() {}
+/** @implements {ManagementBrowserProxy} */
+export class ManagementBrowserProxyImpl {
+  /** @override */
+  getExtensions() {
+    return sendWithPromise('getExtensions');
   }
 
-  /** @implements {management.ManagementBrowserProxy} */
-  class ManagementBrowserProxyImpl {
-    /** @override */
-    getExtensions() {
-      return cr.sendWithPromise('getExtensions');
-    }
-
-    // <if expr="chromeos">
-    /** @override */
-    getLocalTrustRootsInfo() {
-      return cr.sendWithPromise('getLocalTrustRootsInfo');
-    }
-
-    /** @override */
-    getDeviceReportingInfo() {
-      return cr.sendWithPromise('getDeviceReportingInfo');
-    }
-    // </if>
-
-    /** @override */
-    getContextualManagedData() {
-      return cr.sendWithPromise('getContextualManagedData');
-    }
-
-    /** @override */
-    getThreatProtectionInfo() {
-      return cr.sendWithPromise('getThreatProtectionInfo');
-    }
-
-    /** @override */
-    initBrowserReportingInfo() {
-      return cr.sendWithPromise('initBrowserReportingInfo');
-    }
+  // <if expr="chromeos">
+  /** @override */
+  getLocalTrustRootsInfo() {
+    return sendWithPromise('getLocalTrustRootsInfo');
   }
 
-  cr.addSingletonGetter(ManagementBrowserProxyImpl);
+  /** @override */
+  getDeviceReportingInfo() {
+    return sendWithPromise('getDeviceReportingInfo');
+  }
+  // </if>
 
-  return {
-    BrowserReportingResponse: BrowserReportingResponse,
-    // <if expr="chromeos">
-    DeviceReportingResponse: DeviceReportingResponse,
-    DeviceReportingType: DeviceReportingType,
-    // </if>
-    Extension: Extension,
-    ManagedDataResponse: ManagedDataResponse,
-    ManagementBrowserProxyImpl: ManagementBrowserProxyImpl,
-    ManagementBrowserProxy: ManagementBrowserProxy,
-    ReportingType: ReportingType,
-    ThreatProtectionInfo: ThreatProtectionInfo,
-  };
-});
+  /** @override */
+  getContextualManagedData() {
+    return sendWithPromise('getContextualManagedData');
+  }
+
+  /** @override */
+  getThreatProtectionInfo() {
+    return sendWithPromise('getThreatProtectionInfo');
+  }
+
+  /** @override */
+  initBrowserReportingInfo() {
+    return sendWithPromise('initBrowserReportingInfo');
+  }
+}
+
+addSingletonGetter(ManagementBrowserProxyImpl);
+
+// Export |ManagementBrowserProxyImpl| on |window| so that it can be accessed by
+// management_ui_browsertest.cc
+window.ManagementBrowserProxyImpl = ManagementBrowserProxyImpl;
diff --git a/chrome/browser/resources/management/management_ui.html b/chrome/browser/resources/management/management_ui.html
index f52326d..93ecc899 100644
--- a/chrome/browser/resources/management/management_ui.html
+++ b/chrome/browser/resources/management/management_ui.html
@@ -1,20 +1,4 @@
-<link rel="import" href="chrome://resources/html/polymer.html">
 
-<link rel="import" href="chrome://resources/cr_elements/cr_icon_button/cr_icon_button.html">
-<link rel="import" href="chrome://resources/cr_elements/cr_icons_css.html">
-<link rel="import" href="chrome://resources/cr_elements/cr_page_host_style_css.html">
-<link rel="import" href="chrome://resources/cr_elements/cr_toolbar/cr_toolbar.html">
-<link rel="import" href="chrome://resources/cr_elements/hidden_style_css.html">
-<link rel="import" href="chrome://resources/cr_elements/icons.html">
-<link rel="import" href="chrome://resources/cr_elements/shared_style_css.html">
-<link rel="import" href="chrome://resources/html/i18n_behavior.html">
-<link rel="import" href="chrome://resources/html/load_time_data.html">
-<link rel="import" href="chrome://resources/html/web_ui_listener_behavior.html">
-<link rel="import" href="icons.html">
-<link rel="import" href="management_browser_proxy.html">
-
-<dom-module id="management-ui">
-  <template>
     <style include="cr-icons cr-hidden-style cr-page-host-style
         cr-shared-style">
       :host {
@@ -324,6 +308,3 @@
         </div>
       </div>
     </main>
-  </template>
-  <script src="management_ui.js"></script>
-</dom-module>
diff --git a/chrome/browser/resources/management/management_ui.js b/chrome/browser/resources/management/management_ui.js
index a04d5ed..fe3aa23e 100644
--- a/chrome/browser/resources/management/management_ui.js
+++ b/chrome/browser/resources/management/management_ui.js
@@ -2,294 +2,308 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-cr.define('management', function() {
-  /**
-   * @typedef {{
-   *   messageIds: !Array<string>,
-   *   icon: string,
-   * }}
-   */
-  let BrowserReportingData;
+import 'chrome://resources/cr_elements/cr_icon_button/cr_icon_button.m.js';
+import 'chrome://resources/cr_elements/cr_icons_css.m.js';
+import 'chrome://resources/cr_elements/cr_page_host_style_css.m.js';
+import 'chrome://resources/cr_elements/cr_toolbar/cr_toolbar.m.js';
+import 'chrome://resources/cr_elements/hidden_style_css.m.js';
+import 'chrome://resources/cr_elements/icons.m.js';
+import 'chrome://resources/cr_elements/shared_style_css.m.js';
+import './icons.js';
 
-  Polymer({
-    is: 'management-ui',
+import {I18nBehavior} from 'chrome://resources/js/i18n_behavior.m.js';
+import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
+import {WebUIListenerBehavior} from 'chrome://resources/js/web_ui_listener_behavior.m.js';
+import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
-    behaviors: [
-      I18nBehavior,
-      WebUIListenerBehavior,
-    ],
+import {BrowserReportingResponse, Extension, ManagementBrowserProxy, ManagementBrowserProxyImpl, ReportingType, ThreatProtectionInfo} from './management_browser_proxy.js';
+// <if expr="chromeos">
+import {DeviceReportingResponse, DeviceReportingType} from './management_browser_proxy.js';
+// </if>
 
-    properties: {
-      /**
-       * List of messages related to browser reporting.
-       * @private {?Array<!management.BrowserReportingData>}
-       */
-      browserReportingInfo_: Array,
+/**
+ * @typedef {{
+ *   messageIds: !Array<string>,
+ *   icon: string,
+ * }}
+ */
+let BrowserReportingData;
 
-      /**
-       * List of messages related to browser reporting.
-       * @private {?Array<!management.Extension>}
-       */
-      extensions_: Array,
+Polymer({
+  is: 'management-ui',
 
-      // <if expr="chromeos">
-      /**
-       * List of messages related to device reporting.
-       * @private {?Array<!management.DeviceReportingResponse>}
-       */
-      deviceReportingInfo_: Array,
+  _template: html`{__html_template__}`,
 
-      /**
-       * Message stating if the Trust Roots are configured.
-       * @private
-       */
-      localTrustRoots_: String,
+  behaviors: [
+    I18nBehavior,
+    WebUIListenerBehavior,
+  ],
 
-      /** @private */
-      customerLogo_: String,
-
-      /** @private */
-      managementOverview_: String,
-
-      // </if>
-
-      /** @private */
-      subtitle_: String,
-
-      // <if expr="not chromeos">
-      /** @private */
-      managementNoticeHtml_: String,
-      // </if>
-
-      /** @private */
-      managed_: Boolean,
-
-      /** @private */
-      extensionReportingSubtitle_: String,
-
-      /** @private {!management.ThreatProtectionInfo} */
-      threatProtectionInfo_: Object,
-    },
-
-    /** @private {?management.ManagementBrowserProxy} */
-    browserProxy_: null,
-
-    /** @override */
-    attached() {
-      document.documentElement.classList.remove('loading');
-      this.browserProxy_ = management.ManagementBrowserProxyImpl.getInstance();
-      this.updateManagedFields_();
-      this.initBrowserReportingInfo_();
-      this.getThreatProtectionInfo_();
-
-      this.addWebUIListener(
-          'browser-reporting-info-updated',
-          reportingInfo => this.onBrowserReportingInfoReceived_(reportingInfo));
-
-      this.addWebUIListener('managed_data_changed', () => {
-        this.updateManagedFields_();
-      });
-
-      this.addWebUIListener(
-          'threat-protection-info-updated',
-          info => this.threatProtectionInfo_ = info);
-
-      this.getExtensions_();
-      // <if expr="chromeos">
-      this.getDeviceReportingInfo_();
-      this.getLocalTrustRootsInfo_();
-      // </if>
-    },
-
-    /** @private */
-    initBrowserReportingInfo_() {
-      this.browserProxy_.initBrowserReportingInfo().then(
-          reportingInfo => this.onBrowserReportingInfoReceived_(reportingInfo));
-    },
+  properties: {
+    /**
+     * List of messages related to browser reporting.
+     * @private {?Array<!BrowserReportingData>}
+     */
+    browserReportingInfo_: Array,
 
     /**
-     * @param {!Array<!management.BrowserReportingResponse>} reportingInfo
-     * @private
+     * List of messages related to browser reporting.
+     * @private {?Array<!Extension>}
      */
-    onBrowserReportingInfoReceived_(reportingInfo) {
-      const reportingInfoMap = reportingInfo.reduce((info, response) => {
-        info[response.reportingType] = info[response.reportingType] || {
-          icon: this.getIconForReportingType_(response.reportingType),
-          messageIds: []
-        };
-        info[response.reportingType].messageIds.push(response.messageId);
-        return info;
-      }, {});
-
-      const reportingTypeOrder = {
-        [management.ReportingType.SECURITY]: 1,
-        [management.ReportingType.EXTENSIONS]: 2,
-        [management.ReportingType.USER]: 3,
-        [management.ReportingType.USER_ACTIVITY]: 4,
-        [management.ReportingType.DEVICE]: 5,
-      };
-
-      this.browserReportingInfo_ =
-          Object.keys(reportingInfoMap)
-              .sort((a, b) => reportingTypeOrder[a] - reportingTypeOrder[b])
-              .map(reportingType => reportingInfoMap[reportingType]);
-    },
-
-    /** @private */
-    getExtensions_() {
-      this.browserProxy_.getExtensions().then(extensions => {
-        this.extensions_ = extensions;
-      });
-    },
-
-    /** @private */
-    getThreatProtectionInfo_() {
-      this.browserProxy_.getThreatProtectionInfo().then(info => {
-        this.threatProtectionInfo_ = info;
-      });
-    },
-
-    /**
-     * @return {boolean} True if there is threat protection info to show.
-     * @private
-     */
-    showThreatProtectionInfo_() {
-      return !!this.threatProtectionInfo_ &&
-          this.threatProtectionInfo_.info.length > 0;
-    },
+    extensions_: Array,
 
     // <if expr="chromeos">
-    /** @private */
-    getLocalTrustRootsInfo_() {
-      this.browserProxy_.getLocalTrustRootsInfo().then(trustRootsConfigured => {
-        this.localTrustRoots_ = trustRootsConfigured ?
-            loadTimeData.getString('managementTrustRootsConfigured') :
-            '';
-      });
-    },
-
-    /** @private */
-    getDeviceReportingInfo_() {
-      this.browserProxy_.getDeviceReportingInfo().then(reportingInfo => {
-        this.deviceReportingInfo_ = reportingInfo;
-      });
-    },
+    /**
+     * List of messages related to device reporting.
+     * @private {?Array<!DeviceReportingResponse>}
+     */
+    deviceReportingInfo_: Array,
 
     /**
-     * @return {boolean} True of there are device reporting info to show.
+     * Message stating if the Trust Roots are configured.
      * @private
      */
-    showDeviceReportingInfo_() {
-      return !!this.deviceReportingInfo_ &&
-          this.deviceReportingInfo_.length > 0;
-    },
+    localTrustRoots_: String,
 
-    /**
-     * @param {management.DeviceReportingType} reportingType
-     * @return {string} The associated icon.
-     * @private
-     */
-    getIconForDeviceReportingType_(reportingType) {
-      switch (reportingType) {
-        case management.DeviceReportingType.SUPERVISED_USER:
-          return 'management:supervised-user';
-        case management.DeviceReportingType.DEVICE_ACTIVITY:
-          return 'management:timelapse';
-        case management.DeviceReportingType.STATISTIC:
-          return 'management:bar-chart';
-        case management.DeviceReportingType.DEVICE:
-          return 'cr:computer';
-        case management.DeviceReportingType.LOGS:
-          return 'management:report';
-        case management.DeviceReportingType.PRINT:
-          return 'cr:print';
-        case management.DeviceReportingType.CROSTINI:
-          return 'management:linux';
-        default:
-          return 'cr:computer';
-      }
-    },
+    /** @private */
+    customerLogo_: String,
+
+    /** @private */
+    managementOverview_: String,
+
     // </if>
 
-    /**
-     * @return {boolean} True of there are browser reporting info to show.
-     * @private
-     */
-    showBrowserReportingInfo_() {
-      return !!this.browserReportingInfo_ &&
-          this.browserReportingInfo_.length > 0;
-    },
+    /** @private */
+    subtitle_: String,
 
-    /**
-     * @return {boolean} True of there are extension reporting info to show.
-     * @private
-     */
-    showExtensionReportingInfo_() {
-      return !!this.extensions_ && this.extensions_.length > 0;
-    },
-
-    /**
-     * @param {management.ReportingType} reportingType
-     * @returns {string} The associated icon.
-     * @private
-     */
-    getIconForReportingType_(reportingType) {
-      switch (reportingType) {
-        case management.ReportingType.SECURITY:
-          return 'cr:security';
-        case management.ReportingType.DEVICE:
-          return 'cr:computer';
-        case management.ReportingType.EXTENSIONS:
-          return 'cr:extension';
-        case management.ReportingType.USER:
-          return 'management:account-circle';
-        case management.ReportingType.USER_ACTIVITY:
-          return 'management:public';
-        default:
-          return 'cr:security';
-      }
-    },
-
-    /**
-     * Handles the 'search-changed' event fired from the toolbar.
-     * Redirects to the settings page initialized the the current
-     * search query.
-     * @param {!CustomEvent<string>} e
-     * @private
-     */
-    onSearchChanged_: function(e) {
-      const query = e.detail;
-      window.location.href =
-          `chrome://settings?search=${encodeURIComponent(query)}`;
-    },
+    // <if expr="not chromeos">
+    /** @private */
+    managementNoticeHtml_: String,
+    // </if>
 
     /** @private */
-    onTapBack_() {
-      if (history.length > 1) {
-        history.back();
-      } else {
-        window.location.href = 'chrome://settings/help';
-      }
-    },
+    managed_: Boolean,
 
     /** @private */
-    updateManagedFields_() {
-      this.browserProxy_.getContextualManagedData().then(data => {
-        this.managed_ = data.managed;
-        this.extensionReportingSubtitle_ = data.extensionReportingTitle;
-        this.subtitle_ = data.pageSubtitle;
-        // <if expr="chromeos">
-        this.customerLogo_ = data.customerLogo;
-        this.managementOverview_ = data.overview;
-        // </if>
-        // <if expr="not chromeos">
-        this.managementNoticeHtml_ = data.browserManagementNotice;
-        // </if>
-      });
-    },
-  });
+    extensionReportingSubtitle_: String,
 
-  return {
-    BrowserReportingData: BrowserReportingData,
-  };
+    /** @private {!ThreatProtectionInfo} */
+    threatProtectionInfo_: Object,
+  },
+
+  /** @private {?ManagementBrowserProxy} */
+  browserProxy_: null,
+
+  /** @override */
+  attached() {
+    document.documentElement.classList.remove('loading');
+    this.browserProxy_ = ManagementBrowserProxyImpl.getInstance();
+    this.updateManagedFields_();
+    this.initBrowserReportingInfo_();
+    this.getThreatProtectionInfo_();
+
+    this.addWebUIListener(
+        'browser-reporting-info-updated',
+        reportingInfo => this.onBrowserReportingInfoReceived_(reportingInfo));
+
+    this.addWebUIListener('managed_data_changed', () => {
+      this.updateManagedFields_();
+    });
+
+    this.addWebUIListener(
+        'threat-protection-info-updated',
+        info => this.threatProtectionInfo_ = info);
+
+    this.getExtensions_();
+    // <if expr="chromeos">
+    this.getDeviceReportingInfo_();
+    this.getLocalTrustRootsInfo_();
+    // </if>
+  },
+
+  /** @private */
+  initBrowserReportingInfo_() {
+    this.browserProxy_.initBrowserReportingInfo().then(
+        reportingInfo => this.onBrowserReportingInfoReceived_(reportingInfo));
+  },
+
+  /**
+   * @param {!Array<!BrowserReportingResponse>} reportingInfo
+   * @private
+   */
+  onBrowserReportingInfoReceived_(reportingInfo) {
+    const reportingInfoMap = reportingInfo.reduce((info, response) => {
+      info[response.reportingType] = info[response.reportingType] || {
+        icon: this.getIconForReportingType_(response.reportingType),
+        messageIds: []
+      };
+      info[response.reportingType].messageIds.push(response.messageId);
+      return info;
+    }, {});
+
+    const reportingTypeOrder = {
+      [ReportingType.SECURITY]: 1,
+      [ReportingType.EXTENSIONS]: 2,
+      [ReportingType.USER]: 3,
+      [ReportingType.USER_ACTIVITY]: 4,
+      [ReportingType.DEVICE]: 5,
+    };
+
+    this.browserReportingInfo_ =
+        Object.keys(reportingInfoMap)
+            .sort((a, b) => reportingTypeOrder[a] - reportingTypeOrder[b])
+            .map(reportingType => reportingInfoMap[reportingType]);
+  },
+
+  /** @private */
+  getExtensions_() {
+    this.browserProxy_.getExtensions().then(extensions => {
+      this.extensions_ = extensions;
+    });
+  },
+
+  /** @private */
+  getThreatProtectionInfo_() {
+    this.browserProxy_.getThreatProtectionInfo().then(info => {
+      this.threatProtectionInfo_ = info;
+    });
+  },
+
+  /**
+   * @return {boolean} True if there is threat protection info to show.
+   * @private
+   */
+  showThreatProtectionInfo_() {
+    return !!this.threatProtectionInfo_ &&
+        this.threatProtectionInfo_.info.length > 0;
+  },
+
+  // <if expr="chromeos">
+  /** @private */
+  getLocalTrustRootsInfo_() {
+    this.browserProxy_.getLocalTrustRootsInfo().then(trustRootsConfigured => {
+      this.localTrustRoots_ = trustRootsConfigured ?
+          loadTimeData.getString('managementTrustRootsConfigured') :
+          '';
+    });
+  },
+
+  /** @private */
+  getDeviceReportingInfo_() {
+    this.browserProxy_.getDeviceReportingInfo().then(reportingInfo => {
+      this.deviceReportingInfo_ = reportingInfo;
+    });
+  },
+
+  /**
+   * @return {boolean} True of there are device reporting info to show.
+   * @private
+   */
+  showDeviceReportingInfo_() {
+    return !!this.deviceReportingInfo_ && this.deviceReportingInfo_.length > 0;
+  },
+
+  /**
+   * @param {DeviceReportingType} reportingType
+   * @return {string} The associated icon.
+   * @private
+   */
+  getIconForDeviceReportingType_(reportingType) {
+    switch (reportingType) {
+      case DeviceReportingType.SUPERVISED_USER:
+        return 'management:supervised-user';
+      case DeviceReportingType.DEVICE_ACTIVITY:
+        return 'management:timelapse';
+      case DeviceReportingType.STATISTIC:
+        return 'management:bar-chart';
+      case DeviceReportingType.DEVICE:
+        return 'cr:computer';
+      case DeviceReportingType.LOGS:
+        return 'management:report';
+      case DeviceReportingType.PRINT:
+        return 'cr:print';
+      case DeviceReportingType.CROSTINI:
+        return 'management:linux';
+      default:
+        return 'cr:computer';
+    }
+  },
+  // </if>
+
+  /**
+   * @return {boolean} True of there are browser reporting info to show.
+   * @private
+   */
+  showBrowserReportingInfo_() {
+    return !!this.browserReportingInfo_ &&
+        this.browserReportingInfo_.length > 0;
+  },
+
+  /**
+   * @return {boolean} True of there are extension reporting info to show.
+   * @private
+   */
+  showExtensionReportingInfo_() {
+    return !!this.extensions_ && this.extensions_.length > 0;
+  },
+
+  /**
+   * @param {ReportingType} reportingType
+   * @returns {string} The associated icon.
+   * @private
+   */
+  getIconForReportingType_(reportingType) {
+    switch (reportingType) {
+      case ReportingType.SECURITY:
+        return 'cr:security';
+      case ReportingType.DEVICE:
+        return 'cr:computer';
+      case ReportingType.EXTENSIONS:
+        return 'cr:extension';
+      case ReportingType.USER:
+        return 'management:account-circle';
+      case ReportingType.USER_ACTIVITY:
+        return 'management:public';
+      default:
+        return 'cr:security';
+    }
+  },
+
+  /**
+   * Handles the 'search-changed' event fired from the toolbar.
+   * Redirects to the settings page initialized the the current
+   * search query.
+   * @param {!CustomEvent<string>} e
+   * @private
+   */
+  onSearchChanged_: function(e) {
+    const query = e.detail;
+    window.location.href =
+        `chrome://settings?search=${encodeURIComponent(query)}`;
+  },
+
+  /** @private */
+  onTapBack_() {
+    if (history.length > 1) {
+      history.back();
+    } else {
+      window.location.href = 'chrome://settings/help';
+    }
+  },
+
+  /** @private */
+  updateManagedFields_() {
+    this.browserProxy_.getContextualManagedData().then(data => {
+      this.managed_ = data.managed;
+      this.extensionReportingSubtitle_ = data.extensionReportingTitle;
+      this.subtitle_ = data.pageSubtitle;
+      // <if expr="chromeos">
+      this.customerLogo_ = data.customerLogo;
+      this.managementOverview_ = data.overview;
+      // </if>
+      // <if expr="not chromeos">
+      this.managementNoticeHtml_ = data.browserManagementNotice;
+      // </if>
+    });
+  },
 });
diff --git a/chrome/browser/resources/settings/about_page/about_page_browser_proxy.js b/chrome/browser/resources/settings/about_page/about_page_browser_proxy.js
index d73d4ba..1d5eeb72 100644
--- a/chrome/browser/resources/settings/about_page/about_page_browser_proxy.js
+++ b/chrome/browser/resources/settings/about_page/about_page_browser_proxy.js
@@ -27,15 +27,6 @@
 
 /**
  * @typedef {{
- *   arcVersion: string,
- *   osFirmware: string,
- *   osVersion: string,
- * }}
- */
-let VersionInfo;
-
-/**
- * @typedef {{
  *   version: (string|undefined),
  *   size: (string|undefined),
  * }}
@@ -208,9 +199,6 @@
     /** @return {!Promise<!ChannelInfo>} */
     getChannelInfo() {}
 
-    /** @return {!Promise<!VersionInfo>} */
-    getVersionInfo() {}
-
     /** @return {!Promise<?RegulatoryInfo>} */
     getRegulatoryInfo() {}
 
@@ -317,11 +305,6 @@
     }
 
     /** @override */
-    getVersionInfo() {
-      return cr.sendWithPromise('getVersionInfo');
-    }
-
-    /** @override */
     getRegulatoryInfo() {
       return cr.sendWithPromise('getRegulatoryInfo');
     }
diff --git a/chrome/browser/resources/settings/about_page/detailed_build_info.html b/chrome/browser/resources/settings/about_page/detailed_build_info.html
index ba6bbc5..fa1ae5f8 100644
--- a/chrome/browser/resources/settings/about_page/detailed_build_info.html
+++ b/chrome/browser/resources/settings/about_page/detailed_build_info.html
@@ -24,15 +24,6 @@
         width: 100%;
       }
     </style>
-    <div class="settings-box two-line single-column">
-      <div>$i18n{aboutPlatformLabel}</div>
-      <div class="secondary" id="osVersion">[[versionInfo_.osVersion]]</div>
-    </div>
-    <div class="settings-box two-line single-column"
-        hidden$="[[!shouldShowVersion_(versionInfo_.osFirmware)]]">
-      <div>$i18n{aboutFirmwareLabel}</div>
-      <div class="secondary" id="osFirmware">[[versionInfo_.osFirmware]]</div>
-    </div>
     <div class="settings-box two-line">
       <div class="start">
         <div>$i18n{aboutChannelLabel}</div>
@@ -64,29 +55,10 @@
       <div class="secondary" inner-h-t-m-l="[[eolMessageWithMonthAndYear]]">
       </div>
     </div>
-    <div class="settings-box two-line single-column"
-        hidden$="[[!shouldShowVersion_(versionInfo_.arcVersion)]]">
-      <div>$i18n{aboutArcVersionLabel}</div>
-      <div class="secondary" id="arcVersion">[[versionInfo_.arcVersion]]</div>
-    </div>
-    <div class="settings-box two-line single-column">
-      <div>V8</div>
-      <div class="secondary">$i18n{aboutJsEngineVersion}</div>
-    </div>
-    <div class="settings-box two-line single-column">
-      <div>$i18n{aboutUserAgentLabel}</div>
-      <div class="secondary">$i18n{aboutUserAgent}</div>
-    </div>
-    <div class="settings-box two-line single-column">
-      <div>$i18n{aboutCommandLineLabel}</div>
-      <div id="command-line" class="secondary">
-        [[i18n('aboutCommandLine')]]
-      </div>
-    </div>
-    <div class="settings-box two-line single-column">
-      <div>$i18n{aboutBuildDateLabel}</div>
-      <div class="secondary">$i18n{aboutBuildDate}</div>
-    </div>
+    <cr-link-row class="hr" label="$i18n{aboutBuildDetailsTitle}"
+        on-click="onBuildDetailsTap_" external>
+    </cr-link-row>
+    <div class="hr"></div>
   </template>
   <script src="detailed_build_info.js"></script>
 </dom-module>
diff --git a/chrome/browser/resources/settings/about_page/detailed_build_info.js b/chrome/browser/resources/settings/about_page/detailed_build_info.js
index c82072cd..ba47cf9 100644
--- a/chrome/browser/resources/settings/about_page/detailed_build_info.js
+++ b/chrome/browser/resources/settings/about_page/detailed_build_info.js
@@ -13,9 +13,6 @@
   behaviors: [I18nBehavior],
 
   properties: {
-    /** @private {!VersionInfo} */
-    versionInfo_: Object,
-
     /** @private */
     currentlyOnChannelText_: String,
 
@@ -35,11 +32,6 @@
   ready: function() {
     const browserProxy = settings.AboutPageBrowserProxyImpl.getInstance();
     browserProxy.pageReady();
-
-    browserProxy.getVersionInfo().then(versionInfo => {
-      this.versionInfo_ = versionInfo;
-    });
-
     this.updateChannelInfo_();
   },
 
@@ -56,15 +48,6 @@
   },
 
   /**
-   * @param {string} version
-   * @return {boolean}
-   * @private
-   */
-  shouldShowVersion_: function(version) {
-    return version.length > 0;
-  },
-
-  /**
    * @param {boolean} canChangeChannel
    * @return {string}
    * @private
@@ -98,6 +81,15 @@
     this.showChannelSwitcherDialog_ = true;
   },
 
+  /**
+   * @param {!Event} e
+   * @private
+   */
+  onBuildDetailsTap_: function(e) {
+    e.preventDefault();
+    window.open('chrome://version');
+  },
+
   /** @private */
   onChannelSwitcherDialogClosed_: function() {
     this.showChannelSwitcherDialog_ = false;
diff --git a/chrome/browser/resources/settings/google_assistant_page/google_assistant_page.html b/chrome/browser/resources/settings/google_assistant_page/google_assistant_page.html
index 97c29a0..52053aae 100644
--- a/chrome/browser/resources/settings/google_assistant_page/google_assistant_page.html
+++ b/chrome/browser/resources/settings/google_assistant_page/google_assistant_page.html
@@ -58,12 +58,9 @@
             <div class="label">
               $i18n{googleAssistantEnableHotword}
             </div>
-            <div class="secondary label" hidden="[[!hotwordDefaultOn_]]">
+            <div class="secondary label">
               $i18n{googleAssistantEnableHotwordWithoutDspDescription}
             </div>
-            <div class="secondary label" hidden="[[hotwordDefaultOn_]]">
-              $i18n{googleAssistantEnableHotwordDescription}
-            </div>
           </div>
           <template is="dom-if" if="[[hotwordEnforced_]]" restamp>
             <cr-policy-pref-indicator id="hotword-policy-pref-indicator"
diff --git a/chrome/browser/resources/settings/google_assistant_page/google_assistant_page.js b/chrome/browser/resources/settings/google_assistant_page/google_assistant_page.js
index c3bc172..5a91841 100644
--- a/chrome/browser/resources/settings/google_assistant_page/google_assistant_page.js
+++ b/chrome/browser/resources/settings/google_assistant_page/google_assistant_page.js
@@ -97,12 +97,6 @@
     },
 
     /** @private */
-    hotwordDefaultOn_: {
-      type: Boolean,
-      value: false,
-    },
-
-    /** @private */
     dspHotwordState_: {
       type: DspHotwordState,
     }
@@ -166,20 +160,17 @@
         this.setPrefValue('settings.voice_interaction.hotword.enabled', true);
         this.setPrefValue(
             'settings.voice_interaction.hotword.always_on', false);
-        this.hotwordDefaultOn_ = true;
         this.browserProxy_.syncVoiceModelStatus();
         break;
       case DspHotwordState.ALWAYS_ON:
         this.setPrefValue('settings.voice_interaction.hotword.enabled', true);
         this.setPrefValue('settings.voice_interaction.hotword.always_on', true);
-        this.hotwordDefaultOn_ = false;
         this.browserProxy_.syncVoiceModelStatus();
         break;
       case DspHotwordState.OFF:
         this.setPrefValue('settings.voice_interaction.hotword.enabled', false);
         this.setPrefValue(
             'settings.voice_interaction.hotword.always_on', false);
-        this.hotwordDefaultOn_ = false;
         break;
       default:
         console.error('Invalid Dsp hotword settings state');
@@ -220,14 +211,11 @@
   /** @private */
   refreshDspHotwordState_: function() {
     if (!this.getPref('settings.voice_interaction.hotword.enabled.value')) {
-      this.hotwordDefaultOn_ = false;
       this.dspHotwordState_ = DspHotwordState.OFF;
     } else if (this.getPref(
                    'settings.voice_interaction.hotword.always_on.value')) {
-      this.hotwordDefaultOn_ = false;
       this.dspHotwordState_ = DspHotwordState.ALWAYS_ON;
     } else {
-      this.hotwordDefaultOn_ = true;
       this.dspHotwordState_ = DspHotwordState.DEFAULT_ON;
     }
 
diff --git a/chrome/browser/resources/settings/icons.html b/chrome/browser/resources/settings/icons.html
index ad72212..595f018 100644
--- a/chrome/browser/resources/settings/icons.html
+++ b/chrome/browser/resources/settings/icons.html
@@ -74,6 +74,7 @@
       <g id="pdf"><path d="M7 11.5h1v-1H7v1zM19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-9.5 8.5c0 .83-.67 1.5-1.5 1.5H7v2H5.5V9H8c.83 0 1.5.67 1.5 1.5v1zm10-1H17v1h1.5V13H17v2h-1.5V9h4v1.5zm-5 3c0 .83-.67 1.5-1.5 1.5h-2.5V9H13c.83 0 1.5.67 1.5 1.5v3zm-2.5 0h1v-3h-1v3z"></path><path fill="none" d="M0 0h24v24H0z"></path></g>
       <g id="palette"><path d="M12 3c-4.97 0-9 4.03-9 9s4.03 9 9 9c.83 0 1.5-.67 1.5-1.5 0-.39-.15-.74-.39-1.01-.23-.26-.38-.61-.38-.99 0-.83.67-1.5 1.5-1.5H16c2.76 0 5-2.24 5-5 0-4.42-4.03-8-9-8zm-5.5 9c-.83 0-1.5-.67-1.5-1.5S5.67 9 6.5 9 8 9.67 8 10.5 7.33 12 6.5 12zm3-4C8.67 8 8 7.33 8 6.5S8.67 5 9.5 5s1.5.67 1.5 1.5S10.33 8 9.5 8zm5 0c-.83 0-1.5-.67-1.5-1.5S13.67 5 14.5 5s1.5.67 1.5 1.5S15.33 8 14.5 8zm3 4c-.83 0-1.5-.67-1.5-1.5S16.67 9 17.5 9s1.5.67 1.5 1.5-.67 1.5-1.5 1.5z"></path></g>
       <g id="payment-handler"><path d="M20 4H4c-1.11 0-1.99.89-1.99 2L2 18c0 1.11.89 2 2 2h16c1.11 0 2-.89 2-2V6c0-1.11-.89-2-2-2zm0 14H4v-6h16v6zm0-10H4V6h16v2z"></path></g>
+      <g id="insecure-content"><path d="M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z"></path></g>
       <g id="photo"><path d="M21 19V5c0-1.1-.9-2-2-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2zM8.5 13.5l2.5 3.01L14.5 12l4.5 6H5l3.5-4.5z"></path></g>
       <g id="power-settings-new"><path d="M13 3h-2v10h2V3zm4.83 2.17l-1.42 1.42C17.99 7.86 19 9.81 19 12c0 3.87-3.13 7-7 7s-7-3.13-7-7c0-2.19 1.01-4.14 2.58-5.42L6.17 5.17C4.23 6.82 3 9.26 3 12c0 4.97 4.03 9 9 9s9-4.03 9-9c0-2.74-1.23-5.18-3.17-6.83z"></path></g>
       <g id="protocol-handler"><path d="M21.72 11.33l-6.644-7.035a.97.97 0 0 0-1.38-.01l-1.67 1.72-1.617-1.712a.97.97 0 0 0-1.38-.01l-6.737 6.935c-.187.191-.29.447-.292.719-.002.272.099.529.28.722l6.644 7.034a.949.949 0 0 0 1.38.011l1.671-1.718 1.615 1.71a.949.949 0 0 0 1.381.01l6.74-6.935a1.054 1.054 0 0 0 .01-1.44zM6.947 12.464l3.657 3.785-.974.98-5.273-5.456 5.349-5.378.929.962-3.677 3.7a.998.998 0 0 0-.292.702 1 1 0 0 0 .28.705zm7.35 4.768l-.931-.963 3.68-3.7a1.012 1.012 0 0 0 .007-1.407l-3.656-3.784.974-.98 5.273 5.456-5.348 5.378z"></path></g>
diff --git a/chrome/browser/resources/settings/privacy_page/privacy_page.html b/chrome/browser/resources/settings/privacy_page/privacy_page.html
index 11c6038..9b9618c 100644
--- a/chrome/browser/resources/settings/privacy_page/privacy_page.html
+++ b/chrome/browser/resources/settings/privacy_page/privacy_page.html
@@ -303,6 +303,23 @@
           </category-setting-exceptions>
         </settings-subpage>
       </template>
+      <template is="dom-if" if="[[enableInsecureContentContentSetting_]]">
+        <template is="dom-if" route-path="/content/insecureContent" no-search>
+          <settings-subpage
+              page-title="$i18n{siteSettingsCategoryInsecureContent}"
+              search-label="$i18n{siteSettingsAllSitesSearch}"
+              search-term="{{searchFilter_}}">
+            <div class="settings-box first">
+              $i18n{siteSettingsInsecureContentBlock}
+            </div>
+            <category-setting-exceptions
+                category="[[ContentSettingsTypes.MIXEDSCRIPT]]"
+                block-header="$i18n{siteSettingsBlock}"
+                search-filter="[[searchFilter_]]">
+            </category-setting-exceptions>
+          </settings-subpage>
+        </template>
+      </template>
       <template is="dom-if" route-path="/content/location" no-search>
         <settings-subpage page-title="$i18n{siteSettingsCategoryLocation}"
             search-label="$i18n{siteSettingsAllSitesSearch}"
diff --git a/chrome/browser/resources/settings/privacy_page/privacy_page.js b/chrome/browser/resources/settings/privacy_page/privacy_page.js
index e3d4481..a7b63fd 100644
--- a/chrome/browser/resources/settings/privacy_page/privacy_page.js
+++ b/chrome/browser/resources/settings/privacy_page/privacy_page.js
@@ -136,6 +136,14 @@
     },
 
     /** @private */
+    enableInsecureContentContentSetting_: {
+      type: Boolean,
+      value: function() {
+        return loadTimeData.getBoolean('enableInsecureContentContentSetting');
+      }
+    },
+
+    /** @private */
     enableNativeFileSystemWriteContentSetting_: {
       type: Boolean,
       value: function() {
diff --git a/chrome/browser/resources/settings/route.js b/chrome/browser/resources/settings/route.js
index ecb8f8267..26e34c9c 100644
--- a/chrome/browser/resources/settings/route.js
+++ b/chrome/browser/resources/settings/route.js
@@ -98,6 +98,7 @@
  *   SITE_SETTINGS_FLASH: (undefined|!settings.Route),
  *   SITE_SETTINGS_HANDLERS: (undefined|!settings.Route),
  *   SITE_SETTINGS_IMAGES: (undefined|!settings.Route),
+ *   SITE_SETTINGS_MIXEDSCRIPT: (undefined|!settings.Route),
  *   SITE_SETTINGS_JAVASCRIPT: (undefined|!settings.Route),
  *   SITE_SETTINGS_SENSORS: (undefined|!settings.Route),
  *   SITE_SETTINGS_SOUND: (undefined|!settings.Route),
@@ -329,6 +330,10 @@
       r.SITE_SETTINGS_DATA_DETAILS =
           r.SITE_SETTINGS_SITE_DATA.createChild('/cookies/detail');
       r.SITE_SETTINGS_IMAGES = r.SITE_SETTINGS.createChild('images');
+      if (loadTimeData.getBoolean('enableInsecureContentContentSetting')) {
+        r.SITE_SETTINGS_MIXEDSCRIPT =
+            r.SITE_SETTINGS.createChild('insecureContent');
+      }
       r.SITE_SETTINGS_JAVASCRIPT = r.SITE_SETTINGS.createChild('javascript');
       r.SITE_SETTINGS_SOUND = r.SITE_SETTINGS.createChild('sound');
       r.SITE_SETTINGS_SENSORS = r.SITE_SETTINGS.createChild('sensors');
diff --git a/chrome/browser/resources/settings/site_settings/category_default_setting.js b/chrome/browser/resources/settings/site_settings/category_default_setting.js
index 554bc699..5426cf0 100644
--- a/chrome/browser/resources/settings/site_settings/category_default_setting.js
+++ b/chrome/browser/resources/settings/site_settings/category_default_setting.js
@@ -103,6 +103,7 @@
       case settings.ContentSettingsTypes.BACKGROUND_SYNC:
       case settings.ContentSettingsTypes.IMAGES:
       case settings.ContentSettingsTypes.JAVASCRIPT:
+      case settings.ContentSettingsTypes.MIXEDSCRIPT:
       case settings.ContentSettingsTypes.SOUND:
       case settings.ContentSettingsTypes.SENSORS:
       case settings.ContentSettingsTypes.PAYMENT_HANDLER:
diff --git a/chrome/browser/resources/settings/site_settings/constants.js b/chrome/browser/resources/settings/site_settings/constants.js
index f65608a..f073aa9 100644
--- a/chrome/browser/resources/settings/site_settings/constants.js
+++ b/chrome/browser/resources/settings/site_settings/constants.js
@@ -36,6 +36,7 @@
   CLIPBOARD: 'clipboard',
   SENSORS: 'sensors',
   PAYMENT_HANDLER: 'payment-handler',
+  MIXEDSCRIPT: 'mixed-script',
   BLUETOOTH_SCANNING: 'bluetooth-scanning',
   NATIVE_FILE_SYSTEM_WRITE: 'native-file-system-write',
 };
diff --git a/chrome/browser/resources/settings/site_settings/site_details.html b/chrome/browser/resources/settings/site_settings/site_details.html
index 24e293d..fb24557 100644
--- a/chrome/browser/resources/settings/site_settings/site_details.html
+++ b/chrome/browser/resources/settings/site_settings/site_details.html
@@ -214,6 +214,13 @@
             label="$i18n{siteSettingsBluetoothScanning}">
         </site-details-permission>
       </template>
+      <template is="dom-if" if="[[enableInsecureContentContentSetting_]]">
+        <site-details-permission
+            category="{{ContentSettingsTypes.MIXEDSCRIPT}}"
+            icon="settings:insecure-content" id="mixed-script"
+            label="$i18n{siteSettingsInsecureContent}">
+        </site-details-permission>
+      </template>
     </div>
 
     <website-usage-private-api id="usageApi"
diff --git a/chrome/browser/resources/settings/site_settings/site_details.js b/chrome/browser/resources/settings/site_settings/site_details.js
index 6e85996..df765e0 100644
--- a/chrome/browser/resources/settings/site_settings/site_details.js
+++ b/chrome/browser/resources/settings/site_settings/site_details.js
@@ -70,6 +70,14 @@
             'enableNativeFileSystemWriteContentSetting');
       }
     },
+
+    /** @private */
+    enableInsecureContentContentSetting_: {
+      type: Boolean,
+      value: function() {
+        return loadTimeData.getBoolean('enableInsecureContentContentSetting');
+      }
+    },
   },
 
   listeners: {
diff --git a/chrome/browser/resources/settings/site_settings/site_settings_behavior.js b/chrome/browser/resources/settings/site_settings/site_settings_behavior.js
index a87ec9a..545c49a 100644
--- a/chrome/browser/resources/settings/site_settings/site_settings_behavior.js
+++ b/chrome/browser/resources/settings/site_settings/site_settings_behavior.js
@@ -207,6 +207,9 @@
     addOrRemoveSettingWithFlag(
         settings.ContentSettingsTypes.NATIVE_FILE_SYSTEM_WRITE,
         'enableNativeFileSystemWriteContentSetting');
+    addOrRemoveSettingWithFlag(
+        settings.ContentSettingsTypes.MIXEDSCRIPT,
+        'enableInsecureContentContentSetting');
     return this.contentTypes_.slice(0);
   },
 
diff --git a/chrome/browser/resources/settings/site_settings_page/site_settings_page.html b/chrome/browser/resources/settings/site_settings_page/site_settings_page.html
index b65889b..3db16d2 100644
--- a/chrome/browser/resources/settings/site_settings_page/site_settings_page.html
+++ b/chrome/browser/resources/settings/site_settings_page/site_settings_page.html
@@ -247,6 +247,15 @@
               '$i18nPolymer{siteSettingsPaymentHandlerBlock}')]]"></cr-link-row>
     </template>
 
+    <template is="dom-if" if="[[enableInsecureContentContentSetting_]]">
+      <cr-link-row class="hr two-line" data-route="SITE_SETTINGS_MIXEDSCRIPT"
+          label="$i18n{siteSettingsInsecureContent}"
+          on-click="onTapNavigate_"
+          start-icon="settings:insecure-content"
+          sub-label="$i18n{siteSettingsInsecureContentBlock}"
+      </cr-link-row>
+    </template>
+
     <template is="dom-if" if="[[enableExperimentalWebPlatformFeatures_]]">
       <cr-link-row class="hr two-line"
           data-route="SITE_SETTINGS_BLUETOOTH_SCANNING"
diff --git a/chrome/browser/resources/settings/site_settings_page/site_settings_page.js b/chrome/browser/resources/settings/site_settings_page/site_settings_page.js
index b04a5ac..588b6d0 100644
--- a/chrome/browser/resources/settings/site_settings_page/site_settings_page.js
+++ b/chrome/browser/resources/settings/site_settings_page/site_settings_page.js
@@ -60,6 +60,14 @@
     },
 
     /** @private */
+    enableInsecureContentContentSetting_: {
+      type: Boolean,
+      value: function() {
+        return loadTimeData.getBoolean('enableInsecureContentContentSetting');
+      }
+    },
+
+    /** @private */
     enableNativeFileSystemWriteContentSetting_: {
       type: Boolean,
       value: function() {
@@ -132,6 +140,10 @@
       ]);
     }
 
+    if (this.enableInsecureContentContentSetting_) {
+      pairs.push([R.SITE_SETTINGS_MIXEDSCRIPT, 'mixed-script']);
+    }
+
     pairs.forEach(([route, id]) => {
       this.focusConfig.set(route.path, () => this.async(() => {
         cr.ui.focusWithoutInk(assert(this.$$(`#${id}`)));
diff --git a/chrome/browser/safe_browsing/safe_browsing_blocking_page_unittest.cc b/chrome/browser/safe_browsing/safe_browsing_blocking_page_unittest.cc
index 0c8119e0..20b9f10b 100644
--- a/chrome/browser/safe_browsing/safe_browsing_blocking_page_unittest.cc
+++ b/chrome/browser/safe_browsing/safe_browsing_blocking_page_unittest.cc
@@ -301,7 +301,7 @@
     // get notified of it, so include that notification now.
     Profile* profile =
         Profile::FromBrowserContext(web_contents()->GetBrowserContext());
-    safe_browsing_service->AddPrefService(profile->GetPrefs());
+    safe_browsing_service->OnProfileAdded(profile);
     content::BrowserThread::RunAllPendingTasksOnThreadForTesting(
         content::BrowserThread::IO);
 #if BUILDFLAG(ENABLE_EXTENSIONS)
@@ -1105,10 +1105,10 @@
     auto* safe_browsing_service =
         sb_service_factory.CreateSafeBrowsingService();
     // A profile was created already but SafeBrowsingService wasn't around to
-    // get notified of it, so include that notification now.
-    safe_browsing_service->AddPrefService(
-        Profile::FromBrowserContext(web_contents()->GetBrowserContext())
-            ->GetPrefs());
+    // get notified of it (and it wasn't associated with a ProfileManager), so
+    // include that profile now.
+    safe_browsing_service->OnProfileAdded(
+        Profile::FromBrowserContext(web_contents()->GetBrowserContext()));
     TestingBrowserProcess::GetGlobal()->SetSafeBrowsingService(
         safe_browsing_service);
     g_browser_process->safe_browsing_service()->Initialize();
diff --git a/chrome/browser/safe_browsing/safe_browsing_service.cc b/chrome/browser/safe_browsing/safe_browsing_service.cc
index 5ee096c9..9b6629db 100644
--- a/chrome/browser/safe_browsing/safe_browsing_service.cc
+++ b/chrome/browser/safe_browsing/safe_browsing_service.cc
@@ -128,6 +128,8 @@
   CreateTriggerManager();
 
   // Track profile creation and destruction.
+  if (g_browser_process->profile_manager())
+    g_browser_process->profile_manager()->AddObserver(this);
   profiles_registrar_.Add(this, chrome::NOTIFICATION_PROFILE_CREATED,
                           content::NotificationService::AllSources());
   profiles_registrar_.Add(this, chrome::NOTIFICATION_PROFILE_DESTROYED,
@@ -143,6 +145,8 @@
   shutdown_ = true;
 
   // Remove Profile creation/destruction observers.
+  if (g_browser_process->profile_manager())
+    g_browser_process->profile_manager()->RemoveObserver(this);
   profiles_registrar_.RemoveAll();
 
   // Delete the PrefChangeRegistrars, whose dtors also unregister |this| as an
@@ -341,8 +345,6 @@
       services_delegate_->CreateVerdictCacheManager(profile);
       services_delegate_->CreatePasswordProtectionService(profile);
       services_delegate_->CreateTelemetryService(profile);
-      if (!profile->IsOffTheRecord())
-        AddPrefService(profile->GetPrefs());
       services_delegate_->CreateBinaryUploadService(profile);
       break;
     }
@@ -352,8 +354,6 @@
       services_delegate_->RemoveVerdictCacheManager(profile);
       services_delegate_->RemovePasswordProtectionService(profile);
       services_delegate_->RemoveTelemetryService();
-      if (!profile->IsOffTheRecord())
-        RemovePrefService(profile->GetPrefs());
       services_delegate_->RemoveBinaryUploadService(profile);
       break;
     }
@@ -362,7 +362,9 @@
   }
 }
 
-void SafeBrowsingService::AddPrefService(PrefService* pref_service) {
+void SafeBrowsingService::OnProfileAdded(Profile* profile) {
+  // Start following the safe browsing preference on |pref_service|.
+  PrefService* pref_service = profile->GetPrefs();
   DCHECK(prefs_map_.find(pref_service) == prefs_map_.end());
   std::unique_ptr<PrefChangeRegistrar> registrar =
       std::make_unique<PrefChangeRegistrar>();
@@ -388,15 +390,6 @@
   RecordExtendedReportingMetrics(*pref_service);
 }
 
-void SafeBrowsingService::RemovePrefService(PrefService* pref_service) {
-  if (prefs_map_.find(pref_service) != prefs_map_.end()) {
-    prefs_map_.erase(pref_service);
-    RefreshState();
-  } else {
-    NOTREACHED();
-  }
-}
-
 std::unique_ptr<SafeBrowsingService::StateSubscription>
 SafeBrowsingService::RegisterStateCallback(
     const base::Callback<void(void)>& callback) {
diff --git a/chrome/browser/safe_browsing/safe_browsing_service.h b/chrome/browser/safe_browsing/safe_browsing_service.h
index 9160cb8..7f8bc8e 100644
--- a/chrome/browser/safe_browsing/safe_browsing_service.h
+++ b/chrome/browser/safe_browsing/safe_browsing_service.h
@@ -20,6 +20,7 @@
 #include "base/observer_list.h"
 #include "base/sequenced_task_runner_helpers.h"
 #include "chrome/browser/net/proxy_config_monitor.h"
+#include "chrome/browser/profiles/profile_manager_observer.h"
 #include "chrome/browser/safe_browsing/services_delegate.h"
 #include "components/safe_browsing/buildflags.h"
 #include "components/safe_browsing/common/safe_browsing_prefs.h"
@@ -79,7 +80,8 @@
 // alive until SafeBrowsingService is destroyed, however, they are disabled
 // permanently when Shutdown method is called.
 class SafeBrowsingService : public SafeBrowsingServiceInterface,
-                            public content::NotificationObserver {
+                            public content::NotificationObserver,
+                            public ProfileManagerObserver {
  public:
   static base::FilePath GetCookieFilePathForTesting();
 
@@ -243,11 +245,8 @@
                const content::NotificationSource& source,
                const content::NotificationDetails& details) override;
 
-  // Starts following the safe browsing preference on |pref_service|.
-  void AddPrefService(PrefService* pref_service);
-
-  // Stop following the safe browsing preference on |pref_service|.
-  void RemovePrefService(PrefService* pref_service);
+  // ProfileManagerObserver overrides:
+  void OnProfileAdded(Profile* profile) override;
 
   // Checks if any profile is currently using the safe browsing service, and
   // starts or stops the service accordingly.
diff --git a/chrome/browser/safe_browsing/ui_manager_unittest.cc b/chrome/browser/safe_browsing/ui_manager_unittest.cc
index f323b3e6..d8903e3 100644
--- a/chrome/browser/safe_browsing/ui_manager_unittest.cc
+++ b/chrome/browser/safe_browsing/ui_manager_unittest.cc
@@ -96,9 +96,8 @@
     g_browser_process->safe_browsing_service()->Initialize();
     // A profile was created already but SafeBrowsingService wasn't around to
     // get notified of it, so include that notification now.
-    safe_browsing_service->AddPrefService(
-        Profile::FromBrowserContext(web_contents()->GetBrowserContext())
-            ->GetPrefs());
+    safe_browsing_service->OnProfileAdded(
+        Profile::FromBrowserContext(web_contents()->GetBrowserContext()));
     content::BrowserThread::RunAllPendingTasksOnThreadForTesting(
         content::BrowserThread::IO);
   }
diff --git a/chrome/browser/sync/test/integration/sync_arc_package_helper.cc b/chrome/browser/sync/test/integration/sync_arc_package_helper.cc
index 2c79e3b..b809f4c6 100644
--- a/chrome/browser/sync/test/integration/sync_arc_package_helper.cc
+++ b/chrome/browser/sync/test/integration/sync_arc_package_helper.cc
@@ -9,8 +9,8 @@
 #include "base/command_line.h"
 #include "base/run_loop.h"
 #include "base/strings/string_number_conversions.h"
-#include "chrome/browser/chromeos/arc/arc_session_manager.h"
 #include "chrome/browser/chromeos/arc/arc_util.h"
+#include "chrome/browser/chromeos/arc/session/arc_session_manager.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/sync/test/integration/sync_datatype_helper.h"
 #include "chrome/browser/sync/test/integration/sync_test.h"
diff --git a/chrome/browser/touch_to_fill/android/BUILD.gn b/chrome/browser/touch_to_fill/android/BUILD.gn
index 29da6b2..d225aec 100644
--- a/chrome/browser/touch_to_fill/android/BUILD.gn
+++ b/chrome/browser/touch_to_fill/android/BUILD.gn
@@ -55,9 +55,6 @@
     "//third_party/junit",
     "//third_party/mockito:mockito_java",
   ]
-
-  srcjar_deps =
-      [ "//components/module_installer/android:module_installer_build_config" ]
 }
 
 android_library("test_java") {
diff --git a/chrome/browser/ui/android/infobars/installable_ambient_badge_infobar.cc b/chrome/browser/ui/android/infobars/installable_ambient_badge_infobar.cc
index a468795..8f47af4 100644
--- a/chrome/browser/ui/android/infobars/installable_ambient_badge_infobar.cc
+++ b/chrome/browser/ui/android/infobars/installable_ambient_badge_infobar.cc
@@ -41,8 +41,11 @@
   base::android::ScopedJavaLocalRef<jobject> java_bitmap =
       gfx::ConvertToJavaBitmap(&delegate->GetPrimaryIcon());
 
+  jboolean java_is_primary_icon_maskable = delegate->GetIsPrimaryIconMaskable();
+
   return Java_InstallableAmbientBadgeInfoBar_show(
-      env, delegate->GetIconId(), java_bitmap, java_message_text, java_url);
+      env, delegate->GetIconId(), java_bitmap, java_message_text, java_url,
+      java_is_primary_icon_maskable);
 }
 
 void InstallableAmbientBadgeInfoBar::ProcessButton(int action) {}
diff --git a/chrome/browser/ui/app_list/arc/arc_app_icon.cc b/chrome/browser/ui/app_list/arc/arc_app_icon.cc
index 541e2dd..b6fa7fe 100644
--- a/chrome/browser/ui/app_list/arc/arc_app_icon.cc
+++ b/chrome/browser/ui/app_list/arc/arc_app_icon.cc
@@ -305,7 +305,7 @@
 
   base::PostTaskAndReplyWithResult(
       FROM_HERE,
-      {base::ThreadPool(), base::MayBlock(), base::TaskPriority::BEST_EFFORT},
+      {base::ThreadPool(), base::MayBlock(), base::TaskPriority::USER_VISIBLE},
       base::BindOnce(
           &ArcAppIcon::ReadOnFileThread, scale_factor, path,
           prefs->MaybeGetIconPathForDefaultApp(mapped_app_id_, descriptor)),
diff --git a/chrome/browser/ui/app_list/arc/arc_app_list_prefs.cc b/chrome/browser/ui/app_list/arc/arc_app_list_prefs.cc
index e08a5cf..590853986 100644
--- a/chrome/browser/ui/app_list/arc/arc_app_list_prefs.cc
+++ b/chrome/browser/ui/app_list/arc/arc_app_list_prefs.cc
@@ -19,9 +19,9 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/task/post_task.h"
 #include "base/values.h"
-#include "chrome/browser/chromeos/arc/arc_session_manager.h"
 #include "chrome/browser/chromeos/arc/arc_util.h"
 #include "chrome/browser/chromeos/arc/policy/arc_policy_util.h"
+#include "chrome/browser/chromeos/arc/session/arc_session_manager.h"
 #include "chrome/browser/chromeos/login/demo_mode/demo_session.h"
 #include "chrome/browser/chromeos/login/session/user_session_manager.h"
 #include "chrome/browser/image_decoder.h"
diff --git a/chrome/browser/ui/app_list/arc/arc_app_list_prefs.h b/chrome/browser/ui/app_list/arc/arc_app_list_prefs.h
index 7daf9f8e..71f9e0b 100644
--- a/chrome/browser/ui/app_list/arc/arc_app_list_prefs.h
+++ b/chrome/browser/ui/app_list/arc/arc_app_list_prefs.h
@@ -23,8 +23,8 @@
 #include "base/optional.h"
 #include "base/time/time.h"
 #include "base/timer/timer.h"
-#include "chrome/browser/chromeos/arc/arc_session_manager.h"
 #include "chrome/browser/chromeos/arc/policy/arc_policy_bridge.h"
+#include "chrome/browser/chromeos/arc/session/arc_session_manager.h"
 #include "chrome/browser/ui/app_list/arc/arc_app_icon_descriptor.h"
 #include "components/arc/mojom/app.mojom.h"
 #include "components/arc/session/connection_observer.h"
diff --git a/chrome/browser/ui/app_list/arc/arc_app_test.cc b/chrome/browser/ui/app_list/arc/arc_app_test.cc
index 86f7877..1efec68 100644
--- a/chrome/browser/ui/app_list/arc/arc_app_test.cc
+++ b/chrome/browser/ui/app_list/arc/arc_app_test.cc
@@ -11,9 +11,9 @@
 #include "base/stl_util.h"
 #include "base/strings/stringprintf.h"
 #include "chrome/browser/apps/app_service/arc_apps_factory.h"
-#include "chrome/browser/chromeos/arc/arc_play_store_enabled_preference_handler.h"
-#include "chrome/browser/chromeos/arc/arc_session_manager.h"
 #include "chrome/browser/chromeos/arc/arc_util.h"
+#include "chrome/browser/chromeos/arc/session/arc_play_store_enabled_preference_handler.h"
+#include "chrome/browser/chromeos/arc/session/arc_session_manager.h"
 #include "chrome/browser/chromeos/login/users/fake_chrome_user_manager.h"
 #include "chrome/browser/chromeos/profiles/profile_helper.h"
 #include "chrome/browser/profiles/profile.h"
diff --git a/chrome/browser/ui/app_list/arc/arc_app_unittest.cc b/chrome/browser/ui/app_list/arc/arc_app_unittest.cc
index 1ab669a..c493f8e4 100644
--- a/chrome/browser/ui/app_list/arc/arc_app_unittest.cc
+++ b/chrome/browser/ui/app_list/arc/arc_app_unittest.cc
@@ -28,9 +28,9 @@
 #include "build/build_config.h"
 #include "chrome/browser/apps/app_service/arc_icon_once_loader.h"
 #include "chrome/browser/chromeos/arc/arc_optin_uma.h"
-#include "chrome/browser/chromeos/arc/arc_session_manager.h"
 #include "chrome/browser/chromeos/arc/arc_support_host.h"
 #include "chrome/browser/chromeos/arc/arc_util.h"
+#include "chrome/browser/chromeos/arc/session/arc_session_manager.h"
 #include "chrome/browser/chromeos/login/users/fake_chrome_user_manager.h"
 #include "chrome/browser/extensions/extension_service.h"
 #include "chrome/browser/extensions/extension_service_test_base.h"
diff --git a/chrome/browser/ui/app_list/arc/arc_app_utils.cc b/chrome/browser/ui/app_list/arc/arc_app_utils.cc
index 72c47cb4..bded51ff 100644
--- a/chrome/browser/ui/app_list/arc/arc_app_utils.cc
+++ b/chrome/browser/ui/app_list/arc/arc_app_utils.cc
@@ -19,10 +19,10 @@
 #include "base/values.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/chromeos/arc/arc_migration_guide_notification.h"
-#include "chrome/browser/chromeos/arc/arc_session_manager.h"
 #include "chrome/browser/chromeos/arc/arc_util.h"
 #include "chrome/browser/chromeos/arc/boot_phase_monitor/arc_boot_phase_monitor_bridge.h"
 #include "chrome/browser/chromeos/arc/notification/arc_supervision_transition_notification.h"
+#include "chrome/browser/chromeos/arc/session/arc_session_manager.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/app_list/arc/arc_app_list_prefs.h"
 #include "chrome/browser/ui/ash/launcher/arc_app_shelf_id.h"
diff --git a/chrome/browser/ui/app_list/arc/arc_package_sync_model_type_controller.h b/chrome/browser/ui/app_list/arc/arc_package_sync_model_type_controller.h
index 536c4993..1e2a1df 100644
--- a/chrome/browser/ui/app_list/arc/arc_package_sync_model_type_controller.h
+++ b/chrome/browser/ui/app_list/arc/arc_package_sync_model_type_controller.h
@@ -6,7 +6,7 @@
 #define CHROME_BROWSER_UI_APP_LIST_ARC_ARC_PACKAGE_SYNC_MODEL_TYPE_CONTROLLER_H_
 
 #include "base/macros.h"
-#include "chrome/browser/chromeos/arc/arc_session_manager.h"
+#include "chrome/browser/chromeos/arc/session/arc_session_manager.h"
 #include "chrome/browser/ui/app_list/arc/arc_app_list_prefs.h"
 #include "components/sync/driver/syncable_service_based_model_type_controller.h"
 
diff --git a/chrome/browser/ui/app_list/arc/arc_usb_host_permission_browsertest.cc b/chrome/browser/ui/app_list/arc/arc_usb_host_permission_browsertest.cc
index 57d7195..3e56d1d 100644
--- a/chrome/browser/ui/app_list/arc/arc_usb_host_permission_browsertest.cc
+++ b/chrome/browser/ui/app_list/arc/arc_usb_host_permission_browsertest.cc
@@ -9,8 +9,8 @@
 #include "base/macros.h"
 #include "base/run_loop.h"
 #include "base/strings/utf_string_conversions.h"
-#include "chrome/browser/chromeos/arc/arc_session_manager.h"
 #include "chrome/browser/chromeos/arc/arc_util.h"
+#include "chrome/browser/chromeos/arc/session/arc_session_manager.h"
 #include "chrome/browser/chromeos/login/users/fake_chrome_user_manager.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/app_list/arc/arc_app_list_prefs.h"
diff --git a/chrome/browser/ui/app_list/crostini/crostini_app_icon.cc b/chrome/browser/ui/app_list/crostini/crostini_app_icon.cc
index 4d7c5ca..6c30ad7 100644
--- a/chrome/browser/ui/app_list/crostini/crostini_app_icon.cc
+++ b/chrome/browser/ui/app_list/crostini/crostini_app_icon.cc
@@ -217,7 +217,7 @@
 
   base::PostTaskAndReplyWithResult(
       FROM_HERE,
-      {base::ThreadPool(), base::MayBlock(), base::TaskPriority::BEST_EFFORT},
+      {base::ThreadPool(), base::MayBlock(), base::TaskPriority::USER_VISIBLE},
       base::BindOnce(&CrostiniAppIcon::ReadOnFileThread, scale_factor, path),
       base::BindOnce(&CrostiniAppIcon::OnIconRead,
                      weak_ptr_factory_.GetWeakPtr()));
diff --git a/chrome/browser/ui/ash/assistant/assistant_state_client.h b/chrome/browser/ui/ash/assistant/assistant_state_client.h
index 4e20b42..1160aa4d 100644
--- a/chrome/browser/ui/ash/assistant/assistant_state_client.h
+++ b/chrome/browser/ui/ash/assistant/assistant_state_client.h
@@ -7,7 +7,7 @@
 
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
-#include "chrome/browser/chromeos/arc/arc_session_manager.h"
+#include "chrome/browser/chromeos/arc/session/arc_session_manager.h"
 #include "components/user_manager/user_manager.h"
 
 class PrefChangeRegistrar;
diff --git a/chrome/browser/ui/ash/assistant/assistant_state_client_unittest.cc b/chrome/browser/ui/ash/assistant/assistant_state_client_unittest.cc
index ff47047..5587fcf 100644
--- a/chrome/browser/ui/ash/assistant/assistant_state_client_unittest.cc
+++ b/chrome/browser/ui/ash/assistant/assistant_state_client_unittest.cc
@@ -8,7 +8,7 @@
 #include "ash/public/mojom/assistant_state_controller.mojom.h"
 #include "base/bind.h"
 #include "base/files/scoped_temp_dir.h"
-#include "chrome/browser/chromeos/arc/arc_session_manager.h"
+#include "chrome/browser/chromeos/arc/session/arc_session_manager.h"
 #include "chrome/browser/chromeos/login/users/fake_chrome_user_manager.h"
 #include "chrome/test/base/chrome_ash_test_base.h"
 #include "chrome/test/base/testing_profile.h"
diff --git a/chrome/browser/ui/ash/chrome_browser_main_extra_parts_ash.cc b/chrome/browser/ui/ash/chrome_browser_main_extra_parts_ash.cc
index a9596556..bfb5219f 100644
--- a/chrome/browser/ui/ash/chrome_browser_main_extra_parts_ash.cc
+++ b/chrome/browser/ui/ash/chrome_browser_main_extra_parts_ash.cc
@@ -137,6 +137,14 @@
       chromeos::input_method::InputMethodManager::Get());
   ime_controller_client_->Init();
 
+  // NOTE: The WallpaperControllerClient must be initialized before the
+  // session controller, because the session controller triggers the loading
+  // of users, which itself calls a code path which eventually reaches the
+  // WallpaperControllerClient singleton instance via
+  // chromeos::ChromeUserManagerImpl.
+  wallpaper_controller_client_ = std::make_unique<WallpaperControllerClient>();
+  wallpaper_controller_client_->Init();
+
   session_controller_client_ = std::make_unique<SessionControllerClientImpl>();
   session_controller_client_->Init();
 
@@ -144,9 +152,6 @@
   tablet_mode_page_behavior_ = std::make_unique<TabletModePageBehavior>();
   vpn_list_forwarder_ = std::make_unique<VpnListForwarder>();
 
-  wallpaper_controller_client_ = std::make_unique<WallpaperControllerClient>();
-  wallpaper_controller_client_->Init();
-
   chrome_launcher_controller_initializer_ =
       std::make_unique<internal::ChromeLauncherControllerInitializer>();
 
diff --git a/chrome/browser/ui/ash/launcher/arc_app_launcher_browsertest.cc b/chrome/browser/ui/ash/launcher/arc_app_launcher_browsertest.cc
index 11b12ee2..f5c500b 100644
--- a/chrome/browser/ui/ash/launcher/arc_app_launcher_browsertest.cc
+++ b/chrome/browser/ui/ash/launcher/arc_app_launcher_browsertest.cc
@@ -16,9 +16,9 @@
 #include "base/run_loop.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
-#include "chrome/browser/chromeos/arc/arc_service_launcher.h"
-#include "chrome/browser/chromeos/arc/arc_session_manager.h"
 #include "chrome/browser/chromeos/arc/arc_util.h"
+#include "chrome/browser/chromeos/arc/session/arc_service_launcher.h"
+#include "chrome/browser/chromeos/arc/session/arc_session_manager.h"
 #include "chrome/browser/extensions/extension_browsertest.h"
 #include "chrome/browser/ui/app_list/app_list_client_impl.h"
 #include "chrome/browser/ui/app_list/app_list_controller_delegate.h"
diff --git a/chrome/browser/ui/ash/launcher/arc_app_window_launcher_controller.h b/chrome/browser/ui/ash/launcher/arc_app_window_launcher_controller.h
index 7f98768b..0a5ad03 100644
--- a/chrome/browser/ui/ash/launcher/arc_app_window_launcher_controller.h
+++ b/chrome/browser/ui/ash/launcher/arc_app_window_launcher_controller.h
@@ -12,7 +12,7 @@
 #include "base/macros.h"
 #include "base/scoped_observer.h"
 #include "base/time/time.h"
-#include "chrome/browser/chromeos/arc/arc_session_manager.h"
+#include "chrome/browser/chromeos/arc/session/arc_session_manager.h"
 #include "chrome/browser/ui/app_list/arc/arc_app_list_prefs.h"
 #include "chrome/browser/ui/ash/launcher/app_window_launcher_controller.h"
 #include "chrome/browser/ui/ash/launcher/arc_app_shelf_id.h"
diff --git a/chrome/browser/ui/ash/launcher/arc_shelf_spinner_item_controller.h b/chrome/browser/ui/ash/launcher/arc_shelf_spinner_item_controller.h
index 5dfc65f..07a160d 100644
--- a/chrome/browser/ui/ash/launcher/arc_shelf_spinner_item_controller.h
+++ b/chrome/browser/ui/ash/launcher/arc_shelf_spinner_item_controller.h
@@ -11,7 +11,7 @@
 
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
-#include "chrome/browser/chromeos/arc/arc_session_manager.h"
+#include "chrome/browser/chromeos/arc/session/arc_session_manager.h"
 #include "chrome/browser/ui/app_list/arc/arc_app_list_prefs.h"
 #include "chrome/browser/ui/ash/launcher/shelf_spinner_item_controller.h"
 
diff --git a/chrome/browser/ui/ash/launcher/launcher_controller_helper.cc b/chrome/browser/ui/ash/launcher/launcher_controller_helper.cc
index e12fa69..c745221 100644
--- a/chrome/browser/ui/ash/launcher/launcher_controller_helper.cc
+++ b/chrome/browser/ui/ash/launcher/launcher_controller_helper.cc
@@ -11,8 +11,8 @@
 #include "chrome/browser/apps/app_service/app_service_proxy_factory.h"
 #include "chrome/browser/apps/launch_service/launch_service.h"
 #include "chrome/browser/browser_process.h"
-#include "chrome/browser/chromeos/arc/arc_session_manager.h"
 #include "chrome/browser/chromeos/arc/arc_util.h"
+#include "chrome/browser/chromeos/arc/session/arc_session_manager.h"
 #include "chrome/browser/chromeos/crostini/crostini_registry_service.h"
 #include "chrome/browser/chromeos/crostini/crostini_registry_service_factory.h"
 #include "chrome/browser/chromeos/crostini/crostini_util.h"
diff --git a/chrome/browser/ui/browser.cc b/chrome/browser/ui/browser.cc
index f8a956d..e6ad9f0 100644
--- a/chrome/browser/ui/browser.cc
+++ b/chrome/browser/ui/browser.cc
@@ -153,6 +153,7 @@
 #include "chrome/browser/ui/window_sizer/window_sizer.h"
 #include "chrome/browser/vr/vr_tab_helper.h"
 #include "chrome/common/chrome_constants.h"
+#include "chrome/common/chrome_features.h"
 #include "chrome/common/chrome_switches.h"
 #include "chrome/common/custom_handlers/protocol_handler.h"
 #include "chrome/common/pref_names.h"
@@ -1289,24 +1290,34 @@
   // ContentSettingsObserver::allowRunningInsecureContent.
   FilteredReportInsecureContentRan(resource_url);
 
+  if (allowed_per_prefs)
+    return true;
+
+  if (base::FeatureList::IsEnabled(features::kMixedContentSiteSetting)) {
+    Profile* profile =
+        Profile::FromBrowserContext(web_contents->GetBrowserContext());
+    HostContentSettingsMap* content_settings =
+        HostContentSettingsMapFactory::GetForProfile(profile);
+    return content_settings->GetContentSetting(
+               web_contents->GetLastCommittedURL(), GURL(),
+               CONTENT_SETTINGS_TYPE_MIXEDSCRIPT,
+               std::string()) == CONTENT_SETTING_ALLOW;
+  }
   MixedContentSettingsTabHelper* mixed_content_settings =
       MixedContentSettingsTabHelper::FromWebContents(web_contents);
   DCHECK(mixed_content_settings);
-  if (allowed_per_prefs ||
-      mixed_content_settings->is_running_insecure_content_allowed()) {
-    return true;
-  }
-
-  // Note: this is a browser-side-translation of the call to DidBlockContentType
-  // from inside ContentSettingsObserver::allowRunningInsecureContent.
-  if (!origin.host().empty()) {
+  bool allowed = mixed_content_settings->is_running_insecure_content_allowed();
+  if (!allowed && !origin.host().empty()) {
+    // Note: this is a browser-side-translation of the call to
+    // DidBlockContentType from inside
+    // ContentSettingsObserver::allowRunningInsecureContent.
     TabSpecificContentSettings* tab_settings =
         TabSpecificContentSettings::FromWebContents(web_contents);
     DCHECK(tab_settings);
     tab_settings->OnContentBlockedWithDetail(CONTENT_SETTINGS_TYPE_MIXEDSCRIPT,
                                              base::UTF8ToUTF16(origin.host()));
   }
-  return false;
+  return allowed;
 }
 
 void Browser::OnDidBlockNavigation(content::WebContents* web_contents,
diff --git a/chrome/browser/ui/tabs/tab_renderer_data.cc b/chrome/browser/ui/tabs/tab_renderer_data.cc
index 4116dda..0a210a5d 100644
--- a/chrome/browser/ui/tabs/tab_renderer_data.cc
+++ b/chrome/browser/ui/tabs/tab_renderer_data.cc
@@ -6,6 +6,39 @@
 
 #include "base/process/kill.h"
 #include "build/build_config.h"
+#include "chrome/browser/favicon/favicon_utils.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/ui/tab_ui_helper.h"
+#include "chrome/browser/ui/tabs/tab_strip_model.h"
+#include "chrome/browser/ui/thumbnails/thumbnail_tab_helper.h"
+#include "content/public/browser/web_contents.h"
+
+// static
+TabRendererData TabRendererData::FromTabInModel(TabStripModel* model,
+                                                int index) {
+  content::WebContents* const contents = model->GetWebContentsAt(index);
+
+  TabRendererData data;
+  TabUIHelper* const tab_ui_helper = TabUIHelper::FromWebContents(contents);
+  data.favicon = tab_ui_helper->GetFavicon().AsImageSkia();
+  ThumbnailTabHelper* const thumbnail_tab_helper =
+      ThumbnailTabHelper::FromWebContents(contents);
+  if (thumbnail_tab_helper)
+    data.thumbnail = thumbnail_tab_helper->thumbnail();
+  data.network_state = TabNetworkStateForWebContents(contents);
+  data.title = tab_ui_helper->GetTitle();
+  data.visible_url = contents->GetVisibleURL();
+  data.last_committed_url = contents->GetLastCommittedURL();
+  data.crashed_status = contents->GetCrashedStatus();
+  data.incognito = contents->GetBrowserContext()->IsOffTheRecord();
+  data.pinned = model->IsTabPinned(index);
+  data.show_icon = data.pinned || favicon::ShouldDisplayFavicon(contents);
+  data.blocked = model->IsTabBlocked(index);
+  data.alert_state =
+      chrome::GetHighestPriorityTabAlertStateForContents(contents);
+  data.should_hide_throbber = tab_ui_helper->ShouldHideThrobber();
+  return data;
+}
 
 TabRendererData::TabRendererData() = default;
 TabRendererData::TabRendererData(const TabRendererData& other) = default;
diff --git a/chrome/browser/ui/tabs/tab_renderer_data.h b/chrome/browser/ui/tabs/tab_renderer_data.h
index 392426b..f449640 100644
--- a/chrome/browser/ui/tabs/tab_renderer_data.h
+++ b/chrome/browser/ui/tabs/tab_renderer_data.h
@@ -12,8 +12,12 @@
 #include "ui/gfx/image/image_skia.h"
 #include "url/gurl.h"
 
+class TabStripModel;
+
 // Wraps the state needed by the renderers.
 struct TabRendererData {
+  static TabRendererData FromTabInModel(TabStripModel* model, int index);
+
   TabRendererData();
   TabRendererData(const TabRendererData& other);
   TabRendererData(TabRendererData&& other);
diff --git a/chrome/browser/ui/views/arc_app_dialog_view_browsertest.cc b/chrome/browser/ui/views/arc_app_dialog_view_browsertest.cc
index 801896c8..b69f533 100644
--- a/chrome/browser/ui/views/arc_app_dialog_view_browsertest.cc
+++ b/chrome/browser/ui/views/arc_app_dialog_view_browsertest.cc
@@ -10,8 +10,8 @@
 #include "base/run_loop.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
-#include "chrome/browser/chromeos/arc/arc_session_manager.h"
 #include "chrome/browser/chromeos/arc/arc_util.h"
+#include "chrome/browser/chromeos/arc/session/arc_session_manager.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/app_list/app_list_client_impl.h"
 #include "chrome/browser/ui/app_list/arc/arc_app_list_prefs.h"
diff --git a/chrome/browser/ui/views/arc_data_removal_dialog_view.cc b/chrome/browser/ui/views/arc_data_removal_dialog_view.cc
index 4009c4fb..e6e269d 100644
--- a/chrome/browser/ui/views/arc_data_removal_dialog_view.cc
+++ b/chrome/browser/ui/views/arc_data_removal_dialog_view.cc
@@ -5,7 +5,7 @@
 #include "chrome/browser/ui/app_list/arc/arc_data_removal_dialog.h"
 
 #include "base/macros.h"
-#include "chrome/browser/chromeos/arc/arc_session_manager.h"
+#include "chrome/browser/chromeos/arc/session/arc_session_manager.h"
 #include "chrome/browser/ui/app_list/arc/arc_app_icon_loader.h"
 #include "chrome/browser/ui/app_list/arc/arc_app_utils.h"
 #include "chrome/browser/ui/browser_dialogs.h"
diff --git a/chrome/browser/ui/views/frame/webui_tab_strip_container_view.cc b/chrome/browser/ui/views/frame/webui_tab_strip_container_view.cc
index 93451abb..3f3583c8 100644
--- a/chrome/browser/ui/views/frame/webui_tab_strip_container_view.cc
+++ b/chrome/browser/ui/views/frame/webui_tab_strip_container_view.cc
@@ -15,6 +15,7 @@
 #include "chrome/browser/ui/layout_constants.h"
 #include "chrome/browser/ui/view_ids.h"
 #include "chrome/browser/ui/views/toolbar/toolbar_button.h"
+#include "chrome/browser/ui/webui/tab_strip/tab_strip_ui.h"
 #include "chrome/common/webui_url_constants.h"
 #include "chrome/grit/generated_resources.h"
 #include "ui/base/l10n/l10n_util.h"
@@ -44,6 +45,10 @@
       web_view_->web_contents());
   task_manager::WebContentsTags::CreateForTabContents(
       web_view_->web_contents());
+
+  TabStripUI* tab_strip_ui = static_cast<TabStripUI*>(
+      web_view_->GetWebContents()->GetWebUI()->GetController());
+  tab_strip_ui->Initialize(browser_);
 }
 
 views::NativeViewHost* WebUITabStripContainerView::GetNativeViewHost() {
diff --git a/chrome/browser/ui/views/omnibox/omnibox_result_view.cc b/chrome/browser/ui/views/omnibox/omnibox_result_view.cc
index 135ae73..8461d34 100644
--- a/chrome/browser/ui/views/omnibox/omnibox_result_view.cc
+++ b/chrome/browser/ui/views/omnibox/omnibox_result_view.cc
@@ -67,6 +67,24 @@
       omnibox::kKeywordSearchIcon, GetLayoutConstant(LOCATION_BAR_ICON_SIZE),
       GetColor(OmniboxPart::RESULTS_ICON)));
   keyword_view_->icon()->SizeToPreferredSize();
+
+  if (base::FeatureList::IsEnabled(
+          omnibox::kOmniboxSuggestionTransparencyOptions)) {
+    // This is intentionally not in the tab order by default, but should be
+    // if the user has full-acessibility mode on. This is because this is a
+    // tertiary priority button, which already has a Shift+Delete shortcut.
+    // TODO(tommycli): Make sure we announce the Shift+Delete capability in the
+    // accessibility node data for removable suggestions.
+    AddChildView(remove_suggestion_button_ =
+                     views::CreateVectorImageButton(this).release());
+
+    views::InstallCircleHighlightPathGenerator(remove_suggestion_button_);
+
+    // TODO(tommycli): We may need to update the color for theme changes.
+    views::SetImageFromVectorIcon(remove_suggestion_button_,
+                                  vector_icons::kCloseRoundedIcon,
+                                  GetColor(OmniboxPart::RESULTS_ICON));
+  }
 }
 
 OmniboxResultView::~OmniboxResultView() {}
@@ -95,30 +113,10 @@
     suggestion_tab_switch_button_.reset();
   }
 
-  if (match_.SupportsDeletion() &&
-      base::FeatureList::IsEnabled(
-          omnibox::kOmniboxSuggestionTransparencyOptions)) {
-    // This is intentionally not in the tab order by default, but should be
-    // if the user has full-acessibility mode on. This is because this is a
-    // tertiary priority button, which already has a Shift+Delete shortcut.
-    // TODO(tommycli): Make sure we announce the Shift+Delete capability in the
-    // accessibility node data for removable suggestions.
-    if (!remove_suggestion_button_) {
-      remove_suggestion_button_ = views::CreateVectorImageButton(this);
-      remove_suggestion_button_->set_owned_by_client();
-
-      views::InstallCircleHighlightPathGenerator(
-          remove_suggestion_button_.get());
-
-      // TODO(tommycli): Make sure this is visible in Dark Mode.
-      views::SetImageFromVectorIcon(remove_suggestion_button_.get(),
-                                    vector_icons::kCloseRoundedIcon,
-                                    GetColor(OmniboxPart::RESULTS_ICON));
-
-      AddChildView(remove_suggestion_button_.get());
-    }
-  } else {
-    remove_suggestion_button_.reset();
+  if (remove_suggestion_button_) {
+    // To avoid clutter, don't show the Remove button for matches with keyword.
+    remove_suggestion_button_->SetVisible(match.SupportsDeletion() &&
+                                          !match.associated_keyword);
   }
 
   Invalidate();
@@ -257,7 +255,7 @@
                                       const ui::Event& event) {
   if (button == suggestion_tab_switch_button_.get()) {
     OpenMatch(WindowOpenDisposition::SWITCH_TO_TAB, event.time_stamp());
-  } else if (button == remove_suggestion_button_.get()) {
+  } else if (button == remove_suggestion_button_) {
     // Temporarily inhibit the popup closing on blur while we open the remove
     // suggestion confirmation bubble.
     popup_contents_view_->model()->set_popup_closes_on_blur(false);
@@ -298,7 +296,7 @@
 
   // Add buttons from right to left, shrinking the suggestion width as we go.
   // TODO(tommycli): We should probably use a layout manager here.
-  if (remove_suggestion_button_) {
+  if (remove_suggestion_button_ && remove_suggestion_button_->GetVisible()) {
     const gfx::Size button_size = remove_suggestion_button_->GetPreferredSize();
     suggestion_width -=
         button_size.width() + OmniboxMatchCellView::kMarginRight;
@@ -309,7 +307,6 @@
     remove_suggestion_button_->SetBounds(suggestion_width, vertical_margin,
                                          button_size.width(),
                                          button_size.height());
-    remove_suggestion_button_->SetVisible(true);
   }
   if (suggestion_tab_switch_button_) {
     suggestion_tab_switch_button_->ProvideWidthHint(suggestion_width);
diff --git a/chrome/browser/ui/views/omnibox/omnibox_result_view.h b/chrome/browser/ui/views/omnibox/omnibox_result_view.h
index 24ec719..e7d8927 100644
--- a/chrome/browser/ui/views/omnibox/omnibox_result_view.h
+++ b/chrome/browser/ui/views/omnibox/omnibox_result_view.h
@@ -145,7 +145,9 @@
   OmniboxMatchCellView* suggestion_view_;  // The leading (or left) view.
   OmniboxMatchCellView* keyword_view_;     // The trailing (or right) view.
   std::unique_ptr<OmniboxTabSwitchButton> suggestion_tab_switch_button_;
-  std::unique_ptr<views::ImageButton> remove_suggestion_button_;
+
+  // The "X" button at the end of the match cell, used to remove suggestions.
+  views::ImageButton* remove_suggestion_button_ = nullptr;
 
   base::WeakPtrFactory<OmniboxResultView> weak_factory_{this};
 
diff --git a/chrome/browser/ui/views/page_info/page_info_bubble_view.h b/chrome/browser/ui/views/page_info/page_info_bubble_view.h
index adc3c93..c1381d4 100644
--- a/chrome/browser/ui/views/page_info/page_info_bubble_view.h
+++ b/chrome/browser/ui/views/page_info/page_info_bubble_view.h
@@ -87,6 +87,7 @@
     VIEW_ID_PAGE_INFO_BUTTON_END_VR,
     VIEW_ID_PAGE_INFO_HOVER_BUTTON_VR_PRESENTATION,
     VIEW_ID_PAGE_INFO_BUTTON_LEAVE_SITE,
+    VIEW_ID_PAGE_INFO_BUTTON_IGNORE_WARNING,
   };
 
   // Creates the appropriate page info bubble for the given |url|.
diff --git a/chrome/browser/ui/views/page_info/safety_tip_page_info_bubble_view.cc b/chrome/browser/ui/views/page_info/safety_tip_page_info_bubble_view.cc
index 4a04884..d56289355 100644
--- a/chrome/browser/ui/views/page_info/safety_tip_page_info_bubble_view.cc
+++ b/chrome/browser/ui/views/page_info/safety_tip_page_info_bubble_view.cc
@@ -10,18 +10,22 @@
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_finder.h"
 #include "chrome/browser/ui/browser_window.h"
+#include "chrome/browser/ui/views/accessibility/non_accessible_image_view.h"
 #include "chrome/browser/ui/views/bubble_anchor_util_views.h"
 #include "chrome/browser/ui/views/chrome_layout_provider.h"
 #include "chrome/browser/ui/views/page_info/page_info_bubble_view.h"
+#include "chrome/grit/theme_resources.h"
 #include "components/security_state/core/security_state.h"
 #include "components/strings/grit/components_strings.h"
 #include "ui/base/l10n/l10n_util.h"
+#include "ui/base/resource/resource_bundle.h"
 #include "ui/views/bubble/bubble_frame_view.h"
 #include "ui/views/controls/button/button.h"
 #include "ui/views/controls/button/md_text_button.h"
 #include "ui/views/controls/label.h"
 #include "ui/views/controls/styled_label.h"
 #include "ui/views/layout/grid_layout.h"
+#include "ui/views/style/typography.h"
 #include "ui/views/widget/widget.h"
 #include "ui/views/window/dialog_client_view.h"
 #include "url/gurl.h"
@@ -75,40 +79,109 @@
 
   ChromeLayoutProvider* layout_provider = ChromeLayoutProvider::Get();
 
+  gfx::Insets insets =
+      layout_provider->GetDialogInsetsForContentType(views::TEXT, views::TEXT);
+  set_margins(gfx::Insets(0, 0, insets.bottom(), 0));
+
   // Configure layout.
-  views::GridLayout* layout =
+  views::GridLayout* bubble_layout =
       SetLayoutManager(std::make_unique<views::GridLayout>());
   constexpr int kColumnId = 0;
-  views::ColumnSet* label_col_set = layout->AddColumnSet(kColumnId);
-  label_col_set->AddColumn(views::GridLayout::LEADING, views::GridLayout::FILL,
-                           1.0, views::GridLayout::USE_PREF, 0, 0);
+  views::ColumnSet* bubble_col_set = bubble_layout->AddColumnSet(kColumnId);
+  bubble_col_set->AddColumn(views::GridLayout::LEADING, views::GridLayout::FILL,
+                            1.0, views::GridLayout::USE_PREF, 0, 0);
+
+  // TODO(crbug/996731): Add banner once available. See crrev/c/1816805/7.
+
+  auto bottom_view = std::make_unique<views::View>();
+  views::GridLayout* bottom_layout =
+      bottom_view->SetLayoutManager(std::make_unique<views::GridLayout>());
+  views::ColumnSet* bottom_column_set = bottom_layout->AddColumnSet(0);
+  bottom_column_set->AddPaddingColumn(views::GridLayout::kFixedSize,
+                                      insets.left());
+  bottom_column_set->AddColumn(views::GridLayout::LEADING,
+                               views::GridLayout::FILL, 1.0,
+                               views::GridLayout::USE_PREF, 0, 0);
+  bottom_column_set->AddPaddingColumn(views::GridLayout::kFixedSize,
+                                      insets.right());
 
   // Add text description.
-  layout->StartRow(views::GridLayout::kFixedSize, kColumnId);
-  auto text_label = std::make_unique<views::Label>(l10n_util::GetStringUTF16(
-      safety_tips::GetSafetyTipDescriptionId(safety_tip_status)));
+  const int spacing =
+      layout_provider->GetDistanceMetric(DISTANCE_CONTROL_LIST_VERTICAL);
+  bottom_layout->StartRowWithPadding(views::GridLayout::kFixedSize, kColumnId,
+                                     views::GridLayout::kFixedSize, spacing);
+  auto text_label = std::make_unique<views::Label>(
+      safety_tips::GetSafetyTipDescription(safety_tip_status, suggested_url_));
   text_label->SetMultiLine(true);
   text_label->SetLineHeight(20);
   text_label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
   text_label->SizeToFit(
-      layout_provider->GetDistanceMetric(DISTANCE_BUBBLE_PREFERRED_WIDTH));
-  layout->AddView(std::move(text_label));
+      layout_provider->GetDistanceMetric(DISTANCE_BUBBLE_PREFERRED_WIDTH) -
+      insets.left() - insets.right());
+  bottom_layout->AddView(std::move(text_label));
 
-  // Add leave site button.
-  const int hover_list_spacing = layout_provider->GetDistanceMetric(
-      DISTANCE_RELATED_CONTROL_VERTICAL_SMALL);
-  layout->StartRowWithPadding(views::GridLayout::kFixedSize, kColumnId,
-                              views::GridLayout::kFixedSize,
-                              hover_list_spacing);
-  std::unique_ptr<views::Button> button(
+  // Add buttons.
+  // To make the rest of the layout simpler, they live in their own grid layout.
+  auto button_view = std::make_unique<views::View>();
+  views::GridLayout* button_layout =
+      button_view->SetLayoutManager(std::make_unique<views::GridLayout>());
+  views::ColumnSet* button_column_set = button_layout->AddColumnSet(0);
+  button_column_set->AddColumn(views::GridLayout::LEADING,
+                               views::GridLayout::CENTER, 0.0,
+                               views::GridLayout::USE_PREF, 0, 0);
+  button_column_set->AddPaddingColumn(1.f, 1);
+  button_column_set->AddColumn(views::GridLayout::TRAILING,
+                               views::GridLayout::FILL, 0.0,
+                               views::GridLayout::USE_PREF, 0, 0);
+  button_column_set->AddPaddingColumn(
+      views::GridLayout::kFixedSize,
+      layout_provider->GetDistanceMetric(
+          views::DISTANCE_RELATED_BUTTON_HORIZONTAL));
+  button_column_set->AddColumn(views::GridLayout::TRAILING,
+                               views::GridLayout::FILL, 0.0,
+                               views::GridLayout::USE_PREF, 0, 0);
+
+  button_layout->StartRow(views::GridLayout::kFixedSize, kColumnId);
+
+  // More info button.
+  auto info_text =
+      l10n_util::GetStringUTF16(IDS_PAGE_INFO_SAFETY_TIP_MORE_INFO_LINK);
+  auto info_link = std::make_unique<views::StyledLabel>(info_text, this);
+  views::StyledLabel::RangeStyleInfo link_style =
+      views::StyledLabel::RangeStyleInfo::CreateForLink();
+  gfx::Range details_range(0, info_text.length());
+  info_link->AddStyleRange(details_range, link_style);
+  info_link->SizeToFit(0);
+  info_button_ = button_layout->AddView(std::move(info_link));
+
+  // Ignore button.
+  std::unique_ptr<views::Button> ignore_button(
+      views::MdTextButton::CreateSecondaryUiButton(
+          this,
+          l10n_util::GetStringUTF16(IDS_PAGE_INFO_SAFETY_TIP_IGNORE_BUTTON)));
+  ignore_button->SetID(
+      PageInfoBubbleView::VIEW_ID_PAGE_INFO_BUTTON_IGNORE_WARNING);
+  ignore_button_ = button_layout->AddView(std::move(ignore_button));
+
+  // Leave site button.
+  std::unique_ptr<views::Button> leave_button(
       views::MdTextButton::CreateSecondaryUiBlueButton(
           this,
           l10n_util::GetStringUTF16(
               safety_tips::GetSafetyTipLeaveButtonId(safety_tip_status))));
-  button->SetID(PageInfoBubbleView::VIEW_ID_PAGE_INFO_BUTTON_LEAVE_SITE);
-  leave_button_ =
-      layout->AddView(std::move(button), 1, 1, views::GridLayout::TRAILING,
-                      views::GridLayout::LEADING);
+  leave_button->SetID(PageInfoBubbleView::VIEW_ID_PAGE_INFO_BUTTON_LEAVE_SITE);
+  leave_button_ = button_layout->AddView(std::move(leave_button));
+
+  bottom_layout->StartRowWithPadding(views::GridLayout::kFixedSize, kColumnId,
+                                     views::GridLayout::kFixedSize, spacing);
+  bottom_layout->AddView(
+      std::move(button_view), 1, 1, views::GridLayout::LEADING,
+      views::GridLayout::LEADING,
+      layout_provider->GetDistanceMetric(DISTANCE_BUBBLE_PREFERRED_WIDTH) -
+          insets.left() - insets.right(),
+      0);
+  bubble_layout->StartRow(views::GridLayout::kFixedSize, kColumnId);
+  bubble_layout->AddView(std::move(bottom_view));
 
   Layout();
   SizeToContents();
@@ -159,15 +232,29 @@
   switch (button->GetID()) {
     case PageInfoBubbleView::VIEW_ID_PAGE_INFO_BUTTON_LEAVE_SITE:
       action_taken_ = safety_tips::SafetyTipInteraction::kLeaveSite;
-      auto url = safety_tip_status_ == SafetyTipStatus::kLookalike
-                     ? suggested_url_
-                     : GURL(safety_tips::kSafeUrl);
-      safety_tips::LeaveSite(web_contents(), url);
+      safety_tips::LeaveSite(web_contents(),
+                             safety_tip_status_ == SafetyTipStatus::kLookalike
+                                 ? suggested_url_
+                                 : GURL(safety_tips::kSafeUrl));
+      return;
+
+    case PageInfoBubbleView::VIEW_ID_PAGE_INFO_BUTTON_IGNORE_WARNING:
+      action_taken_ = safety_tips::SafetyTipInteraction::kDismiss;
+      GetWidget()->CloseWithReason(
+          views::Widget::ClosedReason::kCancelButtonClicked);
       return;
   }
   NOTREACHED();
 }
 
+void SafetyTipPageInfoBubbleView::StyledLabelLinkClicked(
+    views::StyledLabel* label,
+    const gfx::Range& range,
+    int event_flags) {
+  action_taken_ = safety_tips::SafetyTipInteraction::kLearnMore;
+  safety_tips::OpenHelpCenter(web_contents());
+}
+
 namespace safety_tips {
 
 void ShowSafetyTipDialog(
diff --git a/chrome/browser/ui/views/page_info/safety_tip_page_info_bubble_view.h b/chrome/browser/ui/views/page_info/safety_tip_page_info_bubble_view.h
index 69e0fb9..4ade5f03 100644
--- a/chrome/browser/ui/views/page_info/safety_tip_page_info_bubble_view.h
+++ b/chrome/browser/ui/views/page_info/safety_tip_page_info_bubble_view.h
@@ -9,6 +9,8 @@
 #include "chrome/browser/ui/views/page_info/page_info_bubble_view_base.h"
 #include "components/security_state/core/security_state.h"
 #include "ui/views/controls/button/button.h"
+#include "ui/views/controls/styled_label.h"
+#include "ui/views/controls/styled_label_listener.h"
 
 namespace content {
 class WebContents;
@@ -19,7 +21,6 @@
 }  // namespace gfx
 
 namespace views {
-class Button;
 class View;
 class Widget;
 }  // namespace views
@@ -28,7 +29,8 @@
 // without all of the details. Safety tip info is still displayed in the usual
 // PageInfoBubbleView, just less prominently.
 class SafetyTipPageInfoBubbleView : public PageInfoBubbleViewBase,
-                                    public views::ButtonListener {
+                                    public views::ButtonListener,
+                                    public views::StyledLabelListener {
  public:
   // If |anchor_view| is nullptr, or has no Widget, |parent_window| may be
   // provided to ensure this bubble is closed when the parent closes.
@@ -53,9 +55,16 @@
   // views::ButtonListener:
   void ButtonPressed(views::Button* button, const ui::Event& event) override;
 
+  // views::StyledLabelListener:
+  void StyledLabelLinkClicked(views::StyledLabel* label,
+                              const gfx::Range& range,
+                              int event_flags) override;
+
  private:
   friend class SafetyTipPageInfoBubbleViewBrowserTest;
 
+  views::StyledLabel* GetLearnMoreLinkForTesting() { return info_button_; }
+  views::Button* GetIgnoreButtonForTesting() { return ignore_button_; }
   views::Button* GetLeaveButtonForTesting() { return leave_button_; }
 
   const security_state::SafetyTipStatus safety_tip_status_;
@@ -67,6 +76,8 @@
   // applicable (for SafetyTipStatus::kLookalike).
   const GURL suggested_url_;
 
+  views::StyledLabel* info_button_;
+  views::Button* ignore_button_;
   views::Button* leave_button_;
   base::OnceCallback<void(safety_tips::SafetyTipInteraction)> close_callback_;
   safety_tips::SafetyTipInteraction action_taken_ =
diff --git a/chrome/browser/ui/views/page_info/safety_tip_page_info_bubble_view_browsertest.cc b/chrome/browser/ui/views/page_info/safety_tip_page_info_bubble_view_browsertest.cc
index f45f06f3..a5532da2 100644
--- a/chrome/browser/ui/views/page_info/safety_tip_page_info_bubble_view_browsertest.cc
+++ b/chrome/browser/ui/views/page_info/safety_tip_page_info_bubble_view_browsertest.cc
@@ -44,6 +44,7 @@
 #include "ui/accessibility/ax_enums.mojom.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/window_open_disposition.h"
+#include "ui/gfx/range/range.h"
 #include "ui/views/test/widget_test.h"
 #include "ui/views/widget/widget.h"
 #include "ui/views/widget/widget_observer.h"
@@ -200,6 +201,14 @@
     PerformMouseClickOnView(bubble->GetLeaveButtonForTesting());
   }
 
+  void ClickLearnMoreLink() {
+    // This class is a friend to SafetyTipPageInfoBubbleView.
+    auto* bubble = static_cast<SafetyTipPageInfoBubbleView*>(
+        PageInfoBubbleViewBase::GetPageInfoBubbleForTesting());
+    bubble->StyledLabelLinkClicked(bubble->GetLearnMoreLinkForTesting(),
+                                   gfx::Range(), 0);
+  }
+
   void CloseWarningLeaveSite(Browser* browser) {
     if (ui_status() == UIStatus::kDisabled) {
       return;
@@ -301,6 +310,21 @@
   ASSERT_NO_FATAL_FAILURE(CheckPageInfoDoesNotShowSafetyTipInfo(browser()));
 }
 
+// Test that clicking 'learn more' opens a help center article.
+IN_PROC_BROWSER_TEST_P(SafetyTipPageInfoBubbleViewBrowserTest,
+                       LearnMoreOpensHelpCenter) {
+  if (ui_status() == UIStatus::kDisabled) {
+    return;
+  }
+
+  auto kNavigatedUrl = GetURL("site1.com");
+  TriggerWarning(browser(), kNavigatedUrl, WindowOpenDisposition::CURRENT_TAB);
+
+  content::WebContentsAddedObserver new_tab_observer;
+  ClickLearnMoreLink();
+  EXPECT_NE(kNavigatedUrl, new_tab_observer.GetWebContents()->GetURL());
+}
+
 // If the user clicks 'leave site', the warning should re-appear when the user
 // re-visits the page.
 IN_PROC_BROWSER_TEST_P(SafetyTipPageInfoBubbleViewBrowserTest,
diff --git a/chrome/browser/ui/views/tabs/browser_tab_strip_controller.cc b/chrome/browser/ui/views/tabs/browser_tab_strip_controller.cc
index 2030d18..91d51116 100644
--- a/chrome/browser/ui/views/tabs/browser_tab_strip_controller.cc
+++ b/chrome/browser/ui/views/tabs/browser_tab_strip_controller.cc
@@ -30,7 +30,6 @@
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
 #include "chrome/browser/ui/tabs/tab_strip_model_delegate.h"
 #include "chrome/browser/ui/tabs/tab_utils.h"
-#include "chrome/browser/ui/thumbnails/thumbnail_tab_helper.h"
 #include "chrome/browser/ui/views/tabs/tab.h"
 #include "chrome/browser/ui/views/tabs/tab_drag_controller.h"
 #include "chrome/browser/ui/views/tabs/tab_strip.h"
@@ -482,9 +481,9 @@
 
       // A move may have resulted in the pinned state changing, so pass in a
       // TabRendererData.
-      tabstrip_->MoveTab(move->from_index, move->to_index,
-                         TabRendererDataFromModel(
-                             move->contents, move->to_index, EXISTING_TAB));
+      tabstrip_->MoveTab(
+          move->from_index, move->to_index,
+          TabRendererData::FromTabInModel(model_, move->to_index));
       break;
     }
     case TabStripModelChange::kReplaced: {
@@ -560,37 +559,10 @@
   return browser_view_->frame()->GetFrameView();
 }
 
-TabRendererData BrowserTabStripController::TabRendererDataFromModel(
-    WebContents* contents,
-    int model_index,
-    TabStatus tab_status) {
-  TabRendererData data;
-  TabUIHelper* const tab_ui_helper = TabUIHelper::FromWebContents(contents);
-  data.favicon = tab_ui_helper->GetFavicon().AsImageSkia();
-  ThumbnailTabHelper* const thumbnail_tab_helper =
-      ThumbnailTabHelper::FromWebContents(contents);
-  if (thumbnail_tab_helper)
-    data.thumbnail = thumbnail_tab_helper->thumbnail();
-  data.network_state = TabNetworkStateForWebContents(contents);
-  data.title = tab_ui_helper->GetTitle();
-  data.visible_url = contents->GetVisibleURL();
-  data.last_committed_url = contents->GetLastCommittedURL();
-  data.crashed_status = contents->GetCrashedStatus();
-  data.incognito = contents->GetBrowserContext()->IsOffTheRecord();
-  data.pinned = model_->IsTabPinned(model_index);
-  data.show_icon = data.pinned || favicon::ShouldDisplayFavicon(contents);
-  data.blocked = model_->IsTabBlocked(model_index);
-  data.alert_state =
-      chrome::GetHighestPriorityTabAlertStateForContents(contents);
-  data.should_hide_throbber = tab_ui_helper->ShouldHideThrobber();
-  return data;
-}
-
 void BrowserTabStripController::SetTabDataAt(content::WebContents* web_contents,
                                              int model_index) {
-  tabstrip_->SetTabData(
-      model_index,
-      TabRendererDataFromModel(web_contents, model_index, EXISTING_TAB));
+  tabstrip_->SetTabData(model_index,
+                        TabRendererData::FromTabInModel(model_, model_index));
 }
 
 void BrowserTabStripController::AddTab(WebContents* contents,
@@ -599,7 +571,7 @@
   // Cancel any pending tab transition.
   hover_tab_selector_.CancelTabTransition();
 
-  tabstrip_->AddTabAt(index, TabRendererDataFromModel(contents, index, NEW_TAB),
+  tabstrip_->AddTabAt(index, TabRendererData::FromTabInModel(model_, index),
                       is_active);
 }
 
diff --git a/chrome/browser/ui/views/tabs/browser_tab_strip_controller.h b/chrome/browser/ui/views/tabs/browser_tab_strip_controller.h
index 1212ebd..2118a35 100644
--- a/chrome/browser/ui/views/tabs/browser_tab_strip_controller.h
+++ b/chrome/browser/ui/views/tabs/browser_tab_strip_controller.h
@@ -20,7 +20,6 @@
 class Browser;
 class BrowserNonClientFrameView;
 class Tab;
-struct TabRendererData;
 
 namespace content {
 class WebContents;
@@ -113,20 +112,9 @@
  private:
   class TabContextMenuContents;
 
-  // The context in which TabRendererDataFromModel is being called.
-  enum TabStatus {
-    NEW_TAB,
-    EXISTING_TAB
-  };
-
   BrowserNonClientFrameView* GetFrameView();
   const BrowserNonClientFrameView* GetFrameView() const;
 
-  // Returns the TabRendererData for the specified tab.
-  TabRendererData TabRendererDataFromModel(content::WebContents* contents,
-                                           int model_index,
-                                           TabStatus tab_status);
-
   // Invokes tabstrip_->SetTabData.
   void SetTabDataAt(content::WebContents* web_contents, int model_index);
 
diff --git a/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_handler.cc b/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_handler.cc
index 7d4b407..626b2d4 100644
--- a/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/add_supervision/add_supervision_handler.cc
@@ -11,7 +11,7 @@
 #include "base/stl_util.h"
 #include "chrome/browser/apps/app_service/app_service_proxy.h"
 #include "chrome/browser/apps/app_service/app_service_proxy_factory.h"
-#include "chrome/browser/chromeos/arc/arc_session_manager.h"
+#include "chrome/browser/chromeos/arc/session/arc_session_manager.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/signin/identity_manager_factory.h"
 #include "chrome/browser/supervised_user/supervised_user_service.h"
diff --git a/chrome/browser/ui/webui/chromeos/login/recommend_apps_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/recommend_apps_screen_handler.cc
index d8a5fa1..c88297b 100644
--- a/chrome/browser/ui/webui/chromeos/login/recommend_apps_screen_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/recommend_apps_screen_handler.cc
@@ -5,7 +5,7 @@
 #include "chrome/browser/ui/webui/chromeos/login/recommend_apps_screen_handler.h"
 
 #include "base/metrics/histogram_macros.h"
-#include "chrome/browser/chromeos/arc/arc_session_manager.h"
+#include "chrome/browser/chromeos/arc/session/arc_session_manager.h"
 #include "chrome/browser/chromeos/login/screens/recommend_apps_screen.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/profiles/profile_manager.h"
diff --git a/chrome/browser/ui/webui/chromeos/login/supervision_transition_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/supervision_transition_screen_handler.cc
index 3542f432e..311bd57 100644
--- a/chrome/browser/ui/webui/chromeos/login/supervision_transition_screen_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/supervision_transition_screen_handler.cc
@@ -9,8 +9,8 @@
 #include "base/logging.h"
 #include "base/metrics/histogram_macros.h"
 #include "chrome/browser/browser_process.h"
-#include "chrome/browser/chromeos/arc/arc_session_manager.h"
 #include "chrome/browser/chromeos/arc/arc_util.h"
+#include "chrome/browser/chromeos/arc/session/arc_session_manager.h"
 #include "chrome/browser/chromeos/login/oobe_screen.h"
 #include "chrome/browser/chromeos/login/screens/supervision_transition_screen.h"
 #include "chrome/browser/profiles/profile_manager.h"
diff --git a/chrome/browser/ui/webui/management_ui.cc b/chrome/browser/ui/webui/management_ui.cc
index cf98a0cd..c7aa92a 100644
--- a/chrome/browser/ui/webui/management_ui.cc
+++ b/chrome/browser/ui/webui/management_ui.cc
@@ -115,14 +115,12 @@
 #endif  // defined(OS_CHROMEOS)
 
   source->UseStringsJs();
+  source->EnableReplaceI18nInJS();
   // Add required resources.
-  source->AddResourcePath("management_browser_proxy.html",
-                          IDR_MANAGEMENT_BROWSER_PROXY_HTML);
   source->AddResourcePath("management_browser_proxy.js",
                           IDR_MANAGEMENT_BROWSER_PROXY_JS);
-  source->AddResourcePath("management_ui.html", IDR_MANAGEMENT_UI_HTML);
   source->AddResourcePath("management_ui.js", IDR_MANAGEMENT_UI_JS);
-  source->AddResourcePath("icons.html", IDR_MANAGEMENT_ICONS_HTML);
+  source->AddResourcePath("icons.js", IDR_MANAGEMENT_ICONS_JS);
   source->SetDefaultResource(IDR_MANAGEMENT_HTML);
   return source;
 }
diff --git a/chrome/browser/ui/webui/management_ui_browsertest.cc b/chrome/browser/ui/webui/management_ui_browsertest.cc
index 8cd3f96..e358945 100644
--- a/chrome/browser/ui/webui/management_ui_browsertest.cc
+++ b/chrome/browser/ui/webui/management_ui_browsertest.cc
@@ -59,7 +59,7 @@
 
   // The browser is not managed.
   const std::string javascript =
-      "management.ManagementBrowserProxyImpl.getInstance()"
+      "window.ManagementBrowserProxyImpl.getInstance()"
       "  .getContextualManagedData()"
       "  .then(managed_result => "
       "    domAutomationController.send(JSON.stringify(managed_result)));";
diff --git a/chrome/browser/ui/webui/settings/about_handler.cc b/chrome/browser/ui/webui/settings/about_handler.cc
index 8c98365c..f4e4940 100644
--- a/chrome/browser/ui/webui/settings/about_handler.cc
+++ b/chrome/browser/ui/webui/settings/about_handler.cc
@@ -55,7 +55,6 @@
 
 #if defined(OS_CHROMEOS)
 #include "base/i18n/time_formatting.h"
-#include "base/system/sys_info.h"
 #include "chrome/browser/chromeos/ownership/owner_settings_service_chromeos.h"
 #include "chrome/browser/chromeos/ownership/owner_settings_service_chromeos_factory.h"
 #include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
@@ -71,7 +70,6 @@
 #include "chromeos/constants/chromeos_switches.h"
 #include "chromeos/dbus/power/power_manager_client.h"
 #include "chromeos/dbus/update_engine_client.h"
-#include "chromeos/dbus/util/version_loader.h"
 #include "chromeos/network/network_state.h"
 #include "chromeos/network/network_state_handler.h"
 #include "chromeos/system/statistics_provider.h"
@@ -228,21 +226,6 @@
   return std::string();
 }
 
-std::unique_ptr<base::DictionaryValue> GetVersionInfo() {
-  std::unique_ptr<base::DictionaryValue> version_info(
-      new base::DictionaryValue);
-
-  version_info->SetString("osVersion",
-                          chromeos::version_loader::GetVersion(
-                              chromeos::version_loader::VERSION_FULL));
-  version_info->SetString("arcVersion",
-                          chromeos::version_loader::GetARCVersion());
-  version_info->SetString("osFirmware",
-                          chromeos::version_loader::GetFirmware());
-
-  return version_info;
-}
-
 #endif  // defined(OS_CHROMEOS)
 
 std::string UpdateStatusToString(VersionUpdater::Status status) {
@@ -356,16 +339,6 @@
                          os_with_linux_license);
   html_source->AddBoolean("aboutEnterpriseManaged", IsEnterpriseManaged());
 
-  base::Time build_time = base::SysInfo::GetLsbReleaseTime();
-  base::string16 build_date = base::TimeFormatFriendlyDate(build_time);
-  html_source->AddString("aboutBuildDate", build_date);
-
-  base::CommandLine::StringType command_line =
-      base::CommandLine::ForCurrentProcess()->GetCommandLineString();
-  html_source->AddString("aboutCommandLine", command_line);
-
-  html_source->AddString("aboutUserAgent", GetUserAgent());
-  html_source->AddString("aboutJsEngineVersion", V8_VERSION_STRING);
   html_source->AddString("endOfLifeMessage", l10n_util::GetStringFUTF16(
                                                  IDS_EOL_NOTIFICATION_EOL,
                                                  ui::GetChromeOSDeviceName()));
@@ -406,9 +379,6 @@
       base::BindRepeating(&AboutHandler::HandleRequestUpdateOverCellular,
                           base::Unretained(this)));
   web_ui()->RegisterMessageCallback(
-      "getVersionInfo", base::BindRepeating(&AboutHandler::HandleGetVersionInfo,
-                                            base::Unretained(this)));
-  web_ui()->RegisterMessageCallback(
       "getRegulatoryInfo",
       base::BindRepeating(&AboutHandler::HandleGetRegulatoryInfo,
                           base::Unretained(this)));
@@ -601,25 +571,6 @@
   }
 }
 
-void AboutHandler::HandleGetVersionInfo(const base::ListValue* args) {
-  CHECK_EQ(1U, args->GetSize());
-  std::string callback_id;
-  CHECK(args->GetString(0, &callback_id));
-
-  base::PostTaskAndReplyWithResult(
-      FROM_HERE,
-      {base::ThreadPool(), base::MayBlock(), base::TaskPriority::USER_VISIBLE},
-      base::Bind(&GetVersionInfo),
-      base::Bind(&AboutHandler::OnGetVersionInfoReady,
-                 weak_factory_.GetWeakPtr(), callback_id));
-}
-
-void AboutHandler::OnGetVersionInfoReady(
-    std::string callback_id,
-    std::unique_ptr<base::DictionaryValue> version_info) {
-  ResolveJavascriptCallback(base::Value(callback_id), *version_info);
-}
-
 void AboutHandler::HandleGetRegulatoryInfo(const base::ListValue* args) {
   CHECK_EQ(1U, args->GetSize());
   std::string callback_id;
diff --git a/chrome/browser/ui/webui/settings/about_handler.h b/chrome/browser/ui/webui/settings/about_handler.h
index d585960..679bad2 100644
--- a/chrome/browser/ui/webui/settings/about_handler.h
+++ b/chrome/browser/ui/webui/settings/about_handler.h
@@ -25,7 +25,6 @@
 #endif  // defined(OS_CHROMEOS)
 
 namespace base {
-class DictionaryValue;
 class FilePath;
 class ListValue;
 }
@@ -100,12 +99,6 @@
   // Sets the release track version.
   void HandleSetChannel(const base::ListValue* args);
 
-  // Retrieves OS, ARC and firmware versions.
-  void HandleGetVersionInfo(const base::ListValue* args);
-  void OnGetVersionInfoReady(
-      std::string callback_id,
-      std::unique_ptr<base::DictionaryValue> version_info);
-
   // Retrieves combined channel info.
   void HandleGetChannelInfo(const base::ListValue* args);
   // Callbacks for version_updater_->GetChannel calls.
diff --git a/chrome/browser/ui/webui/settings/chromeos/android_apps_handler.h b/chrome/browser/ui/webui/settings/chromeos/android_apps_handler.h
index 3a7d0549e..db3d375 100644
--- a/chrome/browser/ui/webui/settings/chromeos/android_apps_handler.h
+++ b/chrome/browser/ui/webui/settings/chromeos/android_apps_handler.h
@@ -11,7 +11,7 @@
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
 #include "base/scoped_observer.h"
-#include "chrome/browser/chromeos/arc/arc_session_manager.h"
+#include "chrome/browser/chromeos/arc/session/arc_session_manager.h"
 #include "chrome/browser/ui/app_list/arc/arc_app_list_prefs.h"
 #include "chrome/browser/ui/webui/settings/settings_page_ui_handler.h"
 
diff --git a/chrome/browser/ui/webui/settings/chromeos/device_storage_handler.h b/chrome/browser/ui/webui/settings/chromeos/device_storage_handler.h
index e4b5023c..4c901c99 100644
--- a/chrome/browser/ui/webui/settings/chromeos/device_storage_handler.h
+++ b/chrome/browser/ui/webui/settings/chromeos/device_storage_handler.h
@@ -16,7 +16,7 @@
 #include "base/optional.h"
 #include "base/scoped_observer.h"
 #include "chrome/browser/browsing_data/site_data_size_collector.h"
-#include "chrome/browser/chromeos/arc/arc_session_manager.h"
+#include "chrome/browser/chromeos/arc/session/arc_session_manager.h"
 #include "chrome/browser/ui/webui/settings/settings_page_ui_handler.h"
 #include "chromeos/dbus/cryptohome/rpc.pb.h"
 #include "chromeos/disks/disk_mount_manager.h"
diff --git a/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc b/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
index 4582dae..9b2af53 100644
--- a/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
+++ b/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
@@ -430,21 +430,17 @@
     {"aboutUpgradeUpdatingPercent", IDS_SETTINGS_UPGRADE_UPDATING_PERCENT},
 
 #if defined(OS_CHROMEOS)
-    {"aboutArcVersionLabel", IDS_SETTINGS_ABOUT_PAGE_ARC_VERSION},
-    {"aboutBuildDateLabel", IDS_VERSION_UI_BUILD_DATE},
+    {"aboutBuildDetailsTitle", IDS_OS_SETTINGS_ABOUT_PAGE_BUILD_DETAILS},
     {"aboutChannelBeta", IDS_SETTINGS_ABOUT_PAGE_CURRENT_CHANNEL_BETA},
     {"aboutChannelCanary", IDS_SETTINGS_ABOUT_PAGE_CURRENT_CHANNEL_CANARY},
     {"aboutChannelDev", IDS_SETTINGS_ABOUT_PAGE_CURRENT_CHANNEL_DEV},
     {"aboutChannelLabel", IDS_SETTINGS_ABOUT_PAGE_CHANNEL},
     {"aboutChannelStable", IDS_SETTINGS_ABOUT_PAGE_CURRENT_CHANNEL_STABLE},
     {"aboutCheckForUpdates", IDS_SETTINGS_ABOUT_PAGE_CHECK_FOR_UPDATES},
-    {"aboutCommandLineLabel", IDS_VERSION_UI_COMMAND_LINE},
     {"aboutCurrentlyOnChannel", IDS_SETTINGS_ABOUT_PAGE_CURRENT_CHANNEL},
     {"aboutDetailedBuildInfo", IDS_SETTINGS_ABOUT_PAGE_DETAILED_BUILD_INFO},
-    {"aboutFirmwareLabel", IDS_SETTINGS_ABOUT_PAGE_FIRMWARE},
     {"aboutOSBanner", IDS_SETTINGS_ABOUT_OS_BANNER},
     {"aboutEndOfLifeTitle", IDS_SETTINGS_ABOUT_PAGE_END_OF_LIFE_TITLE},
-    {"aboutPlatformLabel", IDS_SETTINGS_ABOUT_PAGE_PLATFORM},
     {"aboutRelaunchAndPowerwash",
      IDS_SETTINGS_ABOUT_PAGE_RELAUNCH_AND_POWERWASH},
     {"aboutRollbackInProgress", IDS_SETTINGS_UPGRADE_ROLLBACK_IN_PROGRESS},
@@ -453,7 +449,6 @@
      IDS_SETTINGS_UPGRADE_UPDATING_CHANNEL_SWITCH},
     {"aboutUpgradeSuccessChannelSwitch",
      IDS_SETTINGS_UPGRADE_SUCCESSFUL_CHANNEL_SWITCH},
-    {"aboutUserAgentLabel", IDS_VERSION_UI_USER_AGENT},
     {"aboutTPMFirmwareUpdateTitle",
      IDS_SETTINGS_ABOUT_TPM_FIRMWARE_UPDATE_TITLE},
     {"aboutTPMFirmwareUpdateDescription",
@@ -2783,6 +2778,8 @@
     {"siteSettingsCategoryCookies", IDS_SETTINGS_SITE_SETTINGS_COOKIES},
     {"siteSettingsCategoryHandlers", IDS_SETTINGS_SITE_SETTINGS_HANDLERS},
     {"siteSettingsCategoryImages", IDS_SETTINGS_SITE_SETTINGS_IMAGES},
+    {"siteSettingsCategoryInsecureContent",
+     IDS_SETTINGS_SITE_SETTINGS_INSECURE_CONTENT},
     {"siteSettingsCategoryLocation", IDS_SETTINGS_SITE_SETTINGS_LOCATION},
     {"siteSettingsCategoryJavascript", IDS_SETTINGS_SITE_SETTINGS_JAVASCRIPT},
     {"siteSettingsCategoryMicrophone", IDS_SETTINGS_SITE_SETTINGS_MIC},
@@ -2819,6 +2816,10 @@
     {"siteSettingsMic", IDS_SETTINGS_SITE_SETTINGS_MIC},
     {"siteSettingsNotifications", IDS_SETTINGS_SITE_SETTINGS_NOTIFICATIONS},
     {"siteSettingsImages", IDS_SETTINGS_SITE_SETTINGS_IMAGES},
+    {"siteSettingsInsecureContent",
+     IDS_SETTINGS_SITE_SETTINGS_INSECURE_CONTENT},
+    {"siteSettingsInsecureContentBlock",
+     IDS_SETTINGS_SITE_SETTINGS_INSECURE_CONTENT_BLOCK},
     {"siteSettingsJavascript", IDS_SETTINGS_SITE_SETTINGS_JAVASCRIPT},
     {"siteSettingsSound", IDS_SETTINGS_SITE_SETTINGS_SOUND},
     {"siteSettingsSoundAllow", IDS_SETTINGS_SITE_SETTINGS_SOUND_ALLOW},
@@ -3113,6 +3114,10 @@
       "enableRemovingAllThirdPartyCookies",
       base::FeatureList::IsEnabled(
           browsing_data::features::kEnableRemovingAllThirdPartyCookies));
+
+  html_source->AddBoolean(
+      "enableInsecureContentContentSetting",
+      base::FeatureList::IsEnabled(features::kMixedContentSiteSetting));
 }
 
 #if defined(OS_CHROMEOS)
diff --git a/chrome/browser/ui/webui/site_settings_helper.cc b/chrome/browser/ui/webui/site_settings_helper.cc
index 2e949140..0cacb0b 100644
--- a/chrome/browser/ui/webui/site_settings_helper.cc
+++ b/chrome/browser/ui/webui/site_settings_helper.cc
@@ -92,13 +92,13 @@
     {CONTENT_SETTINGS_TYPE_HID_CHOOSER_DATA, kHidChooserDataGroupType},
     {CONTENT_SETTINGS_TYPE_NATIVE_FILE_SYSTEM_WRITE_GUARD,
      "native-file-system-write"},
+    {CONTENT_SETTINGS_TYPE_MIXEDSCRIPT, "mixed-script"},
 
     // Add new content settings here if a corresponding Javascript string
     // representation for it is not required. Note some exceptions do have UI in
     // Content Settings but do not require a separate string.
     {CONTENT_SETTINGS_TYPE_DEFAULT, nullptr},
     {CONTENT_SETTINGS_TYPE_AUTO_SELECT_CERTIFICATE, nullptr},
-    {CONTENT_SETTINGS_TYPE_MIXEDSCRIPT, nullptr},
     {CONTENT_SETTINGS_TYPE_SSL_CERT_DECISIONS, nullptr},
     {CONTENT_SETTINGS_TYPE_APP_BANNER, nullptr},
     {CONTENT_SETTINGS_TYPE_SITE_ENGAGEMENT, nullptr},
diff --git a/chrome/browser/ui/webui/tab_strip/tab_strip_ui.cc b/chrome/browser/ui/webui/tab_strip/tab_strip_ui.cc
index 3f88e89c..321ba9d 100644
--- a/chrome/browser/ui/webui/tab_strip/tab_strip_ui.cc
+++ b/chrome/browser/ui/webui/tab_strip/tab_strip_ui.cc
@@ -16,6 +16,9 @@
 #include "chrome/browser/themes/theme_properties.h"
 #include "chrome/browser/themes/theme_service.h"
 #include "chrome/browser/themes/theme_service_factory.h"
+#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/tabs/tab_strip_model.h"
+#include "chrome/browser/ui/tabs/tab_strip_model_observer.h"
 #include "chrome/browser/ui/webui/favicon_source.h"
 #include "chrome/browser/ui/webui/theme_handler.h"
 #include "chrome/common/webui_url_constants.h"
@@ -57,15 +60,27 @@
   std::vector<unsigned char> result_;
 };
 
-class TabStripUIHandler : public content::WebUIMessageHandler {
+class TabStripUIHandler : public content::WebUIMessageHandler,
+                          public TabStripModelObserver {
  public:
-  explicit TabStripUIHandler(Profile* profile)
-      : profile_(profile),
+  explicit TabStripUIHandler(Browser* browser)
+      : browser_(browser),
         thumbnail_tracker_(base::Bind(&TabStripUIHandler::HandleThumbnailUpdate,
-                                      base::Unretained(this))) {}
+                                      base::Unretained(this))) {
+    browser_->tab_strip_model()->AddObserver(this);
+  }
   ~TabStripUIHandler() override = default;
 
+  // TabStripModelObserver:
+  void TabChangedAt(content::WebContents* contents,
+                    int index,
+                    TabChangeType change_type) override {
+    // TODO(crbug.com/1006946): re-fetch the TabRendererData using
+    // |TabRendererData::FromTabInModel()|.
+  }
+
  protected:
+  // content::WebUIMessageHandler:
   void RegisterMessages() override {
     web_ui()->RegisterMessageCallback(
         "getThemeColors", base::Bind(&TabStripUIHandler::HandleGetThemeColors,
@@ -84,7 +99,7 @@
     const base::Value& callback_id = args->GetList()[0];
 
     const ui::ThemeProvider& tp =
-        ThemeService::GetThemeProviderForProfile(profile_);
+        ThemeService::GetThemeProviderForProfile(browser_->profile());
 
     // This should return an object of CSS variables to rgba values so that
     // the WebUI can use the CSS variables to color the tab strip
@@ -115,10 +130,6 @@
     colors.SetString("--tabstrip-indicator-capturing-color",
                      color_utils::SkColorToRgbaString(tp.GetColor(
                          ThemeProperties::COLOR_TAB_ALERT_CAPTURING)));
-    colors.SetString("--tabstrip-tab-blocked-color",
-                     color_utils::SkColorToRgbaString(
-                         ui::NativeTheme::GetInstanceForWeb()->GetSystemColor(
-                             ui::NativeTheme::kColorId_ProminentButtonColor)));
 
     ResolveJavascriptCallback(callback_id, colors);
   }
@@ -131,8 +142,8 @@
       return;
 
     content::WebContents* tab = nullptr;
-    if (!extensions::ExtensionTabUtil::GetTabById(tab_id, profile_, true,
-                                                  &tab)) {
+    if (!extensions::ExtensionTabUtil::GetTabById(tab_id, browser_->profile(),
+                                                  true, &tab)) {
       // ID didn't refer to a valid tab.
       DVLOG(1) << "Invalid tab ID";
       return;
@@ -180,7 +191,7 @@
                       base::Value(encoded_image));
   }
 
-  Profile* profile_;
+  Browser* const browser_;
   ThumbnailTracker thumbnail_tracker_;
 
   DISALLOW_COPY_AND_ASSIGN(TabStripUIHandler);
@@ -222,7 +233,10 @@
                    profile, chrome::FaviconUrlFormat::kFavicon2));
 
   web_ui->AddMessageHandler(std::make_unique<ThemeHandler>());
-  web_ui->AddMessageHandler(std::make_unique<TabStripUIHandler>(profile));
 }
 
 TabStripUI::~TabStripUI() {}
+
+void TabStripUI::Initialize(Browser* browser) {
+  web_ui()->AddMessageHandler(std::make_unique<TabStripUIHandler>(browser));
+}
diff --git a/chrome/browser/ui/webui/tab_strip/tab_strip_ui.h b/chrome/browser/ui/webui/tab_strip/tab_strip_ui.h
index 8e8b31d..c677074 100644
--- a/chrome/browser/ui/webui/tab_strip/tab_strip_ui.h
+++ b/chrome/browser/ui/webui/tab_strip/tab_strip_ui.h
@@ -9,6 +9,8 @@
 #include "chrome/browser/ui/webui/tab_strip/thumbnail_tracker.h"
 #include "content/public/browser/web_ui_controller.h"
 
+class Browser;
+
 // The WebUI version of the tab strip in the browser. It is currently only
 // supported on ChromeOS in tablet mode.
 class TabStripUI : public content::WebUIController {
@@ -16,6 +18,10 @@
   explicit TabStripUI(content::WebUI* web_ui);
   ~TabStripUI() override;
 
+  // Initialize TabStripUI with the Browser it is running in. Must be called
+  // exactly once. The WebUI won't work until this is called.
+  void Initialize(Browser* browser);
+
  private:
   void HandleThumbnailUpdate(int extension_tab_id, gfx::ImageSkia image);
 
diff --git a/chrome/browser/upgrade_detector/upgrade_detector_impl.cc b/chrome/browser/upgrade_detector/upgrade_detector_impl.cc
index 432e378..07850fd 100644
--- a/chrome/browser/upgrade_detector/upgrade_detector_impl.cc
+++ b/chrome/browser/upgrade_detector/upgrade_detector_impl.cc
@@ -31,6 +31,7 @@
 #include "base/time/default_tick_clock.h"
 #include "base/time/tick_clock.h"
 #include "base/time/time.h"
+#include "build/branding_buildflags.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/google/google_brand.h"
 #include "chrome/browser/obsolete_system/obsolete_system.h"
@@ -74,6 +75,14 @@
 // The number of days after which we identify a build/install as outdated.
 constexpr base::TimeDelta kOutdatedBuildAge = base::TimeDelta::FromDays(12 * 7);
 
+constexpr bool ShouldDetectOutdatedBuilds() {
+#if BUILDFLAG(GOOGLE_CHROME_BRANDING)
+  return true;
+#else   // BUILDFLAG(GOOGLE_CHROME_BRANDING)
+  return false;
+#endif  // BUILDFLAG(GOOGLE_CHROME_BRANDING)
+}
+
 // Return the string that was passed as a value for the
 // kCheckForUpdateIntervalSec switch.
 std::string CmdLineInterval() {
@@ -414,6 +423,9 @@
       return false;
     }
 #endif
+
+    if (!ShouldDetectOutdatedBuilds())
+      return false;
   }
 
   base::Time network_time;
diff --git a/chrome/browser/vr/service/browser_xr_runtime.cc b/chrome/browser/vr/service/browser_xr_runtime.cc
index 5f8dbbe..12bf6e8 100644
--- a/chrome/browser/vr/service/browser_xr_runtime.cc
+++ b/chrome/browser/vr/service/browser_xr_runtime.cc
@@ -13,6 +13,7 @@
 #include "content/public/browser/render_frame_host.h"
 #include "content/public/browser/render_process_host.h"
 #include "content/public/browser/web_contents.h"
+#include "content/public/common/content_features.h"
 #include "device/vr/buildflags/buildflags.h"
 #include "device/vr/vr_device.h"
 #include "ui/gfx/transform.h"
@@ -167,6 +168,13 @@
     device::mojom::XRSessionFeature::REF_SPACE_LOCAL_FLOOR,
 };
 
+constexpr device::mojom::XRSessionFeature kARCoreDeviceFeatures[] = {
+    device::mojom::XRSessionFeature::REF_SPACE_VIEWER,
+    device::mojom::XRSessionFeature::REF_SPACE_LOCAL,
+    device::mojom::XRSessionFeature::REF_SPACE_LOCAL_FLOOR,
+    device::mojom::XRSessionFeature::REF_SPACE_UNBOUNDED,
+};
+
 #if BUILDFLAG(ENABLE_OPENVR)
 constexpr device::mojom::XRSessionFeature kOpenVRFeatures[] = {
     device::mojom::XRSessionFeature::REF_SPACE_VIEWER,
@@ -241,11 +249,17 @@
 bool BrowserXRRuntime::SupportsFeature(
     device::mojom::XRSessionFeature feature) const {
   switch (id_) {
-    // TODO(crbug.com/995370): Add ARCore feature support.
-    case device::mojom::XRDeviceId::ARCORE_DEVICE_ID:
+    // Test/fake devices support all features.
     case device::mojom::XRDeviceId::WEB_TEST_DEVICE_ID:
     case device::mojom::XRDeviceId::FAKE_DEVICE_ID:
       return true;
+    case device::mojom::XRDeviceId::ARCORE_DEVICE_ID:
+      // Only support DOM overlay if the feature flag is enabled.
+      if (feature ==
+          device::mojom::XRSessionFeature::DOM_OVERLAY_FOR_HANDHELD_AR) {
+        return base::FeatureList::IsEnabled(features::kWebXrArDOMOverlay);
+      }
+      return ContainsFeature(kARCoreDeviceFeatures, feature);
     case device::mojom::XRDeviceId::ORIENTATION_DEVICE_ID:
       return ContainsFeature(kOrientationDeviceFeatures, feature);
     case device::mojom::XRDeviceId::GVR_DEVICE_ID:
diff --git a/chrome/browser/vr/service/vr_service_impl.cc b/chrome/browser/vr/service/vr_service_impl.cc
index c9af49d..18006eb 100644
--- a/chrome/browser/vr/service/vr_service_impl.cc
+++ b/chrome/browser/vr/service/vr_service_impl.cc
@@ -496,6 +496,11 @@
     runtime_options->render_frame_id = render_frame_host_->GetRoutingID();
   }
 #endif
+  // Make the resolved enabled features available to the runtime.
+  runtime_options->enabled_features.reserve(enabled_features.size());
+  for (const auto& feature : enabled_features) {
+    runtime_options->enabled_features.push_back(feature);
+  }
 
   if (runtime_options->immersive) {
     GetSessionMetricsHelper()->ReportRequestPresent(*runtime_options);
diff --git a/chrome/browser/vr/service/xr_runtime_manager.cc b/chrome/browser/vr/service/xr_runtime_manager.cc
index c4c545b..01c5491 100644
--- a/chrome/browser/vr/service/xr_runtime_manager.cc
+++ b/chrome/browser/vr/service/xr_runtime_manager.cc
@@ -155,8 +155,11 @@
       DVLOG(1) << __func__ << ": non-immersive AR mode is unsupported";
       return nullptr;
     }
-    // Return the ARCore runtime.
-    return GetRuntime(device::mojom::XRDeviceId::ARCORE_DEVICE_ID);
+    // Return the ARCore runtime, but only if it supports all required features.
+    auto* runtime = GetRuntime(device::mojom::XRDeviceId::ARCORE_DEVICE_ID);
+    return runtime && runtime->SupportsAllFeatures(options->required_features)
+               ? runtime
+               : nullptr;
   }
 
   if (options->immersive) {
diff --git a/chrome/common/chrome_features.cc b/chrome/common/chrome_features.cc
index f74c4a9c..af5c5c4 100644
--- a/chrome/common/chrome_features.cc
+++ b/chrome/common/chrome_features.cc
@@ -493,6 +493,13 @@
     "AcknowledgeNtpOverrideOnDeactivate", base::FEATURE_DISABLED_BY_DEFAULT};
 #endif
 
+// Enables showing an entry for mixed content in site settings, which controls
+// allowing blockable mixed content. When enabled, the mixed content shield is
+// not shown on the omnibox, since its functionality is replaced by the
+// setting.
+const base::Feature kMixedContentSiteSetting{"MixedContentSiteSetting",
+                                             base::FEATURE_DISABLED_BY_DEFAULT};
+
 #if !defined(OS_ANDROID)
 const base::Feature kOnConnectNative{"OnConnectNative",
                                      base::FEATURE_DISABLED_BY_DEFAULT};
diff --git a/chrome/common/chrome_features.h b/chrome/common/chrome_features.h
index 106e4ca..692b6fe 100644
--- a/chrome/common/chrome_features.h
+++ b/chrome/common/chrome_features.h
@@ -319,9 +319,11 @@
 extern const base::Feature kAcknowledgeNtpOverrideOnDeactivate;
 #endif
 
-#if !defined(OS_ANDROID)
 COMPONENT_EXPORT(CHROME_FEATURES)
-extern const base::Feature kOnConnectNative;
+extern const base::Feature kMixedContentSiteSetting;
+
+#if !defined(OS_ANDROID)
+COMPONENT_EXPORT(CHROME_FEATURES) extern const base::Feature kOnConnectNative;
 #endif
 
 #if BUILDFLAG(ENABLE_NATIVE_NOTIFICATIONS)
diff --git a/chrome/common/url_constants.cc b/chrome/common/url_constants.cc
index f9f75d4..b625959 100644
--- a/chrome/common/url_constants.cc
+++ b/chrome/common/url_constants.cc
@@ -222,6 +222,9 @@
 const char kResetProfileSettingsLearnMoreURL[] =
     "https://support.google.com/chrome/?p=ui_reset_settings";
 
+const char kSafetyTipHelpCenterURL[] =
+    "https://support.google.com/chrome/?p=safety_tip";
+
 const char kSettingsSearchHelpURL[] =
 #if defined(OS_CHROMEOS)
     "https://support.google.com/chromebook/?p=settings_search_help";
diff --git a/chrome/common/url_constants.h b/chrome/common/url_constants.h
index bfec16e..e839c1fb 100644
--- a/chrome/common/url_constants.h
+++ b/chrome/common/url_constants.h
@@ -189,6 +189,9 @@
 // "Learn more" URL for resetting profile preferences.
 extern const char kResetProfileSettingsLearnMoreURL[];
 
+// "Learn more" URL for safety tip bubble.
+extern const char kSafetyTipHelpCenterURL[];
+
 // Help URL for the settings page's search feature.
 extern const char kSettingsSearchHelpURL[];
 
diff --git a/chrome/installer/gcapi_mac/gcapi.mm b/chrome/installer/gcapi_mac/gcapi.mm
index 5ab1bbe..8052cb63 100644
--- a/chrome/installer/gcapi_mac/gcapi.mm
+++ b/chrome/installer/gcapi_mac/gcapi.mm
@@ -58,8 +58,8 @@
   // 10.2.
   int mac_os_x_minor_version = darwin_major_version - 4;
 
-  // Chrome is known to work on 10.9 - 10.13.
-  return mac_os_x_minor_version >= 9 && mac_os_x_minor_version <= 13;
+  // Chrome is known to work on 10.10 - 10.15.
+  return mac_os_x_minor_version >= 10 && mac_os_x_minor_version <= 15;
 }
 
 // Returns the pid/gid of the logged-in user, even if getuid() claims that the
diff --git a/chrome/renderer/content_settings_observer.cc b/chrome/renderer/content_settings_observer.cc
index 87b2be2..e45e69f51 100644
--- a/chrome/renderer/content_settings_observer.cc
+++ b/chrome/renderer/content_settings_observer.cc
@@ -8,8 +8,10 @@
 #include <vector>
 
 #include "base/bind.h"
+#include "base/feature_list.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/strings/string_number_conversions.h"
+#include "chrome/common/chrome_features.h"
 #include "chrome/common/client_hints.mojom.h"
 #include "chrome/common/client_hints/client_hints.h"
 #include "chrome/common/render_messages.h"
@@ -446,16 +448,27 @@
     bool allowed_per_settings,
     const blink::WebSecurityOrigin& origin,
     const blink::WebURL& resource_url) {
+  bool allow = allowed_per_settings;
+
+  if (base::FeatureList::IsEnabled(features::kMixedContentSiteSetting)) {
+    if (content_setting_rules_) {
+      auto setting = GetContentSettingFromRules(
+          content_setting_rules_->mixed_content_rules,
+          render_frame()->GetWebFrame(), GURL());
+      allow |= (setting == CONTENT_SETTING_ALLOW);
+    }
+  } else {
+    allow |= allow_running_insecure_content_;
+    if (!allow) {
+      DidBlockContentType(CONTENT_SETTINGS_TYPE_MIXEDSCRIPT);
+    }
+  }
+
   // Note: this implementation is a mirror of
   // Browser::ShouldAllowRunningInsecureContent.
   FilteredReportInsecureContentRan(GURL(resource_url));
 
-  if (!allow_running_insecure_content_ && !allowed_per_settings) {
-    DidBlockContentType(CONTENT_SETTINGS_TYPE_MIXEDSCRIPT);
-    return false;
-  }
-
-  return true;
+  return allow;
 }
 
 bool ContentSettingsObserver::AllowAutoplay(bool default_value) {
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index 22bd7ec..f2c8788 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -81,6 +81,7 @@
   }
 
   generate_jni("test_support_jni_headers") {
+    testonly = true
     sources = [
       "android/test_support/src/org/chromium/chrome/test_support/PaymentRequestTestBridge.java",
     ]
@@ -606,9 +607,6 @@
       "android/browsertests_apk/src/org/chromium/android_browsertests_apk/ChromeBrowserTestsActivity.java",
       "android/browsertests_apk/src/org/chromium/android_browsertests_apk/ChromeBrowserTestsApplication.java",
     ]
-    srcjar_deps = [
-      "//components/module_installer/android:module_installer_build_config",
-    ]
   }
 
   jinja_template("android_browsertests_manifest") {
@@ -2010,12 +2008,12 @@
         "../browser/chromeos/app_mode/kiosk_crash_restore_browsertest.cc",
         "../browser/chromeos/apps/apk_web_app_installer_browsertest.cc",
         "../browser/chromeos/arc/accessibility/arc_accessibility_helper_bridge_browsertest.cc",
-        "../browser/chromeos/arc/arc_session_manager_browsertest.cc",
         "../browser/chromeos/arc/auth/arc_active_directory_enrollment_token_fetcher_browsertest.cc",
         "../browser/chromeos/arc/auth/arc_auth_service_browsertest.cc",
         "../browser/chromeos/arc/auth/arc_robot_auth_code_fetcher_browsertest.cc",
         "../browser/chromeos/arc/enterprise/cert_store/arc_cert_store_bridge_browsertest.cc",
         "../browser/chromeos/arc/intent_helper/arc_settings_service_browsertest.cc",
+        "../browser/chromeos/arc/session/arc_session_manager_browsertest.cc",
         "../browser/chromeos/arc/user_session/arc_user_session_service_browsertest.cc",
         "../browser/chromeos/attestation/attestation_policy_browsertest.cc",
         "../browser/chromeos/base/locale_util_browsertest.cc",
@@ -3671,10 +3669,6 @@
         "//chrome/android/modules/dev_ui/provider:java",
       ]
     }
-
-    srcjar_deps = [
-      "//components/module_installer/android:module_installer_build_config",
-    ]
   } else {
     # !is_android
     sources += [
diff --git a/chrome/test/base/testing_profile.cc b/chrome/test/base/testing_profile.cc
index 68a2a83..06b05c5 100644
--- a/chrome/test/base/testing_profile.cc
+++ b/chrome/test/base/testing_profile.cc
@@ -142,7 +142,7 @@
 #endif
 
 #if defined(OS_CHROMEOS)
-#include "chrome/browser/chromeos/arc/arc_service_launcher.h"
+#include "chrome/browser/chromeos/arc/session/arc_service_launcher.h"
 #include "chrome/browser/chromeos/net/delay_network_call.h"
 #include "chrome/browser/chromeos/settings/cros_settings.h"
 #include "chromeos/components/account_manager/account_manager.h"
diff --git a/chrome/test/data/extensions/api_test/automation/tests/tabs/attributes.js b/chrome/test/data/extensions/api_test/automation/tests/tabs/attributes.js
index 0325249..fd5dc748 100644
--- a/chrome/test/data/extensions/api_test/automation/tests/tabs/attributes.js
+++ b/chrome/test/data/extensions/api_test/automation/tests/tabs/attributes.js
@@ -24,10 +24,10 @@
                         'ariaRowCount',
                         'ariaColumnCount' ];
 var TableCellAttributes = [ 'tableCellColumnIndex',
-                            'ariaCellColumnIndex',
+                            'tableCellAriaColumnIndex',
                             'tableCellColumnSpan',
                             'tableCellRowIndex',
-                            'ariaCellRowIndex',
+                            'tableCellAriaRowIndex',
                             'tableCellRowSpan' ];
 
 var disabledTests = [
@@ -204,60 +204,60 @@
     var row1 = table.firstChild;
     var cell1 = row1.firstChild;
     assertEq(0, cell1.tableCellColumnIndex);
-    assertEq(51, cell1.ariaCellColumnIndex);
+    assertEq(51, cell1.tableCellAriaColumnIndex);
     assertEq(1, cell1.tableCellColumnSpan);
     assertEq(0, cell1.tableCellRowIndex);
-    assertEq(101, cell1.ariaCellRowIndex);
+    assertEq(101, cell1.tableCellAriaRowIndex);
     assertEq(1, cell1.tableCellRowSpan);
 
     var cell2 = cell1.nextSibling;
     assertEq(1, cell2.tableCellColumnIndex);
-    assertEq(52, cell2.ariaCellColumnIndex);
+    assertEq(52, cell2.tableCellAriaColumnIndex);
     assertEq(1, cell2.tableCellColumnSpan);
     assertEq(0, cell2.tableCellRowIndex);
-    assertEq(101, cell2.ariaCellRowIndex);
+    assertEq(101, cell2.tableCellAriaRowIndex);
     assertEq(1, cell2.tableCellRowSpan);
 
     var cell3 = cell2.nextSibling;
     assertEq(2, cell3.tableCellColumnIndex);
-    assertEq(53, cell3.ariaCellColumnIndex);
+    assertEq(53, cell3.tableCellAriaColumnIndex);
     assertEq(1, cell3.tableCellColumnSpan);
     assertEq(0, cell3.tableCellRowIndex);
-    assertEq(101, cell3.ariaCellRowIndex);
+    assertEq(101, cell3.tableCellAriaRowIndex);
     assertEq(1, cell3.tableCellRowSpan);
 
     var row2 = row1.nextSibling;
     var cell4 = row2.firstChild;
     assertEq(0, cell4.tableCellColumnIndex);
-    assertEq(51, cell4.ariaCellColumnIndex);
+    assertEq(51, cell4.tableCellAriaColumnIndex);
     assertEq(2, cell4.tableCellColumnSpan);
     assertEq(1, cell4.tableCellRowIndex);
-    assertEq(102, cell4.ariaCellRowIndex);
+    assertEq(102, cell4.tableCellAriaRowIndex);
     assertEq(1, cell4.tableCellRowSpan);
 
     var cell5 = cell4.nextSibling;
     assertEq(2, cell5.tableCellColumnIndex);
-    assertEq(53, cell5.ariaCellColumnIndex);
+    assertEq(53, cell5.tableCellAriaColumnIndex);
     assertEq(1, cell5.tableCellColumnSpan);
     assertEq(1, cell5.tableCellRowIndex);
-    assertEq(102, cell5.ariaCellRowIndex);
+    assertEq(102, cell5.tableCellAriaRowIndex);
     assertEq(2, cell5.tableCellRowSpan);
 
     var row3 = row2.nextSibling;
     var cell6 = row3.firstChild;
     assertEq(0, cell6.tableCellColumnIndex);
-    assertEq(51, cell6.ariaCellColumnIndex);
+    assertEq(51, cell6.tableCellAriaColumnIndex);
     assertEq(1, cell6.tableCellColumnSpan);
     assertEq(2, cell6.tableCellRowIndex);
-    assertEq(103, cell6.ariaCellRowIndex);
+    assertEq(103, cell6.tableCellAriaRowIndex);
     assertEq(1, cell6.tableCellRowSpan);
 
     var cell7 = cell6.nextSibling;
     assertEq(1, cell7.tableCellColumnIndex);
-    assertEq(52, cell7.ariaCellColumnIndex);
+    assertEq(52, cell7.tableCellAriaColumnIndex);
     assertEq(1, cell7.tableCellColumnSpan);
     assertEq(2, cell7.tableCellRowIndex);
-    assertEq(103, cell7.ariaCellRowIndex);
+    assertEq(103, cell7.tableCellAriaRowIndex);
     assertEq(1, cell7.tableCellRowSpan);
 
     chrome.test.succeed();
diff --git a/chrome/test/data/local_ntp/customize_menu_browsertest.js b/chrome/test/data/local_ntp/customize_menu_browsertest.js
index f71392a..21b86e5 100644
--- a/chrome/test/data/local_ntp/customize_menu_browsertest.js
+++ b/chrome/test/data/local_ntp/customize_menu_browsertest.js
@@ -30,6 +30,9 @@
   COLORS_THEME_UNINSTALL: 'colors-theme-uninstall',
   CUSTOMIZATION_MENU: 'customization-menu',
   CUSTOM_BG: 'custom-bg',
+  CUSTOM_BG_ATTR: 'custom-bg-attr',
+  CUSTOM_BG_ATTR_LINE1: 'attr1',
+  CUSTOM_BG_ATTR_LINE2: 'attr2',
   CUSTOM_BG_PREVIEW: 'custom-bg-preview',
   EDIT_BG: 'edit-bg',
   MENU_BACK: 'menu-back',
@@ -338,13 +341,29 @@
 
   $(test.customizeMenu.IDS.EDIT_BG).click();
 
-  // Select a background.
   setupFakeAsyncImageLoad('coll_tile_0');
   $('coll_tile_0').click();
-  $('coll_0_img_tile_0').click();
 
-  // Check that correct styling is applied to the page.
+  // Check styling and attribution for default background.
+  assertFalse(document.body.classList.contains('alternate-logo'));
+  assertEquals(null, $(test.customizeMenu.IDS.CUSTOM_BG_ATTR_LINE1));
+  assertEquals(null, $(test.customizeMenu.IDS.CUSTOM_BG_ATTR_LINE2));
+  assertEquals('', $(test.customizeMenu.IDS.CUSTOM_BG_ATTR).href);
+
+  // Select a background and check that correct styling and attributes are
+  // applied to the page.
+  const image_tile = $('coll_0_img_tile_0');
+  image_tile.click();
   assertTrue(document.body.classList.contains('alternate-logo'));
+  assertEquals(
+      image_tile.dataset.attributionLine1,
+      $(test.customizeMenu.IDS.CUSTOM_BG_ATTR_LINE1).innerText);
+  assertEquals(
+      image_tile.dataset.attributionLine2,
+      $(test.customizeMenu.IDS.CUSTOM_BG_ATTR_LINE2).innerText);
+  assertEquals(
+      image_tile.dataset.attributionActionUrl,
+      $(test.customizeMenu.IDS.CUSTOM_BG_ATTR).href);
 };
 
 /**
@@ -1209,28 +1228,28 @@
     oldImageLoader(event);
     collImg = [
       {
-        attributionActionUrl: 'https://www.google.com',
+        attributionActionUrl: 'https://www.google.com/',
         attributions: ['test1', 'attribution1'],
         collectionId: 'collection1',
         imageUrl: 'chrome-search://local-ntp/background1.jpg',
         thumbnailImageUrl: 'chrome-search://local-ntp/background_thumbnail.jpg1'
       },
       {
-        attributionActionUrl: 'https://www.google.com',
+        attributionActionUrl: 'https://www.google.com/',
         attributions: ['test2', 'attribution2'],
         collectionId: 'collection1',
         imageUrl: 'chrome-search://local-ntp/background2.jpg',
         thumbnailImageUrl: 'chrome-search://local-ntp/background_thumbnail.jpg2'
       },
       {
-        attributionActionUrl: 'https://www.google.com',
+        attributionActionUrl: 'https://www.google.com/',
         attributions: ['test3', 'attribution3'],
         collectionId: 'collection1',
         imageUrl: 'chrome-search://local-ntp/background3.jpg',
         thumbnailImageUrl: 'chrome-search://local-ntp/background_thumbnail.jpg3'
       },
       {
-        attributionActionUrl: 'https://www.google.com',
+        attributionActionUrl: 'https://www.google.com/',
         attributions: ['test4', 'attribution4'],
         collectionId: 'collection1',
         imageUrl: 'chrome-search://local-ntp/background4.jpg',
diff --git a/chrome/test/data/webui/cr_elements/cr_dialog_test.js b/chrome/test/data/webui/cr_elements/cr_dialog_test.js
index f07cace..079e005 100644
--- a/chrome/test/data/webui/cr_elements/cr_dialog_test.js
+++ b/chrome/test/data/webui/cr_elements/cr_dialog_test.js
@@ -238,27 +238,43 @@
       <cr-dialog>
         <div slot="title">title</div>
         <div slot="body">
-          <input></input>
-          <input type="text"></input>
-          <input type="password"></input>
-          <input type="checkbox"></input>
           <foobar></foobar>
+          <input type="checkbox">
+          <input type="text">
+
+          <cr-input type="search"></cr-input>
+          <cr-input type="text"></cr-input>
+
+          <div id="withShadow"></div>
           <button class="action-button">active</button>
-          <cr-input></cr-input>
         </div>
       </cr-dialog>`;
 
     const dialog = document.body.querySelector('cr-dialog');
 
-    const inputElement = document.body.querySelector('input:not([type])');
-    const inputTextElement = document.body.querySelector('input[type="text"]');
-    const inputPasswordElement =
-        document.body.querySelector('input[type="password"]');
+    const otherElement = document.body.querySelector('foobar');
     const inputCheckboxElement =
         document.body.querySelector('input[type="checkbox"]');
-    const otherElement = document.body.querySelector('foobar');
+    const inputTextElement = document.body.querySelector('input[type="text"]');
+
+    // Manually set the |type| property since cr-input is not actually imported
+    // as part of this test, and therefore the element is not upgraded, as it
+    // would normally.
+    const crTextInputElement =
+        document.body.querySelector('cr-input[type="text"]');
+    crTextInputElement.type = 'text';
+    const crSearchInputElement =
+        document.body.querySelector('cr-input[type="search"]');
+    crSearchInputElement.type = 'search';
+
+    // Attach a cr-input element nested within another element.
+    const containerElement = document.body.querySelector('#withShadow');
+    const shadow = containerElement.attachShadow({mode: 'open'});
+    const crInputNested = document.createElement('cr-input');
+    crInputNested.type = 'text';
+    shadow.appendChild(crInputNested);
+
     const actionButton = document.body.querySelector('.action-button');
-    const crInputElement = document.body.querySelector('cr-input');
 
     // MockInteractions triggers event listeners synchronously.
     let clickedCounter = 0;
@@ -266,62 +282,25 @@
       clickedCounter++;
     });
 
-    // Only certain types of <input> trigger a dialog submit.
+    // Enter on anything other than cr-input should not be accepted.
     pressEnter(otherElement);
     assertEquals(0, clickedCounter);
-    // "type" defaults to text, which triggers the click.
-    pressEnter(inputElement);
-    assertEquals(1, clickedCounter);
-    pressEnter(inputTextElement);
-    assertEquals(2, clickedCounter);
-    pressEnter(inputPasswordElement);
-    assertEquals(3, clickedCounter);
     pressEnter(inputCheckboxElement);
-    assertEquals(3, clickedCounter);
-    // Also trigger dialog submit if code synthesizes enter on a cr-input
-    // without targeting the underlying input.
-    pressEnter(crInputElement);
-    assertEquals(4, clickedCounter);
-  });
+    assertEquals(0, clickedCounter);
+    pressEnter(inputTextElement);
+    assertEquals(0, clickedCounter);
 
-  // Test that enter key presses trigger an action button click, even if the
-  // even was retargeted, e.g. because the input was really a cr-input, the
-  // cr-input was part of another custom element, etc.
-  test('enter keys are processed even if event was retargeted', function() {
-    document.body.innerHTML = `
-      <dom-module id="test-element">
-        <template><input></input></template>
-      </dom-module>
+    // Enter on a cr-input with type "search" should not be accepted.
+    pressEnter(crSearchInputElement);
+    assertEquals(0, clickedCounter);
 
-      <cr-dialog>
-        <div slot="title">title</div>
-        <div slot="body">
-          <test-element></test-element>
-          <button class="action-button">active</button>
-        </div>
-      </cr-dialog>`;
-
-    Polymer({
-      is: 'test-element',
-    });
-
-    const dialog = document.body.querySelector('cr-dialog');
-
-    const inputWrapper = document.body.querySelector('test-element');
-    assertTrue(!!inputWrapper);
-    const inputElement = inputWrapper.shadowRoot.querySelector('input');
-    const actionButton = document.body.querySelector('.action-button');
-    assertTrue(!!inputElement);
-    assertTrue(!!actionButton);
-
-    // MockInteractions triggers event listeners synchronously.
-    let clickedCounter = 0;
-    actionButton.addEventListener('click', function() {
-      clickedCounter++;
-    });
-
-    pressEnter(inputElement);
+    // Enter on a cr-input with type "text" should be accepted.
+    pressEnter(crTextInputElement);
     assertEquals(1, clickedCounter);
+
+    // Enter on a nested <cr-input> should be accepted.
+    pressEnter(crInputNested);
+    assertEquals(2, clickedCounter);
   });
 
   test('focuses [autofocus] instead of title when present', function() {
diff --git a/chrome/test/data/webui/settings/about_page_tests.js b/chrome/test/data/webui/settings/about_page_tests.js
index f2bbc226..88a25c7 100644
--- a/chrome/test/data/webui/settings/about_page_tests.js
+++ b/chrome/test/data/webui/settings/about_page_tests.js
@@ -678,24 +678,13 @@
         });
 
         test('Initialization', async () => {
-          const versionInfo = {
-            arcVersion: 'dummyArcVersion',
-            osFirmware: 'dummyOsFirmware',
-            osVersion: 'dummyOsVersion',
-          };
-          browserProxy.setVersionInfo(versionInfo);
-
           page = document.createElement('settings-detailed-build-info');
           document.body.appendChild(page);
 
           await Promise.all([
             browserProxy.whenCalled('pageReady'),
-            browserProxy.whenCalled('getVersionInfo'),
             browserProxy.whenCalled('getChannelInfo'),
           ]);
-          assertEquals(versionInfo.arcVersion, page.$.arcVersion.textContent);
-          assertEquals(versionInfo.osVersion, page.$.osVersion.textContent);
-          assertEquals(versionInfo.osFirmware, page.$.osFirmware.textContent);
         });
 
         /**
diff --git a/chrome/test/data/webui/settings/chromeos/os_settings_browsertest.js b/chrome/test/data/webui/settings/chromeos/os_settings_browsertest.js
index 87f0ca2..4c081383 100644
--- a/chrome/test/data/webui/settings/chromeos/os_settings_browsertest.js
+++ b/chrome/test/data/webui/settings/chromeos/os_settings_browsertest.js
@@ -13,7 +13,7 @@
 // Only run in release builds because we frequently see test timeouts in debug.
 // We suspect this is because the settings page loads slowly in debug.
 // https://crbug.com/1003483
-GEN('#if defined(NDEBUG)');
+// GEN('#if defined(NDEBUG)');
 
 GEN('#include "ash/public/cpp/ash_features.h"');
 GEN('#include "build/branding_buildflags.h"');
@@ -1069,4 +1069,4 @@
   mocha.run();
 });
 
-GEN('#endif  // defined(NDEBUG)');
+// GEN('#endif  // defined(NDEBUG)');
diff --git a/chrome/test/data/webui/settings/site_details_tests.js b/chrome/test/data/webui/settings/site_details_tests.js
index e886e50..8e3354702 100644
--- a/chrome/test/data/webui/settings/site_details_tests.js
+++ b/chrome/test/data/webui/settings/site_details_tests.js
@@ -97,6 +97,9 @@
           [test_util.createRawSiteException('https://foo.com:443', {
             setting: settings.ContentSetting.BLOCK,
           })]),
+      test_util.createContentSettingTypeToValuePair(
+          settings.ContentSettingsTypes.MIXEDSCRIPT,
+          [test_util.createRawSiteException('https://foo.com:443')]),
     ], [
       test_util.createContentSettingTypeToValuePair(
           settings.ContentSettingsTypes.USB_DEVICES,
@@ -151,6 +154,9 @@
     optionalSiteDetailsContentSettingsTypes[settings.ContentSettingsTypes
                                                 .NATIVE_FILE_SYSTEM_WRITE] =
         'enableNativeFileSystemWriteContentSetting';
+    optionalSiteDetailsContentSettingsTypes[settings.ContentSettingsTypes
+                                                .MIXEDSCRIPT] =
+        'enableInsecureContentContentSetting';
 
     browserProxy.setPrefs(prefs);
 
diff --git a/chrome/test/data/webui/settings/test_about_page_browser_proxy.js b/chrome/test/data/webui/settings/test_about_page_browser_proxy.js
index fa00087d..979ca59 100644
--- a/chrome/test/data/webui/settings/test_about_page_browser_proxy.js
+++ b/chrome/test/data/webui/settings/test_about_page_browser_proxy.js
@@ -14,10 +14,9 @@
 
     if (cr.isChromeOS) {
       methodNames.push(
-          'getChannelInfo', 'getVersionInfo', 'getRegulatoryInfo',
-          'checkInternetConnection', 'getEnabledReleaseNotes',
-          'getEndOfLifeInfo', 'launchReleaseNotes', 'openOsHelpPage',
-          'refreshTPMFirmwareUpdateStatus', 'setChannel');
+          'getChannelInfo', 'getRegulatoryInfo', 'checkInternetConnection',
+          'getEnabledReleaseNotes', 'getEndOfLifeInfo', 'launchReleaseNotes',
+          'openOsHelpPage', 'refreshTPMFirmwareUpdateStatus', 'setChannel');
     }
 
     if (cr.isMac) {
@@ -30,13 +29,6 @@
     this.updateStatus_ = UpdateStatus.UPDATED;
 
     if (cr.isChromeOS) {
-      /** @private {!VersionInfo} */
-      this.versionInfo_ = {
-        arcVersion: '',
-        osFirmware: '',
-        osVersion: '',
-      };
-
       /** @private {!ChannelInfo} */
       this.channelInfo_ = {
         currentChannel: BrowserChannel.BETA,
@@ -106,10 +98,6 @@
 }
 
 if (cr.isChromeOS) {
-  /** @param {!VersionInfo} */
-  TestAboutPageBrowserProxy.prototype.setVersionInfo = function(versionInfo) {
-    this.versionInfo_ = versionInfo;
-  };
 
   /** @param {boolean} canChangeChannel */
   TestAboutPageBrowserProxy.prototype.setCanChangeChannel = function(
@@ -157,12 +145,6 @@
   };
 
   /** @override */
-  TestAboutPageBrowserProxy.prototype.getVersionInfo = function() {
-    this.methodCalled('getVersionInfo');
-    return Promise.resolve(this.versionInfo_);
-  };
-
-  /** @override */
   TestAboutPageBrowserProxy.prototype.getEnabledReleaseNotes = function() {
     this.methodCalled('getEnabledReleaseNotes');
     return Promise.resolve(this.hasReleaseNotes_);
diff --git a/chromecast/bindings/BUILD.gn b/chromecast/bindings/BUILD.gn
index 0e6e643..0405012 100644
--- a/chromecast/bindings/BUILD.gn
+++ b/chromecast/bindings/BUILD.gn
@@ -5,7 +5,7 @@
 import("//tools/grit/grit_rule.gni")
 
 if (is_fuchsia) {
-  import("//build/config/fuchsia/rules.gni")
+  import("//build/config/fuchsia/generate_runner_scripts.gni")
 }
 
 source_set("named_message_port_connector_resources") {
diff --git a/chromecast/browser/android/apk/src/org/chromium/chromecast/shell/CastWebContentsView.java b/chromecast/browser/android/apk/src/org/chromium/chromecast/shell/CastWebContentsView.java
index f09b25e..f794749 100644
--- a/chromecast/browser/android/apk/src/org/chromium/chromecast/shell/CastWebContentsView.java
+++ b/chromecast/browser/android/apk/src/org/chromium/chromecast/shell/CastWebContentsView.java
@@ -40,8 +40,10 @@
     }
 
     private void initView() {
+        FrameLayout.LayoutParams matchParent = new FrameLayout.LayoutParams(
+                    FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT);
         addView(LayoutInflater.from(getContext())
-                        .inflate(R.layout.cast_web_contents_activity, null));
+                        .inflate(R.layout.cast_web_contents_activity, null), matchParent);
     }
 
     public void onStart(Bundle startArgumentsBundle) {
diff --git a/chromecast/browser/webview/webview_grpc_service.cc b/chromecast/browser/webview/webview_grpc_service.cc
index 0822b4a..3d4e4be7 100644
--- a/chromecast/browser/webview/webview_grpc_service.cc
+++ b/chromecast/browser/webview/webview_grpc_service.cc
@@ -157,7 +157,9 @@
                        base::Passed(std::move(request_))));
 
     request_ = std::make_unique<webview::WebviewRequest>();
-    io_.Read(request_.get(), &read_callback_);
+    std::unique_lock<std::mutex> l(send_lock_);
+    if (!errored_)
+      io_.Read(request_.get(), &read_callback_);
   } else if (!Initialize()) {
     io_.Finish(grpc::Status(grpc::FAILED_PRECONDITION, "Failed initialization"),
                &destroy_callback_);
diff --git a/chromecast/external_mojo/external_service_support/external_connector.h b/chromecast/external_mojo/external_service_support/external_connector.h
index 9c8fd6c5..bae3e60 100644
--- a/chromecast/external_mojo/external_service_support/external_connector.h
+++ b/chromecast/external_mojo/external_service_support/external_connector.h
@@ -14,6 +14,7 @@
 #include "chromecast/external_mojo/public/mojom/connector.mojom.h"
 #include "mojo/public/cpp/bindings/interface_ptr.h"
 #include "mojo/public/cpp/bindings/interface_request.h"
+#include "mojo/public/cpp/bindings/pending_receiver.h"
 #include "mojo/public/cpp/bindings/pending_remote.h"
 #include "mojo/public/cpp/system/message_pipe.h"
 
@@ -61,6 +62,13 @@
                   mojo::MakeRequest(ptr).PassMessagePipe());
   }
 
+  template <typename Interface>
+  void BindInterface(const std::string& service_name,
+                     mojo::PendingRemote<Interface>* ptr) {
+    BindInterface(service_name, Interface::Name_,
+                  ptr->InitWithNewPipeAndPassReceiver().PassPipe());
+  }
+
   virtual void BindInterface(const std::string& service_name,
                              const std::string& interface_name,
                              mojo::ScopedMessagePipeHandle interface_pipe) = 0;
diff --git a/chromecast/media/audio/cast_audio_device_factory.cc b/chromecast/media/audio/cast_audio_device_factory.cc
index 898f085..0d106b4 100644
--- a/chromecast/media/audio/cast_audio_device_factory.cc
+++ b/chromecast/media/audio/cast_audio_device_factory.cc
@@ -21,10 +21,15 @@
  public:
   explicit NonSwitchableAudioRendererSink(
       scoped_refptr<::media::AudioOutputDevice> output_device)
-      : output_device_(std::move(output_device)) {}
+      : output_device_(std::move(output_device)), is_initialized_(false) {}
 
   void Initialize(const ::media::AudioParameters& params,
                   RenderCallback* callback) override {
+    // NonSwitchableAudioRendererSink derives from RestartableRenderSink which
+    // does allow calling Initialize and Play again after stopping.
+    if (is_initialized_)
+      return;
+    is_initialized_ = true;
     output_device_->Initialize(params, callback);
   }
 
@@ -69,6 +74,7 @@
 
  private:
   scoped_refptr<::media::AudioOutputDevice> output_device_;
+  bool is_initialized_;
 };
 
 scoped_refptr<::media::AudioOutputDevice> NewOutputDevice(
diff --git a/chromeos/CHROMEOS_LKGM b/chromeos/CHROMEOS_LKGM
index 7e5bb6be9..0efc17b8 100644
--- a/chromeos/CHROMEOS_LKGM
+++ b/chromeos/CHROMEOS_LKGM
@@ -1 +1 @@
-12566.0.0
\ No newline at end of file
+12567.0.0
\ No newline at end of file
diff --git a/components/autofill/core/browser/personal_data_manager.cc b/components/autofill/core/browser/personal_data_manager.cc
index 41685be..49de5f4 100644
--- a/components/autofill/core/browser/personal_data_manager.cc
+++ b/components/autofill/core/browser/personal_data_manager.cc
@@ -1376,35 +1376,6 @@
     Refresh();
 }
 
-void PersonalDataManager::MoveJapanCityToStreetAddress() {
-  if (!database_helper_->GetLocalDatabase())
-    return;
-
-  // Don't run if the migration has already been performed.
-  if (pref_service_->GetBoolean(prefs::kAutofillJapanCityFieldMigrated))
-    return;
-
-  base::string16 japan_country_code = base::ASCIIToUTF16("JP");
-  base::string16 line_separator = base::ASCIIToUTF16("\n");
-  for (AutofillProfile* profile : GetProfiles()) {
-    base::string16 country_code = profile->GetRawInfo(ADDRESS_HOME_COUNTRY);
-    base::string16 city = profile->GetRawInfo(ADDRESS_HOME_CITY);
-    if (country_code == japan_country_code && !city.empty()) {
-      base::string16 street_address =
-          profile->GetRawInfo(ADDRESS_HOME_STREET_ADDRESS);
-      street_address = street_address.empty()
-                           ? city
-                           : street_address + line_separator + city;
-      profile->SetRawInfo(ADDRESS_HOME_STREET_ADDRESS, street_address);
-      profile->SetRawInfo(ADDRESS_HOME_CITY, base::string16());
-      UpdateProfileInDB(*profile, /*enforced=*/true);
-    }
-  }
-
-  // Set the pref so that this migration is never run again.
-  pref_service_->SetBoolean(prefs::kAutofillJapanCityFieldMigrated, true);
-}
-
 void PersonalDataManager::OnValidated(const AutofillProfile* profile) {
   if (!profile)
     return;
@@ -2417,9 +2388,6 @@
 
   // Ran everytime it is called.
   ClearProfileNonSettingsOrigins();
-
-  // One-time fix, otherwise NOP.
-  MoveJapanCityToStreetAddress();
 }
 
 void PersonalDataManager::ApplyCardFixesAndCleanups() {
diff --git a/components/autofill/core/browser/personal_data_manager.h b/components/autofill/core/browser/personal_data_manager.h
index 60af2d7..0a83a6f 100644
--- a/components/autofill/core/browser/personal_data_manager.h
+++ b/components/autofill/core/browser/personal_data_manager.h
@@ -461,8 +461,6 @@
   FRIEND_TEST_ALL_PREFIXES(PersonalDataManagerTest,
                            ClearCreditCardNonSettingsOrigins);
   FRIEND_TEST_ALL_PREFIXES(PersonalDataManagerTest,
-                           MoveJapanCityToStreetAddress);
-  FRIEND_TEST_ALL_PREFIXES(PersonalDataManagerTest,
                            RequestProfileServerValidity);
   FRIEND_TEST_ALL_PREFIXES(PersonalDataManagerTest,
                            GetProfileSuggestions_Validity);
@@ -550,12 +548,6 @@
   void ClearProfileNonSettingsOrigins();
   void ClearCreditCardNonSettingsOrigins();
 
-  // Appends the value of the city field of a JP address to its street address
-  // field, separated by a newline, and clears the city field.
-  // TODO(rouslan): Remove this migration in or after October 2019. See bug:
-  // https://crbug.com/871301
-  void MoveJapanCityToStreetAddress();
-
   // Called when the |profile| is validated by the AutofillProfileValidator,
   // updates the profiles on the |ongoing_profile_changes_| and the DB.
   virtual void OnValidated(const AutofillProfile* profile);
diff --git a/components/autofill/core/browser/personal_data_manager_unittest.cc b/components/autofill/core/browser/personal_data_manager_unittest.cc
index a1123b2..78caa79 100644
--- a/components/autofill/core/browser/personal_data_manager_unittest.cc
+++ b/components/autofill/core/browser/personal_data_manager_unittest.cc
@@ -286,17 +286,6 @@
     return account_info;
   }
 
-  void MoveJapanCityToStreetAddress(PersonalDataManager* personal_data,
-                                    int move_times) {
-    base::RunLoop run_loop;
-    EXPECT_CALL(personal_data_observer_, OnPersonalDataFinishedProfileTasks())
-        .WillRepeatedly(QuitMessageLoop(&run_loop));
-    EXPECT_CALL(personal_data_observer_, OnPersonalDataChanged())
-        .Times(move_times);
-    personal_data->MoveJapanCityToStreetAddress();
-    run_loop.Run();
-  }
-
   base::test::SingleThreadTaskEnvironment task_environment_{
       base::test::SingleThreadTaskEnvironment::MainThreadType::UI};
   std::unique_ptr<PrefService> prefs_;
@@ -6881,108 +6870,6 @@
             personal_data_->GetCreditCardsToSuggest(false)[3]->origin());
 }
 
-// Tests that all city fields in a Japan profile are moved to the street address
-// field.
-TEST_F(PersonalDataManagerTest, MoveJapanCityToStreetAddress) {
-  // Turn on sync feature to avoid calling MoveJapanCityToStreetAddress on
-  // adding the profiles implicitly.
-  ASSERT_TRUE(TurnOnSyncFeature());
-  // A US profile with both street address and a city.
-  std::string guid0 = base::GenerateGUID();
-  {
-    AutofillProfile profile0(guid0, test::kEmptyOrigin);
-    test::SetProfileInfo(&profile0, "Homer", "J", "Simpson",
-                         "homer.simpson@abc.com", "", "742. Evergreen Terrace",
-                         "", "Springfield", "IL", "91601", "US", "");
-    AddProfileToPersonalDataManager(profile0);
-  }
-
-  // A JP profile with both street address and a city.
-  std::string guid1 = base::GenerateGUID();
-  {
-    AutofillProfile profile1(guid1, test::kEmptyOrigin);
-    test::SetProfileInfo(&profile1, "Homer", "J", "Simpson",
-                         "homer.simpson@abc.com", "", "742. Evergreen Terrace",
-                         "", "Springfield", "IL", "91601", "JP", "");
-    AddProfileToPersonalDataManager(profile1);
-  }
-
-  // A JP profile with only a city.
-  std::string guid2 = base::GenerateGUID();
-  {
-    AutofillProfile profile2(guid2, test::kEmptyOrigin);
-    test::SetProfileInfo(&profile2, "Homer", "J", "Simpson",
-                         "homer.simpson@abc.com", "", "", "", "Springfield",
-                         "IL", "91601", "JP", "");
-    AddProfileToPersonalDataManager(profile2);
-  }
-
-  // A JP profile with only a street address.
-  std::string guid3 = base::GenerateGUID();
-  {
-    AutofillProfile profile3(guid3, test::kEmptyOrigin);
-    test::SetProfileInfo(&profile3, "Homer", "J", "Simpson",
-                         "homer.simpson@abc.com", "", "742. Evergreen Terrace",
-                         "", "", "IL", "91601", "JP", "");
-    AddProfileToPersonalDataManager(profile3);
-  }
-
-  // A JP profile with neither a street address nor a city.
-  std::string guid4 = base::GenerateGUID();
-  {
-    AutofillProfile profile4(guid4, test::kEmptyOrigin);
-    test::SetProfileInfo(&profile4, "Homer", "J", "Simpson",
-                         "homer.simpson@abc.com", "", "", "", "", "IL", "91601",
-                         "JP", "");
-    AddProfileToPersonalDataManager(profile4);
-  }
-  auto profiles = personal_data_->GetProfiles();
-  ASSERT_EQ(5U, profiles.size());
-
-  MoveJapanCityToStreetAddress(
-      personal_data_.get(),
-      2);  // For the japan profiles where the city is not empty.
-
-  {
-    AutofillProfile* profile0 = personal_data_->GetProfileByGUID(guid0);
-    EXPECT_EQ(base::ASCIIToUTF16("742. Evergreen Terrace"),
-              profile0->GetRawInfo(ADDRESS_HOME_STREET_ADDRESS));
-    EXPECT_EQ(base::ASCIIToUTF16("Springfield"),
-              profile0->GetRawInfo(ADDRESS_HOME_CITY));
-  }
-
-  {
-    AutofillProfile* profile1 = personal_data_->GetProfileByGUID(guid1);
-    EXPECT_EQ(base::ASCIIToUTF16("742. Evergreen Terrace\nSpringfield"),
-              profile1->GetRawInfo(ADDRESS_HOME_STREET_ADDRESS));
-    EXPECT_EQ(base::ASCIIToUTF16("742. Evergreen Terrace"),
-              profile1->GetRawInfo(ADDRESS_HOME_LINE1));
-    EXPECT_EQ(base::ASCIIToUTF16("Springfield"),
-              profile1->GetRawInfo(ADDRESS_HOME_LINE2));
-    EXPECT_TRUE(profile1->GetRawInfo(ADDRESS_HOME_CITY).empty());
-  }
-
-  {
-    AutofillProfile* profile2 = personal_data_->GetProfileByGUID(guid2);
-    EXPECT_EQ(base::ASCIIToUTF16("Springfield"),
-              profile2->GetRawInfo(ADDRESS_HOME_STREET_ADDRESS));
-    EXPECT_TRUE(profile2->GetRawInfo(ADDRESS_HOME_CITY).empty());
-  }
-
-  {
-    AutofillProfile* profile3 = personal_data_->GetProfileByGUID(guid3);
-    EXPECT_EQ(base::ASCIIToUTF16("742. Evergreen Terrace"),
-              profile3->GetRawInfo(ADDRESS_HOME_STREET_ADDRESS));
-    EXPECT_TRUE(profile3->GetRawInfo(ADDRESS_HOME_CITY).empty());
-  }
-
-  {
-    AutofillProfile* profile4 = personal_data_->GetProfileByGUID(guid4);
-    EXPECT_TRUE(profile4->GetRawInfo(ADDRESS_HOME_STREET_ADDRESS).empty());
-    EXPECT_TRUE(profile4->GetRawInfo(ADDRESS_HOME_CITY).empty());
-  }
-}
-
 // Tests that all the non settings origins of autofill profiles are cleared even
 // if sync is disabled.
 TEST_F(
diff --git a/components/autofill/core/common/autofill_prefs.cc b/components/autofill/core/common/autofill_prefs.cc
index 3872d01..1607b0d 100644
--- a/components/autofill/core/common/autofill_prefs.cc
+++ b/components/autofill/core/common/autofill_prefs.cc
@@ -18,7 +18,6 @@
 // was found.
 int GetSyncTransportOptInBitFieldForAccount(const PrefService* prefs,
                                             const std::string& account_hash) {
-
   auto* dictionary = prefs->GetDictionary(prefs::kAutofillSyncTransportOptIn);
 
   // If there is no dictionary it means the account didn't opt-in. Use 0 because
@@ -62,9 +61,8 @@
 // Boolean that is true if Autofill is enabled and allowed to save data.
 const char kAutofillEnabledDeprecated[] = "autofill.enabled";
 
-// Boolean that is true if Japan address city field has been migrated to be a
-// part of the street field.
-const char kAutofillJapanCityFieldMigrated[] =
+// Deprecated 10/2019.
+const char kAutofillJapanCityFieldMigratedDeprecated[] =
     "autofill.japan_city_field_migrated_to_street_address";
 
 // Integer that is set to the last version where the profile deduping routine
@@ -167,7 +165,6 @@
       prefs::kAutofillCreditCardFidoAuthOfferCheckboxState, true);
   registry->RegisterIntegerPref(
       prefs::kAutofillCreditCardSigninPromoImpressionCount, 0);
-  registry->RegisterBooleanPref(prefs::kAutofillJapanCityFieldMigrated, false);
   registry->RegisterBooleanPref(prefs::kAutofillWalletImportEnabled, true);
   registry->RegisterBooleanPref(
       prefs::kAutofillWalletImportStorageCheckboxState, true);
@@ -186,6 +183,10 @@
   registry->RegisterTimePref(prefs::kAutofillUploadEventsLastResetTimestamp,
                              base::Time());
   registry->RegisterDictionaryPref(prefs::kAutofillSyncTransportOptIn);
+
+  // Deprecated prefs registered for migration.
+  registry->RegisterBooleanPref(kAutofillJapanCityFieldMigratedDeprecated,
+                                false);
 }
 
 void MigrateDeprecatedAutofillPrefs(PrefService* prefs) {
@@ -216,6 +217,9 @@
     prefs->SetBoolean(kAutofillProfileEnabled,
                       prefs->GetBoolean(kAutofillEnabledDeprecated));
   }
+
+  // Added 10/2019.
+  prefs->ClearPref(kAutofillJapanCityFieldMigratedDeprecated);
 }
 
 bool IsAutocompleteEnabled(const PrefService* prefs) {
diff --git a/components/autofill/core/common/autofill_prefs.h b/components/autofill/core/common/autofill_prefs.h
index 01679b97..7558441a2 100644
--- a/components/autofill/core/common/autofill_prefs.h
+++ b/components/autofill/core/common/autofill_prefs.h
@@ -26,7 +26,7 @@
 extern const char kAutofillCreditCardSigninPromoImpressionCount[];
 // Please use kAutofillCreditCardEnabled and kAutofillProfileEnabled instead.
 extern const char kAutofillEnabledDeprecated[];
-extern const char kAutofillJapanCityFieldMigrated[];
+extern const char kAutofillJapanCityFieldMigratedDeprecated[];
 extern const char kAutofillLastVersionDeduped[];
 extern const char kAutofillLastVersionValidated[];
 extern const char kAutofillLastVersionDisusedAddressesDeleted[];
diff --git a/components/content_settings/core/browser/content_settings_registry.cc b/components/content_settings/core/browser/content_settings_registry.cc
index b60c49a9..6c4ff4b 100644
--- a/components/content_settings/core/browser/content_settings_registry.cc
+++ b/components/content_settings/core/browser/content_settings_registry.cc
@@ -378,9 +378,10 @@
            ContentSettingsInfo::EXCEPTIONS_ON_SECURE_AND_INSECURE_ORIGINS);
 
   Register(CONTENT_SETTINGS_TYPE_MIXEDSCRIPT, "mixed-script",
-           CONTENT_SETTING_DEFAULT, WebsiteSettingsInfo::UNSYNCABLE,
-           WhitelistedSchemes(), ValidSettings(),
-           WebsiteSettingsInfo::SINGLE_ORIGIN_WITH_EMBEDDED_EXCEPTIONS_SCOPE,
+           CONTENT_SETTING_BLOCK, WebsiteSettingsInfo::UNSYNCABLE,
+           WhitelistedSchemes(),
+           ValidSettings(CONTENT_SETTING_ALLOW, CONTENT_SETTING_BLOCK),
+           WebsiteSettingsInfo::SINGLE_ORIGIN_ONLY_SCOPE,
            WebsiteSettingsRegistry::DESKTOP,
            ContentSettingsInfo::INHERIT_IF_LESS_PERMISSIVE,
            ContentSettingsInfo::PERSISTENT,
diff --git a/components/content_settings/core/browser/content_settings_utils.cc b/components/content_settings/core/browser/content_settings_utils.cc
index 4cba738..6b22ca5 100644
--- a/components/content_settings/core/browser/content_settings_utils.cc
+++ b/components/content_settings/core/browser/content_settings_utils.cc
@@ -124,6 +124,9 @@
       CONTENT_SETTINGS_TYPE_IMAGES,
       ResourceIdentifier(),
       &(rules->image_rules));
+  map->GetSettingsForOneType(CONTENT_SETTINGS_TYPE_MIXEDSCRIPT,
+                             ResourceIdentifier(),
+                             &(rules->mixed_content_rules));
 #else
   // Android doesn't use image content settings, so ALLOW rule is added for
   // all origins.
@@ -132,6 +135,13 @@
       base::Value::FromUniquePtrValue(
           ContentSettingToValue(CONTENT_SETTING_ALLOW)),
       std::string(), map->IsOffTheRecord()));
+  // In Android active mixed content is hard blocked, with no option to allow
+  // it.
+  rules->mixed_content_rules.push_back(ContentSettingPatternSource(
+      ContentSettingsPattern::Wildcard(), ContentSettingsPattern::Wildcard(),
+      base::Value::FromUniquePtrValue(
+          ContentSettingToValue(CONTENT_SETTING_BLOCK)),
+      std::string(), map->IsOffTheRecord()));
 #endif
   map->GetSettingsForOneType(
       CONTENT_SETTINGS_TYPE_JAVASCRIPT,
diff --git a/components/content_settings/core/common/content_settings.cc b/components/content_settings/core/common/content_settings.cc
index 5fc4d9f..e1aca34 100644
--- a/components/content_settings/core/common/content_settings.cc
+++ b/components/content_settings/core/common/content_settings.cc
@@ -156,7 +156,8 @@
          content_type == CONTENT_SETTINGS_TYPE_JAVASCRIPT ||
          content_type == CONTENT_SETTINGS_TYPE_AUTOPLAY ||
          content_type == CONTENT_SETTINGS_TYPE_CLIENT_HINTS ||
-         content_type == CONTENT_SETTINGS_TYPE_POPUPS;
+         content_type == CONTENT_SETTINGS_TYPE_POPUPS ||
+         content_type == CONTENT_SETTINGS_TYPE_MIXEDSCRIPT;
 }
 
 RendererContentSettingRules::RendererContentSettingRules() {}
diff --git a/components/content_settings/core/common/content_settings.h b/components/content_settings/core/common/content_settings.h
index 0565046..824c421 100644
--- a/components/content_settings/core/common/content_settings.h
+++ b/components/content_settings/core/common/content_settings.h
@@ -75,6 +75,7 @@
   ContentSettingsForOneType autoplay_rules;
   ContentSettingsForOneType client_hints_rules;
   ContentSettingsForOneType popup_redirect_rules;
+  ContentSettingsForOneType mixed_content_rules;
 };
 
 namespace content_settings {
diff --git a/components/content_settings/core/common/content_settings.mojom b/components/content_settings/core/common/content_settings.mojom
index 3635caf..771b4db 100644
--- a/components/content_settings/core/common/content_settings.mojom
+++ b/components/content_settings/core/common/content_settings.mojom
@@ -73,4 +73,5 @@
   array<ContentSettingPatternSource> autoplay_rules;
   array<ContentSettingPatternSource> client_hints_rules;
   array<ContentSettingPatternSource> popup_redirect_rules;
+  array<ContentSettingPatternSource> mixed_content_rules;
 };
diff --git a/components/content_settings/core/common/content_settings_mojom_traits.cc b/components/content_settings/core/common/content_settings_mojom_traits.cc
index e4faf6a2..84eceac 100644
--- a/components/content_settings/core/common/content_settings_mojom_traits.cc
+++ b/components/content_settings/core/common/content_settings_mojom_traits.cc
@@ -101,7 +101,8 @@
          data.ReadScriptRules(&out->script_rules) &&
          data.ReadAutoplayRules(&out->autoplay_rules) &&
          data.ReadClientHintsRules(&out->client_hints_rules) &&
-         data.ReadPopupRedirectRules(&out->popup_redirect_rules);
+         data.ReadPopupRedirectRules(&out->popup_redirect_rules) &&
+         data.ReadMixedContentRules(&out->mixed_content_rules);
 }
 
 }  // namespace mojo
diff --git a/components/content_settings/core/common/content_settings_mojom_traits.h b/components/content_settings/core/common/content_settings_mojom_traits.h
index c8b57f67..13cae30 100644
--- a/components/content_settings/core/common/content_settings_mojom_traits.h
+++ b/components/content_settings/core/common/content_settings_mojom_traits.h
@@ -145,6 +145,11 @@
     return r.popup_redirect_rules;
   }
 
+  static const std::vector<ContentSettingPatternSource>& mixed_content_rules(
+      const RendererContentSettingRules& r) {
+    return r.mixed_content_rules;
+  }
+
   static bool Read(
       content_settings::mojom::RendererContentSettingRulesDataView data,
       RendererContentSettingRules* out);
diff --git a/components/download/internal/common/download_file_impl.cc b/components/download/internal/common/download_file_impl.cc
index 5b3951a..890efd8 100644
--- a/components/download/internal/common/download_file_impl.cc
+++ b/components/download/internal/common/download_file_impl.cc
@@ -566,9 +566,8 @@
 
   for (auto& stream : source_streams_) {
     SourceStream* source_stream = stream.second.get();
-    if (!source_stream->is_finished()) {
-      ActivateStream(source_stream);
-    }
+    if (!source_stream->is_finished())
+      StreamActive(source_stream, MOJO_RESULT_OK);
   }
 }
 
@@ -591,7 +590,6 @@
   DownloadInterruptReason reason = DOWNLOAD_INTERRUPT_REASON_NONE;
   base::TimeDelta delta(
       base::TimeDelta::FromMilliseconds(kMaxTimeBlockingFileThreadMs));
-
   // Take care of any file local activity required.
   do {
     state = source_stream->Read(&incoming_data, &incoming_data_size);
@@ -649,6 +647,10 @@
         FROM_HERE, base::BindOnce(&DownloadFileImpl::StreamActive,
                                   weak_factory_.GetWeakPtr(), source_stream,
                                   MOJO_RESULT_OK));
+  } else if (state == InputStream::EMPTY && !should_terminate) {
+    source_stream->RegisterDataReadyCallback(
+        base::Bind(&DownloadFileImpl::StreamActive, weak_factory_.GetWeakPtr(),
+                   source_stream));
   }
 
   if (state == InputStream::COMPLETE)
@@ -731,13 +733,6 @@
         received_slice.offset, received_slice.received_bytes);
   }
   num_active_streams_++;
-  ActivateStream(source_stream);
-}
-
-void DownloadFileImpl::ActivateStream(SourceStream* source_stream) {
-  source_stream->RegisterDataReadyCallback(
-      base::Bind(&DownloadFileImpl::StreamActive, weak_factory_.GetWeakPtr(),
-                 source_stream));
   StreamActive(source_stream, MOJO_RESULT_OK);
 }
 
diff --git a/components/download/internal/common/download_file_unittest.cc b/components/download/internal/common/download_file_unittest.cc
index 2140f1d..a2a5883 100644
--- a/components/download/internal/common/download_file_unittest.cc
+++ b/components/download/internal/common/download_file_unittest.cc
@@ -581,6 +581,9 @@
   EXPECT_FALSE(base::PathExists(initial_path));
   EXPECT_TRUE(base::PathExists(path_1));
 
+  EXPECT_CALL(*input_stream_, RegisterDataReadyCallback(_))
+      .Times(1)
+      .RetiresOnSaturation();
   // Download the data.
   const char* chunks1[] = {kTestData1, kTestData2};
   AppendDataToFile(chunks1, 2);
@@ -596,6 +599,9 @@
   EXPECT_FALSE(base::PathExists(path_1));
   EXPECT_TRUE(base::PathExists(path_2));
 
+  EXPECT_CALL(*input_stream_, RegisterDataReadyCallback(_))
+      .Times(1)
+      .RetiresOnSaturation();
   const char* chunks2[] = {kTestData3};
   AppendDataToFile(chunks2, 1);
 
@@ -833,6 +839,9 @@
 
   // Test that calling the sink_callback_ on an empty stream shouldn't
   // do anything.
+  EXPECT_CALL(*input_stream_, RegisterDataReadyCallback(_))
+      .Times(1)
+      .RetiresOnSaturation();
   AppendDataToFile(nullptr, 0);
 
   // Finish the download this way and make sure we see it on the observer.
@@ -984,8 +993,6 @@
   PrepareStream(&additional_streams_[0], stream_0_length, true, true,
                 kTestData7, 2);
 
-  EXPECT_CALL(*additional_streams_[0], RegisterDataReadyCallback(_))
-      .RetiresOnSaturation();
   EXPECT_CALL(*(observer_.get()), MockDestinationCompleted(_, _));
 
   // Activate the streams.
@@ -1005,7 +1012,7 @@
 }
 
 // 3 streams write to one sink, the second stream has a limited length.
-TEST_F(DownloadFileTest, MutipleStreamsLimitedLength) {
+TEST_F(DownloadFileTest, MultipleStreamsLimitedLength) {
   int64_t stream_0_length = GetBuffersLength(kTestData6, 2);
 
   // The second stream has a limited length and should be partially written
@@ -1025,17 +1032,10 @@
   PrepareStream(&additional_streams_[1], stream_0_length + stream_1_length,
                 true, true, kTestData6, 2);
 
-  EXPECT_CALL(*additional_streams_[0], RegisterDataReadyCallback(_))
-      .Times(1)
-      .RetiresOnSaturation();
-
   EXPECT_CALL(*additional_streams_[0], ClearDataReadyCallback())
       .Times(1)
       .RetiresOnSaturation();
 
-  EXPECT_CALL(*additional_streams_[1], RegisterDataReadyCallback(_))
-      .RetiresOnSaturation();
-
   EXPECT_CALL(*(observer_.get()), MockDestinationCompleted(_, _));
 
   // Activate all the streams.
@@ -1111,13 +1111,13 @@
       .InSequence(seq)
       .WillOnce(Return(InputStream::EMPTY))
       .RetiresOnSaturation();
+  EXPECT_CALL(*input_stream_, RegisterDataReadyCallback(_))
+      .Times(1)
+      .RetiresOnSaturation();
   sink_callback_.Run(MOJO_RESULT_OK);
   base::RunLoop().RunUntilIdle();
 
   additional_streams_[0] = new StrictMock<MockInputStream>();
-  EXPECT_CALL(*additional_streams_[0], RegisterDataReadyCallback(_))
-      .WillRepeatedly(Invoke(this, &DownloadFileTest::RegisterCallback))
-      .RetiresOnSaturation();
   EXPECT_CALL(*additional_streams_[0], ClearDataReadyCallback())
       .WillRepeatedly(Invoke(this, &DownloadFileTest::ClearCallback))
       .RetiresOnSaturation();
@@ -1152,6 +1152,9 @@
       .InSequence(seq)
       .WillOnce(Return(InputStream::EMPTY))
       .RetiresOnSaturation();
+  EXPECT_CALL(*input_stream_, RegisterDataReadyCallback(_))
+      .Times(2)
+      .RetiresOnSaturation();
   sink_callback_.Run(MOJO_RESULT_OK);
   base::RunLoop().RunUntilIdle();
 
diff --git a/components/download/internal/common/download_utils.cc b/components/download/internal/common/download_utils.cc
index d428833..023f695 100644
--- a/components/download/internal/common/download_utils.cc
+++ b/components/download/internal/common/download_utils.cc
@@ -4,6 +4,9 @@
 
 #include "components/download/public/common/download_utils.h"
 
+#include <memory>
+#include <string>
+
 #include "base/files/file_util.h"
 #include "base/format_macros.h"
 #include "base/i18n/file_util_icu.h"
@@ -27,7 +30,7 @@
 #if defined(OS_ANDROID)
 #include "base/android/content_uri_utils.h"
 #include "components/download/internal/common/android/download_collection_bridge.h"
-#endif
+#endif  // defined(OS_ANDROID)
 
 namespace download {
 
@@ -261,7 +264,7 @@
 
 std::unique_ptr<network::ResourceRequest> CreateResourceRequest(
     DownloadUrlParameters* params) {
-  DCHECK(params->offset() >= 0);
+  DCHECK_GE(params->offset(), 0);
 
   std::unique_ptr<network::ResourceRequest> request(
       new network::ResourceRequest);
@@ -570,7 +573,7 @@
     case DownloadItem::INTERRUPTED:
       return GetDownloadResumeMode(url, reason, false /* restart_required */,
                                    false /* user_action_required */) ==
-             download::ResumeMode::INVALID;
+             ResumeMode::INVALID;
     default:
       return false;
   }
diff --git a/components/download/internal/common/stream_handle_input_stream.cc b/components/download/internal/common/stream_handle_input_stream.cc
index fc1ddd6..bdfe62e 100644
--- a/components/download/internal/common/stream_handle_input_stream.cc
+++ b/components/download/internal/common/stream_handle_input_stream.cc
@@ -45,6 +45,8 @@
     const mojo::SimpleWatcher::ReadyCallback& callback) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   if (handle_watcher_) {
+    if (handle_watcher_->IsWatching())
+      ClearDataReadyCallback();
     handle_watcher_->Watch(stream_handle_->stream.get(),
                            MOJO_HANDLE_SIGNAL_READABLE, callback);
   }
diff --git a/components/download/public/common/download_file_impl.h b/components/download/public/common/download_file_impl.h
index 59ef5d5..4f6c60c 100644
--- a/components/download/public/common/download_file_impl.h
+++ b/components/download/public/common/download_file_impl.h
@@ -277,9 +277,6 @@
   // Register callback and start to read data from the stream.
   void RegisterAndActivateStream(SourceStream* source_stream);
 
-  // Helper method to activate a stream and start reading from it.
-  void ActivateStream(SourceStream* source_stream);
-
   // Called when a stream completes.
   void OnStreamCompleted(SourceStream* source_stream);
 
diff --git a/components/download/public/common/download_utils.h b/components/download/public/common/download_utils.h
index 7107c34..737c193 100644
--- a/components/download/public/common/download_utils.h
+++ b/components/download/public/common/download_utils.h
@@ -5,6 +5,8 @@
 #ifndef COMPONENTS_DOWNLOAD_PUBLIC_COMMON_DOWNLOAD_UTILS_H_
 #define COMPONENTS_DOWNLOAD_PUBLIC_COMMON_DOWNLOAD_UTILS_H_
 
+#include <memory>
+
 #include "components/download/database/download_db_entry.h"
 #include "components/download/database/in_progress/download_entry.h"
 #include "components/download/public/common/download_export.h"
diff --git a/components/exo/client_controlled_shell_surface.cc b/components/exo/client_controlled_shell_surface.cc
index 1187362..b230ee7 100644
--- a/components/exo/client_controlled_shell_surface.cc
+++ b/components/exo/client_controlled_shell_surface.cc
@@ -38,6 +38,7 @@
 #include "components/exo/surface.h"
 #include "components/exo/wm_helper.h"
 #include "ui/aura/client/aura_constants.h"
+#include "ui/aura/scoped_window_event_targeting_blocker.h"
 #include "ui/aura/window.h"
 #include "ui/aura/window_event_dispatcher.h"
 #include "ui/aura/window_observer.h"
@@ -214,8 +215,9 @@
   DISALLOW_COPY_AND_ASSIGN(CaptionButtonModel);
 };
 
-// EventTargetingBlocker blocks the event targeting by settnig NONE targeting
-// policy to the window subtrees. It resets to the origial policy upon deletion.
+// EventTargetingBlocker blocks the event targeting by setting NONE targeting
+// policy to the window subtrees. It resets to the original policy upon
+// deletion.
 class EventTargetingBlocker : aura::WindowObserver {
  public:
   EventTargetingBlocker() = default;
@@ -233,29 +235,28 @@
  private:
   void Register(aura::Window* window) {
     window->AddObserver(this);
-    auto policy = window->event_targeting_policy();
-    window->SetEventTargetingPolicy(aura::EventTargetingPolicy::kNone);
-    policy_map_.emplace(window, policy);
+    event_targeting_blocker_map_[window] =
+        std::make_unique<aura::ScopedWindowEventTargetingBlocker>(window);
     for (auto* child : window->children())
       Register(child);
   }
 
   void Unregister(aura::Window* window) {
     window->RemoveObserver(this);
-    DCHECK(policy_map_.find(window) != policy_map_.end());
-    window->SetEventTargetingPolicy(policy_map_[window]);
+    event_targeting_blocker_map_.erase(window);
     for (auto* child : window->children())
       Unregister(child);
   }
 
   void OnWindowDestroying(aura::Window* window) override {
-    auto it = policy_map_.find(window);
-    DCHECK(it != policy_map_.end());
-    policy_map_.erase(it);
-    window->RemoveObserver(this);
+    Unregister(window);
+    if (window_ == window)
+      window_ = nullptr;
   }
 
-  std::map<aura::Window*, aura::EventTargetingPolicy> policy_map_;
+  std::map<aura::Window*,
+           std::unique_ptr<aura::ScopedWindowEventTargetingBlocker>>
+      event_targeting_blocker_map_;
   aura::Window* window_ = nullptr;
 
   DISALLOW_COPY_AND_ASSIGN(EventTargetingBlocker);
diff --git a/components/gcm_driver/instance_id/android/BUILD.gn b/components/gcm_driver/instance_id/android/BUILD.gn
index 1d9ee84..2f17143 100644
--- a/components/gcm_driver/instance_id/android/BUILD.gn
+++ b/components/gcm_driver/instance_id/android/BUILD.gn
@@ -11,6 +11,7 @@
 }
 
 generate_jni("test_support_jni_headers") {
+  testonly = true
   sources = [
     "javatests/src/org/chromium/components/gcm_driver/instance_id/FakeInstanceIDWithSubtype.java",
   ]
diff --git a/components/gwp_asan/buildflags/buildflags.gni b/components/gwp_asan/buildflags/buildflags.gni
index 08ed1d4..f1cc47f8 100644
--- a/components/gwp_asan/buildflags/buildflags.gni
+++ b/components/gwp_asan/buildflags/buildflags.gni
@@ -4,11 +4,15 @@
 
 import("//base/allocator/allocator.gni")
 import("//build/config/allocator.gni")
+import("//build/config/compiler/compiler.gni")
 
 # Windows/x86 is disabled due to https://crbug.com/969146
 # Android component builds are disabled due to https://crbug.com/976399
-supported_platform = is_mac || (is_win && current_cpu == "x64") ||
-                     (is_android && !is_component_build)
+# Android requires frame pointers for unwinding, unwind tables aren't shipped in
+# official builds.
+supported_platform =
+    is_mac || (is_win && current_cpu == "x64") ||
+    (is_android && !is_component_build && enable_frame_pointers)
 
 declare_args() {
   # Is GWP-ASan malloc/PartitionAlloc hooking enabled for chrome/ on a given
diff --git a/components/heap_profiling/BUILD.gn b/components/heap_profiling/BUILD.gn
index 19cada14..a00697c 100644
--- a/components/heap_profiling/BUILD.gn
+++ b/components/heap_profiling/BUILD.gn
@@ -25,6 +25,7 @@
 
 if (is_android) {
   generate_jni("jni_headers") {
+    testonly = true
     sources = [
       "javatests/src/org/chromium/components/heap_profiling/HeapProfilingTestShim.java",
     ]
diff --git a/components/leveldb_proto/internal/shared_proto_database.cc b/components/leveldb_proto/internal/shared_proto_database.cc
index 3bb60ece..d247668 100644
--- a/components/leveldb_proto/internal/shared_proto_database.cc
+++ b/components/leveldb_proto/internal/shared_proto_database.cc
@@ -60,7 +60,11 @@
                                          const base::FilePath& db_dir)
     : task_runner_(base::CreateSequencedTaskRunner(
           {base::ThreadPool(), base::MayBlock(),
-           base::TaskPriority::BEST_EFFORT,
+           // crbug/1006954 and crbug/976223 explain why one of the clients
+           // needs run in visible priority. Download DB is always loaded to
+           // check for in progress downloads at startup. So, always load shared
+           // db in USER_VISIBLE priority.
+           base::TaskPriority::USER_VISIBLE,
            base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN})),
       db_dir_(db_dir),
       db_(std::make_unique<LevelDB>(client_db_id.c_str())),
diff --git a/components/module_installer/android/BUILD.gn b/components/module_installer/android/BUILD.gn
index 7f173c9..beafbe8 100644
--- a/components/module_installer/android/BUILD.gn
+++ b/components/module_installer/android/BUILD.gn
@@ -37,8 +37,6 @@
     "//third_party/google_android_play_core:com_google_android_play_core_java",
   ]
 
-  srcjar_deps = [ ":module_installer_build_config" ]
-
   jar_excluded_patterns = [ "*/ModuleInstallerConfig.class" ]
 
   annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
@@ -46,12 +44,18 @@
 
 junit_binary("module_installer_junit_tests") {
   java_files = [
+    "junit/src/org/chromium/components/module_installer/engine/ApkEngineTest.java",
     "junit/src/org/chromium/components/module_installer/engine/SplitCompatEngineTest.java",
+    "junit/src/org/chromium/components/module_installer/logger/LoggerTestUtil.java",
+    "junit/src/org/chromium/components/module_installer/logger/PlayCoreLoggerTest.java",
+    "junit/src/org/chromium/components/module_installer/logger/SplitInstallFailureLoggerTest.java",
+    "junit/src/org/chromium/components/module_installer/logger/SplitInstallStatusLoggerTest.java",
     "junit/src/org/chromium/components/module_installer/observer/ActivityObserverTest.java",
   ]
   deps = [
     ":module_installer_java",
     "//base:base_java",
+    "//base:base_java_test_support",
     "//base:base_junit_test_support",
   ]
 }
@@ -75,28 +79,13 @@
 # Use this one if your target needs to depend on ModuleInstallerConfig. The
 # other two targets are automatically added to build targets.
 java_cpp_template("module_installer_build_config") {
+  # TODO(fredmello): Temporary code to keep downstream unbroken.
   package_path = "org/chromium/components/module_installer/builder"
   sources = [
     "build/ModuleInstallerConfig.template",
   ]
 }
 
-java_cpp_template("module_installer_bundle_build_config") {
-  package_path = "org/chromium/components/module_installer/builder"
-  sources = [
-    "build/ModuleInstallerConfig.template",
-  ]
-  defines = [ "IS_BUNDLE_BUILD" ]
-}
-
-java_cpp_template("module_installer_apk_build_config") {
-  package_path = "org/chromium/components/module_installer/builder"
-  sources = [
-    "build/ModuleInstallerConfig.template",
-  ]
-  defines = [ "IS_APK_BUILD" ]
-}
-
 source_set("native") {
   sources = [
     "module.cc",
diff --git a/components/module_installer/android/build/ModuleInstallerConfig.template b/components/module_installer/android/build/ModuleInstallerConfig.template
index b23b3472..c07cf004 100644
--- a/components/module_installer/android/build/ModuleInstallerConfig.template
+++ b/components/module_installer/android/build/ModuleInstallerConfig.template
@@ -4,16 +4,8 @@
 
 package org.chromium.components.module_installer.builder;
 
-/** Build config for DFMs. */
-public class ModuleInstallerConfig {
-
-#if defined(IS_BUNDLE_BUILD)
-    public static final boolean IS_BUNDLE = true;
-#elif defined(IS_APK_BUILD)
-    public static final boolean IS_BUNDLE = false;
-#else
-    // This needs to not be final in order to avoid being inlined.
-    public static boolean IS_BUNDLE;
-#endif
-
-}
+/**
+  * Build config for DFMs.
+  * TODO(fredmello): Temporary code to keep downstream unbroken
+  */
+public class ModuleInstallerConfig { }
diff --git a/components/module_installer/android/java/src/org/chromium/components/module_installer/engine/EngineFactory.java b/components/module_installer/android/java/src/org/chromium/components/module_installer/engine/EngineFactory.java
index 4afcf5fd..e72e19b07 100644
--- a/components/module_installer/android/java/src/org/chromium/components/module_installer/engine/EngineFactory.java
+++ b/components/module_installer/android/java/src/org/chromium/components/module_installer/engine/EngineFactory.java
@@ -4,15 +4,15 @@
 
 package org.chromium.components.module_installer.engine;
 
+import org.chromium.base.BuildConfig;
 import org.chromium.base.CommandLine;
-import org.chromium.components.module_installer.builder.ModuleInstallerConfig;
 
 /**
  * Factory used to build concrete engines.
  */
 public class EngineFactory {
     public InstallEngine getEngine() {
-        if (!ModuleInstallerConfig.IS_BUNDLE) {
+        if (!BuildConfig.IS_BUNDLE) {
             return new ApkEngine();
         }
         if (CommandLine.getInstance().hasSwitch("fake-feature-module-install")) {
diff --git a/components/module_installer/android/java/src/org/chromium/components/module_installer/util/ModuleUtil.java b/components/module_installer/android/java/src/org/chromium/components/module_installer/util/ModuleUtil.java
index 3de119b..62023a0 100644
--- a/components/module_installer/android/java/src/org/chromium/components/module_installer/util/ModuleUtil.java
+++ b/components/module_installer/android/java/src/org/chromium/components/module_installer/util/ModuleUtil.java
@@ -4,8 +4,8 @@
 
 package org.chromium.components.module_installer.util;
 
+import org.chromium.base.BuildConfig;
 import org.chromium.base.annotations.MainDex;
-import org.chromium.components.module_installer.builder.ModuleInstallerConfig;
 import org.chromium.components.module_installer.logger.SplitAvailabilityLogger;
 
 /**
@@ -20,7 +20,7 @@
      * unnecessary code (modules are not supported in APKs).
      */
     public static void recordStartupTime() {
-        if (!ModuleInstallerConfig.IS_BUNDLE) return;
+        if (!BuildConfig.IS_BUNDLE) return;
 
         Timer.recordStartupTime();
     }
@@ -29,7 +29,7 @@
      * Records the start time in order to later report the install duration via UMA.
      */
     public static void recordModuleAvailability() {
-        if (!ModuleInstallerConfig.IS_BUNDLE) return;
+        if (!BuildConfig.IS_BUNDLE) return;
 
         try (Timer timer = new Timer()) {
             initApplication();
@@ -41,7 +41,7 @@
      * Updates the CrashKey report containing modules currently present.
      */
     public static void updateCrashKeys() {
-        if (!ModuleInstallerConfig.IS_BUNDLE) return;
+        if (!BuildConfig.IS_BUNDLE) return;
 
         try (Timer timer = new Timer()) {
             CrashKeyRecorder.updateCrashKeys();
@@ -52,7 +52,7 @@
      * Initializes the PlayCore SplitCompat framework.
      */
     public static void initApplication() {
-        if (!ModuleInstallerConfig.IS_BUNDLE) return;
+        if (!BuildConfig.IS_BUNDLE) return;
 
         try (Timer timer = new Timer()) {
             SplitCompatInitializer.initApplication();
diff --git a/components/module_installer/android/junit/src/org/chromium/components/module_installer/engine/ApkEngineTest.java b/components/module_installer/android/junit/src/org/chromium/components/module_installer/engine/ApkEngineTest.java
new file mode 100644
index 0000000..403e89f
--- /dev/null
+++ b/components/module_installer/android/junit/src/org/chromium/components/module_installer/engine/ApkEngineTest.java
@@ -0,0 +1,43 @@
+// Copyright 2019 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.
+
+package org.chromium.components.module_installer.engine;
+
+import static org.mockito.Mockito.inOrder;
+import static org.mockito.Mockito.mock;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InOrder;
+
+import org.chromium.base.test.BaseRobolectricTestRunner;
+
+/**
+ * Test suite for the ApkEngine class.
+ */
+@RunWith(BaseRobolectricTestRunner.class)
+public class ApkEngineTest {
+    private ApkEngine mEngine;
+
+    @Before
+    public void setUp() {
+        mEngine = new ApkEngine();
+    }
+
+    @Test
+    public void whenInstalling_verifyCompleteWithFailure() {
+        // Arrange.
+        String moduleName = "whenInstalling_verifyCompleteWithFailure";
+        InstallListener listener = mock(InstallListener.class);
+        InOrder inOrder = inOrder(listener);
+
+        // Act.
+        mEngine.install(moduleName, listener);
+
+        // Assert.
+        inOrder.verify(listener).onComplete(false);
+        inOrder.verifyNoMoreInteractions();
+    }
+}
diff --git a/components/module_installer/android/junit/src/org/chromium/components/module_installer/engine/SplitCompatEngineTest.java b/components/module_installer/android/junit/src/org/chromium/components/module_installer/engine/SplitCompatEngineTest.java
index f28f694..b7779ae 100644
--- a/components/module_installer/android/junit/src/org/chromium/components/module_installer/engine/SplitCompatEngineTest.java
+++ b/components/module_installer/android/junit/src/org/chromium/components/module_installer/engine/SplitCompatEngineTest.java
@@ -219,15 +219,33 @@
         verify(mLogger, times(2)).logRequestStart(moduleName);
     }
 
+    @Test(expected = UnsupportedOperationException.class)
+    public void whenInstallingWithMoreThanOneModule_verifyException() {
+        // Arrange.
+        String moduleName = "whenInstallingWithMoreThanOneModule_verifyException";
+        InstallListener listener = mock(InstallListener.class);
+
+        // Mock SplitInstallSessionState.
+        SplitInstallSessionState state = mock(SplitInstallSessionState.class);
+        doReturn(Arrays.asList("m1", "m2")).when(state).moduleNames();
+
+        ArgumentCaptor<SplitInstallStateUpdatedListener> arg =
+                ArgumentCaptor.forClass(SplitInstallStateUpdatedListener.class);
+
+        // Act & Assert.
+        mInstaller.install(moduleName, listener);
+        verify(mManager).registerListener(arg.capture());
+        arg.getValue().onStateUpdate(state);
+    }
+
     @Test
     public void whenInstalled_verifyListenerAndLogger() {
         // Arrange.
         String moduleName = "whenInstalled_verifyListenerAndLogger";
         Integer status = SplitInstallSessionStatus.INSTALLED;
-        String message = String.format("Module '%s' Installed", moduleName);
         InstallListener listener = mock(InstallListener.class);
 
-        // Mock SplitInstallSessionState
+        // Mock SplitInstallSessionState.
         SplitInstallSessionState state = mock(SplitInstallSessionState.class);
         doReturn(status).when(state).status();
         doReturn(Arrays.asList(moduleName)).when(state).moduleNames();
@@ -254,7 +272,6 @@
         String moduleName = "whenFailureToInstall_verifyListenerAndLogger";
         Integer status = SplitInstallSessionStatus.FAILED;
         Integer errorCode = SplitInstallErrorCode.NO_ERROR;
-        String message = String.format("Failed with code: %d", errorCode);
         InstallListener listener = mock(InstallListener.class);
 
         // Mock SplitInstallSessionState.
diff --git a/components/module_installer/android/junit/src/org/chromium/components/module_installer/logger/LoggerTestUtil.java b/components/module_installer/android/junit/src/org/chromium/components/module_installer/logger/LoggerTestUtil.java
new file mode 100644
index 0000000..153cd15
--- /dev/null
+++ b/components/module_installer/android/junit/src/org/chromium/components/module_installer/logger/LoggerTestUtil.java
@@ -0,0 +1,40 @@
+// Copyright 2019 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.
+
+package org.chromium.components.module_installer.logger;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.atLeast;
+import static org.mockito.Mockito.verify;
+
+import org.mockito.ArgumentCaptor;
+
+import org.chromium.base.metrics.CachedMetrics;
+import org.chromium.base.metrics.RecordHistogram;
+
+/**
+ * Util class for supporting logger testing.
+ */
+public class LoggerTestUtil {
+    public static int getHistogramStatus(
+            RecordHistogram.Natives mockHistogram, String expectedName, Integer expectedBoundary) {
+        ArgumentCaptor<String> name = ArgumentCaptor.forClass(String.class);
+        ArgumentCaptor<Long> key = ArgumentCaptor.forClass(Long.class);
+        ArgumentCaptor<Integer> sample = ArgumentCaptor.forClass(Integer.class);
+        ArgumentCaptor<Integer> boundary = ArgumentCaptor.forClass(Integer.class);
+
+        // Make sure the metrics are flushed.
+        // Needed by the EnumeratedHistogramSample but not for RecordHistogram.
+        CachedMetrics.commitCachedMetrics();
+
+        verify(mockHistogram, atLeast(1))
+                .recordEnumeratedHistogram(
+                        name.capture(), key.capture(), sample.capture(), boundary.capture());
+
+        assertEquals(expectedName, name.getValue());
+        assertEquals(expectedBoundary, boundary.getValue());
+
+        return sample.getValue();
+    }
+}
\ No newline at end of file
diff --git a/components/module_installer/android/junit/src/org/chromium/components/module_installer/logger/PlayCoreLoggerTest.java b/components/module_installer/android/junit/src/org/chromium/components/module_installer/logger/PlayCoreLoggerTest.java
new file mode 100644
index 0000000..4a0da28
--- /dev/null
+++ b/components/module_installer/android/junit/src/org/chromium/components/module_installer/logger/PlayCoreLoggerTest.java
@@ -0,0 +1,158 @@
+// Copyright 2019 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.
+
+package org.chromium.components.module_installer.logger;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.inOrder;
+import static org.mockito.Mockito.verify;
+
+import com.google.android.play.core.splitinstall.model.SplitInstallSessionStatus;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InOrder;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import org.chromium.base.test.BaseRobolectricTestRunner;
+
+/**
+ * Test suite for the PlayCoreLogger class.
+ */
+@RunWith(BaseRobolectricTestRunner.class)
+public class PlayCoreLoggerTest {
+    @Mock
+    private SplitInstallFailureLogger mFailureLogger;
+
+    @Mock
+    private SplitInstallStatusLogger mStatusLogger;
+
+    @Mock
+    private SplitAvailabilityLogger mAvailabilityLogger;
+
+    private PlayCoreLogger mPlayCoreLogger;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+
+        mPlayCoreLogger = new PlayCoreLogger(mFailureLogger, mStatusLogger, mAvailabilityLogger);
+    }
+
+    @Test
+    public void whenLogRequestFailure_verifyLogged() {
+        // Arrange.
+        String moduleName = "whenLogRequestFailure_verifyLogged";
+        Integer errorCode = 1;
+
+        // Act.
+        mPlayCoreLogger.logRequestFailure(moduleName, errorCode);
+
+        // Assert.
+        verify(mFailureLogger).logRequestFailure(moduleName, errorCode);
+    }
+
+    @Test
+    public void whenLogStatusFailure_verifyLogged() {
+        // Arrange.
+        String moduleName = "whenLogStatusFailure_verifyLogged";
+        Integer errorCode = 1;
+
+        // Act.
+        mPlayCoreLogger.logStatusFailure(moduleName, errorCode);
+
+        // Assert.
+        verify(mFailureLogger).logStatusFailure(moduleName, errorCode);
+    }
+
+    @Test
+    public void whenLogInstalledStatus_verifyLogged() {
+        // Arrange.
+        String moduleName = "whenLogInstalledStatus_verifyLogged";
+        Integer status = SplitInstallSessionStatus.INSTALLED;
+        InOrder inOrder = inOrder(mStatusLogger, mAvailabilityLogger, mFailureLogger);
+
+        // Act.
+        mPlayCoreLogger.logStatus(moduleName, status);
+
+        // Assert.
+        inOrder.verify(mStatusLogger).logStatusChange(moduleName, status);
+        inOrder.verify(mAvailabilityLogger).storeModuleInstalled(moduleName, status);
+        inOrder.verify(mAvailabilityLogger).logInstallTimes(moduleName);
+        inOrder.verify(mFailureLogger).logStatusSuccess(moduleName);
+        inOrder.verifyNoMoreInteractions();
+    }
+
+    @Test
+    public void whenLogCanceledStatus_verifyLogged() {
+        // Arrange.
+        String moduleName = "whenLogCanceledStatus_verifyLogged";
+        Integer status = SplitInstallSessionStatus.CANCELED;
+        InOrder inOrder = inOrder(mStatusLogger, mFailureLogger);
+
+        // Act.
+        mPlayCoreLogger.logStatus(moduleName, status);
+
+        // Assert.
+        inOrder.verify(mStatusLogger).logStatusChange(moduleName, status);
+        inOrder.verify(mFailureLogger).logStatusCanceled(moduleName);
+        inOrder.verifyNoMoreInteractions();
+    }
+
+    @Test
+    public void whenLogDownloadedStatus_verifyLogged() {
+        // Arrange.
+        String moduleName = "whenLogDownloadedStatus_verifyLogged";
+        Integer status = SplitInstallSessionStatus.DOWNLOADED;
+        InOrder inOrder = inOrder(mStatusLogger, mFailureLogger);
+
+        // Act.
+        mPlayCoreLogger.logStatus(moduleName, status);
+
+        // Assert.
+        inOrder.verify(mStatusLogger).logStatusChange(moduleName, status);
+        inOrder.verify(mFailureLogger).logStatusNoSplitCompat(moduleName);
+        inOrder.verifyNoMoreInteractions();
+    }
+
+    @Test
+    public void whenLogRequestStart_verifyLogged() {
+        // Arrange.
+        String moduleName = "whenLogRequestStart_verifyLogged";
+
+        // Act.
+        mPlayCoreLogger.logRequestStart(moduleName);
+
+        // Assert.
+        verify(mStatusLogger).logRequestStart(moduleName);
+        verify(mAvailabilityLogger).storeRequestStart(moduleName);
+    }
+
+    @Test
+    public void whenLogRequestDeferredStart_verifyLogged() {
+        // Arrange.
+        String moduleName = "whenLogRequestDeferredStart_verifyLogged";
+
+        // Act.
+        mPlayCoreLogger.logRequestDeferredStart(moduleName);
+
+        // Assert.
+        verify(mStatusLogger).logRequestDeferredStart(moduleName);
+        verify(mAvailabilityLogger).storeRequestDeferredStart(moduleName);
+    }
+
+    @Test
+    public void whenGetUnknownRequest_verifyCorrectErrorCode() {
+        // Arrange.
+        Integer expectedCode = SplitInstallFailureLogger.UNKNOWN_REQUEST_ERROR;
+
+        // Act.
+        Integer actualCode = mPlayCoreLogger.getUnknownRequestErrorCode();
+
+        // Assert.
+        assertEquals(actualCode, expectedCode);
+    }
+}
diff --git a/components/module_installer/android/junit/src/org/chromium/components/module_installer/logger/SplitInstallFailureLoggerTest.java b/components/module_installer/android/junit/src/org/chromium/components/module_installer/logger/SplitInstallFailureLoggerTest.java
new file mode 100644
index 0000000..9189974
--- /dev/null
+++ b/components/module_installer/android/junit/src/org/chromium/components/module_installer/logger/SplitInstallFailureLoggerTest.java
@@ -0,0 +1,145 @@
+// Copyright 2019 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.
+
+package org.chromium.components.module_installer.logger;
+
+import static org.junit.Assert.assertEquals;
+
+import com.google.android.play.core.splitinstall.model.SplitInstallErrorCode;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import org.chromium.base.metrics.RecordHistogram;
+import org.chromium.base.metrics.RecordHistogramJni;
+import org.chromium.base.test.BaseRobolectricTestRunner;
+import org.chromium.base.test.util.JniMocker;
+
+/**
+ * Test suite for the SplitInstallFailureLogger class.
+ */
+@RunWith(BaseRobolectricTestRunner.class)
+public class SplitInstallFailureLoggerTest {
+    @Mock
+    private RecordHistogram.Natives mRecordHistogramMock;
+
+    @Rule
+    public JniMocker mocker = new JniMocker();
+
+    private SplitInstallFailureLogger mFailureLogger;
+
+    private int mErrorCodeMapping[][] = {
+            {4, SplitInstallErrorCode.ACCESS_DENIED},
+            {5, SplitInstallErrorCode.ACTIVE_SESSIONS_LIMIT_EXCEEDED},
+            {6, SplitInstallErrorCode.API_NOT_AVAILABLE},
+            {7, SplitInstallErrorCode.INCOMPATIBLE_WITH_EXISTING_SESSION},
+            {8, SplitInstallErrorCode.INSUFFICIENT_STORAGE},
+            {9, SplitInstallErrorCode.INVALID_REQUEST},
+            {10, SplitInstallErrorCode.MODULE_UNAVAILABLE},
+            {11, SplitInstallErrorCode.NETWORK_ERROR},
+            {12, SplitInstallErrorCode.NO_ERROR},
+            {13, SplitInstallErrorCode.SERVICE_DIED},
+            {14, SplitInstallErrorCode.SESSION_NOT_FOUND},
+            {15, SplitInstallErrorCode.SPLITCOMPAT_COPY_ERROR},
+            {16, SplitInstallErrorCode.SPLITCOMPAT_EMULATION_ERROR},
+            {17, SplitInstallErrorCode.SPLITCOMPAT_VERIFICATION_ERROR},
+            {18, SplitInstallErrorCode.INTERNAL_ERROR},
+    };
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+
+        mocker.mock(RecordHistogramJni.TEST_HOOKS, mRecordHistogramMock);
+
+        mFailureLogger = new SplitInstallFailureLogger();
+    }
+
+    @Test
+    public void whenLogSuccess_verifyHistogramCode() {
+        // Arrange.
+        String moduleName = "whenLogSuccess_verifyHistogramCode";
+        int expectedCode = 0;
+
+        // Act.
+        mFailureLogger.logStatusSuccess(moduleName);
+
+        // Assert.
+        assertEquals(expectedCode, getHistogramStatus(moduleName));
+    }
+
+    @Test
+    public void whenLogCancelation_verifyHistogramCode() {
+        // Arrange.
+        String moduleName = "whenLogCancelation_verifyHistogramCode";
+        int expectedCode = 3;
+
+        // Act.
+        mFailureLogger.logStatusCanceled(moduleName);
+
+        // Assert.
+        assertEquals(expectedCode, getHistogramStatus(moduleName));
+    }
+
+    @Test
+    public void whenLogNoSplitCompat_verifyHistogramCode() {
+        // Arrange.
+        String moduleName = "whenLogNoSplitCompat_verifyHistogramCode";
+        int expectedCode = 21;
+
+        // Act.
+        mFailureLogger.logStatusNoSplitCompat(moduleName);
+
+        // Assert.
+        assertEquals(expectedCode, getHistogramStatus(moduleName));
+    }
+
+    @Test
+    public void whenLogStatusFailure_verifyHistogramCode() {
+        // Arrange.
+        String moduleName = "whenLogStatusFailure_verifyHistogramCode";
+        int unknownCode = 999;
+        int expectedUnknownCode = 19;
+
+        // Act & Assert.
+        for (int[] tuple : mErrorCodeMapping) {
+            int expectedOutputCode = tuple[0];
+            int inputCode = tuple[1];
+            mFailureLogger.logStatusFailure(moduleName, inputCode);
+            assertEquals(expectedOutputCode, getHistogramStatus(moduleName));
+        }
+
+        mFailureLogger.logStatusFailure(moduleName, unknownCode);
+        assertEquals(expectedUnknownCode, getHistogramStatus(moduleName));
+    }
+
+    @Test
+    public void whenLogRequestFailure_verifyHistogramCode() {
+        // Arrange.
+        String moduleName = "whenLogRequestFailure_verifyHistogramCode";
+        int unknownCode = 999;
+        int expectedUnknownCode = 20;
+
+        // Act & Assert.
+        for (int[] tuple : mErrorCodeMapping) {
+            int expectedOutputCode = tuple[0];
+            int inputCode = tuple[1];
+            mFailureLogger.logRequestFailure(moduleName, inputCode);
+            assertEquals(expectedOutputCode, getHistogramStatus(moduleName));
+        }
+
+        mFailureLogger.logRequestFailure(moduleName, unknownCode);
+        assertEquals(expectedUnknownCode, getHistogramStatus(moduleName));
+    }
+
+    private int getHistogramStatus(String moduleName) {
+        String expName = "Android.FeatureModules.InstallStatus." + moduleName;
+        Integer expBoundary = 22;
+        return LoggerTestUtil.getHistogramStatus(mRecordHistogramMock, expName, expBoundary);
+    }
+}
diff --git a/components/module_installer/android/junit/src/org/chromium/components/module_installer/logger/SplitInstallStatusLoggerTest.java b/components/module_installer/android/junit/src/org/chromium/components/module_installer/logger/SplitInstallStatusLoggerTest.java
new file mode 100644
index 0000000..d6f91c7
--- /dev/null
+++ b/components/module_installer/android/junit/src/org/chromium/components/module_installer/logger/SplitInstallStatusLoggerTest.java
@@ -0,0 +1,101 @@
+// Copyright 2019 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.
+
+package org.chromium.components.module_installer.logger;
+
+import static org.junit.Assert.assertEquals;
+
+import com.google.android.play.core.splitinstall.model.SplitInstallSessionStatus;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import org.chromium.base.metrics.RecordHistogram;
+import org.chromium.base.metrics.RecordHistogramJni;
+import org.chromium.base.test.BaseRobolectricTestRunner;
+import org.chromium.base.test.util.JniMocker;
+
+/**
+ * Test suite for the SplitInstallStatusLogger class.
+ */
+@RunWith(BaseRobolectricTestRunner.class)
+public class SplitInstallStatusLoggerTest {
+    @Mock
+    private RecordHistogram.Natives mRecordHistogramMock;
+
+    @Rule
+    public JniMocker mocker = new JniMocker();
+
+    private SplitInstallStatusLogger mStatusLogger;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+
+        mocker.mock(RecordHistogramJni.TEST_HOOKS, mRecordHistogramMock);
+
+        mStatusLogger = new SplitInstallStatusLogger();
+    }
+
+    @Test
+    public void whenLogRequestStart_verifyHistogramCode() {
+        // Arrange.
+        String moduleName = "whenLogRequestStart_verifyHistogramCode";
+        int expectedCode = 1;
+
+        // Act.
+        mStatusLogger.logRequestStart(moduleName);
+
+        // Assert.
+        assertEquals(expectedCode, getHistogramStatus(moduleName));
+    }
+
+    @Test
+    public void whenLogRequestDeferredStart_verifyHistogramCode() {
+        // Arrange.
+        String moduleName = "whenLogRequestDeferredStart_verifyHistogramCode";
+        int expectedCode = 11;
+
+        // Act.
+        mStatusLogger.logRequestDeferredStart(moduleName);
+
+        // Assert.
+        assertEquals(expectedCode, getHistogramStatus(moduleName));
+    }
+
+    @Test
+    public void whenLogStatusChange_verifyHistogramCode() {
+        // Arrange.
+        String moduleName = "whenLogStatusChange_verifyHistogramCode";
+        int unknownCode = 999;
+
+        // Act & Assert.
+        assertEquals(0, logStatusChange(moduleName, unknownCode));
+        assertEquals(2, logStatusChange(moduleName, SplitInstallSessionStatus.PENDING));
+        assertEquals(3, logStatusChange(moduleName, SplitInstallSessionStatus.DOWNLOADING));
+        assertEquals(4, logStatusChange(moduleName, SplitInstallSessionStatus.DOWNLOADED));
+        assertEquals(5, logStatusChange(moduleName, SplitInstallSessionStatus.INSTALLING));
+        assertEquals(6, logStatusChange(moduleName, SplitInstallSessionStatus.INSTALLED));
+        assertEquals(7, logStatusChange(moduleName, SplitInstallSessionStatus.FAILED));
+        assertEquals(8, logStatusChange(moduleName, SplitInstallSessionStatus.CANCELING));
+        assertEquals(9, logStatusChange(moduleName, SplitInstallSessionStatus.CANCELED));
+        assertEquals(10,
+                logStatusChange(moduleName, SplitInstallSessionStatus.REQUIRES_USER_CONFIRMATION));
+    }
+
+    private int logStatusChange(String moduleName, int status) {
+        mStatusLogger.logStatusChange(moduleName, status);
+        return getHistogramStatus(moduleName);
+    }
+
+    private int getHistogramStatus(String moduleName) {
+        String expName = "Android.FeatureModules.InstallingStatus." + moduleName;
+        Integer expBoundary = 12;
+        return LoggerTestUtil.getHistogramStatus(mRecordHistogramMock, expName, expBoundary);
+    }
+}
diff --git a/components/neterror/resources/offline.js b/components/neterror/resources/offline.js
index f170440..3cdea7d 100644
--- a/components/neterror/resources/offline.js
+++ b/components/neterror/resources/offline.js
@@ -98,8 +98,8 @@
 // but navigator.userAgent includes /Safari/.
 // TODO(crbug.com/998999): Fix navigator.userAgent such that it reliably
 // returns an agent string containing "CriOS".
-var IS_IOS = /iPad|iPhone|iPod|MacIntel/.test(navigator.platform) &&
-    !(/Safari/.test(navigator.userAgent));
+var IS_IOS = /iPad|iPhone|iPod|MacIntel/.test(window.navigator.platform) &&
+    !(/Safari/.test(window.navigator.userAgent));
 
 
 /** @const */
diff --git a/components/page_info_strings.grdp b/components/page_info_strings.grdp
index 87a1e7a8..ce5891d 100644
--- a/components/page_info_strings.grdp
+++ b/components/page_info_strings.grdp
@@ -39,17 +39,20 @@
   <message name="IDS_PAGE_INFO_SAFETY_TIP_BAD_REPUTATION_DESCRIPTION" desc="Body of message to display in the page info bubble when you are viewing a page that triggered a safety tip.">
     This site could be fake or fraudulent. Chrome recommends leaving now.
   </message>
-  <message name="IDS_PAGE_INFO_SAFETY_TIP_LEAVE_BUTTON" desc="Text of button to leave a suspicious page shown on the safety tip page info bubble.">
-    Leave this site
+  <message name="IDS_PAGE_INFO_SAFETY_TIP_MORE_INFO_LINK" desc="Text of link to Help Center page on safety tip page info bubble.">
+    Learn more
   </message>
-  <message name="IDS_PAGE_INFO_SAFETY_TIP_GO_TO_SITE_BUTTON" desc="Text of button to leave a suspicious page shown on the safety tip page info bubble.">
-    Yes. Go there.
+  <message name="IDS_PAGE_INFO_SAFETY_TIP_IGNORE_BUTTON" desc="Text of button to ignore a safety tip page info bubble.">
+    Ignore
+  </message>
+  <message name="IDS_PAGE_INFO_SAFETY_TIP_LEAVE_BUTTON" desc="Text of button to leave a suspicious page shown on the safety tip page info bubble.">
+    Leave site
   </message>
   <message name="IDS_PAGE_INFO_SAFETY_TIP_LOOKALIKE_TITLE" desc="Title of Safety Tip infobar on a domain that looks like another domain.">
     Did you mean <ph name='LOOKALIKE_DOMAIN'>$1<ex>google.com</ex></ph>?
   </message>
   <message name="IDS_PAGE_INFO_SAFETY_TIP_LOOKALIKE_DESCRIPTION" desc="Body of an infobar warning when the user visits a page that triggered a Safety Tip because the domain looked like another domain.">
-    This site's name looks similar to that of another site. Attackers sometimes mimic sites by making small, hard-to-see changes to the domain name.
+    This site's name looks similar to <ph name='LOOKALIKE_DOMAIN'>$1<ex>google.com</ex></ph>. Attackers sometimes mimic sites by making small, hard-to-see changes to the domain name.
   </message>
 
   <!-- Viewing file strings -->
diff --git a/components/page_info_strings_grdp/IDS_PAGE_INFO_SAFETY_TIP_IGNORE_BUTTON.png.sha1 b/components/page_info_strings_grdp/IDS_PAGE_INFO_SAFETY_TIP_IGNORE_BUTTON.png.sha1
new file mode 100644
index 0000000..0f1eae2
--- /dev/null
+++ b/components/page_info_strings_grdp/IDS_PAGE_INFO_SAFETY_TIP_IGNORE_BUTTON.png.sha1
@@ -0,0 +1 @@
+df14c960857c08e55816d0cd50445988f337be8a
\ No newline at end of file
diff --git a/components/page_info_strings_grdp/IDS_PAGE_INFO_SAFETY_TIP_LEAVE_BUTTON.png.sha1 b/components/page_info_strings_grdp/IDS_PAGE_INFO_SAFETY_TIP_LEAVE_BUTTON.png.sha1
index db9fb7b..0f1eae2 100644
--- a/components/page_info_strings_grdp/IDS_PAGE_INFO_SAFETY_TIP_LEAVE_BUTTON.png.sha1
+++ b/components/page_info_strings_grdp/IDS_PAGE_INFO_SAFETY_TIP_LEAVE_BUTTON.png.sha1
@@ -1 +1 @@
-286691c1acd6ead1593fb72f3bc054fb607a67ed
\ No newline at end of file
+df14c960857c08e55816d0cd50445988f337be8a
\ No newline at end of file
diff --git a/components/page_info_strings_grdp/IDS_PAGE_INFO_SAFETY_TIP_LOOKALIKE_DESCRIPTION.png.sha1 b/components/page_info_strings_grdp/IDS_PAGE_INFO_SAFETY_TIP_LOOKALIKE_DESCRIPTION.png.sha1
index e68090a..e2295a9f 100644
--- a/components/page_info_strings_grdp/IDS_PAGE_INFO_SAFETY_TIP_LOOKALIKE_DESCRIPTION.png.sha1
+++ b/components/page_info_strings_grdp/IDS_PAGE_INFO_SAFETY_TIP_LOOKALIKE_DESCRIPTION.png.sha1
@@ -1 +1 @@
-f0b39b6ee075f05cb44cae77812ac7e185a57581
\ No newline at end of file
+aa71f67fa4b2adea131a4862a5b639f7e12b69e0
\ No newline at end of file
diff --git a/components/page_info_strings_grdp/IDS_PAGE_INFO_SAFETY_TIP_MORE_INFO_LINK.png.sha1 b/components/page_info_strings_grdp/IDS_PAGE_INFO_SAFETY_TIP_MORE_INFO_LINK.png.sha1
new file mode 100644
index 0000000..0f1eae2
--- /dev/null
+++ b/components/page_info_strings_grdp/IDS_PAGE_INFO_SAFETY_TIP_MORE_INFO_LINK.png.sha1
@@ -0,0 +1 @@
+df14c960857c08e55816d0cd50445988f337be8a
\ No newline at end of file
diff --git a/components/printing/test/print_mock_render_thread.cc b/components/printing/test/print_mock_render_thread.cc
index b126747b..8ee41919 100644
--- a/components/printing/test/print_mock_render_thread.cc
+++ b/components/printing/test/print_mock_render_thread.cc
@@ -6,8 +6,6 @@
 
 #include <stddef.h>
 
-#include <vector>
-
 #include "base/values.h"
 #include "build/build_config.h"
 #include "components/printing/test/mock_printer.h"
@@ -24,10 +22,7 @@
 
 PrintMockRenderThread::PrintMockRenderThread()
 #if BUILDFLAG(ENABLE_PRINTING)
-    : printer_(new MockPrinter),
-      print_dialog_user_response_(true),
-      print_preview_cancel_page_number_(-1),
-      print_preview_pages_remaining_(0)
+    : printer_(std::make_unique<MockPrinter>())
 #endif
 {
 }
diff --git a/components/printing/test/print_mock_render_thread.h b/components/printing/test/print_mock_render_thread.h
index 695da05..7e175b8 100644
--- a/components/printing/test/print_mock_render_thread.h
+++ b/components/printing/test/print_mock_render_thread.h
@@ -9,6 +9,8 @@
 
 #include <memory>
 #include <string>
+#include <utility>
+#include <vector>
 
 #include "base/compiler_specific.h"
 #include "base/macros.h"
@@ -96,14 +98,14 @@
   std::unique_ptr<MockPrinter> printer_;
 
   // True to simulate user clicking print. False to cancel.
-  bool print_dialog_user_response_;
+  bool print_dialog_user_response_ = true;
 
   // Simulates cancelling print preview if |print_preview_pages_remaining_|
   // equals this.
-  int print_preview_cancel_page_number_;
+  int print_preview_cancel_page_number_ = -1;
 
   // Number of pages to generate for print preview.
-  int print_preview_pages_remaining_;
+  int print_preview_pages_remaining_ = 0;
 
   // Vector of <page_number, content_data_size> that were previewed.
   std::vector<std::pair<int, uint32_t>> print_preview_pages_;
diff --git a/components/printing/test/print_render_frame_helper_browsertest.cc b/components/printing/test/print_render_frame_helper_browsertest.cc
index 49939078..2fe59f8 100644
--- a/components/printing/test/print_render_frame_helper_browsertest.cc
+++ b/components/printing/test/print_render_frame_helper_browsertest.cc
@@ -800,7 +800,6 @@
   base::DictionaryValue dict;
   CreatePrintSettingsDictionary(&dict);
   dict.SetBoolean(kSettingPrintToPDF, false);
-  dict.SetInteger(kSettingMarginsType, DEFAULT_MARGINS);
   OnPrintPreview(dict);
 
   EXPECT_EQ(0, print_render_thread()->print_preview_pages_remaining());
@@ -845,7 +844,6 @@
   // Fill in some dummy values.
   base::DictionaryValue dict;
   CreatePrintSettingsDictionary(&dict);
-  dict.SetBoolean(kSettingPrintToPDF, true);
   dict.SetInteger(kSettingMarginsType, PRINTABLE_AREA_MARGINS);
   OnPrintPreview(dict);
 
@@ -971,7 +969,6 @@
   base::DictionaryValue dict;
   CreatePrintSettingsDictionary(&dict);
   dict.SetBoolean(kSettingPrintToPDF, false);
-  dict.SetInteger(kSettingMarginsType, DEFAULT_MARGINS);
   OnPrintPreview(dict);
 
   EXPECT_EQ(0, print_render_thread()->print_preview_pages_remaining());
@@ -1005,8 +1002,6 @@
   // Fill in some dummy values.
   base::DictionaryValue dict;
   CreatePrintSettingsDictionary(&dict);
-  dict.SetBoolean(kSettingPrintToPDF, true);
-  dict.SetInteger(kSettingMarginsType, DEFAULT_MARGINS);
   OnPrintPreview(dict);
 
   EXPECT_EQ(0, print_render_thread()->print_preview_pages_remaining());
@@ -1030,7 +1025,6 @@
   base::DictionaryValue dict;
   CreatePrintSettingsDictionary(&dict);
   dict.SetBoolean(kSettingPrintToPDF, false);
-  dict.SetInteger(kSettingMarginsType, DEFAULT_MARGINS);
   OnPrintPreview(dict);
 
   EXPECT_EQ(0, print_render_thread()->print_preview_pages_remaining());
@@ -1063,7 +1057,6 @@
   base::DictionaryValue dict;
   CreatePrintSettingsDictionary(&dict);
   dict.SetBoolean(kSettingPrintToPDF, false);
-  dict.SetInteger(kSettingMarginsType, DEFAULT_MARGINS);
   OnPrintPreview(dict);
 
   EXPECT_EQ(0, print_render_thread()->print_preview_pages_remaining());
@@ -1108,7 +1101,6 @@
   // Fill in some dummy values.
   base::DictionaryValue dict;
   CreatePrintSettingsDictionary(&dict);
-  dict.SetBoolean(kSettingPrintToPDF, true);
   dict.SetInteger(kSettingMarginsType, CUSTOM_MARGINS);
   OnPrintPreview(dict);
 
diff --git a/components/safe_browsing/features.cc b/components/safe_browsing/features.cc
index c016215..66d7f41188 100644
--- a/components/safe_browsing/features.cc
+++ b/components/safe_browsing/features.cc
@@ -45,7 +45,7 @@
     "ForceUseAPDownloadProtection", base::FEATURE_DISABLED_BY_DEFAULT};
 
 const base::Feature kPasswordProtectionForSavedPasswords{
-    "SafeBrowsingPasswordProtectionForSignedInUsers",
+    "SafeBrowsingPasswordProtectionForSavedPasswords",
     base::FEATURE_DISABLED_BY_DEFAULT};
 
 const base::Feature kPasswordProtectionForSignedInUsers{
diff --git a/components/safe_browsing/triggers/ad_popup_trigger_unittest.cc b/components/safe_browsing/triggers/ad_popup_trigger_unittest.cc
index f388596b..f344c4d 100644
--- a/components/safe_browsing/triggers/ad_popup_trigger_unittest.cc
+++ b/components/safe_browsing/triggers/ad_popup_trigger_unittest.cc
@@ -172,7 +172,7 @@
       AdPopupTriggerAction::POPUP_COULD_NOT_START_REPORT, 2);
 }
 
-TEST_F(AdPopupTriggerTest, PopupWithNoAds) {
+TEST_F(AdPopupTriggerTest, DISABLED_PopupWithNoAds) {
   // Make sure the trigger doesn't fire when there are no ads on the page.
   CreateTrigger();
   EXPECT_CALL(*get_trigger_manager(),
diff --git a/components/security_interstitials_strings.grdp b/components/security_interstitials_strings.grdp
index b3920e5..c072689 100644
--- a/components/security_interstitials_strings.grdp
+++ b/components/security_interstitials_strings.grdp
@@ -461,7 +461,7 @@
   <message name="IDS_SAFETY_TIP_ANDROID_LEAVE_BUTTON" desc="Text of button to ignore the warning on a suspicious page. Shown on the safety tip infobar.">
     Leave site
   </message>
-  <message name="IDS_SAFETY_TIP_ANDROID_GO_TO_SITE_BUTTON" desc="Text of button to ignore the warning on a suspicious page. Shown on the safety tip infobar when we suggest an alternate (safe) destination.">
-    Yes. Go there.
+  <message name="IDS_SAFETY_TIP_ANDROID_LOOKALIKE_TITLE" desc="Title of Safety Tip infobar on a domain that looks like another domain.">
+    Is this the right site?
   </message>
 </grit-part>
diff --git a/components/security_interstitials_strings_grdp/IDS_SAFETY_TIP_ANDROID_LOOKALIKE_TITLE.png.sha1 b/components/security_interstitials_strings_grdp/IDS_SAFETY_TIP_ANDROID_LOOKALIKE_TITLE.png.sha1
new file mode 100644
index 0000000..48073e1c
--- /dev/null
+++ b/components/security_interstitials_strings_grdp/IDS_SAFETY_TIP_ANDROID_LOOKALIKE_TITLE.png.sha1
@@ -0,0 +1 @@
+c25e67e85068abb61bdb2e4e17f836429c4b9a04
\ No newline at end of file
diff --git a/components/variations/BUILD.gn b/components/variations/BUILD.gn
index a11a63e..3d36206 100644
--- a/components/variations/BUILD.gn
+++ b/components/variations/BUILD.gn
@@ -130,6 +130,7 @@
   sources = [
     "active_field_trials_unittest.cc",
     "child_process_field_trial_syncer_unittest.cc",
+    "client_filterable_state_unittest.cc",
     "entropy_provider_unittest.cc",
     "hashing_unittest.cc",
     "net/variations_command_line_unittest.cc",
diff --git a/components/variations/client_filterable_state.cc b/components/variations/client_filterable_state.cc
index 6fda4f4..f39123e 100644
--- a/components/variations/client_filterable_state.cc
+++ b/components/variations/client_filterable_state.cc
@@ -31,7 +31,15 @@
 #endif
 }
 
-ClientFilterableState::ClientFilterableState() {}
+ClientFilterableState::ClientFilterableState(
+    IsEnterpriseFunction is_enterprise_function)
+    : is_enterprise_function_(std::move(is_enterprise_function)) {}
 ClientFilterableState::~ClientFilterableState() {}
 
+bool ClientFilterableState::IsEnterprise() const {
+  if (!is_enterprise_.has_value())
+    is_enterprise_ = std::move(is_enterprise_function_).Run();
+  return is_enterprise_.value();
+}
+
 }  // namespace variations
diff --git a/components/variations/client_filterable_state.h b/components/variations/client_filterable_state.h
index 44cc17b..6a3bdd1 100644
--- a/components/variations/client_filterable_state.h
+++ b/components/variations/client_filterable_state.h
@@ -7,20 +7,29 @@
 
 #include <string>
 
+#include "base/callback.h"
 #include "base/macros.h"
+#include "base/optional.h"
 #include "base/time/time.h"
 #include "base/version.h"
 #include "components/variations/proto/study.pb.h"
 
 namespace variations {
 
+using IsEnterpriseFunction = base::OnceCallback<bool()>;
+
 // A container for all of the client state which is used for filtering studies.
 struct ClientFilterableState {
   static Study::Platform GetCurrentPlatform();
 
-  ClientFilterableState();
+  ClientFilterableState(IsEnterpriseFunction is_enterprise_function);
   ~ClientFilterableState();
 
+  // Whether this is an enterprise client. Always false on android, iOS, and
+  // linux. Determined by VariationsServiceClient::IsEnterprise for windows,
+  // chromeOs, and mac.
+  bool IsEnterprise() const;
+
   // The system locale.
   std::string locale;
 
@@ -51,11 +60,6 @@
   // Based on base::SysInfo::IsLowEndDevice().
   bool is_low_end_device = false;
 
-  // Whether this is an enterprise client. Always false on android, iOS, and
-  // linux. Determined by VariationsServiceClient::IsEnterprise for windows,
-  // chromeOs, and mac.
-  bool is_enterprise = false;
-
   // The country code to use for studies configured with session consistency.
   std::string session_consistency_country;
 
@@ -63,6 +67,12 @@
   std::string permanent_consistency_country;
 
  private:
+  // Evaluating enterprise status negatively affects performance, so we only
+  // evaluate it if needed (i.e. if a study is filtering by enterprise) and at
+  // most once.
+  mutable IsEnterpriseFunction is_enterprise_function_;
+  mutable base::Optional<bool> is_enterprise_;
+
   DISALLOW_COPY_AND_ASSIGN(ClientFilterableState);
 };
 
diff --git a/components/variations/client_filterable_state_unittest.cc b/components/variations/client_filterable_state_unittest.cc
new file mode 100644
index 0000000..2c0173a
--- /dev/null
+++ b/components/variations/client_filterable_state_unittest.cc
@@ -0,0 +1,25 @@
+// Copyright 2019 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 "components/variations/client_filterable_state.h"
+
+#include "base/bind.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace variations {
+
+TEST(VariationsClientFilterableStateTest, IsEnterprise) {
+  // Test, for non enterprise clients, is_enterprise_function_ is called once.
+  ClientFilterableState client_non_enterprise(
+      base::BindOnce([] { return false; }));
+  EXPECT_FALSE(client_non_enterprise.IsEnterprise());
+  EXPECT_FALSE(client_non_enterprise.IsEnterprise());
+
+  // Test, for enterprise clients, is_enterprise_function_ is called once.
+  ClientFilterableState client_enterprise(base::BindOnce([] { return true; }));
+  EXPECT_TRUE(client_enterprise.IsEnterprise());
+  EXPECT_TRUE(client_enterprise.IsEnterprise());
+}
+
+}  // namespace variations
diff --git a/components/variations/service/safe_seed_manager_unittest.cc b/components/variations/service/safe_seed_manager_unittest.cc
index 28f28d6..40d3b11 100644
--- a/components/variations/service/safe_seed_manager_unittest.cc
+++ b/components/variations/service/safe_seed_manager_unittest.cc
@@ -81,7 +81,7 @@
 // |safe_seed_manager|.
 void SetDefaultActiveState(SafeSeedManager* safe_seed_manager) {
   std::unique_ptr<ClientFilterableState> client_state =
-      std::make_unique<ClientFilterableState>();
+      std::make_unique<ClientFilterableState>(base::OnceCallback<bool()>());
   client_state->locale = kTestLocale;
   client_state->permanent_consistency_country =
       kTestPermanentConsistencyCountry;
diff --git a/components/variations/service/variations_field_trial_creator.cc b/components/variations/service/variations_field_trial_creator.cc
index 6744746..01d097f 100644
--- a/components/variations/service/variations_field_trial_creator.cc
+++ b/components/variations/service/variations_field_trial_creator.cc
@@ -234,8 +234,12 @@
 std::unique_ptr<ClientFilterableState>
 VariationsFieldTrialCreator::GetClientFilterableStateForVersion(
     const base::Version& version) {
+  // Note that passing base::Unretained(client_) is safe here because |client_|
+  // lives until Chrome exits.
+  auto IsEnterpriseCallback = base::Bind(&VariationsServiceClient::IsEnterprise,
+                                         base::Unretained(client_));
   std::unique_ptr<ClientFilterableState> state =
-      std::make_unique<ClientFilterableState>();
+      std::make_unique<ClientFilterableState>(IsEnterpriseCallback);
   state->locale = application_locale_;
   state->reference_date = GetReferenceDateForExpiryChecks(local_state());
   state->version = version;
@@ -252,7 +256,6 @@
   // evaluated, that field trial would not be able to apply for this case.
   state->is_low_end_device = base::SysInfo::IsLowEndDevice();
 #endif
-  state->is_enterprise = client_->IsEnterprise();
   state->session_consistency_country = GetLatestCountry();
   state->permanent_consistency_country = LoadPermanentConsistencyCountry(
       version, state->session_consistency_country);
diff --git a/components/variations/study_filtering.cc b/components/variations/study_filtering.cc
index 8338088..51fddcf 100644
--- a/components/variations/study_filtering.cc
+++ b/components/variations/study_filtering.cc
@@ -119,8 +119,10 @@
          filter.is_low_end_device() == is_low_end_device;
 }
 
-bool CheckStudyEnterprise(const Study::Filter& filter, bool is_enterprise) {
-  return !filter.has_is_enterprise() || filter.is_enterprise() == is_enterprise;
+bool CheckStudyEnterprise(const Study::Filter& filter,
+                          const ClientFilterableState& client_state) {
+  return !filter.has_is_enterprise() ||
+         filter.is_enterprise() == client_state.IsEnterprise();
 }
 
 bool CheckStudyStartDate(const Study::Filter& filter,
@@ -278,7 +280,7 @@
       return false;
     }
 
-    if (!CheckStudyEnterprise(study.filter(), client_state.is_enterprise)) {
+    if (!CheckStudyEnterprise(study.filter(), client_state)) {
       DVLOG(1) << "Filtered out study " << study.name()
                << " due to enterprise state.";
       return false;
diff --git a/components/variations/study_filtering.h b/components/variations/study_filtering.h
index c1cf9c3..fd8ffdf 100644
--- a/components/variations/study_filtering.h
+++ b/components/variations/study_filtering.h
@@ -46,7 +46,8 @@
                             bool is_low_end_device);
 
 // Checks whether a study is applicable given |is_enterprise| per |filter|.
-bool CheckStudyEnterprise(const Study::Filter& filter, bool is_enterprise);
+bool CheckStudyEnterprise(const Study::Filter& filter,
+                          const ClientFilterableState& client_state);
 
 // Checks whether a study is applicable for the given date/time per |filter|.
 bool CheckStudyStartDate(const Study::Filter& filter,
diff --git a/components/variations/study_filtering_unittest.cc b/components/variations/study_filtering_unittest.cc
index f17149a..30e0305 100644
--- a/components/variations/study_filtering_unittest.cc
+++ b/components/variations/study_filtering_unittest.cc
@@ -10,6 +10,8 @@
 
 #include <vector>
 
+#include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/macros.h"
 #include "base/stl_util.h"
 #include "base/strings/string_split.h"
@@ -272,19 +274,22 @@
 
 TEST(VariationsStudyFilteringTest, CheckStudyEnterprise) {
   Study::Filter filter;
+  ClientFilterableState client_non_enterprise(
+      base::BindOnce([] { return false; }));
+  ClientFilterableState client_enterprise(base::BindOnce([] { return true; }));
 
   // Check that if the filter is not set, study applies to both enterprise and
   // non-enterprise clients.
-  EXPECT_TRUE(internal::CheckStudyEnterprise(filter, true));
-  EXPECT_TRUE(internal::CheckStudyEnterprise(filter, false));
+  EXPECT_TRUE(internal::CheckStudyEnterprise(filter, client_enterprise));
+  EXPECT_TRUE(internal::CheckStudyEnterprise(filter, client_non_enterprise));
 
   filter.set_is_enterprise(true);
-  EXPECT_TRUE(internal::CheckStudyEnterprise(filter, true));
-  EXPECT_FALSE(internal::CheckStudyEnterprise(filter, false));
+  EXPECT_TRUE(internal::CheckStudyEnterprise(filter, client_enterprise));
+  EXPECT_FALSE(internal::CheckStudyEnterprise(filter, client_non_enterprise));
 
   filter.set_is_enterprise(false);
-  EXPECT_FALSE(internal::CheckStudyEnterprise(filter, true));
-  EXPECT_TRUE(internal::CheckStudyEnterprise(filter, false));
+  EXPECT_FALSE(internal::CheckStudyEnterprise(filter, client_enterprise));
+  EXPECT_TRUE(internal::CheckStudyEnterprise(filter, client_non_enterprise));
 }
 
 TEST(VariationsStudyFilteringTest, CheckStudyStartDate) {
@@ -637,7 +642,7 @@
   AddExperiment("A", 10, study3);
   AddExperiment("Default", 25, study3);
 
-  ClientFilterableState client_state;
+  ClientFilterableState client_state({});
   client_state.locale = "en-CA";
   client_state.reference_date = base::Time::Now();
   client_state.version = base::Version("20.0.0.0");
@@ -696,7 +701,7 @@
     if (test.filter_exclude_country)
       study->mutable_filter()->add_exclude_country(test.filter_exclude_country);
 
-    ClientFilterableState client_state;
+    ClientFilterableState client_state({});
     client_state.locale = "en-CA";
     client_state.reference_date = base::Time::Now();
     client_state.version = base::Version("20.0.0.0");
@@ -714,7 +719,7 @@
 }
 
 TEST(VariationsStudyFilteringTest, GetClientCountryForStudy_Session) {
-  ClientFilterableState client_state;
+  ClientFilterableState client_state({});
   client_state.session_consistency_country = "session_country";
   client_state.permanent_consistency_country = "permanent_country";
 
@@ -725,7 +730,7 @@
 }
 
 TEST(VariationsStudyFilteringTest, GetClientCountryForStudy_Permanent) {
-  ClientFilterableState client_state;
+  ClientFilterableState client_state({});
   client_state.session_consistency_country = "session_country";
   client_state.permanent_consistency_country = "permanent_country";
 
diff --git a/components/variations/variations_seed_processor_unittest.cc b/components/variations/variations_seed_processor_unittest.cc
index 5a6e7bbd..6d39a69 100644
--- a/components/variations/variations_seed_processor_unittest.cc
+++ b/components/variations/variations_seed_processor_unittest.cc
@@ -13,6 +13,7 @@
 #include <vector>
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/command_line.h"
 #include "base/feature_list.h"
 #include "base/format_macros.h"
@@ -266,7 +267,7 @@
   const base::Time year_ago =
       base::Time::Now() - base::TimeDelta::FromDays(365);
 
-  ClientFilterableState client_state;
+  ClientFilterableState client_state({});
   client_state.locale = "en-CA";
   client_state.reference_date = base::Time::Now();
   client_state.version = base::Version("20.0.0.0");
@@ -548,7 +549,7 @@
   AddExperiment("Default", 0, study3);
   study3->set_activation_type(Study_ActivationType_ACTIVATE_ON_QUERY);
 
-  ClientFilterableState client_state;
+  ClientFilterableState client_state({});
   client_state.locale = "en-CA";
   client_state.reference_date = base::Time::Now();
   client_state.version = base::Version("20.0.0.0");
diff --git a/components/variations/variations_seed_store_unittest.cc b/components/variations/variations_seed_store_unittest.cc
index 4c9e957..df0bbe5d 100644
--- a/components/variations/variations_seed_store_unittest.cc
+++ b/components/variations/variations_seed_store_unittest.cc
@@ -108,7 +108,7 @@
 // for testing.
 std::unique_ptr<ClientFilterableState> CreateTestClientFilterableState() {
   std::unique_ptr<ClientFilterableState> client_state =
-      std::make_unique<ClientFilterableState>();
+      std::make_unique<ClientFilterableState>(base::OnceCallback<bool()>());
   client_state->locale = "es-MX";
   client_state->reference_date = WrapTime(1234554321);
   client_state->version = base::Version("1.2.3.4");
@@ -568,7 +568,7 @@
   // Loading an empty seed should return false.
   TestVariationsSeedStore seed_store(&prefs);
   VariationsSeed loaded_seed;
-  ClientFilterableState client_state;
+  ClientFilterableState client_state({});
   base::Time fetch_time;
   EXPECT_FALSE(
       seed_store.LoadSafeSeed(&loaded_seed, &client_state, &fetch_time));
@@ -578,7 +578,7 @@
   const VariationsSeed seed = CreateTestSeed();
   const std::string serialized_seed = SerializeSeed(seed);
   const std::string signature = "a completely ignored signature";
-  ClientFilterableState client_state;
+  ClientFilterableState client_state({});
   client_state.locale = "en-US";
   client_state.reference_date = WrapTime(12345);
   client_state.session_consistency_country = "US";
@@ -618,7 +618,7 @@
 TEST(VariationsSeedStoreTest, StoreSafeSeed_EmptySeed) {
   const std::string serialized_seed;
   const std::string signature = "a completely ignored signature";
-  ClientFilterableState client_state;
+  ClientFilterableState client_state({});
   client_state.locale = "en-US";
   client_state.reference_date = WrapTime(54321);
   client_state.session_consistency_country = "US";
@@ -663,7 +663,7 @@
 TEST(VariationsSeedStoreTest, StoreSafeSeed_InvalidSeed) {
   const std::string serialized_seed = "a nonsense seed";
   const std::string signature = "a completely ignored signature";
-  ClientFilterableState client_state;
+  ClientFilterableState client_state({});
   client_state.locale = "en-US";
   client_state.reference_date = WrapTime(12345);
   client_state.session_consistency_country = "US";
@@ -711,7 +711,7 @@
   const std::string serialized_seed = SerializeSeed(seed);
   // A valid signature, but for a different seed.
   const std::string signature = kBase64SeedSignature;
-  ClientFilterableState client_state;
+  ClientFilterableState client_state({});
   client_state.locale = "en-US";
   client_state.reference_date = WrapTime(12345);
   client_state.session_consistency_country = "US";
@@ -762,7 +762,7 @@
   ASSERT_TRUE(
       base::Base64Decode(kUncompressedBase64SeedData, &serialized_seed));
   const std::string signature = kBase64SeedSignature;
-  ClientFilterableState client_state;
+  ClientFilterableState client_state({});
   client_state.locale = "en-US";
   client_state.reference_date = WrapTime(12345);
   client_state.session_consistency_country = "US";
@@ -807,7 +807,7 @@
   const std::string serialized_seed = SerializeSeed(seed);
   const std::string base64_seed = SerializeSeedBase64(seed);
   const std::string signature = "a completely ignored signature";
-  ClientFilterableState unused_client_state;
+  ClientFilterableState unused_client_state({});
   const base::Time fetch_time = WrapTime(12345);
 
   TestingPrefServiceSimple prefs;
@@ -865,7 +865,7 @@
   const std::string base64_new_seed = SerializeSeedBase64(new_seed);
   const std::string signature = "a completely ignored signature";
   const base::Time fetch_time = WrapTime(12345);
-  ClientFilterableState unused_client_state;
+  ClientFilterableState unused_client_state({});
 
   TestingPrefServiceSimple prefs;
   VariationsSeedStore::RegisterPrefs(prefs.registry());
diff --git a/content/browser/accessibility/ax_platform_node_textrangeprovider_win_browsertest.cc b/content/browser/accessibility/ax_platform_node_textrangeprovider_win_browsertest.cc
index 5e1bdff..fb11dd1 100644
--- a/content/browser/accessibility/ax_platform_node_textrangeprovider_win_browsertest.cc
+++ b/content/browser/accessibility/ax_platform_node_textrangeprovider_win_browsertest.cc
@@ -1537,7 +1537,7 @@
                                    /*expected_count*/ -1);
 
   text_range_provider->ExpandToEnclosingUnit(TextUnit_Line);
-  EXPECT_UIA_TEXTRANGE_EQ(text_range_provider, L"Text in iframe\n");
+  EXPECT_UIA_TEXTRANGE_EQ(text_range_provider, L"Text in iframe");
 
   text_range_provider->ExpandToEnclosingUnit(TextUnit_Document);
   EXPECT_UIA_TEXTRANGE_EQ(text_range_provider,
@@ -1703,7 +1703,7 @@
 
   ASSERT_HRESULT_SUCCEEDED(
       text_range_provider->ExpandToEnclosingUnit(TextUnit_Format));
-  EXPECT_UIA_TEXTRANGE_EQ(text_range_provider, L"plain\ntext\n");
+  EXPECT_UIA_TEXTRANGE_EQ(text_range_provider, L"plain\ntext");
 
   EXPECT_UIA_MOVE_ENDPOINT_BY_UNIT(
       text_range_provider, TextPatternRangeEndpoint_End, TextUnit_Character,
diff --git a/content/browser/appcache/appcache_storage.h b/content/browser/appcache/appcache_storage.h
index 50515fa..9d9aed4 100644
--- a/content/browser/appcache/appcache_storage.h
+++ b/content/browser/appcache/appcache_storage.h
@@ -49,36 +49,38 @@
     Delegate(const Delegate&) = delete;
     Delegate& operator=(const Delegate&) = delete;
 
-    // If retrieval fails, 'collection' will be NULL.
+    // If retrieval fails, |collection| will be null.
     virtual void OnAllInfo(AppCacheInfoCollection* collection) {}
 
-    // If a load fails the 'cache' will be NULL.
+    // If the load fails, |cache| will be null.
     virtual void OnCacheLoaded(AppCache* cache, int64_t cache_id) {}
 
-    // If a load fails the 'group' will be NULL.
+    // If the load fails, |group| will be null.
     virtual void OnGroupLoaded(
         AppCacheGroup* group, const GURL& manifest_url) {}
 
-    // If successfully stored 'success' will be true.
+    // If successfully stored, |success| will be true.
     virtual void OnGroupAndNewestCacheStored(
         AppCacheGroup* group, AppCache* newest_cache, bool success,
         bool would_exceed_quota) {}
 
-    // If the operation fails, success will be false.
+    // If the operation fails, |success| will be false.
     virtual void OnGroupMadeObsolete(AppCacheGroup* group,
                                      bool success,
                                      int response_code) {}
 
-    // If a load fails the 'response_info' will be NULL.
+    // If a load fails, |response_info| will be null.
     virtual void OnResponseInfoLoaded(AppCacheResponseInfo* response_info,
                                       int64_t response_id) {}
 
-    // If no response is found, entry.response_id() and
-    // fallback_entry.response_id() will be kAppCacheNoResponseId.
-    // If the response is the entry for an intercept or fallback
-    // namespace, the url of the namespece entry is returned.
-    // If a response is found, the cache id and manifest url of the
-    // containing cache and group are also returned.
+    // If no response is found, |entry|'s response_id() and |fallback_entry|'s
+    // response_id() will be kAppCacheNoResponseId.
+    //
+    // If the response is the entry for an intercept or fallback namespace,
+    // |namespace_entry_url| refers to the entry. Otherwise, it is empty.
+    //
+    // If a response is found, |cache_id|, |group_id|, and |manifest_url|
+    // identify the cache containing the response.
     virtual void OnMainResponseFound(const GURL& url,
                                      const AppCacheEntry& entry,
                                      const GURL& namespace_entry_url,
diff --git a/content/browser/frame_host/back_forward_cache_impl.cc b/content/browser/frame_host/back_forward_cache_impl.cc
index 67a146d..8db526d 100644
--- a/content/browser/frame_host/back_forward_cache_impl.cc
+++ b/content/browser/frame_host/back_forward_cache_impl.cc
@@ -49,6 +49,9 @@
     //
     // See: https://developers.google.com/web/updates/2018/07/page-lifecycle-api
     int rvh_routing_id = render_view_host->GetRoutingID();
+    // TODO(dcheng): Page messages should be used in conjunction with
+    // SendPageMessage(). Having it used to directly route a message to a
+    // RenderView is somewhat unusual. Figure out why this is needed.
     if (frozen) {
       render_view_host->Send(
           new PageMsg_PutPageIntoBackForwardCache(rvh_routing_id));
diff --git a/content/browser/frame_host/mixed_content_navigation_throttle_unittest.cc b/content/browser/frame_host/mixed_content_navigation_throttle_unittest.cc
index 244a4a5f..06f53c2 100644
--- a/content/browser/frame_host/mixed_content_navigation_throttle_unittest.cc
+++ b/content/browser/frame_host/mixed_content_navigation_throttle_unittest.cc
@@ -55,4 +55,4 @@
   }
 }
 
-}  // content
\ No newline at end of file
+}  // namespace content
diff --git a/content/browser/frame_host/render_frame_host_manager.cc b/content/browser/frame_host/render_frame_host_manager.cc
index b1be2765..2973d39 100644
--- a/content/browser/frame_host/render_frame_host_manager.cc
+++ b/content/browser/frame_host/render_frame_host_manager.cc
@@ -2874,7 +2874,13 @@
                                              SiteInstance* instance_to_skip) {
   DCHECK(IPC_MESSAGE_CLASS(*msg) == PageMsgStart);
 
-  // We should always deliver page messages through the main frame.
+  // We should always deliver page messages through the main frame. This is done
+  // because at the time, we wanted to avoid routing messages to swapped-out
+  // RenderViews. The idea was that we might introduce a separate RenderPage
+  // interface.
+  //
+  // TODO(dcheng): Now that RenderView and RenderWidget are increasingly
+  // separated, it might be possible/desirable to just route to the view.
   DCHECK(!frame_tree_node_->parent());
 
   if ((IPC_MESSAGE_CLASS(*msg) != PageMsgStart) || frame_tree_node_->parent()) {
diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc
index f26cab9..a02393b 100644
--- a/content/browser/renderer_host/render_process_host_impl.cc
+++ b/content/browser/renderer_host/render_process_host_impl.cc
@@ -27,7 +27,6 @@
 #include "base/debug/dump_without_crashing.h"
 #include "base/feature_list.h"
 #include "base/files/file.h"
-#include "base/lazy_instance.h"
 #include "base/location.h"
 #include "base/logging.h"
 #include "base/memory/memory_pressure_monitor.h"
@@ -326,8 +325,10 @@
 bool has_done_stun_trials = false;
 
 // the global list of all renderer processes
-base::LazyInstance<base::IDMap<RenderProcessHost*>>::Leaky g_all_hosts =
-    LAZY_INSTANCE_INITIALIZER;
+base::IDMap<RenderProcessHost*>& GetAllHosts() {
+  static base::NoDestructor<base::IDMap<RenderProcessHost*>> s_all_hosts;
+  return *s_all_hosts;
+}
 
 // Returns the global list of RenderProcessHostCreationObserver objects.
 std::vector<RenderProcessHostCreationObserver*>& GetAllCreationObservers() {
@@ -483,7 +484,7 @@
 // This class manages spare RenderProcessHosts.
 //
 // There is a singleton instance of this class which manages a single spare
-// renderer (g_spare_render_process_host_manager, below). This class
+// renderer (SpareRenderProcessHostManager::GetInstance(), below). This class
 // encapsulates the implementation of
 // RenderProcessHost::WarmupSpareRenderProcessHost()
 //
@@ -503,6 +504,11 @@
  public:
   SpareRenderProcessHostManager() {}
 
+  static SpareRenderProcessHostManager& GetInstance() {
+    static base::NoDestructor<SpareRenderProcessHostManager> s_instance;
+    return *s_instance;
+  }
+
   void WarmupSpareRenderProcessHost(BrowserContext* browser_context) {
     if (spare_render_process_host_ &&
         spare_render_process_host_->GetBrowserContext() == browser_context) {
@@ -517,7 +523,7 @@
     // got too many processes. See also ShouldTryToUseExistingProcessHost in
     // this file.
     if (RenderProcessHost::run_renderer_in_process() ||
-        g_all_hosts.Get().size() >=
+        GetAllHosts().size() >=
             RenderProcessHostImpl::GetMaxRendererProcessCount())
       return;
 
@@ -599,7 +605,7 @@
       // If the spare shouldn't be kept around, then discard it as soon as we
       // find that the current spare was mismatched.
       CleanupSpareRenderProcessHost();
-    } else if (g_all_hosts.Get().size() >=
+    } else if (GetAllHosts().size() >=
                RenderProcessHostImpl::GetMaxRendererProcessCount()) {
       // Drop the spare if we are at a process limit and the spare wasn't taken.
       // This helps avoid process reuse.
@@ -670,15 +676,12 @@
   }
 
   // This is a bare pointer, because RenderProcessHost manages the lifetime of
-  // all its instances; see g_all_hosts, above.
+  // all its instances; see GetAllHosts().
   RenderProcessHost* spare_render_process_host_ = nullptr;
 
   DISALLOW_COPY_AND_ASSIGN(SpareRenderProcessHostManager);
 };
 
-base::LazyInstance<SpareRenderProcessHostManager>::Leaky
-    g_spare_render_process_host_manager = LAZY_INSTANCE_INITIALIZER;
-
 const void* const kDefaultSubframeProcessHostHolderKey =
     &kDefaultSubframeProcessHostHolderKey;
 
@@ -1418,8 +1421,10 @@
 // static
 void RenderProcessHost::SetMaxRendererProcessCount(size_t count) {
   g_max_renderer_count_override = count;
-  if (g_all_hosts.Get().size() > count)
-    g_spare_render_process_host_manager.Get().CleanupSpareRenderProcessHost();
+  if (GetAllHosts().size() > count) {
+    SpareRenderProcessHostManager::GetInstance()
+        .CleanupSpareRenderProcessHost();
+  }
 }
 
 // static
@@ -1530,7 +1535,7 @@
 
   CHECK(!BrowserMainRunner::ExitedMainMessageLoop());
   RegisterHost(GetID(), this);
-  g_all_hosts.Get().set_check_on_null_data(true);
+  GetAllHosts().set_check_on_null_data(true);
   // Initialize |child_process_activity_time_| to a reasonable value.
   mark_child_process_activity_time();
 
@@ -1570,7 +1575,7 @@
 void RenderProcessHostImpl::ShutDownInProcessRenderer() {
   DCHECK(g_run_renderer_in_process);
 
-  switch (g_all_hosts.Pointer()->size()) {
+  switch (GetAllHosts().size()) {
     case 0:
       return;
     case 1: {
@@ -2849,19 +2854,20 @@
 // static
 void RenderProcessHostImpl::NotifySpareManagerAboutRecentlyUsedBrowserContext(
     BrowserContext* browser_context) {
-  g_spare_render_process_host_manager.Get().PrepareForFutureRequests(
+  SpareRenderProcessHostManager::GetInstance().PrepareForFutureRequests(
       browser_context);
 }
 
 // static
 RenderProcessHost*
 RenderProcessHostImpl::GetSpareRenderProcessHostForTesting() {
-  return g_spare_render_process_host_manager.Get().spare_render_process_host();
+  return SpareRenderProcessHostManager::GetInstance()
+      .spare_render_process_host();
 }
 
 // static
 void RenderProcessHostImpl::DiscardSpareRenderProcessHostForTesting() {
-  g_spare_render_process_host_manager.Get().CleanupSpareRenderProcessHost();
+  SpareRenderProcessHostManager::GetInstance().CleanupSpareRenderProcessHost();
 }
 
 // static
@@ -3688,16 +3694,16 @@
 
 // static
 void RenderProcessHostImpl::RegisterHost(int host_id, RenderProcessHost* host) {
-  g_all_hosts.Get().AddWithID(host, host_id);
+  GetAllHosts().AddWithID(host, host_id);
 }
 
 // static
 void RenderProcessHostImpl::UnregisterHost(int host_id) {
-  RenderProcessHost* host = g_all_hosts.Get().Lookup(host_id);
+  RenderProcessHost* host = GetAllHosts().Lookup(host_id);
   if (!host)
     return;
 
-  g_all_hosts.Get().Remove(host_id);
+  GetAllHosts().Remove(host_id);
 
   // Look up the map of site to process for the given browser_context,
   // in case we need to remove this process from it.  It will be registered
@@ -3857,7 +3863,7 @@
 // static
 void RenderProcessHost::WarmupSpareRenderProcessHost(
     content::BrowserContext* browser_context) {
-  g_spare_render_process_host_manager.Get().WarmupSpareRenderProcessHost(
+  SpareRenderProcessHostManager::GetInstance().WarmupSpareRenderProcessHost(
       browser_context);
 }
 
@@ -3889,13 +3895,13 @@
 // static
 RenderProcessHost::iterator RenderProcessHost::AllHostsIterator() {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  return iterator(g_all_hosts.Pointer());
+  return iterator(&GetAllHosts());
 }
 
 // static
 RenderProcessHost* RenderProcessHost::FromID(int render_process_id) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  return g_all_hosts.Get().Lookup(render_process_id);
+  return GetAllHosts().Lookup(render_process_id);
 }
 
 // static
@@ -3922,7 +3928,7 @@
   //       a renderer process for a browser context that has no existing
   //       renderers. This is OK in moderation, since the
   //       GetMaxRendererProcessCount() is conservative.
-  if (g_all_hosts.Get().size() >= GetMaxRendererProcessCount())
+  if (GetAllHosts().size() >= GetMaxRendererProcessCount())
     return true;
 
   return GetContentClient()->browser()->ShouldTryToUseExistingProcessHost(
@@ -3934,7 +3940,7 @@
     SiteInstanceImpl* site_instance) {
   // First figure out which existing renderers we can use.
   std::vector<RenderProcessHost*> suitable_renderers;
-  suitable_renderers.reserve(g_all_hosts.Get().size());
+  suitable_renderers.reserve(GetAllHosts().size());
 
   iterator iter(AllHostsIterator());
   while (!iter.IsAtEnd()) {
@@ -3945,7 +3951,7 @@
             site_instance->lock_url())) {
       // The spare is always considered before process reuse.
       DCHECK_NE(iter.GetCurrentValue(),
-                g_spare_render_process_host_manager.Get()
+                SpareRenderProcessHostManager::GetInstance()
                     .spare_render_process_host());
 
       suitable_renderers.push_back(iter.GetCurrentValue());
@@ -4096,8 +4102,7 @@
   }
 
   // See if the spare RenderProcessHost can be used.
-  SpareRenderProcessHostManager& spare_process_manager =
-      g_spare_render_process_host_manager.Get();
+  auto& spare_process_manager = SpareRenderProcessHostManager::GetInstance();
   bool spare_was_taken = false;
   if (!render_process_host) {
     render_process_host = spare_process_manager.MaybeTakeSpareRenderProcessHost(
diff --git a/content/browser/sandbox_parameters_mac.mm b/content/browser/sandbox_parameters_mac.mm
index 5eead918..e0810387 100644
--- a/content/browser/sandbox_parameters_mac.mm
+++ b/content/browser/sandbox_parameters_mac.mm
@@ -53,8 +53,8 @@
   return std::to_string(final_os_version);
 }
 
-// Retrieves the users shared cache and adds it to the profile.
-void AddDarwinUserCache(sandbox::SeatbeltExecClient* client) {
+// Retrieves the users shared darwin dirs and adds it to the profile.
+void AddDarwinDirs(sandbox::SeatbeltExecClient* client) {
   char dir_path[PATH_MAX + 1];
 
   size_t rv = confstr(_CS_DARWIN_USER_CACHE_DIR, dir_path, sizeof(dir_path));
@@ -63,6 +63,20 @@
       "DARWIN_USER_CACHE_DIR",
       service_manager::SandboxMac::GetCanonicalPath(base::FilePath(dir_path))
           .value()));
+
+  rv = confstr(_CS_DARWIN_USER_DIR, dir_path, sizeof(dir_path));
+  PCHECK(rv != 0);
+  CHECK(client->SetParameter(
+      "DARWIN_USER_DIR",
+      service_manager::SandboxMac::GetCanonicalPath(base::FilePath(dir_path))
+          .value()));
+
+  rv = confstr(_CS_DARWIN_USER_TEMP_DIR, dir_path, sizeof(dir_path));
+  PCHECK(rv != 0);
+  CHECK(client->SetParameter(
+      "DARWIN_USER_TEMP_DIR",
+      service_manager::SandboxMac::GetCanonicalPath(base::FilePath(dir_path))
+          .value()));
 }
 
 // All of the below functions populate the |client| with the parameters that the
@@ -128,7 +142,7 @@
   std::vector<base::FilePath> storage_paths =
       GetContentClient()->browser()->GetNetworkContextsParentDirectory();
 
-  AddDarwinUserCache(client);
+  AddDarwinDirs(client);
 
   CHECK(client->SetParameter("NETWORK_SERVICE_STORAGE_PATHS_COUNT",
                              base::NumberToString(storage_paths.size())));
@@ -204,7 +218,7 @@
       break;
     case service_manager::SANDBOX_TYPE_GPU:
       SetupCommonSandboxParameters(client);
-      AddDarwinUserCache(client);
+      AddDarwinDirs(client);
       break;
     case service_manager::SANDBOX_TYPE_CDM:
       SetupCDMSandboxParameters(client);
diff --git a/content/child/runtime_features.cc b/content/child/runtime_features.cc
index e7b15abb2..bd104ed 100644
--- a/content/child/runtime_features.cc
+++ b/content/child/runtime_features.cc
@@ -156,6 +156,9 @@
   if (base::FeatureList::IsEnabled(features::kWebXr))
     WebRuntimeFeatures::EnableWebXR(true);
 
+  if (base::FeatureList::IsEnabled(features::kWebXrArDOMOverlay))
+    WebRuntimeFeatures::EnableWebXRARDOMOverlay(true);
+
   if (base::FeatureList::IsEnabled(features::kWebXrArModule))
     WebRuntimeFeatures::EnableWebXRARModule(true);
 
@@ -383,11 +386,6 @@
                                                 true);
   }
 
-  if (!base::FeatureList::IsEnabled(
-          features::kPauseExecutionContextOnBackgroundFreeze)) {
-    WebRuntimeFeatures::EnablePauseExecutionContextOnBackgroundFreeze(false);
-  }
-
   WebRuntimeFeatures::EnableConsolidatedMovementXY(
       base::FeatureList::IsEnabled(features::kConsolidatedMovementXY));
 
diff --git a/content/child/webthemeengine_impl_default_browsertest.cc b/content/child/webthemeengine_impl_default_browsertest.cc
index 4fb934b..30ae37df 100644
--- a/content/child/webthemeengine_impl_default_browsertest.cc
+++ b/content/child/webthemeengine_impl_default_browsertest.cc
@@ -6,6 +6,10 @@
 #include "content/public/test/content_browser_test.h"
 #include "content/public/test/content_browser_test_utils.h"
 
+#if defined(OS_WIN)
+#include "base/win/windows_version.h"
+#endif  // defined (OS_WIN)
+
 namespace content {
 
 class WebThemeEngineImplDefaultBrowserTest : public ContentBrowserTest {
@@ -14,8 +18,7 @@
 };
 
 #if defined(OS_WIN)
-IN_PROC_BROWSER_TEST_F(WebThemeEngineImplDefaultBrowserTest,
-                       DISABLED_GetSystemColor) {
+IN_PROC_BROWSER_TEST_F(WebThemeEngineImplDefaultBrowserTest, GetSystemColor) {
   GURL url(
       "data:text/html,"
       "<!doctype html><html>"
@@ -91,17 +94,32 @@
                                   "window",
                                   "windowFrame",
                                   "windowText"};
-  std::vector<std::string> expected_colors = {
-      "rgb(255, 255, 255)", "rgb(204, 204, 204)", "rgb(255, 255, 255)",
-      "rgb(99, 99, 206)",   "rgb(240, 240, 240)", "rgb(221, 221, 221)",
-      "rgb(136, 136, 136)", "rgb(0, 0, 0)",       "rgb(0, 0, 0)",
-      "rgb(109, 109, 109)", "rgb(0, 120, 215)",   "rgb(255, 255, 255)",
-      "rgb(255, 255, 255)", "rgb(255, 255, 255)", "rgb(127, 127, 127)",
-      "rgb(251, 252, 197)", "rgb(0, 0, 0)",       "rgb(0, 102, 204)",
-      "rgb(247, 247, 247)", "rgb(0, 0, 0)",       "rgb(255, 255, 255)",
-      "rgb(102, 102, 102)", "rgb(192, 192, 192)", "rgb(221, 221, 221)",
-      "rgb(192, 192, 192)", "rgb(136, 136, 136)", "rgb(0, 102, 204)",
-      "rgb(255, 255, 255)", "rgb(204, 204, 204)", "rgb(0, 0, 0)"};
+  std::vector<std::string> expected_colors;
+  if (base::win::GetVersion() <= base::win::Version::WIN8_1) {
+    expected_colors = {
+        "rgb(255, 255, 255)", "rgb(204, 204, 204)", "rgb(255, 255, 255)",
+        "rgb(99, 99, 206)",   "rgb(240, 240, 240)", "rgb(221, 221, 221)",
+        "rgb(136, 136, 136)", "rgb(0, 0, 0)",       "rgb(0, 0, 0)",
+        "rgb(109, 109, 109)", "rgb(51, 153, 255)",  "rgb(255, 255, 255)",
+        "rgb(255, 255, 255)", "rgb(255, 255, 255)", "rgb(127, 127, 127)",
+        "rgb(251, 252, 197)", "rgb(0, 0, 0)",       "rgb(0, 102, 204)",
+        "rgb(247, 247, 247)", "rgb(0, 0, 0)",       "rgb(255, 255, 255)",
+        "rgb(102, 102, 102)", "rgb(192, 192, 192)", "rgb(221, 221, 221)",
+        "rgb(192, 192, 192)", "rgb(136, 136, 136)", "rgb(0, 102, 204)",
+        "rgb(255, 255, 255)", "rgb(204, 204, 204)", "rgb(0, 0, 0)"};
+  } else {
+    expected_colors = {
+        "rgb(255, 255, 255)", "rgb(204, 204, 204)", "rgb(255, 255, 255)",
+        "rgb(99, 99, 206)",   "rgb(240, 240, 240)", "rgb(221, 221, 221)",
+        "rgb(136, 136, 136)", "rgb(0, 0, 0)",       "rgb(0, 0, 0)",
+        "rgb(109, 109, 109)", "rgb(0, 120, 215)",   "rgb(255, 255, 255)",
+        "rgb(255, 255, 255)", "rgb(255, 255, 255)", "rgb(127, 127, 127)",
+        "rgb(251, 252, 197)", "rgb(0, 0, 0)",       "rgb(0, 102, 204)",
+        "rgb(247, 247, 247)", "rgb(0, 0, 0)",       "rgb(255, 255, 255)",
+        "rgb(102, 102, 102)", "rgb(192, 192, 192)", "rgb(221, 221, 221)",
+        "rgb(192, 192, 192)", "rgb(136, 136, 136)", "rgb(0, 102, 204)",
+        "rgb(255, 255, 255)", "rgb(204, 204, 204)", "rgb(0, 0, 0)"};
+  }
 
   ASSERT_EQ(ids.size(), expected_colors.size());
 
diff --git a/content/public/common/content_features.cc b/content/public/common/content_features.cc
index 1efa61ee1..5ca2dba5 100644
--- a/content/public/common/content_features.cc
+++ b/content/public/common/content_features.cc
@@ -344,11 +344,6 @@
 const base::Feature kPassiveEventListenersDueToFling{
     "PassiveEventListenersDueToFling", base::FEATURE_ENABLED_BY_DEFAULT};
 
-// Whether ExecutionContext is paused (and workers) on background freeze.
-const base::Feature kPauseExecutionContextOnBackgroundFreeze = {
-    "PauseExecutionContextOnBackgroundFreeze",
-    base::FEATURE_ENABLED_BY_DEFAULT};
-
 // Whether web apps can run periodic tasks upon network connectivity.
 const base::Feature kPeriodicBackgroundSync{"PeriodicBackgroundSync",
                                             base::FEATURE_DISABLED_BY_DEFAULT};
@@ -711,6 +706,10 @@
 const base::Feature kWebXrPlaneDetection{"WebXRPlaneDetection",
                                          base::FEATURE_DISABLED_BY_DEFAULT};
 
+// Enables access to planes detected in the user's environment.
+const base::Feature kWebXrArDOMOverlay{"WebXRARDOMOverlay",
+                                       base::FEATURE_DISABLED_BY_DEFAULT};
+
 // Start streaming scripts on script preload.
 const base::Feature kScriptStreamingOnPreload{"ScriptStreamingOnPreload",
                                               base::FEATURE_ENABLED_BY_DEFAULT};
diff --git a/content/public/common/content_features.h b/content/public/common/content_features.h
index 5e321d5..8874f58 100644
--- a/content/public/common/content_features.h
+++ b/content/public/common/content_features.h
@@ -81,8 +81,6 @@
 CONTENT_EXPORT extern const base::Feature kPassiveDocumentEventListeners;
 CONTENT_EXPORT extern const base::Feature kPassiveDocumentWheelEventListeners;
 CONTENT_EXPORT extern const base::Feature kPassiveEventListenersDueToFling;
-CONTENT_EXPORT extern const base::Feature
-    kPauseExecutionContextOnBackgroundFreeze;
 CONTENT_EXPORT extern const base::Feature kPeriodicBackgroundSync;
 CONTENT_EXPORT extern const base::Feature kPerNavigationMojoInterface;
 CONTENT_EXPORT extern const base::Feature kPepper3DImageChromium;
@@ -149,6 +147,7 @@
 CONTENT_EXPORT extern const base::Feature kWebXr;
 CONTENT_EXPORT extern const base::Feature kWebXrArModule;
 CONTENT_EXPORT extern const base::Feature kWebXrAnchors;
+CONTENT_EXPORT extern const base::Feature kWebXrArDOMOverlay;
 CONTENT_EXPORT extern const base::Feature kWebXrHitTest;
 CONTENT_EXPORT extern const base::Feature kWebXrPlaneDetection;
 CONTENT_EXPORT extern const base::Feature kScriptStreamingOnPreload;
diff --git a/content/public/test/android/BUILD.gn b/content/public/test/android/BUILD.gn
index 4cd17c4..d2a6025e 100644
--- a/content/public/test/android/BUILD.gn
+++ b/content/public/test/android/BUILD.gn
@@ -2,6 +2,7 @@
 import("//build/config/android/rules.gni")
 
 generate_jni("test_support_content_jni_headers") {
+  testonly = true
   sources = [
     "javatests/src/org/chromium/content_public/browser/test/NestedSystemMessageHandler.java",
   ]
diff --git a/content/renderer/input/frame_input_handler_impl.cc b/content/renderer/input/frame_input_handler_impl.cc
index 7a9098c..2b3feaa 100644
--- a/content/renderer/input/frame_input_handler_impl.cc
+++ b/content/renderer/input/frame_input_handler_impl.cc
@@ -286,7 +286,7 @@
 
   if (!render_frame_)
     return;
-  RenderWidget* window_widget = render_frame_->render_view()->GetWidget();
+  RenderWidget* window_widget = render_frame_->GetLocalRootRenderWidget();
   HandlingState handling_state(render_frame_, UpdateState::kIsSelectingRange);
   render_frame_->GetWebFrame()->SelectRange(
       window_widget->ConvertWindowPointToViewport(base),
@@ -383,7 +383,7 @@
     return;
   HandlingState handling_state(render_frame_, UpdateState::kIsSelectingRange);
   render_frame_->GetWebFrame()->MoveRangeSelectionExtent(
-      render_frame_->render_view()->GetWidget()->ConvertWindowPointToViewport(
+      render_frame_->GetLocalRootRenderWidget()->ConvertWindowPointToViewport(
           extent));
 }
 
@@ -418,7 +418,7 @@
     return;
 
   render_frame_->GetWebFrame()->MoveCaretSelection(
-      render_frame_->render_view()->GetWidget()->ConvertWindowPointToViewport(
+      render_frame_->GetLocalRootRenderWidget()->ConvertWindowPointToViewport(
           point));
 }
 
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc
index f98f1689..63be2c1 100644
--- a/content/renderer/render_frame_impl.cc
+++ b/content/renderer/render_frame_impl.cc
@@ -2239,7 +2239,9 @@
 #endif
 
 bool RenderFrameImpl::OnMessageReceived(const IPC::Message& msg) {
-  // Forward Page IPCs to the RenderView.
+  // Page IPCs are routed via the main frame (both local and remote) and then
+  // forwarded to the RenderView. See comment in
+  // RenderFrameHostManager::SendPageMessage() for more information.
   if ((IPC_MESSAGE_CLASS(msg) == PageMsgStart)) {
     if (render_view())
       return render_view()->OnMessageReceived(msg);
@@ -4231,11 +4233,17 @@
   // popup. So from the user perspective, only the first one will show, and
   // will have to close the first one before another one can be shown.
   if (external_popup_menu_)
-    return NULL;
-  external_popup_menu_.reset(
-      new ExternalPopupMenu(this, popup_menu_info, popup_menu_client));
-  render_view_->GetWidget()->SetExternalPopupOriginAdjustmentsForEmulation(
-      external_popup_menu_.get());
+    return nullptr;
+  external_popup_menu_ = std::make_unique<ExternalPopupMenu>(
+      this, popup_menu_info, popup_menu_client);
+
+  // Emulation has never worked appropriately for subframes. Don't bother
+  // applying them if this is not a main frame.
+  if (IsMainFrame() &&
+      render_view_->page_properties()->ScreenMetricsEmulator()) {
+    external_popup_menu_->SetOriginScaleForEmulation(
+        render_view_->page_properties()->ScreenMetricsEmulator()->scale());
+  }
   return external_popup_menu_.get();
 #else
   return nullptr;
diff --git a/content/renderer/render_frame_proxy.cc b/content/renderer/render_frame_proxy.cc
index a4892fc..3368d7d 100644
--- a/content/renderer/render_frame_proxy.cc
+++ b/content/renderer/render_frame_proxy.cc
@@ -375,7 +375,9 @@
 }
 
 bool RenderFrameProxy::OnMessageReceived(const IPC::Message& msg) {
-  // Forward Page IPCs to the RenderView.
+  // Page IPCs are routed via the main frame (both local and remote) and then
+  // forwarded to the RenderView. See comment in
+  // RenderFrameHostManager::SendPageMessage() for more information.
   if ((IPC_MESSAGE_CLASS(msg) == PageMsgStart)) {
     if (render_view())
       return render_view()->OnMessageReceived(msg);
diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc
index e6d5b700d..c6ad6ff 100644
--- a/content/renderer/render_view_impl.cc
+++ b/content/renderer/render_view_impl.cc
@@ -1823,11 +1823,17 @@
 
 void RenderViewImpl::SetEditCommandForNextKeyEvent(const std::string& name,
                                                    const std::string& value) {
-  render_widget_->SetEditCommandForNextKeyEvent(name, value);
+  // This is test-only code. Only propagate the command if there is a main
+  // render frame.
+  if (main_render_frame_)
+    render_widget_->SetEditCommandForNextKeyEvent(name, value);
 }
 
 void RenderViewImpl::ClearEditCommands() {
-  render_widget_->ClearEditCommands();
+  // This is test-only code. Only propagate the command if there is a main
+  // render frame.
+  if (main_render_frame_)
+    render_widget_->ClearEditCommands();
 }
 
 const std::string& RenderViewImpl::GetAcceptLanguages() {
diff --git a/content/renderer/render_widget.cc b/content/renderer/render_widget.cc
index 669d6a0b..a61ad9e6b 100644
--- a/content/renderer/render_widget.cc
+++ b/content/renderer/render_widget.cc
@@ -590,15 +590,6 @@
   RenderThread::Get()->AddRoute(routing_id_, this);
 }
 
-#if BUILDFLAG(USE_EXTERNAL_POPUP_MENU)
-void RenderWidget::SetExternalPopupOriginAdjustmentsForEmulation(
-    ExternalPopupMenu* popup) {
-  if (page_properties_->ScreenMetricsEmulator())
-    popup->SetOriginScaleForEmulation(
-        page_properties_->ScreenMetricsEmulator()->scale());
-}
-#endif
-
 bool RenderWidget::OnMessageReceived(const IPC::Message& message) {
   // TODO(https://crbug.com/1000502): Don't process IPC messages on undead
   // RenderWidgets. We would like to eventually remove them altogether, so they
diff --git a/content/renderer/render_widget.h b/content/renderer/render_widget.h
index caa53d5..42c6dd9 100644
--- a/content/renderer/render_widget.h
+++ b/content/renderer/render_widget.h
@@ -112,7 +112,6 @@
 namespace content {
 class BrowserPlugin;
 class CompositorDependencies;
-class ExternalPopupMenu;
 class FrameSwapMessageQueue;
 class ImeEventGuard;
 class LayerTreeView;
@@ -739,10 +738,6 @@
   // is always in physical pixels.
   gfx::Rect CompositorViewportRect() const;
 
-#if BUILDFLAG(USE_EXTERNAL_POPUP_MENU)
-  void SetExternalPopupOriginAdjustmentsForEmulation(ExternalPopupMenu* popup);
-#endif
-
   // RenderWidget IPC message handlers.
   void OnHandleInputEvent(
       const blink::WebInputEvent* event,
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn
index c9e4a7c..fef7219 100644
--- a/content/test/BUILD.gn
+++ b/content/test/BUILD.gn
@@ -2449,6 +2449,7 @@
   ]
 
   generate_jni("content_unittests_jni_headers") {
+    testonly = true
     sources = content_java_sources_needing_jni
   }
 
diff --git a/content/test/web_test_support.cc b/content/test/web_test_support.cc
index 46891a4..2b6187c2 100644
--- a/content/test/web_test_support.cc
+++ b/content/test/web_test_support.cc
@@ -206,7 +206,9 @@
 }
 
 void ForceResizeRenderView(RenderView* render_view, const WebSize& new_size) {
-  auto* render_view_impl = static_cast<RenderViewImpl*>(render_view);
+  RenderViewImpl* render_view_impl = static_cast<RenderViewImpl*>(render_view);
+  if (!render_view_impl->GetMainRenderFrame())
+    return;
   RenderWidget* render_widget = render_view_impl->GetWidget();
   gfx::Rect window_rect(render_widget->WindowRect().x,
                         render_widget->WindowRect().y, new_size.width,
@@ -215,14 +217,17 @@
 }
 
 void SetDeviceScaleFactor(RenderView* render_view, float factor) {
-  RenderWidget* render_widget =
-      static_cast<RenderViewImpl*>(render_view)->GetWidget();
-  render_widget->SetDeviceScaleFactorForTesting(factor);
+  RenderViewImpl* render_view_impl = static_cast<RenderViewImpl*>(render_view);
+  if (!render_view_impl->GetMainRenderFrame())
+    return;
+  render_view_impl->GetWidget()->SetDeviceScaleFactorForTesting(factor);
 }
 
 float GetWindowToViewportScale(RenderView* render_view) {
-  return GetWindowToViewportScale(
-      static_cast<RenderViewImpl*>(render_view)->GetWidget());
+  RenderViewImpl* render_view_impl = static_cast<RenderViewImpl*>(render_view);
+  blink::WebFloatRect rect(0, 0, 1.0f, 0.0);
+  render_view_impl->page_properties()->ConvertWindowToViewport(&rect);
+  return rect.width;
 }
 
 std::unique_ptr<blink::WebInputEvent> TransformScreenToWidgetCoordinates(
@@ -256,9 +261,10 @@
 
 void SetDeviceColorSpace(RenderView* render_view,
                          const gfx::ColorSpace& color_space) {
-  RenderWidget* render_widget =
-      static_cast<RenderViewImpl*>(render_view)->GetWidget();
-  render_widget->SetDeviceColorSpaceForTesting(color_space);
+  RenderViewImpl* render_view_impl = static_cast<RenderViewImpl*>(render_view);
+  if (!render_view_impl->GetMainRenderFrame())
+    return;
+  render_view_impl->GetWidget()->SetDeviceColorSpaceForTesting(color_space);
 }
 
 void SetTestBluetoothScanDuration(BluetoothTestScanDurationSetting setting) {
@@ -277,23 +283,26 @@
 }
 
 void UseSynchronousResizeMode(RenderView* render_view, bool enable) {
-  RenderWidget* render_widget =
-      static_cast<RenderViewImpl*>(render_view)->GetWidget();
-  render_widget->UseSynchronousResizeModeForTesting(enable);
+  RenderViewImpl* render_view_impl = static_cast<RenderViewImpl*>(render_view);
+  if (!render_view_impl->GetMainRenderFrame())
+    return;
+  render_view_impl->GetWidget()->UseSynchronousResizeModeForTesting(enable);
 }
 
 void EnableAutoResizeMode(RenderView* render_view,
                           const WebSize& min_size,
                           const WebSize& max_size) {
-  RenderWidget* render_widget =
-      static_cast<RenderViewImpl*>(render_view)->GetWidget();
-  render_widget->EnableAutoResizeForTesting(min_size, max_size);
+  RenderViewImpl* render_view_impl = static_cast<RenderViewImpl*>(render_view);
+  if (!render_view_impl->GetMainRenderFrame())
+    return;
+  render_view_impl->GetWidget()->EnableAutoResizeForTesting(min_size, max_size);
 }
 
 void DisableAutoResizeMode(RenderView* render_view, const WebSize& new_size) {
-  RenderWidget* render_widget =
-      static_cast<RenderViewImpl*>(render_view)->GetWidget();
-  render_widget->DisableAutoResizeForTesting(new_size);
+  RenderViewImpl* render_view_impl = static_cast<RenderViewImpl*>(render_view);
+  if (!render_view_impl->GetMainRenderFrame())
+    return;
+  render_view_impl->GetWidget()->DisableAutoResizeForTesting(new_size);
 }
 
 void SchedulerRunIdleTasks(base::OnceClosure callback) {
diff --git a/device/BUILD.gn b/device/BUILD.gn
index ea1d749e5..3ddcd149 100644
--- a/device/BUILD.gn
+++ b/device/BUILD.gn
@@ -366,6 +366,7 @@
   ]
 
   generate_jni("bluetooth_test_jni_headers") {
+    testonly = true
     sources = bluetooth_java_sources_needing_jni
   }
 
diff --git a/device/vr/public/mojom/isolated_xr_service.mojom b/device/vr/public/mojom/isolated_xr_service.mojom
index 7754ce5..45cf27b 100644
--- a/device/vr/public/mojom/isolated_xr_service.mojom
+++ b/device/vr/public/mojom/isolated_xr_service.mojom
@@ -46,6 +46,10 @@
   bool immersive;
   bool environment_integration;
 
+  // The enabled features combine the active required and optional features as
+  // resolved by BrowserXRRuntime and VRServiceImpl.
+  array<XRSessionFeature> enabled_features;
+
   // The following options are used for permission requests and showing module
   // install UI.
   // TODO(crbug.com/854655): Remove these fields, and do permission checks, show
diff --git a/device/vr/public/mojom/vr_service.mojom b/device/vr/public/mojom/vr_service.mojom
index 63f3fdc..361143f 100644
--- a/device/vr/public/mojom/vr_service.mojom
+++ b/device/vr/public/mojom/vr_service.mojom
@@ -52,6 +52,9 @@
   REF_SPACE_LOCAL_FLOOR = 3,
   REF_SPACE_BOUNDED_FLOOR = 4,
   REF_SPACE_UNBOUNDED = 5,
+
+  // Experimental or not-yet-standardized feature names.
+  DOM_OVERLAY_FOR_HANDHELD_AR = 6,
 };
 
 struct XRSessionOptions {
diff --git a/extensions/common/api/automation.idl b/extensions/common/api/automation.idl
index 0099eff..4f07a25d 100644
--- a/extensions/common/api/automation.idl
+++ b/extensions/common/api/automation.idl
@@ -822,7 +822,7 @@
     long? tableCellColumnIndex;
 
     // The ARIA column index as specified by the page author.
-    long? ariaCellColumnIndex;
+    long? tableCellAriaColumnIndex;
 
     // The number of columns that this cell spans (default is 1).
     long? tableCellColumnSpan;
@@ -832,7 +832,7 @@
     long? tableCellRowIndex;
 
     // The ARIA row index as specified by the page author.
-    long? ariaCellRowIndex;
+    long? tableCellAriaRowIndex;
 
     // The number of rows that this cell spans (default is 1).
     long? tableCellRowSpan;
diff --git a/extensions/renderer/api/automation/automation_internal_custom_bindings.cc b/extensions/renderer/api/automation/automation_internal_custom_bindings.cc
index 90dc3ef3..ad6e32a 100644
--- a/extensions/renderer/api/automation/automation_internal_custom_bindings.cc
+++ b/extensions/renderer/api/automation/automation_internal_custom_bindings.cc
@@ -1394,6 +1394,20 @@
         if (node->GetTableCellRowIndex())
           result.Set(*node->GetTableCellRowIndex());
       });
+  RouteNodeIDFunction(
+      "GetTableCellAriaColumnIndex",
+      [](v8::Isolate* isolate, v8::ReturnValue<v8::Value> result,
+         AutomationAXTreeWrapper* tree_wrapper, ui::AXNode* node) {
+        if (node->GetTableCellAriaColIndex())
+          result.Set(*node->GetTableCellAriaColIndex());
+      });
+  RouteNodeIDFunction(
+      "GetTableCellAriaRowIndex",
+      [](v8::Isolate* isolate, v8::ReturnValue<v8::Value> result,
+         AutomationAXTreeWrapper* tree_wrapper, ui::AXNode* node) {
+        if (node->GetTableCellAriaRowIndex())
+          result.Set(*node->GetTableCellAriaRowIndex());
+      });
 }
 
 void AutomationInternalCustomBindings::Invalidate() {
diff --git a/extensions/renderer/resources/automation/automation_node.js b/extensions/renderer/resources/automation/automation_node.js
index 61c4551..a2310bd7 100644
--- a/extensions/renderer/resources/automation/automation_node.js
+++ b/extensions/renderer/resources/automation/automation_node.js
@@ -450,6 +450,20 @@
 var GetTableCellRowIndex = natives.GetTableCellRowIndex;
 
 /**
+ * @param {string} axTreeID The id of the accessibility tree.
+ * @param {number} nodeID The id of a node.
+ * @return {number} Column index for this cell.
+ */
+var GetTableCellAriaColumnIndex = natives.GetTableCellAriaColumnIndex;
+
+/**
+ * @param {string} axTreeID The id of the accessibility tree.
+ * @param {number} nodeID The id of a node.
+ * @return {number} Row index for this cell.
+ */
+var GetTableCellAriaRowIndex = natives.GetTableCellAriaRowIndex;
+
+/**
  * @param {string} axTreeId The id of the accessibility tree.
  * @param {number} nodeID The id of a node.
  * @return {string} Detected language for this node.
@@ -721,6 +735,15 @@
     return GetTableCellRowIndex(this.treeID, this.id);
   },
 
+
+  get tableCellAriaColumnIndex() {
+    return GetTableCellAriaColumnIndex(this.treeID, this.id);
+  },
+
+  get tableCellAriaRowIndex() {
+    return GetTableCellAriaRowIndex(this.treeID, this.id);
+  },
+
   get nonInlineTextWordStarts() {
     return GetWordStartOffsets(this.treeID, this.id);
   },
@@ -1162,9 +1185,7 @@
     'scrollYMax',
     'scrollYMin',
     'setSize',
-    'ariaCellColumnIndex',
     'tableCellColumnSpan',
-    'ariaCellRowIndex',
     'tableCellRowSpan',
     'tableColumnCount',
     'ariaColumnCount',
@@ -1739,6 +1760,8 @@
         'tableCellRowHeaders',
         'tableCellColumnIndex',
         'tableCellRowIndex',
+        'tableCellAriaRowIndex',
+        'tableCellAriaColumnIndex',
         'nonInlineTextWordStarts',
         'nonInlineTextWordEnds',
       ]),
diff --git a/fuchsia/base/BUILD.gn b/fuchsia/base/BUILD.gn
index ccb22a144..686741d 100644
--- a/fuchsia/base/BUILD.gn
+++ b/fuchsia/base/BUILD.gn
@@ -5,7 +5,7 @@
 assert(is_fuchsia)
 
 import("//build/config/fuchsia/fidl_library.gni")
-import("//build/config/fuchsia/rules.gni")
+import("//build/config/fuchsia/generate_runner_scripts.gni")
 import("//testing/test.gni")
 
 # Integration helpers for commonly used fuchsia.* APIs.
diff --git a/fuchsia/engine/BUILD.gn b/fuchsia/engine/BUILD.gn
index 5edf7431..e2f1395 100644
--- a/fuchsia/engine/BUILD.gn
+++ b/fuchsia/engine/BUILD.gn
@@ -4,7 +4,7 @@
 
 assert(is_fuchsia)
 
-import("//build/config/fuchsia/rules.gni")
+import("//build/config/fuchsia/generate_runner_scripts.gni")
 import("//build/config/fuchsia/symbol_archive.gni")
 import("//mojo/public/tools/bindings/mojom.gni")
 import("//testing/test.gni")
diff --git a/fuchsia/engine/renderer/web_engine_content_renderer_client.cc b/fuchsia/engine/renderer/web_engine_content_renderer_client.cc
index 17c53ae9..141f41b 100644
--- a/fuchsia/engine/renderer/web_engine_content_renderer_client.cc
+++ b/fuchsia/engine/renderer/web_engine_content_renderer_client.cc
@@ -104,6 +104,11 @@
       supported_video_codecs |= media::EME_CODEC_AVC1;
     }
 
+    media::SupportedCodecs supported_audio_codecs = media::EME_CODEC_AUDIO_ALL;
+
+    media::SupportedCodecs supported_codecs =
+        supported_video_codecs | supported_audio_codecs;
+
     base::flat_set<media::EncryptionMode> encryption_schemes{
         media::EncryptionMode::kCenc, media::EncryptionMode::kCbcs};
 
@@ -111,10 +116,10 @@
     // Chromium. Hardware secured decoders are only available for supported
     // video codecs.
     key_systems->emplace_back(new cdm::WidevineKeySystemProperties(
-        media::EME_CODEC_AUDIO_ALL | supported_video_codecs,  // codecs
-        encryption_schemes,      // encryption schemes
-        supported_video_codecs,  // hw secure codecs
-        encryption_schemes,      // hw secure encryption schemes
+        supported_codecs,    // codecs
+        encryption_schemes,  // encryption schemes
+        supported_codecs,    // hw secure codecs
+        encryption_schemes,  // hw secure encryption schemes
         cdm::WidevineKeySystemProperties::Robustness::
             HW_SECURE_CRYPTO,  // max audio robustness
         cdm::WidevineKeySystemProperties::Robustness::
diff --git a/fuchsia/http/BUILD.gn b/fuchsia/http/BUILD.gn
index 27ec910..60087cc 100644
--- a/fuchsia/http/BUILD.gn
+++ b/fuchsia/http/BUILD.gn
@@ -5,7 +5,7 @@
 assert(is_fuchsia)
 
 import("//build/config/fuchsia/fidl_library.gni")
-import("//build/config/fuchsia/rules.gni")
+import("//build/config/fuchsia/generate_runner_scripts.gni")
 import("//build/config/fuchsia/symbol_archive.gni")
 import("//build/util/process_version.gni")
 import("//testing/test.gni")
diff --git a/fuchsia/runners/BUILD.gn b/fuchsia/runners/BUILD.gn
index 32a63fa..38c4cc9 100644
--- a/fuchsia/runners/BUILD.gn
+++ b/fuchsia/runners/BUILD.gn
@@ -5,7 +5,7 @@
 assert(is_fuchsia)
 
 import("//build/buildflag_header.gni")
-import("//build/config/fuchsia/rules.gni")
+import("//build/config/fuchsia/generate_runner_scripts.gni")
 import("//build/config/fuchsia/symbol_archive.gni")
 import("//testing/test.gni")
 
diff --git a/gpu/command_buffer/service/external_vk_image_backing.cc b/gpu/command_buffer/service/external_vk_image_backing.cc
index 054b174..cc0af9d 100644
--- a/gpu/command_buffer/service/external_vk_image_backing.cc
+++ b/gpu/command_buffer/service/external_vk_image_backing.cc
@@ -9,6 +9,7 @@
 
 #include "base/memory/unsafe_shared_memory_region.h"
 #include "base/posix/eintr_wrapper.h"
+#include "base/stl_util.h"
 #include "base/system/sys_info.h"
 #include "build/build_config.h"
 #include "components/viz/common/resources/resource_sizes.h"
@@ -41,6 +42,35 @@
 
 namespace {
 
+static const struct {
+  GLenum gl_format;
+  GLenum gl_type;
+  GLuint bytes_per_pixel;
+} kFormatTable[] = {
+    {GL_RGBA, GL_UNSIGNED_BYTE, 4},                // RGBA_8888
+    {GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, 2},       // RGBA_4444
+    {GL_BGRA, GL_UNSIGNED_BYTE, 4},                // BGRA_8888
+    {GL_RED, GL_UNSIGNED_BYTE, 1},                 // ALPHA_8
+    {GL_RED, GL_UNSIGNED_BYTE, 1},                 // LUMINANCE_8
+    {GL_RGB, GL_UNSIGNED_SHORT_5_6_5, 2},          // RGB_565
+    {GL_BGR, GL_UNSIGNED_SHORT_5_6_5, 2},          // BGR_565
+    {GL_ZERO, GL_ZERO, 0},                         // ETC1
+    {GL_RED, GL_UNSIGNED_BYTE, 1},                 // RED_8
+    {GL_RG, GL_UNSIGNED_BYTE, 2},                  // RG_88
+    {GL_RED, GL_HALF_FLOAT_OES, 2},                // LUMINANCE_F16
+    {GL_RGBA, GL_HALF_FLOAT_OES, 8},               // RGBA_F16
+    {GL_RED, GL_UNSIGNED_SHORT, 2},                // R16_EXT
+    {GL_RGBA, GL_UNSIGNED_BYTE, 4},                // RGBX_8888
+    {GL_BGRA, GL_UNSIGNED_BYTE, 4},                // BGRX_8888
+    {GL_RGBA, GL_UNSIGNED_INT_2_10_10_10_REV, 4},  // RGBX_1010102
+    {GL_BGRA, GL_UNSIGNED_INT_2_10_10_10_REV, 4},  // BGRX_1010102
+    {GL_ZERO, GL_ZERO, 0},                         // YVU_420
+    {GL_ZERO, GL_ZERO, 0},                         // YUV_420_BIPLANAR
+    {GL_ZERO, GL_ZERO, 0},                         // P010
+};
+static_assert(base::size(kFormatTable) == (viz::RESOURCE_FORMAT_MAX + 1),
+              "kFormatTable does not handle all cases.");
+
 GrVkImageInfo CreateGrVkImageInfo(
     VkImage image,
     VkFormat vk_format,
@@ -690,13 +720,17 @@
       return;
     }
     if ((latest_content_ & kInGLTexture) && use_separate_gl_texture()) {
-      CopyPixelsFromGLTexture();
+      CopyPixelsFromGLTextureToVkImage();
       latest_content_ |= kInVkImage;
       return;
     }
   } else if (content_flags == kInGLTexture) {
-    // TODO(penghuang): support updating content in gl texture.
-    NOTIMPLEMENTED_LOG_ONCE();
+    DCHECK(use_separate_gl_texture());
+    if (latest_content_ & kInSharedMemory) {
+      CopyPixelsFromShmToGLTexture();
+    } else if (latest_content_ & kInVkImage) {
+      NOTIMPLEMENTED_LOG_ONCE();
+    }
   } else if (content_flags == kInSharedMemory) {
     // TODO(penghuang): read pixels back from VkImage to shared memory GMB, if
     // this feature is needed.
@@ -843,57 +877,19 @@
   return true;
 }
 
-void ExternalVkImageBacking::CopyPixelsFromGLTexture() {
+void ExternalVkImageBacking::CopyPixelsFromGLTextureToVkImage() {
   DCHECK(use_separate_gl_texture());
   DCHECK(texture_);
 
-  GLenum gl_format = GL_NONE;
-  GLenum gl_type = GL_NONE;
-  size_t bytes_per_pixel = 0;
-  switch (ToVkFormat(format())) {
-    case VK_FORMAT_R8G8B8A8_UNORM:
-      gl_format = GL_RGBA;
-      gl_type = GL_UNSIGNED_BYTE;
-      bytes_per_pixel = 4;
-      break;
-    case VK_FORMAT_B8G8R8A8_UNORM:
-      gl_format = GL_BGRA;
-      gl_type = GL_UNSIGNED_BYTE;
-      bytes_per_pixel = 4;
-      break;
-    case VK_FORMAT_R8_UNORM:
-      gl_format = GL_RED;
-      gl_type = GL_UNSIGNED_BYTE;
-      bytes_per_pixel = 1;
-      break;
-    case VK_FORMAT_R4G4B4A4_UNORM_PACK16:
-      gl_format = GL_RGBA;
-      gl_type = GL_UNSIGNED_SHORT_4_4_4_4;
-      bytes_per_pixel = 2;
-      break;
-    case VK_FORMAT_R5G6B5_UNORM_PACK16:
-      gl_format = GL_RGB;
-      gl_type = GL_UNSIGNED_SHORT_5_6_5;
-      bytes_per_pixel = 2;
-      break;
-    case VK_FORMAT_R16_UNORM:
-      gl_format = GL_RED;
-      gl_type = GL_UNSIGNED_SHORT;
-      bytes_per_pixel = 2;
-      break;
-    case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
-      gl_format = GL_RGBA;
-      gl_type = GL_UNSIGNED_INT_2_10_10_10_REV;
-      bytes_per_pixel = 4;
-      break;
-    case VK_FORMAT_R16G16B16A16_SFLOAT:
-      gl_format = GL_RGBA;
-      gl_type = GL_HALF_FLOAT;
-      bytes_per_pixel = 8;
-      break;
-    default:
-      NOTREACHED() << "Not supported resource format=" << format();
-      return;
+  DCHECK_GE(format(), 0);
+  DCHECK_LE(format(), viz::RESOURCE_FORMAT_MAX);
+  auto gl_format = kFormatTable[format()].gl_format;
+  auto gl_type = kFormatTable[format()].gl_type;
+  auto bytes_per_pixel = kFormatTable[format()].bytes_per_pixel;
+
+  if (gl_format == GL_ZERO) {
+    NOTREACHED() << "Not supported resource format=" << format();
+    return;
   }
 
   // Make sure GrContext is not using GL. So we don't need reset GrContext
@@ -941,6 +937,50 @@
   api->glDeleteFramebuffersEXTFn(1, &framebuffer);
 }
 
+void ExternalVkImageBacking::CopyPixelsFromShmToGLTexture() {
+  DCHECK(use_separate_gl_texture());
+  DCHECK(texture_);
+
+  DCHECK_GE(format(), 0);
+  DCHECK_LE(format(), viz::RESOURCE_FORMAT_MAX);
+  auto gl_format = kFormatTable[format()].gl_format;
+  auto gl_type = kFormatTable[format()].gl_type;
+  auto bytes_per_pixel = kFormatTable[format()].bytes_per_pixel;
+
+  if (gl_format == GL_ZERO) {
+    NOTREACHED() << "Not supported resource format=" << format();
+    return;
+  }
+
+  // Make sure GrContext is not using GL. So we don't need reset GrContext
+  DCHECK(!context_state_->GrContextIsGL());
+
+  // Make sure a gl context is current, since textures are shared between all gl
+  // contexts, we don't care which gl context is current.
+  if (!gl::GLContext::GetCurrent() &&
+      !context_state_->MakeCurrent(nullptr, true /* needs_gl */))
+    return;
+
+  gl::GLApi* api = gl::g_current_gl_context;
+  GLint old_texture;
+  api->glGetIntegervFn(GL_TEXTURE_BINDING_2D, &old_texture);
+  api->glBindTextureFn(GL_TEXTURE_2D, texture_->service_id());
+
+  base::CheckedNumeric<size_t> checked_size = bytes_per_pixel;
+  checked_size *= size().width();
+  checked_size *= size().height();
+  DCHECK(checked_size.IsValid());
+
+  auto pixel_data =
+      shared_memory_mapping_.GetMemoryAsSpan<const uint8_t>().subspan(
+          memory_offset_);
+  api->glTexSubImage2DFn(GL_TEXTURE_2D, 0, 0, 0, size().width(),
+                         size().height(), gl_format, gl_type,
+                         pixel_data.data());
+  DCHECK_EQ(api->glGetErrorFn(), static_cast<GLenum>(GL_NO_ERROR));
+  api->glBindTextureFn(GL_TEXTURE_2D, old_texture);
+}
+
 bool ExternalVkImageBacking::BeginAccessInternal(
     bool readonly,
     std::vector<SemaphoreHandle>* semaphore_handles) {
diff --git a/gpu/command_buffer/service/external_vk_image_backing.h b/gpu/command_buffer/service/external_vk_image_backing.h
index 7e89c89..fb5d8590 100644
--- a/gpu/command_buffer/service/external_vk_image_backing.h
+++ b/gpu/command_buffer/service/external_vk_image_backing.h
@@ -146,7 +146,8 @@
   bool WritePixels(size_t data_size,
                    size_t stride,
                    FillBufferCallback callback);
-  void CopyPixelsFromGLTexture();
+  void CopyPixelsFromGLTextureToVkImage();
+  void CopyPixelsFromShmToGLTexture();
 
   SharedContextState* const context_state_;
   GrBackendTexture backend_texture_;
diff --git a/gpu/command_buffer/service/shared_image_factory.cc b/gpu/command_buffer/service/shared_image_factory.cc
index 3a29bec2..4e5ec471 100644
--- a/gpu/command_buffer/service/shared_image_factory.cc
+++ b/gpu/command_buffer/service/shared_image_factory.cc
@@ -105,7 +105,10 @@
           workarounds, gpu_feature_info, use_gl);
 #else
   // Others
-  DCHECK(!using_vulkan_);
+  if (using_vulkan_)
+    LOG(ERROR) << "ERROR: using_vulkan_ = true and interop_backing_factory_ is "
+                  "not set";
+
 #endif
   if (enable_wrapped_sk_image && context_state) {
     wrapped_sk_image_factory_ =
diff --git a/ios/build/bots/chromium.clang/ToTiOS.json b/ios/build/bots/chromium.clang/ToTiOS.json
index c26b2f37..d18da56 100644
--- a/ios/build/bots/chromium.clang/ToTiOS.json
+++ b/ios/build/bots/chromium.clang/ToTiOS.json
@@ -22,119 +22,119 @@
     {
       "app": "base_unittests",
       "device type": "iPhone 6s",
-      "host os": "Mac-10.14.4",
+      "host os": "Mac-10.14.6",
       "pool": "Chrome",
       "os": "12.2"
     },
     {
       "app": "boringssl_crypto_tests",
       "device type": "iPhone 6s",
-      "host os": "Mac-10.14.4",
+      "host os": "Mac-10.14.6",
       "pool": "Chrome",
       "os": "12.2"
     },
     {
       "app": "boringssl_ssl_tests",
       "device type": "iPhone 6s",
-      "host os": "Mac-10.14.4",
+      "host os": "Mac-10.14.6",
       "pool": "Chrome",
       "os": "12.2"
     },
     {
       "app": "components_unittests",
       "device type": "iPhone 6s",
-      "host os": "Mac-10.14.4",
+      "host os": "Mac-10.14.6",
       "pool": "Chrome",
       "os": "12.2"
     },
     {
       "app": "crypto_unittests",
       "device type": "iPhone 6s",
-      "host os": "Mac-10.14.4",
+      "host os": "Mac-10.14.6",
       "pool": "Chrome",
       "os": "12.2"
     },
     {
       "app": "gfx_unittests",
       "device type": "iPhone 6s",
-      "host os": "Mac-10.14.4",
+      "host os": "Mac-10.14.6",
       "pool": "Chrome",
       "os": "12.2"
     },
     {
       "app": "google_apis_unittests",
       "device type": "iPhone 6s",
-      "host os": "Mac-10.14.4",
+      "host os": "Mac-10.14.6",
       "pool": "Chrome",
       "os": "12.2"
     },
     {
       "app": "ios_chrome_unittests",
       "device type": "iPhone 6s",
-      "host os": "Mac-10.14.4",
+      "host os": "Mac-10.14.6",
       "pool": "Chrome",
       "os": "12.2"
     },
     {
       "app": "ios_net_unittests",
       "device type": "iPhone 6s",
-      "host os": "Mac-10.14.4",
+      "host os": "Mac-10.14.6",
       "pool": "Chrome",
       "os": "12.2"
     },
     {
       "app": "ios_web_inttests",
       "device type": "iPhone 6s",
-      "host os": "Mac-10.14.4",
+      "host os": "Mac-10.14.6",
       "pool": "Chrome",
       "os": "12.2"
     },
     {
       "app": "ios_web_unittests",
       "device type": "iPhone 6s",
-      "host os": "Mac-10.14.4",
+      "host os": "Mac-10.14.6",
       "pool": "Chrome",
       "os": "12.2"
     },
     {
       "app": "ios_web_view_inttests",
       "device type": "iPhone 6s",
-      "host os": "Mac-10.14.4",
+      "host os": "Mac-10.14.6",
       "pool": "Chrome",
       "os": "12.2"
     },
     {
       "app": "net_unittests",
       "device type": "iPhone 6s",
-      "host os": "Mac-10.14.4",
+      "host os": "Mac-10.14.6",
       "pool": "Chrome",
       "os": "12.2"
     },
     {
       "app": "skia_unittests",
       "device type": "iPhone 6s",
-      "host os": "Mac-10.14.4",
+      "host os": "Mac-10.14.6",
       "pool": "Chrome",
       "os": "12.2"
     },
     {
       "app": "sql_unittests",
       "device type": "iPhone 6s",
-      "host os": "Mac-10.14.4",
+      "host os": "Mac-10.14.6",
       "pool": "Chrome",
       "os": "12.2"
     },
     {
       "app": "ui_base_unittests",
       "device type": "iPhone 6s",
-      "host os": "Mac-10.14.4",
+      "host os": "Mac-10.14.6",
       "pool": "Chrome",
       "os": "12.2"
     },
     {
       "app": "url_unittests",
       "device type": "iPhone 6s",
-      "host os": "Mac-10.14.4",
+      "host os": "Mac-10.14.6",
       "pool": "Chrome",
       "os": "12.2"
     }
diff --git a/ios/build/bots/chromium.fyi/ios-simulator-cronet.json b/ios/build/bots/chromium.fyi/ios-simulator-cronet.json
index cdca8e66..ecb0680 100644
--- a/ios/build/bots/chromium.fyi/ios-simulator-cronet.json
+++ b/ios/build/bots/chromium.fyi/ios-simulator-cronet.json
@@ -27,14 +27,14 @@
       "app": "cronet_test",
       "device type": "iPhone X",
       "os": "12.2",
-      "host os": "Mac-10.14.4",
+      "host os": "Mac-10.14.6",
       "pool":"Chrome"
     },
     {
       "app": "cronet_test",
       "device type": "iPhone X",
       "os": "13.0",
-      "host os": "Mac-10.14.4",
+      "host os": "Mac-10.14.6",
       "pool":"Chrome"
     }
   ]
diff --git a/ios/build/bots/chromium.fyi/ios-simulator.json b/ios/build/bots/chromium.fyi/ios-simulator.json
index 21be940f..7e80ce6 100644
--- a/ios/build/bots/chromium.fyi/ios-simulator.json
+++ b/ios/build/bots/chromium.fyi/ios-simulator.json
@@ -21,7 +21,7 @@
       ],
       "device type": "iPhone 6s",
       "os": "12.2",
-      "host os": "Mac-10.14.4",
+      "host os": "Mac-10.14.6",
       "pool":"Chrome"
     },
     {
@@ -32,7 +32,7 @@
       "device type": "iPhone 6s",
       "os": "12.2",
       "xctest": true,
-      "host os": "Mac-10.14.4",
+      "host os": "Mac-10.14.6",
       "pool":"Chrome"
     },
     {
@@ -43,7 +43,7 @@
       "device type": "iPad Air 2",
       "os": "12.2",
       "xctest": true,
-      "host os": "Mac-10.14.4",
+      "host os": "Mac-10.14.6",
       "pool":"Chrome"
     },
     {
@@ -54,7 +54,7 @@
       "device type": "iPhone 6s",
       "os": "12.2",
       "xctest": true,
-      "host os": "Mac-10.14.4",
+      "host os": "Mac-10.14.6",
       "pool":"Chrome"
     },
     {
@@ -65,7 +65,7 @@
       "device type": "iPhone 6s",
       "os": "12.2",
       "xctest": true,
-      "host os": "Mac-10.14.4",
+      "host os": "Mac-10.14.6",
       "pool":"Chrome"
     },
     {
@@ -76,7 +76,7 @@
       "device type": "iPhone 6s",
       "os": "12.2",
       "xctest": true,
-      "host os": "Mac-10.14.4",
+      "host os": "Mac-10.14.6",
       "pool":"Chrome"
     },
     {
@@ -87,7 +87,7 @@
       "device type": "iPhone 6s",
       "os": "12.2",
       "xctest": true,
-      "host os": "Mac-10.14.4",
+      "host os": "Mac-10.14.6",
       "pool":"Chrome"
     },
     {
@@ -98,7 +98,7 @@
       "device type": "iPhone 6s",
       "os": "12.2",
       "xctest": true,
-      "host os": "Mac-10.14.4",
+      "host os": "Mac-10.14.6",
       "pool":"Chrome"
     }
   ]
diff --git a/ios/build/bots/chromium.fyi/ios13-beta-simulator.json b/ios/build/bots/chromium.fyi/ios13-beta-simulator.json
index a1a73c9..44acd764 100644
--- a/ios/build/bots/chromium.fyi/ios13-beta-simulator.json
+++ b/ios/build/bots/chromium.fyi/ios13-beta-simulator.json
@@ -24,12 +24,7 @@
       "os": "13.0",
       "xcode build version": "11a420a",
       "pool":"Chrome",
-      "host os": "Mac-10.14.4",
-      "optional_dimensions": {
-          "60": [{
-            "host os": "Mac-10.14.5"
-          }]
-      }
+      "host os": "Mac-10.14.6"
     },
     {
       "xcode parallelization": true,
@@ -38,12 +33,7 @@
       "os": "13.0",
       "xcode build version": "11a420a",
       "pool":"Chrome",
-      "host os": "Mac-10.14.4",
-      "optional_dimensions": {
-          "60": [{
-            "host os": "Mac-10.14.5"
-          }]
-      }
+      "host os": "Mac-10.14.6"
     },
     {
       "xcode parallelization": true,
@@ -52,12 +42,7 @@
       "os": "12.2",
       "xcode build version": "11a420a",
       "pool":"Chrome",
-      "host os": "Mac-10.14.4",
-      "optional_dimensions": {
-          "60": [{
-            "host os": "Mac-10.14.5"
-          }]
-      }
+      "host os": "Mac-10.14.6"
     },
     {
       "xcode parallelization": true,
@@ -66,116 +51,71 @@
       "os": "12.2",
       "xcode build version": "11a420a",
       "pool":"Chrome",
-      "host os": "Mac-10.14.4",
-      "optional_dimensions": {
-          "60": [{
-            "host os": "Mac-10.14.5"
-          }]
-      }
+      "host os": "Mac-10.14.6"
     },
     {
       "include": "common_tests.json",
       "device type": "iPhone X",
       "os": "13.0",
       "xcode build version": "11a420a",
-      "host os": "Mac-10.14.4",
-      "pool":"Chrome",
-      "optional_dimensions": {
-          "60": [{
-            "host os": "Mac-10.14.5"
-          }]
-      }
+      "host os": "Mac-10.14.6",
+      "pool":"Chrome"
     },
     {
       "include": "eg_cq_tests.json",
       "device type": "iPhone X",
       "os": "13.0",
       "xcode build version": "11a420a",
-      "host os": "Mac-10.14.4",
-      "pool":"Chrome",
-      "optional_dimensions": {
-          "60": [{
-            "host os": "Mac-10.14.5"
-          }]
-      }
+      "host os": "Mac-10.14.6",
+      "pool":"Chrome"
     },
     {
       "include": "eg_cq_tests.json",
       "device type": "iPad Pro (12.9-inch)",
       "os": "13.0",
       "xcode build version": "11a420a",
-      "host os": "Mac-10.14.4",
-      "pool":"Chrome",
-      "optional_dimensions": {
-          "60": [{
-            "host os": "Mac-10.14.5"
-          }]
-      }
+      "host os": "Mac-10.14.6",
+      "pool":"Chrome"
     },
     {
       "include": "eg_tests.json",
       "device type": "iPhone X",
       "os": "13.0",
       "xcode build version": "11a420a",
-      "host os": "Mac-10.14.4",
-      "pool":"Chrome",
-      "optional_dimensions": {
-          "60": [{
-            "host os": "Mac-10.14.5"
-          }]
-      }
+      "host os": "Mac-10.14.6",
+      "pool":"Chrome"
     },
     {
       "include": "eg_tests.json",
       "device type": "iPad Air (3rd generation)",
       "os": "13.0",
       "xcode build version": "11a420a",
-      "host os": "Mac-10.14.4",
-      "pool":"Chrome",
-      "optional_dimensions": {
-          "60": [{
-            "host os": "Mac-10.14.5"
-          }]
-      }
+      "host os": "Mac-10.14.6",
+      "pool":"Chrome"
     },
     {
       "include": "screen_size_dependent_tests.json",
       "device type": "iPhone 6s Plus",
       "os": "13.0",
       "xcode build version": "11a420a",
-      "host os": "Mac-10.14.4",
-      "pool":"Chrome",
-      "optional_dimensions": {
-          "60": [{
-            "host os": "Mac-10.14.5"
-          }]
-      }
+      "host os": "Mac-10.14.6",
+      "pool":"Chrome"
     },
     {
       "include": "screen_size_dependent_tests.json",
       "device type": "iPhone X",
       "os": "13.0",
       "xcode build version": "11a420a",
-      "host os": "Mac-10.14.4",
-      "pool":"Chrome",
-      "optional_dimensions": {
-          "60": [{
-            "host os": "Mac-10.14.5"
-          }]
-      }
+      "host os": "Mac-10.14.6",
+      "pool":"Chrome"
     },
     {
       "include": "screen_size_dependent_tests.json",
       "device type": "iPad Air 2",
       "os": "13.0",
       "xcode build version": "11a420a",
-      "host os": "Mac-10.14.4",
-      "pool":"Chrome",
-      "optional_dimensions": {
-          "60": [{
-            "host os": "Mac-10.14.5"
-          }]
-      }
+      "host os": "Mac-10.14.6",
+      "pool":"Chrome"
     }
   ]
 }
diff --git a/ios/build/bots/chromium.fyi/ios13-sdk-simulator.json b/ios/build/bots/chromium.fyi/ios13-sdk-simulator.json
index 69bdf19e..5bdafed9 100644
--- a/ios/build/bots/chromium.fyi/ios13-sdk-simulator.json
+++ b/ios/build/bots/chromium.fyi/ios13-sdk-simulator.json
@@ -23,12 +23,7 @@
       "device type": "iPhone 6s Plus",
       "os": "13.0",
       "pool":"Chrome",
-      "host os": "Mac-10.14.4",
-      "optional_dimensions": {
-          "60": [{
-            "host os": "Mac-10.14.5"
-          }]
-      },
+      "host os": "Mac-10.14.6",
       "priority": 30
     },
     {
@@ -36,12 +31,7 @@
       "device type": "iPhone 6s",
       "os": "13.0",
       "pool":"Chrome",
-      "host os": "Mac-10.14.4",
-      "optional_dimensions": {
-          "60": [{
-            "host os": "Mac-10.14.5"
-          }]
-      },
+      "host os": "Mac-10.14.6",
       "priority": 30
     },
     {
@@ -49,12 +39,7 @@
       "device type": "iPhone 6s",
       "os": "13.0",
       "pool":"Chrome",
-      "host os": "Mac-10.14.4",
-      "optional_dimensions": {
-          "60": [{
-            "host os": "Mac-10.14.5"
-          }]
-      },
+      "host os": "Mac-10.14.6",
       "priority": 30
     },
     {
@@ -62,12 +47,7 @@
       "device type": "iPhone 7",
       "os": "13.0",
       "pool":"Chrome",
-      "host os": "Mac-10.14.4",
-      "optional_dimensions": {
-          "60": [{
-            "host os": "Mac-10.14.5"
-          }]
-      },
+      "host os": "Mac-10.14.6",
       "priority": 30
     },
     {
@@ -75,12 +55,7 @@
       "device type": "iPad Air 2",
       "os": "13.0",
       "pool":"Chrome",
-      "host os": "Mac-10.14.4",
-      "optional_dimensions": {
-          "60": [{
-            "host os": "Mac-10.14.5"
-          }]
-      },
+      "host os": "Mac-10.14.6",
       "priority": 30
     },
     {
@@ -88,12 +63,7 @@
       "device type": "iPhone X",
       "os": "13.0",
       "pool":"Chrome",
-      "host os": "Mac-10.14.4",
-      "optional_dimensions": {
-          "60": [{
-            "host os": "Mac-10.14.5"
-          }]
-      },
+      "host os": "Mac-10.14.6",
       "priority": 30
     },
     {
@@ -101,12 +71,7 @@
       "device type": "iPhone X",
       "os": "13.0",
       "pool":"Chrome",
-      "host os": "Mac-10.14.4",
-      "optional_dimensions": {
-          "60": [{
-            "host os": "Mac-10.14.5"
-          }]
-      },
+      "host os": "Mac-10.14.6",
       "priority": 30
     },
     {
@@ -114,12 +79,7 @@
       "device type": "iPad Air 2",
       "os": "13.0",
       "pool":"Chrome",
-      "host os": "Mac-10.14.4",
-      "optional_dimensions": {
-          "60": [{
-            "host os": "Mac-10.14.5"
-          }]
-      },
+      "host os": "Mac-10.14.6",
       "priority": 30
     }
   ]
diff --git a/ios/build/bots/chromium.mac/ios-simulator-cronet.json b/ios/build/bots/chromium.mac/ios-simulator-cronet.json
index a5938f92d..348a2fa 100644
--- a/ios/build/bots/chromium.mac/ios-simulator-cronet.json
+++ b/ios/build/bots/chromium.mac/ios-simulator-cronet.json
@@ -25,7 +25,7 @@
       "app": "cronet_unittests_ios",
       "device type": "iPhone 6s",
       "os": "12.2",
-      "host os": "Mac-10.14.4",
+      "host os": "Mac-10.14.6",
       "pool": "Chrome",
       "priority": 30
     },
@@ -33,7 +33,7 @@
       "app": "cronet_unittests_ios",
       "device type": "iPhone 6s",
       "os": "13.0",
-      "host os": "Mac-10.14.4",
+      "host os": "Mac-10.14.6",
       "pool": "Chrome",
       "priority": 30
     },
@@ -41,7 +41,7 @@
       "app": "cronet_test",
       "device type": "iPad Air 2",
       "os": "12.2",
-      "host os": "Mac-10.14.4",
+      "host os": "Mac-10.14.6",
       "pool": "Chrome",
       "priority": 30
     },
@@ -49,7 +49,7 @@
       "app": "cronet_test",
       "device type": "iPad Air 2",
       "os": "13.0",
-      "host os": "Mac-10.14.4",
+      "host os": "Mac-10.14.6",
       "pool": "Chrome",
       "priority": 30
     }
diff --git a/ios/build/bots/chromium.mac/ios-simulator-full-configs.json b/ios/build/bots/chromium.mac/ios-simulator-full-configs.json
index 04a7977c..da3b9fb 100644
--- a/ios/build/bots/chromium.mac/ios-simulator-full-configs.json
+++ b/ios/build/bots/chromium.mac/ios-simulator-full-configs.json
@@ -22,7 +22,7 @@
       "include": "eg_tests.json",
       "device type": "iPad Air 2",
       "os": "12.2",
-      "host os": "Mac-10.14.4",
+      "host os": "Mac-10.14.6",
       "pool":"Chrome",
       "priority": 30
     },
@@ -30,7 +30,7 @@
       "include": "eg_tests.json",
       "device type": "iPhone X",
       "os": "12.2",
-      "host os": "Mac-10.14.4",
+      "host os": "Mac-10.14.6",
       "pool":"Chrome",
       "priority": 30
     },
@@ -38,7 +38,7 @@
       "include": "eg_cq_tests.json",
       "device type": "iPad Air 2",
       "os": "12.2",
-      "host os": "Mac-10.14.4",
+      "host os": "Mac-10.14.6",
       "pool":"Chrome",
       "priority": 30
     },
@@ -46,7 +46,7 @@
       "include": "eg_tests.json",
       "device type": "iPhone 7",
       "os": "13.0",
-      "host os": "Mac-10.14.4",
+      "host os": "Mac-10.14.6",
       "pool":"Chrome",
       "priority": 30
     },
@@ -54,7 +54,7 @@
       "include": "eg_tests.json",
       "device type": "iPad Air 2",
       "os": "13.0",
-      "host os": "Mac-10.14.4",
+      "host os": "Mac-10.14.6",
       "pool":"Chrome",
       "priority": 30
     },
@@ -62,7 +62,7 @@
       "include": "eg_tests.json",
       "device type": "iPhone X",
       "os": "13.0",
-      "host os": "Mac-10.14.4",
+      "host os": "Mac-10.14.6",
       "pool":"Chrome",
       "priority": 30
     },
@@ -70,7 +70,7 @@
       "include": "eg_cq_tests.json",
       "device type": "iPhone X",
       "os": "13.0",
-      "host os": "Mac-10.14.4",
+      "host os": "Mac-10.14.6",
       "pool":"Chrome",
       "priority": 30
     },
@@ -78,7 +78,7 @@
       "include": "eg_cq_tests.json",
       "device type": "iPad Air 2",
       "os": "13.0",
-      "host os": "Mac-10.14.4",
+      "host os": "Mac-10.14.6",
       "pool":"Chrome",
       "priority": 30
     }
diff --git a/ios/build/bots/chromium.mac/ios-simulator.json b/ios/build/bots/chromium.mac/ios-simulator.json
index 556e4f7..28446d92 100644
--- a/ios/build/bots/chromium.mac/ios-simulator.json
+++ b/ios/build/bots/chromium.mac/ios-simulator.json
@@ -23,7 +23,7 @@
       "include": "common_tests.json",
       "device type": "iPhone 6s",
       "os": "12.2",
-      "host os": "Mac-10.14.4",
+      "host os": "Mac-10.14.6",
       "pool":"Chrome",
       "priority": 30
     },
@@ -31,7 +31,7 @@
       "include": "eg_cq_tests.json",
       "device type": "iPhone 6s",
       "os": "12.2",
-      "host os": "Mac-10.14.4",
+      "host os": "Mac-10.14.6",
       "pool":"Chrome",
       "priority": 30
     },
@@ -39,7 +39,7 @@
       "include": "screen_size_dependent_tests.json",
       "device type": "iPhone 6s Plus",
       "os": "13.0",
-      "host os": "Mac-10.14.4",
+      "host os": "Mac-10.14.6",
       "pool":"Chrome",
       "priority": 30
     },
@@ -47,7 +47,7 @@
       "include": "screen_size_dependent_tests.json",
       "device type": "iPhone 6s",
       "os": "13.0",
-      "host os": "Mac-10.14.4",
+      "host os": "Mac-10.14.6",
       "pool":"Chrome",
       "priority": 30
     },
@@ -55,7 +55,7 @@
       "include": "screen_size_dependent_tests.json",
       "device type": "iPhone SE",
       "os": "13.0",
-      "host os": "Mac-10.14.4",
+      "host os": "Mac-10.14.6",
       "pool":"Chrome",
       "priority": 30
     },
@@ -63,7 +63,7 @@
       "include": "common_tests.json",
       "device type": "iPhone 6s",
       "os": "13.0",
-      "host os": "Mac-10.14.4",
+      "host os": "Mac-10.14.6",
       "pool":"Chrome",
       "priority": 30
     },
@@ -71,7 +71,7 @@
       "include": "screen_size_dependent_tests.json",
       "device type": "iPad Air 2",
       "os": "13.0",
-      "host os": "Mac-10.14.4",
+      "host os": "Mac-10.14.6",
       "pool":"Chrome",
       "priority": 30
     },
@@ -79,7 +79,7 @@
       "include": "eg_cq_tests.json",
       "device type": "iPhone 6s",
       "os": "13.0",
-      "host os": "Mac-10.14.4",
+      "host os": "Mac-10.14.6",
       "pool":"Chrome",
       "priority": 30
     }
diff --git a/ios/build/bots/chromium.mac/ios-slimnav.json b/ios/build/bots/chromium.mac/ios-slimnav.json
index 66ef88e..ddafa20 100644
--- a/ios/build/bots/chromium.mac/ios-slimnav.json
+++ b/ios/build/bots/chromium.mac/ios-slimnav.json
@@ -21,7 +21,7 @@
       ],
       "device type": "iPhone 6s Plus",
       "os": "12.2",
-      "host os": "Mac-10.14.4",
+      "host os": "Mac-10.14.6",
       "pool":"Chrome",
       "priority": 30
     },
@@ -32,7 +32,7 @@
       ],
       "device type": "iPhone 6s",
       "os": "12.2",
-      "host os": "Mac-10.14.4",
+      "host os": "Mac-10.14.6",
       "pool":"Chrome",
       "priority": 30
     },
@@ -43,7 +43,7 @@
       ],
       "device type": "iPhone 6s",
       "os": "12.2",
-      "host os": "Mac-10.14.4",
+      "host os": "Mac-10.14.6",
       "pool":"Chrome",
       "priority": 30
     },
@@ -54,7 +54,7 @@
       ],
       "device type": "iPad Air 2",
       "os": "12.2",
-      "host os": "Mac-10.14.4",
+      "host os": "Mac-10.14.6",
       "pool":"Chrome",
       "priority": 30
     },
@@ -65,7 +65,7 @@
       ],
       "device type": "iPhone 6s",
       "os": "12.2",
-      "host os": "Mac-10.14.4",
+      "host os": "Mac-10.14.6",
       "pool":"Chrome",
       "priority": 30
     },
@@ -79,7 +79,7 @@
       "device type": "iPad Air 2",
       "os": "12.2",
       "xctest": true,
-      "host os": "Mac-10.14.4",
+      "host os": "Mac-10.14.6",
       "pool":"Chrome",
       "priority": 30
     },
@@ -91,7 +91,7 @@
       "device type": "iPad Air 2",
       "os": "12.2",
       "xctest": true,
-      "host os": "Mac-10.14.4",
+      "host os": "Mac-10.14.6",
       "pool":"Chrome",
       "priority": 30
     },
@@ -103,7 +103,7 @@
       "device type": "iPad Air 2",
       "os": "12.2",
       "xctest": true,
-      "host os": "Mac-10.14.4",
+      "host os": "Mac-10.14.6",
       "pool":"Chrome",
       "priority": 30
     },
@@ -115,7 +115,7 @@
       "device type": "iPad Air 2",
       "os": "12.2",
       "xctest": true,
-      "host os": "Mac-10.14.4",
+      "host os": "Mac-10.14.6",
       "pool":"Chrome",
       "priority": 30
     },
@@ -127,7 +127,7 @@
       "device type": "iPad Air 2",
       "os": "12.2",
       "xctest": true,
-      "host os": "Mac-10.14.4",
+      "host os": "Mac-10.14.6",
       "pool":"Chrome",
       "priority": 30
     },
@@ -139,7 +139,7 @@
       "device type": "iPad Air 2",
       "os": "12.2",
       "xctest": true,
-      "host os": "Mac-10.14.4",
+      "host os": "Mac-10.14.6",
       "pool":"Chrome",
       "priority": 30
     },
@@ -153,7 +153,7 @@
       "device type": "iPhone X",
       "os": "12.2",
       "xctest": true,
-      "host os": "Mac-10.14.4",
+      "host os": "Mac-10.14.6",
       "pool":"Chrome",
       "priority": 30
     },
@@ -165,7 +165,7 @@
       "device type": "iPhone X",
       "os": "12.2",
       "xctest": true,
-      "host os": "Mac-10.14.4",
+      "host os": "Mac-10.14.6",
       "pool":"Chrome",
       "priority": 30
     },
@@ -177,7 +177,7 @@
       "device type": "iPhone X",
       "os": "12.2",
       "xctest": true,
-      "host os": "Mac-10.14.4",
+      "host os": "Mac-10.14.6",
       "pool":"Chrome",
       "priority": 30
     },
@@ -189,7 +189,7 @@
       "device type": "iPhone X",
       "os": "12.2",
       "xctest": true,
-      "host os": "Mac-10.14.4",
+      "host os": "Mac-10.14.6",
       "pool":"Chrome",
       "priority": 30
     },
@@ -201,7 +201,7 @@
       "device type": "iPhone X",
       "os": "12.2",
       "xctest": true,
-      "host os": "Mac-10.14.4",
+      "host os": "Mac-10.14.6",
       "pool":"Chrome",
       "priority": 30
     },
@@ -213,7 +213,7 @@
       "device type": "iPhone X",
       "os": "12.2",
       "xctest": true,
-      "host os": "Mac-10.14.4",
+      "host os": "Mac-10.14.6",
       "pool":"Chrome",
       "priority": 30
     },
@@ -224,7 +224,7 @@
       ],
       "device type": "iPhone X",
       "os": "12.2",
-      "host os": "Mac-10.14.4",
+      "host os": "Mac-10.14.6",
       "pool":"Chrome",
       "priority": 30
     },
@@ -235,7 +235,7 @@
       ],
       "device type": "iPhone 6s Plus",
       "os": "13.0",
-      "host os": "Mac-10.14.4",
+      "host os": "Mac-10.14.6",
       "pool":"Chrome",
       "priority": 30
     },
@@ -246,7 +246,7 @@
       ],
       "device type": "iPhone 6s",
       "os": "13.0",
-      "host os": "Mac-10.14.4",
+      "host os": "Mac-10.14.6",
       "pool":"Chrome",
       "priority": 30
     },
@@ -257,7 +257,7 @@
       ],
       "device type": "iPhone 6s",
       "os": "13.0",
-      "host os": "Mac-10.14.4",
+      "host os": "Mac-10.14.6",
       "pool":"Chrome",
       "priority": 30
     },
@@ -268,7 +268,7 @@
       ],
       "device type": "iPad Air 2",
       "os": "13.0",
-      "host os": "Mac-10.14.4",
+      "host os": "Mac-10.14.6",
       "pool":"Chrome",
       "priority": 30
     },
@@ -279,7 +279,7 @@
       ],
       "device type": "iPhone 6s",
       "os": "13.0",
-      "host os": "Mac-10.14.4",
+      "host os": "Mac-10.14.6",
       "pool":"Chrome",
       "priority": 30
     },
@@ -293,7 +293,7 @@
       "device type": "iPad Air 2",
       "os": "13.0",
       "xctest": true,
-      "host os": "Mac-10.14.4",
+      "host os": "Mac-10.14.6",
       "pool":"Chrome",
       "priority": 30
     },
@@ -305,7 +305,7 @@
       "device type": "iPad Air 2",
       "os": "13.0",
       "xctest": true,
-      "host os": "Mac-10.14.4",
+      "host os": "Mac-10.14.6",
       "pool":"Chrome",
       "priority": 30
     },
@@ -317,7 +317,7 @@
       "device type": "iPad Air 2",
       "os": "13.0",
       "xctest": true,
-      "host os": "Mac-10.14.4",
+      "host os": "Mac-10.14.6",
       "pool":"Chrome",
       "priority": 30
     },
@@ -329,7 +329,7 @@
       "device type": "iPad Air 2",
       "os": "13.0",
       "xctest": true,
-      "host os": "Mac-10.14.4",
+      "host os": "Mac-10.14.6",
       "pool":"Chrome",
       "priority": 30
     },
@@ -341,7 +341,7 @@
       "device type": "iPad Air 2",
       "os": "13.0",
       "xctest": true,
-      "host os": "Mac-10.14.4",
+      "host os": "Mac-10.14.6",
       "pool":"Chrome",
       "priority": 30
     },
@@ -353,7 +353,7 @@
       "device type": "iPad Air 2",
       "os": "13.0",
       "xctest": true,
-      "host os": "Mac-10.14.4",
+      "host os": "Mac-10.14.6",
       "pool":"Chrome",
       "priority": 30
     },
@@ -367,7 +367,7 @@
       "device type": "iPhone X",
       "os": "13.0",
       "xctest": true,
-      "host os": "Mac-10.14.4",
+      "host os": "Mac-10.14.6",
       "pool":"Chrome",
       "priority": 30
     },
@@ -379,7 +379,7 @@
       "device type": "iPhone X",
       "os": "13.0",
       "xctest": true,
-      "host os": "Mac-10.14.4",
+      "host os": "Mac-10.14.6",
       "pool":"Chrome",
       "priority": 30
     },
@@ -391,7 +391,7 @@
       "device type": "iPhone X",
       "os": "13.0",
       "xctest": true,
-      "host os": "Mac-10.14.4",
+      "host os": "Mac-10.14.6",
       "pool":"Chrome",
       "priority": 30
     },
@@ -403,7 +403,7 @@
       "device type": "iPhone X",
       "os": "13.0",
       "xctest": true,
-      "host os": "Mac-10.14.4",
+      "host os": "Mac-10.14.6",
       "pool":"Chrome",
       "priority": 30
     },
@@ -415,7 +415,7 @@
       "device type": "iPhone X",
       "os": "13.0",
       "xctest": true,
-      "host os": "Mac-10.14.4",
+      "host os": "Mac-10.14.6",
       "pool":"Chrome",
       "priority": 30
     },
@@ -427,7 +427,7 @@
       "device type": "iPhone X",
       "os": "13.0",
       "xctest": true,
-      "host os": "Mac-10.14.4",
+      "host os": "Mac-10.14.6",
       "pool":"Chrome",
       "priority": 30
     },
@@ -438,7 +438,7 @@
       ],
       "device type": "iPhone X",
       "os": "13.0",
-      "host os": "Mac-10.14.4",
+      "host os": "Mac-10.14.6",
       "pool":"Chrome",
       "priority": 30
     }
diff --git a/ios/build/bots/chromium.mac/ios12-beta-simulator.json b/ios/build/bots/chromium.mac/ios12-beta-simulator.json
index 4088f07..f9f6224 100644
--- a/ios/build/bots/chromium.mac/ios12-beta-simulator.json
+++ b/ios/build/bots/chromium.mac/ios12-beta-simulator.json
@@ -16,213 +16,5 @@
     "use_goma=true"
   ],
   "tests": [
-    {
-      "include": "common_tests.json",
-      "device type": "iPhone X",
-      "os": "12.1",
-      "xcode build version": "10o45e",
-      "host os": "Mac-10.13.6",
-      "pool":"Chrome",
-      "optional_dimensions": {
-          "60": [{
-            "host os": "Mac-10.14.4"
-          }],
-          "120": [{
-            "host os": "Mac-10.14.3"
-          }]
-      }
-    },
-    {
-      "include": "eg_cq_tests.json",
-      "device type": "iPhone X",
-      "os": "12.1",
-      "xcode build version": "10o45e",
-      "host os": "Mac-10.13.6",
-      "pool":"Chrome",
-      "optional_dimensions": {
-          "60": [{
-            "host os": "Mac-10.14.4"
-          }],
-          "120": [{
-            "host os": "Mac-10.14.3"
-          }]
-      }
-    },
-    {
-      "include": "eg_cq_tests.json",
-      "device type": "iPhone 6 Plus",
-      "os": "12.1",
-      "xcode build version": "10o45e",
-      "host os": "Mac-10.13.6",
-      "pool":"Chrome",
-      "optional_dimensions": {
-          "60": [{
-            "host os": "Mac-10.14.4"
-          }],
-          "120": [{
-            "host os": "Mac-10.14.3"
-          }]
-      }
-    },
-    {
-      "include": "eg_cq_tests.json",
-      "device type": "iPhone 5s",
-      "os": "12.1",
-      "xcode build version": "10o45e",
-      "host os": "Mac-10.13.6",
-      "pool":"Chrome",
-      "optional_dimensions": {
-          "60": [{
-            "host os": "Mac-10.14.4"
-          }],
-          "120": [{
-            "host os": "Mac-10.14.3"
-          }]
-      }
-    },
-    {
-      "include": "eg_cq_tests.json",
-      "device type": "iPad Pro (12.9-inch)",
-      "os": "12.1",
-      "xcode build version": "10o45e",
-      "host os": "Mac-10.13.6",
-      "pool":"Chrome",
-      "optional_dimensions": {
-          "60": [{
-            "host os": "Mac-10.14.4"
-          }],
-          "120": [{
-            "host os": "Mac-10.14.3"
-          }]
-      }
-    },
-    {
-      "include": "eg_tests.json",
-      "device type": "iPhone X",
-      "os": "12.1",
-      "xcode build version": "10o45e",
-      "host os": "Mac-10.13.6",
-      "pool":"Chrome",
-      "optional_dimensions": {
-          "60": [{
-            "host os": "Mac-10.14.4"
-          }],
-          "120": [{
-            "host os": "Mac-10.14.3"
-          }]
-      }
-    },
-    {
-      "include": "eg_tests.json",
-      "device type": "iPhone 6 Plus",
-      "os": "12.1",
-      "xcode build version": "10o45e",
-      "host os": "Mac-10.13.6",
-      "pool":"Chrome",
-      "optional_dimensions": {
-          "60": [{
-            "host os": "Mac-10.14.4"
-          }],
-          "120": [{
-            "host os": "Mac-10.14.3"
-          }]
-      }
-    },
-    {
-      "include": "eg_tests.json",
-      "device type": "iPad Air",
-      "os": "12.1",
-      "xcode build version": "10o45e",
-      "host os": "Mac-10.13.6",
-      "pool":"Chrome",
-      "optional_dimensions": {
-          "60": [{
-            "host os": "Mac-10.14.4"
-          }],
-          "120": [{
-            "host os": "Mac-10.14.3"
-          }]
-      }
-    },
-    {
-      "include": "eg_tests.json",
-      "device type": "iPhone 5s",
-      "os": "12.1",
-      "xcode build version": "10o45e",
-      "host os": "Mac-10.13.6",
-      "pool":"Chrome",
-      "optional_dimensions": {
-          "60": [{
-            "host os": "Mac-10.14.4"
-          }],
-          "120": [{
-            "host os": "Mac-10.14.3"
-          }]
-      }
-    },
-    {
-      "include": "screen_size_dependent_tests.json",
-      "device type": "iPhone 6s Plus",
-      "os": "12.1",
-      "xcode build version": "10o45e",
-      "host os": "Mac-10.13.6",
-      "pool":"Chrome",
-      "optional_dimensions": {
-          "60": [{
-            "host os": "Mac-10.14.4"
-          }],
-          "120": [{
-            "host os": "Mac-10.14.3"
-          }]
-      }
-    },
-    {
-      "include": "screen_size_dependent_tests.json",
-      "device type": "iPhone X",
-      "os": "12.1",
-      "xcode build version": "10o45e",
-      "host os": "Mac-10.13.6",
-      "pool":"Chrome",
-      "optional_dimensions": {
-          "60": [{
-            "host os": "Mac-10.14.4"
-          }],
-          "120": [{
-            "host os": "Mac-10.14.3"
-          }]
-      }
-    },
-    {
-      "include": "screen_size_dependent_tests.json",
-      "device type": "iPhone 5s",
-      "os": "12.1",
-      "xcode build version": "10o45e",
-      "host os": "Mac-10.13.6",
-      "pool":"Chrome",
-      "optional_dimensions": {
-          "60": [{
-            "host os": "Mac-10.14.4"
-          }],
-          "120": [{
-            "host os": "Mac-10.14.3"
-          }]
-      }
-    },
-    {
-      "include": "screen_size_dependent_tests.json",
-      "device type": "iPad Air 2",
-      "os": "12.1",
-      "xcode build version": "10o45e",
-      "host os": "Mac-10.13.6",
-      "pool":"Chrome",
-      "optional_dimensions": {
-          "60": [{
-            "host os": "Mac-10.14.4"
-          }],
-          "120": [{
-            "host os": "Mac-10.14.3"
-          }]
-      }
-    }
   ]
 }
diff --git a/ios/build/bots/chromium.mac/ios13-beta-simulator.json b/ios/build/bots/chromium.mac/ios13-beta-simulator.json
index 55b4dc0..5ed874f 100644
--- a/ios/build/bots/chromium.mac/ios13-beta-simulator.json
+++ b/ios/build/bots/chromium.mac/ios13-beta-simulator.json
@@ -26,12 +26,7 @@
       "os": "13.0",
       "xcode build version": "11a420a",
       "pool":"Chrome",
-      "host os": "Mac-10.14.4",
-      "optional_dimensions": {
-          "60": [{
-            "host os": "Mac-10.14.5"
-          }]
-      }
+      "host os": "Mac-10.14.6"
     },
     {
       "xcode parallelization": true,
@@ -40,12 +35,7 @@
       "os": "13.0",
       "xcode build version": "11a420a",
       "pool":"Chrome",
-      "host os": "Mac-10.14.4",
-      "optional_dimensions": {
-          "60": [{
-            "host os": "Mac-10.14.5"
-          }]
-      }
+      "host os": "Mac-10.14.6"
     },
     {
       "xcode parallelization": true,
@@ -54,12 +44,7 @@
       "os": "12.2",
       "xcode build version": "11a420a",
       "pool":"Chrome",
-      "host os": "Mac-10.14.4",
-      "optional_dimensions": {
-          "60": [{
-            "host os": "Mac-10.14.5"
-          }]
-      }
+      "host os": "Mac-10.14.6"
     },
     {
       "xcode parallelization": true,
@@ -67,117 +52,71 @@
       "device type": "iPad (6th generation)",
       "os": "12.2",
       "xcode build version": "11a420a",
-      "pool":"Chrome",
-      "host os": "Mac-10.14.4",
-      "optional_dimensions": {
-          "60": [{
-            "host os": "Mac-10.14.5"
-          }]
-      }
+      "pool":"Chrome"
     },
     {
       "include": "common_tests.json",
       "device type": "iPhone X",
       "os": "13.0",
       "xcode build version": "11a420a",
-      "host os": "Mac-10.14.4",
-      "pool":"Chrome",
-      "optional_dimensions": {
-          "60": [{
-            "host os": "Mac-10.14.5"
-          }]
-      }
+      "host os": "Mac-10.14.6",
+      "pool":"Chrome"
     },
     {
       "include": "eg_cq_tests.json",
       "device type": "iPhone X",
       "os": "13.0",
       "xcode build version": "11a420a",
-      "host os": "Mac-10.14.4",
-      "pool":"Chrome",
-      "optional_dimensions": {
-          "60": [{
-            "host os": "Mac-10.14.5"
-          }]
-      }
+      "host os": "Mac-10.14.6",
+      "pool":"Chrome"
     },
     {
       "include": "eg_cq_tests.json",
       "device type": "iPad Pro (12.9-inch)",
       "os": "13.0",
       "xcode build version": "11a420a",
-      "host os": "Mac-10.14.4",
-      "pool":"Chrome",
-      "optional_dimensions": {
-          "60": [{
-            "host os": "Mac-10.14.5"
-          }]
-      }
+      "host os": "Mac-10.14.6",
+      "pool":"Chrome"
     },
     {
       "include": "eg_tests.json",
       "device type": "iPhone X",
       "os": "13.0",
       "xcode build version": "11a420a",
-      "host os": "Mac-10.14.4",
-      "pool":"Chrome",
-      "optional_dimensions": {
-          "60": [{
-            "host os": "Mac-10.14.5"
-          }]
-      }
+      "host os": "Mac-10.14.6",
+      "pool":"Chrome"
     },
     {
       "include": "eg_tests.json",
       "device type": "iPad Air (3rd generation)",
       "os": "13.0",
       "xcode build version": "11a420a",
-      "host os": "Mac-10.14.4",
-      "pool":"Chrome",
-      "optional_dimensions": {
-          "60": [{
-            "host os": "Mac-10.14.5"
-          }]
-      }
+      "host os": "Mac-10.14.6",
+      "pool":"Chrome"
     },
     {
       "include": "screen_size_dependent_tests.json",
       "device type": "iPhone 6s Plus",
       "os": "13.0",
       "xcode build version": "11a420a",
-      "host os": "Mac-10.14.4",
-      "pool":"Chrome",
-      "optional_dimensions": {
-          "60": [{
-            "host os": "Mac-10.14.5"
-          }]
-      }
+      "host os": "Mac-10.14.6",
+      "pool":"Chrome"
     },
     {
       "include": "screen_size_dependent_tests.json",
       "device type": "iPhone X",
       "os": "13.0",
       "xcode build version": "11a420a",
-      "host os": "Mac-10.14.4",
-      "pool":"Chrome",
-      "optional_dimensions": {
-          "60": [{
-            "host os": "Mac-10.14.5"
-          }]
-      }
+      "host os": "Mac-10.14.6",
+      "pool":"Chrome"
     },
     {
       "include": "screen_size_dependent_tests.json",
       "device type": "iPad Air 2",
       "os": "13.0",
       "xcode build version": "11a420a",
-      "host os": "Mac-10.14.4",
-      "pool":"Chrome",
-      "optional_dimensions": {
-          "60": [{
-            "host os": "Mac-10.14.5"
-          }]
-      }
+      "host os": "Mac-10.14.6",
+      "pool":"Chrome"
     }
   ]
 }
diff --git a/ios/build/bots/chromium.mac/ios13-sdk-simulator.json b/ios/build/bots/chromium.mac/ios13-sdk-simulator.json
index 11508be..6341195a 100644
--- a/ios/build/bots/chromium.mac/ios13-sdk-simulator.json
+++ b/ios/build/bots/chromium.mac/ios13-sdk-simulator.json
@@ -26,12 +26,7 @@
       "device type": "iPhone 6s Plus",
       "os": "13.0",
       "pool":"Chrome",
-      "host os": "Mac-10.14.4",
-      "optional_dimensions": {
-          "60": [{
-            "host os": "Mac-10.14.5"
-          }]
-      },
+      "host os": "Mac-10.14.6",
       "priority": 30
     },
     {
@@ -39,12 +34,7 @@
       "device type": "iPhone 6s",
       "os": "13.0",
       "pool":"Chrome",
-      "host os": "Mac-10.14.4",
-      "optional_dimensions": {
-          "60": [{
-            "host os": "Mac-10.14.5"
-          }]
-      },
+      "host os": "Mac-10.14.6",
       "priority": 30
     },
     {
@@ -52,12 +42,7 @@
       "device type": "iPhone 6s",
       "os": "13.0",
       "pool":"Chrome",
-      "host os": "Mac-10.14.4",
-      "optional_dimensions": {
-          "60": [{
-            "host os": "Mac-10.14.5"
-          }]
-      },
+      "host os": "Mac-10.14.6",
       "priority": 30
     },
     {
@@ -65,12 +50,7 @@
       "device type": "iPhone 7",
       "os": "13.0",
       "pool":"Chrome",
-      "host os": "Mac-10.14.4",
-      "optional_dimensions": {
-          "60": [{
-            "host os": "Mac-10.14.5"
-          }]
-      },
+      "host os": "Mac-10.14.6",
       "priority": 30
     },
     {
@@ -78,12 +58,7 @@
       "device type": "iPad Air 2",
       "os": "13.0",
       "pool":"Chrome",
-      "host os": "Mac-10.14.4",
-      "optional_dimensions": {
-          "60": [{
-            "host os": "Mac-10.14.5"
-          }]
-      },
+      "host os": "Mac-10.14.6",
       "priority": 30
     },
     {
@@ -91,12 +66,7 @@
       "device type": "iPhone X",
       "os": "13.0",
       "pool":"Chrome",
-      "host os": "Mac-10.14.4",
-      "optional_dimensions": {
-          "60": [{
-            "host os": "Mac-10.14.5"
-          }]
-      },
+      "host os": "Mac-10.14.6",
       "priority": 30
     },
     {
@@ -104,12 +74,7 @@
       "device type": "iPhone X",
       "os": "13.0",
       "pool":"Chrome",
-      "host os": "Mac-10.14.4",
-      "optional_dimensions": {
-          "60": [{
-            "host os": "Mac-10.14.5"
-          }]
-      },
+      "host os": "Mac-10.14.6",
       "priority": 30
     },
     {
@@ -117,12 +82,7 @@
       "device type": "iPad Air 2",
       "os": "13.0",
       "pool":"Chrome",
-      "host os": "Mac-10.14.4",
-      "optional_dimensions": {
-          "60": [{
-            "host os": "Mac-10.14.5"
-          }]
-      },
+      "host os": "Mac-10.14.6",
       "priority": 30
     }
   ]
diff --git a/ios/build/bots/chromium.webrtc.fyi/WebRTC Chromium FYI ios-simulator.json b/ios/build/bots/chromium.webrtc.fyi/WebRTC Chromium FYI ios-simulator.json
index 131d2a0..551e1dd 100644
--- a/ios/build/bots/chromium.webrtc.fyi/WebRTC Chromium FYI ios-simulator.json
+++ b/ios/build/bots/chromium.webrtc.fyi/WebRTC Chromium FYI ios-simulator.json
@@ -23,21 +23,21 @@
       "include": "webrtc_tests.json",
       "device type": "iPhone 6s Plus",
       "os": "12.2",
-      "host os": "Mac-10.14.4",
+      "host os": "Mac-10.14.6",
       "pool": "Chrome"
     },
     {
       "include": "webrtc_tests.json",
       "device type": "iPhone 6s",
       "os": "12.2",
-      "host os": "Mac-10.14.4",
+      "host os": "Mac-10.14.6",
       "pool": "Chrome"
     },
     {
       "include": "webrtc_tests.json",
       "device type": "iPad Air 2",
       "os": "12.2",
-      "host os": "Mac-10.14.4",
+      "host os": "Mac-10.14.6",
       "pool": "Chrome"
     }
   ]
diff --git a/ios/chrome/browser/ui/browser_view/browser_view_controller.mm b/ios/chrome/browser/ui/browser_view/browser_view_controller.mm
index ad3ac22..985611705 100644
--- a/ios/chrome/browser/ui/browser_view/browser_view_controller.mm
+++ b/ios/chrome/browser/ui/browser_view/browser_view_controller.mm
@@ -1801,9 +1801,12 @@
       // by the |completion| block below.
       UIView* launchScreenView = launchScreenController.view;
       launchScreenView.userInteractionEnabled = NO;
-      UIWindow* window = UIApplication.sharedApplication.keyWindow;
-      launchScreenView.frame = window.bounds;
-      [window addSubview:launchScreenView];
+      // TODO(crbug.com/1011155): Displaying the launch screen is a hack to hide
+      // the build up of the UI from the user. To implement the hack, this view
+      // controller uses information that it should not know or care about: this
+      // BVC is contained and its parent bounds to the full screen.
+      launchScreenView.frame = self.parentViewController.view.bounds;
+      [self.parentViewController.view addSubview:launchScreenView];
 
       // Replace the completion handler sent to the superclass with one which
       // removes |launchScreenView| and resets the status bar. If |completion|
diff --git a/media/base/waiting.h b/media/base/waiting.h
index 2b0cc47..93d1889 100644
--- a/media/base/waiting.h
+++ b/media/base/waiting.h
@@ -20,9 +20,15 @@
 // https://www.w3.org/TR/html5/semantics-embedded-content.html#eventdef-media-waiting
 
 enum class WaitingReason {
+  // The playback cannot start because "Media Data May Contain Encrypted Blocks"
+  // and no CDM is available. The playback will start after a CDM is set. See
+  // https://www.w3.org/TR/encrypted-media/#media-may-contain-encrypted-blocks
+  kNoCdm,
+
   // The playback cannot proceed because some decryption key is not available.
   // This could happen when the license exchange is delayed or failed. The
   // playback will resume after the decryption key becomes available.
+  // See https://www.w3.org/TR/encrypted-media/#encrypted-block-encountered
   kNoDecryptionKey,
 
   // The playback cannot proceed because the decoder has lost its state, e.g.
diff --git a/media/blink/webmediaplayer_impl.cc b/media/blink/webmediaplayer_impl.cc
index ab05ee8e..0734cc1 100644
--- a/media/blink/webmediaplayer_impl.cc
+++ b/media/blink/webmediaplayer_impl.cc
@@ -2180,6 +2180,7 @@
   DCHECK(main_task_runner_->BelongsToCurrentThread());
 
   switch (reason) {
+    case WaitingReason::kNoCdm:
     case WaitingReason::kNoDecryptionKey:
       encrypted_client_->DidBlockPlaybackWaitingForKey();
       // TODO(jrummell): didResumePlaybackBlockedForKey() should only be called
diff --git a/media/filters/chunk_demuxer.cc b/media/filters/chunk_demuxer.cc
index 94b782eb..6edb274 100644
--- a/media/filters/chunk_demuxer.cc
+++ b/media/filters/chunk_demuxer.cc
@@ -136,10 +136,7 @@
 
   base::AutoLock auto_lock(lock_);
   DCHECK_NE(state_, SHUTDOWN);
-  if (!stream_->Append(buffers)) {
-    DVLOG(1) << "ChunkDemuxerStream::Append() : stream append failed";
-    return false;
-  }
+  stream_->Append(buffers);
 
   if (read_cb_)
     CompletePendingReadIfPossible_Locked();
diff --git a/media/filters/source_buffer_stream.cc b/media/filters/source_buffer_stream.cc
index 44a2d71..80053cc 100644
--- a/media/filters/source_buffer_stream.cc
+++ b/media/filters/source_buffer_stream.cc
@@ -246,7 +246,7 @@
   }
 }
 
-bool SourceBufferStream::Append(const BufferQueue& buffers) {
+void SourceBufferStream::Append(const BufferQueue& buffers) {
   TRACE_EVENT2("media", "SourceBufferStream::Append",
                "stream type", GetStreamTypeName(),
                "buffers to append", buffers.size());
@@ -269,9 +269,8 @@
       << buffers.front()->timestamp().InMicroseconds() << "us";
 
   // New coded frame groups emitted by the coded frame processor must begin with
-  // a keyframe. TODO(wolenetz): Change this to [DCHECK + MEDIA_LOG(ERROR...) +
-  // return false] once the CHECK has baked in a stable release. See
-  // https://crbug.com/580621.
+  // a keyframe. Avoid propagating with escalating impact if this assumption is
+  // broken.
   CHECK(!new_coded_frame_group_ || buffers.front()->is_key_frame());
 
   // Buffers within each GOP in a coded frame group must be monotonically
@@ -358,7 +357,7 @@
                     " Skipping further processing.";
         DVLOG(1) << __func__ << " " << GetStreamTypeName()
                  << ": done. ranges_=" << RangesToString(ranges_);
-        return true;
+        return;
       } else if (itr != buffers.begin()) {
         // Copy the first key frame and everything after it into
         // |trimmed_buffers|.
@@ -434,7 +433,6 @@
            << ": done. ranges_=" << RangesToString(ranges_);
   DCHECK(IsRangeListSorted(ranges_));
   DCHECK(OnlySelectedRangeIsSeeked());
-  return true;
 }
 
 void SourceBufferStream::Remove(base::TimeDelta start,
diff --git a/media/filters/source_buffer_stream.h b/media/filters/source_buffer_stream.h
index d771151..fa70e48 100644
--- a/media/filters/source_buffer_stream.h
+++ b/media/filters/source_buffer_stream.h
@@ -77,8 +77,7 @@
   // expected to be in order, but multiple calls to Append() may add buffers out
   // of order or overlapping. Assumes all buffers within |buffers| are in
   // presentation order and are non-overlapping.
-  // Returns true if Append() was successful, false if |buffers| are not added.
-  bool Append(const BufferQueue& buffers);
+  void Append(const BufferQueue& buffers);
 
   // Removes buffers between |start| and |end| according to the steps
   // in the "Coded Frame Removal Algorithm" in the Media Source
diff --git a/media/filters/source_buffer_stream_unittest.cc b/media/filters/source_buffer_stream_unittest.cc
index c028858..8364ab7d 100644
--- a/media/filters/source_buffer_stream_unittest.cc
+++ b/media/filters/source_buffer_stream_unittest.cc
@@ -106,15 +106,15 @@
   }
 
   void NewCodedFrameGroupAppend(int starting_position, int number_of_buffers) {
-    AppendBuffers(starting_position, number_of_buffers, true,
-                  base::TimeDelta(), true, &kDataA, kDataSize);
+    AppendBuffers(starting_position, number_of_buffers, true, base::TimeDelta(),
+                  &kDataA, kDataSize);
   }
 
   void NewCodedFrameGroupAppend(int starting_position,
                                 int number_of_buffers,
                                 const uint8_t* data) {
-    AppendBuffers(starting_position, number_of_buffers, true,
-                  base::TimeDelta(), true, data, kDataSize);
+    AppendBuffers(starting_position, number_of_buffers, true, base::TimeDelta(),
+                  data, kDataSize);
   }
 
   void NewCodedFrameGroupAppend_OffsetFirstBuffer(
@@ -122,40 +122,40 @@
       int number_of_buffers,
       base::TimeDelta first_buffer_offset) {
     AppendBuffers(starting_position, number_of_buffers, true,
-                  first_buffer_offset, true, &kDataA, kDataSize);
+                  first_buffer_offset, &kDataA, kDataSize);
   }
 
   void AppendBuffers(int starting_position, int number_of_buffers) {
     AppendBuffers(starting_position, number_of_buffers, false,
-                  base::TimeDelta(), true, &kDataA, kDataSize);
+                  base::TimeDelta(), &kDataA, kDataSize);
   }
 
   void AppendBuffers(int starting_position,
                      int number_of_buffers,
                      const uint8_t* data) {
     AppendBuffers(starting_position, number_of_buffers, false,
-                  base::TimeDelta(), true, data, kDataSize);
+                  base::TimeDelta(), data, kDataSize);
   }
 
   void NewCodedFrameGroupAppend(const std::string& buffers_to_append) {
-    AppendBuffers(buffers_to_append, true, kNoTimestamp, false, true);
+    AppendBuffers(buffers_to_append, true, kNoTimestamp, false);
   }
 
   void NewCodedFrameGroupAppend(base::TimeDelta start_timestamp,
                                 const std::string& buffers_to_append) {
-    AppendBuffers(buffers_to_append, true, start_timestamp, false, true);
+    AppendBuffers(buffers_to_append, true, start_timestamp, false);
   }
 
   void AppendBuffers(const std::string& buffers_to_append) {
-    AppendBuffers(buffers_to_append, false, kNoTimestamp, false, true);
+    AppendBuffers(buffers_to_append, false, kNoTimestamp, false);
   }
 
   void NewCodedFrameGroupAppendOneByOne(const std::string& buffers_to_append) {
-    AppendBuffers(buffers_to_append, true, kNoTimestamp, true, true);
+    AppendBuffers(buffers_to_append, true, kNoTimestamp, true);
   }
 
   void AppendBuffersOneByOne(const std::string& buffers_to_append) {
-    AppendBuffers(buffers_to_append, false, kNoTimestamp, true, true);
+    AppendBuffers(buffers_to_append, false, kNoTimestamp, true);
   }
 
   void Seek(int position) { stream_->Seek(position * frame_duration_); }
@@ -457,7 +457,6 @@
                      int number_of_buffers,
                      bool begin_coded_frame_group,
                      base::TimeDelta first_buffer_offset,
-                     bool expect_success,
                      const uint8_t* data,
                      int size) {
     if (begin_coded_frame_group) {
@@ -499,7 +498,7 @@
       queue.push_back(buffer);
     }
     if (!queue.empty())
-      EXPECT_EQ(expect_success, stream_->Append(queue));
+      stream_->Append(queue);
   }
 
   void UpdateLastBufferDuration(DecodeTimestamp current_dts,
@@ -666,8 +665,7 @@
   void AppendBuffers(const std::string& buffers_to_append,
                      bool start_new_coded_frame_group,
                      base::TimeDelta coded_frame_group_start_timestamp,
-                     bool one_by_one,
-                     bool expect_success) {
+                     bool one_by_one) {
     BufferQueue buffers = StringToBufferQueue(buffers_to_append);
 
     if (start_new_coded_frame_group) {
@@ -684,7 +682,7 @@
     }
 
     if (!one_by_one) {
-      EXPECT_EQ(expect_success, stream_->Append(buffers));
+      stream_->Append(buffers);
       return;
     }
 
@@ -692,7 +690,7 @@
     for (size_t i = 0; i < buffers.size(); i++) {
       BufferQueue wrapper;
       wrapper.push_back(buffers[i]);
-      EXPECT_TRUE(stream_->Append(wrapper));
+      stream_->Append(wrapper);
     }
   }
 
diff --git a/media/fuchsia/cdm/fuchsia_decryptor.cc b/media/fuchsia/cdm/fuchsia_decryptor.cc
index e1c8ba7..8666cfb 100644
--- a/media/fuchsia/cdm/fuchsia_decryptor.cc
+++ b/media/fuchsia/cdm/fuchsia_decryptor.cc
@@ -40,7 +40,7 @@
 }
 
 void FuchsiaDecryptor::CancelDecrypt(StreamType stream_type) {
-  if (stream_type == StreamType::kAudio) {
+  if (stream_type == StreamType::kAudio && audio_decryptor_) {
     audio_decryptor_->CancelDecrypt();
   }
 }
diff --git a/media/renderers/renderer_impl.cc b/media/renderers/renderer_impl.cc
index 8a12f77..9fad1576 100644
--- a/media/renderers/renderer_impl.cc
+++ b/media/renderers/renderer_impl.cc
@@ -157,6 +157,7 @@
   if (HasEncryptedStream() && !cdm_context_) {
     DVLOG(1) << __func__ << ": Has encrypted stream but CDM is not set.";
     state_ = STATE_INIT_PENDING_CDM;
+    OnWaiting(WaitingReason::kNoCdm);
     return;
   }
 
diff --git a/media/renderers/renderer_impl_unittest.cc b/media/renderers/renderer_impl_unittest.cc
index 27e074f..89667c1 100644
--- a/media/renderers/renderer_impl_unittest.cc
+++ b/media/renderers/renderer_impl_unittest.cc
@@ -126,7 +126,8 @@
   void InitializeAndExpect(PipelineStatus start_status) {
     EXPECT_CALL(callbacks_, OnInitialize(start_status))
         .WillOnce(SaveArg<0>(&initialization_status_));
-    EXPECT_CALL(callbacks_, OnWaiting(_)).Times(0);
+    if (is_encrypted_ && !is_cdm_set_)
+      EXPECT_CALL(callbacks_, OnWaiting(WaitingReason::kNoCdm));
 
     if (start_status == PIPELINE_OK && audio_stream_) {
       EXPECT_CALL(*audio_renderer_, GetTimeSource())
@@ -171,6 +172,7 @@
   }
 
   void CreateVideoStream(bool is_encrypted = false) {
+    is_encrypted_ = is_encrypted;
     video_stream_ = CreateStream(DemuxerStream::VIDEO);
     video_stream_->set_video_decoder_config(
         is_encrypted ? TestVideoConfig::NormalEncrypted()
@@ -303,7 +305,8 @@
   }
 
   void SetCdmAndExpect(bool expected_result) {
-    EXPECT_CALL(callbacks_, OnCdmAttached(expected_result));
+    EXPECT_CALL(callbacks_, OnCdmAttached(expected_result))
+        .WillOnce(SaveArg<0>(&is_cdm_set_));
     renderer_impl_->SetCdm(cdm_context_.get(),
                            base::Bind(&CallbackHelper::OnCdmAttached,
                                       base::Unretained(&callbacks_)));
@@ -364,6 +367,8 @@
   RendererClient* audio_renderer_client_;
   VideoDecoderConfig video_decoder_config_;
   PipelineStatus initialization_status_;
+  bool is_encrypted_ = false;
+  bool is_cdm_set_ = false;
 
  private:
   DISALLOW_COPY_AND_ASSIGN(RendererImplTest);
diff --git a/mojo/public/java/system/BUILD.gn b/mojo/public/java/system/BUILD.gn
index 2984d4b..b669abc7 100644
--- a/mojo/public/java/system/BUILD.gn
+++ b/mojo/public/java/system/BUILD.gn
@@ -14,6 +14,7 @@
 }
 
 generate_jni("jni_headers") {
+  testonly = true
   sources = [
     "javatests/src/org/chromium/mojo/MojoTestRule.java",
     "javatests/src/org/chromium/mojo/bindings/ValidationTestUtil.java",
diff --git a/net/BUILD.gn b/net/BUILD.gn
index 5b8409e9..8c6bd3c9 100644
--- a/net/BUILD.gn
+++ b/net/BUILD.gn
@@ -1722,6 +1722,8 @@
       "third_party/quiche/src/quic/platform/api/quic_text_utils.h",
       "third_party/quiche/src/quic/platform/api/quic_thread.h",
       "third_party/quiche/src/quic/platform/api/quic_uint128.h",
+      "third_party/quiche/src/quic/quic_transport/quic_transport_client_session.cc",
+      "third_party/quiche/src/quic/quic_transport/quic_transport_client_session.h",
       "third_party/quiche/src/spdy/core/fifo_write_scheduler.h",
       "third_party/quiche/src/spdy/core/hpack/hpack_constants.cc",
       "third_party/quiche/src/spdy/core/hpack/hpack_constants.h",
@@ -3300,6 +3302,7 @@
     ]
   }
   generate_jni("net_test_jni_headers") {
+    testonly = true
     sources = [
       "android/javatests/src/org/chromium/net/AndroidKeyStoreTestUtil.java",
       "android/javatests/src/org/chromium/net/AndroidNetworkLibraryTestUtil.java",
@@ -5620,6 +5623,7 @@
     "third_party/quiche/src/quic/platform/api/quic_str_cat_test.cc",
     "third_party/quiche/src/quic/platform/api/quic_string_utils_test.cc",
     "third_party/quiche/src/quic/platform/api/quic_text_utils_test.cc",
+    "third_party/quiche/src/quic/quic_transport/quic_transport_client_session_test.cc",
     "third_party/quiche/src/quic/test_tools/crypto_test_utils_test.cc",
     "third_party/quiche/src/quic/test_tools/mock_quic_time_wait_list_manager.cc",
     "third_party/quiche/src/quic/test_tools/mock_quic_time_wait_list_manager.h",
diff --git a/net/cert/cert_verifier.cc b/net/cert/cert_verifier.cc
index d29b77d..fbf17c71 100644
--- a/net/cert/cert_verifier.cc
+++ b/net/cert/cert_verifier.cc
@@ -8,6 +8,7 @@
 
 #include "base/strings/string_util.h"
 #include "build/build_config.h"
+#include "net/base/features.h"
 #include "net/cert/cert_verify_proc.h"
 #include "net/cert/crl_set.h"
 #include "third_party/boringssl/src/include/openssl/pool.h"
@@ -82,9 +83,25 @@
   NOTIMPLEMENTED();
   return std::unique_ptr<CertVerifier>();
 #else
+  scoped_refptr<CertVerifyProc> verify_proc;
+#if defined(OS_FUCHSIA)
+  verify_proc =
+      CertVerifyProc::CreateBuiltinVerifyProc(std::move(cert_net_fetcher));
+#elif BUILDFLAG(BUILTIN_CERT_VERIFIER_FEATURE_SUPPORTED)
+  if (base::FeatureList::IsEnabled(features::kCertVerifierBuiltinFeature)) {
+    verify_proc =
+        CertVerifyProc::CreateBuiltinVerifyProc(std::move(cert_net_fetcher));
+  } else {
+    verify_proc =
+        CertVerifyProc::CreateSystemVerifyProc(std::move(cert_net_fetcher));
+  }
+#else
+  verify_proc =
+      CertVerifyProc::CreateSystemVerifyProc(std::move(cert_net_fetcher));
+#endif
+
   return std::make_unique<CachingCertVerifier>(
-      std::make_unique<MultiThreadedCertVerifier>(
-          CertVerifyProc::CreateDefault(std::move(cert_net_fetcher))));
+      std::make_unique<MultiThreadedCertVerifier>(std::move(verify_proc)));
 #endif
 }
 
diff --git a/net/cert/cert_verify_proc.cc b/net/cert/cert_verify_proc.cc
index 551de06..0d0bfee6 100644
--- a/net/cert/cert_verify_proc.cc
+++ b/net/cert/cert_verify_proc.cc
@@ -17,7 +17,6 @@
 #include "base/strings/stringprintf.h"
 #include "base/threading/scoped_blocking_call.h"
 #include "base/time/time.h"
-#include "build/build_config.h"
 #include "crypto/sha2.h"
 #include "net/base/features.h"
 #include "net/base/net_errors.h"
@@ -43,7 +42,8 @@
 #include "third_party/boringssl/src/include/openssl/pool.h"
 #include "url/url_canon.h"
 
-#if BUILDFLAG(BUILTIN_CERT_VERIFIER_FEATURE_SUPPORTED)
+#if defined(OS_FUCHSIA) || defined(USE_NSS_CERTS) || \
+    (defined(OS_MACOSX) && !defined(OS_IOS))
 #include "net/cert/cert_verify_proc_builtin.h"
 #endif
 
@@ -58,10 +58,6 @@
 #elif defined(OS_WIN)
 #include "base/win/windows_version.h"
 #include "net/cert/cert_verify_proc_win.h"
-#elif defined(OS_FUCHSIA)
-#include "net/cert/cert_verify_proc_builtin.h"
-#else
-#error Implement certificate verification.
 #endif
 
 namespace net {
@@ -457,16 +453,10 @@
 
 }  // namespace
 
+#if !defined(OS_FUCHSIA)
 // static
-scoped_refptr<CertVerifyProc> CertVerifyProc::CreateDefault(
+scoped_refptr<CertVerifyProc> CertVerifyProc::CreateSystemVerifyProc(
     scoped_refptr<CertNetFetcher> cert_net_fetcher) {
-#if BUILDFLAG(BUILTIN_CERT_VERIFIER_FEATURE_SUPPORTED)
-  if (base::FeatureList::IsEnabled(features::kCertVerifierBuiltinFeature)) {
-    return CreateCertVerifyProcBuiltin(
-        std::move(cert_net_fetcher),
-        SystemTrustStoreProvider::CreateDefaultForSSL());
-  }
-#endif
 #if defined(USE_NSS_CERTS)
   return new CertVerifyProcNSS();
 #elif defined(OS_ANDROID)
@@ -477,14 +467,22 @@
   return new CertVerifyProcMac();
 #elif defined(OS_WIN)
   return new CertVerifyProcWin();
-#elif defined(OS_FUCHSIA)
-  return CreateCertVerifyProcBuiltin(
-      std::move(cert_net_fetcher),
-      SystemTrustStoreProvider::CreateDefaultForSSL());
 #else
 #error Unsupported platform
 #endif
 }
+#endif
+
+#if defined(OS_FUCHSIA) || defined(USE_NSS_CERTS) || \
+    (defined(OS_MACOSX) && !defined(OS_IOS))
+// static
+scoped_refptr<CertVerifyProc> CertVerifyProc::CreateBuiltinVerifyProc(
+    scoped_refptr<CertNetFetcher> cert_net_fetcher) {
+  return CreateCertVerifyProcBuiltin(
+      std::move(cert_net_fetcher),
+      SystemTrustStoreProvider::CreateDefaultForSSL());
+}
+#endif
 
 CertVerifyProc::CertVerifyProc() {}
 
diff --git a/net/cert/cert_verify_proc.h b/net/cert/cert_verify_proc.h
index af2219d8..ed812373 100644
--- a/net/cert/cert_verify_proc.h
+++ b/net/cert/cert_verify_proc.h
@@ -12,6 +12,7 @@
 #include "base/gtest_prod_util.h"
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
+#include "build/build_config.h"
 #include "net/base/net_export.h"
 #include "net/cert/x509_cert_types.h"
 
@@ -64,10 +65,19 @@
     kMaxValue = kChainLengthOne
   };
 
-  // Creates and returns the default CertVerifyProc. |cert_net_fetcher| may not
-  // be used, depending on the implementation.
-  static scoped_refptr<CertVerifyProc> CreateDefault(
+#if !defined(OS_FUCHSIA)
+  // Creates and returns a CertVerifyProc that uses the system verifier.
+  // |cert_net_fetcher| may not be used, depending on the implementation.
+  static scoped_refptr<CertVerifyProc> CreateSystemVerifyProc(
       scoped_refptr<CertNetFetcher> cert_net_fetcher);
+#endif
+
+#if defined(OS_FUCHSIA) || defined(USE_NSS_CERTS) || \
+    (defined(OS_MACOSX) && !defined(OS_IOS))
+  // Creates and returns a CertVerifyProcBuiltin using the SSL SystemTrustStore.
+  static scoped_refptr<CertVerifyProc> CreateBuiltinVerifyProc(
+      scoped_refptr<CertNetFetcher> cert_net_fetcher);
+#endif
 
   // Verifies the certificate against the given hostname as an SSL server
   // certificate. Returns OK if successful or an error code upon failure.
diff --git a/net/cert/cert_verify_proc_unittest.cc b/net/cert/cert_verify_proc_unittest.cc
index 03e7dbf..5835917 100644
--- a/net/cert/cert_verify_proc_unittest.cc
+++ b/net/cert/cert_verify_proc_unittest.cc
@@ -139,8 +139,8 @@
 
 // This enum identifies a concrete implemenation of CertVerifyProc.
 //
-// The type is erased by CertVerifyProc::CreateDefault(), however
-// needs to be known for some of the test expectations.
+// The type is erased by CreateCertVerifyProc(), however needs to be known for
+// some of the test expectations.
 enum CertVerifyProcType {
   CERT_VERIFY_PROC_NSS,
   CERT_VERIFY_PROC_ANDROID,
@@ -212,7 +212,8 @@
 }
 
 // The set of all CertVerifyProcTypes that tests should be parameterized on.
-// This needs to be kept in sync with CertVerifyProc::CreateDefault().
+// This needs to be kept in sync with CertVerifyProc::CreateSystemVerifyProc()
+// and the platforms where CreateSslSystemTrustStore() is not a dummy store.
 // TODO(crbug.com/649017): Enable CERT_VERIFY_PROC_BUILTIN everywhere. Right
 // now this is gated on having CertVerifyProcBuiltin understand the roots added
 // via TestRootCerts.
diff --git a/net/cert/test_root_certs_unittest.cc b/net/cert/test_root_certs_unittest.cc
index 62e2365..5740686 100644
--- a/net/cert/test_root_certs_unittest.cc
+++ b/net/cert/test_root_certs_unittest.cc
@@ -6,6 +6,7 @@
 
 #include "base/files/file_path.h"
 #include "build/build_config.h"
+#include "net/base/features.h"
 #include "net/base/net_errors.h"
 #include "net/cert/cert_net_fetcher.h"
 #include "net/cert/cert_status_flags.h"
@@ -36,6 +37,21 @@
 // A certificate issued by the local test root for 127.0.0.1.
 const char kGoodCertificateFile[] = "ok_cert.pem";
 
+scoped_refptr<CertVerifyProc> CreateCertVerifyProc() {
+#if defined(OS_FUCHSIA)
+  return CertVerifyProc::CreateBuiltinVerifyProc(/*cert_net_fetcher=*/nullptr);
+#elif BUILDFLAG(BUILTIN_CERT_VERIFIER_FEATURE_SUPPORTED)
+  if (base::FeatureList::IsEnabled(features::kCertVerifierBuiltinFeature)) {
+    return CertVerifyProc::CreateBuiltinVerifyProc(
+        /*cert_net_fetcher=*/nullptr);
+  } else {
+    return CertVerifyProc::CreateSystemVerifyProc(/*cert_net_fetcher=*/nullptr);
+  }
+#else
+  return CertVerifyProc::CreateSystemVerifyProc(/*cert_net_fetcher=*/nullptr);
+#endif
+}
+
 }  // namespace
 
 // Test basic functionality when adding from an existing X509Certificate.
@@ -89,8 +105,7 @@
   // certificate should not yet be trusted.
   int flags = 0;
   CertVerifyResult bad_verify_result;
-  scoped_refptr<CertVerifyProc> verify_proc(
-      CertVerifyProc::CreateDefault(/*cert_net_fetcher=*/nullptr));
+  scoped_refptr<CertVerifyProc> verify_proc(CreateCertVerifyProc());
   int bad_status = verify_proc->Verify(
       test_cert.get(), "127.0.0.1", /*ocsp_response=*/std::string(),
       /*sct_list=*/std::string(), flags, net::CRLSet::BuiltinCRLSet().get(),
diff --git a/net/log/net_log_event_type_list.h b/net/log/net_log_event_type_list.h
index a98dddf..401b3c6 100644
--- a/net/log/net_log_event_type_list.h
+++ b/net/log/net_log_event_type_list.h
@@ -1327,6 +1327,13 @@
 //   }
 EVENT_TYPE(BIDIRECTIONAL_STREAM_FAILED)
 
+// Identifies the NetLogSource() for the QuicSession that handled the stream.
+// The event parameters are:
+//   {
+//      "source_dependency": <Source identifier for session that was used>,
+//   }
+EVENT_TYPE(BIDIRECTIONAL_STREAM_BOUND_TO_QUIC_SESSION)
+
 // ------------------------------------------------------------------------
 // SERVER_PUSH_LOOKUP_TRANSACTION
 // ------------------------------------------------------------------------
@@ -2080,7 +2087,7 @@
 //   }
 EVENT_TYPE(QUIC_HTTP_STREAM_ADOPTED_PUSH_STREAM)
 
-// Identifies the NetLogSource() for the QuicSesssion that handled the stream.
+// Identifies the NetLogSource() for the QuicSession that handled the stream.
 // The event parameters are:
 //   {
 //      "source_dependency": <Source identifier for session that was used>,
diff --git a/net/quic/bidirectional_stream_quic_impl.cc b/net/quic/bidirectional_stream_quic_impl.cc
index 8e592b8..5d7285e 100644
--- a/net/quic/bidirectional_stream_quic_impl.cc
+++ b/net/quic/bidirectional_stream_quic_impl.cc
@@ -76,6 +76,10 @@
   DLOG_IF(WARNING, !session_->IsConnected())
       << "Trying to start request headers after session has been closed.";
 
+  net_log.AddEventReferencingSource(
+      NetLogEventType::BIDIRECTIONAL_STREAM_BOUND_TO_QUIC_SESSION,
+      session_->net_log().source());
+
   send_request_headers_automatically_ = send_request_headers_automatically;
   delegate_ = delegate;
   request_info_ = request_info;
diff --git a/net/quic/quic_connection_logger.cc b/net/quic/quic_connection_logger.cc
index 7845dcc..9150434 100644
--- a/net/quic/quic_connection_logger.cc
+++ b/net/quic/quic_connection_logger.cc
@@ -56,9 +56,9 @@
               NetLogNumberValue(serialized_packet.packet_number.ToUint64()));
   dict.SetIntKey("size", serialized_packet.encrypted_length);
   dict.SetKey("sent_time_us", NetLogNumberValue(sent_time.ToDebuggingValue()));
-  dict.SetStringKey("encryption_level",
-                    quic::QuicUtils::EncryptionLevelToString(
-                        serialized_packet.encryption_level));
+  dict.SetStringKey(
+      "encryption_level",
+      quic::EncryptionLevelToString(serialized_packet.encryption_level));
   return dict;
 }
 
@@ -250,7 +250,7 @@
                                         bool has_buffer) {
   base::Value dict(base::Value::Type::DICTIONARY);
   dict.SetStringKey("encryption_level",
-                    quic::QuicUtils::EncryptionLevelToString(frame->level));
+                    quic::EncryptionLevelToString(frame->level));
   dict.SetIntKey("data_length", frame->data_length);
   dict.SetKey("offset", NetLogNumberValue(frame->offset));
   if (has_buffer) {
diff --git a/net/quic/quic_test_packet_maker.cc b/net/quic/quic_test_packet_maker.cc
index 9a815318..b03014b 100644
--- a/net/quic/quic_test_packet_maker.cc
+++ b/net/quic/quic_test_packet_maker.cc
@@ -1330,7 +1330,7 @@
         long_header_type_ = quic::INVALID_PACKET_TYPE;
         break;
       default:
-        QUIC_BUG << quic::QuicUtils::EncryptionLevelToString(level);
+        QUIC_BUG << quic::EncryptionLevelToString(level);
         long_header_type_ = quic::INVALID_PACKET_TYPE;
     }
 }
diff --git a/net/reporting/reporting_cache.h b/net/reporting/reporting_cache.h
index 1eb28b9..bf8f565f 100644
--- a/net/reporting/reporting_cache.h
+++ b/net/reporting/reporting_cache.h
@@ -22,6 +22,7 @@
 
 namespace net {
 
+class NetworkIsolationKey;
 class ReportingContext;
 
 // The cache holds undelivered reports and clients (per-origin endpoint
@@ -189,6 +190,7 @@
   // name |group| with include_subdomains enabled, this method would return
   // endpoints from that group from the earliest-inserted origin.
   virtual std::vector<ReportingEndpoint> GetCandidateEndpointsForDelivery(
+      const NetworkIsolationKey& network_isolation_key,
       const url::Origin& origin,
       const std::string& group_name) = 0;
 
diff --git a/net/reporting/reporting_cache_impl.cc b/net/reporting/reporting_cache_impl.cc
index 8c6df6f..e471f42 100644
--- a/net/reporting/reporting_cache_impl.cc
+++ b/net/reporting/reporting_cache_impl.cc
@@ -492,12 +492,14 @@
 
 std::vector<ReportingEndpoint>
 ReportingCacheImpl::GetCandidateEndpointsForDelivery(
+    const NetworkIsolationKey& network_isolation_key,
     const url::Origin& origin,
     const std::string& group_name) {
   base::Time now = clock().Now();
   SanityCheckClients();
 
   // Look for an exact origin match for |origin| and |group|.
+  // TODO(mmenke): Respect NetworkIsolationKey.
   EndpointGroupMap::iterator group_it =
       FindEndpointGroupIt(ReportingEndpointGroupKey(origin, group_name));
   if (group_it != endpoint_groups_.end() && group_it->second.expires > now) {
diff --git a/net/reporting/reporting_cache_impl.h b/net/reporting/reporting_cache_impl.h
index ac8ca7b..7e73755 100644
--- a/net/reporting/reporting_cache_impl.h
+++ b/net/reporting/reporting_cache_impl.h
@@ -29,6 +29,8 @@
 
 namespace net {
 
+class NetworkIsolationKey;
+
 class ReportingCacheImpl : public ReportingCache {
  public:
   ReportingCacheImpl(ReportingContext* context);
@@ -80,6 +82,7 @@
       std::vector<CachedReportingEndpointGroup> loaded_endpoint_groups)
       override;
   std::vector<ReportingEndpoint> GetCandidateEndpointsForDelivery(
+      const NetworkIsolationKey& network_isolation_key,
       const url::Origin& origin,
       const std::string& group_name) override;
   base::Value GetClientsAsValue() const override;
diff --git a/net/reporting/reporting_cache_unittest.cc b/net/reporting/reporting_cache_unittest.cc
index 11c8716..e48c641 100644
--- a/net/reporting/reporting_cache_unittest.cc
+++ b/net/reporting/reporting_cache_unittest.cc
@@ -14,6 +14,7 @@
 #include "base/test/values_test_util.h"
 #include "base/time/time.h"
 #include "base/values.h"
+#include "net/base/network_isolation_key.h"
 #include "net/reporting/mock_persistent_reporting_store.h"
 #include "net/reporting/reporting_cache_impl.h"
 #include "net/reporting/reporting_cache_observer.h"
@@ -750,15 +751,16 @@
   ASSERT_TRUE(SetEndpointInCache(kOrigin2_, kGroup1_, kEndpoint1_, kExpires1_));
   ASSERT_TRUE(SetEndpointInCache(kOrigin2_, kGroup2_, kEndpoint2_, kExpires1_));
   std::vector<ReportingEndpoint> candidate_endpoints =
-      cache()->GetCandidateEndpointsForDelivery(kOrigin1_, kGroup1_);
+      cache()->GetCandidateEndpointsForDelivery(NetworkIsolationKey(),
+                                                kOrigin1_, kGroup1_);
   ASSERT_EQ(2u, candidate_endpoints.size());
   for (const ReportingEndpoint& endpoint : candidate_endpoints) {
     EXPECT_EQ(kOrigin1_, endpoint.group_key.origin);
     EXPECT_EQ(kGroup1_, endpoint.group_key.group_name);
   }
 
-  candidate_endpoints =
-      cache()->GetCandidateEndpointsForDelivery(kOrigin2_, kGroup1_);
+  candidate_endpoints = cache()->GetCandidateEndpointsForDelivery(
+      NetworkIsolationKey(), kOrigin2_, kGroup1_);
   ASSERT_EQ(1u, candidate_endpoints.size());
   EXPECT_EQ(kOrigin2_, candidate_endpoints[0].group_key.origin);
   EXPECT_EQ(kGroup1_, candidate_endpoints[0].group_key.group_name);
@@ -777,15 +779,16 @@
   ASSERT_LT(clock()->Now(), kExpires2_);
 
   std::vector<ReportingEndpoint> candidate_endpoints =
-      cache()->GetCandidateEndpointsForDelivery(kOrigin1_, kGroup1_);
+      cache()->GetCandidateEndpointsForDelivery(NetworkIsolationKey(),
+                                                kOrigin1_, kGroup1_);
   ASSERT_EQ(0u, candidate_endpoints.size());
 
-  candidate_endpoints =
-      cache()->GetCandidateEndpointsForDelivery(kOrigin2_, kGroup1_);
+  candidate_endpoints = cache()->GetCandidateEndpointsForDelivery(
+      NetworkIsolationKey(), kOrigin2_, kGroup1_);
   ASSERT_EQ(0u, candidate_endpoints.size());
 
-  candidate_endpoints =
-      cache()->GetCandidateEndpointsForDelivery(kOrigin2_, kGroup2_);
+  candidate_endpoints = cache()->GetCandidateEndpointsForDelivery(
+      NetworkIsolationKey(), kOrigin2_, kGroup2_);
   ASSERT_EQ(1u, candidate_endpoints.size());
   EXPECT_EQ(kEndpoint2_, candidate_endpoints[0].info.url);
 }
@@ -801,7 +804,8 @@
                                  kExpires1_, OriginSubdomains::EXCLUDE));
 
   std::vector<ReportingEndpoint> candidate_endpoints =
-      cache()->GetCandidateEndpointsForDelivery(kOrigin, kGroup1_);
+      cache()->GetCandidateEndpointsForDelivery(NetworkIsolationKey(), kOrigin,
+                                                kGroup1_);
   ASSERT_EQ(0u, candidate_endpoints.size());
 }
 
@@ -816,7 +820,8 @@
                                  kExpires1_, OriginSubdomains::EXCLUDE));
 
   std::vector<ReportingEndpoint> candidate_endpoints =
-      cache()->GetCandidateEndpointsForDelivery(kOrigin, kGroup1_);
+      cache()->GetCandidateEndpointsForDelivery(NetworkIsolationKey(), kOrigin,
+                                                kGroup1_);
   ASSERT_EQ(0u, candidate_endpoints.size());
 }
 
@@ -831,7 +836,8 @@
                                  kExpires1_, OriginSubdomains::INCLUDE));
 
   std::vector<ReportingEndpoint> candidate_endpoints =
-      cache()->GetCandidateEndpointsForDelivery(kOrigin, kGroup1_);
+      cache()->GetCandidateEndpointsForDelivery(NetworkIsolationKey(), kOrigin,
+                                                kGroup1_);
   ASSERT_EQ(1u, candidate_endpoints.size());
   EXPECT_EQ(kDifferentPortOrigin, candidate_endpoints[0].group_key.origin);
 }
@@ -847,7 +853,8 @@
                                  kExpires1_, OriginSubdomains::INCLUDE));
 
   std::vector<ReportingEndpoint> candidate_endpoints =
-      cache()->GetCandidateEndpointsForDelivery(kOrigin, kGroup1_);
+      cache()->GetCandidateEndpointsForDelivery(NetworkIsolationKey(), kOrigin,
+                                                kGroup1_);
   ASSERT_EQ(1u, candidate_endpoints.size());
   EXPECT_EQ(kSuperOrigin, candidate_endpoints[0].group_key.origin);
 }
@@ -865,7 +872,8 @@
                                  kExpires1_, OriginSubdomains::INCLUDE));
 
   std::vector<ReportingEndpoint> candidate_endpoints =
-      cache()->GetCandidateEndpointsForDelivery(kOrigin, kGroup1_);
+      cache()->GetCandidateEndpointsForDelivery(NetworkIsolationKey(), kOrigin,
+                                                kGroup1_);
   ASSERT_EQ(1u, candidate_endpoints.size());
   EXPECT_EQ(kOrigin, candidate_endpoints[0].group_key.origin);
 }
@@ -883,7 +891,8 @@
                                  kExpires1_, OriginSubdomains::INCLUDE));
 
   std::vector<ReportingEndpoint> candidate_endpoints =
-      cache()->GetCandidateEndpointsForDelivery(kOrigin, kGroup1_);
+      cache()->GetCandidateEndpointsForDelivery(NetworkIsolationKey(), kOrigin,
+                                                kGroup1_);
   ASSERT_EQ(1u, candidate_endpoints.size());
   EXPECT_EQ(kOrigin, candidate_endpoints[0].group_key.origin);
 }
@@ -904,7 +913,8 @@
                                  kExpires1_, OriginSubdomains::INCLUDE));
 
   std::vector<ReportingEndpoint> candidate_endpoints =
-      cache()->GetCandidateEndpointsForDelivery(kOrigin, kGroup1_);
+      cache()->GetCandidateEndpointsForDelivery(NetworkIsolationKey(), kOrigin,
+                                                kGroup1_);
   ASSERT_EQ(1u, candidate_endpoints.size());
   EXPECT_EQ(kSuperOrigin, candidate_endpoints[0].group_key.origin);
 }
@@ -1005,7 +1015,8 @@
 
   // Make the group expired (but not stale).
   clock()->SetNow(kExpires1_ - base::TimeDelta::FromMinutes(1));
-  cache()->GetCandidateEndpointsForDelivery(kOrigin1_, kGroup1_);
+  cache()->GetCandidateEndpointsForDelivery(NetworkIsolationKey(), kOrigin1_,
+                                            kGroup1_);
   clock()->SetNow(kExpires1_ + base::TimeDelta::FromMinutes(1));
 
   // Insert one more endpoint in a different group (not expired); eviction
@@ -1054,7 +1065,7 @@
     EXPECT_TRUE(EndpointGroupExistsInCache(kOrigin1_, base::NumberToString(i),
                                            OriginSubdomains::DEFAULT));
     // Mark group used.
-    cache()->GetCandidateEndpointsForDelivery(kOrigin1_,
+    cache()->GetCandidateEndpointsForDelivery(NetworkIsolationKey(), kOrigin1_,
                                               base::NumberToString(i));
     clock()->Advance(base::TimeDelta::FromMinutes(1));
   }
@@ -1098,7 +1109,8 @@
                                          OriginSubdomains::DEFAULT));
   // Count the number of endpoints remaining in kGroup2_.
   std::vector<ReportingEndpoint> endpoints_in_group =
-      cache()->GetCandidateEndpointsForDelivery(kOrigin1_, kGroup2_);
+      cache()->GetCandidateEndpointsForDelivery(NetworkIsolationKey(),
+                                                kOrigin1_, kGroup2_);
   EXPECT_EQ(1u, endpoints_in_group.size());
 }
 
diff --git a/net/reporting/reporting_context.cc b/net/reporting/reporting_context.cc
index b74f32d..b959f7fc 100644
--- a/net/reporting/reporting_context.cc
+++ b/net/reporting/reporting_context.cc
@@ -19,7 +19,6 @@
 #include "net/reporting/reporting_cache_observer.h"
 #include "net/reporting/reporting_delegate.h"
 #include "net/reporting/reporting_delivery_agent.h"
-#include "net/reporting/reporting_endpoint_manager.h"
 #include "net/reporting/reporting_garbage_collector.h"
 #include "net/reporting/reporting_network_change_observer.h"
 #include "net/reporting/reporting_policy.h"
@@ -104,8 +103,7 @@
       delegate_(std::move(delegate)),
       cache_(ReportingCache::Create(this)),
       store_(store),
-      endpoint_manager_(ReportingEndpointManager::Create(this, rand_callback)),
-      delivery_agent_(ReportingDeliveryAgent::Create(this)),
+      delivery_agent_(ReportingDeliveryAgent::Create(this, rand_callback)),
       garbage_collector_(ReportingGarbageCollector::Create(this)),
       network_change_observer_(ReportingNetworkChangeObserver::Create(this)) {}
 
diff --git a/net/reporting/reporting_context.h b/net/reporting/reporting_context.h
index b418868..e0bb4aa 100644
--- a/net/reporting/reporting_context.h
+++ b/net/reporting/reporting_context.h
@@ -25,7 +25,6 @@
 class ReportingCacheObserver;
 class ReportingDelegate;
 class ReportingDeliveryAgent;
-class ReportingEndpointManager;
 class ReportingGarbageCollector;
 class ReportingNetworkChangeObserver;
 class ReportingUploader;
@@ -51,9 +50,6 @@
   ReportingDelegate* delegate() { return delegate_.get(); }
   ReportingCache* cache() { return cache_.get(); }
   ReportingCache::PersistentReportingStore* store() { return store_; }
-  ReportingEndpointManager* endpoint_manager() {
-    return endpoint_manager_.get();
-  }
   ReportingDeliveryAgent* delivery_agent() { return delivery_agent_.get(); }
   ReportingGarbageCollector* garbage_collector() {
     return garbage_collector_.get();
@@ -97,11 +93,8 @@
 
   ReportingCache::PersistentReportingStore* const store_;
 
-  // |endpoint_manager_| must come after |tick_clock_| and |cache_|.
-  std::unique_ptr<ReportingEndpointManager> endpoint_manager_;
-
   // |delivery_agent_| must come after |tick_clock_|, |delegate_|, |uploader_|,
-  // |cache_|, and |endpoint_manager_|.
+  // and |cache_|.
   std::unique_ptr<ReportingDeliveryAgent> delivery_agent_;
 
   // |garbage_collector_| must come after |tick_clock_| and |cache_|.
diff --git a/net/reporting/reporting_delivery_agent.cc b/net/reporting/reporting_delivery_agent.cc
index 19e6b2e..0c64f3c 100644
--- a/net/reporting/reporting_delivery_agent.cc
+++ b/net/reporting/reporting_delivery_agent.cc
@@ -16,8 +16,10 @@
 #include "base/time/tick_clock.h"
 #include "base/timer/timer.h"
 #include "base/values.h"
+#include "net/base/network_isolation_key.h"
 #include "net/reporting/reporting_cache.h"
 #include "net/reporting/reporting_cache_observer.h"
+#include "net/reporting/reporting_context.h"
 #include "net/reporting/reporting_delegate.h"
 #include "net/reporting/reporting_endpoint_manager.h"
 #include "net/reporting/reporting_report.h"
@@ -54,8 +56,16 @@
 class ReportingDeliveryAgentImpl : public ReportingDeliveryAgent,
                                    public ReportingCacheObserver {
  public:
-  ReportingDeliveryAgentImpl(ReportingContext* context)
-      : context_(context), timer_(std::make_unique<base::OneShotTimer>()) {
+  ReportingDeliveryAgentImpl(ReportingContext* context,
+                             const RandIntCallback& rand_callback)
+      : context_(context),
+        timer_(std::make_unique<base::OneShotTimer>()),
+        endpoint_manager_(
+            ReportingEndpointManager::Create(&context->policy(),
+                                             &context->tick_clock(),
+                                             context->delegate(),
+                                             context->cache(),
+                                             rand_callback)) {
     context_->AddCacheObserver(this);
   }
 
@@ -171,8 +181,10 @@
       if (base::Contains(pending_origin_groups_, origin_group))
         continue;
 
+      // TODO(mmenke): Populate NetworkIsolationKey argument.
       const ReportingEndpoint endpoint =
-          endpoint_manager()->FindEndpointForDelivery(report_origin, group);
+          endpoint_manager_->FindEndpointForDelivery(NetworkIsolationKey(),
+                                                     report_origin, group);
       if (!endpoint) {
         // TODO(chlily): Remove reports for which there are no valid
         // delivery endpoints.
@@ -242,10 +254,14 @@
     if (outcome == ReportingUploader::Outcome::SUCCESS) {
       cache()->RemoveReports(delivery->reports,
                              ReportingReport::Outcome::DELIVERED);
-      endpoint_manager()->InformOfEndpointRequest(delivery->endpoint, true);
+      // TODO(mmenke): Populate NetworkIsolationKey argument.
+      endpoint_manager_->InformOfEndpointRequest(NetworkIsolationKey(),
+                                                 delivery->endpoint, true);
     } else {
       cache()->IncrementReportsAttempts(delivery->reports);
-      endpoint_manager()->InformOfEndpointRequest(delivery->endpoint, false);
+      // TODO(mmenke): Populate NetworkIsolationKey argument.
+      endpoint_manager_->InformOfEndpointRequest(NetworkIsolationKey(),
+                                                 delivery->endpoint, false);
     }
 
     if (outcome == ReportingUploader::Outcome::REMOVE_ENDPOINT)
@@ -264,9 +280,6 @@
   ReportingDelegate* delegate() { return context_->delegate(); }
   ReportingCache* cache() { return context_->cache(); }
   ReportingUploader* uploader() { return context_->uploader(); }
-  ReportingEndpointManager* endpoint_manager() {
-    return context_->endpoint_manager();
-  }
 
   ReportingContext* context_;
 
@@ -276,6 +289,8 @@
   // (Would be an unordered_set, but there's no hash on pair.)
   std::set<OriginGroup> pending_origin_groups_;
 
+  std::unique_ptr<ReportingEndpointManager> endpoint_manager_;
+
   base::WeakPtrFactory<ReportingDeliveryAgentImpl> weak_factory_{this};
 
   DISALLOW_COPY_AND_ASSIGN(ReportingDeliveryAgentImpl);
@@ -285,8 +300,9 @@
 
 // static
 std::unique_ptr<ReportingDeliveryAgent> ReportingDeliveryAgent::Create(
-    ReportingContext* context) {
-  return std::make_unique<ReportingDeliveryAgentImpl>(context);
+    ReportingContext* context,
+    const RandIntCallback& rand_callback) {
+  return std::make_unique<ReportingDeliveryAgentImpl>(context, rand_callback);
 }
 
 ReportingDeliveryAgent::~ReportingDeliveryAgent() = default;
diff --git a/net/reporting/reporting_delivery_agent.h b/net/reporting/reporting_delivery_agent.h
index bd15443..b857fd1 100644
--- a/net/reporting/reporting_delivery_agent.h
+++ b/net/reporting/reporting_delivery_agent.h
@@ -9,6 +9,7 @@
 
 #include "base/macros.h"
 #include "net/base/net_export.h"
+#include "net/base/rand_callback.h"
 
 namespace base {
 class OneShotTimer;
@@ -51,7 +52,8 @@
  public:
   // Creates a ReportingDeliveryAgent. |context| must outlive the agent.
   static std::unique_ptr<ReportingDeliveryAgent> Create(
-      ReportingContext* context);
+      ReportingContext* context,
+      const RandIntCallback& rand_callback);
 
   virtual ~ReportingDeliveryAgent();
 
diff --git a/net/reporting/reporting_endpoint_manager.cc b/net/reporting/reporting_endpoint_manager.cc
index 8ed18fa..bd0d0e2 100644
--- a/net/reporting/reporting_endpoint_manager.cc
+++ b/net/reporting/reporting_endpoint_manager.cc
@@ -7,6 +7,7 @@
 #include <map>
 #include <set>
 #include <string>
+#include <utility>
 #include <vector>
 
 #include "base/logging.h"
@@ -15,6 +16,7 @@
 #include "base/stl_util.h"
 #include "base/time/tick_clock.h"
 #include "net/base/backoff_entry.h"
+#include "net/base/network_isolation_key.h"
 #include "net/base/rand_callback.h"
 #include "net/reporting/reporting_cache.h"
 #include "net/reporting/reporting_delegate.h"
@@ -29,19 +31,33 @@
 
 class ReportingEndpointManagerImpl : public ReportingEndpointManager {
  public:
-  ReportingEndpointManagerImpl(ReportingContext* context,
+  ReportingEndpointManagerImpl(const ReportingPolicy* policy,
+                               const base::TickClock* tick_clock,
+                               const ReportingDelegate* delegate,
+                               ReportingCache* cache,
                                const RandIntCallback& rand_callback)
-      : context_(context), rand_callback_(rand_callback) {}
+      : policy_(policy),
+        tick_clock_(tick_clock),
+        delegate_(delegate),
+        cache_(cache),
+        rand_callback_(rand_callback) {
+    DCHECK(policy);
+    DCHECK(tick_clock);
+    DCHECK(delegate);
+    DCHECK(cache);
+  }
 
   ~ReportingEndpointManagerImpl() override = default;
 
   const ReportingEndpoint FindEndpointForDelivery(
+      const NetworkIsolationKey& network_isolation_key,
       const url::Origin& origin,
       const std::string& group) override {
     // Get unexpired endpoints that apply to a delivery to |origin| and |group|.
     // May have been configured by a superdomain of |origin|.
     std::vector<ReportingEndpoint> endpoints =
-        cache()->GetCandidateEndpointsForDelivery(origin, group);
+        cache_->GetCandidateEndpointsForDelivery(network_isolation_key, origin,
+                                                 group);
 
     // Highest-priority endpoint(s) that are not expired, failing, or
     // forbidden for use by the ReportingDelegate.
@@ -50,12 +66,15 @@
     int total_weight = 0;
 
     for (const ReportingEndpoint endpoint : endpoints) {
-      if (base::Contains(endpoint_backoff_, endpoint.info.url) &&
-          endpoint_backoff_[endpoint.info.url]->ShouldRejectRequest()) {
+      auto endpoint_backoff_it = endpoint_backoff_.find(
+          EndpointBackoffKey(network_isolation_key, endpoint.info.url));
+      if (endpoint_backoff_it != endpoint_backoff_.end() &&
+          endpoint_backoff_it->second->ShouldRejectRequest()) {
         continue;
       }
-      if (!delegate()->CanUseClient(endpoint.group_key.origin,
-                                    endpoint.info.url)) {
+
+      if (!delegate_->CanUseClient(endpoint.group_key.origin,
+                                   endpoint.info.url)) {
         continue;
       }
 
@@ -101,21 +120,29 @@
     return ReportingEndpoint();
   }
 
-  void InformOfEndpointRequest(const GURL& endpoint, bool succeeded) override {
-    if (!base::Contains(endpoint_backoff_, endpoint)) {
-      endpoint_backoff_[endpoint] = std::make_unique<BackoffEntry>(
-          &policy().endpoint_backoff_policy, &tick_clock());
+  void InformOfEndpointRequest(const NetworkIsolationKey& network_isolation_key,
+                               const GURL& endpoint,
+                               bool succeeded) override {
+    EndpointBackoffKey endpoint_backoff_key(network_isolation_key, endpoint);
+    auto endpoint_backoff_it = endpoint_backoff_.find(endpoint_backoff_key);
+    if (endpoint_backoff_it == endpoint_backoff_.end()) {
+      endpoint_backoff_it =
+          endpoint_backoff_
+              .emplace(std::move(endpoint_backoff_key),
+                       std::make_unique<BackoffEntry>(
+                           &policy_->endpoint_backoff_policy, tick_clock_))
+              .first;
     }
-    endpoint_backoff_[endpoint]->InformOfRequest(succeeded);
+    endpoint_backoff_it->second->InformOfRequest(succeeded);
   }
 
  private:
-  const ReportingPolicy& policy() const { return context_->policy(); }
-  const base::TickClock& tick_clock() const { return context_->tick_clock(); }
-  ReportingDelegate* delegate() { return context_->delegate(); }
-  ReportingCache* cache() { return context_->cache(); }
+  using EndpointBackoffKey = std::pair<NetworkIsolationKey, GURL>;
 
-  ReportingContext* context_;
+  const ReportingPolicy* const policy_;
+  const base::TickClock* const tick_clock_;
+  const ReportingDelegate* const delegate_;
+  ReportingCache* const cache_;
 
   RandIntCallback rand_callback_;
 
@@ -124,7 +151,8 @@
   // to be cleared as well.
   // TODO(chlily): clear this data when endpoints are deleted to avoid unbounded
   // growth of this map.
-  std::map<GURL, std::unique_ptr<net::BackoffEntry>> endpoint_backoff_;
+  std::map<EndpointBackoffKey, std::unique_ptr<net::BackoffEntry>>
+      endpoint_backoff_;
 
   DISALLOW_COPY_AND_ASSIGN(ReportingEndpointManagerImpl);
 };
@@ -133,9 +161,13 @@
 
 // static
 std::unique_ptr<ReportingEndpointManager> ReportingEndpointManager::Create(
-    ReportingContext* context,
+    const ReportingPolicy* policy,
+    const base::TickClock* tick_clock,
+    const ReportingDelegate* delegate,
+    ReportingCache* cache,
     const RandIntCallback& rand_callback) {
-  return std::make_unique<ReportingEndpointManagerImpl>(context, rand_callback);
+  return std::make_unique<ReportingEndpointManagerImpl>(
+      policy, tick_clock, delegate, cache, rand_callback);
 }
 
 ReportingEndpointManager::~ReportingEndpointManager() = default;
diff --git a/net/reporting/reporting_endpoint_manager.h b/net/reporting/reporting_endpoint_manager.h
index fca35f1..84d49d0 100644
--- a/net/reporting/reporting_endpoint_manager.h
+++ b/net/reporting/reporting_endpoint_manager.h
@@ -11,26 +11,37 @@
 #include "base/macros.h"
 #include "net/base/net_export.h"
 #include "net/base/rand_callback.h"
-#include "net/reporting/reporting_context.h"
 
 class GURL;
 
+namespace base {
+class TickClock;
+}
+
 namespace url {
 class Origin;
 }  // namespace url
 
 namespace net {
 
+class NetworkIsolationKey;
+class ReportingCache;
+class ReportingDelegate;
 struct ReportingEndpoint;
+struct ReportingPolicy;
 
 // Keeps track of which endpoints are pending (have active delivery attempts to
 // them) or in exponential backoff after one or more failures, and chooses an
 // endpoint from an endpoint group to receive reports for an origin.
 class NET_EXPORT ReportingEndpointManager {
  public:
-  // |context| must outlive the ReportingEndpointManager.
+  // The ReportingEndpointManager must not be used after any of the objects
+  // passed to its constructor are destroyed.
   static std::unique_ptr<ReportingEndpointManager> Create(
-      ReportingContext* context,
+      const ReportingPolicy* policy,
+      const base::TickClock* tick_clock,
+      const ReportingDelegate* delegate,
+      ReportingCache* cache,
       const RandIntCallback& rand_callback);
 
   virtual ~ReportingEndpointManager();
@@ -43,13 +54,16 @@
   // If no suitable endpoint was found, returns an endpoint with is_valid()
   // false.
   virtual const ReportingEndpoint FindEndpointForDelivery(
+      const NetworkIsolationKey& network_isolation_key,
       const url::Origin& origin,
       const std::string& group) = 0;
 
   // Informs the EndpointManager of a successful or unsuccessful request made to
   // |endpoint| so it can manage exponential backoff of failing endpoints.
-  virtual void InformOfEndpointRequest(const GURL& endpoint,
-                                       bool succeeded) = 0;
+  virtual void InformOfEndpointRequest(
+      const NetworkIsolationKey& network_isolation_key,
+      const GURL& endpoint,
+      bool succeeded) = 0;
 };
 
 }  // namespace net
diff --git a/net/reporting/reporting_endpoint_manager_unittest.cc b/net/reporting/reporting_endpoint_manager_unittest.cc
index fd1361da..68801b4 100644
--- a/net/reporting/reporting_endpoint_manager_unittest.cc
+++ b/net/reporting/reporting_endpoint_manager_unittest.cc
@@ -9,6 +9,7 @@
 #include "base/test/simple_test_tick_clock.h"
 #include "base/time/time.h"
 #include "net/base/backoff_entry.h"
+#include "net/base/network_isolation_key.h"
 #include "net/reporting/reporting_cache.h"
 #include "net/reporting/reporting_endpoint.h"
 #include "net/reporting/reporting_policy.h"
@@ -20,122 +21,282 @@
 namespace net {
 namespace {
 
-class ReportingEndpointManagerTest : public ReportingTestBase {
+class TestReportingCache : public ReportingCache {
  public:
-  ReportingEndpointManagerTest() {
-    ReportingPolicy policy;
-    policy.endpoint_backoff_policy.num_errors_to_ignore = 0;
-    policy.endpoint_backoff_policy.initial_delay_ms = 60000;
-    policy.endpoint_backoff_policy.multiply_factor = 2.0;
-    policy.endpoint_backoff_policy.jitter_factor = 0.0;
-    policy.endpoint_backoff_policy.maximum_backoff_ms = -1;
-    policy.endpoint_backoff_policy.entry_lifetime_ms = 0;
-    policy.endpoint_backoff_policy.always_use_initial_delay = false;
-    UsePolicy(policy);
+  class PersistentReportingStore;
+
+  // Tests using this class only use one origin/group.
+  TestReportingCache(const url::Origin& expected_origin,
+                     const std::string& expected_group)
+      : expected_origin_(expected_origin), expected_group_(expected_group) {}
+  ~TestReportingCache() override = default;
+
+  void SetEndpoint(const NetworkIsolationKey& network_isolation_key,
+                   const ReportingEndpoint& reporting_endpoint) {
+    reporting_endpoints_[network_isolation_key].push_back(reporting_endpoint);
+  }
+
+  // ReportingCache implementation:
+
+  std::vector<ReportingEndpoint> GetCandidateEndpointsForDelivery(
+      const NetworkIsolationKey& network_isolation_key,
+      const url::Origin& origin,
+      const std::string& group_name) override {
+    EXPECT_EQ(expected_origin_, origin);
+    EXPECT_EQ(expected_group_, group_name);
+    return reporting_endpoints_[network_isolation_key];
+  }
+
+  // Everything below is NOTREACHED.
+  void AddReport(const GURL& url,
+                 const std::string& user_agent,
+                 const std::string& group_name,
+                 const std::string& type,
+                 std::unique_ptr<const base::Value> body,
+                 int depth,
+                 base::TimeTicks queued,
+                 int attempts) override {
+    NOTREACHED();
+  }
+  void GetReports(
+      std::vector<const ReportingReport*>* reports_out) const override {
+    NOTREACHED();
+  }
+  base::Value GetReportsAsValue() const override {
+    NOTREACHED();
+    return base::Value();
+  }
+  void GetNonpendingReports(
+      std::vector<const ReportingReport*>* reports_out) const override {
+    NOTREACHED();
+  }
+  void SetReportsPending(
+      const std::vector<const ReportingReport*>& reports) override {
+    NOTREACHED();
+  }
+  void ClearReportsPending(
+      const std::vector<const ReportingReport*>& reports) override {
+    NOTREACHED();
+  }
+  void IncrementReportsAttempts(
+      const std::vector<const ReportingReport*>& reports) override {
+    NOTREACHED();
+  }
+  void IncrementEndpointDeliveries(const url::Origin& origin,
+                                   const std::string& group_name,
+                                   const GURL& url,
+                                   int reports_delivered,
+                                   bool successful) override {
+    NOTREACHED();
+  }
+  void RemoveReports(const std::vector<const ReportingReport*>& reports,
+                     ReportingReport::Outcome outcome) override {
+    NOTREACHED();
+  }
+  void RemoveAllReports(ReportingReport::Outcome outcome) override {
+    NOTREACHED();
+  }
+  size_t GetFullReportCountForTesting() const override {
+    NOTREACHED();
+    return 0;
+  }
+  bool IsReportPendingForTesting(const ReportingReport* report) const override {
+    NOTREACHED();
+    return false;
+  }
+  bool IsReportDoomedForTesting(const ReportingReport* report) const override {
+    NOTREACHED();
+    return false;
+  }
+  void OnParsedHeader(
+      const url::Origin& origin,
+      std::vector<ReportingEndpointGroup> parsed_header) override {
+    NOTREACHED();
+  }
+  std::vector<url::Origin> GetAllOrigins() const override {
+    NOTREACHED();
+    return std::vector<url::Origin>();
+  }
+  void RemoveClient(const url::Origin& origin) override { NOTREACHED(); }
+  void RemoveAllClients() override { NOTREACHED(); }
+  void RemoveEndpointGroup(const url::Origin& origin,
+                           const std::string& group_name) override {
+    NOTREACHED();
+  }
+  void RemoveEndpointsForUrl(const GURL& url) override { NOTREACHED(); }
+  void AddClientsLoadedFromStore(
+      std::vector<ReportingEndpoint> loaded_endpoints,
+      std::vector<CachedReportingEndpointGroup> loaded_endpoint_groups)
+      override {
+    NOTREACHED();
+  }
+  base::Value GetClientsAsValue() const override {
+    NOTREACHED();
+    return base::Value();
+  }
+  size_t GetEndpointCount() const override {
+    NOTREACHED();
+    return 0;
+  }
+  void Flush() override { NOTREACHED(); }
+  ReportingEndpoint GetEndpointForTesting(const url::Origin& origin,
+                                          const std::string& group_name,
+                                          const GURL& url) const override {
+    NOTREACHED();
+    return ReportingEndpoint();
+  }
+  bool EndpointGroupExistsForTesting(const url::Origin& origin,
+                                     const std::string& group_name,
+                                     OriginSubdomains include_subdomains,
+                                     base::Time expires) const override {
+    NOTREACHED();
+    return false;
+  }
+  size_t GetEndpointGroupCountForTesting() const override {
+    NOTREACHED();
+    return 0;
+  }
+  void SetEndpointForTesting(const url::Origin& origin,
+                             const std::string& group_name,
+                             const GURL& url,
+                             OriginSubdomains include_subdomains,
+                             base::Time expires,
+                             int priority,
+                             int weight) override {
+    NOTREACHED();
+  }
+
+ private:
+  const url::Origin expected_origin_;
+  const std::string expected_group_;
+
+  std::map<NetworkIsolationKey, std::vector<ReportingEndpoint>>
+      reporting_endpoints_;
+
+  DISALLOW_COPY_AND_ASSIGN(TestReportingCache);
+};
+
+class ReportingEndpointManagerTest : public testing::Test {
+ public:
+  ReportingEndpointManagerTest() : cache_(kOrigin, kGroup) {
+    policy_.endpoint_backoff_policy.num_errors_to_ignore = 0;
+    policy_.endpoint_backoff_policy.initial_delay_ms = 60000;
+    policy_.endpoint_backoff_policy.multiply_factor = 2.0;
+    policy_.endpoint_backoff_policy.jitter_factor = 0.0;
+    policy_.endpoint_backoff_policy.maximum_backoff_ms = -1;
+    policy_.endpoint_backoff_policy.entry_lifetime_ms = 0;
+    policy_.endpoint_backoff_policy.always_use_initial_delay = false;
+
+    clock_.SetNowTicks(base::TimeTicks());
+
+    endpoint_manager_ = ReportingEndpointManager::Create(
+        &policy_, &clock_, &delegate_, &cache_, TestReportingRandIntCallback());
   }
 
  protected:
   void SetEndpoint(
       const GURL& endpoint,
       int priority = ReportingEndpoint::EndpointInfo::kDefaultPriority,
-      int weight = ReportingEndpoint::EndpointInfo::kDefaultWeight) {
-    ASSERT_TRUE(
-        SetEndpointInCache(kOrigin_, kGroup_, endpoint,
-                           base::Time::Now() + base::TimeDelta::FromDays(1),
-                           OriginSubdomains::DEFAULT, priority, weight));
+      int weight = ReportingEndpoint::EndpointInfo::kDefaultWeight,
+      const NetworkIsolationKey& network_isolation_key =
+          NetworkIsolationKey()) {
+    cache_.SetEndpoint(network_isolation_key,
+                       ReportingEndpoint(kOrigin, kGroup,
+                                         ReportingEndpoint::EndpointInfo{
+                                             endpoint, priority, weight}));
   }
 
-  const url::Origin kOrigin_ = url::Origin::Create(GURL("https://origin/"));
-  const GURL kEndpoint_ = GURL("https://endpoint/");
-  const std::string kGroup_ = "group";
+  const url::Origin kOrigin = url::Origin::Create(GURL("https://origin/"));
+  const std::string kGroup = "group";
+  const GURL kEndpoint = GURL("https://endpoint/");
+
+  ReportingPolicy policy_;
+  base::SimpleTestTickClock clock_;
+  TestReportingDelegate delegate_;
+  TestReportingCache cache_;
+  std::unique_ptr<ReportingEndpointManager> endpoint_manager_;
 };
 
 TEST_F(ReportingEndpointManagerTest, NoEndpoint) {
-  ReportingEndpoint endpoint =
-      endpoint_manager()->FindEndpointForDelivery(kOrigin_, kGroup_);
+  ReportingEndpoint endpoint = endpoint_manager_->FindEndpointForDelivery(
+      NetworkIsolationKey(), kOrigin, kGroup);
   EXPECT_FALSE(endpoint);
 }
 
 TEST_F(ReportingEndpointManagerTest, Endpoint) {
-  SetEndpoint(kEndpoint_);
+  SetEndpoint(kEndpoint);
 
-  ReportingEndpoint endpoint =
-      endpoint_manager()->FindEndpointForDelivery(kOrigin_, kGroup_);
+  ReportingEndpoint endpoint = endpoint_manager_->FindEndpointForDelivery(
+      NetworkIsolationKey(), kOrigin, kGroup);
   ASSERT_TRUE(endpoint);
-  EXPECT_EQ(kEndpoint_, endpoint.info.url);
-}
-
-TEST_F(ReportingEndpointManagerTest, ExpiredEndpoint) {
-  SetEndpoint(kEndpoint_);
-
-  // Default expiration is "tomorrow", so make sure we're past that.
-  clock()->Advance(base::TimeDelta::FromDays(2));
-
-  ReportingEndpoint endpoint =
-      endpoint_manager()->FindEndpointForDelivery(kOrigin_, kGroup_);
-  EXPECT_FALSE(endpoint);
+  EXPECT_EQ(kEndpoint, endpoint.info.url);
 }
 
 TEST_F(ReportingEndpointManagerTest, BackedOffEndpoint) {
-  ASSERT_EQ(2.0, policy().endpoint_backoff_policy.multiply_factor);
+  ASSERT_EQ(2.0, policy_.endpoint_backoff_policy.multiply_factor);
 
   base::TimeDelta initial_delay = base::TimeDelta::FromMilliseconds(
-      policy().endpoint_backoff_policy.initial_delay_ms);
+      policy_.endpoint_backoff_policy.initial_delay_ms);
 
-  SetEndpoint(kEndpoint_);
+  SetEndpoint(kEndpoint);
 
-  endpoint_manager()->InformOfEndpointRequest(kEndpoint_, false);
+  endpoint_manager_->InformOfEndpointRequest(NetworkIsolationKey(), kEndpoint,
+                                             false);
 
   // After one failure, endpoint is in exponential backoff.
-  ReportingEndpoint endpoint =
-      endpoint_manager()->FindEndpointForDelivery(kOrigin_, kGroup_);
+  ReportingEndpoint endpoint = endpoint_manager_->FindEndpointForDelivery(
+      NetworkIsolationKey(), kOrigin, kGroup);
   EXPECT_FALSE(endpoint);
 
   // After initial delay, endpoint is usable again.
-  tick_clock()->Advance(initial_delay);
+  clock_.Advance(initial_delay);
 
-  ReportingEndpoint endpoint2 =
-      endpoint_manager()->FindEndpointForDelivery(kOrigin_, kGroup_);
+  ReportingEndpoint endpoint2 = endpoint_manager_->FindEndpointForDelivery(
+      NetworkIsolationKey(), kOrigin, kGroup);
   ASSERT_TRUE(endpoint2);
-  EXPECT_EQ(kEndpoint_, endpoint2.info.url);
+  EXPECT_EQ(kEndpoint, endpoint2.info.url);
 
-  endpoint_manager()->InformOfEndpointRequest(kEndpoint_, false);
+  endpoint_manager_->InformOfEndpointRequest(NetworkIsolationKey(), kEndpoint,
+                                             false);
 
   // After a second failure, endpoint is backed off again.
-  ReportingEndpoint endpoint3 =
-      endpoint_manager()->FindEndpointForDelivery(kOrigin_, kGroup_);
+  ReportingEndpoint endpoint3 = endpoint_manager_->FindEndpointForDelivery(
+      NetworkIsolationKey(), kOrigin, kGroup);
   EXPECT_FALSE(endpoint3);
 
-  tick_clock()->Advance(initial_delay);
+  clock_.Advance(initial_delay);
 
   // Next backoff is longer -- 2x the first -- so endpoint isn't usable yet.
-  ReportingEndpoint endpoint4 =
-      endpoint_manager()->FindEndpointForDelivery(kOrigin_, kGroup_);
+  ReportingEndpoint endpoint4 = endpoint_manager_->FindEndpointForDelivery(
+      NetworkIsolationKey(), kOrigin, kGroup);
   EXPECT_FALSE(endpoint4);
 
-  tick_clock()->Advance(initial_delay);
+  clock_.Advance(initial_delay);
 
   // After 2x the initial delay, the endpoint is usable again.
-  ReportingEndpoint endpoint5 =
-      endpoint_manager()->FindEndpointForDelivery(kOrigin_, kGroup_);
+  ReportingEndpoint endpoint5 = endpoint_manager_->FindEndpointForDelivery(
+      NetworkIsolationKey(), kOrigin, kGroup);
   ASSERT_TRUE(endpoint5);
-  EXPECT_EQ(kEndpoint_, endpoint5.info.url);
+  EXPECT_EQ(kEndpoint, endpoint5.info.url);
 
-  endpoint_manager()->InformOfEndpointRequest(kEndpoint_, true);
-  endpoint_manager()->InformOfEndpointRequest(kEndpoint_, true);
+  endpoint_manager_->InformOfEndpointRequest(NetworkIsolationKey(), kEndpoint,
+                                             true);
+  endpoint_manager_->InformOfEndpointRequest(NetworkIsolationKey(), kEndpoint,
+                                             true);
 
   // Two more successful requests should reset the backoff to the initial delay
   // again.
-  endpoint_manager()->InformOfEndpointRequest(kEndpoint_, false);
+  endpoint_manager_->InformOfEndpointRequest(NetworkIsolationKey(), kEndpoint,
+                                             false);
 
-  ReportingEndpoint endpoint6 =
-      endpoint_manager()->FindEndpointForDelivery(kOrigin_, kGroup_);
+  ReportingEndpoint endpoint6 = endpoint_manager_->FindEndpointForDelivery(
+      NetworkIsolationKey(), kOrigin, kGroup);
   EXPECT_FALSE(endpoint6);
 
-  tick_clock()->Advance(initial_delay);
+  clock_.Advance(initial_delay);
 
-  ReportingEndpoint endpoint7 =
-      endpoint_manager()->FindEndpointForDelivery(kOrigin_, kGroup_);
+  ReportingEndpoint endpoint7 = endpoint_manager_->FindEndpointForDelivery(
+      NetworkIsolationKey(), kOrigin, kGroup);
   EXPECT_TRUE(endpoint7);
 }
 
@@ -153,8 +314,8 @@
   bool endpoint2_seen = false;
 
   for (int i = 0; i < kMaxAttempts; ++i) {
-    ReportingEndpoint endpoint =
-        endpoint_manager()->FindEndpointForDelivery(kOrigin_, kGroup_);
+    ReportingEndpoint endpoint = endpoint_manager_->FindEndpointForDelivery(
+        NetworkIsolationKey(), kOrigin, kGroup);
     ASSERT_TRUE(endpoint);
     ASSERT_TRUE(endpoint.info.url == kEndpoint1 ||
                 endpoint.info.url == kEndpoint2);
@@ -181,25 +342,26 @@
   SetEndpoint(kBackupEndpoint, 20 /* priority */,
               ReportingEndpoint::EndpointInfo::kDefaultWeight);
 
-  ReportingEndpoint endpoint =
-      endpoint_manager()->FindEndpointForDelivery(kOrigin_, kGroup_);
+  ReportingEndpoint endpoint = endpoint_manager_->FindEndpointForDelivery(
+      NetworkIsolationKey(), kOrigin, kGroup);
   ASSERT_TRUE(endpoint);
   EXPECT_EQ(kPrimaryEndpoint, endpoint.info.url);
 
   // The backoff policy we set up in the constructor means that a single failed
   // upload will take the primary endpoint out of contention.  This should cause
   // us to choose the backend endpoint.
-  endpoint_manager()->InformOfEndpointRequest(kPrimaryEndpoint, false);
-  ReportingEndpoint endpoint2 =
-      endpoint_manager()->FindEndpointForDelivery(kOrigin_, kGroup_);
+  endpoint_manager_->InformOfEndpointRequest(NetworkIsolationKey(),
+                                             kPrimaryEndpoint, false);
+  ReportingEndpoint endpoint2 = endpoint_manager_->FindEndpointForDelivery(
+      NetworkIsolationKey(), kOrigin, kGroup);
   ASSERT_TRUE(endpoint2);
   EXPECT_EQ(kBackupEndpoint, endpoint2.info.url);
 
   // Advance the current time far enough to clear out the primary endpoint's
   // backoff clock.  This should bring the primary endpoint back into play.
-  tick_clock()->Advance(base::TimeDelta::FromMinutes(2));
-  ReportingEndpoint endpoint3 =
-      endpoint_manager()->FindEndpointForDelivery(kOrigin_, kGroup_);
+  clock_.Advance(base::TimeDelta::FromMinutes(2));
+  ReportingEndpoint endpoint3 = endpoint_manager_->FindEndpointForDelivery(
+      NetworkIsolationKey(), kOrigin, kGroup);
   ASSERT_TRUE(endpoint3);
   EXPECT_EQ(kPrimaryEndpoint, endpoint3.info.url);
 }
@@ -224,8 +386,8 @@
   int endpoint2_count = 0;
 
   for (int i = 0; i < kTotalEndpointWeight; ++i) {
-    ReportingEndpoint endpoint =
-        endpoint_manager()->FindEndpointForDelivery(kOrigin_, kGroup_);
+    ReportingEndpoint endpoint = endpoint_manager_->FindEndpointForDelivery(
+        NetworkIsolationKey(), kOrigin, kGroup);
     ASSERT_TRUE(endpoint);
     ASSERT_TRUE(endpoint.info.url == kEndpoint1 ||
                 endpoint.info.url == kEndpoint2);
@@ -253,8 +415,8 @@
   int endpoint2_count = 0;
 
   for (int i = 0; i < 10; ++i) {
-    ReportingEndpoint endpoint =
-        endpoint_manager()->FindEndpointForDelivery(kOrigin_, kGroup_);
+    ReportingEndpoint endpoint = endpoint_manager_->FindEndpointForDelivery(
+        NetworkIsolationKey(), kOrigin, kGroup);
     ASSERT_TRUE(endpoint);
     ASSERT_TRUE(endpoint.info.url == kEndpoint1 ||
                 endpoint.info.url == kEndpoint2);
@@ -269,5 +431,106 @@
   EXPECT_EQ(5, endpoint2_count);
 }
 
+// Check that ReportingEndpointManager distinguishes NetworkIsolationKeys.
+TEST_F(ReportingEndpointManagerTest, NetworkIsolationKey) {
+  const url::Origin kOrigin2 = url::Origin::Create(GURL("https://origin2/"));
+
+  const NetworkIsolationKey kNetworkIsolationKey1(kOrigin, kOrigin);
+  const NetworkIsolationKey kNetworkIsolationKey2(kOrigin2, kOrigin2);
+
+  // An Endpoint set for kNetworkIsolationKey1 should not affect
+  // kNetworkIsolationKey2.
+  SetEndpoint(kEndpoint, ReportingEndpoint::EndpointInfo::kDefaultPriority,
+              0 /* weight */, kNetworkIsolationKey1);
+  ReportingEndpoint endpoint = endpoint_manager_->FindEndpointForDelivery(
+      kNetworkIsolationKey1, kOrigin, kGroup);
+  ASSERT_TRUE(endpoint);
+  EXPECT_EQ(kEndpoint, endpoint.info.url);
+  EXPECT_FALSE(endpoint_manager_->FindEndpointForDelivery(kNetworkIsolationKey2,
+                                                          kOrigin, kGroup));
+  EXPECT_FALSE(endpoint_manager_->FindEndpointForDelivery(NetworkIsolationKey(),
+                                                          kOrigin, kGroup));
+
+  // Set the same Endpoint for kNetworkIsolationKey2, so both should be
+  // reporting to the same URL.
+  SetEndpoint(kEndpoint, ReportingEndpoint::EndpointInfo::kDefaultPriority,
+              0 /* weight */, kNetworkIsolationKey2);
+  endpoint = endpoint_manager_->FindEndpointForDelivery(kNetworkIsolationKey1,
+                                                        kOrigin, kGroup);
+  ASSERT_TRUE(endpoint);
+  EXPECT_EQ(kEndpoint, endpoint.info.url);
+  endpoint = endpoint_manager_->FindEndpointForDelivery(kNetworkIsolationKey2,
+                                                        kOrigin, kGroup);
+  ASSERT_TRUE(endpoint);
+  EXPECT_EQ(kEndpoint, endpoint.info.url);
+  EXPECT_FALSE(endpoint_manager_->FindEndpointForDelivery(NetworkIsolationKey(),
+                                                          kOrigin, kGroup));
+
+  // An error reporting to that URL in the context of kNetworkIsolationKey1
+  // should only affect the Endpoint retrieved in the context of
+  // kNetworkIsolationKey1.
+  endpoint_manager_->InformOfEndpointRequest(kNetworkIsolationKey1, kEndpoint,
+                                             false);
+  EXPECT_FALSE(endpoint_manager_->FindEndpointForDelivery(kNetworkIsolationKey1,
+                                                          kOrigin, kGroup));
+  endpoint = endpoint_manager_->FindEndpointForDelivery(kNetworkIsolationKey2,
+                                                        kOrigin, kGroup);
+  ASSERT_TRUE(endpoint);
+  EXPECT_EQ(kEndpoint, endpoint.info.url);
+  EXPECT_FALSE(endpoint_manager_->FindEndpointForDelivery(NetworkIsolationKey(),
+                                                          kOrigin, kGroup));
+}
+
+TEST_F(ReportingEndpointManagerTest, NetworkIsolationKeyWithMultipleEndpoints) {
+  const url::Origin kOrigin2 = url::Origin::Create(GURL("https://origin2/"));
+
+  const NetworkIsolationKey kNetworkIsolationKey1(kOrigin, kOrigin);
+  const NetworkIsolationKey kNetworkIsolationKey2(kOrigin2, kOrigin2);
+
+  const GURL kEndpoint1("https://endpoint1/");
+  const GURL kEndpoint2("https://endpoint2/");
+  const GURL kEndpoint3("https://endpoint3/");
+  const int kMaxAttempts = 20;
+
+  // Add two Endpoints for kNetworkIsolationKey1, and a different one for
+  // kNetworkIsolationKey2.
+  SetEndpoint(kEndpoint1, ReportingEndpoint::EndpointInfo::kDefaultPriority,
+              ReportingEndpoint::EndpointInfo::kDefaultWeight,
+              kNetworkIsolationKey1);
+  SetEndpoint(kEndpoint2, ReportingEndpoint::EndpointInfo::kDefaultPriority,
+              ReportingEndpoint::EndpointInfo::kDefaultWeight,
+              kNetworkIsolationKey1);
+  SetEndpoint(kEndpoint3, ReportingEndpoint::EndpointInfo::kDefaultPriority,
+              ReportingEndpoint::EndpointInfo::kDefaultWeight,
+              kNetworkIsolationKey2);
+
+  bool endpoint1_seen = false;
+  bool endpoint2_seen = false;
+
+  // Make sure that calling FindEndpointForDelivery() with kNetworkIsolationKey1
+  // can return both of its endpoints, but not kNetworkIsolationKey2's endpoint.
+  for (int i = 0; i < kMaxAttempts; ++i) {
+    ReportingEndpoint endpoint = endpoint_manager_->FindEndpointForDelivery(
+        kNetworkIsolationKey1, kOrigin, kGroup);
+    ASSERT_TRUE(endpoint);
+    ASSERT_TRUE(endpoint.info.url == kEndpoint1 ||
+                endpoint.info.url == kEndpoint2);
+
+    if (endpoint.info.url == kEndpoint1) {
+      endpoint1_seen = true;
+    } else if (endpoint.info.url == kEndpoint2) {
+      endpoint2_seen = true;
+    }
+  }
+
+  EXPECT_TRUE(endpoint1_seen);
+  EXPECT_TRUE(endpoint2_seen);
+
+  ReportingEndpoint endpoint = endpoint_manager_->FindEndpointForDelivery(
+      kNetworkIsolationKey2, kOrigin, kGroup);
+  ASSERT_TRUE(endpoint);
+  EXPECT_EQ(kEndpoint3, endpoint.info.url);
+}
+
 }  // namespace
 }  // namespace net
diff --git a/net/reporting/reporting_test_util.cc b/net/reporting/reporting_test_util.cc
index 301f163..5b36fefb 100644
--- a/net/reporting/reporting_test_util.cc
+++ b/net/reporting/reporting_test_util.cc
@@ -16,7 +16,6 @@
 #include "base/test/simple_test_clock.h"
 #include "base/test/simple_test_tick_clock.h"
 #include "base/timer/mock_timer.h"
-#include "net/base/rand_callback.h"
 #include "net/reporting/reporting_cache.h"
 #include "net/reporting/reporting_context.h"
 #include "net/reporting/reporting_delegate.h"
@@ -25,7 +24,6 @@
 #include "net/reporting/reporting_garbage_collector.h"
 #include "net/reporting/reporting_policy.h"
 #include "net/reporting/reporting_uploader.h"
-#include "net/url_request/url_request_test_util.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "url/gurl.h"
 #include "url/origin.h"
@@ -85,6 +83,15 @@
 
 }  // namespace
 
+RandIntCallback TestReportingRandIntCallback() {
+  return base::BindRepeating(
+      [](int* rand_counter, int min, int max) {
+        DCHECK_LE(min, max);
+        return min + ((*rand_counter)++ % (max - min + 1));
+      },
+      base::Owned(std::make_unique<int>(0)));
+}
+
 TestReportingUploader::PendingUpload::~PendingUpload() = default;
 TestReportingUploader::PendingUpload::PendingUpload() = default;
 
@@ -109,8 +116,7 @@
   return pending_uploads_.size();
 }
 
-TestReportingDelegate::TestReportingDelegate()
-    : test_request_context_(std::make_unique<TestURLRequestContext>()) {}
+TestReportingDelegate::TestReportingDelegate() = default;
 
 TestReportingDelegate::~TestReportingDelegate() = default;
 
@@ -157,16 +163,13 @@
     const base::TickClock* tick_clock,
     const ReportingPolicy& policy,
     ReportingCache::PersistentReportingStore* store)
-    : ReportingContext(
-          policy,
-          clock,
-          tick_clock,
-          base::BindRepeating(&TestReportingContext::RandIntCallback,
-                              base::Unretained(this)),
-          std::make_unique<TestReportingUploader>(),
-          std::make_unique<TestReportingDelegate>(),
-          store),
-      rand_counter_(0),
+    : ReportingContext(policy,
+                       clock,
+                       tick_clock,
+                       TestReportingRandIntCallback(),
+                       std::make_unique<TestReportingUploader>(),
+                       std::make_unique<TestReportingDelegate>(),
+                       store),
       delivery_timer_(new base::MockOneShotTimer()),
       garbage_collection_timer_(new base::MockOneShotTimer()) {
   garbage_collector()->SetTimerForTesting(
@@ -179,11 +182,6 @@
   garbage_collection_timer_ = nullptr;
 }
 
-int TestReportingContext::RandIntCallback(int min, int max) {
-  DCHECK_LE(min, max);
-  return min + (rand_counter_++ % (max - min + 1));
-}
-
 ReportingTestBase::ReportingTestBase() : store_(nullptr) {
   // For tests, disable jitter.
   ReportingPolicy policy;
diff --git a/net/reporting/reporting_test_util.h b/net/reporting/reporting_test_util.h
index c0fd86e..e75a721 100644
--- a/net/reporting/reporting_test_util.h
+++ b/net/reporting/reporting_test_util.h
@@ -13,6 +13,7 @@
 #include "base/macros.h"
 #include "base/test/simple_test_clock.h"
 #include "base/test/simple_test_tick_clock.h"
+#include "net/base/rand_callback.h"
 #include "net/reporting/reporting_cache.h"
 #include "net/reporting/reporting_context.h"
 #include "net/reporting/reporting_delegate.h"
@@ -38,7 +39,6 @@
 
 struct ReportingEndpoint;
 class ReportingGarbageCollector;
-class TestURLRequestContext;
 
 // A matcher for ReportingReports, which checks that the url of the report is
 // the given url.
@@ -49,6 +49,8 @@
   return arg.url == url;
 }
 
+RandIntCallback TestReportingRandIntCallback();
+
 // A test implementation of ReportingUploader that holds uploads for tests to
 // examine and complete with a specified outcome.
 class TestReportingUploader : public ReportingUploader {
@@ -128,7 +130,6 @@
                     const GURL& endpoint) const override;
 
  private:
-  std::unique_ptr<TestURLRequestContext> test_request_context_;
   bool disallow_report_uploads_ = false;
   bool pause_permissions_check_ = false;
 
@@ -162,10 +163,6 @@
   }
 
  private:
-  int RandIntCallback(int min, int max);
-
-  int rand_counter_;
-
   // Owned by the DeliveryAgent and GarbageCollector, respectively, but
   // referenced here to preserve type:
 
@@ -250,9 +247,6 @@
   TestReportingUploader* uploader() { return context_->test_uploader(); }
 
   ReportingCache* cache() { return context_->cache(); }
-  ReportingEndpointManager* endpoint_manager() {
-    return context_->endpoint_manager();
-  }
   ReportingDeliveryAgent* delivery_agent() {
     return context_->delivery_agent();
   }
diff --git a/net/server/http_server_unittest.cc b/net/server/http_server_unittest.cc
index 7fefb5f..7f404ad 100644
--- a/net/server/http_server_unittest.cc
+++ b/net/server/http_server_unittest.cc
@@ -44,11 +44,6 @@
 #include "net/test/gtest_util.h"
 #include "net/test/test_with_task_environment.h"
 #include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
-#include "net/url_request/url_fetcher.h"
-#include "net/url_request/url_fetcher_delegate.h"
-#include "net/url_request/url_request_context.h"
-#include "net/url_request/url_request_context_getter.h"
-#include "net/url_request/url_request_test_util.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -451,37 +446,19 @@
 }
 
 TEST_F(HttpServerTest, RequestWithTooLargeBody) {
-  class TestURLFetcherDelegate : public URLFetcherDelegate {
-   public:
-    TestURLFetcherDelegate(const base::Closure& quit_loop_func)
-        : quit_loop_func_(quit_loop_func) {}
-    ~TestURLFetcherDelegate() override = default;
-
-    void OnURLFetchComplete(const URLFetcher* source) override {
-      EXPECT_EQ(HTTP_INTERNAL_SERVER_ERROR, source->GetResponseCode());
-      quit_loop_func_.Run();
-    }
-
-   private:
-    base::Closure quit_loop_func_;
-  };
-
-  base::RunLoop run_loop;
-  TestURLFetcherDelegate delegate(run_loop.QuitClosure());
-
-  scoped_refptr<URLRequestContextGetter> request_context_getter(
-      new TestURLRequestContextGetter(base::ThreadTaskRunnerHandle::Get()));
-  std::unique_ptr<URLFetcher> fetcher = URLFetcher::Create(
-      GURL(base::StringPrintf("http://127.0.0.1:%d/test",
-                              server_address_.port())),
-      URLFetcher::GET, &delegate, TRAFFIC_ANNOTATION_FOR_TESTS);
-  fetcher->SetRequestContext(request_context_getter.get());
-  fetcher->AddExtraRequestHeader(
-      base::StringPrintf("content-length:%d", 1 << 30));
-  fetcher->Start();
-
-  run_loop.Run();
-  ASSERT_EQ(0u, requests_.size());
+  TestHttpClient client;
+  ASSERT_THAT(client.ConnectAndWait(server_address_), IsOk());
+  client.Send(
+      "GET /test HTTP/1.1\r\n"
+      "Content-Length: 1073741824\r\n\r\n");
+  std::string response;
+  ASSERT_TRUE(client.ReadResponse(&response));
+  EXPECT_EQ(
+      "HTTP/1.1 500 Internal Server Error\r\n"
+      "Content-Length:42\r\n"
+      "Content-Type:text/html\r\n\r\n"
+      "request content-length too big or unknown.",
+      response);
 }
 
 TEST_F(HttpServerTest, Send200) {
diff --git a/net/tools/cert_verify_tool/cert_verify_tool.cc b/net/tools/cert_verify_tool/cert_verify_tool.cc
index 9ae5ddf..b707f70 100644
--- a/net/tools/cert_verify_tool/cert_verify_tool.cc
+++ b/net/tools/cert_verify_tool/cert_verify_tool.cc
@@ -199,6 +199,7 @@
     base::StringPiece impl_name,
     scoped_refptr<net::CertNetFetcher> cert_net_fetcher,
     bool use_system_roots) {
+#if !defined(OS_FUCHSIA)
   if (impl_name == "platform") {
     if (!use_system_roots) {
       std::cerr << "WARNING: platform verifier not supported with "
@@ -207,9 +208,10 @@
     }
 
     return std::make_unique<CertVerifyImplUsingProc>(
-        "CertVerifyProc (default)",
-        net::CertVerifyProc::CreateDefault(std::move(cert_net_fetcher)));
+        "CertVerifyProc (system)", net::CertVerifyProc::CreateSystemVerifyProc(
+                                       std::move(cert_net_fetcher)));
   }
+#endif
 
   if (impl_name == "builtin") {
     return std::make_unique<CertVerifyImplUsingProc>(
@@ -410,8 +412,13 @@
   // Parse the ordered list of CertVerifyImpl passed via command line flags into
   // |impls|.
   std::string impls_str = command_line.GetSwitchValueASCII("impls");
-  if (impls_str.empty())
-    impls_str = "platform,builtin,pathbuilder";  // Default value.
+  if (impls_str.empty()) {
+    // Default value.
+#if !defined(OS_FUCHSIA)
+    impls_str = "platform,";
+#endif
+    impls_str += "builtin,pathbuilder";
+  }
 
   std::vector<std::string> impl_names = base::SplitString(
       impls_str, ",", base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY);
diff --git a/remoting/android/java/src/org/chromium/chromoting/jni/ConnectionListener.java b/remoting/android/java/src/org/chromium/chromoting/jni/ConnectionListener.java
index e1b27db..b0accd6 100644
--- a/remoting/android/java/src/org/chromium/chromoting/jni/ConnectionListener.java
+++ b/remoting/android/java/src/org/chromium/chromoting/jni/ConnectionListener.java
@@ -73,7 +73,7 @@
             case Error.SIGNALING_ERROR:
                 return R.string.error_p2p_failure;
             case Error.SIGNALING_TIMEOUT:
-                return R.string.error_p2p_failure;
+                return R.string.error_host_is_offline;
             case Error.HOST_OVERLOAD:
                 return R.string.error_host_overload;
             case Error.MAX_SESSION_LENGTH:
diff --git a/remoting/ios/app/client_connection_view_controller.mm b/remoting/ios/app/client_connection_view_controller.mm
index 070f1f2..16eb487 100644
--- a/remoting/ios/app/client_connection_view_controller.mm
+++ b/remoting/ios/app/client_connection_view_controller.mm
@@ -552,7 +552,7 @@
       message = l10n_util::GetNSString(IDS_ERROR_P2P_FAILURE);
       break;
     case SessionErrorSignalingTimeout:
-      message = l10n_util::GetNSString(IDS_ERROR_SERVICE_UNAVAILABLE);
+      message = l10n_util::GetNSString(IDS_ERROR_HOST_IS_OFFLINE);
       break;
     case SessionErrorHostOverload:
       message = l10n_util::GetNSString(IDS_ERROR_HOST_OVERLOAD);
diff --git a/services/network/cert_verifier_with_trust_anchors_unittest.cc b/services/network/cert_verifier_with_trust_anchors_unittest.cc
index 37dbd9f4..dfcf766 100644
--- a/services/network/cert_verifier_with_trust_anchors_unittest.cc
+++ b/services/network/cert_verifier_with_trust_anchors_unittest.cc
@@ -18,6 +18,7 @@
 #include "crypto/scoped_test_nss_chromeos_user.h"
 #include "net/base/test_completion_callback.h"
 #include "net/cert/cert_net_fetcher.h"
+#include "net/cert/cert_verify_proc_builtin.h"
 #include "net/cert/cert_verify_result.h"
 #include "net/cert/nss_cert_database_chromeos.h"
 #include "net/cert/x509_certificate.h"
@@ -26,11 +27,12 @@
 #include "net/test/cert_test_util.h"
 #include "net/test/test_data_directory.h"
 #include "services/network/cert_verify_proc_chromeos.h"
+#include "services/network/system_trust_store_provider_chromeos.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace network {
 
-class CertVerifierWithTrustAnchorsTest : public testing::Test {
+class CertVerifierWithTrustAnchorsTest : public testing::TestWithParam<bool> {
  public:
   CertVerifierWithTrustAnchorsTest()
       : trust_anchor_used_(false),
@@ -53,8 +55,16 @@
         std::make_unique<CertVerifierWithTrustAnchors>(base::BindRepeating(
             &CertVerifierWithTrustAnchorsTest::OnTrustAnchorUsed,
             base::Unretained(this)));
-    cert_verify_proc_ = base::MakeRefCounted<network::CertVerifyProcChromeOS>(
-        crypto::GetPublicSlotForChromeOSUser(test_nss_user_.username_hash()));
+    if (GetParam()) {
+      cert_verify_proc_ = net::CreateCertVerifyProcBuiltin(
+          /*net_fetcher=*/nullptr,
+          std::make_unique<SystemTrustStoreProviderChromeOS>(
+              crypto::GetPublicSlotForChromeOSUser(
+                  test_nss_user_.username_hash())));
+    } else {
+      cert_verify_proc_ = base::MakeRefCounted<network::CertVerifyProcChromeOS>(
+          crypto::GetPublicSlotForChromeOSUser(test_nss_user_.username_hash()));
+    }
     cert_verifier_->InitializeOnIOThread(cert_verify_proc_);
 
     test_ca_cert_ = LoadCertificate("root_ca_cert.pem", net::CA_CERT);
@@ -135,7 +145,9 @@
   base::test::TaskEnvironment task_environment_;
 };
 
-TEST_F(CertVerifierWithTrustAnchorsTest, VerifyUntrustedCert) {
+INSTANTIATE_TEST_SUITE_P(, CertVerifierWithTrustAnchorsTest, testing::Bool());
+
+TEST_P(CertVerifierWithTrustAnchorsTest, VerifyUntrustedCert) {
   // |test_server_cert_| is untrusted, so Verify() fails.
   {
     net::CertVerifyResult verify_result;
@@ -163,7 +175,7 @@
   EXPECT_FALSE(WasTrustAnchorUsedAndReset());
 }
 
-TEST_F(CertVerifierWithTrustAnchorsTest, VerifyTrustedCert) {
+TEST_P(CertVerifierWithTrustAnchorsTest, VerifyTrustedCert) {
   // Make the database trust |test_ca_cert_|.
   net::NSSCertDatabase::ImportCertFailureList failure_list;
   ASSERT_TRUE(test_cert_db_->ImportCACerts(
@@ -191,7 +203,7 @@
   EXPECT_FALSE(WasTrustAnchorUsedAndReset());
 }
 
-TEST_F(CertVerifierWithTrustAnchorsTest, VerifyUsingAdditionalTrustAnchor) {
+TEST_P(CertVerifierWithTrustAnchorsTest, VerifyUsingAdditionalTrustAnchor) {
   ASSERT_TRUE(SupportsAdditionalTrustAnchors());
 
   // |test_server_cert_| is untrusted, so Verify() fails.
@@ -259,7 +271,7 @@
   EXPECT_FALSE(WasTrustAnchorUsedAndReset());
 }
 
-TEST_F(CertVerifierWithTrustAnchorsTest,
+TEST_P(CertVerifierWithTrustAnchorsTest,
        VerifyUsesAdditionalTrustAnchorsAfterConfigChange) {
   ASSERT_TRUE(SupportsAdditionalTrustAnchors());
 
diff --git a/services/network/network_context.cc b/services/network/network_context.cc
index b592f2d..64c7e8b 100644
--- a/services/network/network_context.cc
+++ b/services/network/network_context.cc
@@ -1547,10 +1547,8 @@
                             ->config_client_request),
               std::move(params_->trial_comparison_cert_verifier_params
                             ->report_client),
-              net::CertVerifyProc::CreateDefault(cert_net_fetcher_),
-              net::CreateCertVerifyProcBuiltin(
-                  cert_net_fetcher_,
-                  net::SystemTrustStoreProvider::CreateDefaultForSSL())));
+              net::CertVerifyProc::CreateSystemVerifyProc(cert_net_fetcher_),
+              net::CertVerifyProc::CreateBuiltinVerifyProc(cert_net_fetcher_)));
     }
 #endif
     if (!cert_verifier)
diff --git a/services/network/public/cpp/server/http_server_unittest.cc b/services/network/public/cpp/server/http_server_unittest.cc
index a1198944..30b25c2 100644
--- a/services/network/public/cpp/server/http_server_unittest.cc
+++ b/services/network/public/cpp/server/http_server_unittest.cc
@@ -26,10 +26,6 @@
 #include "net/log/net_log_source.h"
 #include "net/test/gtest_util.h"
 #include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
-#include "net/url_request/url_fetcher.h"
-#include "net/url_request/url_fetcher_delegate.h"
-#include "net/url_request/url_request_context.h"
-#include "net/url_request/url_request_context_getter.h"
 #include "net/url_request/url_request_test_util.h"
 #include "services/network/public/cpp/server/http_connection.h"
 #include "services/network/public/cpp/server/http_server_request_info.h"
@@ -486,37 +482,19 @@
 }
 
 TEST_F(HttpServerTest, RequestWithTooLargeBody) {
-  class TestURLFetcherDelegate : public net::URLFetcherDelegate {
-   public:
-    TestURLFetcherDelegate(const base::RepeatingClosure& quit_loop_func)
-        : quit_loop_func_(quit_loop_func) {}
-    ~TestURLFetcherDelegate() override = default;
-
-    void OnURLFetchComplete(const net::URLFetcher* source) override {
-      EXPECT_EQ(net::HTTP_INTERNAL_SERVER_ERROR, source->GetResponseCode());
-      quit_loop_func_.Run();
-    }
-
-   private:
-    base::RepeatingClosure quit_loop_func_;
-  };
-
-  base::RunLoop run_loop;
-  TestURLFetcherDelegate delegate(run_loop.QuitClosure());
-
-  scoped_refptr<net::URLRequestContextGetter> request_context_getter(
-      new net::TestURLRequestContextGetter(
-          base::ThreadTaskRunnerHandle::Get()));
-  std::unique_ptr<net::URLFetcher> fetcher = net::URLFetcher::Create(
-      GURL(base::StringPrintf("http://[::1]:%d/test", server_address_.port())),
-      net::URLFetcher::GET, &delegate, TRAFFIC_ANNOTATION_FOR_TESTS);
-  fetcher->SetRequestContext(request_context_getter.get());
-  fetcher->AddExtraRequestHeader(
-      base::StringPrintf("content-length:%d", 1 << 30));
-  fetcher->Start();
-
-  run_loop.Run();
-  ASSERT_EQ(0u, requests_.size());
+  TestHttpClient client;
+  ASSERT_THAT(client.ConnectAndWait(server_address_), IsOk());
+  client.Send(
+      "GET /test HTTP/1.1\r\n"
+      "Content-Length: 1073741824\r\n\r\n");
+  std::string response;
+  ASSERT_TRUE(client.ReadResponse(&response));
+  EXPECT_EQ(
+      "HTTP/1.1 500 Internal Server Error\r\n"
+      "Content-Length:53\r\n"
+      "Content-Type:text/html\r\n\r\n"
+      "request content-length too big or unknown: 1073741824",
+      response);
 }
 
 TEST_F(HttpServerTest, Send200) {
diff --git a/services/network/system_trust_store_provider_chromeos.h b/services/network/system_trust_store_provider_chromeos.h
index fd7514c..86adefd 100644
--- a/services/network/system_trust_store_provider_chromeos.h
+++ b/services/network/system_trust_store_provider_chromeos.h
@@ -8,6 +8,7 @@
 #include <certt.h>
 #include <memory>
 
+#include "base/component_export.h"
 #include "base/macros.h"
 #include "crypto/scoped_nss_types.h"
 #include "net/cert/cert_verify_proc_builtin.h"
@@ -22,7 +23,8 @@
 // A SystemTrustStoreProvider that supports creating SystemTrustStore instances
 // which will only consider user-imported certificates trusted if they are on a
 // specific NSS slot.
-class SystemTrustStoreProviderChromeOS : public net::SystemTrustStoreProvider {
+class COMPONENT_EXPORT(NETWORK_SERVICE) SystemTrustStoreProviderChromeOS
+    : public net::SystemTrustStoreProvider {
  public:
   // Creates a SystemTrustStoreProvider that will provide SystemTrustStore
   // instances which will not allow trusting user-imported certififcates.
diff --git a/services/service_manager/sandbox/mac/common.sb b/services/service_manager/sandbox/mac/common.sb
index 90e99f14..e6e367a 100644
--- a/services/service_manager/sandbox/mac/common.sb
+++ b/services/service_manager/sandbox/mac/common.sb
@@ -22,6 +22,8 @@
 (define log-file-path "LOG_FILE_PATH")
 (define os-version (string->number (param "OS_VERSION")))
 (define darwin-user-cache-dir "DARWIN_USER_CACHE_DIR")
+(define darwin-user-dir "DARWIN_USER_DIR")
+(define darwin-user-temp-dir "DARWIN_USER_TEMP_DIR")
 (define filter-syscalls "FILTER_SYSCALLS")
 
 ; Backwards compatibility for 10.10.
diff --git a/services/service_manager/sandbox/mac/gpu_v2.sb b/services/service_manager/sandbox/mac/gpu_v2.sb
index 137dece..ff841a2 100644
--- a/services/service_manager/sandbox/mac/gpu_v2.sb
+++ b/services/service_manager/sandbox/mac/gpu_v2.sb
@@ -13,6 +13,7 @@
 
 ; Allow communication between the GPU process and the UI server.
 (allow mach-lookup
+  (global-name "com.apple.bsd.dirhelper")
   (global-name "com.apple.cfprefsd.agent")
   (global-name "com.apple.cfprefsd.daemon")
   (global-name "com.apple.CoreServices.coreservicesd")
@@ -90,12 +91,15 @@
 (allow file-read*
   (subpath "/Library/GPUBundles")
   (subpath "/Library/Video/Plug-Ins")
+  (subpath "/System/Library/CoreServices/RawCamera.bundle")
   (subpath "/System/Library/Video/Plug-Ins")
 )
 
 ; crbug.com/980134
 (allow file-read* file-write*
   (subpath (param darwin-user-cache-dir))
+  (subpath (param darwin-user-dir))
+  (subpath (param darwin-user-temp-dir))
 )
 
 (if (param-true? filter-syscalls)
diff --git a/services/viz/public/cpp/compositing/copy_output_result_mojom_traits.cc b/services/viz/public/cpp/compositing/copy_output_result_mojom_traits.cc
index 69f6c29..90ebcf9 100644
--- a/services/viz/public/cpp/compositing/copy_output_result_mojom_traits.cc
+++ b/services/viz/public/cpp/compositing/copy_output_result_mojom_traits.cc
@@ -206,7 +206,7 @@
       *out_p = std::make_unique<viz::CopyOutputTextureResult>(
           rect, *mailbox, *sync_token, *color_space,
           viz::SingleReleaseCallback::Create(
-              base::Bind(&Release, base::Passed(&releaser))));
+              base::BindOnce(&Release, std::move(releaser))));
       return true;
     }
 
diff --git a/services/viz/public/cpp/compositing/mojom_traits_unittest.cc b/services/viz/public/cpp/compositing/mojom_traits_unittest.cc
index 2051d34..65b8eb8b 100644
--- a/services/viz/public/cpp/compositing/mojom_traits_unittest.cc
+++ b/services/viz/public/cpp/compositing/mojom_traits_unittest.cc
@@ -236,12 +236,12 @@
   std::unique_ptr<CopyOutputRequest> input(new CopyOutputRequest(
       result_format,
       base::BindOnce(
-          [](const base::Closure& quit_closure, const gfx::Rect& expected_rect,
+          [](base::OnceClosure quit_closure, const gfx::Rect& expected_rect,
              std::unique_ptr<CopyOutputResult> result) {
             EXPECT_EQ(expected_rect, result->rect());
             // Note: CopyOutputResult plumbing for bitmap requests is tested in
             // StructTraitsTest.CopyOutputResult_Bitmap.
-            quit_closure.Run();
+            std::move(quit_closure).Run();
           },
           run_loop.QuitClosure(), result_rect)));
   input->SetScaleRatio(scale_from, scale_to);
@@ -283,10 +283,10 @@
   auto request = std::make_unique<CopyOutputRequest>(
       CopyOutputRequest::ResultFormat::RGBA_BITMAP,
       base::BindOnce(
-          [](const base::Closure& quit_closure,
+          [](base::OnceClosure quit_closure,
              std::unique_ptr<CopyOutputResult> result) {
             EXPECT_TRUE(result->IsEmpty());
-            quit_closure.Run();
+            std::move(quit_closure).Run();
           },
           run_loop.QuitClosure()));
   auto result_sender = mojo::StructTraits<
@@ -313,12 +313,12 @@
   std::unique_ptr<CopyOutputRequest> input(new CopyOutputRequest(
       result_format,
       base::BindOnce(
-          [](const base::Closure& quit_closure, const gfx::Rect& expected_rect,
+          [](base::OnceClosure quit_closure, const gfx::Rect& expected_rect,
              std::unique_ptr<CopyOutputResult> result) {
             EXPECT_EQ(expected_rect, result->rect());
             // Note: CopyOutputResult plumbing for texture requests is tested in
             // StructTraitsTest.CopyOutputResult_Texture.
-            quit_closure.Run();
+            std::move(quit_closure).Run();
           },
           run_loop_for_result.QuitClosure(), result_rect)));
   EXPECT_FALSE(input->is_scaled());
@@ -334,13 +334,13 @@
   base::RunLoop run_loop_for_release;
   output->SendResult(std::make_unique<CopyOutputTextureResult>(
       result_rect, mailbox, sync_token, gfx::ColorSpace::CreateSRGB(),
-      SingleReleaseCallback::Create(base::Bind(
-          [](const base::Closure& quit_closure,
+      SingleReleaseCallback::Create(base::BindOnce(
+          [](base::OnceClosure quit_closure,
              const gpu::SyncToken& expected_sync_token,
              const gpu::SyncToken& sync_token, bool is_lost) {
             EXPECT_EQ(expected_sync_token, sync_token);
             EXPECT_FALSE(is_lost);
-            quit_closure.Run();
+            std::move(quit_closure).Run();
           },
           run_loop_for_release.QuitClosure(), sync_token))));
 
@@ -1245,12 +1245,13 @@
                             71234838);
   sync_token.SetVerifyFlush();
   base::RunLoop run_loop;
-  auto callback = SingleReleaseCallback::Create(base::Bind(
-      [](base::Closure quit_closure, const gpu::SyncToken& expected_sync_token,
+  auto callback = SingleReleaseCallback::Create(base::BindOnce(
+      [](base::OnceClosure quit_closure,
+         const gpu::SyncToken& expected_sync_token,
          const gpu::SyncToken& sync_token, bool is_lost) {
         EXPECT_EQ(expected_sync_token, sync_token);
         EXPECT_TRUE(is_lost);
-        quit_closure.Run();
+        std::move(quit_closure).Run();
       },
       run_loop.QuitClosure(), sync_token));
   gpu::Mailbox mailbox;
diff --git a/services/viz/public/cpp/gpu/gpu_unittest.cc b/services/viz/public/cpp/gpu/gpu_unittest.cc
index e7027ec..d4fed86 100644
--- a/services/viz/public/cpp/gpu/gpu_unittest.cc
+++ b/services/viz/public/cpp/gpu/gpu_unittest.cc
@@ -100,8 +100,9 @@
     base::RunLoop run_loop;
     io_thread_.task_runner()->PostTask(
         FROM_HERE,
-        base::BindOnce([](base::Closure callback) { callback.Run(); },
-                       run_loop.QuitClosure()));
+        base::BindOnce(
+            [](base::OnceClosure callback) { std::move(callback).Run(); },
+            run_loop.QuitClosure()));
     run_loop.Run();
   }
 
@@ -173,13 +174,13 @@
   base::RunLoop run_loop;
   // A callback that decrements the counter, and runs the callback when the
   // counter reaches 0.
-  auto callback = base::Bind(
-      [](int* counter, const base::Closure& callback,
+  auto callback = base::BindRepeating(
+      [](int* counter, base::OnceClosure callback,
          scoped_refptr<gpu::GpuChannelHost> channel) {
         EXPECT_TRUE(channel);
         --(*counter);
         if (*counter == 0)
-          callback.Run();
+          std::move(callback).Run();
       },
       &counter, run_loop.QuitClosure());
   gpu()->EstablishGpuChannel(callback);
@@ -199,9 +200,8 @@
   scoped_refptr<gpu::GpuChannelHost> host;
   auto callback = base::BindOnce(
       [](scoped_refptr<gpu::GpuChannelHost>* out_host,
-         const base::Closure& callback,
-         scoped_refptr<gpu::GpuChannelHost> host) {
-        callback.Run();
+         base::OnceClosure callback, scoped_refptr<gpu::GpuChannelHost> host) {
+        std::move(callback).Run();
         *out_host = std::move(host);
       },
       &host, run_loop.QuitClosure());
@@ -226,10 +226,9 @@
 TEST_F(GpuTest, EstablishRequestResponseSynchronouslyOnSuccess) {
   base::RunLoop run_loop;
   gpu()->EstablishGpuChannel(base::BindOnce(
-      [](const base::Closure& callback,
-         scoped_refptr<gpu::GpuChannelHost> host) {
+      [](base::OnceClosure callback, scoped_refptr<gpu::GpuChannelHost> host) {
         EXPECT_TRUE(host);
-        callback.Run();
+        std::move(callback).Run();
       },
       run_loop.QuitClosure()));
   run_loop.Run();
diff --git a/testing/android/native_test/BUILD.gn b/testing/android/native_test/BUILD.gn
index b6ee7181..9d2fc8a 100644
--- a/testing/android/native_test/BUILD.gn
+++ b/testing/android/native_test/BUILD.gn
@@ -77,6 +77,7 @@
 }
 
 generate_jni("native_test_jni_headers") {
+  testonly = true
   sources = [
     "java/src/org/chromium/native_test/MainRunner.java",
     "java/src/org/chromium/native_test/NativeTest.java",
@@ -84,6 +85,7 @@
 }
 
 generate_jni("native_browser_test_jni_headers") {
+  testonly = true
   sources = [
     "java/src/org/chromium/native_test/NativeBrowserTest.java",
   ]
diff --git a/testing/test.gni b/testing/test.gni
index 491fa35d..9fa5468 100644
--- a/testing/test.gni
+++ b/testing/test.gni
@@ -15,8 +15,8 @@
 
 if (is_fuchsia) {
   import("//build/config/chromecast_build.gni")
+  import("//build/config/fuchsia/generate_runner_scripts.gni")
   import("//build/config/fuchsia/package.gni")
-  import("//build/config/fuchsia/rules.gni")
 }
 
 if (is_chromeos) {
diff --git a/third_party/blink/perf_tests/display_locking/abs_pos_outer_sizes_change.html b/third_party/blink/perf_tests/display_locking/abs_pos_outer_sizes_change.html
index d301f54..9b0bab9 100644
--- a/third_party/blink/perf_tests/display_locking/abs_pos_outer_sizes_change.html
+++ b/third_party/blink/perf_tests/display_locking/abs_pos_outer_sizes_change.html
@@ -20,6 +20,7 @@
 .container {
   contain: style layout;
   width: 200px;
+  content-size: 100px;
 }
 .box {
   background: blue;
@@ -63,8 +64,8 @@
     document.getElementById("node_template").content, true).firstElementChild;
   for (let i = 0; i < n; ++i) {
     const clone = specimen.cloneNode(true);
-    if (clone.displayLock && i > 0)
-      clone.displayLock.acquire({ timeout: Infinity, size: [100, 100] });
+    if (i > 0)
+      clone.renderSubtree = "invisible";
     document.body.appendChild(clone);
   }
 }
diff --git a/third_party/blink/perf_tests/display_locking/forced_layout_on_locked_el.html b/third_party/blink/perf_tests/display_locking/forced_layout_on_locked_el.html
index 25972c65..b4cd59a 100644
--- a/third_party/blink/perf_tests/display_locking/forced_layout_on_locked_el.html
+++ b/third_party/blink/perf_tests/display_locking/forced_layout_on_locked_el.html
@@ -24,7 +24,7 @@
 </head>
 <body>
 <template id="template">
-<div class="box">
+<div class="box" rendersubtree="invisible">
   Lorem ipsum dolor sit amet, consectetur adipiscing elit.
   Quisque ante dui, posuere at pretium suscipit, condimentum at augue.
 </div>
@@ -43,9 +43,6 @@
   for (let i = 0; i < NUMBER_OF_ELEMENTS; ++i) {
     const clone = template.content.cloneNode(true).firstElementChild;
     clone.id = "box" + i;
-    if (clone.displayLock) {
-      clone.displayLock.acquire({ timeout: Infinity, size: [10, 10] });
-    }
     container.appendChild(clone);
   }
   container.offsetTop;
diff --git a/third_party/blink/perf_tests/display_locking/inner_sizes_change.html b/third_party/blink/perf_tests/display_locking/inner_sizes_change.html
index 86579fc5..bf23b0e 100644
--- a/third_party/blink/perf_tests/display_locking/inner_sizes_change.html
+++ b/third_party/blink/perf_tests/display_locking/inner_sizes_change.html
@@ -17,6 +17,7 @@
 .container {
   contain: style layout;
   width: 200px;
+  content-size: 100px;
 }
 .box {
   background: blue;
@@ -49,8 +50,8 @@
     document.getElementById("node_template").content, true).firstElementChild;
   for (let i = 0; i < n; ++i) {
     const clone = specimen.cloneNode(true);
-    if (clone.displayLock && i > 0)
-      clone.displayLock.acquire({ timeout: Infinity, size: [100, 100] });
+    if (i > 0)
+      clone.renderSubtree = "invisible";
     document.body.appendChild(clone);
   }
 }
diff --git a/third_party/blink/perf_tests/display_locking/outer_sizes_change.html b/third_party/blink/perf_tests/display_locking/outer_sizes_change.html
index 5d0d7a4..58c1f17 100644
--- a/third_party/blink/perf_tests/display_locking/outer_sizes_change.html
+++ b/third_party/blink/perf_tests/display_locking/outer_sizes_change.html
@@ -16,6 +16,7 @@
 .container {
   contain: style layout;
   width: 200px;
+  content-size: 100px;
 }
 .box {
   background: blue;
@@ -48,8 +49,8 @@
     document.getElementById("node_template").content, true).firstElementChild;
   for (let i = 0; i < n; ++i) {
     const clone = specimen.cloneNode(true);
-    if (clone.displayLock && i > 0)
-      clone.displayLock.acquire({ timeout: Infinity, size: [100, 100] });
+    if (i > 0)
+      clone.renderSubtree = "invisible";
     document.body.appendChild(clone);
   }
 }
diff --git a/third_party/blink/perf_tests/display_locking/outer_sizes_change_activatable.html b/third_party/blink/perf_tests/display_locking/outer_sizes_change_activatable.html
new file mode 100644
index 0000000..ddeeac4
--- /dev/null
+++ b/third_party/blink/perf_tests/display_locking/outer_sizes_change_activatable.html
@@ -0,0 +1,88 @@
+<!doctype HTML>
+
+<!--
+This test appends 30,000 items to the page, locking all of them with the
+activatable flag on. It then changes the style of all the locked elements,
+causing self-layout for all of them.
+
+The test works with and without display locking. If display locking is not
+enabled, then none of the elements are locked and the performance should
+be noticeably worse.
+-->
+
+<head>
+<script src="../resources/runner.js"></script>
+<style>
+.container {
+  contain: style layout;
+  width: 200px;
+  content-size: 100px;
+}
+.box {
+  background: blue;
+  overflow: hidden;
+  width: 100px;
+  height: 100px;
+}
+</style>
+</head>
+
+<body>
+<!-- node template from which to construct items -->
+<template id="node_template">
+<div class="container" rendersubtree="invisible activatable">
+  Lorem ipsum dolor sit amet, consectetur adipiscing elit.
+  Quisque ante dui, posuere at pretium suscipit, condimentum at augue.
+  <div class="box">
+    Lorem ipsum dolor sit amet, consectetur adipiscing elit.
+    Quisque ante dui, posuere at pretium suscipit, condimentum at augue.
+  </div>
+  Lorem ipsum dolor sit amet, consectetur adipiscing elit.
+  Quisque ante dui, posuere at pretium suscipit, condimentum at augue.
+</div>
+</template>
+</body>
+
+<script>
+function construct(n) {
+  const specimen = document.importNode(
+    document.getElementById("node_template").content, true).firstElementChild;
+  for (let i = 0; i < n; ++i)
+    document.body.appendChild(specimen.cloneNode(true));
+}
+
+let sizes = ["200px", "250px"];
+let size_index = 0;
+function changeStyle() {
+  document.styleSheets[0].rules[0].style.width = sizes[size_index];
+  size_index = 1 - size_index;
+}
+
+let testDone = false;
+let startTime;
+function runTest() {
+  if (startTime) {
+    PerfTestRunner.measureValueAsync(PerfTestRunner.now() - startTime);
+    PerfTestRunner.addRunTestEndMarker();
+  }
+  if (testDone)
+    return;
+
+  startTime = PerfTestRunner.now();
+  PerfTestRunner.addRunTestEndMarker();
+
+  changeStyle();
+  requestAnimationFrame(runTest);
+}
+
+construct(30000);
+
+PerfTestRunner.startMeasureValuesAsync({
+  unit: 'ms',
+  done: () => { testDone = true; },
+  run: runTest,
+  warmUpCount: 3,
+  iterationCount: 5
+});
+
+</script>
diff --git a/third_party/blink/perf_tests/display_locking/outer_sizes_change_iframe.html b/third_party/blink/perf_tests/display_locking/outer_sizes_change_iframe.html
index b54a219..7e7d1dfe 100644
--- a/third_party/blink/perf_tests/display_locking/outer_sizes_change_iframe.html
+++ b/third_party/blink/perf_tests/display_locking/outer_sizes_change_iframe.html
@@ -71,8 +71,8 @@
     document.getElementById("node_template").content, true).firstElementChild;
   for (let i = 0; i < n; ++i) {
     const clone = specimen.cloneNode(true);
-    if (clone.displayLock && i > 0)
-      clone.displayLock.acquire({ timeout: Infinity, size: [100, 100] });
+    if (i > 0)
+      clone.renderSubtree = "invisible";
     document.body.appendChild(clone);
   }
 }
diff --git a/third_party/blink/perf_tests/display_locking/unlock_top_items.html b/third_party/blink/perf_tests/display_locking/unlock_top_items.html
index a62ffd5..76872b9e 100644
--- a/third_party/blink/perf_tests/display_locking/unlock_top_items.html
+++ b/third_party/blink/perf_tests/display_locking/unlock_top_items.html
@@ -13,6 +13,7 @@
 <style>
 .container {
   contain: style layout;
+  content-size: 100px;
 }
 .box {
   background: blue;
@@ -46,8 +47,7 @@
   for (let i = 0; i < n; ++i) {
     const clone = specimen.cloneNode(true);
     clone.id = "id" + i;
-    if (clone.displayLock)
-      clone.displayLock.acquire({ timeout: Infinity, size: [100, 100] });
+    clone.renderSubtree = "invisible";
     document.body.appendChild(clone);
   }
 }
@@ -56,8 +56,7 @@
 function commitNextLock() {
   const element = document.getElementById("id" + nextId);
   ++nextId;
-  if (element.displayLock)
-    element.displayLock.commit();
+  element.renderSubtree = "";
 }
 
 let testDone = false;
diff --git a/third_party/blink/perf_tests/display_locking/unlock_top_items_nested.html b/third_party/blink/perf_tests/display_locking/unlock_top_items_nested.html
index 797c7de9..7512299 100644
--- a/third_party/blink/perf_tests/display_locking/unlock_top_items_nested.html
+++ b/third_party/blink/perf_tests/display_locking/unlock_top_items_nested.html
@@ -37,6 +37,12 @@
 .container {
   contain: style layout;
 }
+.small {
+  content-size: 100px;
+}
+.large {
+  content-size: 100px 100000px;
+}
 .box {
   background: blue;
   overflow: hidden;
@@ -70,15 +76,15 @@
   for (let i = 0; i < n; ++i) {
     if ((i % 1000) == 0) {
       currentContainer = document.createElement("div");
-      currentContainer.classList = "container";
-      if (i > 0 && currentContainer.displayLock)
-        currentContainer.displayLock.acquire({ timeout: Infinity, size: [100, 100000] });
+      currentContainer.classList = "container large";
+      if (i > 0)
+        currentContainer.renderSubtree = "invisible";
       document.body.appendChild(currentContainer);
     }
     const clone = specimen.cloneNode(true);
     clone.id = "id" + i;
-    if (clone.displayLock)
-      clone.displayLock.acquire({ timeout: Infinity, size: [100, 100] });
+    clone.classList = "container small";
+    clone.renderSubtree = "invisible";
     currentContainer.appendChild(clone);
   }
 }
@@ -87,8 +93,7 @@
 function commitNextLock() {
   const element = document.getElementById("id" + nextId);
   ++nextId;
-  if (element.displayLock)
-    element.displayLock.commit();
+  element.renderSubtree = "";
 }
 
 let testDone = false;
diff --git a/third_party/blink/public/platform/web_runtime_features.h b/third_party/blink/public/platform/web_runtime_features.h
index 287c5c5b..08598ad 100644
--- a/third_party/blink/public/platform/web_runtime_features.h
+++ b/third_party/blink/public/platform/web_runtime_features.h
@@ -189,6 +189,7 @@
   BLINK_PLATFORM_EXPORT static void EnableWebVR(bool);
   BLINK_PLATFORM_EXPORT static void EnableWebXR(bool);
   BLINK_PLATFORM_EXPORT static void EnableWebXRARModule(bool);
+  BLINK_PLATFORM_EXPORT static void EnableWebXRARDOMOverlay(bool);
   BLINK_PLATFORM_EXPORT static void EnableWebXRAnchors(bool);
   BLINK_PLATFORM_EXPORT static void EnableWebXRHitTest(bool);
   BLINK_PLATFORM_EXPORT static void EnableWebXRPlaneDetection(bool);
@@ -235,8 +236,6 @@
   BLINK_PLATFORM_EXPORT static void EnableSkipTouchEventFilter(bool);
   BLINK_PLATFORM_EXPORT static void EnableSmsReceiver(bool);
   BLINK_PLATFORM_EXPORT static void EnableDisplayLocking(bool);
-  BLINK_PLATFORM_EXPORT static void
-  EnablePauseExecutionContextOnBackgroundFreeze(bool);
   BLINK_PLATFORM_EXPORT static void EnableConsolidatedMovementXY(bool);
   BLINK_PLATFORM_EXPORT static void EnableMouseSubframeNoImplicitCapture(bool);
   BLINK_PLATFORM_EXPORT static void EnableBackForwardCache(bool);
diff --git a/third_party/blink/renderer/bindings/core/v8/trace_wrapper_v8_reference_test.cc b/third_party/blink/renderer/bindings/core/v8/trace_wrapper_v8_reference_test.cc
index fd91a6be..d8425c4 100644
--- a/third_party/blink/renderer/bindings/core/v8/trace_wrapper_v8_reference_test.cc
+++ b/third_party/blink/renderer/bindings/core/v8/trace_wrapper_v8_reference_test.cc
@@ -14,7 +14,7 @@
 
 using TraceWrapperV8ReferenceTest = BindingTestSupportingGC;
 
-class TraceWrapperV8ReferenceHolder
+class TraceWrapperV8ReferenceHolder final
     : public GarbageCollected<TraceWrapperV8ReferenceHolder> {
  public:
   TraceWrapperV8ReferenceHolder() = default;
diff --git a/third_party/blink/renderer/core/css/css_selector.cc b/third_party/blink/renderer/core/css/css_selector.cc
index e441087e..bad20600 100644
--- a/third_party/blink/renderer/core/css/css_selector.cc
+++ b/third_party/blink/renderer/core/css/css_selector.cc
@@ -291,6 +291,7 @@
     case kPseudoSlotted:
     case kPseudoVideoPersistent:
     case kPseudoVideoPersistentAncestor:
+    case kPseudoXrImmersiveDomOverlay:
       return kPseudoIdNone;
   }
 
@@ -323,6 +324,8 @@
     {"-internal-video-persistent", CSSSelector::kPseudoVideoPersistent},
     {"-internal-video-persistent-ancestor",
      CSSSelector::kPseudoVideoPersistentAncestor},
+    {"-internal-xr-immersive-dom-overlay",
+     CSSSelector::kPseudoXrImmersiveDomOverlay},
     {"-webkit-any-link", CSSSelector::kPseudoWebkitAnyLink},
     {"-webkit-autofill", CSSSelector::kPseudoAutofill},
     {"-webkit-drag", CSSSelector::kPseudoDrag},
@@ -578,6 +581,7 @@
     case kPseudoSpatialNavigationInterest:
     case kPseudoVideoPersistent:
     case kPseudoVideoPersistentAncestor:
+    case kPseudoXrImmersiveDomOverlay:
       if (mode != kUASheetMode) {
         pseudo_type_ = kPseudoUnknown;
         break;
diff --git a/third_party/blink/renderer/core/css/css_selector.h b/third_party/blink/renderer/core/css/css_selector.h
index 7729ab8..2c4492b 100644
--- a/third_party/blink/renderer/core/css/css_selector.h
+++ b/third_party/blink/renderer/core/css/css_selector.h
@@ -250,6 +250,7 @@
     kPseudoSlotted,
     kPseudoVideoPersistent,
     kPseudoVideoPersistentAncestor,
+    kPseudoXrImmersiveDomOverlay,
   };
 
   enum AttributeMatchType {
diff --git a/third_party/blink/renderer/core/css/fullscreen.css b/third_party/blink/renderer/core/css/fullscreen.css
index a0982ca..7ed4f77 100644
--- a/third_party/blink/renderer/core/css/fullscreen.css
+++ b/third_party/blink/renderer/core/css/fullscreen.css
@@ -65,3 +65,10 @@
   background-color: black !important;
   z-index: 2147483647 !important;
 }
+
+/* WebXR DOM Overlay for handheld AR needs a transparent background for both the
+   fullscreened element and its backdrop. */
+:-internal-xr-immersive-dom-overlay :fullscreen,
+:-internal-xr-immersive-dom-overlay :fullscreen::backdrop {
+  background-color: rgba(0,0,0,0) !important;
+}
diff --git a/third_party/blink/renderer/core/css/parser/css_proto_converter.cc b/third_party/blink/renderer/core/css/parser/css_proto_converter.cc
index 6936279..68a9bbd 100644
--- a/third_party/blink/renderer/core/css/parser/css_proto_converter.cc
+++ b/third_party/blink/renderer/core/css/parser/css_proto_converter.cc
@@ -37,6 +37,7 @@
     "-internal-spatial-navigation-focus",
     "-internal-video-persistent",
     "-internal-video-persistent-ancestor",
+    "-internal-xr-immersive-dom-overlay",
     "-webkit-any-link",
     "-webkit-autofill",
     "-webkit-drag",
diff --git a/third_party/blink/renderer/core/css/rule_feature_set.cc b/third_party/blink/renderer/core/css/rule_feature_set.cc
index 0de92743f..5139f78 100644
--- a/third_party/blink/renderer/core/css/rule_feature_set.cc
+++ b/third_party/blink/renderer/core/css/rule_feature_set.cc
@@ -168,6 +168,7 @@
     case CSSSelector::kPseudoSlotted:
     case CSSSelector::kPseudoVideoPersistent:
     case CSSSelector::kPseudoVideoPersistentAncestor:
+    case CSSSelector::kPseudoXrImmersiveDomOverlay:
       return true;
     case CSSSelector::kPseudoIs:
     case CSSSelector::kPseudoWhere:
@@ -548,6 +549,7 @@
       case CSSSelector::kPseudoDefined:
       case CSSSelector::kPseudoVideoPersistent:
       case CSSSelector::kPseudoVideoPersistentAncestor:
+      case CSSSelector::kPseudoXrImmersiveDomOverlay:
       case CSSSelector::kPseudoSpatialNavigationInterest:
         return &EnsurePseudoInvalidationSet(selector.GetPseudoType(), type,
                                             position);
diff --git a/third_party/blink/renderer/core/css/selector_checker.cc b/third_party/blink/renderer/core/css/selector_checker.cc
index cbb437c..abd7049 100644
--- a/third_party/blink/renderer/core/css/selector_checker.cc
+++ b/third_party/blink/renderer/core/css/selector_checker.cc
@@ -1046,6 +1046,11 @@
     case CSSSelector::kPseudoVideoPersistentAncestor:
       DCHECK(is_ua_rule_);
       return element.ContainsPersistentVideo();
+    case CSSSelector::kPseudoXrImmersiveDomOverlay:
+      DCHECK(is_ua_rule_);
+      // In immersive AR overlay mode, apply a pseudostyle to the root element.
+      return element.GetDocument().IsImmersiveArOverlay() &&
+             element == element.GetDocument().documentElement();
     case CSSSelector::kPseudoInRange:
       return element.IsInRange();
     case CSSSelector::kPseudoOutOfRange:
diff --git a/third_party/blink/renderer/core/dom/document.cc b/third_party/blink/renderer/core/dom/document.cc
index 381aadbb..0a082769 100644
--- a/third_party/blink/renderer/core/dom/document.cc
+++ b/third_party/blink/renderer/core/dom/document.cc
@@ -3182,6 +3182,22 @@
     return;
 }
 
+void Document::SetIsImmersiveArOverlay(bool val) {
+  if (!documentElement())
+    return;
+
+  if (val != is_immersive_ar_overlay_) {
+    DCHECK(RuntimeEnabledFeatures::WebXRARDOMOverlayEnabled(this));
+    is_immersive_ar_overlay_ = val;
+
+    // If the property has changed, apply the pseudo-style change to the root
+    // element. This will cascade further UA stylesheet changes such as setting
+    // the fullscreened element and its backdrop transparent.
+    documentElement()->PseudoStateChanged(
+        CSSSelector::kPseudoXrImmersiveDomOverlay);
+  }
+}
+
 void Document::ScheduleUseShadowTreeUpdate(SVGUseElement& element) {
   use_elements_needing_update_.insert(&element);
   ScheduleLayoutTreeUpdateIfNeeded();
diff --git a/third_party/blink/renderer/core/dom/document.h b/third_party/blink/renderer/core/dom/document.h
index 8394f74..0f76ca3 100644
--- a/third_party/blink/renderer/core/dom/document.h
+++ b/third_party/blink/renderer/core/dom/document.h
@@ -474,6 +474,9 @@
   bool IsViewSource() const { return is_view_source_; }
   void SetIsViewSource(bool);
 
+  bool IsImmersiveArOverlay() const { return is_immersive_ar_overlay_; }
+  void SetIsImmersiveArOverlay(bool);
+
   bool SawElementsInKnownNamespaces() const {
     return saw_elements_in_known_namespaces_;
   }
@@ -1975,6 +1978,7 @@
   DocumentClassFlags document_classes_;
 
   bool is_view_source_;
+  bool is_immersive_ar_overlay_;
   bool saw_elements_in_known_namespaces_;
   bool is_srcdoc_document_;
   bool is_mobile_document_;
diff --git a/third_party/blink/renderer/core/frame/frame.h b/third_party/blink/renderer/core/frame/frame.h
index 161fff2..b0f4e14 100644
--- a/third_party/blink/renderer/core/frame/frame.h
+++ b/third_party/blink/renderer/core/frame/frame.h
@@ -88,8 +88,6 @@
   void Detach(FrameDetachType);
   void DisconnectOwnerElement();
   virtual bool ShouldClose() = 0;
-  virtual void DidFreeze() = 0;
-  virtual void DidResume() = 0;
   virtual void HookBackForwardCacheEviction() = 0;
   virtual void RemoveBackForwardCacheEviction() = 0;
 
diff --git a/third_party/blink/renderer/core/frame/local_frame.cc b/third_party/blink/renderer/core/frame/local_frame.cc
index 0c69b3a..b54f526 100644
--- a/third_party/blink/renderer/core/frame/local_frame.cc
+++ b/third_party/blink/renderer/core/frame/local_frame.cc
@@ -482,61 +482,6 @@
   Frame::DidChangeVisibilityState();
 }
 
-void LocalFrame::DidFreeze() {
-  DCHECK(IsAttached());
-  auto* document_resource_coordinator = GetDocument()->GetResourceCoordinator();
-  if (document_resource_coordinator &&
-      !RuntimeEnabledFeatures::BackForwardCacheEnabled()) {
-    // TODO(yuzus): Skip this block if DidFreeze is triggered by bfcache.
-
-    // Determine if there is a beforeunload handler by dispatching a
-    // beforeunload that will *not* launch a user dialog. If
-    // |proceed| is false then there is a non-empty beforeunload
-    // handler indicating potentially unsaved user state.
-    bool unused_did_allow_navigation = false;
-    bool proceed = GetDocument()->DispatchBeforeUnloadEvent(
-        nullptr, false /* is_reload */, unused_did_allow_navigation);
-
-    // DispatchBeforeUnloadEvent dispatches JS events, which may detatch |this|.
-    if (!IsAttached())
-      return;
-    document_resource_coordinator->SetHasNonEmptyBeforeUnload(!proceed);
-  }
-
-  GetDocument()->DispatchFreezeEvent();
-  // DispatchFreezeEvent dispatches JS events, which may detatch |this|.
-  if (!IsAttached())
-    return;
-  // TODO(fmeawad): Move the following logic to the page once we have a
-  // PageResourceCoordinator in Blink. http://crbug.com/838415
-  if (document_resource_coordinator) {
-    document_resource_coordinator->SetLifecycleState(
-        resource_coordinator::mojom::LifecycleState::kFrozen);
-  }
-}
-
-void LocalFrame::DidResume() {
-  DCHECK(IsAttached());
-  const base::TimeTicks resume_event_start = base::TimeTicks::Now();
-  GetDocument()->DispatchEvent(*Event::Create(event_type_names::kResume));
-  const base::TimeTicks resume_event_end = base::TimeTicks::Now();
-  DEFINE_STATIC_LOCAL(CustomCountHistogram, resume_histogram,
-                      ("DocumentEventTiming.ResumeDuration", 0, 10000000, 50));
-  resume_histogram.CountMicroseconds(resume_event_end - resume_event_start);
-
-  // DispatchEvent dispatchs JS events, which may detatch |this|.
-  if (!IsAttached())
-    return;
-
-  // TODO(fmeawad): Move the following logic to the page once we have a
-  // PageResourceCoordinator in Blink
-  if (auto* document_resource_coordinator =
-          GetDocument()->GetResourceCoordinator()) {
-    document_resource_coordinator->SetLifecycleState(
-        resource_coordinator::mojom::LifecycleState::kRunning);
-  }
-}
-
 void LocalFrame::HookBackForwardCacheEviction() {
   // Register a callback dispatched when JavaScript is executed on the frame.
   // The callback evicts the frame. If a frame is frozen by BackForwardCache,
@@ -1672,6 +1617,60 @@
   Loader().StopAllLoaders();
 }
 
+void LocalFrame::DispatchBeforeUnloadEventForFreeze() {
+  auto* document_resource_coordinator = GetDocument()->GetResourceCoordinator();
+  if (document_resource_coordinator &&
+      lifecycle_state_ == mojom::FrameLifecycleState::kRunning &&
+      !RuntimeEnabledFeatures::BackForwardCacheEnabled()) {
+    // TODO(yuzus): Skip this block if DidFreeze is triggered by bfcache.
+
+    // Determine if there is a beforeunload handler by dispatching a
+    // beforeunload that will *not* launch a user dialog. If
+    // |proceed| is false then there is a non-empty beforeunload
+    // handler indicating potentially unsaved user state.
+    bool unused_did_allow_navigation = false;
+    bool proceed = GetDocument()->DispatchBeforeUnloadEvent(
+        nullptr, false /* is_reload */, unused_did_allow_navigation);
+
+    // DispatchBeforeUnloadEvent dispatches JS events, which may detach |this|.
+    if (!IsAttached())
+      return;
+    document_resource_coordinator->SetHasNonEmptyBeforeUnload(!proceed);
+  }
+}
+
+void LocalFrame::DidFreeze() {
+  DCHECK(IsAttached());
+  GetDocument()->DispatchFreezeEvent();
+  // DispatchFreezeEvent dispatches JS events, which may detach |this|.
+  if (!IsAttached())
+    return;
+  // TODO(fmeawad): Move the following logic to the page once we have a
+  // PageResourceCoordinator in Blink. http://crbug.com/838415
+  if (auto* document_resource_coordinator =
+          GetDocument()->GetResourceCoordinator()) {
+    document_resource_coordinator->SetLifecycleState(
+        resource_coordinator::mojom::LifecycleState::kFrozen);
+  }
+}
+
+void LocalFrame::DidResume() {
+  DCHECK(IsAttached());
+  const base::TimeTicks resume_event_start = base::TimeTicks::Now();
+  GetDocument()->DispatchEvent(*Event::Create(event_type_names::kResume));
+  const base::TimeTicks resume_event_end = base::TimeTicks::Now();
+  DEFINE_STATIC_LOCAL(CustomCountHistogram, resume_histogram,
+                      ("DocumentEventTiming.ResumeDuration", 0, 10000000, 50));
+  resume_histogram.CountMicroseconds(resume_event_end - resume_event_start);
+  // TODO(fmeawad): Move the following logic to the page once we have a
+  // PageResourceCoordinator in Blink
+  if (auto* document_resource_coordinator =
+          GetDocument()->GetResourceCoordinator()) {
+    document_resource_coordinator->SetLifecycleState(
+        resource_coordinator::mojom::LifecycleState::kRunning);
+  }
+}
+
 void LocalFrame::PauseContext() {
   GetDocument()->Fetcher()->SetDefersLoading(true);
   GetDocument()->SetLifecycleState(lifecycle_state_);
@@ -1724,7 +1723,7 @@
   if (freeze) {
     if (lifecycle_state_ != mojom::FrameLifecycleState::kPaused) {
       DidFreeze();
-      // DidFreeze can dispatch JS events, which may detatch |this|.
+      // DidFreeze can dispatch JS events, which may detach |this|.
       if (!IsAttached())
         return;
     }
@@ -1733,7 +1732,7 @@
     UnpauseContext();
     if (old_state != mojom::FrameLifecycleState::kPaused) {
       DidResume();
-      // DidResume can dispatch JS events, which may detatch |this|.
+      // DidResume can dispatch JS events, which may detach |this|.
       if (!IsAttached())
         return;
     }
diff --git a/third_party/blink/renderer/core/frame/local_frame.h b/third_party/blink/renderer/core/frame/local_frame.h
index 0e571be..cbb431f 100644
--- a/third_party/blink/renderer/core/frame/local_frame.h
+++ b/third_party/blink/renderer/core/frame/local_frame.h
@@ -140,8 +140,6 @@
   bool DetachDocument() override;
   void CheckCompleted() override;
   void DidChangeVisibilityState() override;
-  void DidFreeze() override;
-  void DidResume() override;
   void HookBackForwardCacheEviction() override;
   void RemoveBackForwardCacheEviction() override;
   // This sets the is_inert_ flag and also recurses through this frame's
@@ -272,6 +270,7 @@
   void RemoveSpellingMarkersUnderWords(const Vector<String>& words);
 
   bool ShouldThrottleRendering() const;
+  void DispatchBeforeUnloadEventForFreeze();
 
   // Returns frame scheduler for this frame.
   // FrameScheduler is destroyed during frame detach and nullptr will be
@@ -497,6 +496,8 @@
 
   void SetFrameColorOverlay(SkColor color);
 
+  void DidFreeze();
+  void DidResume();
   void PauseContext();
   void UnpauseContext();
 
diff --git a/third_party/blink/renderer/core/frame/local_frame_view.cc b/third_party/blink/renderer/core/frame/local_frame_view.cc
index d6a67da6..937308fd 100644
--- a/third_party/blink/renderer/core/frame/local_frame_view.cc
+++ b/third_party/blink/renderer/core/frame/local_frame_view.cc
@@ -1937,6 +1937,17 @@
   // backdrop.
   if (Document* doc = frame_->GetDocument()) {
     if (Element* element = Fullscreen::FullscreenElementFrom(*doc)) {
+      if (doc->IsImmersiveArOverlay()) {
+        // Use the fullscreened element's background directly. Don't bother
+        // blending with the backdrop since that's transparent.
+        if (LayoutObject* layout_object = element->GetLayoutObject()) {
+          return layout_object->ResolveColor(GetCSSPropertyBackgroundColor());
+        }
+        if (LayoutObject* layout_object =
+                element->PseudoElementLayoutObject(kPseudoIdBackdrop)) {
+          return layout_object->ResolveColor(GetCSSPropertyBackgroundColor());
+        }
+      }
       if (LayoutObject* layout_object =
               element->PseudoElementLayoutObject(kPseudoIdBackdrop)) {
         return result.Blend(
diff --git a/third_party/blink/renderer/core/frame/remote_frame.cc b/third_party/blink/renderer/core/frame/remote_frame.cc
index 39e1716..3ed7f51 100644
--- a/third_party/blink/renderer/core/frame/remote_frame.cc
+++ b/third_party/blink/renderer/core/frame/remote_frame.cc
@@ -168,14 +168,6 @@
   return true;
 }
 
-void RemoteFrame::DidFreeze() {
-  // TODO(fmeawad): Add support for remote frames.
-}
-
-void RemoteFrame::DidResume() {
-  // TODO(fmeawad): Add support for remote frames.
-}
-
 void RemoteFrame::SetIsInert(bool inert) {
   if (inert != is_inert_)
     Client()->SetIsInert(inert);
diff --git a/third_party/blink/renderer/core/frame/remote_frame.h b/third_party/blink/renderer/core/frame/remote_frame.h
index c124278..45851ef8 100644
--- a/third_party/blink/renderer/core/frame/remote_frame.h
+++ b/third_party/blink/renderer/core/frame/remote_frame.h
@@ -39,8 +39,6 @@
   bool DetachDocument() override;
   void CheckCompleted() override;
   bool ShouldClose() override;
-  void DidFreeze() override;
-  void DidResume() override;
   void HookBackForwardCacheEviction() override {}
   void RemoveBackForwardCacheEviction() override {}
   void SetIsInert(bool) override;
diff --git a/third_party/blink/renderer/core/fullscreen/fullscreen.cc b/third_party/blink/renderer/core/fullscreen/fullscreen.cc
index 1ad5cbc2..d15f8707 100644
--- a/third_party/blink/renderer/core/fullscreen/fullscreen.cc
+++ b/third_party/blink/renderer/core/fullscreen/fullscreen.cc
@@ -46,6 +46,7 @@
 #include "third_party/blink/renderer/core/frame/visual_viewport.h"
 #include "third_party/blink/renderer/core/fullscreen/fullscreen_options.h"
 #include "third_party/blink/renderer/core/fullscreen/scoped_allow_fullscreen.h"
+#include "third_party/blink/renderer/core/html/html_body_element.h"
 #include "third_party/blink/renderer/core/html/html_iframe_element.h"
 #include "third_party/blink/renderer/core/html_element_type_helpers.h"
 #include "third_party/blink/renderer/core/input/event_handler.h"
@@ -238,6 +239,19 @@
     return true;
   }
 
+  if (document.IsImmersiveArOverlay()) {
+    // This is a workaround for lack of a user activation when an immersive-ar
+    // session is starting. If the app sets an element fullscreen in the "Enter
+    // AR" button click, that gets unfullscreened when the browser shows its AR
+    // session consent prompt. By the time the session starts, the 5-second
+    // timer for the initial user activation is likely to have expired. This
+    // also allows switching the active fullscreen element during the session.
+    // Note that exiting the immersive-ar session does FullyExitFullscreen to
+    // ensure a consistent post-session state.
+    DVLOG(1) << __func__ << ": allowing fullscreen immersive-ar DOM overlay";
+    return true;
+  }
+
   String message = ExceptionMessages::FailedToExecute(
       "requestFullscreen", "Element",
       "API can only be initiated by a user gesture.");
diff --git a/third_party/blink/renderer/core/inspector/inspector_trace_events.cc b/third_party/blink/renderer/core/inspector/inspector_trace_events.cc
index df4da61..27c534a 100644
--- a/third_party/blink/renderer/core/inspector/inspector_trace_events.cc
+++ b/third_party/blink/renderer/core/inspector/inspector_trace_events.cc
@@ -343,6 +343,7 @@
     DEFINE_STRING_MAPPING(PseudoHostHasAppearance)
     DEFINE_STRING_MAPPING(PseudoVideoPersistent)
     DEFINE_STRING_MAPPING(PseudoVideoPersistentAncestor)
+    DEFINE_STRING_MAPPING(PseudoXrImmersiveDomOverlay)
 #undef DEFINE_STRING_MAPPING
   }
 
diff --git a/third_party/blink/renderer/core/layout/layout_block.cc b/third_party/blink/renderer/core/layout/layout_block.cc
index 961f989..d1567c7 100644
--- a/third_party/blink/renderer/core/layout/layout_block.cc
+++ b/third_party/blink/renderer/core/layout/layout_block.cc
@@ -308,7 +308,8 @@
     // Insert the child into the anonymous block box instead of here.
     if (new_child->IsInline() ||
         (new_child->IsFloatingOrOutOfFlowPositioned() &&
-         !IsFlexibleBoxIncludingNG() && !IsLayoutGrid()) ||
+         (StyleRef().IsDeprecatedFlexboxUsingFlexLayout() ||
+          (!IsFlexibleBoxIncludingNG() && !IsLayoutGrid()))) ||
         before_descendant->Parent()->SlowFirstChild() != before_descendant) {
       before_descendant_container->AddChild(new_child, before_descendant);
     } else {
@@ -350,7 +351,8 @@
 
   if (new_child->IsInline() ||
       (new_child->IsFloatingOrOutOfFlowPositioned() &&
-       !IsFlexibleBoxIncludingNG() && !IsLayoutGrid())) {
+       (StyleRef().IsDeprecatedFlexboxUsingFlexLayout() ||
+        (!IsFlexibleBoxIncludingNG() && !IsLayoutGrid())))) {
     // If we're inserting an inline child but all of our children are blocks,
     // then we have to make sure it is put into an anomyous block box. We try to
     // use an existing anonymous box if possible, otherwise a new one is created
diff --git a/third_party/blink/renderer/core/layout/layout_flexible_box.cc b/third_party/blink/renderer/core/layout/layout_flexible_box.cc
index ecbf895..aa5f1aa 100644
--- a/third_party/blink/renderer/core/layout/layout_flexible_box.cc
+++ b/third_party/blink/renderer/core/layout/layout_flexible_box.cc
@@ -46,6 +46,7 @@
 #include "third_party/blink/renderer/core/style/computed_style.h"
 #include "third_party/blink/renderer/platform/geometry/length_functions.h"
 #include "third_party/blink/renderer/platform/instrumentation/use_counter.h"
+#include "third_party/blink/renderer/platform/runtime_enabled_features.h"
 #include "third_party/blink/renderer/platform/wtf/math_extras.h"
 
 namespace blink {
@@ -273,8 +274,10 @@
 }
 
 void LayoutFlexibleBox::RemoveChild(LayoutObject* child) {
-  if (!DocumentBeingDestroyed())
+  if (!DocumentBeingDestroyed() &&
+      !StyleRef().IsDeprecatedFlexboxUsingFlexLayout()) {
     MergeAnonymousFlexItems(child);
+  }
 
   LayoutBlock::RemoveChild(child);
   intrinsic_size_along_main_axis_.erase(child);
diff --git a/third_party/blink/renderer/core/layout/layout_object.cc b/third_party/blink/renderer/core/layout/layout_object.cc
index bfd2a36..c97dac4 100644
--- a/third_party/blink/renderer/core/layout/layout_object.cc
+++ b/third_party/blink/renderer/core/layout/layout_object.cc
@@ -255,11 +255,8 @@
       return LayoutObjectFactory::CreateTableCaption(*element, style, legacy);
     case EDisplay::kWebkitBox:
     case EDisplay::kWebkitInlineBox:
-      if (RuntimeEnabledFeatures::WebkitBoxLayoutUsesFlexLayoutEnabled() &&
-          (!style.HasLineClamp() ||
-           style.BoxOrient() == EBoxOrient::kHorizontal)) {
+      if (style.IsDeprecatedFlexboxUsingFlexLayout())
         return new LayoutFlexibleBox(element);
-      }
       return new LayoutDeprecatedFlexibleBox(*element);
     case EDisplay::kFlex:
     case EDisplay::kInlineFlex:
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_physical_line_box_fragment.h b/third_party/blink/renderer/core/layout/ng/inline/ng_physical_line_box_fragment.h
index 7a453e3..7fc614b 100644
--- a/third_party/blink/renderer/core/layout/ng/inline/ng_physical_line_box_fragment.h
+++ b/third_party/blink/renderer/core/layout/ng/inline/ng_physical_line_box_fragment.h
@@ -57,9 +57,9 @@
   NGLineHeightMetrics BaselineMetrics(FontBaseline) const;
 
   // Scrollable overflow. including contents, in the local coordinate.
-  // ScrollableOverflow is not precomputed/cached because it cannot be computed
-  // when LineBox is generated because it needs container dimensions to
-  // resolve relative position of its children.
+  // |ScrollableOverflow| is not precomputed/cached because it cannot be
+  // computed when LineBox is generated because it needs container dimensions
+  // to resolve relative position of its children.
   PhysicalRect ScrollableOverflow(const LayoutObject* container,
                                   const ComputedStyle* container_style,
                                   PhysicalSize container_physical_size) const;
diff --git a/third_party/blink/renderer/core/layout/ng/layout_ng_block_flow_mixin.cc b/third_party/blink/renderer/core/layout/ng/layout_ng_block_flow_mixin.cc
index 5561379..4f49e5f3 100644
--- a/third_party/blink/renderer/core/layout/ng/layout_ng_block_flow_mixin.cc
+++ b/third_party/blink/renderer/core/layout/ng/layout_ng_block_flow_mixin.cc
@@ -107,12 +107,13 @@
   if (physical_fragment->Children().empty())
     return;
 
-  LayoutUnit border_inline_start =
-      LayoutUnit(Base::StyleRef().BorderStartWidth());
-  LayoutUnit border_block_start =
-      LayoutUnit(Base::StyleRef().BorderBeforeWidth());
-  WritingMode writing_mode = Base::StyleRef().GetWritingMode();
-  TextDirection direction = Base::StyleRef().Direction();
+  const ComputedStyle& style = Base::StyleRef();
+  const WritingMode writing_mode = style.GetWritingMode();
+  const TextDirection direction = style.Direction();
+  const LayoutUnit border_inline_start = LayoutUnit(style.BorderStartWidth());
+  const LayoutUnit border_block_start = LayoutUnit(style.BorderBeforeWidth());
+  const PhysicalSize& size = physical_fragment->Size();
+
   // End and under padding are added to scroll overflow of inline children.
   // https://github.com/w3c/csswg-drafts/issues/129
   base::Optional<NGPhysicalBoxStrut> padding_strut;
@@ -121,17 +122,17 @@
                                Base::PaddingUnder())
                         .ConvertToPhysical(writing_mode, direction);
   }
+
   // Rectangles not reachable by scroll should not be added to overflow.
-  auto IsRectReachableByScroll =
-      [&border_inline_start, &border_block_start, &writing_mode, &direction,
-       &physical_fragment](const PhysicalRect& rect) {
-        LogicalOffset rect_logical_end =
-            rect.offset.ConvertToLogical(writing_mode, direction,
-                                         physical_fragment->Size(), rect.size) +
-            rect.size.ConvertToLogical(writing_mode);
-        return (rect_logical_end.inline_offset > border_inline_start &&
-                rect_logical_end.block_offset > border_block_start);
-      };
+  auto IsRectReachableByScroll = [&border_inline_start, &border_block_start,
+                                  &writing_mode, &direction,
+                                  &size](const PhysicalRect& rect) {
+    LogicalOffset rect_logical_end =
+        rect.offset.ConvertToLogical(writing_mode, direction, size, rect.size) +
+        rect.size.ConvertToLogical(writing_mode);
+    return (rect_logical_end.inline_offset > border_inline_start &&
+            rect_logical_end.block_offset > border_block_start);
+  };
 
   bool children_inline = Base::ChildrenInline();
   PhysicalRect children_overflow;
@@ -146,11 +147,13 @@
     PhysicalRect child_scrollable_overflow;
     if (child->IsFloatingOrOutOfFlowPositioned()) {
       child_scrollable_overflow = child->ScrollableOverflowForPropagation(this);
+      child_scrollable_overflow.offset +=
+          ComputeRelativeOffset(child->Style(), writing_mode, direction, size);
     } else if (children_inline && child->IsLineBox()) {
       DCHECK(child->IsLineBox());
       child_scrollable_overflow =
-          To<NGPhysicalLineBoxFragment>(*child).ScrollableOverflow(
-              this, Base::Style(), physical_fragment->Size());
+          To<NGPhysicalLineBoxFragment>(*child).ScrollableOverflow(this, &style,
+                                                                   size);
       if (padding_strut) {
         PhysicalRect linebox_rect(child.Offset(), child->Size());
         if (lineboxes_enclosing_rect)
@@ -173,8 +176,8 @@
   }
 
   // LayoutOverflow takes flipped blocks coordinates, adjust as needed.
-  LayoutRect children_flipped_overflow = children_overflow.ToLayoutFlippedRect(
-      physical_fragment->Style(), physical_fragment->Size());
+  LayoutRect children_flipped_overflow =
+      children_overflow.ToLayoutFlippedRect(style, size);
   Base::AddLayoutOverflow(children_flipped_overflow);
 }
 
diff --git a/third_party/blink/renderer/core/layout/ng/ng_physical_fragment.h b/third_party/blink/renderer/core/layout/ng/ng_physical_fragment.h
index 3daecb27..19c743c 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_physical_fragment.h
+++ b/third_party/blink/renderer/core/layout/ng/ng_physical_fragment.h
@@ -220,6 +220,7 @@
   PhysicalRect ScrollableOverflow() const;
 
   // ScrollableOverflow(), with transforms applied wrt container if needed.
+  // This does not include any offsets from the parent (including relpos).
   PhysicalRect ScrollableOverflowForPropagation(
       const LayoutObject* container) const;
 
diff --git a/third_party/blink/renderer/core/layout/ng/ng_relative_utils.h b/third_party/blink/renderer/core/layout/ng/ng_relative_utils.h
index 8dc07e6..5c2ce9d5 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_relative_utils.h
+++ b/third_party/blink/renderer/core/layout/ng/ng_relative_utils.h
@@ -14,9 +14,9 @@
 class ComputedStyle;
 struct PhysicalOffset;
 
-// Implements relative positioning spec:
+// Implements the relative positioning spec:
 // https://www.w3.org/TR/css-position-3/#rel-pos
-// Return relative position offset as defined by style.
+// Returns the relative position offset as defined by |child_style|.
 CORE_EXPORT PhysicalOffset
 ComputeRelativeOffset(const ComputedStyle& child_style,
                       WritingMode container_writing_mode,
diff --git a/third_party/blink/renderer/core/page/page.cc b/third_party/blink/renderer/core/page/page.cc
index c3257b04..35c1f53c 100644
--- a/third_party/blink/renderer/core/page/page.cc
+++ b/third_party/blink/renderer/core/page/page.cc
@@ -512,50 +512,27 @@
     return;
   DCHECK_NE(state, PageLifecycleState::kUnknown);
 
-  // When background tab freezing was first shipped it didn't pause
-  // the execution context but froze the frame scheduler. This feature
-  // flag attempts to bring the two mechanisms to use the same path for
-  // all pausing and freezing.
-  // This allows for mojo channels, workers to also be frozen because
-  // they listen for the page execution context being paused/frozen.
-  if (RuntimeEnabledFeatures::
-          PauseExecutionContextOnBackgroundFreezeEnabled()) {
-    base::Optional<mojom::FrameLifecycleState> next_state;
-    if (state == PageLifecycleState::kFrozen) {
-      next_state = mojom::FrameLifecycleState::kFrozen;
-    } else if (page_lifecycle_state_ == PageLifecycleState::kFrozen) {
-      // TODO(fmeawad): Only resume the page that just became visible, blocked
-      // on task queues per frame.
-      DCHECK(state == PageLifecycleState::kActive ||
-             state == PageLifecycleState::kHiddenBackgrounded ||
-             state == PageLifecycleState::kHiddenForegrounded);
-      next_state = mojom::FrameLifecycleState::kRunning;
-    }
+  base::Optional<mojom::FrameLifecycleState> next_state;
+  if (state == PageLifecycleState::kFrozen) {
+    next_state = mojom::FrameLifecycleState::kFrozen;
+  } else if (page_lifecycle_state_ == PageLifecycleState::kFrozen) {
+    // TODO(fmeawad): Only resume the page that just became visible, blocked
+    // on task queues per frame.
+    DCHECK(state == PageLifecycleState::kActive ||
+           state == PageLifecycleState::kHiddenBackgrounded ||
+           state == PageLifecycleState::kHiddenForegrounded);
+    next_state = mojom::FrameLifecycleState::kRunning;
+  }
 
-    if (next_state) {
-      for (Frame* frame = main_frame_.Get(); frame;
-           frame = frame->Tree().TraverseNext()) {
-        if (auto* local_frame = DynamicTo<LocalFrame>(frame))
-          local_frame->SetLifecycleState(next_state.value());
-      }
-    }
-  } else {
-    // The following code will dispatch the freeze/resume events,
-    // freeze the frame scheduler but but not pause the execution context.
-    if (state == PageLifecycleState::kFrozen) {
-      for (Frame* frame = main_frame_.Get(); frame;
-           frame = frame->Tree().TraverseNext()) {
-        frame->DidFreeze();
-      }
-    } else if (page_lifecycle_state_ == PageLifecycleState::kFrozen) {
-      // TODO(fmeawad): Only resume the page that just became visible, blocked
-      // on task queues per frame.
-      DCHECK(state == PageLifecycleState::kActive ||
-             state == PageLifecycleState::kHiddenBackgrounded ||
-             state == PageLifecycleState::kHiddenForegrounded);
-      for (Frame* frame = main_frame_.Get(); frame;
-           frame = frame->Tree().TraverseNext()) {
-        frame->DidResume();
+  if (next_state) {
+    for (Frame* frame = main_frame_.Get(); frame;
+         frame = frame->Tree().TraverseNext()) {
+      if (auto* local_frame = DynamicTo<LocalFrame>(frame)) {
+        // TODO(chrisha): Determine if dispatching the before unload
+        // makes sense and if so put it into a specification.
+        if (next_state == mojom::FrameLifecycleState::kFrozen)
+          local_frame->DispatchBeforeUnloadEventForFreeze();
+        local_frame->SetLifecycleState(next_state.value());
       }
     }
   }
diff --git a/third_party/blink/renderer/core/style/computed_style.h b/third_party/blink/renderer/core/style/computed_style.h
index 84b5d96..0e99d9f 100644
--- a/third_party/blink/renderer/core/style/computed_style.h
+++ b/third_party/blink/renderer/core/style/computed_style.h
@@ -1203,6 +1203,11 @@
     return Display() == EDisplay::kWebkitBox ||
            Display() == EDisplay::kWebkitInlineBox;
   }
+  bool IsDeprecatedFlexboxUsingFlexLayout() const {
+    return IsDeprecatedWebkitBox() &&
+           RuntimeEnabledFeatures::WebkitBoxLayoutUsesFlexLayoutEnabled() &&
+           (!HasLineClamp() || BoxOrient() == EBoxOrient::kHorizontal);
+  }
 
   // Variables.
   bool HasVariables() const;
@@ -2091,7 +2096,6 @@
   bool IsDisplayFlexibleOrGridBox() const {
     return IsDisplayFlexibleBox(Display()) || IsDisplayGridBox(Display());
   }
-  bool IsDisplayFlexibleBox() const { return IsDisplayFlexibleBox(Display()); }
   bool IsDisplayLayoutCustomBox() const {
     return IsDisplayLayoutCustomBox(Display());
   }
diff --git a/third_party/blink/renderer/core/svg/animation/smil_animation_sandwich.cc b/third_party/blink/renderer/core/svg/animation/smil_animation_sandwich.cc
index 19f1709..0019776 100644
--- a/third_party/blink/renderer/core/svg/animation/smil_animation_sandwich.cc
+++ b/third_party/blink/renderer/core/svg/animation/smil_animation_sandwich.cc
@@ -31,6 +31,19 @@
 
 namespace blink {
 
+namespace {
+
+struct PriorityCompare {
+  PriorityCompare(SMILTime elapsed) : elapsed_(elapsed) {}
+  bool operator()(const Member<SVGSMILElement>& a,
+                  const Member<SVGSMILElement>& b) {
+    return b->IsHigherPriorityThan(a, elapsed_);
+  }
+  SMILTime elapsed_;
+};
+
+}  // namespace
+
 SMILAnimationSandwich::SMILAnimationSandwich() = default;
 
 void SMILAnimationSandwich::Schedule(SVGSMILElement* animation) {
diff --git a/third_party/blink/renderer/core/svg/animation/smil_animation_sandwich.h b/third_party/blink/renderer/core/svg/animation/smil_animation_sandwich.h
index e56138e..08a938a 100644
--- a/third_party/blink/renderer/core/svg/animation/smil_animation_sandwich.h
+++ b/third_party/blink/renderer/core/svg/animation/smil_animation_sandwich.h
@@ -33,21 +33,6 @@
 
 namespace blink {
 
-struct PriorityCompare {
-  PriorityCompare(SMILTime elapsed) : elapsed_(elapsed) {}
-  bool operator()(const Member<SVGSMILElement>& a,
-                  const Member<SVGSMILElement>& b) {
-    // FIXME: This should also consider possible timing relations between the
-    // elements.
-    SMILTime a_begin = a->BeginTimeForPrioritization(elapsed_);
-    SMILTime b_begin = b->BeginTimeForPrioritization(elapsed_);
-    if (a_begin == b_begin)
-      return a->DocumentOrderIndex() < b->DocumentOrderIndex();
-    return a_begin < b_begin;
-  }
-  SMILTime elapsed_;
-};
-
 // This class implements/helps with implementing the "sandwich model" from SMIL.
 // https://www.w3.org/TR/SMIL3/smil-animation.html#animationNS-AnimationSandwichModel
 //
diff --git a/third_party/blink/renderer/core/svg/animation/smil_time_container.cc b/third_party/blink/renderer/core/svg/animation/smil_time_container.cc
index 74526da..ee62347 100644
--- a/third_party/blink/renderer/core/svg/animation/smil_time_container.cc
+++ b/third_party/blink/renderer/core/svg/animation/smil_time_container.cc
@@ -524,8 +524,13 @@
   // Everything bellow handles "discard" elements.
   UseCounter::Count(&GetDocument(), WebFeature::kSVGSMILAnimationAppliedEffect);
 
-  std::sort(animations_to_apply.begin(), animations_to_apply.end(),
-            PriorityCompare(elapsed));
+  // Sort by location in the document. (Should be based on the target rather
+  // than the timed element, but often enough they will order the same.)
+  std::sort(
+      animations_to_apply.begin(), animations_to_apply.end(),
+      [](const Member<SVGSMILElement>& a, const Member<SVGSMILElement>& b) {
+        return a->DocumentOrderIndex() < b->DocumentOrderIndex();
+      });
 
   for (const auto& timed_element : animations_to_apply) {
     if (timed_element->isConnected() && timed_element->IsSVGDiscardElement()) {
diff --git a/third_party/blink/renderer/core/svg/animation/svg_smil_element.cc b/third_party/blink/renderer/core/svg/animation/svg_smil_element.cc
index a621924..e2ef7946 100644
--- a/third_party/blink/renderer/core/svg/animation/svg_smil_element.cc
+++ b/third_party/blink/renderer/core/svg/animation/svg_smil_element.cc
@@ -605,6 +605,17 @@
   return interval_.begin;
 }
 
+bool SVGSMILElement::IsHigherPriorityThan(const SVGSMILElement* other,
+                                          SMILTime presentation_time) const {
+  // FIXME: This should also consider possible timing relations between the
+  // elements.
+  SMILTime this_begin = BeginTimeForPrioritization(presentation_time);
+  SMILTime other_begin = other->BeginTimeForPrioritization(presentation_time);
+  if (this_begin == other_begin)
+    return DocumentOrderIndex() > other->DocumentOrderIndex();
+  return this_begin > other_begin;
+}
+
 SMILTime SVGSMILElement::Dur() const {
   if (cached_dur_ != kInvalidCachedTime)
     return cached_dur_;
diff --git a/third_party/blink/renderer/core/svg/animation/svg_smil_element.h b/third_party/blink/renderer/core/svg/animation/svg_smil_element.h
index 16b117a..92cc9e7 100644
--- a/third_party/blink/renderer/core/svg/animation/svg_smil_element.h
+++ b/third_party/blink/renderer/core/svg/animation/svg_smil_element.h
@@ -82,12 +82,13 @@
   SMILTime Elapsed() const;
 
   SMILTime IntervalBegin() const { return interval_.begin; }
-  SMILTime BeginTimeForPrioritization(SMILTime presentation_time) const;
   SMILTime SimpleDuration() const;
 
   bool CurrentIntervalIsActive(SMILTime elapsed);
   void UpdateInterval(SMILTime presentation_time);
   void UpdateActiveState(SMILTime elapsed);
+  bool IsHigherPriorityThan(const SVGSMILElement* other,
+                            SMILTime presentation_time) const;
 
   SMILTime NextInterestingTime(SMILTime elapsed) const;
   SMILTime NextProgressTime(SMILTime elapsed) const;
@@ -157,6 +158,7 @@
   SMILTime FindInstanceTime(BeginOrEnd,
                             SMILTime minimum_time,
                             bool equals_minimum_ok) const;
+  SMILTime BeginTimeForPrioritization(SMILTime presentation_time) const;
 
   SMILInterval ResolveInterval(SMILTime begin_after, SMILTime end_after) const;
   bool ResolveFirstInterval();
diff --git a/third_party/blink/renderer/devtools/.gitignore b/third_party/blink/renderer/devtools/.gitignore
index b827cf2e..c401c863 100644
--- a/third_party/blink/renderer/devtools/.gitignore
+++ b/third_party/blink/renderer/devtools/.gitignore
@@ -13,7 +13,6 @@
 /.dev_profile
 /.test_cache
 /release
-/scripts/local_node/runtimes
 /scripts/visualize_deps/out
 /front_end/protocol_externs.js
 package-lock.json
diff --git a/third_party/blink/renderer/devtools/BUILD.gn b/third_party/blink/renderer/devtools/BUILD.gn
index 6adb8df..a477297 100644
--- a/third_party/blink/renderer/devtools/BUILD.gn
+++ b/third_party/blink/renderer/devtools/BUILD.gn
@@ -1714,7 +1714,7 @@
       ".eslintrc.js",
       "front_end/",
       "scripts/lint_javascript.py",
-      "scripts/local_node.py",
+      "scripts/devtools_paths.py",
       "//testing/scripts/common.py",
       "//testing/scripts/run_devtools_check.py",
       "//testing/xvfb.py",
diff --git a/third_party/blink/renderer/devtools/PRESUBMIT.py b/third_party/blink/renderer/devtools/PRESUBMIT.py
index 1ada106..5c3c6ae 100644
--- a/third_party/blink/renderer/devtools/PRESUBMIT.py
+++ b/third_party/blink/renderer/devtools/PRESUBMIT.py
@@ -25,7 +25,7 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-"""DevTools JSDoc validator presubmit script
+"""DevTools presubmit script
 
 See http://dev.chromium.org/developers/how-tos/depottools/presubmit-scripts
 for more details about the presubmit API built into gcl.
@@ -50,7 +50,7 @@
     original_sys_path = sys.path
     try:
         sys.path = sys.path + [input_api.os_path.join(input_api.PresubmitLocalPath(), "scripts")]
-        import local_node
+        import devtools_paths
     finally:
         sys.path = original_sys_path
 
@@ -77,7 +77,7 @@
 
     # Use eslint to autofix the braces.
     # Also fix semicolon to avoid confusing clang-format.
-    eslint_process = popen([local_node.node_path(), local_node.eslint_path(), '--config', '.eslintrc.js', '--fix'] + affected_files)
+    eslint_process = popen([devtools_paths.node_path(), devtools_paths.eslint_path(), '--config', '.eslintrc.js', '--fix'] + affected_files)
     eslint_process.communicate()
 
     # Need to run clang-format again to align the braces
@@ -228,11 +228,11 @@
     original_sys_path = sys.path
     try:
         sys.path = sys.path + [input_api.os_path.join(input_api.PresubmitLocalPath(), "scripts")]
-        import local_node
+        import devtools_paths
     finally:
         sys.path = original_sys_path
 
-    node_path = local_node.node_path()
+    node_path = devtools_paths.node_path()
 
     if script_arguments is None:
         script_arguments = []
diff --git a/third_party/blink/renderer/devtools/karma.conf.js b/third_party/blink/renderer/devtools/karma.conf.js
index 916bf48..e31def1 100644
--- a/third_party/blink/renderer/devtools/karma.conf.js
+++ b/third_party/blink/renderer/devtools/karma.conf.js
@@ -2,9 +2,15 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+// TODO(1011259): switch to true.
+let external_devtools_frontend = false;
+let node_modules_path = external_devtools_frontend
+    ? ''
+    : '../../../../third_party/devtools-node-modules/third_party/node_modules/';
+
 module.exports = function(config) {
   const options = {
-    basePath: "",
+    basePath: '',
 
     files: [{
       pattern: 'front_end/**/*.js',
@@ -15,33 +21,33 @@
       type: 'module'
     }],
 
-    reporters: ["dots", "coverage-istanbul"],
+    reporters: ['dots', 'coverage-istanbul'],
 
     preprocessors: {
       './tests/**/*.ts': ['karma-typescript'],
       './front_end/common/*.js': ['karma-coverage-istanbul-instrumenter']
     },
 
-    browsers: ["ChromeHeadless"],
+    browsers: ['ChromeHeadless'],
 
-    frameworks: ["mocha", "chai", "karma-typescript"],
+    frameworks: ['mocha', 'chai', 'karma-typescript'],
 
     karmaTypescriptConfig: {
       compilerOptions: {
-        target: "esnext",
-        module: "esnext",
-        typeRoots: ["../../../../third_party/devtools-node-modules/third_party/node_modules/@types"]
+        target: 'esnext',
+        module: 'esnext',
+        typeRoots: [node_modules_path + '@types']
       },
       coverageOptions: {
         instrumentation: false
       },
       bundlerOptions: {
         resolve: {
-          directories: ["../../../../third_party/devtools-node-modules/third_party/node_modules"]
+          directories: [node_modules_path]
         }
       },
       exclude: [
-        "scripts"
+        'scripts'
       ]
     },
 
@@ -50,12 +56,12 @@
     },
 
     plugins: [
-      "karma-chrome-launcher",
-      "karma-mocha",
-      "karma-chai",
-      "karma-typescript",
-      require('../../../../third_party/devtools-node-modules/third_party/node_modules/karma-coverage-istanbul-instrumenter'),
-      require('../../../../third_party/devtools-node-modules/third_party/node_modules/karma-coverage-istanbul-reporter')
+      'karma-chrome-launcher',
+      'karma-mocha',
+      'karma-chai',
+      'karma-typescript',
+      require(node_modules_path + 'karma-coverage-istanbul-instrumenter'),
+      require(node_modules_path + 'karma-coverage-istanbul-reporter')
     ],
 
     coverageIstanbulInstrumenter: {
@@ -63,8 +69,8 @@
     },
 
     coverageIstanbulReporter: {
-      reports: ["text", "html"],
-      dir: "karma-coverage"
+      reports: ['text', 'html'],
+      dir: 'karma-coverage'
     },
 
     singleRun: true
diff --git a/third_party/blink/renderer/devtools/scripts/README.md b/third_party/blink/renderer/devtools/scripts/README.md
index e7ac952..183bcdf 100644
--- a/third_party/blink/renderer/devtools/scripts/README.md
+++ b/third_party/blink/renderer/devtools/scripts/README.md
@@ -16,7 +16,6 @@
 - gulp - experimental build process written in node.js & gulp to remove the dependency on Chromium-specific build tools (i.e. gn and ninja)
 - hosted_mode - run DevTools on a localhost development server
 - jsdoc_validator - enforces the use of Closure type annotations
-- local_node - installs a local runtime of node.js
 
 ### Python Scripts
 - compile_frontend.py - runs closure compiler to do static type analysis
@@ -30,4 +29,4 @@
 
 ## Closure
 
-DevTools manually rolls the closure compiler to ./closure. If you manually roll closure compiler, you will need to re-generate the closure_runner (in ./closure) and jsdoc_validator custom jars using the python scripts in their respective directory.
\ No newline at end of file
+DevTools manually rolls the closure compiler to ./closure. If you manually roll closure compiler, you will need to re-generate the closure_runner (in ./closure) and jsdoc_validator custom jars using the python scripts in their respective directory.
diff --git a/third_party/blink/renderer/devtools/scripts/devtools_paths.py b/third_party/blink/renderer/devtools/scripts/devtools_paths.py
new file mode 100644
index 0000000..14d721c7
--- /dev/null
+++ b/third_party/blink/renderer/devtools/scripts/devtools_paths.py
@@ -0,0 +1,73 @@
+# Copyright 2019 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.
+"""
+Helper to find the path to the correct third_party directory
+"""
+
+from os import path
+import sys
+
+
+# Find the root path of the checkout.
+# In the Chromium repository, this is the src/chromium directory.
+# In the external repository, standalone build, this is the devtools-frontend directory.
+# In the external repository, integrated build, this is the src/chromium directory.
+def root_path():
+    SCRIPTS_PATH = path.dirname(path.abspath(__file__))
+    ABS_DEVTOOLS_PATH = path.dirname(SCRIPTS_PATH)
+    PARENT_PATH = path.dirname(ABS_DEVTOOLS_PATH)
+    # TODO(1011259): remove Chromium repository handling
+    if path.basename(PARENT_PATH) == 'renderer':
+        # Chromium repository
+        return path.dirname(path.dirname(path.dirname(PARENT_PATH)))
+    elif path.basename(PARENT_PATH) == 'third_party':
+        # External repository, integrated build
+        return path.dirname(PARENT_PATH)
+    else:
+        # External repository, standalone build
+        return ABS_DEVTOOLS_PATH
+
+
+# This is the third_party path relative to the root of the checkout.
+def third_party_path():
+    return path.join(root_path(), 'third_party')
+
+
+# This points to the node binary downloaded as part of the checkout.
+def node_path():
+    try:
+        old_sys_path = sys.path[:]
+        sys.path.append(path.join(third_party_path(), 'node'))
+        import node
+    finally:
+        sys.path = old_sys_path
+    return node.GetBinaryPath()
+
+
+DEVTOOLS_ROOT_PATH = path.join(path.dirname(__file__), '..')
+
+
+def node_modules_path():
+    SCRIPTS_PATH = path.dirname(path.abspath(__file__))
+    ABS_DEVTOOLS_PATH = path.dirname(SCRIPTS_PATH)
+    PARENT_PATH = path.dirname(ABS_DEVTOOLS_PATH)
+    # TODO(1011259): remove Chromium repository handling
+    if path.basename(PARENT_PATH) == 'renderer':
+        # While in Chromium repo, node modules are hosted in //third_party/devtools-node-modules.
+        return path.join(root_path(), 'third_party', 'devtools-node-modules', 'third_party', 'node_modules')
+    else:
+        # In the external repo, node modules are hosted in root.
+        return path.join(root_path(), 'node_modules')
+
+
+def eslint_path():
+    return path.join(node_modules_path(), 'eslint', 'bin', 'eslint.js')
+
+
+def karma_path():
+    return path.join(node_modules_path(), 'karma', 'bin', 'karma')
+
+
+def package_json_path():
+    return path.join(DEVTOOLS_ROOT_PATH, 'package.json')
diff --git a/third_party/blink/renderer/devtools/scripts/lint_javascript.py b/third_party/blink/renderer/devtools/scripts/lint_javascript.py
index 4479e58..19d31cd 100755
--- a/third_party/blink/renderer/devtools/scripts/lint_javascript.py
+++ b/third_party/blink/renderer/devtools/scripts/lint_javascript.py
@@ -9,7 +9,7 @@
 import subprocess
 import sys
 
-import local_node
+import devtools_paths
 
 files_to_lint = None
 
@@ -63,8 +63,8 @@
     eslintconfig_path = path.join(devtools_path, ".eslintrc.js")
     eslintignore_path = path.join(devtools_path, ".eslintignore")
     exec_command = [
-        local_node.node_path(),
-        local_node.eslint_path(),
+        devtools_paths.node_path(),
+        devtools_paths.eslint_path(),
         "--config",
         to_platform_path_exact(eslintconfig_path),
         "--ignore-path",
diff --git a/third_party/blink/renderer/devtools/scripts/local_node.py b/third_party/blink/renderer/devtools/scripts/local_node.py
deleted file mode 100644
index 25a378c..0000000
--- a/third_party/blink/renderer/devtools/scripts/local_node.py
+++ /dev/null
@@ -1,39 +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.
-"""
-Thin wrapper around the local node.js installed as part of chromium DEPS
-"""
-
-from os import path
-import sys
-
-SCRIPTS_PATH = path.dirname(path.abspath(__file__))
-THIRD_PARTY_PATH = path.join(SCRIPTS_PATH, '..', '..', '..', '..')
-NODE_PATH = path.join(THIRD_PARTY_PATH, 'node')
-ESLINT_PATH = path.join(THIRD_PARTY_PATH, 'devtools-node-modules', 'third_party', 'node_modules', 'eslint', 'bin', 'eslint.js')
-KARMA_PATH = path.join(THIRD_PARTY_PATH, 'devtools-node-modules', 'third_party', 'node_modules', 'karma', 'bin', 'karma')
-NODE_MODULES_PATH = path.join(THIRD_PARTY_PATH, 'devtools-node-modules', 'third_party', 'node_modules')
-
-try:
-    old_sys_path = sys.path[:]
-    sys.path.append(NODE_PATH)
-    import node
-finally:
-    sys.path = old_sys_path
-
-
-def node_path():
-    return node.GetBinaryPath()
-
-
-def eslint_path():
-    return ESLINT_PATH
-
-
-def karma_path():
-    return KARMA_PATH
-
-
-def node_modules_path():
-    return NODE_MODULES_PATH
diff --git a/third_party/blink/renderer/devtools/scripts/run_tests.py b/third_party/blink/renderer/devtools/scripts/run_tests.py
index 5289dcd4..6f95fb0 100755
--- a/third_party/blink/renderer/devtools/scripts/run_tests.py
+++ b/third_party/blink/renderer/devtools/scripts/run_tests.py
@@ -9,7 +9,7 @@
 import subprocess
 import sys
 
-import local_node
+import devtools_paths
 
 is_cygwin = sys.platform == "cygwin"
 chrome_binary = None
@@ -48,9 +48,9 @@
     karma_errors_found = False
 
     karmaconfig_path = os.path.join(devtools_path, "karma.conf.js")
-    exec_command = [local_node.node_path(), local_node.karma_path(), "start", to_platform_path_exact(karmaconfig_path)]
+    exec_command = [devtools_paths.node_path(), devtools_paths.karma_path(), "start", to_platform_path_exact(karmaconfig_path)]
 
-    env = {'NODE_PATH': local_node.node_modules_path()}
+    env = {'NODE_PATH': devtools_paths.node_modules_path()}
     if (chrome_binary is not None):
         env['CHROME_BIN'] = chrome_binary
 
diff --git a/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.cc b/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.cc
index 809e3b94..87d82645 100644
--- a/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.cc
+++ b/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.cc
@@ -7516,9 +7516,12 @@
 }
 
 void WebGLRenderingContextBase::PrintWarningToConsole(const String& message) {
-  Host()->GetTopExecutionContext()->AddConsoleMessage(
-      ConsoleMessage::Create(mojom::ConsoleMessageSource::kRendering,
-                             mojom::ConsoleMessageLevel::kWarning, message));
+  blink::ExecutionContext* context = Host()->GetTopExecutionContext();
+  if (context) {
+    context->AddConsoleMessage(
+        ConsoleMessage::Create(mojom::ConsoleMessageSource::kRendering,
+                               mojom::ConsoleMessageLevel::kWarning, message));
+  }
 }
 
 bool WebGLRenderingContextBase::ValidateFramebufferFuncParameters(
diff --git a/third_party/blink/renderer/modules/xr/xr.cc b/third_party/blink/renderer/modules/xr/xr.cc
index e1975ebf..97cfbc7 100644
--- a/third_party/blink/renderer/modules/xr/xr.cc
+++ b/third_party/blink/renderer/modules/xr/xr.cc
@@ -13,8 +13,12 @@
 #include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h"
 #include "third_party/blink/renderer/core/dom/document.h"
 #include "third_party/blink/renderer/core/dom/dom_exception.h"
+#include "third_party/blink/renderer/core/dom/element.h"
 #include "third_party/blink/renderer/core/frame/local_frame.h"
+#include "third_party/blink/renderer/core/fullscreen/fullscreen.h"
+#include "third_party/blink/renderer/core/html/html_element.h"
 #include "third_party/blink/renderer/core/inspector/console_message.h"
+#include "third_party/blink/renderer/core/layout/layout_view.h"
 #include "third_party/blink/renderer/core/loader/document_loader.h"
 #include "third_party/blink/renderer/modules/event_modules.h"
 #include "third_party/blink/renderer/modules/event_target_modules.h"
@@ -111,6 +115,7 @@
 // unrecognized, returns nullopt. Based on the spec:
 // https://immersive-web.github.io/webxr/#feature-name
 base::Optional<device::mojom::XRSessionFeature> StringToXRSessionFeature(
+    const Document* doc,
     const String& feature_string) {
   if (feature_string == "viewer") {
     return device::mojom::XRSessionFeature::REF_SPACE_VIEWER;
@@ -122,6 +127,9 @@
     return device::mojom::XRSessionFeature::REF_SPACE_BOUNDED_FLOOR;
   } else if (feature_string == "unbounded") {
     return device::mojom::XRSessionFeature::REF_SPACE_UNBOUNDED;
+  } else if (RuntimeEnabledFeatures::WebXRARDOMOverlayEnabled(doc) &&
+             feature_string == "dom-overlay-for-handheld-ar") {
+    return device::mojom::XRSessionFeature::DOM_OVERLAY_FOR_HANDHELD_AR;
   }
 
   return base::nullopt;
@@ -138,6 +146,8 @@
     case device::mojom::XRSessionFeature::REF_SPACE_UNBOUNDED:
       return mode == XRSession::kModeImmersiveVR ||
              mode == XRSession::kModeImmersiveAR;
+    case device::mojom::XRSessionFeature::DOM_OVERLAY_FOR_HANDHELD_AR:
+      return mode == XRSession::kModeImmersiveAR;
   }
 }
 
@@ -153,6 +163,7 @@
     case device::mojom::XRSessionFeature::REF_SPACE_LOCAL_FLOOR:
     case device::mojom::XRSessionFeature::REF_SPACE_BOUNDED_FLOOR:
     case device::mojom::XRSessionFeature::REF_SPACE_UNBOUNDED:
+    case device::mojom::XRSessionFeature::DOM_OVERLAY_FOR_HANDHELD_AR:
       return doc->IsFeatureEnabled(mojom::FeaturePolicyFeature::kWebXr,
                                    ReportOptions::kReportOnFailure);
   }
@@ -479,6 +490,44 @@
 void XR::ExitPresent() {
   DCHECK(service_);
   service_->ExitPresent();
+
+  // If the document was potentially being shown in a DOM overlay via
+  // fullscreened elements, make sure to clear any fullscreen states on exiting
+  // the session. This avoids a race condition:
+  // - browser side ends session and exits fullscreen (i.e. back button)
+  // - renderer processes WebViewImpl::ExitFullscreen via ChromeClient
+  // - JS application sets a new element to fullscreen, this is allowed
+  //   because doc->IsImmersiveArOverlay() is still true at this point
+  // - renderer processes XR session shutdown (this method)
+  // - browser re-enters fullscreen unexpectedly
+  LocalFrame* frame = GetFrame();
+  if (!frame)
+    return;
+
+  Document* doc = frame->GetDocument();
+  DCHECK(doc);
+  if (doc->IsImmersiveArOverlay()) {
+    doc->SetIsImmersiveArOverlay(false);
+    Element* fullscreen_element = Fullscreen::FullscreenElementFrom(*doc);
+    if (fullscreen_element) {
+      // "ua_originated" means that the browser process already exited
+      // fullscreen. Set it to false because we need the browser process
+      // to get notified that it needs to exit fullscreen. Use
+      // FullyExitFullscreen to ensure that we return to non-fullscreen mode.
+      // ExitFullscreen only unfullscreens a single element, potentially
+      // leaving others in fullscreen mode.
+      constexpr bool kUaOriginated = false;
+      Fullscreen::FullyExitFullscreen(*doc, kUaOriginated);
+    }
+    // Restore the FrameView background color that was changed in
+    // OnRequestSessionReturned.
+    auto* frame_view = doc->GetLayoutView()->GetFrameView();
+    // SetBaseBackgroundColor updates composited layer mappings.
+    // That DCHECKs IsAllowedToQueryCompositingState which requires
+    // DocumentLifecycle >= kInCompositingUpdate.
+    frame_view->UpdateLifecycleToCompositingInputsClean();
+    frame_view->SetBaseBackgroundColor(original_base_background_color_);
+  }
 }
 
 ScriptPromise XR::supportsSession(ScriptState* script_state,
@@ -664,7 +713,7 @@
   for (const auto& feature : features) {
     String feature_string;
     if (feature.ToString(feature_string)) {
-      auto feature_enum = StringToXRSessionFeature(feature_string);
+      auto feature_enum = StringToXRSessionFeature(doc, feature_string);
 
       if (!feature_enum) {
         GetExecutionContext()->AddConsoleMessage(ConsoleMessage::Create(
@@ -890,6 +939,45 @@
                                 TaskType::kMiscPlatformAPI)));
       environment_provider_.set_connection_error_handler(WTF::Bind(
           &XR::OnEnvironmentProviderDisconnect, WrapWeakPersistent(this)));
+      LocalFrame* frame = GetFrame();
+      DCHECK(frame);
+
+      if (enabled_features.Contains(
+              device::mojom::XRSessionFeature::DOM_OVERLAY_FOR_HANDHELD_AR)) {
+        // The session is using DOM overlay mode.
+        Document* doc = frame->GetDocument();
+        DCHECK(doc);
+        doc->SetIsImmersiveArOverlay(true);
+
+        // Save the current base background color (restored in ExitPresent),
+        // and set a transparent background for the FrameView.
+        auto* frame_view = doc->GetLayoutView()->GetFrameView();
+        // SetBaseBackgroundColor updates composited layer mappings.
+        // That DCHECKs IsAllowedToQueryCompositingState which requires
+        // DocumentLifecycle >= kInCompositingUpdate.
+        frame_view->UpdateLifecycleToCompositingInputsClean();
+        original_base_background_color_ = frame_view->BaseBackgroundColor();
+        frame_view->SetBaseBackgroundColor(Color::kTransparent);
+
+        // In DOM overlay mode, entering fullscreen mode needs to be triggered
+        // from the Renderer by actually fullscreening an element. If there
+        // is no current fullscreen element, fullscreen the <body> element
+        // for now. The JS application can use enterFullscreen to change this.
+        //
+        // A TabObserver on the browser side exits the session if there's
+        // no longer a fullscreen element, for example if the JS app manually
+        // unfullscreens the "body" element. That ensures we don't end up in a
+        // hybrid non-fullscreen AR state.
+        Element* fullscreen_element = Fullscreen::FullscreenElementFrom(*doc);
+        if (!fullscreen_element) {
+          Element* body = doc->body();
+          DCHECK(body);
+          // FIXME: this is the "prefixed" version that doesn't generate a
+          // fullscreenchange event and auto-hides navigation bars. Should the
+          // event be generated?
+          Fullscreen::RequestFullscreen(*body);
+        }
+      }
     }
 
     if (query->mode() == XRSession::kModeImmersiveVR &&
diff --git a/third_party/blink/renderer/modules/xr/xr.h b/third_party/blink/renderer/modules/xr/xr.h
index 667bbf7..aa1e0137 100644
--- a/third_party/blink/renderer/modules/xr/xr.h
+++ b/third_party/blink/renderer/modules/xr/xr.h
@@ -16,6 +16,7 @@
 #include "third_party/blink/renderer/core/page/focus_changed_observer.h"
 #include "third_party/blink/renderer/modules/xr/xr_session.h"
 #include "third_party/blink/renderer/modules/xr/xr_session_init.h"
+#include "third_party/blink/renderer/platform/graphics/color.h"
 #include "third_party/blink/renderer/platform/heap/handle.h"
 #include "third_party/blink/renderer/platform/scheduler/public/frame_or_worker_scheduler.h"
 #include "third_party/blink/renderer/platform/wtf/forward.h"
@@ -313,6 +314,9 @@
 
   FrameOrWorkerScheduler::SchedulingAffectingFeatureHandle
       feature_handle_for_scheduler_;
+
+  // In DOM overlay mode, save and restore the FrameView background color.
+  Color original_base_background_color_;
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/platform/exported/web_runtime_features.cc b/third_party/blink/renderer/platform/exported/web_runtime_features.cc
index 230b835..17692db8 100644
--- a/third_party/blink/renderer/platform/exported/web_runtime_features.cc
+++ b/third_party/blink/renderer/platform/exported/web_runtime_features.cc
@@ -465,6 +465,10 @@
   RuntimeEnabledFeatures::SetWebXRARModuleEnabled(enable);
 }
 
+void WebRuntimeFeatures::EnableWebXRARDOMOverlay(bool enable) {
+  RuntimeEnabledFeatures::SetWebXRARDOMOverlayEnabled(enable);
+}
+
 void WebRuntimeFeatures::EnableWebXRAnchors(bool enable) {
   RuntimeEnabledFeatures::SetWebXRAnchorsEnabled(enable);
 }
@@ -668,12 +672,6 @@
   RuntimeEnabledFeatures::SetDisplayLockingEnabled(enable);
 }
 
-void WebRuntimeFeatures::EnablePauseExecutionContextOnBackgroundFreeze(
-    bool enable) {
-  RuntimeEnabledFeatures::SetPauseExecutionContextOnBackgroundFreezeEnabled(
-      enable);
-}
-
 void WebRuntimeFeatures::EnableConsolidatedMovementXY(bool enable) {
   RuntimeEnabledFeatures::SetConsolidatedMovementXYEnabled(enable);
 }
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5
index 96a19d0..4e26722 100644
--- a/third_party/blink/renderer/platform/runtime_enabled_features.json5
+++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -1194,10 +1194,6 @@
       name: "PassPaintVisualRectToCompositor",
     },
     {
-      name: "PauseExecutionContextOnBackgroundFreeze",
-      status: "stable",
-    },
-    {
       name: "PaymentApp",
       status: "experimental",
     },
@@ -1801,6 +1797,11 @@
       // depends_on: ["WebXRARModule"],  // TODO(https://crbug.com/954679): uncomment once bug is fixed
     },
     {
+      name: "WebXRARDOMOverlay",
+      // depends_on: ["WebXRARModule"],  // TODO(https://crbug.com/954679): uncomment once bug is fixed
+      status: "experimental",
+    },
+    {
       name: "WebXRARModule",
       // depends_on: ["WebXR"],  // TODO(https://crbug.com/954679): uncomment once bug is fixed
       status: "experimental",
diff --git a/third_party/blink/tools/blinkpy/web_tests/port/fuchsia.py b/third_party/blink/tools/blinkpy/web_tests/port/fuchsia.py
index 89c6bb88..d1b67bdd 100644
--- a/third_party/blink/tools/blinkpy/web_tests/port/fuchsia.py
+++ b/third_party/blink/tools/blinkpy/web_tests/port/fuchsia.py
@@ -160,8 +160,7 @@
                                                    stderr=subprocess.PIPE)
 
         package_path = os.path.join(build_path, CONTENT_SHELL_PACKAGE_PATH)
-        self._target.InstallPackage(package_path, "content_shell",
-                                    package_deps=[])
+        self._target.InstallPackage([package_path])
 
         # Process will be forked for each worker, which may make QemuTarget
         # unusable (e.g. waitpid() for qemu process returns ECHILD after
diff --git a/third_party/blink/web_tests/FlagExpectations/enable-blink-features=CompositeAfterPaint b/third_party/blink/web_tests/FlagExpectations/enable-blink-features=CompositeAfterPaint
index 6343ea3..aba94a8 100644
--- a/third_party/blink/web_tests/FlagExpectations/enable-blink-features=CompositeAfterPaint
+++ b/third_party/blink/web_tests/FlagExpectations/enable-blink-features=CompositeAfterPaint
@@ -33,12 +33,15 @@
 Bug(none) virtual/android/url-bar/bottom-and-top-fixed-sticks-to-top.html [ Crash ]
 Bug(none) virtual/android/url-bar/bottom-fixed-adjusted-when-showing-url-bar.html [ Crash ]
 
+# Composited filters are not working.
+crbug.com/1008501 compositing/culling/filter-occlusion-blur-large.html [ Failure ]
+crbug.com/1008501 compositing/culling/filter-occlusion-blur.html [ Failure ]
+crbug.com/1008501 compositing/reflections/deeply-nested-reflections.html [ Failure ]
+
 Bug(none) compositing/animation/hidden-composited.html [ Failure ]
 Bug(none) compositing/change-preferCompositingToLCDText-setting.html [ Failure ]
 Bug(none) compositing/contents-opaque/hidden-with-visible-child.html [ Failure ]
 Bug(none) compositing/contents-opaque/layer-opacity.html [ Failure ]
-Bug(none) compositing/culling/filter-occlusion-blur-large.html [ Failure ]
-Bug(none) compositing/culling/filter-occlusion-blur.html [ Failure ]
 Bug(none) compositing/draws-content/canvas-background-layer.html [ Failure ]
 Bug(none) compositing/draws-content/webgl-background-layer.html [ Failure ]
 Bug(none) compositing/geometry/bounds-clipped-composited-child.html [ Failure ]
@@ -77,7 +80,6 @@
 crbug.com/667946 compositing/overflow/scrolls-with-respect-to-nested.html [ Failure ]
 crbug.com/667946 compositing/overflow/scrolls-with-respect-to-transform.html [ Failure ]
 crbug.com/667946 compositing/overflow/scrolls-with-respect-to.html [ Failure ]
-Bug(none) compositing/reflections/deeply-nested-reflections.html [ Failure ]
 Bug(none) compositing/reflections/nested-reflection-mask-change.html [ Failure ]
 Bug(none) compositing/rtl/rtl-iframe-absolute.html [ Failure ]
 Bug(none) compositing/rtl/rtl-iframe-relative.html [ Failure ]
@@ -101,7 +103,6 @@
 Bug(none) compositing/video/video-poster.html [ Failure ]
 Bug(none) compositing/visibility/layer-visible-content.html [ Failure ]
 Bug(none) compositing/visibility/visibility-image-layers-dynamic.html [ Failure ]
-Bug(none) css3/masking/mask-composite-missing-image.html [ Failure ]
 Bug(none) external/wpt/css/css-transforms/transform3d-backface-visibility-006.html [ Failure ]
 Bug(none) external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-overflow.html [ Crash ]
 Bug(none) external/wpt/largest-contentful-paint/invisible-images.html [ Failure ]
diff --git a/third_party/blink/web_tests/FlagExpectations/use-vulkan=native b/third_party/blink/web_tests/FlagExpectations/use-vulkan=native
index 4d61824..9138e47 100644
--- a/third_party/blink/web_tests/FlagExpectations/use-vulkan=native
+++ b/third_party/blink/web_tests/FlagExpectations/use-vulkan=native
@@ -15,9 +15,6 @@
 crbug.com/993384 transforms/transformed-document-element.html [ Skip ]
 crbug.com/993384 transforms/3d/point-mapping/3d-point-mapping-deep.html [ Skip ]
 
-# Not rendering the rightmost frame.
-crbug.com/1001616 media/alpha-video-playback.html [ Skip ]
-
 # OffscreenCanvas not rendering.
 crbug.com/1002538 fast/canvas/OffscreenCanvas-2d-drawImage-in-worker.html [ Skip ]
 crbug.com/1002538 fast/canvas/OffscreenCanvas-2d-drawImage.html [ Skip ]
@@ -41,10 +38,5 @@
 crbug.com/1002547 fast/canvas/imagebitmap/transferFromImageBitmap-no-alpha.html [ Skip ]
 crbug.com/1002547 fast/canvas/imagebitmap/transferFromImageBitmap.html [ Skip ]
 
-# Canvas not painting correctly.
-crbug.com/1003794 fast/canvas/canvas-composite-video-shadow.html [ Skip ]
-crbug.com/1003794 fast/canvas/canvas-composite-video.html [ Skip ]
-crbug.com/1003794 fast/canvas/canvas-pattern-video.html [ Skip ]
-
 # createImageBitmap fails for HTMLVideoElement
 crbug.com/1003799 fast/canvas/color-space/canvas-createImageBitmap-p3.html [ Skip ]
diff --git a/third_party/blink/web_tests/FlagExpectations/use-vulkan=swiftshader b/third_party/blink/web_tests/FlagExpectations/use-vulkan=swiftshader
index d721178..d3d8b61b 100644
--- a/third_party/blink/web_tests/FlagExpectations/use-vulkan=swiftshader
+++ b/third_party/blink/web_tests/FlagExpectations/use-vulkan=swiftshader
@@ -1,9 +1,6 @@
 # Test consistently hitting default timeout.
 Bug(none) css3/filters/effect-reference-subregion.html [ Skip ]
 
-# Not rendering the rightmost frame.
-crbug.com/1001616 media/alpha-video-playback.html [ Skip ]
-
 # OffscreenCanvas not rendering.
 crbug.com/1002538 fast/canvas/OffscreenCanvas-2d-drawImage-in-worker.html [ Skip ]
 crbug.com/1002538 fast/canvas/OffscreenCanvas-2d-drawImage.html [ Skip ]
@@ -27,10 +24,5 @@
 crbug.com/1002547 fast/canvas/imagebitmap/transferFromImageBitmap-no-alpha.html [ Skip ]
 crbug.com/1002547 fast/canvas/imagebitmap/transferFromImageBitmap.html [ Skip ]
 
-# Canvas not painting correctly.
-crbug.com/1003794 fast/canvas/canvas-composite-video-shadow.html [ Skip ]
-crbug.com/1003794 fast/canvas/canvas-composite-video.html [ Skip ]
-crbug.com/1003794 fast/canvas/canvas-pattern-video.html [ Skip ]
-
 # createImageBitmap fails for HTMLVideoElement
 crbug.com/1003799 fast/canvas/color-space/canvas-createImageBitmap-p3.html [ Skip ]
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index 7743f5d..e0a61ff 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -749,12 +749,10 @@
 crbug.com/591099 fast/selectors/shadow-host-div-with-text.html [ Failure ]
 crbug.com/591099 fast/text/selection/inline-block-in-selection-root.html [ Failure ]
 crbug.com/591099 paint/invalidation/media-audio-no-spurious-repaints.html [ Failure Timeout ]
-crbug.com/591099 paint/invalidation/text-match-document-change.html [ Failure ]
 crbug.com/591099 paint/invalidation/compositing/composited-float-under-composited-inline-individual.html [ Failure ]
 crbug.com/591099 paint/invalidation/compositing/composited-float-under-composited-inline.html [ Failure ]
 crbug.com/591099 paint/invalidation/compositing/float-under-composited-inline.html [ Failure ]
 crbug.com/591099 paint/invalidation/compositing/stacked-float-under-composited-inline.html [ Failure ]
-crbug.com/591099 paint/invalidation/selection/selection-clear.html [ Failure ]
 crbug.com/591099 virtual/composite-after-paint/paint/background/scrolling-background-with-negative-z-child.html [ Failure Crash ]
 crbug.com/591099 virtual/layout_ng_experimental/external/wpt/css/css-multicol/multicol-span-all-list-item-002.html [ Failure ]
 crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/border-radius-clipped-layer.html [ Failure ]
@@ -835,10 +833,6 @@
 # crbug.com/591099 [ Mac10.11 ] media/track/track-cue-rendering-position-auto-rtl.html [ Failure ]
 crbug.com/591099 [ Mac10.11 ] virtual/audio-service/media/track/track-cue-rendering-position-auto-rtl.html [ Failure ]
 crbug.com/591099 [ Mac10.11 ] virtual/scalefactor200/fast/hidpi/static/popup-menu-appearance.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] compositing/geometry/root-layer-update.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] compositing/overlap-blending/reflection-opacity-huge.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] compositing/reflections/reflection-positioning2.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] compositing/reflections/transform-inside-reflection.html [ Failure ]
 crbug.com/591099 [ Mac10.13 ] css1/basic/inheritance.html [ Failure ]
 crbug.com/591099 [ Mac10.13 ] css1/box_properties/acid_test.html [ Failure ]
 crbug.com/591099 [ Mac10.13 ] css1/box_properties/border_bottom.html [ Failure ]
@@ -1143,53 +1137,6 @@
 crbug.com/591099 [ Mac10.13 ] virtual/audio-service/media/video-colorspace-yuv420.html [ Failure ]
 crbug.com/591099 [ Mac10.13 ] media/video-empty-source.html [ Failure ]
 crbug.com/591099 [ Mac10.13 ] virtual/audio-service/media/video-empty-source.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] paint/invalidation/compositing/layer-repaint-rects.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] paint/invalidation/compositing/should-not-clip-composited-overflow-scrolling-layer.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] paint/invalidation/crbug-371640.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] paint/invalidation/flexbox/repaint.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] paint/invalidation/float-new-in-block.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] paint/invalidation/forms/details-marker-color-change.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] paint/invalidation/line-flow-with-floats-7.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] paint/invalidation/line-flow-with-floats-9.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] paint/invalidation/list-marker-2.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] paint/invalidation/outline/focus-continuations.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] paint/invalidation/outline/focus-ring-on-child-move.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] paint/invalidation/outline/focus-ring-on-continuation-move.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] paint/invalidation/outline/outline-continuations.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] paint/invalidation/overflow/flexible-box-overflow-horizontal.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] paint/invalidation/overflow/inline-overflow.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] paint/invalidation/overflow/inline-vertical-rl-overflow.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] paint/invalidation/overflow/vertical-overflow-child.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] paint/invalidation/paint-invalidation-with-reparent-across-frame-boundaries.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] paint/invalidation/position/positioned-document-element.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] paint/invalidation/position/positioned-great-grandparent-change-location.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] paint/invalidation/repaint-across-writing-mode-boundary.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] paint/invalidation/scale-page-shrink.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] paint/invalidation/scroll/layout-state-scrolloffset.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] paint/invalidation/scroll/layout-state-scrolloffset3.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] paint/invalidation/scroll/overflow-scroll-body-appear.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] paint/invalidation/selection/invalidation-rect-with-br-includes-newline.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] paint/invalidation/selection/japanese-rl-selection-clear.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] paint/invalidation/selection/selection-change-in-iframe-with-relative-parent.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] paint/invalidation/selection/text-selection-rect-in-overflow-2.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] paint/invalidation/stacked-diacritics.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] paint/invalidation/svg/absolute-sized-content-with-resources.xhtml [ Failure ]
-crbug.com/591099 [ Mac10.13 ] paint/invalidation/svg/embedded-svg-size-changes.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] paint/invalidation/svg/relative-sized-use-without-attributes-on-symbol.xhtml [ Failure ]
-crbug.com/591099 [ Mac10.13 ] paint/invalidation/transform/transform-inline-layered-child.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] paint/invalidation/vertical-align2.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] paint/invalidation/vertical-rl-as-paint-container.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] paint/markers/active-suggestion-marker-split.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] paint/markers/ellipsis-ltr-text-in-ltr-flow-with-markers.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] paint/markers/ellipsis-ltr-text-in-rtl-flow-with-markers.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] paint/markers/ellipsis-rtl-text-in-ltr-flow-with-markers.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] paint/markers/ellipsis-rtl-text-in-rtl-flow-with-markers.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] paint/markers/inline-spelling-markers-hidpi-composited.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] paint/markers/inline_spelling_markers.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] paint/selection/image-writing-modes.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] paint/selection/text-selection-newline-across-blocks-line-beginning-end.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] paint/selection/text-selection-newline-across-blocks.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] paint/selection/text-selection-newline-rtl.html [ Failure ]
 crbug.com/591099 [ Mac10.13 ] plugins/embed-attributes-style.html [ Failure ]
 crbug.com/591099 [ Mac10.13 ] svg/custom/clone-element-with-animated-svg-properties.html [ Failure ]
 crbug.com/591099 [ Mac10.13 ] svg/custom/svg-fonts-in-html.html [ Failure ]
@@ -3022,11 +2969,6 @@
 
 crbug.com/552085 external/wpt/css/css-cascade/important-prop.html [ Failure ]
 
-# TODO(chrishtr): rebaseline these
-crbug.com/921242 [ Mac ] paint/invalidation/compositing/fixed-pos-inside-composited-intermediate-layer.html [ Failure ]
-crbug.com/921242 [ Mac ] paint/invalidation/scroll/fixed-under-composited-absolute-scrolled.html [ Failure ]
-crbug.com/921242 [ Mac ] paint/invalidation/scroll/fixed-with-border-under-composited-absolute-scrolled.html [ Failure ]
-
 # Failures on Mac scrollbars for compositor threaded scrollbar scrolling.
 crbug.com/953847 [ Mac ] fast/scrolling/scrollbars/mouse-scrolling-on-div-scrollbar.html [ Failure ]
 crbug.com/953847 [ Mac ] fast/scrolling/scrollbars/mouse-scrolling-on-root-scrollbar.html [ Failure ]
diff --git a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json
index 12d901d..3470a72 100644
--- a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json
+++ b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json
@@ -59687,6 +59687,18 @@
      {}
     ]
    ],
+   "css/css-overflow/float-with-relpos-and-transform.html": [
+    [
+     "css/css-overflow/float-with-relpos-and-transform.html",
+     [
+      [
+       "/css/reference/ref-filled-green-100px-square-only.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
    "css/css-overflow/input-scrollable-region-001.html": [
     [
      "css/css-overflow/input-scrollable-region-001.html",
@@ -382628,6 +382640,10 @@
    "b9ba7acd150e5022de5c5208cd7f5f7d4dde93c3",
    "support"
   ],
+  "css/css-overflow/float-with-relpos-and-transform.html": [
+   "6024b7261750e0c5dc4a681dccee2ab72b83abca",
+   "reftest"
+  ],
   "css/css-overflow/inheritance-expected.txt": [
    "59864d0f4d185ece259879a299f597b80f9babdc",
    "support"
@@ -439121,15 +439137,15 @@
    "testharness"
   ],
   "html/dom/idlharness.https.html": [
-   "0d3f1160d2819601afb2168bc15bfeeaddfed6f1",
+   "33ad5c6f6169a7e376aaadeba1b8df4dd6815f7c",
    "testharness"
   ],
   "html/dom/idlharness.https_exclude=(Document_Window_HTML._)-expected.txt": [
-   "78664a5bbda46b6f424ce8a0fd23145b02385e33",
+   "246c8152300318511d24cda98c3005c72f5390d3",
    "support"
   ],
   "html/dom/idlharness.https_include=(Document_Window)-expected.txt": [
-   "d669b1db8574ee30dd408b074ff3f5a8e1d59c34",
+   "dc7ef25a1b2b646088fa01b69023aa9d05c125f3",
    "support"
   ],
   "html/dom/idlharness.https_include=HTML._-expected.txt": [
@@ -499313,7 +499329,7 @@
    "support"
   ],
   "tools/wptrunner/wptrunner/browsers/firefox.py": [
-   "290fcff5ab22bd5ca19cedb4d3f38f5b8197768f",
+   "1763ff44b4e55c14c8f5d753defb3ba39e017262",
    "support"
   ],
   "tools/wptrunner/wptrunner/browsers/firefox_android.py": [
diff --git a/third_party/blink/web_tests/external/wpt/compat/webkit-box-removing-triggering-anonymous-merge.html b/third_party/blink/web_tests/external/wpt/compat/webkit-box-removing-triggering-anonymous-merge.html
new file mode 100644
index 0000000..8506425
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/compat/webkit-box-removing-triggering-anonymous-merge.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<div style="display: -webkit-box">
+  <span><div></div></span>
+  <div id="target"></div>
+  text
+</div>
+<script>
+// Force a layout before removing.
+document.body.offsetTop;
+document.getElementById('target').remove();
+done();
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-overflow/float-with-relpos-and-transform.html b/third_party/blink/web_tests/external/wpt/css/css-overflow/float-with-relpos-and-transform.html
new file mode 100644
index 0000000..6024b72
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-overflow/float-with-relpos-and-transform.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<html>
+<link rel="help" href="https://drafts.csswg.org/css-overflow/#scrollable">
+<link rel="match" href="../reference/ref-filled-green-100px-square-only.html">
+<style>
+.container {
+  background: green;
+  width: 100px;
+  height: 100px;
+  overflow: auto;
+}
+.float {
+  float: left;
+  position: relative;
+  width: 50px;
+  height: 50px;
+  top: calc(50% - 100vh);
+  transform: translateY(-50%) translateY(100vh);
+}
+</style>
+<p>Test passes if there is a filled green square.</p>
+<div class="container">
+  <div class="float"></div>
+</div>
diff --git a/third_party/blink/web_tests/external/wpt/html/dom/idlharness.https.html b/third_party/blink/web_tests/external/wpt/html/dom/idlharness.https.html
index 0d3f116..33ad5c6 100644
--- a/third_party/blink/web_tests/external/wpt/html/dom/idlharness.https.html
+++ b/third_party/blink/web_tests/external/wpt/html/dom/idlharness.https.html
@@ -47,6 +47,7 @@
         documentWithHandlers[callback.name] = handler;
       }
     }
+    idlArray.add_untested_idls('typedef Window WindowProxy;');
 
     idlArray.add_objects({
       NodeList: ['document.getElementsByName("name")'],
diff --git "a/third_party/blink/web_tests/external/wpt/html/dom/idlharness.https_exclude=\050Document_Window_HTML._\051-expected.txt" "b/third_party/blink/web_tests/external/wpt/html/dom/idlharness.https_exclude=\050Document_Window_HTML._\051-expected.txt"
index 78664a5..246c815 100644
--- "a/third_party/blink/web_tests/external/wpt/html/dom/idlharness.https_exclude=\050Document_Window_HTML._\051-expected.txt"
+++ "b/third_party/blink/web_tests/external/wpt/html/dom/idlharness.https_exclude=\050Document_Window_HTML._\051-expected.txt"
@@ -1,5 +1,5 @@
 This is a testharness.js-based test.
-Found 1390 tests; 1353 PASS, 37 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 1390 tests; 1354 PASS, 36 FAIL, 0 TIMEOUT, 0 NOTRUN.
 PASS idl_test setup
 PASS idl_test validation
 PASS Partial interface Document: original interface defined
@@ -1117,7 +1117,7 @@
 PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "data" with the proper type
 PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "origin" with the proper type
 PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "lastEventId" with the proper type
-FAIL MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "source" with the proper type Unrecognized type WindowProxy
+PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "source" with the proper type
 PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "ports" with the proper type
 PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "initMessageEvent(DOMString, boolean, boolean, any, USVString, DOMString, MessageEventSource, [object Object])" with the proper type
 PASS MessageEvent interface: calling initMessageEvent(DOMString, boolean, boolean, any, USVString, DOMString, MessageEventSource, [object Object]) on new MessageEvent("message", { data: 5 }) with too few arguments must throw TypeError
diff --git "a/third_party/blink/web_tests/external/wpt/html/dom/idlharness.https_include=\050Document_Window\051-expected.txt" "b/third_party/blink/web_tests/external/wpt/html/dom/idlharness.https_include=\050Document_Window\051-expected.txt"
index d669b1d..dc7ef25 100644
--- "a/third_party/blink/web_tests/external/wpt/html/dom/idlharness.https_include=\050Document_Window\051-expected.txt"
+++ "b/third_party/blink/web_tests/external/wpt/html/dom/idlharness.https_include=\050Document_Window\051-expected.txt"
@@ -1,5 +1,5 @@
 This is a testharness.js-based test.
-Found 939 tests; 908 PASS, 31 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 939 tests; 912 PASS, 27 FAIL, 0 TIMEOUT, 0 NOTRUN.
 PASS idl_test setup
 PASS idl_test validation
 PASS Partial interface Document: original interface defined
@@ -316,7 +316,7 @@
 PASS Window must be primary interface of window
 PASS Stringification of window
 FAIL Window interface: window must have own property "window" assert_false: property descriptor should not have a "value" field expected false got true
-FAIL Window interface: window must inherit property "self" with the proper type Unrecognized type WindowProxy
+PASS Window interface: window must inherit property "self" with the proper type
 PASS Window interface: window must have own property "document"
 PASS Window interface: window must inherit property "name" with the proper type
 FAIL Window interface: window must have own property "location" assert_false: property descriptor should not have a "value" field expected false got true
@@ -334,11 +334,11 @@
 PASS Window interface: window must inherit property "stop()" with the proper type
 PASS Window interface: window must inherit property "focus()" with the proper type
 PASS Window interface: window must inherit property "blur()" with the proper type
-FAIL Window interface: window must inherit property "frames" with the proper type Unrecognized type WindowProxy
+PASS Window interface: window must inherit property "frames" with the proper type
 PASS Window interface: window must inherit property "length" with the proper type
 FAIL Window interface: window must have own property "top" assert_false: property descriptor should not have a "value" field expected false got true
 PASS Window interface: window must inherit property "opener" with the proper type
-FAIL Window interface: window must inherit property "parent" with the proper type Unrecognized type WindowProxy
+PASS Window interface: window must inherit property "parent" with the proper type
 PASS Window interface: window must inherit property "frameElement" with the proper type
 PASS Window interface: window must inherit property "open(USVString, DOMString, DOMString)" with the proper type
 PASS Window interface: calling open(USVString, DOMString, DOMString) on window with too few arguments must throw TypeError
@@ -601,7 +601,7 @@
 PASS Document interface: calling write(DOMString) on iframe.contentDocument with too few arguments must throw TypeError
 PASS Document interface: iframe.contentDocument must inherit property "writeln(DOMString)" with the proper type
 PASS Document interface: calling writeln(DOMString) on iframe.contentDocument with too few arguments must throw TypeError
-FAIL Document interface: iframe.contentDocument must inherit property "defaultView" with the proper type Unrecognized type WindowProxy
+PASS Document interface: iframe.contentDocument must inherit property "defaultView" with the proper type
 PASS Document interface: iframe.contentDocument must inherit property "hasFocus()" with the proper type
 PASS Document interface: iframe.contentDocument must inherit property "designMode" with the proper type
 PASS Document interface: iframe.contentDocument must inherit property "execCommand(DOMString, boolean, DOMString)" with the proper type
diff --git a/third_party/blink/web_tests/external/wpt/resources/chromium/webxr-test.js b/third_party/blink/web_tests/external/wpt/resources/chromium/webxr-test.js
index ccb7a00..94031657 100644
--- a/third_party/blink/web_tests/external/wpt/resources/chromium/webxr-test.js
+++ b/third_party/blink/web_tests/external/wpt/resources/chromium/webxr-test.js
@@ -187,6 +187,15 @@
 // Implements XRFrameDataProvider and XRPresentationProvider. Maintains a mock
 // for XRPresentationProvider.
 class MockRuntime {
+  // Mapping from string feature names to the corresponding mojo types.
+  // This is exposed as a member for extensibility.
+  static featureToMojoMap = {
+    "viewer": device.mojom.XRSessionFeature.REF_SPACE_VIEWER,
+    "local": device.mojom.XRSessionFeature.REF_SPACE_LOCAL,
+    "local-floor": device.mojom.XRSessionFeature.REF_SPACE_LOCAL_FLOOR,
+    "bounded-floor": device.mojom.XRSessionFeature.REF_SPACE_BOUNDED_FLOOR,
+    "unbounded": device.mojom.XRSessionFeature.REF_SPACE_UNBOUNDED };
+
   constructor(fakeDeviceInit, service) {
     this.sessionClient_ = new device.mojom.XRSessionClientPtr();
     this.presentation_provider_ = new MockXRPresentationProvider();
@@ -456,19 +465,10 @@
 
   setFeatures(supportedFeatures) {
     function convertFeatureToMojom(feature) {
-      switch (feature) {
-        case "viewer":
-          return device.mojom.XRSessionFeature.REF_SPACE_VIEWER;
-        case "local":
-          return device.mojom.XRSessionFeature.REF_SPACE_LOCAL;
-        case "local-floor":
-          return device.mojom.XRSessionFeature.REF_SPACE_LOCAL_FLOOR;
-        case "bounded-floor":
-          return device.mojom.XRSessionFeature.REF_SPACE_BOUNDED_FLOOR;
-        case "unbounded":
-          return device.mojom.XRSessionFeature.REF_SPACE_UNBOUNDED;
-        default:
-          return device.mojom.XRSessionFeature.INVALID;
+      if (feature in MockRuntime.featureToMojoMap) {
+        return MockRuntime.featureToMojoMap[feature];
+      } else {
+        return device.mojom.XRSessionFeature.INVALID;
       }
     }
 
diff --git a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/browsers/firefox.py b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/browsers/firefox.py
index 290fcff..1763ff44 100644
--- a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/browsers/firefox.py
+++ b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/browsers/firefox.py
@@ -181,7 +181,7 @@
 
 
 def update_properties():
-    return (["os", "debug", "webrender", "e10s", "sw-e10s", "processor"],
+    return (["os", "debug", "webrender", "fisson", "e10s", "sw-e10s", "processor"],
             {"os": ["version"], "processor": ["bits"]})
 
 
diff --git a/third_party/blink/web_tests/flag-specific/enable-blink-features=CompositeAfterPaint/css3/masking/mask-composite-missing-image-expected.html b/third_party/blink/web_tests/flag-specific/enable-blink-features=CompositeAfterPaint/css3/masking/mask-composite-missing-image-expected.html
deleted file mode 100644
index 3897208..0000000
--- a/third_party/blink/web_tests/flag-specific/enable-blink-features=CompositeAfterPaint/css3/masking/mask-composite-missing-image-expected.html
+++ /dev/null
@@ -1,17 +0,0 @@
-<html>
-<head>
-<style>
-.test {
-  width: 200px;
-  height: 200px;
-  border: 10px solid black;
-  background-color: lime;
-}
-</style>
-</head>
-<body>
-  <p>Test for <a href="https://bugs.webkit.org/show_bug.cgi?id=26084">WebKit Bug 26084: Bug 26084: Multiple missing images in webkit-mask-image prevent rendering</a></p>
-  <div class="test">This text should be visible.</div>
-  <p>If the test passes, you should be able to see a lime square with a black border. Inside the border, you should see the text: This text should be visible. This test is currently failing.</p>
-</body>
-</html>
diff --git a/third_party/blink/web_tests/media/encrypted-media/encrypted-media-playback-before-setmediakeys.html b/third_party/blink/web_tests/media/encrypted-media/encrypted-media-playback-before-setmediakeys.html
new file mode 100644
index 0000000..e7754a1
--- /dev/null
+++ b/third_party/blink/web_tests/media/encrypted-media/encrypted-media-playback-before-setmediakeys.html
@@ -0,0 +1,132 @@
+<!DOCTYPE html>
+<html>
+    <head>
+        <title>Playback before SetMediaKeys</title>
+        <script src="encrypted-media-utils.js"></script>
+        <script src="../../resources/testharness.js"></script>
+        <script src="../../resources/testharnessreport.js"></script>
+    </head>
+    <body>
+        <video></video>
+        <script>
+            promise_test(function(test)
+            {
+                var video = document.querySelector('video');
+                var content = '../content/test-encrypted.webm';
+                var mediaKeys;
+                var initData;
+                var initDataType;
+                var mediaKeySession;
+
+
+                // As this code doesn't wait for the 'message' event to avoid
+                // race conditions with 'waitingforkey', specify the key ID and
+                // key used by the encrypted content.
+                var keyId = stringToUint8Array('0123456789012345');
+                var rawKey = new Uint8Array([0xeb, 0xdd, 0x62, 0xf1, 0x68, 0x14, 0xd2, 0x7b,
+                                             0x68, 0xef, 0x12, 0x2a, 0xfc, 0xe4, 0xae, 0x3c]);
+
+                return navigator.requestMediaKeySystemAccess('org.w3.clearkey', getConfigurationForFile(content)).then(function(access) {
+                    return access.createMediaKeys();
+                }).then(function(result) {
+                    // Store mediaKeys without setting it on the video.
+                    mediaKeys = result;
+                    video.src = content;
+                    video.play();
+                    return wait_for_encrypted_event(video);
+                }).then(function(e) {
+                    // Received the 'encrypted' event(s), so keep a copy of
+                    // the initdata for use when creating the session later.
+                    initData = e.initData;
+                    initDataType = e.initDataType;
+
+                    // Wait until the video indicates that it needs a key to
+                    // continue.
+                    return wait_for_waitingforkey_event(video);
+                }).then(function() {
+                    // Make sure the video is NOT paused and not progressing
+                    // before a key is provided. This requires the video
+                    // to NOT have a clear lead.
+                    assert_false(video.paused);
+                    assert_equals(video.currentTime, 0);
+
+                    // Create a session.
+                    mediaKeySession = mediaKeys.createSession();
+                    return mediaKeySession.generateRequest(initDataType, initData);
+                }).then(function() {
+                    // generateRequest() will cause a 'message' event to
+                    // occur specifying the keyId that is needed, but we
+                    // ignore it since we already know what keyId is needed.
+                    // Add the key needed to decrypt.
+                    var jwkSet = stringToUint8Array(createJWKSet(createJWK(keyId, rawKey)));
+                    return mediaKeySession.update(jwkSet);
+                }).then(function() {
+                    // Now setMediaKeys() and playback should start.
+                    return video.setMediaKeys(mediaKeys);
+                }).then(function() {
+                    // Video should start playing now that it can decrypt the
+                    // streams, so wait until a little bit of the video has
+                    // played.
+                    return wait_for_timeupdate_event(video);
+                });
+
+                // Typical test duration is 6 seconds on release builds
+                // (12 seconds on debug). Since the test is timing out anyway,
+                // make the duration 5 seconds so that the timeout function
+                // is actually called (instead of simply aborting the test).
+            }, 'Playback before SetMediaKeys', { timeout: 5000 });
+
+            // Wait for a pair of 'encrypted' events. Promise resolved on
+            // second event.
+            function wait_for_encrypted_event(video)
+            {
+                var encryptedEventCount = 0;
+                return new Promise(function(resolve) {
+                    video.addEventListener('encrypted', function listener(e) {
+                        assert_equals(e.target, video);
+                        assert_true(e instanceof window.MediaEncryptedEvent);
+                        assert_equals(e.type, 'encrypted');
+
+                        // The same decryption key is used by both the audio
+                        // and the video streams so wait for the second event
+                        // to ensure we see both events.
+                        if (++encryptedEventCount != 2)
+                            return;
+
+                        video.removeEventListener('encrypted', listener);
+                        resolve(e);
+                    });
+                });
+            };
+
+            // Wait for a 'waitingforkey' event. Promise resolved when the
+            // event is received.
+            function wait_for_waitingforkey_event(video)
+            {
+                return new Promise(function(resolve) {
+                    video.addEventListener('waitingforkey', function listener(e) {
+                        assert_equals(e.target, video);
+                        assert_equals(e.type, 'waitingforkey');
+                        video.removeEventListener('waitingforkey', listener);
+                        resolve(e);
+                    });
+                });
+            };
+
+            // Wait for a 'timeupdate' event. Promise resolved if |video| has
+            // played for more than 0.2 seconds.
+            function wait_for_timeupdate_event(video)
+            {
+                return new Promise(function(resolve) {
+                    video.addEventListener('timeupdate', function listener(e) {
+                        assert_equals(e.target, video);
+                        if (video.currentTime < 0.2)
+                            return;
+                        video.removeEventListener('timeupdate', listener);
+                        resolve(e);
+                    });
+                });
+            };
+        </script>
+    </body>
+</html>
diff --git a/third_party/blink/web_tests/paint/invalidation/compositing/composited-float-under-composited-inline-expected.txt b/third_party/blink/web_tests/paint/invalidation/compositing/composited-float-under-composited-inline-expected.txt
index 1a80e5c..b098b4b 100644
--- a/third_party/blink/web_tests/paint/invalidation/compositing/composited-float-under-composited-inline-expected.txt
+++ b/third_party/blink/web_tests/paint/invalidation/compositing/composited-float-under-composited-inline-expected.txt
@@ -1,39 +1,34 @@
 {
   "layers": [
     {
-      "name": "LayoutView #document",
-      "bounds": [800, 600],
-      "drawsContent": false,
-      "backgroundColor": "#FFFFFF"
-    },
-    {
-      "name": "Scrolling Layer",
-      "bounds": [800, 600],
-      "drawsContent": false
-    },
-    {
       "name": "Scrolling Contents Layer",
       "bounds": [800, 600],
       "contentsOpaque": true,
       "backgroundColor": "#FFFFFF"
     },
     {
-      "name": "LayoutInline (relative positioned) SPAN",
-      "position": [108, 108],
-      "drawsContent": false
-    },
-    {
-      "name": "LayoutBlockFlow (relative positioned) (floating) DIV id='float'",
-      "position": [58, 58],
+      "name": "LayoutNGBlockFlow (relative positioned) (floating) DIV id='float'",
       "bounds": [100, 100],
       "contentsOpaque": true,
       "backgroundColor": "#008000",
       "paintInvalidations": [
         {
-          "object": "LayoutBlockFlow (relative positioned) (floating) DIV id='float'",
+          "object": "LayoutNGBlockFlow (relative positioned) (floating) DIV id='float'",
           "rect": [0, 0, 100, 100],
           "reason": "background"
         }
+      ],
+      "transform": 1
+    }
+  ],
+  "transforms": [
+    {
+      "id": 1,
+      "transform": [
+        [1, 0, 0, 0],
+        [0, 1, 0, 0],
+        [0, 0, 1, 0],
+        [158, 158, 0, 1]
       ]
     }
   ]
diff --git a/third_party/blink/web_tests/paint/invalidation/compositing/composited-float-under-composited-inline-individual-expected.txt b/third_party/blink/web_tests/paint/invalidation/compositing/composited-float-under-composited-inline-individual-expected.txt
index 1a80e5c..b098b4b 100644
--- a/third_party/blink/web_tests/paint/invalidation/compositing/composited-float-under-composited-inline-individual-expected.txt
+++ b/third_party/blink/web_tests/paint/invalidation/compositing/composited-float-under-composited-inline-individual-expected.txt
@@ -1,39 +1,34 @@
 {
   "layers": [
     {
-      "name": "LayoutView #document",
-      "bounds": [800, 600],
-      "drawsContent": false,
-      "backgroundColor": "#FFFFFF"
-    },
-    {
-      "name": "Scrolling Layer",
-      "bounds": [800, 600],
-      "drawsContent": false
-    },
-    {
       "name": "Scrolling Contents Layer",
       "bounds": [800, 600],
       "contentsOpaque": true,
       "backgroundColor": "#FFFFFF"
     },
     {
-      "name": "LayoutInline (relative positioned) SPAN",
-      "position": [108, 108],
-      "drawsContent": false
-    },
-    {
-      "name": "LayoutBlockFlow (relative positioned) (floating) DIV id='float'",
-      "position": [58, 58],
+      "name": "LayoutNGBlockFlow (relative positioned) (floating) DIV id='float'",
       "bounds": [100, 100],
       "contentsOpaque": true,
       "backgroundColor": "#008000",
       "paintInvalidations": [
         {
-          "object": "LayoutBlockFlow (relative positioned) (floating) DIV id='float'",
+          "object": "LayoutNGBlockFlow (relative positioned) (floating) DIV id='float'",
           "rect": [0, 0, 100, 100],
           "reason": "background"
         }
+      ],
+      "transform": 1
+    }
+  ],
+  "transforms": [
+    {
+      "id": 1,
+      "transform": [
+        [1, 0, 0, 0],
+        [0, 1, 0, 0],
+        [0, 0, 1, 0],
+        [158, 158, 0, 1]
       ]
     }
   ]
diff --git a/third_party/blink/web_tests/platform/win/paint/invalidation/compositing/fixed-pos-inside-composited-intermediate-layer-expected.txt b/third_party/blink/web_tests/paint/invalidation/compositing/fixed-pos-inside-composited-intermediate-layer-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/platform/win/paint/invalidation/compositing/fixed-pos-inside-composited-intermediate-layer-expected.txt
rename to third_party/blink/web_tests/paint/invalidation/compositing/fixed-pos-inside-composited-intermediate-layer-expected.txt
diff --git a/third_party/blink/web_tests/paint/invalidation/compositing/float-under-composited-inline-expected.txt b/third_party/blink/web_tests/paint/invalidation/compositing/float-under-composited-inline-expected.txt
index 06ddd78..991dd77 100644
--- a/third_party/blink/web_tests/paint/invalidation/compositing/float-under-composited-inline-expected.txt
+++ b/third_party/blink/web_tests/paint/invalidation/compositing/float-under-composited-inline-expected.txt
@@ -1,33 +1,22 @@
 {
   "layers": [
     {
-      "name": "LayoutView #document",
-      "bounds": [800, 600],
-      "drawsContent": false,
-      "backgroundColor": "#FFFFFF"
-    },
-    {
-      "name": "Scrolling Layer",
-      "bounds": [800, 600],
-      "drawsContent": false
-    },
-    {
       "name": "Scrolling Contents Layer",
       "bounds": [800, 600],
       "contentsOpaque": true,
-      "backgroundColor": "#FFFFFF",
-      "paintInvalidations": [
-        {
-          "object": "LayoutBlockFlow (floating) DIV id='float'",
-          "rect": [8, 8, 100, 100],
-          "reason": "background"
-        }
-      ]
+      "backgroundColor": "#FFFFFF"
     },
     {
       "name": "LayoutInline (relative positioned) SPAN",
       "position": [108, 108],
-      "drawsContent": false
+      "bounds": [100, 100],
+      "paintInvalidations": [
+        {
+          "object": "LayoutNGBlockFlow (floating) DIV id='float'",
+          "rect": [0, 0, 100, 100],
+          "reason": "background"
+        }
+      ]
     }
   ]
 }
diff --git a/third_party/blink/web_tests/paint/invalidation/compositing/stacked-float-under-composited-inline-expected.txt b/third_party/blink/web_tests/paint/invalidation/compositing/stacked-float-under-composited-inline-expected.txt
index 1cd6614..e69dec6a 100644
--- a/third_party/blink/web_tests/paint/invalidation/compositing/stacked-float-under-composited-inline-expected.txt
+++ b/third_party/blink/web_tests/paint/invalidation/compositing/stacked-float-under-composited-inline-expected.txt
@@ -1,17 +1,6 @@
 {
   "layers": [
     {
-      "name": "LayoutView #document",
-      "bounds": [800, 600],
-      "drawsContent": false,
-      "backgroundColor": "#FFFFFF"
-    },
-    {
-      "name": "Scrolling Layer",
-      "bounds": [800, 600],
-      "drawsContent": false
-    },
-    {
       "name": "Scrolling Contents Layer",
       "bounds": [800, 600],
       "contentsOpaque": true,
@@ -19,12 +8,12 @@
     },
     {
       "name": "LayoutInline (relative positioned) SPAN",
-      "position": [58, 58],
+      "position": [158, 158],
       "bounds": [100, 100],
       "contentsOpaque": true,
       "paintInvalidations": [
         {
-          "object": "LayoutBlockFlow (relative positioned) (floating) DIV id='float'",
+          "object": "LayoutNGBlockFlow (relative positioned) (floating) DIV id='float'",
           "rect": [0, 0, 100, 100],
           "reason": "background"
         }
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/paint/selection/text-selection-newline-rtl-expected.png b/third_party/blink/web_tests/paint/invalidation/selection/selection-clear-expected.png
similarity index 79%
rename from third_party/blink/web_tests/platform/mac-mac10.12/paint/selection/text-selection-newline-rtl-expected.png
rename to third_party/blink/web_tests/paint/invalidation/selection/selection-clear-expected.png
index d291c255..4ed1cbca 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/paint/selection/text-selection-newline-rtl-expected.png
+++ b/third_party/blink/web_tests/paint/invalidation/selection/selection-clear-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/paint/invalidation/selection/selection-clear-expected.txt b/third_party/blink/web_tests/platform/linux/paint/invalidation/selection/selection-clear-expected.txt
index 2bf0911..97d9759d 100644
--- a/third_party/blink/web_tests/platform/linux/paint/invalidation/selection/selection-clear-expected.txt
+++ b/third_party/blink/web_tests/platform/linux/paint/invalidation/selection/selection-clear-expected.txt
@@ -1,40 +1,34 @@
 {
   "layers": [
     {
-      "name": "LayoutView #document",
-      "bounds": [800, 600],
-      "drawsContent": false,
-      "backgroundColor": "#FFFFFF"
-    },
-    {
-      "name": "Scrolling Layer",
-      "bounds": [800, 600],
-      "drawsContent": false
-    },
-    {
       "name": "Scrolling Contents Layer",
       "bounds": [800, 600],
       "contentsOpaque": true,
       "backgroundColor": "#FFFFFF",
       "paintInvalidations": [
         {
-          "object": "LayoutBlockFlow DIV id='firstLine'",
+          "object": "NGPhysicalBoxFragment LayoutNGBlockFlow DIV id='firstLine'",
           "rect": [8, 8, 100, 200],
-          "reason": "full"
-        },
-        {
-          "object": "InlineTextBox 'FAIL: Test did'",
-          "rect": [8, 48, 97, 119],
           "reason": "disappeared"
         },
         {
-          "object": "InlineTextBox 'not run'",
-          "rect": [8, 48, 97, 119],
+          "object": "NGPhysicalBoxFragment LayoutNGBlockFlow DIV id='firstLine'",
+          "rect": [8, 8, 100, 100],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPhysicalTextFragment 'FAIL: Test did'",
+          "rect": [8, 8, 97, 200],
           "reason": "disappeared"
         },
         {
-          "object": "InlineTextBox '\u00A0'",
-          "rect": [8, 48, 8, 19],
+          "object": "NGPhysicalTextFragment 'not run'",
+          "rect": [8, 8, 97, 200],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPhysicalTextFragment '\u00A0'",
+          "rect": [8, 8, 8, 100],
           "reason": "appeared"
         }
       ]
diff --git a/third_party/blink/web_tests/platform/linux/paint/invalidation/text-match-document-change-expected.txt b/third_party/blink/web_tests/platform/linux/paint/invalidation/text-match-document-change-expected.txt
index 4a3af0f..75b3f73 100644
--- a/third_party/blink/web_tests/platform/linux/paint/invalidation/text-match-document-change-expected.txt
+++ b/third_party/blink/web_tests/platform/linux/paint/invalidation/text-match-document-change-expected.txt
@@ -1,34 +1,23 @@
 {
   "layers": [
     {
-      "name": "LayoutView #document",
-      "bounds": [800, 600],
-      "drawsContent": false,
-      "backgroundColor": "#FFFFFF"
-    },
-    {
-      "name": "Scrolling Layer",
-      "bounds": [800, 600],
-      "drawsContent": false
-    },
-    {
       "name": "Scrolling Contents Layer",
       "bounds": [800, 600],
       "contentsOpaque": true,
       "backgroundColor": "#FFFFFF",
       "paintInvalidations": [
         {
-          "object": "InlineTextBox 'Find-in-page 'findme', then click here)'",
+          "object": "NGPhysicalTextFragment 'Find-in-page 'findme', then click here)'",
           "rect": [18, 130, 251, 39],
           "reason": "disappeared"
         },
         {
-          "object": "InlineTextBox 'To be changed: findme (Manual testing:'",
+          "object": "NGPhysicalTextFragment 'To be changed: findme (Manual testing:'",
           "rect": [18, 130, 251, 39],
           "reason": "disappeared"
         },
         {
-          "object": "InlineTextBox 'After change'",
+          "object": "NGPhysicalTextFragment 'After change'",
           "rect": [18, 130, 82, 19],
           "reason": "appeared"
         },
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/fast/text/trailing-white-space-2-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/fast/text/trailing-white-space-2-expected.png
deleted file mode 100644
index 9083dbf..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.10/fast/text/trailing-white-space-2-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/paint/invalidation/forms/submit-focus-by-mouse-then-keydown-expected.txt b/third_party/blink/web_tests/platform/mac-mac10.10/paint/invalidation/forms/submit-focus-by-mouse-then-keydown-expected.txt
index 365123e..1d9dc3d0 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.10/paint/invalidation/forms/submit-focus-by-mouse-then-keydown-expected.txt
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/paint/invalidation/forms/submit-focus-by-mouse-then-keydown-expected.txt
@@ -1,17 +1,6 @@
 {
   "layers": [
     {
-      "name": "LayoutView #document",
-      "bounds": [800, 600],
-      "drawsContent": false,
-      "backgroundColor": "#FFFFFF"
-    },
-    {
-      "name": "Scrolling Layer",
-      "bounds": [800, 600],
-      "drawsContent": false
-    },
-    {
       "name": "Scrolling Contents Layer",
       "bounds": [800, 600],
       "contentsOpaque": true,
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/compositing/geometry/root-layer-update-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/compositing/geometry/root-layer-update-expected.png
deleted file mode 100644
index 05b14b3..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/compositing/geometry/root-layer-update-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/compositing/overlap-blending/reflection-opacity-huge-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/compositing/overlap-blending/reflection-opacity-huge-expected.png
deleted file mode 100644
index 422646f4..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/compositing/overlap-blending/reflection-opacity-huge-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/compositing/reflections/reflection-positioning2-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/compositing/reflections/reflection-positioning2-expected.png
deleted file mode 100644
index 58c07ee..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/compositing/reflections/reflection-positioning2-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/compositing/reflections/transform-inside-reflection-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/compositing/reflections/transform-inside-reflection-expected.png
deleted file mode 100644
index e08cbe0..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/compositing/reflections/transform-inside-reflection-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/paint/invalidation/compositing/fixed-pos-inside-composited-intermediate-layer-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/paint/invalidation/compositing/fixed-pos-inside-composited-intermediate-layer-expected.png
deleted file mode 100644
index 28c4a50..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/paint/invalidation/compositing/fixed-pos-inside-composited-intermediate-layer-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/paint/invalidation/compositing/fixed-pos-inside-composited-intermediate-layer-expected.txt b/third_party/blink/web_tests/platform/mac-mac10.12/paint/invalidation/compositing/fixed-pos-inside-composited-intermediate-layer-expected.txt
deleted file mode 100644
index e794a47..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/paint/invalidation/compositing/fixed-pos-inside-composited-intermediate-layer-expected.txt
+++ /dev/null
@@ -1,73 +0,0 @@
-{
-  "layers": [
-    {
-      "name": "LayoutView #document",
-      "bounds": [800, 600],
-      "drawsContent": false,
-      "backgroundColor": "#FFFFFF"
-    },
-    {
-      "name": "Scrolling Layer",
-      "bounds": [785, 600],
-      "drawsContent": false
-    },
-    {
-      "name": "Scrolling Contents Layer",
-      "bounds": [785, 30020],
-      "contentsOpaque": true,
-      "backgroundColor": "#FFFFFF",
-      "transform": 1
-    },
-    {
-      "name": "Squashing Containment Layer",
-      "drawsContent": false,
-      "transform": 1
-    },
-    {
-      "name": "LayoutBlockFlow DIV class='compositedBehind'",
-      "bounds": [500, 500],
-      "contentsOpaque": true,
-      "backgroundColor": "#00FFFF",
-      "transform": 2
-    },
-    {
-      "name": "Squashing Layer (first squashed layer: LayoutBlockFlow (positioned) DIV class='containerOverlapsComposited')",
-      "position": [20, 20],
-      "bounds": [100, 30000],
-      "transform": 1
-    },
-    {
-      "name": "LayoutBlockFlow (positioned) DIV class='fixed'",
-      "position": [45, 145],
-      "bounds": [50, 50],
-      "opacity": 0.990000009536743,
-      "contentsOpaque": true,
-      "backgroundColor": "#00FF00",
-      "transform": 1
-    }
-  ],
-  "transforms": [
-    {
-      "id": 1,
-      "transform": [
-        [1, 0, 0, 0],
-        [0, 1, 0, 0],
-        [0, 0, 1, 0],
-        [0, -100, 0, 1]
-      ],
-      "flattenInheritedTransform": false
-    },
-    {
-      "id": 2,
-      "parent": 1,
-      "transform": [
-        [1, 0, 0, 0],
-        [0, 1, 0, 0],
-        [0, 0, 1, 0],
-        [8, 8, 0, 1]
-      ],
-      "flattenInheritedTransform": false
-    }
-  ]
-}
-
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/paint/invalidation/compositing/layer-repaint-rects-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/paint/invalidation/compositing/layer-repaint-rects-expected.png
deleted file mode 100644
index ea8a18f7..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/paint/invalidation/compositing/layer-repaint-rects-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/paint/invalidation/overflow/flexible-box-overflow-horizontal-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/paint/invalidation/overflow/flexible-box-overflow-horizontal-expected.png
deleted file mode 100644
index 4f67a0521..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/paint/invalidation/overflow/flexible-box-overflow-horizontal-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/paint/invalidation/overflow/vertical-overflow-child-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/paint/invalidation/overflow/vertical-overflow-child-expected.png
deleted file mode 100644
index ed3e3e6..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/paint/invalidation/overflow/vertical-overflow-child-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/paint/invalidation/scale-page-shrink-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/paint/invalidation/scale-page-shrink-expected.png
deleted file mode 100644
index fa7291ed..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/paint/invalidation/scale-page-shrink-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/paint/invalidation/svg/embedded-svg-size-changes-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/paint/invalidation/svg/embedded-svg-size-changes-expected.png
deleted file mode 100644
index 942612d..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/paint/invalidation/svg/embedded-svg-size-changes-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/paint/markers/active-suggestion-marker-split-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/paint/markers/active-suggestion-marker-split-expected.png
deleted file mode 100644
index 40a4ad4..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/paint/markers/active-suggestion-marker-split-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/paint/markers/ellipsis-ltr-text-in-ltr-flow-with-markers-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/paint/markers/ellipsis-ltr-text-in-ltr-flow-with-markers-expected.png
deleted file mode 100644
index 681ef8d0..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/paint/markers/ellipsis-ltr-text-in-ltr-flow-with-markers-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/paint/markers/ellipsis-ltr-text-in-rtl-flow-with-markers-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/paint/markers/ellipsis-ltr-text-in-rtl-flow-with-markers-expected.png
deleted file mode 100644
index 0ad476f1..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/paint/markers/ellipsis-ltr-text-in-rtl-flow-with-markers-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/paint/markers/ellipsis-rtl-text-in-ltr-flow-with-markers-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/paint/markers/ellipsis-rtl-text-in-ltr-flow-with-markers-expected.png
deleted file mode 100644
index 9a8e06e..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/paint/markers/ellipsis-rtl-text-in-ltr-flow-with-markers-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/paint/markers/ellipsis-rtl-text-in-rtl-flow-with-markers-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/paint/markers/ellipsis-rtl-text-in-rtl-flow-with-markers-expected.png
deleted file mode 100644
index 6d53405..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/paint/markers/ellipsis-rtl-text-in-rtl-flow-with-markers-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/paint/markers/inline-spelling-markers-hidpi-composited-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/paint/markers/inline-spelling-markers-hidpi-composited-expected.png
deleted file mode 100644
index 5d74baf1..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/paint/markers/inline-spelling-markers-hidpi-composited-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/paint/markers/inline_spelling_markers-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/paint/markers/inline_spelling_markers-expected.png
deleted file mode 100644
index 7c049b64..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/paint/markers/inline_spelling_markers-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/paint/selection/image-writing-modes-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/paint/selection/image-writing-modes-expected.png
deleted file mode 100644
index 5faef797..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/paint/selection/image-writing-modes-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/paint/selection/text-selection-newline-across-blocks-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/paint/selection/text-selection-newline-across-blocks-expected.png
deleted file mode 100644
index 6572048..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/paint/selection/text-selection-newline-across-blocks-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/paint/selection/text-selection-newline-across-blocks-line-beginning-end-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/paint/selection/text-selection-newline-across-blocks-line-beginning-end-expected.png
deleted file mode 100644
index c7db599b..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/paint/selection/text-selection-newline-across-blocks-line-beginning-end-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/compositing/geometry/root-layer-update-expected.png b/third_party/blink/web_tests/platform/mac-retina/compositing/geometry/root-layer-update-expected.png
deleted file mode 100644
index 05b14b3..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/compositing/geometry/root-layer-update-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/compositing/overlap-blending/reflection-opacity-huge-expected.png b/third_party/blink/web_tests/platform/mac-retina/compositing/overlap-blending/reflection-opacity-huge-expected.png
deleted file mode 100644
index 422646f4..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/compositing/overlap-blending/reflection-opacity-huge-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/compositing/reflections/reflection-positioning2-expected.png b/third_party/blink/web_tests/platform/mac-retina/compositing/reflections/reflection-positioning2-expected.png
deleted file mode 100644
index 58c07ee..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/compositing/reflections/reflection-positioning2-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/compositing/reflections/transform-inside-reflection-expected.png b/third_party/blink/web_tests/platform/mac-retina/compositing/reflections/transform-inside-reflection-expected.png
deleted file mode 100644
index e08cbe0..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/compositing/reflections/transform-inside-reflection-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/paint/invalidation/compositing/fixed-pos-inside-composited-intermediate-layer-expected.png b/third_party/blink/web_tests/platform/mac-retina/paint/invalidation/compositing/fixed-pos-inside-composited-intermediate-layer-expected.png
deleted file mode 100644
index 28c4a50..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/paint/invalidation/compositing/fixed-pos-inside-composited-intermediate-layer-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/paint/invalidation/compositing/fixed-pos-inside-composited-intermediate-layer-expected.txt b/third_party/blink/web_tests/platform/mac-retina/paint/invalidation/compositing/fixed-pos-inside-composited-intermediate-layer-expected.txt
deleted file mode 100644
index e794a47..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/paint/invalidation/compositing/fixed-pos-inside-composited-intermediate-layer-expected.txt
+++ /dev/null
@@ -1,73 +0,0 @@
-{
-  "layers": [
-    {
-      "name": "LayoutView #document",
-      "bounds": [800, 600],
-      "drawsContent": false,
-      "backgroundColor": "#FFFFFF"
-    },
-    {
-      "name": "Scrolling Layer",
-      "bounds": [785, 600],
-      "drawsContent": false
-    },
-    {
-      "name": "Scrolling Contents Layer",
-      "bounds": [785, 30020],
-      "contentsOpaque": true,
-      "backgroundColor": "#FFFFFF",
-      "transform": 1
-    },
-    {
-      "name": "Squashing Containment Layer",
-      "drawsContent": false,
-      "transform": 1
-    },
-    {
-      "name": "LayoutBlockFlow DIV class='compositedBehind'",
-      "bounds": [500, 500],
-      "contentsOpaque": true,
-      "backgroundColor": "#00FFFF",
-      "transform": 2
-    },
-    {
-      "name": "Squashing Layer (first squashed layer: LayoutBlockFlow (positioned) DIV class='containerOverlapsComposited')",
-      "position": [20, 20],
-      "bounds": [100, 30000],
-      "transform": 1
-    },
-    {
-      "name": "LayoutBlockFlow (positioned) DIV class='fixed'",
-      "position": [45, 145],
-      "bounds": [50, 50],
-      "opacity": 0.990000009536743,
-      "contentsOpaque": true,
-      "backgroundColor": "#00FF00",
-      "transform": 1
-    }
-  ],
-  "transforms": [
-    {
-      "id": 1,
-      "transform": [
-        [1, 0, 0, 0],
-        [0, 1, 0, 0],
-        [0, 0, 1, 0],
-        [0, -100, 0, 1]
-      ],
-      "flattenInheritedTransform": false
-    },
-    {
-      "id": 2,
-      "parent": 1,
-      "transform": [
-        [1, 0, 0, 0],
-        [0, 1, 0, 0],
-        [0, 0, 1, 0],
-        [8, 8, 0, 1]
-      ],
-      "flattenInheritedTransform": false
-    }
-  ]
-}
-
diff --git a/third_party/blink/web_tests/platform/mac-retina/paint/invalidation/compositing/layer-repaint-rects-expected.png b/third_party/blink/web_tests/platform/mac-retina/paint/invalidation/compositing/layer-repaint-rects-expected.png
deleted file mode 100644
index ea8a18f7..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/paint/invalidation/compositing/layer-repaint-rects-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/paint/invalidation/overflow/flexible-box-overflow-horizontal-expected.png b/third_party/blink/web_tests/platform/mac-retina/paint/invalidation/overflow/flexible-box-overflow-horizontal-expected.png
deleted file mode 100644
index 4f67a0521..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/paint/invalidation/overflow/flexible-box-overflow-horizontal-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/paint/invalidation/overflow/vertical-overflow-child-expected.png b/third_party/blink/web_tests/platform/mac-retina/paint/invalidation/overflow/vertical-overflow-child-expected.png
deleted file mode 100644
index ed3e3e6..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/paint/invalidation/overflow/vertical-overflow-child-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/paint/invalidation/scale-page-shrink-expected.png b/third_party/blink/web_tests/platform/mac-retina/paint/invalidation/scale-page-shrink-expected.png
deleted file mode 100644
index fa7291ed..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/paint/invalidation/scale-page-shrink-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/paint/invalidation/svg/embedded-svg-size-changes-expected.png b/third_party/blink/web_tests/platform/mac-retina/paint/invalidation/svg/embedded-svg-size-changes-expected.png
deleted file mode 100644
index 942612d..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/paint/invalidation/svg/embedded-svg-size-changes-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/paint/invalidation/svg/relative-sized-use-on-symbol-expected.png b/third_party/blink/web_tests/platform/mac-retina/paint/invalidation/svg/relative-sized-use-on-symbol-expected.png
deleted file mode 100644
index e1f2fc4..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/paint/invalidation/svg/relative-sized-use-on-symbol-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/paint/invalidation/svg/relative-sized-use-on-symbol-expected.txt b/third_party/blink/web_tests/platform/mac-retina/paint/invalidation/svg/relative-sized-use-on-symbol-expected.txt
deleted file mode 100644
index 838fd69..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/paint/invalidation/svg/relative-sized-use-on-symbol-expected.txt
+++ /dev/null
@@ -1,39 +0,0 @@
-{
-  "layers": [
-    {
-      "name": "LayoutView #document",
-      "bounds": [500, 400],
-      "drawsContent": false,
-      "backgroundColor": "#FFFFFF"
-    },
-    {
-      "name": "Scrolling Layer",
-      "bounds": [485, 400],
-      "drawsContent": false
-    },
-    {
-      "name": "Scrolling Contents Layer",
-      "bounds": [485, 478],
-      "contentsOpaque": true,
-      "backgroundColor": "#FFFFFF",
-      "paintInvalidations": [
-        {
-          "object": "NGPhysicalBoxFragment LayoutNGBlockFlow div id='contentBox'",
-          "rect": [8, 68, 402, 402],
-          "reason": "geometry"
-        },
-        {
-          "object": "LayoutSVGViewportContainer svg id='gamesBorder'",
-          "rect": [45, 103, 328, 330],
-          "reason": "paint property change"
-        },
-        {
-          "object": "LayoutSVGViewportContainer svg id='gamesBorder'",
-          "rect": [18, 227, 82, 83],
-          "reason": "paint property change"
-        }
-      ]
-    }
-  ]
-}
-
diff --git a/third_party/blink/web_tests/platform/mac-retina/paint/invalidation/svg/remove-background-property-on-root-expected.txt b/third_party/blink/web_tests/platform/mac-retina/paint/invalidation/svg/remove-background-property-on-root-expected.txt
deleted file mode 100644
index 220bb464..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/paint/invalidation/svg/remove-background-property-on-root-expected.txt
+++ /dev/null
@@ -1,34 +0,0 @@
-{
-  "layers": [
-    {
-      "name": "LayoutView #document",
-      "bounds": [500, 400],
-      "drawsContent": false,
-      "backgroundColor": "#FFFFFF"
-    },
-    {
-      "name": "Scrolling Layer",
-      "bounds": [500, 400],
-      "drawsContent": false
-    },
-    {
-      "name": "Scrolling Contents Layer",
-      "bounds": [500, 400],
-      "contentsOpaque": true,
-      "backgroundColor": "#FFFFFF",
-      "paintInvalidations": [
-        {
-          "object": "LayoutSVGRoot svg",
-          "rect": [8, 8, 100, 100],
-          "reason": "chunk disappeared"
-        },
-        {
-          "object": "NGPhysicalBoxFragment LayoutNGBlockFlow DIV",
-          "rect": [8, 8, 100, 100],
-          "reason": "appeared"
-        }
-      ]
-    }
-  ]
-}
-
diff --git a/third_party/blink/web_tests/platform/mac-retina/paint/markers/active-suggestion-marker-split-expected.png b/third_party/blink/web_tests/platform/mac-retina/paint/markers/active-suggestion-marker-split-expected.png
deleted file mode 100644
index 40a4ad4..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/paint/markers/active-suggestion-marker-split-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/paint/markers/ellipsis-ltr-text-in-ltr-flow-with-markers-expected.png b/third_party/blink/web_tests/platform/mac-retina/paint/markers/ellipsis-ltr-text-in-ltr-flow-with-markers-expected.png
deleted file mode 100644
index 681ef8d0..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/paint/markers/ellipsis-ltr-text-in-ltr-flow-with-markers-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/paint/markers/ellipsis-ltr-text-in-rtl-flow-with-markers-expected.png b/third_party/blink/web_tests/platform/mac-retina/paint/markers/ellipsis-ltr-text-in-rtl-flow-with-markers-expected.png
deleted file mode 100644
index 0ad476f1..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/paint/markers/ellipsis-ltr-text-in-rtl-flow-with-markers-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/paint/markers/ellipsis-rtl-text-in-ltr-flow-with-markers-expected.png b/third_party/blink/web_tests/platform/mac-retina/paint/markers/ellipsis-rtl-text-in-ltr-flow-with-markers-expected.png
deleted file mode 100644
index 9a8e06e..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/paint/markers/ellipsis-rtl-text-in-ltr-flow-with-markers-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/paint/markers/ellipsis-rtl-text-in-rtl-flow-with-markers-expected.png b/third_party/blink/web_tests/platform/mac-retina/paint/markers/ellipsis-rtl-text-in-rtl-flow-with-markers-expected.png
deleted file mode 100644
index 6d53405..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/paint/markers/ellipsis-rtl-text-in-rtl-flow-with-markers-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/paint/markers/inline-spelling-markers-hidpi-composited-expected.png b/third_party/blink/web_tests/platform/mac-retina/paint/markers/inline-spelling-markers-hidpi-composited-expected.png
deleted file mode 100644
index 5d74baf1..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/paint/markers/inline-spelling-markers-hidpi-composited-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/paint/markers/inline_spelling_markers-expected.png b/third_party/blink/web_tests/platform/mac-retina/paint/markers/inline_spelling_markers-expected.png
deleted file mode 100644
index 7c049b64..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/paint/markers/inline_spelling_markers-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/paint/selection/image-writing-modes-expected.png b/third_party/blink/web_tests/platform/mac-retina/paint/selection/image-writing-modes-expected.png
deleted file mode 100644
index 5faef797..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/paint/selection/image-writing-modes-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/paint/selection/text-selection-newline-across-blocks-expected.png b/third_party/blink/web_tests/platform/mac-retina/paint/selection/text-selection-newline-across-blocks-expected.png
deleted file mode 100644
index 6572048..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/paint/selection/text-selection-newline-across-blocks-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/paint/selection/text-selection-newline-across-blocks-line-beginning-end-expected.png b/third_party/blink/web_tests/platform/mac-retina/paint/selection/text-selection-newline-across-blocks-line-beginning-end-expected.png
deleted file mode 100644
index c7db599b..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/paint/selection/text-selection-newline-across-blocks-line-beginning-end-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/paint/selection/text-selection-newline-rtl-expected.png b/third_party/blink/web_tests/platform/mac-retina/paint/selection/text-selection-newline-rtl-expected.png
deleted file mode 100644
index d291c255..0000000
--- a/third_party/blink/web_tests/platform/mac-retina/paint/selection/text-selection-newline-rtl-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/compositing/geometry/root-layer-update-expected.png b/third_party/blink/web_tests/platform/mac/compositing/geometry/root-layer-update-expected.png
index f98d9b3..05b14b3 100644
--- a/third_party/blink/web_tests/platform/mac/compositing/geometry/root-layer-update-expected.png
+++ b/third_party/blink/web_tests/platform/mac/compositing/geometry/root-layer-update-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/compositing/overlap-blending/reflection-opacity-huge-expected.png b/third_party/blink/web_tests/platform/mac/compositing/overlap-blending/reflection-opacity-huge-expected.png
index 0332b4d..422646f4 100644
--- a/third_party/blink/web_tests/platform/mac/compositing/overlap-blending/reflection-opacity-huge-expected.png
+++ b/third_party/blink/web_tests/platform/mac/compositing/overlap-blending/reflection-opacity-huge-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/compositing/reflections/reflection-positioning2-expected.png b/third_party/blink/web_tests/platform/mac/compositing/reflections/reflection-positioning2-expected.png
index 8ae03f7..58c07ee 100644
--- a/third_party/blink/web_tests/platform/mac/compositing/reflections/reflection-positioning2-expected.png
+++ b/third_party/blink/web_tests/platform/mac/compositing/reflections/reflection-positioning2-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/compositing/reflections/transform-inside-reflection-expected.png b/third_party/blink/web_tests/platform/mac/compositing/reflections/transform-inside-reflection-expected.png
index 197bb98..e08cbe0 100644
--- a/third_party/blink/web_tests/platform/mac/compositing/reflections/transform-inside-reflection-expected.png
+++ b/third_party/blink/web_tests/platform/mac/compositing/reflections/transform-inside-reflection-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/paint/invalidation/compositing/fixed-pos-inside-composited-intermediate-layer-expected.png b/third_party/blink/web_tests/platform/mac/paint/invalidation/compositing/fixed-pos-inside-composited-intermediate-layer-expected.png
deleted file mode 100644
index e0a5163..0000000
--- a/third_party/blink/web_tests/platform/mac/paint/invalidation/compositing/fixed-pos-inside-composited-intermediate-layer-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/paint/invalidation/compositing/fixed-pos-inside-composited-intermediate-layer-expected.txt b/third_party/blink/web_tests/platform/mac/paint/invalidation/compositing/fixed-pos-inside-composited-intermediate-layer-expected.txt
deleted file mode 100644
index b1862ee1..0000000
--- a/third_party/blink/web_tests/platform/mac/paint/invalidation/compositing/fixed-pos-inside-composited-intermediate-layer-expected.txt
+++ /dev/null
@@ -1,73 +0,0 @@
-{
-  "layers": [
-    {
-      "name": "LayoutView #document",
-      "bounds": [500, 400],
-      "drawsContent": false,
-      "backgroundColor": "#FFFFFF"
-    },
-    {
-      "name": "Scrolling Layer",
-      "bounds": [485, 385],
-      "drawsContent": false
-    },
-    {
-      "name": "Scrolling Contents Layer",
-      "bounds": [508, 30020],
-      "contentsOpaque": true,
-      "backgroundColor": "#FFFFFF",
-      "transform": 1
-    },
-    {
-      "name": "Squashing Containment Layer",
-      "drawsContent": false,
-      "transform": 1
-    },
-    {
-      "name": "LayoutBlockFlow DIV class='compositedBehind'",
-      "bounds": [500, 500],
-      "contentsOpaque": true,
-      "backgroundColor": "#00FFFF",
-      "transform": 2
-    },
-    {
-      "name": "Squashing Layer (first squashed layer: LayoutBlockFlow (positioned) DIV class='containerOverlapsComposited')",
-      "position": [20, 20],
-      "bounds": [100, 30000],
-      "transform": 1
-    },
-    {
-      "name": "LayoutBlockFlow (positioned) DIV class='fixed'",
-      "position": [45, 145],
-      "bounds": [50, 50],
-      "opacity": 0.990000009536743,
-      "contentsOpaque": true,
-      "backgroundColor": "#00FF00",
-      "transform": 1
-    }
-  ],
-  "transforms": [
-    {
-      "id": 1,
-      "transform": [
-        [1, 0, 0, 0],
-        [0, 1, 0, 0],
-        [0, 0, 1, 0],
-        [0, -100, 0, 1]
-      ],
-      "flattenInheritedTransform": false
-    },
-    {
-      "id": 2,
-      "parent": 1,
-      "transform": [
-        [1, 0, 0, 0],
-        [0, 1, 0, 0],
-        [0, 0, 1, 0],
-        [8, 8, 0, 1]
-      ],
-      "flattenInheritedTransform": false
-    }
-  ]
-}
-
diff --git a/third_party/blink/web_tests/platform/mac/paint/invalidation/compositing/layer-repaint-rects-expected.png b/third_party/blink/web_tests/platform/mac/paint/invalidation/compositing/layer-repaint-rects-expected.png
index 3c1890a7..ea8a18f7 100644
--- a/third_party/blink/web_tests/platform/mac/paint/invalidation/compositing/layer-repaint-rects-expected.png
+++ b/third_party/blink/web_tests/platform/mac/paint/invalidation/compositing/layer-repaint-rects-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/paint/invalidation/overflow/flexible-box-overflow-horizontal-expected.png b/third_party/blink/web_tests/platform/mac/paint/invalidation/overflow/flexible-box-overflow-horizontal-expected.png
index f6f264f..4f67a0521 100644
--- a/third_party/blink/web_tests/platform/mac/paint/invalidation/overflow/flexible-box-overflow-horizontal-expected.png
+++ b/third_party/blink/web_tests/platform/mac/paint/invalidation/overflow/flexible-box-overflow-horizontal-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/paint/invalidation/overflow/vertical-overflow-child-expected.png b/third_party/blink/web_tests/platform/mac/paint/invalidation/overflow/vertical-overflow-child-expected.png
index 1846e5f2..ed3e3e6 100644
--- a/third_party/blink/web_tests/platform/mac/paint/invalidation/overflow/vertical-overflow-child-expected.png
+++ b/third_party/blink/web_tests/platform/mac/paint/invalidation/overflow/vertical-overflow-child-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/paint/invalidation/scale-page-shrink-expected.png b/third_party/blink/web_tests/platform/mac/paint/invalidation/scale-page-shrink-expected.png
index 315d97e..fa7291ed 100644
--- a/third_party/blink/web_tests/platform/mac/paint/invalidation/scale-page-shrink-expected.png
+++ b/third_party/blink/web_tests/platform/mac/paint/invalidation/scale-page-shrink-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/paint/invalidation/scroll/fixed-under-composited-absolute-scrolled-expected.png b/third_party/blink/web_tests/platform/mac/paint/invalidation/scroll/fixed-under-composited-absolute-scrolled-expected.png
new file mode 100644
index 0000000..556d624
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/paint/invalidation/scroll/fixed-under-composited-absolute-scrolled-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/paint/invalidation/scroll/fixed-with-border-under-composited-absolute-scrolled-expected.png b/third_party/blink/web_tests/platform/mac/paint/invalidation/scroll/fixed-with-border-under-composited-absolute-scrolled-expected.png
new file mode 100644
index 0000000..2538174
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/paint/invalidation/scroll/fixed-with-border-under-composited-absolute-scrolled-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/paint/invalidation/selection/selection-clear-expected.png b/third_party/blink/web_tests/platform/mac/paint/invalidation/selection/selection-clear-expected.png
deleted file mode 100644
index 51e456f..0000000
--- a/third_party/blink/web_tests/platform/mac/paint/invalidation/selection/selection-clear-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/paint/invalidation/selection/selection-clear-expected.txt b/third_party/blink/web_tests/platform/mac/paint/invalidation/selection/selection-clear-expected.txt
index 7e0793d3..ea38973 100644
--- a/third_party/blink/web_tests/platform/mac/paint/invalidation/selection/selection-clear-expected.txt
+++ b/third_party/blink/web_tests/platform/mac/paint/invalidation/selection/selection-clear-expected.txt
@@ -1,40 +1,34 @@
 {
   "layers": [
     {
-      "name": "LayoutView #document",
-      "bounds": [800, 600],
-      "drawsContent": false,
-      "backgroundColor": "#FFFFFF"
-    },
-    {
-      "name": "Scrolling Layer",
-      "bounds": [800, 600],
-      "drawsContent": false
-    },
-    {
       "name": "Scrolling Contents Layer",
       "bounds": [800, 600],
       "contentsOpaque": true,
       "backgroundColor": "#FFFFFF",
       "paintInvalidations": [
         {
-          "object": "LayoutBlockFlow DIV id='firstLine'",
+          "object": "NGPhysicalBoxFragment LayoutNGBlockFlow DIV id='firstLine'",
           "rect": [8, 8, 100, 200],
-          "reason": "full"
-        },
-        {
-          "object": "InlineTextBox 'FAIL: Test did'",
-          "rect": [8, 49, 98, 118],
           "reason": "disappeared"
         },
         {
-          "object": "InlineTextBox 'not run'",
-          "rect": [8, 49, 98, 118],
+          "object": "NGPhysicalBoxFragment LayoutNGBlockFlow DIV id='firstLine'",
+          "rect": [8, 8, 100, 100],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPhysicalTextFragment 'FAIL: Test did'",
+          "rect": [8, 8, 98, 200],
           "reason": "disappeared"
         },
         {
-          "object": "InlineTextBox '\u00A0'",
-          "rect": [8, 49, 8, 18],
+          "object": "NGPhysicalTextFragment 'not run'",
+          "rect": [8, 8, 98, 200],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPhysicalTextFragment '\u00A0'",
+          "rect": [8, 8, 8, 100],
           "reason": "appeared"
         }
       ]
diff --git a/third_party/blink/web_tests/platform/mac/paint/invalidation/svg/embedded-svg-size-changes-expected.png b/third_party/blink/web_tests/platform/mac/paint/invalidation/svg/embedded-svg-size-changes-expected.png
index c6c8f16..942612d 100644
--- a/third_party/blink/web_tests/platform/mac/paint/invalidation/svg/embedded-svg-size-changes-expected.png
+++ b/third_party/blink/web_tests/platform/mac/paint/invalidation/svg/embedded-svg-size-changes-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/paint/invalidation/svg/relative-sized-use-on-symbol-expected.txt b/third_party/blink/web_tests/platform/mac/paint/invalidation/svg/relative-sized-use-on-symbol-expected.txt
index 7751a35..2bc2aa2 100644
--- a/third_party/blink/web_tests/platform/mac/paint/invalidation/svg/relative-sized-use-on-symbol-expected.txt
+++ b/third_party/blink/web_tests/platform/mac/paint/invalidation/svg/relative-sized-use-on-symbol-expected.txt
@@ -1,17 +1,6 @@
 {
   "layers": [
     {
-      "name": "LayoutView #document",
-      "bounds": [800, 600],
-      "drawsContent": false,
-      "backgroundColor": "#FFFFFF"
-    },
-    {
-      "name": "Scrolling Layer",
-      "bounds": [800, 600],
-      "drawsContent": false
-    },
-    {
       "name": "Scrolling Contents Layer",
       "bounds": [800, 600],
       "contentsOpaque": true,
diff --git a/third_party/blink/web_tests/platform/mac/paint/invalidation/text-match-document-change-expected.txt b/third_party/blink/web_tests/platform/mac/paint/invalidation/text-match-document-change-expected.txt
index 1f44ac46..41546a1 100644
--- a/third_party/blink/web_tests/platform/mac/paint/invalidation/text-match-document-change-expected.txt
+++ b/third_party/blink/web_tests/platform/mac/paint/invalidation/text-match-document-change-expected.txt
@@ -1,34 +1,23 @@
 {
   "layers": [
     {
-      "name": "LayoutView #document",
-      "bounds": [800, 600],
-      "drawsContent": false,
-      "backgroundColor": "#FFFFFF"
-    },
-    {
-      "name": "Scrolling Layer",
-      "bounds": [800, 600],
-      "drawsContent": false
-    },
-    {
       "name": "Scrolling Contents Layer",
       "bounds": [800, 600],
       "contentsOpaque": true,
       "backgroundColor": "#FFFFFF",
       "paintInvalidations": [
         {
-          "object": "InlineTextBox 'Find-in-page 'findme', then click here)'",
+          "object": "NGPhysicalTextFragment 'Find-in-page 'findme', then click here)'",
           "rect": [18, 128, 256, 36],
           "reason": "disappeared"
         },
         {
-          "object": "InlineTextBox 'To be changed: findme (Manual testing:'",
+          "object": "NGPhysicalTextFragment 'To be changed: findme (Manual testing:'",
           "rect": [18, 128, 256, 36],
           "reason": "disappeared"
         },
         {
-          "object": "InlineTextBox 'After change'",
+          "object": "NGPhysicalTextFragment 'After change'",
           "rect": [18, 128, 84, 18],
           "reason": "appeared"
         },
diff --git a/third_party/blink/web_tests/platform/mac/paint/markers/active-suggestion-marker-split-expected.png b/third_party/blink/web_tests/platform/mac/paint/markers/active-suggestion-marker-split-expected.png
index 212c6db..40a4ad4 100644
--- a/third_party/blink/web_tests/platform/mac/paint/markers/active-suggestion-marker-split-expected.png
+++ b/third_party/blink/web_tests/platform/mac/paint/markers/active-suggestion-marker-split-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/paint/markers/ellipsis-ltr-text-in-ltr-flow-with-markers-expected.png b/third_party/blink/web_tests/platform/mac/paint/markers/ellipsis-ltr-text-in-ltr-flow-with-markers-expected.png
index a013e02..681ef8d0 100644
--- a/third_party/blink/web_tests/platform/mac/paint/markers/ellipsis-ltr-text-in-ltr-flow-with-markers-expected.png
+++ b/third_party/blink/web_tests/platform/mac/paint/markers/ellipsis-ltr-text-in-ltr-flow-with-markers-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/paint/markers/ellipsis-ltr-text-in-rtl-flow-with-markers-expected.png b/third_party/blink/web_tests/platform/mac/paint/markers/ellipsis-ltr-text-in-rtl-flow-with-markers-expected.png
index dc26be2..0ad476f1 100644
--- a/third_party/blink/web_tests/platform/mac/paint/markers/ellipsis-ltr-text-in-rtl-flow-with-markers-expected.png
+++ b/third_party/blink/web_tests/platform/mac/paint/markers/ellipsis-ltr-text-in-rtl-flow-with-markers-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/paint/markers/ellipsis-rtl-text-in-ltr-flow-with-markers-expected.png b/third_party/blink/web_tests/platform/mac/paint/markers/ellipsis-rtl-text-in-ltr-flow-with-markers-expected.png
index 1b7d8309..9a8e06e 100644
--- a/third_party/blink/web_tests/platform/mac/paint/markers/ellipsis-rtl-text-in-ltr-flow-with-markers-expected.png
+++ b/third_party/blink/web_tests/platform/mac/paint/markers/ellipsis-rtl-text-in-ltr-flow-with-markers-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/paint/markers/ellipsis-rtl-text-in-rtl-flow-with-markers-expected.png b/third_party/blink/web_tests/platform/mac/paint/markers/ellipsis-rtl-text-in-rtl-flow-with-markers-expected.png
index 3a3c7efe..6d53405 100644
--- a/third_party/blink/web_tests/platform/mac/paint/markers/ellipsis-rtl-text-in-rtl-flow-with-markers-expected.png
+++ b/third_party/blink/web_tests/platform/mac/paint/markers/ellipsis-rtl-text-in-rtl-flow-with-markers-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/paint/markers/inline-spelling-markers-hidpi-composited-expected.png b/third_party/blink/web_tests/platform/mac/paint/markers/inline-spelling-markers-hidpi-composited-expected.png
index f99dfd7..5d74baf1 100644
--- a/third_party/blink/web_tests/platform/mac/paint/markers/inline-spelling-markers-hidpi-composited-expected.png
+++ b/third_party/blink/web_tests/platform/mac/paint/markers/inline-spelling-markers-hidpi-composited-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/paint/markers/inline_spelling_markers-expected.png b/third_party/blink/web_tests/platform/mac/paint/markers/inline_spelling_markers-expected.png
index 1ca7158..7c049b64 100644
--- a/third_party/blink/web_tests/platform/mac/paint/markers/inline_spelling_markers-expected.png
+++ b/third_party/blink/web_tests/platform/mac/paint/markers/inline_spelling_markers-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/paint/selection/image-writing-modes-expected.png b/third_party/blink/web_tests/platform/mac/paint/selection/image-writing-modes-expected.png
index b7f772c..5faef797 100644
--- a/third_party/blink/web_tests/platform/mac/paint/selection/image-writing-modes-expected.png
+++ b/third_party/blink/web_tests/platform/mac/paint/selection/image-writing-modes-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/paint/selection/text-selection-newline-across-blocks-expected.png b/third_party/blink/web_tests/platform/mac/paint/selection/text-selection-newline-across-blocks-expected.png
index b2b00d51..6572048 100644
--- a/third_party/blink/web_tests/platform/mac/paint/selection/text-selection-newline-across-blocks-expected.png
+++ b/third_party/blink/web_tests/platform/mac/paint/selection/text-selection-newline-across-blocks-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/paint/selection/text-selection-newline-across-blocks-line-beginning-end-expected.png b/third_party/blink/web_tests/platform/mac/paint/selection/text-selection-newline-across-blocks-line-beginning-end-expected.png
index 6572048..c7db599b 100644
--- a/third_party/blink/web_tests/platform/mac/paint/selection/text-selection-newline-across-blocks-line-beginning-end-expected.png
+++ b/third_party/blink/web_tests/platform/mac/paint/selection/text-selection-newline-across-blocks-line-beginning-end-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/paint/selection/text-selection-newline-rtl-expected.png b/third_party/blink/web_tests/platform/mac/paint/selection/text-selection-newline-rtl-expected.png
index f486b96..d291c255 100644
--- a/third_party/blink/web_tests/platform/mac/paint/selection/text-selection-newline-rtl-expected.png
+++ b/third_party/blink/web_tests/platform/mac/paint/selection/text-selection-newline-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/paint/invalidation/selection/selection-clear-expected.png b/third_party/blink/web_tests/platform/win/paint/invalidation/selection/selection-clear-expected.png
deleted file mode 100644
index 8dee85e..0000000
--- a/third_party/blink/web_tests/platform/win/paint/invalidation/selection/selection-clear-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/paint/invalidation/selection/selection-clear-expected.txt b/third_party/blink/web_tests/platform/win/paint/invalidation/selection/selection-clear-expected.txt
index aceabb8..aed94be 100644
--- a/third_party/blink/web_tests/platform/win/paint/invalidation/selection/selection-clear-expected.txt
+++ b/third_party/blink/web_tests/platform/win/paint/invalidation/selection/selection-clear-expected.txt
@@ -1,40 +1,34 @@
 {
   "layers": [
     {
-      "name": "LayoutView #document",
-      "bounds": [800, 600],
-      "drawsContent": false,
-      "backgroundColor": "#FFFFFF"
-    },
-    {
-      "name": "Scrolling Layer",
-      "bounds": [800, 600],
-      "drawsContent": false
-    },
-    {
       "name": "Scrolling Contents Layer",
       "bounds": [800, 600],
       "contentsOpaque": true,
       "backgroundColor": "#FFFFFF",
       "paintInvalidations": [
         {
-          "object": "LayoutBlockFlow DIV id='firstLine'",
+          "object": "NGPhysicalBoxFragment LayoutNGBlockFlow DIV id='firstLine'",
           "rect": [8, 8, 100, 200],
-          "reason": "full"
-        },
-        {
-          "object": "InlineTextBox 'FAIL: Test did'",
-          "rect": [8, 48, 92, 119],
           "reason": "disappeared"
         },
         {
-          "object": "InlineTextBox 'not run'",
-          "rect": [8, 48, 92, 119],
+          "object": "NGPhysicalBoxFragment LayoutNGBlockFlow DIV id='firstLine'",
+          "rect": [8, 8, 100, 100],
+          "reason": "appeared"
+        },
+        {
+          "object": "NGPhysicalTextFragment 'FAIL: Test did'",
+          "rect": [8, 8, 92, 200],
           "reason": "disappeared"
         },
         {
-          "object": "InlineTextBox '\u00A0'",
-          "rect": [8, 48, 8, 19],
+          "object": "NGPhysicalTextFragment 'not run'",
+          "rect": [8, 8, 92, 200],
+          "reason": "disappeared"
+        },
+        {
+          "object": "NGPhysicalTextFragment '\u00A0'",
+          "rect": [8, 8, 8, 100],
           "reason": "appeared"
         }
       ]
diff --git a/third_party/blink/web_tests/platform/win/paint/invalidation/text-match-document-change-expected.txt b/third_party/blink/web_tests/platform/win/paint/invalidation/text-match-document-change-expected.txt
index 8d3dc22..febde0d0 100644
--- a/third_party/blink/web_tests/platform/win/paint/invalidation/text-match-document-change-expected.txt
+++ b/third_party/blink/web_tests/platform/win/paint/invalidation/text-match-document-change-expected.txt
@@ -1,34 +1,23 @@
 {
   "layers": [
     {
-      "name": "LayoutView #document",
-      "bounds": [800, 600],
-      "drawsContent": false,
-      "backgroundColor": "#FFFFFF"
-    },
-    {
-      "name": "Scrolling Layer",
-      "bounds": [800, 600],
-      "drawsContent": false
-    },
-    {
       "name": "Scrolling Contents Layer",
       "bounds": [800, 600],
       "contentsOpaque": true,
       "backgroundColor": "#FFFFFF",
       "paintInvalidations": [
         {
-          "object": "InlineTextBox 'Find-in-page 'findme', then click here)'",
+          "object": "NGPhysicalTextFragment 'Find-in-page 'findme', then click here)'",
           "rect": [18, 130, 235, 39],
           "reason": "disappeared"
         },
         {
-          "object": "InlineTextBox 'To be changed: findme (Manual testing:'",
+          "object": "NGPhysicalTextFragment 'To be changed: findme (Manual testing:'",
           "rect": [18, 130, 235, 39],
           "reason": "disappeared"
         },
         {
-          "object": "InlineTextBox 'After change'",
+          "object": "NGPhysicalTextFragment 'After change'",
           "rect": [18, 130, 77, 19],
           "reason": "appeared"
         },
diff --git a/third_party/blink/web_tests/wpt_internal/webxr/ar_dom_overlay.https.html b/third_party/blink/web_tests/wpt_internal/webxr/ar_dom_overlay.https.html
new file mode 100644
index 0000000..467b4ab
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/webxr/ar_dom_overlay.https.html
@@ -0,0 +1,39 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>let additionalChromiumResources = ["resources/xr-internal-device-mocking.js"];</script>
+<script src="/webxr/resources/webxr_util.js"></script>
+<script src="/webxr/resources/webxr_test_constants.js"></script>
+<script src="/webxr/resources/webxr_test_asserts.js"></script>
+<canvas />
+
+<script>
+// Because AR is not yet in the core webxr spec, this is an internal-chrome only test.
+let testName = "Ensures DOM Overlay feature works for immersive-ar";
+
+let fakeDeviceInitParams = { supportsImmersive: true,
+                             views: VALID_VIEWS,
+                             supportsEnvironmentIntegration: true,
+                             supportedFeatures: ALL_FEATURES.concat([
+                                 'dom-overlay-for-handheld-ar'])};
+
+let testFunction = function(session, fakeDeviceController, t) {
+  assert_equals(session.mode, 'immersive-ar');
+  assert_not_equals(session.environmentBlendMode, 'opaque');
+
+  // The <body> element should have a transparent background.
+  assert_equals(window.getComputedStyle(document.body).backgroundColor,
+                'rgba(0, 0, 0, 0)');
+
+  // Try fullscreening an element.
+  let elem = document.querySelector('canvas');
+  return elem.requestFullscreen().then(() => {
+      assert_equals(document.fullscreenElement, elem);
+  });
+};
+
+xr_session_promise_test(
+  testName, testFunction, fakeDeviceInitParams, 'immersive-ar',
+    {requiredFeatures: ['dom-overlay-for-handheld-ar']});
+
+</script>
diff --git a/third_party/blink/web_tests/wpt_internal/webxr/resources/xr-internal-device-mocking.js b/third_party/blink/web_tests/wpt_internal/webxr/resources/xr-internal-device-mocking.js
index 99313cd0..6be8bfa 100644
--- a/third_party/blink/web_tests/wpt_internal/webxr/resources/xr-internal-device-mocking.js
+++ b/third_party/blink/web_tests/wpt_internal/webxr/resources/xr-internal-device-mocking.js
@@ -37,3 +37,7 @@
 MockRuntime.prototype.getMissingFrameCount = function() {
   return this.presentation_provider_.missing_frame_count_;
 };
+
+// Patch in experimental features.
+MockRuntime.featureToMojoMap["dom-overlay-for-handheld-ar"] =
+    device.mojom.XRSessionFeature.DOM_OVERLAY_FOR_HANDHELD_AR;
diff --git a/third_party/closure_compiler/externs/automation.js b/third_party/closure_compiler/externs/automation.js
index 79e3522..03985db 100644
--- a/third_party/closure_compiler/externs/automation.js
+++ b/third_party/closure_compiler/externs/automation.js
@@ -1102,9 +1102,9 @@
 /**
  * The ARIA column index as specified by the page author.
  * @type {(number|undefined)}
- * @see https://developer.chrome.com/extensions/automation#type-ariaCellColumnIndex
+ * @see https://developer.chrome.com/extensions/automation#type-tableCellAriaColumnIndex
  */
-chrome.automation.AutomationNode.prototype.ariaCellColumnIndex;
+chrome.automation.AutomationNode.prototype.tableCellAriaColumnIndex;
 
 /**
  * The number of columns that this cell spans (default is 1).
@@ -1123,9 +1123,9 @@
 /**
  * The ARIA row index as specified by the page author.
  * @type {(number|undefined)}
- * @see https://developer.chrome.com/extensions/automation#type-ariaCellRowIndex
+ * @see https://developer.chrome.com/extensions/automation#type-tableCellAriaRowIndex
  */
-chrome.automation.AutomationNode.prototype.ariaCellRowIndex;
+chrome.automation.AutomationNode.prototype.tableCellAriaRowIndex;
 
 /**
  * The number of rows that this cell spans (default is 1).
diff --git a/third_party/crashpad/README.chromium b/third_party/crashpad/README.chromium
index 92efcd3..e1d2e623 100644
--- a/third_party/crashpad/README.chromium
+++ b/third_party/crashpad/README.chromium
@@ -2,7 +2,7 @@
 Short Name: crashpad
 URL: https://crashpad.chromium.org/
 Version: unknown
-Revision: eb0c4726f13d06662b0cf82571e5047b386d6dae
+Revision: c87486f5951f0b6445730d03e388b1f6f68ef7b8
 License: Apache 2.0
 License File: crashpad/LICENSE
 Security Critical: yes
diff --git a/third_party/crashpad/crashpad/client/crashpad_client_linux.cc b/third_party/crashpad/crashpad/client/crashpad_client_linux.cc
index 74f1540..00a83fa0 100644
--- a/third_party/crashpad/crashpad/client/crashpad_client_linux.cc
+++ b/third_party/crashpad/crashpad/client/crashpad_client_linux.cc
@@ -58,24 +58,31 @@
     const std::map<std::string, std::string>& annotations,
     const std::vector<std::string>& arguments,
     int socket) {
-  std::vector<std::string> argv;
 #if defined(ARCH_CPU_64_BITS)
-  argv.push_back("/system/bin/app_process64");
+  static constexpr char kAppProcess[] = "/system/bin/app_process64";
 #else
-  argv.push_back("/system/bin/app_process32");
+  static constexpr char kAppProcess[] = "/system/bin/app_process32";
 #endif
+
+  std::vector<std::string> argv;
+  argv.push_back(kAppProcess);
   argv.push_back("/system/bin");
   argv.push_back("--application");
   argv.push_back(class_name);
 
-  std::vector<std::string> handler_argv = BuildHandlerArgvStrings(
-      base::FilePath(), database, metrics_dir, url, annotations, arguments);
+  std::vector<std::string> handler_argv =
+      BuildHandlerArgvStrings(base::FilePath(kAppProcess),
+                              database,
+                              metrics_dir,
+                              url,
+                              annotations,
+                              arguments);
 
   if (socket != kInvalidFileHandle) {
     handler_argv.push_back(FormatArgumentInt("initial-client-fd", socket));
   }
 
-  argv.insert(argv.end(), handler_argv.begin() + 1, handler_argv.end());
+  argv.insert(argv.end(), handler_argv.begin(), handler_argv.end());
   return argv;
 }
 
diff --git a/third_party/jdk/OWNERS b/third_party/jdk/OWNERS
new file mode 100644
index 0000000..0b91858
--- /dev/null
+++ b/third_party/jdk/OWNERS
@@ -0,0 +1,2 @@
+agrieve@chromium.org
+yliuyliu@google.com
diff --git a/third_party/jdk/README.chromium b/third_party/jdk/README.chromium
new file mode 100644
index 0000000..7d3ed22
--- /dev/null
+++ b/third_party/jdk/README.chromium
@@ -0,0 +1,24 @@
+Name: Java Development Kit
+Short Name: JDK
+URL: https://www.java.com/
+Version: 11.0.4
+License: GPL v2
+License File: NOT_SHIPPED
+Security Critical: no
+
+Description:
+The Java Development Kit (JDK) is a software development environment used for
+developing Java applications and applets. (linux-x64)
+
+How to update:
+1. Find the specific version you want to update from
+   https://www.oracle.com/technetwork/java/javase/downloads/index.html
+2. Click DOWNLOAD for specific version
+3. Accept License Agreement
+4. Download "Linux" version
+5. Unzip compressed files to //third_party/jdk/current
+6. Run "cipd create --pkg-def cipd.yaml" to create cipd package and get instance ID
+7. Update instance ID in //DEPS
+
+Local Modifications:
+None
diff --git a/third_party/jdk/cipd.yaml b/third_party/jdk/cipd.yaml
new file mode 100644
index 0000000..a839290
--- /dev/null
+++ b/third_party/jdk/cipd.yaml
@@ -0,0 +1,11 @@
+# Copyright 2019 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.
+
+# To create CIPD package run the following command.
+# cipd create --pkg-def cipd.yaml
+package: chromium/third_party/jdk
+description: Java Development Kit
+root: ./
+data:
+  - dir: current
diff --git a/third_party/libvpx/generate_gni.sh b/third_party/libvpx/generate_gni.sh
index 6a09ef2..fa8d847 100755
--- a/third_party/libvpx/generate_gni.sh
+++ b/third_party/libvpx/generate_gni.sh
@@ -56,9 +56,6 @@
 # $1 - Output base name
 function write_license {
   echo "# This file is generated. Do not edit." >> $1
-  echo "# Copyright (c) 2014 The Chromium Authors. All rights reserved." >> $1
-  echo "# Use of this source code is governed by a BSD-style license that can be" >> $1
-  echo "# found in the LICENSE file." >> $1
   echo "" >> $1
 }
 
diff --git a/third_party/libvpx/libvpx_srcs.gni b/third_party/libvpx/libvpx_srcs.gni
index bbe73b89..a864c48 100644
--- a/third_party/libvpx/libvpx_srcs.gni
+++ b/third_party/libvpx/libvpx_srcs.gni
@@ -1,7 +1,4 @@
 # This file is generated. Do not edit.
-# Copyright (c) 2014 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.
 
 libvpx_srcs_x86 = [
   "//third_party/libvpx/source/libvpx/vp8/common/alloccommon.c",
diff --git a/third_party/webxr_test_pages/webxr-samples/tests/index.html b/third_party/webxr_test_pages/webxr-samples/tests/index.html
index 95a1199..2c551505 100644
--- a/third_party/webxr_test_pages/webxr-samples/tests/index.html
+++ b/third_party/webxr_test_pages/webxr-samples/tests/index.html
@@ -105,6 +105,10 @@
               path: 'cube-sea.html',
               description: 'All hail the cube sea! Not very interesting to look at, but it\'s fantastic for testing!' },
 
+            { title: 'Unresponsive Page', category: 'Basics',
+              path: 'unresponsive-page.html',
+              description: 'A "bad" page that doesn\'t request any frames' },
+
             { title: 'Pointer Painter', category: 'Input',
               path: 'pointer-painter.html',
               description: 'Leaves behind a trail of pointers and cursors on select events.' },
diff --git a/third_party/webxr_test_pages/webxr-samples/tests/unresponsive-page.html b/third_party/webxr_test_pages/webxr-samples/tests/unresponsive-page.html
new file mode 100644
index 0000000..df4a865
--- /dev/null
+++ b/third_party/webxr_test_pages/webxr-samples/tests/unresponsive-page.html
@@ -0,0 +1,120 @@
+<!doctype html>
+<!--
+Copyright 2018 The Immersive Web Community Group
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+-->
+<html>
+  <head>
+    <meta charset='utf-8'>
+    <meta name='viewport' content='width=device-width, initial-scale=1, user-scalable=no'>
+    <meta name='mobile-web-app-capable' content='yes'>
+    <meta name='apple-mobile-web-app-capable' content='yes'>
+
+    <title>Unresponsive Page</title>
+
+    <link href='../css/common.css' rel='stylesheet'></link>
+
+    <!--The polyfill is not needed for browser that have native API support,
+        but is linked by these samples for wider compatibility.-->
+    <!--script src='https://cdn.jsdelivr.net/npm/webxr-polyfill@latest/build/webxr-polyfill.js'></script-->
+    <script src='../js/xrray-polyfill.js' type='module'></script>
+    <script src='../js/webxr-polyfill.js'></script>
+
+    <script src='../js/webxr-button.js'></script>
+  </head>
+  <body>
+    <header>
+      <details open>
+        <summary>Unresponsive Page</summary>
+        <p>
+          This page mimics a poorly behaved page which requests a session but
+          never begins requesting or processing frames.
+          <a class="back" href="./index.html">Back</a>
+        </p>
+      </details>
+    </header>
+    <main style='text-align: center;'>
+      <p>Click 'Enter XR' to see content</p>
+    </main>
+    <script type="module">
+      import {createWebGLContext} from '../js/cottontail/src/core/renderer.js';
+      import {QueryArgs} from '../js/cottontail/src/util/query-args.js';
+
+      // If requested, initialize the WebXR polyfill
+      if (QueryArgs.getBool('allowPolyfill', false)) {
+        var polyfill = new WebXRPolyfill();
+      }
+
+      // XR globals.
+      let xrButton = null;
+
+      // Checks to see if WebXR is available and, if so, queries a list of
+      // XRDevices that are connected to the system.
+      function initXR() {
+        // Adds a helper button to the page that indicates if any XRDevices are
+        // available and let's the user pick between them if there's multiple.
+        xrButton = new XRDeviceButton({
+          onRequestSession: onRequestSession,
+          onEndSession: onEndSession,
+          supportedSessionTypes: ['immersive-vr']
+        });
+        document.querySelector('header').appendChild(xrButton.domElement);
+      }
+
+      // Called when the user selects a device to present to. In response we
+      // will request an exclusive session from that device.
+      function onRequestSession() {
+        navigator.xr.requestSession('immersive-vr').then(onSessionStarted);
+      }
+
+      // Called when we've successfully acquired a XRSession. In response we
+      // will set up the necessary session state and kick off the frame loop.
+      function onSessionStarted(session) {
+        session.mode = 'immersive-vr';
+        // This informs the 'Enter XR' button that the session has started and
+        // that it should display 'Exit XR' instead.
+        xrButton.setSession(session);
+
+        // Listen for the sessions 'end' event so we can respond if the user
+        // or UA ends the session for any reason.
+        session.addEventListener('end', onSessionEnded);
+
+        // Normally we'd set up our context, request a reference space, and then
+        // start a frame loop here, but we want to pretend to be stalled.
+      }
+
+      // Called when the user clicks the 'Exit XR' button. In response we end
+      // the session.
+      function onEndSession(session) {
+        session.end();
+      }
+
+      // Called either when the user has explicitly ended the session (like in
+      // onEndSession()) or when the UA has ended the session for any reason.
+      // At this point the session object is no longer usable and should be
+      // discarded.
+      function onSessionEnded(event) {
+        xrButton.setSession(null);
+      }
+
+      // Start the XR application.
+      initXR();
+    </script>
+  </body>
+</html>
diff --git a/tools/android/avd/BUILD.gn b/tools/android/avd/BUILD.gn
deleted file mode 100644
index 93c51b3..0000000
--- a/tools/android/avd/BUILD.gn
+++ /dev/null
@@ -1,13 +0,0 @@
-# Copyright 2019 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.
-
-import("//build/config/python.gni")
-
-python_library("avd_py") {
-  testonly = true
-  pydeps_file = "avd.pydeps"
-  data = [
-    "proto/",
-  ]
-}
diff --git a/tools/android/avd/avd.py b/tools/android/avd/avd.py
index 397b6d5..2889e0c 100755
--- a/tools/android/avd/avd.py
+++ b/tools/android/avd/avd.py
@@ -4,476 +4,21 @@
 # found in the LICENSE file.
 
 import argparse
-import contextlib
-import json
-import logging
 import os
-import socket
-import stat
-import subprocess
 import sys
-import threading
-
-from google.protobuf import text_format
-from proto import avd_pb2
 
 _SRC_ROOT = os.path.abspath(
     os.path.join(os.path.dirname(__file__), '..', '..', '..'))
 
 sys.path.append(
-    os.path.join(_SRC_ROOT, 'third_party', 'catapult', 'common', 'py_utils'))
-from py_utils import tempfile_ext
-
-sys.path.append(
     os.path.join(_SRC_ROOT, 'third_party', 'catapult', 'devil'))
-from devil.android import device_utils
-from devil.android.sdk import adb_wrapper
 from devil.android.tools import script_common
-from devil.utils import cmd_helper
 from devil.utils import logging_common
-from devil.utils import timeout_retry
 
 sys.path.append(
     os.path.join(_SRC_ROOT, 'build', 'android'))
 import devil_chromium
-
-
-_ALL_PACKAGES = object()
-_DEFAULT_AVDMANAGER_PATH = os.path.join(
-    _SRC_ROOT, 'third_party', 'android_sdk', 'public',
-    'tools', 'bin', 'avdmanager')
-
-
-class AvdException(Exception):
-  """Raised when this module has a problem interacting with an AVD."""
-
-  def __init__(self, summary, command=None, stdout=None, stderr=None):
-    message_parts = [summary]
-    if command:
-      message_parts.append('  command: %s' % ' '.join(command))
-    if stdout:
-      message_parts.append('  stdout:')
-      message_parts.extend(
-          '    %s' % line for line in stdout.splitlines())
-    if stderr:
-      message_parts.append('  stderr:')
-      message_parts.extend(
-          '    %s' % line for line in stderr.splitlines())
-
-    super(AvdException, self).__init__('\n'.join(message_parts))
-
-
-def _Load(avd_proto_path):
-  """Loads an Avd proto from a textpb file at the given path.
-
-  Should not be called outside of this module.
-
-  Args:
-    avd_proto_path: path to a textpb file containing an Avd message.
-  """
-  with open(avd_proto_path) as avd_proto_file:
-    return text_format.Merge(avd_proto_file.read(), avd_pb2.Avd())
-
-
-class _AvdManagerAgent(object):
-  """Private utility for interacting with avdmanager."""
-
-  def __init__(self, avd_home, sdk_root):
-    """Create an _AvdManagerAgent.
-
-    Args:
-      avd_home: path to ANDROID_AVD_HOME directory.
-        Typically something like /path/to/dir/.android/avd
-      sdk_root: path to SDK root directory.
-    """
-    self._avd_home = avd_home
-    self._sdk_root = sdk_root
-
-    self._env = dict(os.environ)
-
-    # avdmanager, like many tools that have evolved from `android`
-    # (http://bit.ly/2m9JiTx), uses toolsdir to find the SDK root.
-    # Pass avdmanager a fake directory under the directory in which
-    # we install the system images s.t. avdmanager can find the
-    # system images.
-    fake_tools_dir = os.path.join(
-        self._sdk_root,
-        'non-existent-tools')
-    self._env.update({
-        'ANDROID_AVD_HOME': self._avd_home,
-        'AVDMANAGER_OPTS':
-            '-Dcom.android.sdkmanager.toolsdir=%s' % fake_tools_dir,
-    })
-
-  def Create(self, avd_name, system_image, force=False):
-    """Call `avdmanager create`.
-
-    Args:
-      avd_name: name of the AVD to create.
-      system_image: system image to use for the AVD.
-      force: whether to force creation, overwriting any existing
-        AVD with the same name.
-    """
-    create_cmd = [
-        _DEFAULT_AVDMANAGER_PATH,
-        '-v',
-        'create',
-        'avd',
-        '-n', avd_name,
-        '-k', system_image,
-    ]
-    if force:
-      create_cmd += ['--force']
-
-    create_proc = cmd_helper.Popen(
-        create_cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE,
-        stderr=subprocess.PIPE, env=self._env)
-    output, error = create_proc.communicate(input='\n')
-    if create_proc.returncode != 0:
-      raise AvdException(
-          'AVD creation failed',
-          command=create_cmd,
-          stdout=output,
-          stderr=error)
-
-    for line in output.splitlines():
-      logging.info('  %s', line)
-
-  def Delete(self, avd_name):
-    """Call `avdmanager delete`.
-
-    Args:
-      avd_name: name of the AVD to delete.
-    """
-    delete_cmd = [
-        _DEFAULT_AVDMANAGER_PATH,
-        '-v',
-        'delete',
-        'avd',
-        '-n', avd_name,
-    ]
-    try:
-      for line in cmd_helper.IterCmdOutputLines(delete_cmd, env=self._env):
-        logging.info('  %s', line)
-    except subprocess.CalledProcessError as e:
-      raise AvdException(
-          'AVD deletion failed: %s' % str(e),
-          command=delete_cmd)
-
-
-class AvdConfig(object):
-  """Represents a particular AVD configuration.
-
-  This class supports creation, installation, and execution of an AVD
-  from a given Avd proto message, as defined in
-  //tools/android/avd/proto/avd.proto.
-  """
-
-  def __init__(self, avd_proto_path):
-    """Create an AvdConfig object.
-
-    Args:
-      avd_proto_path: path to a textpb file containing an Avd message.
-    """
-    self._config = _Load(avd_proto_path)
-
-    self._emulator_home = os.path.join(
-        _SRC_ROOT, self._config.avd_package.dest_path)
-    self._emulator_sdk_root = os.path.join(
-        _SRC_ROOT, self._config.emulator_package.dest_path)
-    self._emulator_path = os.path.join(
-        self._emulator_sdk_root, 'emulator', 'emulator')
-
-    self._initialized = False
-    self._initializer_lock = threading.Lock()
-
-  def Create(self, force=False, snapshot=False, keep=False,
-             cipd_json_output=None):
-    """Create an instance of the AVD CIPD package.
-
-    This method:
-     - installs the requisite system image
-     - creates the AVD
-     - modifies the AVD's ini files to support running chromium tests
-       in chromium infrastructure
-     - optionally starts & stops the AVD for snapshotting (default no)
-     - creates and uploads an instance of the AVD CIPD package
-     - optionally deletes the AVD (default yes)
-
-    Args:
-      force: bool indicating whether to force create the AVD.
-      snapshot: bool indicating whether to snapshot the AVD before creating
-        the CIPD package.
-      keep: bool indicating whether to keep the AVD after creating
-        the CIPD package.
-      cipd_json_output: string path to pass to `cipd create` via -json-output.
-    """
-    logging.info('Installing required packages.')
-    self.Install(packages=[
-        self._config.emulator_package,
-        self._config.system_image_package,
-    ])
-
-    android_avd_home = os.path.join(self._emulator_home, 'avd')
-
-    if not os.path.exists(android_avd_home):
-      os.makedirs(android_avd_home)
-
-    avd_manager = _AvdManagerAgent(
-        avd_home=android_avd_home,
-        sdk_root=self._emulator_sdk_root)
-
-    logging.info('Creating AVD.')
-    avd_manager.Create(
-        avd_name=self._config.avd_name,
-        system_image=self._config.system_image_name,
-        force=force)
-
-    try:
-      logging.info('Modifying AVD configuration.')
-
-      root_ini = os.path.join(
-          android_avd_home, '%s.ini' % self._config.avd_name)
-      avd_dir = os.path.join(
-          android_avd_home, '%s.avd' % self._config.avd_name)
-      config_ini = os.path.join(avd_dir, 'config.ini')
-
-      with open(root_ini, 'a') as root_ini_file:
-        root_ini_file.write('path.rel=avd/%s.avd\n' % self._config.avd_name)
-
-      with open(config_ini, 'a') as config_ini_file:
-        config_ini_file.write('disk.dataPartition.size=4G\n')
-
-      # Start & stop the AVD.
-      self._Initialize()
-      instance = _AvdInstance(
-          self._emulator_path, self._config.avd_name, self._emulator_home)
-      instance.Start(read_only=not snapshot)
-      device_utils.DeviceUtils(instance.serial).WaitUntilFullyBooted(
-          timeout=180, retries=0)
-      instance.Stop()
-
-      package_def_content = {
-          'package': self._config.avd_package.package_name,
-          'root': self._emulator_home,
-          'install_mode': 'copy',
-          'data': [
-              {'dir': os.path.relpath(avd_dir, self._emulator_home)},
-              {'file': os.path.relpath(root_ini, self._emulator_home)},
-          ],
-      }
-
-      logging.info('Creating AVD CIPD package.')
-      logging.debug('ensure file content: %s',
-                    json.dumps(package_def_content, indent=2))
-
-      with tempfile_ext.TemporaryFileName(suffix='.json') as package_def_path:
-        with open(package_def_path, 'w') as package_def_file:
-          json.dump(package_def_content, package_def_file)
-
-        logging.info('  %s', self._config.avd_package.package_name)
-        cipd_create_cmd = [
-            'cipd', 'create', '-pkg-def', package_def_path,
-        ]
-        if cipd_json_output:
-          cipd_create_cmd.extend([
-              '-json-output', cipd_json_output,
-          ])
-        try:
-          for line in cmd_helper.IterCmdOutputLines(cipd_create_cmd):
-            logging.info('    %s', line)
-        except subprocess.CalledProcessError as e:
-          raise AvdException(
-              'CIPD package creation failed: %s' % str(e),
-              command=cipd_create_cmd)
-
-    finally:
-      if not keep:
-        logging.info('Deleting AVD.')
-        avd_manager.Delete(avd_name=self._config.avd_name)
-
-  def Install(self, packages=_ALL_PACKAGES):
-    """Installs the requested CIPD packages.
-
-    Returns: None
-    Raises: AvdException on failure to install.
-    """
-    pkgs_by_dir = {}
-    if packages is _ALL_PACKAGES:
-      packages = [
-          self._config.avd_package,
-          self._config.emulator_package,
-          self._config.system_image_package,
-      ]
-    for pkg in packages:
-      if not pkg.dest_path in pkgs_by_dir:
-        pkgs_by_dir[pkg.dest_path] = []
-      pkgs_by_dir[pkg.dest_path].append(pkg)
-
-    for pkg_dir, pkgs in pkgs_by_dir.iteritems():
-      logging.info('Installing packages in %s', pkg_dir)
-      cipd_root = os.path.join(_SRC_ROOT, pkg_dir)
-      if not os.path.exists(cipd_root):
-        os.makedirs(cipd_root)
-      ensure_path = os.path.join(cipd_root, '.ensure')
-      with open(ensure_path, 'w') as ensure_file:
-        # Make CIPD ensure that all files are present, even if
-        # it thinks the package is installed.
-        ensure_file.write('$ParanoidMode CheckPresence\n\n')
-        for pkg in pkgs:
-          ensure_file.write('%s %s\n' % (pkg.package_name, pkg.version))
-          logging.info('  %s %s', pkg.package_name, pkg.version)
-      ensure_cmd = [
-          'cipd', 'ensure', '-ensure-file', ensure_path, '-root', cipd_root,
-      ]
-      try:
-        for line in cmd_helper.IterCmdOutputLines(ensure_cmd):
-          logging.info('    %s', line)
-      except subprocess.CalledProcessError as e:
-        raise AvdException(
-            'Failed to install CIPD package %s: %s' % (
-                pkg.package_name, str(e)),
-            command=ensure_cmd)
-
-    # The emulator requires that some files are writable.
-    for dirname, _, filenames in os.walk(self._emulator_home):
-      for f in filenames:
-        path = os.path.join(dirname, f)
-        if (os.lstat(path).st_mode &
-            (stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO) == stat.S_IRUSR):
-          os.chmod(path, stat.S_IRUSR | stat.S_IWUSR)
-
-  def _Initialize(self):
-    if self._initialized:
-      return
-
-    with self._initializer_lock:
-      if self._initialized:
-        return
-
-      # Emulator start-up looks for the adb daemon. Make sure it's running.
-      adb_wrapper.AdbWrapper.StartServer()
-
-      # Emulator start-up tries to check for the SDK root by looking for
-      # platforms/ and platform-tools/. Ensure they exist.
-      # See http://bit.ly/2YAkyFE for context.
-      required_dirs = [
-          os.path.join(self._emulator_sdk_root, 'platforms'),
-          os.path.join(self._emulator_sdk_root, 'platform-tools'),
-      ]
-      for d in required_dirs:
-        if not os.path.exists(d):
-          os.makedirs(d)
-
-  def CreateInstance(self):
-    """Creates an AVD instance without starting it.
-
-    Returns:
-      An _AvdInstance.
-    """
-    self._Initialize()
-    return _AvdInstance(
-        self._emulator_path, self._config.avd_name, self._emulator_home)
-
-  def StartInstance(self):
-    """Starts an AVD instance.
-
-    Returns:
-      An _AvdInstance.
-    """
-    instance = self.CreateInstance()
-    instance.Start()
-    return instance
-
-
-class _AvdInstance(object):
-  """Represents a single running instance of an AVD.
-
-  This class should only be created directly by AvdConfig.StartInstance,
-  but its other methods can be freely called.
-  """
-
-  def __init__(self, emulator_path, avd_name, emulator_home):
-    """Create an _AvdInstance object.
-
-    Args:
-      emulator_path: path to the emulator binary.
-      avd_name: name of the AVD to run.
-      emulator_home: path to the emulator home directory.
-    """
-    self._avd_name = avd_name
-    self._emulator_home = emulator_home
-    self._emulator_path = emulator_path
-    self._emulator_proc = None
-    self._emulator_serial = None
-    self._sink = None
-
-  def __str__(self):
-    return '%s|%s' % (self._avd_name, (self._emulator_serial or id(self)))
-
-  def Start(self, read_only=True):
-    """Starts the emulator running an instance of the given AVD."""
-    with tempfile_ext.TemporaryFileName() as socket_path, (contextlib.closing(
-        socket.socket(socket.AF_UNIX))) as sock:
-      sock.bind(socket_path)
-      emulator_cmd = [
-          self._emulator_path,
-          '-avd',
-          self._avd_name,
-          '-report-console',
-          'unix:%s' % socket_path,
-          '-no-window'
-      ]
-      if read_only:
-        emulator_cmd += [
-            '-read-only',
-        ]
-      emulator_env = {}
-      if self._emulator_home:
-        emulator_env['ANDROID_EMULATOR_HOME'] = self._emulator_home
-      sock.listen(1)
-
-      logging.info('Starting emulator.')
-
-      # TODO(jbudorick): Add support for logging emulator stdout & stderr at
-      # higher logging levels.
-      self._sink = open('/dev/null', 'w')
-      self._emulator_proc = cmd_helper.Popen(
-          emulator_cmd,
-          stdout=self._sink,
-          stderr=self._sink,
-          env=emulator_env)
-
-      # Waits for the emulator to report its serial as requested via
-      # -report-console. See http://bit.ly/2lK3L18 for more.
-      def listen_for_serial(s):
-        logging.info('Waiting for connection from emulator.')
-        with contextlib.closing(s.accept()[0]) as conn:
-          val = conn.recv(1024)
-          return 'emulator-%d' % int(val)
-
-      try:
-        self._emulator_serial = timeout_retry.Run(
-            listen_for_serial, timeout=30, retries=0, args=[sock])
-        logging.info('%s started', self._emulator_serial)
-      except Exception as e:
-        self.Stop()
-        raise AvdException('Emulator failed to start: %s' % str(e))
-
-  def Stop(self):
-    """Stops the emulator process."""
-    if self._emulator_proc:
-      if self._emulator_proc.poll() is None:
-        self._emulator_proc.terminate()
-        self._emulator_proc.wait()
-      self._emulator_proc = None
-    if self._sink:
-      self._sink.close()
-      self._sink = None
-
-  @property
-  def serial(self):
-    return self._emulator_serial
+from pylib.local.emulator import avd
 
 
 def main(raw_args):
@@ -497,7 +42,7 @@
   add_common_arguments(install_parser)
 
   def install_cmd(args):
-    AvdConfig(args.avd_config).Install()
+    avd.AvdConfig(args.avd_config).Install()
     return 0
 
   install_parser.set_defaults(func=install_cmd)
@@ -526,7 +71,7 @@
            'via -json-output.')
 
   def create_cmd(args):
-    AvdConfig(args.avd_config).Create(
+    avd.AvdConfig(args.avd_config).Create(
         force=args.force, snapshot=args.snapshot, keep=args.keep,
         cipd_json_output=args.cipd_json_output)
     return 0
diff --git a/tools/android/avd/avd.pydeps b/tools/android/avd/avd.pydeps
deleted file mode 100644
index 3aa0c24..0000000
--- a/tools/android/avd/avd.pydeps
+++ /dev/null
@@ -1,71 +0,0 @@
-# Generated by running:
-#   build/print_python_deps.py --root tools/android/avd --output tools/android/avd/avd.pydeps tools/android/avd/avd.py
-../../../build/android/devil_chromium.py
-../../../build/android/pylib/__init__.py
-../../../build/android/pylib/constants/__init__.py
-../../../build/android/pylib/constants/host_paths.py
-../../../third_party/catapult/common/py_utils/py_utils/__init__.py
-../../../third_party/catapult/common/py_utils/py_utils/cloud_storage.py
-../../../third_party/catapult/common/py_utils/py_utils/cloud_storage_global_lock.py
-../../../third_party/catapult/common/py_utils/py_utils/lock.py
-../../../third_party/catapult/common/py_utils/py_utils/tempfile_ext.py
-../../../third_party/catapult/dependency_manager/dependency_manager/__init__.py
-../../../third_party/catapult/dependency_manager/dependency_manager/archive_info.py
-../../../third_party/catapult/dependency_manager/dependency_manager/base_config.py
-../../../third_party/catapult/dependency_manager/dependency_manager/cloud_storage_info.py
-../../../third_party/catapult/dependency_manager/dependency_manager/dependency_info.py
-../../../third_party/catapult/dependency_manager/dependency_manager/dependency_manager_util.py
-../../../third_party/catapult/dependency_manager/dependency_manager/exceptions.py
-../../../third_party/catapult/dependency_manager/dependency_manager/local_path_info.py
-../../../third_party/catapult/dependency_manager/dependency_manager/manager.py
-../../../third_party/catapult/dependency_manager/dependency_manager/uploader.py
-../../../third_party/catapult/devil/devil/__init__.py
-../../../third_party/catapult/devil/devil/android/__init__.py
-../../../third_party/catapult/devil/devil/android/apk_helper.py
-../../../third_party/catapult/devil/devil/android/constants/__init__.py
-../../../third_party/catapult/devil/devil/android/constants/chrome.py
-../../../third_party/catapult/devil/devil/android/constants/file_system.py
-../../../third_party/catapult/devil/devil/android/decorators.py
-../../../third_party/catapult/devil/devil/android/device_blacklist.py
-../../../third_party/catapult/devil/devil/android/device_errors.py
-../../../third_party/catapult/devil/devil/android/device_signal.py
-../../../third_party/catapult/devil/devil/android/device_temp_file.py
-../../../third_party/catapult/devil/devil/android/device_utils.py
-../../../third_party/catapult/devil/devil/android/install_commands.py
-../../../third_party/catapult/devil/devil/android/logcat_monitor.py
-../../../third_party/catapult/devil/devil/android/md5sum.py
-../../../third_party/catapult/devil/devil/android/ndk/__init__.py
-../../../third_party/catapult/devil/devil/android/ndk/abis.py
-../../../third_party/catapult/devil/devil/android/sdk/__init__.py
-../../../third_party/catapult/devil/devil/android/sdk/aapt.py
-../../../third_party/catapult/devil/devil/android/sdk/adb_wrapper.py
-../../../third_party/catapult/devil/devil/android/sdk/build_tools.py
-../../../third_party/catapult/devil/devil/android/sdk/bundletool.py
-../../../third_party/catapult/devil/devil/android/sdk/intent.py
-../../../third_party/catapult/devil/devil/android/sdk/keyevent.py
-../../../third_party/catapult/devil/devil/android/sdk/split_select.py
-../../../third_party/catapult/devil/devil/android/sdk/version_codes.py
-../../../third_party/catapult/devil/devil/android/tools/__init__.py
-../../../third_party/catapult/devil/devil/android/tools/script_common.py
-../../../third_party/catapult/devil/devil/base_error.py
-../../../third_party/catapult/devil/devil/constants/__init__.py
-../../../third_party/catapult/devil/devil/constants/exit_codes.py
-../../../third_party/catapult/devil/devil/devil_env.py
-../../../third_party/catapult/devil/devil/utils/__init__.py
-../../../third_party/catapult/devil/devil/utils/cmd_helper.py
-../../../third_party/catapult/devil/devil/utils/host_utils.py
-../../../third_party/catapult/devil/devil/utils/lazy/__init__.py
-../../../third_party/catapult/devil/devil/utils/lazy/weak_constant.py
-../../../third_party/catapult/devil/devil/utils/logging_common.py
-../../../third_party/catapult/devil/devil/utils/lsusb.py
-../../../third_party/catapult/devil/devil/utils/parallelizer.py
-../../../third_party/catapult/devil/devil/utils/reraiser_thread.py
-../../../third_party/catapult/devil/devil/utils/reset_usb.py
-../../../third_party/catapult/devil/devil/utils/run_tests_helper.py
-../../../third_party/catapult/devil/devil/utils/timeout_retry.py
-../../../third_party/catapult/devil/devil/utils/watchdog_timer.py
-../../../third_party/catapult/devil/devil/utils/zip_utils.py
-../../../third_party/catapult/third_party/zipfile/zipfile_2_7_13.py
-avd.py
-proto/__init__.py
-proto/avd_pb2.py
diff --git a/tools/android/avd/proto/avd_pb2.py b/tools/android/avd/proto/avd_pb2.py
deleted file mode 100644
index 96bdac1..0000000
--- a/tools/android/avd/proto/avd_pb2.py
+++ /dev/null
@@ -1,153 +0,0 @@
-# Generated by the protocol buffer compiler.  DO NOT EDIT!
-# source: avd.proto
-
-import sys
-_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1'))
-from google.protobuf import descriptor as _descriptor
-from google.protobuf import message as _message
-from google.protobuf import reflection as _reflection
-from google.protobuf import symbol_database as _symbol_database
-from google.protobuf import descriptor_pb2
-# @@protoc_insertion_point(imports)
-
-_sym_db = _symbol_database.Default()
-
-
-
-
-DESCRIPTOR = _descriptor.FileDescriptor(
-  name='avd.proto',
-  package='tools.android.avd.proto',
-  syntax='proto3',
-  serialized_pb=_b('\n\tavd.proto\x12\x17tools.android.avd.proto\"G\n\x0b\x43IPDPackage\x12\x14\n\x0cpackage_name\x18\x01 \x01(\t\x12\x0f\n\x07version\x18\x02 \x01(\t\x12\x11\n\tdest_path\x18\x03 \x01(\t\"\xf1\x01\n\x03\x41vd\x12>\n\x10\x65mulator_package\x18\x01 \x01(\x0b\x32$.tools.android.avd.proto.CIPDPackage\x12\x42\n\x14system_image_package\x18\x02 \x01(\x0b\x32$.tools.android.avd.proto.CIPDPackage\x12\x19\n\x11system_image_name\x18\x03 \x01(\t\x12\x39\n\x0b\x61vd_package\x18\x04 \x01(\x0b\x32$.tools.android.avd.proto.CIPDPackage\x12\x10\n\x08\x61vd_name\x18\x05 \x01(\tb\x06proto3')
-)
-_sym_db.RegisterFileDescriptor(DESCRIPTOR)
-
-
-
-
-_CIPDPACKAGE = _descriptor.Descriptor(
-  name='CIPDPackage',
-  full_name='tools.android.avd.proto.CIPDPackage',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='package_name', full_name='tools.android.avd.proto.CIPDPackage.package_name', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-    _descriptor.FieldDescriptor(
-      name='version', full_name='tools.android.avd.proto.CIPDPackage.version', index=1,
-      number=2, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-    _descriptor.FieldDescriptor(
-      name='dest_path', full_name='tools.android.avd.proto.CIPDPackage.dest_path', index=2,
-      number=3, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=38,
-  serialized_end=109,
-)
-
-
-_AVD = _descriptor.Descriptor(
-  name='Avd',
-  full_name='tools.android.avd.proto.Avd',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='emulator_package', full_name='tools.android.avd.proto.Avd.emulator_package', index=0,
-      number=1, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-    _descriptor.FieldDescriptor(
-      name='system_image_package', full_name='tools.android.avd.proto.Avd.system_image_package', index=1,
-      number=2, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-    _descriptor.FieldDescriptor(
-      name='system_image_name', full_name='tools.android.avd.proto.Avd.system_image_name', index=2,
-      number=3, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-    _descriptor.FieldDescriptor(
-      name='avd_package', full_name='tools.android.avd.proto.Avd.avd_package', index=3,
-      number=4, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-    _descriptor.FieldDescriptor(
-      name='avd_name', full_name='tools.android.avd.proto.Avd.avd_name', index=4,
-      number=5, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      options=None),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=112,
-  serialized_end=353,
-)
-
-_AVD.fields_by_name['emulator_package'].message_type = _CIPDPACKAGE
-_AVD.fields_by_name['system_image_package'].message_type = _CIPDPACKAGE
-_AVD.fields_by_name['avd_package'].message_type = _CIPDPACKAGE
-DESCRIPTOR.message_types_by_name['CIPDPackage'] = _CIPDPACKAGE
-DESCRIPTOR.message_types_by_name['Avd'] = _AVD
-
-CIPDPackage = _reflection.GeneratedProtocolMessageType('CIPDPackage', (_message.Message,), dict(
-  DESCRIPTOR = _CIPDPACKAGE,
-  __module__ = 'avd_pb2'
-  # @@protoc_insertion_point(class_scope:tools.android.avd.proto.CIPDPackage)
-  ))
-_sym_db.RegisterMessage(CIPDPackage)
-
-Avd = _reflection.GeneratedProtocolMessageType('Avd', (_message.Message,), dict(
-  DESCRIPTOR = _AVD,
-  __module__ = 'avd_pb2'
-  # @@protoc_insertion_point(class_scope:tools.android.avd.proto.Avd)
-  ))
-_sym_db.RegisterMessage(Avd)
-
-
-# @@protoc_insertion_point(module_scope)
diff --git a/tools/mb/mb_config.pyl b/tools/mb/mb_config.pyl
index 8bde3e0..56398c3 100644
--- a/tools/mb/mb_config.pyl
+++ b/tools/mb/mb_config.pyl
@@ -614,6 +614,7 @@
       'Win x64 Builder': 'gpu_tests_release_bot_minimal_symbols',
       'Win x64 Builder (dbg)': 'gpu_tests_debug_bot',
       'Windows deterministic': 'release_bot_x86_minimal_symbols',
+      'win-celab-builder-rel': 'celab_release_bot',
     },
 
     'internal.client.kitchensync': {
@@ -899,6 +900,7 @@
       'win10_chromium_x64_rel_ng_exp': 'release_trybot',
       'win-annotator-rel': 'release_trybot',
       'win-asan': 'asan_clang_fuzzer_static_v8_heap_minimal_symbols_release',
+      'win-celab-try-rel': 'celab_release_bot',
       'win-jumbo-rel': 'jumbo_large_chunks_release_bot_compile_only',
       'win-libfuzzer-asan-rel': 'libfuzzer_windows_asan_release_trybot',
       'win7-rel': 'gpu_tests_release_trybot_x86_resource_whitelisting',
@@ -1265,6 +1267,10 @@
       'cast', 'cast_audio', 'release_trybot',
     ],
 
+    'celab_release_bot': [
+      'release_bot', 'minimal_symbols'
+    ],
+
     'cfi_full_cfi_icall_cfi_diag_recover_release_static': [
       'cfi_full', 'cfi_icall', 'cfi_diag', 'cfi_recover', 'thin_lto', 'release', 'static',
     ],
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index 8fdd729..01c5598 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -36776,6 +36776,7 @@
   <int value="317432596" label="DisplayLocking:disabled"/>
   <int value="319683583" label="ContentSuggestionsDebugLog:enabled"/>
   <int value="320121752" label="DelegateOverscrollSwipes:disabled"/>
+  <int value="321366101" label="WebXRARDOMOverlay:enabled"/>
   <int value="323605372" label="ui-disable-compositor-animation-timelines"/>
   <int value="324060906"
       label="enable-experimental-accessibility-language-detection"/>
@@ -36901,6 +36902,7 @@
   <int value="477967119" label="enable-unified-media-pipeline"/>
   <int value="479906041" label="RunAllFlashInAllowMode:disabled"/>
   <int value="480544447" label="NonValidatingReloadOnRefreshContentV2:enabled"/>
+  <int value="480677983" label="WebXRARDOMOverlay:disabled"/>
   <int value="481506759" label="ServiceWorkerScriptStreaming:enabled"/>
   <int value="482232604" label="PercentBasedScrolling:enabled"/>
   <int value="492113129" label="ExperimentalAppBanners:enabled"/>
@@ -53073,6 +53075,7 @@
   <int value="3" label="User dismissed the Safety Tip with the esc key"/>
   <int value="4" label="User dismissed the Safety Tip with the close button"/>
   <int value="5" label="User dismissed the Safety Tip with the ignore button"/>
+  <int value="6" label="User opened help center"/>
 </enum>
 
 <enum name="SafetyTipStatus">
diff --git a/tools/metrics/histograms/extract_histograms.py b/tools/metrics/histograms/extract_histograms.py
index 0f59390..f45619565 100644
--- a/tools/metrics/histograms/extract_histograms.py
+++ b/tools/metrics/histograms/extract_histograms.py
@@ -521,7 +521,12 @@
     suffix_nodes = histogram_suffixes.getElementsByTagName(suffix_tag)
     suffix_labels = {}
     for suffix in suffix_nodes:
-      suffix_labels[suffix.getAttribute('name')] = suffix.getAttribute('label')
+      suffix_name = suffix.getAttribute('name')
+      if not suffix.hasAttribute('label'):
+        logging.error('suffix %s in histogram_suffixes %s should have a label',
+                      suffix_name, name)
+        have_errors = True
+      suffix_labels[suffix_name] = suffix.getAttribute('label')
     # Find owners list under current histogram_suffixes tag.
     owners, _ = _ExtractOwners(histogram_suffixes)
 
diff --git a/tools/metrics/histograms/extract_histograms_test.py b/tools/metrics/histograms/extract_histograms_test.py
index cc2afe3..7a69dbf 100644
--- a/tools/metrics/histograms/extract_histograms_test.py
+++ b/tools/metrics/histograms/extract_histograms_test.py
@@ -481,6 +481,34 @@
     self.assertEquals('This is a summary with & and " and \'',
                       hists['Test.Histogram']['summary'])
 
+  def testNewSuffixWithoutLabel(self):
+    suffix_without_label = xml.dom.minidom.parseString("""
+<histogram-configuration>
+<histogram_suffixes_list>
+  <histogram_suffixes name="Suffixes" separator=".">
+    <suffix base="true" name="BaseSuffix"/>
+  </histogram_suffixes>
+</histogram_suffixes_list>
+</histogram-configuration>
+""")
+    _, have_errors = extract_histograms.ExtractHistogramsFromDom(
+        suffix_without_label)
+    self.assertTrue(have_errors)
+
+  def testNewSuffixWithLabel(self):
+    suffix_with_label = xml.dom.minidom.parseString("""
+<histogram-configuration>
+<histogram_suffixes_list>
+  <histogram_suffixes name="Suffixes" separator=".">
+    <suffix base="true" name="BaseSuffix" label="Base"/>
+  </histogram_suffixes>
+</histogram_suffixes_list>
+</histogram-configuration>
+""")
+    have_errors = extract_histograms. _UpdateHistogramsWithSuffixes(
+        suffix_with_label, {})
+    self.assertFalse(have_errors)
+
 if __name__ == "__main__":
   logging.basicConfig(level=logging.ERROR + 1)
   unittest.main()
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml
index 379f755..73e9681 100644
--- a/tools/metrics/histograms/histograms.xml
+++ b/tools/metrics/histograms/histograms.xml
@@ -163346,9 +163346,9 @@
 </histogram_suffixes>
 
 <histogram_suffixes name="AccountManagerMigrationSteps" separator=".">
-  <suffix name="ArcAccountsMigration"/>
-  <suffix name="ContentAreaAccountsMigration"/>
-  <suffix name="DeviceAccountMigration"/>
+  <suffix name="ArcAccountsMigration" label=""/>
+  <suffix name="ContentAreaAccountsMigration" label=""/>
+  <suffix name="DeviceAccountMigration" label=""/>
   <affected-histogram name="AccountManager.Migrations.StepResult"/>
 </histogram_suffixes>
 
@@ -163388,8 +163388,8 @@
 </histogram_suffixes>
 
 <histogram_suffixes name="AdapterDecision" separator="." ordering="prefix,2">
-  <suffix name="BrightnessChange"/>
-  <suffix name="NoBrightnessChange"/>
+  <suffix name="BrightnessChange" label=""/>
+  <suffix name="NoBrightnessChange" label=""/>
   <affected-histogram
       name="AutoScreenBrightness.AdapterDecisionAtUserChange.Brighten.AlsDelta"/>
   <affected-histogram
@@ -163726,8 +163726,8 @@
 
 <histogram_suffixes name="AlsBrightnessDirection" separator="."
     ordering="prefix,2">
-  <suffix name="Brighten"/>
-  <suffix name="Darken"/>
+  <suffix name="Brighten" label=""/>
+  <suffix name="Darken" label=""/>
   <affected-histogram
       name="AutoScreenBrightness.AdapterDecisionAtUserChange.AlsDelta"/>
   <affected-histogram
@@ -163812,14 +163812,14 @@
 </histogram_suffixes>
 
 <histogram_suffixes name="AndroidDownloadTypes" separator=".">
-  <suffix name="Audio"/>
-  <suffix name="Document"/>
-  <suffix name="Image"/>
-  <suffix name="OfflinePage"/>
-  <suffix name="Other"/>
-  <suffix name="PrefetchedOfflinePage"/>
-  <suffix name="Total"/>
-  <suffix name="Video"/>
+  <suffix name="Audio" label=""/>
+  <suffix name="Document" label=""/>
+  <suffix name="Image" label=""/>
+  <suffix name="OfflinePage" label=""/>
+  <suffix name="Other" label=""/>
+  <suffix name="PrefetchedOfflinePage" label=""/>
+  <suffix name="Total" label=""/>
+  <suffix name="Video" label=""/>
   <affected-histogram name="Android.DownloadManager.InitialCount"/>
   <affected-histogram name="Android.DownloadManager.InitialCount.Viewed"/>
   <affected-histogram
@@ -163911,16 +163911,16 @@
 </histogram_suffixes>
 
 <histogram_suffixes name="AndroidGATTEvents" separator=".">
-  <suffix name="onCharacteristicRead.Status"/>
-  <suffix name="onCharacteristicWrite.Status"/>
+  <suffix name="onCharacteristicRead.Status" label=""/>
+  <suffix name="onCharacteristicWrite.Status" label=""/>
   <suffix name="onConnectionStateChange.Status.Connected"
       label="While Connected"/>
   <suffix name="onConnectionStateChange.Status.Disconnected"
       label="While Disonnected"/>
   <suffix name="onConnectionStateChange.Status.InvalidState"
       label="While InvalidState"/>
-  <suffix name="onDescriptorRead.Status"/>
-  <suffix name="onDescriptorWrite.Status"/>
+  <suffix name="onDescriptorRead.Status" label=""/>
+  <suffix name="onDescriptorWrite.Status" label=""/>
   <suffix name="onServicesDiscovered.Status.Connected" label="While Connected"/>
   <suffix name="onServicesDiscovered.Status.Disconnected"
       label="While Disconnected"/>
@@ -163942,23 +163942,23 @@
 </histogram_suffixes>
 
 <histogram_suffixes name="AndroidTabPersistentStoreTime" separator=".">
-  <suffix name="CleanupAllEncryptedTime">
+  <suffix name="CleanupAllEncryptedTime" label="">
     <obsolete>
       Original code deleted in a refactoring.
     </obsolete>
   </suffix>
-  <suffix name="LoadStateInternalPrefetchTime"/>
-  <suffix name="LoadStateInternalTime"/>
-  <suffix name="LoadStateTime"/>
-  <suffix name="MergeStateInternalFetchTime"/>
-  <suffix name="MergeStateInternalTime"/>
-  <suffix name="ReadMergedStateTime"/>
-  <suffix name="ReadSavedStateTime"/>
-  <suffix name="RestoreTabPrefetchTime"/>
-  <suffix name="RestoreTabTime"/>
-  <suffix name="SaveListTime"/>
-  <suffix name="SaveStateTime"/>
-  <suffix name="SaveTabsTime"/>
+  <suffix name="LoadStateInternalPrefetchTime" label=""/>
+  <suffix name="LoadStateInternalTime" label=""/>
+  <suffix name="LoadStateTime" label=""/>
+  <suffix name="MergeStateInternalFetchTime" label=""/>
+  <suffix name="MergeStateInternalTime" label=""/>
+  <suffix name="ReadMergedStateTime" label=""/>
+  <suffix name="ReadSavedStateTime" label=""/>
+  <suffix name="RestoreTabPrefetchTime" label=""/>
+  <suffix name="RestoreTabTime" label=""/>
+  <suffix name="SaveListTime" label=""/>
+  <suffix name="SaveStateTime" label=""/>
+  <suffix name="SaveTabsTime" label=""/>
   <affected-histogram name="Android.StrictMode.TabPersistentStore"/>
 </histogram_suffixes>
 
@@ -163979,14 +163979,14 @@
 </histogram_suffixes>
 
 <histogram_suffixes name="AppListState" separator=".">
-  <suffix name="Closed"/>
-  <suffix name="FullscreenAllApps"/>
-  <suffix name="FullscreenSearch"/>
-  <suffix name="Half"/>
-  <suffix name="HomecherAllApps"/>
-  <suffix name="HomecherClosed"/>
-  <suffix name="HomecherSearch"/>
-  <suffix name="Peeking"/>
+  <suffix name="Closed" label=""/>
+  <suffix name="FullscreenAllApps" label=""/>
+  <suffix name="FullscreenSearch" label=""/>
+  <suffix name="Half" label=""/>
+  <suffix name="HomecherAllApps" label=""/>
+  <suffix name="HomecherClosed" label=""/>
+  <suffix name="HomecherSearch" label=""/>
+  <suffix name="Peeking" label=""/>
   <affected-histogram name="Apps.AppListAppLaunchedV2"/>
 </histogram_suffixes>
 
@@ -164066,8 +164066,8 @@
 </histogram_suffixes>
 
 <histogram_suffixes name="AsyncDNSPref" separator="_">
-  <suffix name="Disabled"/>
-  <suffix name="Enabled"/>
+  <suffix name="Disabled" label=""/>
+  <suffix name="Enabled" label=""/>
   <affected-histogram name="AsyncDNS.PrefDefaultSource"/>
   <affected-histogram name="AsyncDNS.PrefSource"/>
 </histogram_suffixes>
@@ -164084,11 +164084,11 @@
   <obsolete>
     Deprecated 2016/03. The async set-as-default experiments are finished.
   </obsolete>
-  <suffix name="Abandoned"/>
-  <suffix name="Failure"/>
-  <suffix name="NoErrorsNotDefault"/>
-  <suffix name="Retry"/>
-  <suffix name="Success"/>
+  <suffix name="Abandoned" label=""/>
+  <suffix name="Failure" label=""/>
+  <suffix name="NoErrorsNotDefault" label=""/>
+  <suffix name="Retry" label=""/>
+  <suffix name="Success" label=""/>
   <affected-histogram name="DefaultBrowser.AsyncSetAsDefault.Duration"/>
   <affected-histogram name="DefaultBrowser.SetDefaultAsyncDuration"/>
 </histogram_suffixes>
@@ -164598,44 +164598,44 @@
 </histogram_suffixes>
 
 <histogram_suffixes name="BlinkCanvasDrawImageSizeType" separator=".">
-  <suffix name="Canvas.CPU"/>
-  <suffix name="Canvas.GPU"/>
-  <suffix name="CssImage"/>
-  <suffix name="ImageBitmap"/>
-  <suffix name="ImageElement"/>
-  <suffix name="OffscreenCanvas.CPU"/>
-  <suffix name="OffscreenCanvas.GPU"/>
-  <suffix name="SVG"/>
-  <suffix name="Unknown"/>
-  <suffix name="Video"/>
+  <suffix name="Canvas.CPU" label=""/>
+  <suffix name="Canvas.GPU" label=""/>
+  <suffix name="CssImage" label=""/>
+  <suffix name="ImageBitmap" label=""/>
+  <suffix name="ImageElement" label=""/>
+  <suffix name="OffscreenCanvas.CPU" label=""/>
+  <suffix name="OffscreenCanvas.GPU" label=""/>
+  <suffix name="SVG" label=""/>
+  <suffix name="Unknown" label=""/>
+  <suffix name="Video" label=""/>
   <affected-histogram name="Blink.Canvas.DrawImage.SqrtNumberOfPixels"/>
 </histogram_suffixes>
 
 <histogram_suffixes name="BlinkCanvasDrawImageType" separator=".">
-  <suffix base="true" name="Canvas"/>
-  <suffix base="true" name="CssImage"/>
-  <suffix base="true" name="ImageBitmap"/>
-  <suffix base="true" name="ImageElement"/>
-  <suffix base="true" name="OffscreenCanvas"/>
-  <suffix base="true" name="Others">
+  <suffix base="true" name="Canvas" label=""/>
+  <suffix base="true" name="CssImage" label=""/>
+  <suffix base="true" name="ImageBitmap" label=""/>
+  <suffix base="true" name="ImageElement" label=""/>
+  <suffix base="true" name="OffscreenCanvas" label=""/>
+  <suffix base="true" name="Others" label="">
     <obsolete>
       Deprecated 10/2018 with the addition of CssImage and Unknown.
     </obsolete>
   </suffix>
-  <suffix base="true" name="SVG"/>
-  <suffix base="true" name="Unknown"/>
-  <suffix base="true" name="Video"/>
+  <suffix base="true" name="SVG" label=""/>
+  <suffix base="true" name="Unknown" label=""/>
+  <suffix base="true" name="Video" label=""/>
   <affected-histogram name="Blink.Canvas.DrawImage.Duration"/>
 </histogram_suffixes>
 
 <histogram_suffixes name="BlinkCanvasDurationBySource" separator=".">
-  <suffix name="CPU"/>
-  <suffix name="DisplayList">
+  <suffix name="CPU" label=""/>
+  <suffix name="DisplayList" label="">
     <obsolete>
       Deprecated 11/2017 with removal of Display List Canvas 2D mode.
     </obsolete>
   </suffix>
-  <suffix name="GPU"/>
+  <suffix name="GPU" label=""/>
   <affected-histogram name="Blink.Canvas.DrawImage.Duration.Canvas"/>
   <affected-histogram name="Blink.Canvas.DrawImage.Duration.CssImage"/>
   <affected-histogram name="Blink.Canvas.DrawImage.Duration.ImageBitmap"/>
@@ -164649,28 +164649,28 @@
 </histogram_suffixes>
 
 <histogram_suffixes name="BlinkCanvasOffscreenCommitType" separator=".">
-  <suffix name="GPUCanvasGPUCompositingMain"/>
-  <suffix name="GPUCanvasGPUCompositingWorker"/>
-  <suffix name="GPUCanvasSoftwareCompositingMain"/>
-  <suffix name="GPUCanvasSoftwareCompositingWorker"/>
-  <suffix name="SoftwareCanvasGPUCompositingMain"/>
-  <suffix name="SoftwareCanvasGPUCompositingWorker"/>
-  <suffix name="SoftwareCanvasSoftwareCompositingMain"/>
-  <suffix name="SoftwareCanvasSoftwareCompositingWorker"/>
+  <suffix name="GPUCanvasGPUCompositingMain" label=""/>
+  <suffix name="GPUCanvasGPUCompositingWorker" label=""/>
+  <suffix name="GPUCanvasSoftwareCompositingMain" label=""/>
+  <suffix name="GPUCanvasSoftwareCompositingWorker" label=""/>
+  <suffix name="SoftwareCanvasGPUCompositingMain" label=""/>
+  <suffix name="SoftwareCanvasGPUCompositingWorker" label=""/>
+  <suffix name="SoftwareCanvasSoftwareCompositingMain" label=""/>
+  <suffix name="SoftwareCanvasSoftwareCompositingWorker" label=""/>
   <affected-histogram name="Blink.Canvas.OffscreenCommitTimer"/>
 </histogram_suffixes>
 
 <histogram_suffixes name="BlinkCanvasRasterDurationType" separator=".">
-  <suffix name="Accelerated.CPU"/>
-  <suffix name="Accelerated.GPU"/>
-  <suffix name="Accelerated.Total"/>
-  <suffix name="Unaccelerated"/>
+  <suffix name="Accelerated.CPU" label=""/>
+  <suffix name="Accelerated.GPU" label=""/>
+  <suffix name="Accelerated.Total" label=""/>
+  <suffix name="Unaccelerated" label=""/>
   <affected-histogram name="Blink.Canvas.RasterDuration"/>
 </histogram_suffixes>
 
 <histogram_suffixes name="BlinkCanvasToBlobIdleEncodAndDelayType" separator=".">
-  <suffix name="JPEG"/>
-  <suffix name="PNG"/>
+  <suffix name="JPEG" label=""/>
+  <suffix name="PNG" label=""/>
   <affected-histogram name="Blink.Canvas.ToBlob.CompleteEncodingDelay"/>
   <affected-histogram name="Blink.Canvas.ToBlob.IdleEncodeDuration">
     <obsolete>
@@ -164681,50 +164681,50 @@
 </histogram_suffixes>
 
 <histogram_suffixes name="BlinkCanvasToBlobType" separator=".">
-  <suffix name="JPEG"/>
-  <suffix name="PNG"/>
-  <suffix name="WEBP"/>
+  <suffix name="JPEG" label=""/>
+  <suffix name="PNG" label=""/>
+  <suffix name="WEBP" label=""/>
   <affected-histogram name="Blink.Canvas.ToBlob.ScaledDuration"/>
 </histogram_suffixes>
 
 <histogram_suffixes name="BlinkCanvasToDataURLMimeType" separator=".">
-  <suffix name="BMP">
+  <suffix name="BMP" label="">
     <obsolete>
       Removed in Oct 2016
     </obsolete>
   </suffix>
-  <suffix name="GIF">
+  <suffix name="GIF" label="">
     <obsolete>
       Removed in Oct 2016
     </obsolete>
   </suffix>
-  <suffix name="ICON">
+  <suffix name="ICON" label="">
     <obsolete>
       Removed in Oct 2016
     </obsolete>
   </suffix>
-  <suffix name="JPEG"/>
-  <suffix name="PNG"/>
-  <suffix name="TIFF">
+  <suffix name="JPEG" label=""/>
+  <suffix name="PNG" label=""/>
+  <suffix name="TIFF" label="">
     <obsolete>
       Removed in Oct 2016
     </obsolete>
   </suffix>
-  <suffix name="Unknown">
+  <suffix name="Unknown" label="">
     <obsolete>
       Removed in Oct 2016
     </obsolete>
   </suffix>
-  <suffix name="WEBP"/>
+  <suffix name="WEBP" label=""/>
   <affected-histogram name="Blink.Canvas.ToDataURLScaledDuration"/>
 </histogram_suffixes>
 
 <histogram_suffixes name="BlinkCompositingLayerCount" separator=".">
-  <suffix name="ActiveAnimation"/>
-  <suffix name="AssumedOverlap"/>
-  <suffix name="IndirectComposited"/>
-  <suffix name="Overlap"/>
-  <suffix name="TotalComposited"/>
+  <suffix name="ActiveAnimation" label=""/>
+  <suffix name="AssumedOverlap" label=""/>
+  <suffix name="IndirectComposited" label=""/>
+  <suffix name="Overlap" label=""/>
+  <suffix name="TotalComposited" label=""/>
   <affected-histogram name="Blink.Compositing.LayerPromotionCount"/>
 </histogram_suffixes>
 
@@ -164807,8 +164807,8 @@
 </histogram_suffixes>
 
 <histogram_suffixes name="BluetoothPairedStates" separator=".">
-  <suffix name="NotPaired"/>
-  <suffix name="Paired"/>
+  <suffix name="NotPaired" label=""/>
+  <suffix name="Paired" label=""/>
   <affected-histogram
       name="Bluetooth.ChromeOS.DeviceSelectionDuration.Settings"/>
   <affected-histogram
@@ -164816,9 +164816,9 @@
 </histogram_suffixes>
 
 <histogram_suffixes name="BluetoothTransportTypes" separator=".">
-  <suffix name="BLE"/>
-  <suffix name="Classic"/>
-  <suffix name="Dual"/>
+  <suffix name="BLE" label=""/>
+  <suffix name="Classic" label=""/>
+  <suffix name="Dual" label=""/>
   <affected-histogram
       name="Bluetooth.ChromeOS.DeviceSelectionDuration.Settings.NotPaired"/>
   <affected-histogram
@@ -164829,16 +164829,16 @@
 </histogram_suffixes>
 
 <histogram_suffixes name="BluetoothUISurfaces" separator=".">
-  <suffix name="Settings"/>
-  <suffix name="SystemTray"/>
+  <suffix name="Settings" label=""/>
+  <suffix name="SystemTray" label=""/>
   <affected-histogram name="Bluetooth.ChromeOS.DeviceSelectionDuration"/>
   <affected-histogram
       name="Bluetooth.ChromeOS.UserInitiatedReconnectionAttempt.Result"/>
 </histogram_suffixes>
 
 <histogram_suffixes name="BrowserRunningMode" separator=".">
-  <suffix name="FullBrowser"/>
-  <suffix name="ReducedMode"/>
+  <suffix name="FullBrowser" label=""/>
+  <suffix name="ReducedMode" label=""/>
   <affected-histogram
       name="Memory.BackgroundTask.Browser.PrivateMemoryFootprint"/>
   <affected-histogram
@@ -165152,8 +165152,8 @@
 </histogram_suffixes>
 
 <histogram_suffixes name="CertificateTransparencyProtocol" separator=".">
-  <suffix name="QUIC"/>
-  <suffix name="SSL"/>
+  <suffix name="QUIC" label=""/>
+  <suffix name="SSL" label=""/>
   <affected-histogram
       name="Net.CertificateTransparency.ConnectionComplianceStatus2"/>
   <affected-histogram
@@ -165299,15 +165299,15 @@
 </histogram_suffixes>
 
 <histogram_suffixes name="ChromeOS.Camera.JpegProcessMethod" separator=".">
-  <suffix name="Hardware"/>
-  <suffix name="Software"/>
+  <suffix name="Hardware" label=""/>
+  <suffix name="Software" label=""/>
   <affected-histogram name="ChromeOS.Camera.Jpeg.Latency"/>
   <affected-histogram name="ChromeOS.Camera.Jpeg.Resolution"/>
 </histogram_suffixes>
 
 <histogram_suffixes name="ChromeOS.Camera.JpegProcessType" separator=".">
-  <suffix name="Decode"/>
-  <suffix name="Encode"/>
+  <suffix name="Decode" label=""/>
+  <suffix name="Encode" label=""/>
   <affected-histogram name="ChromeOS.Camera.Jpeg.Latency.Hardware"/>
   <affected-histogram name="ChromeOS.Camera.Jpeg.Latency.Software"/>
   <affected-histogram name="ChromeOS.Camera.Jpeg.Resolution.Hardware"/>
@@ -165330,9 +165330,9 @@
 </histogram_suffixes>
 
 <histogram_suffixes name="ChromeOS.MachineIdRegen.AgeSeconds" separator="_">
-  <suffix name="Network"/>
-  <suffix name="Periodic"/>
-  <suffix name="Unknown"/>
+  <suffix name="Network" label=""/>
+  <suffix name="Periodic" label=""/>
+  <suffix name="Unknown" label=""/>
   <affected-histogram name="ChromeOS.MachineIdRegen.AgeSeconds"/>
 </histogram_suffixes>
 
@@ -165609,8 +165609,8 @@
 
 <histogram_suffixes name="CompositorTimingHistoryProcess" separator="."
     ordering="prefix">
-  <suffix name="Browser"/>
-  <suffix name="Renderer"/>
+  <suffix name="Browser" label=""/>
+  <suffix name="Renderer" label=""/>
   <affected-histogram name="Scheduling.BeginImplFrameLatency2"/>
   <affected-histogram name="Scheduling.BeginMainFrameQueueDurationCritical2"/>
   <affected-histogram name="Scheduling.BeginMainFrameStartToCommitDuration2"/>
@@ -165626,8 +165626,8 @@
 
 <histogram_suffixes name="CompositorTimingHistoryProcess2" separator="."
     ordering="prefix">
-  <suffix name="Browser"/>
-  <suffix name="Renderer"/>
+  <suffix name="Browser" label=""/>
+  <suffix name="Renderer" label=""/>
   <affected-histogram name="Scheduling.ImageInvalidationUpdateDuration"/>
 </histogram_suffixes>
 
@@ -165638,8 +165638,8 @@
     an inefficient usage of UMA bandwidth. They have been replaced by new
     metrics of the same name with a &quot;2&quot; appended to them.
   </obsolete>
-  <suffix name="Browser"/>
-  <suffix name="Renderer"/>
+  <suffix name="Browser" label=""/>
+  <suffix name="Renderer" label=""/>
   <affected-histogram name="Scheduling.ActivateDuration"/>
   <affected-histogram name="Scheduling.BeginMainFrameIntervalCritical"/>
   <affected-histogram name="Scheduling.BeginMainFrameIntervalNotCritical"/>
@@ -165741,13 +165741,13 @@
 </histogram_suffixes>
 
 <histogram_suffixes name="ConnectionMigrationCause" separator=".">
-  <suffix name="OnMigrateBackToDefaultNetwork"/>
-  <suffix name="OnNetworkConnected"/>
-  <suffix name="OnNetworkDisconnected"/>
-  <suffix name="OnNetworkMadeDefault"/>
-  <suffix name="OnPathDegrading"/>
-  <suffix name="OnWriteError"/>
-  <suffix name="Unknown"/>
+  <suffix name="OnMigrateBackToDefaultNetwork" label=""/>
+  <suffix name="OnNetworkConnected" label=""/>
+  <suffix name="OnNetworkDisconnected" label=""/>
+  <suffix name="OnNetworkMadeDefault" label=""/>
+  <suffix name="OnPathDegrading" label=""/>
+  <suffix name="OnWriteError" label=""/>
+  <suffix name="Unknown" label=""/>
   <affected-histogram name="Net.QuicSession.ConnectionMigration"/>
   <affected-histogram name="Net.QuicSession.ConnectionMigrationProbeSuccess"/>
   <affected-histogram
@@ -165758,8 +165758,8 @@
   <obsolete>
     Deprecated 6/2019. No longer used.
   </obsolete>
-  <suffix name="Default"/>
-  <suffix name="Fallback"/>
+  <suffix name="Default" label=""/>
+  <suffix name="Fallback" label=""/>
   <affected-histogram name="ConnectivityDetector.Probe.HttpResponseCode"/>
   <affected-histogram name="ConnectivityDetector.Probe.Result"/>
 </histogram_suffixes>
@@ -165782,8 +165782,8 @@
 </histogram_suffixes>
 
 <histogram_suffixes name="ConnnectBackupJobs" separator="_">
-  <suffix name="ConnectBackupJobsDisabled"/>
-  <suffix name="ConnectBackupJobsEnabled"/>
+  <suffix name="ConnectBackupJobsDisabled" label=""/>
+  <suffix name="ConnectBackupJobsEnabled" label=""/>
   <affected-histogram name="Net.PreconnectUtilization"/>
   <affected-histogram name="Net.PreconnectUtilization2"/>
   <affected-histogram name="PLT.Abandoned"/>
@@ -166017,12 +166017,12 @@
 </histogram_suffixes>
 
 <histogram_suffixes name="ContextualSearchQuickActionCategory" separator=".">
-  <suffix name="Address"/>
-  <suffix name="Email"/>
-  <suffix name="Event"/>
-  <suffix name="None"/>
-  <suffix name="Phone"/>
-  <suffix name="Website"/>
+  <suffix name="Address" label=""/>
+  <suffix name="Email" label=""/>
+  <suffix name="Event" label=""/>
+  <suffix name="None" label=""/>
+  <suffix name="Phone" label=""/>
+  <suffix name="Website" label=""/>
   <affected-histogram name="Search.ContextualSearchQuickActions.Clicked"/>
   <affected-histogram
       name="Search.ContextualSearchQuickActions.IntentResolution"/>
@@ -166081,9 +166081,9 @@
 </histogram_suffixes>
 
 <histogram_suffixes name="CrosFirstRunStep" separator="">
-  <suffix name="AppList"/>
-  <suffix name="Help"/>
-  <suffix name="Tray"/>
+  <suffix name="AppList" label=""/>
+  <suffix name="Help" label=""/>
+  <suffix name="Tray" label=""/>
   <affected-histogram name="CrosFirstRun.TimeSpentOnStep"/>
 </histogram_suffixes>
 
@@ -166097,105 +166097,105 @@
 </histogram_suffixes>
 
 <histogram_suffixes name="CryptohomeAsyncDBusMethod" separator=".">
-  <suffix name="AsyncTpmAttestationCreateCertRequest"/>
-  <suffix name="AsyncTpmAttestationCreateEnrollRequest"/>
-  <suffix name="AsyncTpmAttestationEnroll"/>
-  <suffix name="AsyncTpmAttestationFinishCertRequest"/>
-  <suffix name="TpmAttestationRegisterKey"/>
-  <suffix name="TpmAttestationSignEnterpriseVaChallenge"/>
-  <suffix name="TpmAttestationSignSimpleChallenge"/>
+  <suffix name="AsyncTpmAttestationCreateCertRequest" label=""/>
+  <suffix name="AsyncTpmAttestationCreateEnrollRequest" label=""/>
+  <suffix name="AsyncTpmAttestationEnroll" label=""/>
+  <suffix name="AsyncTpmAttestationFinishCertRequest" label=""/>
+  <suffix name="TpmAttestationRegisterKey" label=""/>
+  <suffix name="TpmAttestationSignEnterpriseVaChallenge" label=""/>
+  <suffix name="TpmAttestationSignSimpleChallenge" label=""/>
   <affected-histogram name="Cryptohome.AsyncDBusRequest"/>
   <affected-histogram name="Cryptohome.AsyncDBusRequest.Inqueue"/>
 </histogram_suffixes>
 
 <histogram_suffixes name="CryptohomeClientDBusMethod" separator=".">
-  <suffix name="AddKeyEx"/>
-  <suffix name="AsyncDoesUsersExist"/>
-  <suffix name="AsyncMigrateKey"/>
-  <suffix name="AsyncMount"/>
-  <suffix name="AsyncMountGuest"/>
-  <suffix name="AsyncRemove"/>
-  <suffix name="AsyncRemoveTrackedSubdirectories"/>
-  <suffix name="AsyncTpmAttestationCreateCertRequest"/>
-  <suffix name="AsyncTpmAttestationCreateCertRequestByProfile"/>
-  <suffix name="AsyncTpmAttestationCreateEnrollRequest"/>
-  <suffix name="AsyncTpmAttestationCreateEnrollRequestNew"/>
-  <suffix name="AsyncTpmAttestationEnroll"/>
-  <suffix name="AsyncTpmAttestationEnrollNew"/>
-  <suffix name="AsyncTpmAttestationFinishCertRequest"/>
-  <suffix name="CheckKeyEx"/>
-  <suffix name="FinalizeBootLockbox"/>
-  <suffix name="FlushAndSignBootAttributes"/>
-  <suffix name="GetAccountDiskUsage"/>
-  <suffix name="GetBootAttribute"/>
-  <suffix name="GetCurrentSpaceForGid"/>
-  <suffix name="GetCurrentSpaceForUid"/>
-  <suffix name="GetEndorsementInfo"/>
-  <suffix name="GetFirmwareManagementParameters"/>
-  <suffix name="GetKeyDataEx"/>
-  <suffix name="GetLoginStatus"/>
-  <suffix name="GetSanitizedUsername"/>
-  <suffix name="GetStatusString"/>
-  <suffix name="GetSupportedKeyPolicies"/>
-  <suffix name="GetSystemSalt"/>
-  <suffix name="GetTpmStatus"/>
-  <suffix name="InstallAttributesCount"/>
-  <suffix name="InstallAttributesFinalize"/>
-  <suffix name="InstallAttributesGet"/>
-  <suffix name="InstallAttributesIsFirstInstall"/>
-  <suffix name="InstallAttributesIsInvalid"/>
-  <suffix name="InstallAttributesIsReady"/>
-  <suffix name="InstallAttributesIsSecure"/>
-  <suffix name="InstallAttributesSet"/>
-  <suffix name="IsMounted"/>
-  <suffix name="IsQuotaSupported"/>
-  <suffix name="MigrateKey"/>
-  <suffix name="MigrateKeyEx"/>
-  <suffix name="MigrateToDircrypto"/>
-  <suffix name="Mount"/>
-  <suffix name="MountEx"/>
-  <suffix name="MountGuest"/>
-  <suffix name="MountGuestEx"/>
-  <suffix name="NeedsDircryptoMigration"/>
-  <suffix name="Pkcs11GetTpmTokenInfo"/>
-  <suffix name="Pkcs11GetTpmTokenInfoForUser"/>
-  <suffix name="Pkcs11IsTpmTokenReady"/>
-  <suffix name="RemoveEx"/>
-  <suffix name="RemoveFirmwareManagementParameters"/>
-  <suffix name="RemoveKeyEx"/>
-  <suffix name="RemoveTrackedSubdirectories"/>
-  <suffix name="RenameCryptohome"/>
-  <suffix name="SetBootAttribute"/>
-  <suffix name="SetFirmwareManagementParameters"/>
-  <suffix name="SignBootLockbox"/>
-  <suffix name="TpmAttestationCreateCertRequest"/>
-  <suffix name="TpmAttestationCreateEnrollRequest"/>
-  <suffix name="TpmAttestationDeleteKeys"/>
-  <suffix name="TpmAttestationDoesKeyExist"/>
-  <suffix name="TpmAttestationEnroll"/>
-  <suffix name="TpmAttestationFinishCertRequest"/>
-  <suffix name="TpmAttestationGetCertificate"/>
-  <suffix name="TpmAttestationGetEnrollmentId"/>
-  <suffix name="TpmAttestationGetKeyPayload"/>
-  <suffix name="TpmAttestationGetPublicKey"/>
-  <suffix name="TpmAttestationRegisterKey"/>
-  <suffix name="TpmAttestationSetKeyPayload"/>
-  <suffix name="TpmAttestationSignEnterpriseChallenge"/>
-  <suffix name="TpmAttestationSignEnterpriseVaChallenge"/>
-  <suffix name="TpmAttestationSignSimpleChallenge"/>
-  <suffix name="TpmCanAttemptOwnership"/>
-  <suffix name="TpmClearStoredPassword"/>
-  <suffix name="TpmGetPassword"/>
-  <suffix name="TpmGetVersionStructured"/>
-  <suffix name="TpmIsAttestationEnrolled"/>
-  <suffix name="TpmIsAttestationPrepared"/>
-  <suffix name="TpmIsBeingOwned"/>
-  <suffix name="TpmIsEnabled"/>
-  <suffix name="TpmIsOwned"/>
-  <suffix name="TpmIsReady"/>
-  <suffix name="Unmount"/>
-  <suffix name="UpdateKeyEx"/>
-  <suffix name="VerifyBootLockbox"/>
+  <suffix name="AddKeyEx" label=""/>
+  <suffix name="AsyncDoesUsersExist" label=""/>
+  <suffix name="AsyncMigrateKey" label=""/>
+  <suffix name="AsyncMount" label=""/>
+  <suffix name="AsyncMountGuest" label=""/>
+  <suffix name="AsyncRemove" label=""/>
+  <suffix name="AsyncRemoveTrackedSubdirectories" label=""/>
+  <suffix name="AsyncTpmAttestationCreateCertRequest" label=""/>
+  <suffix name="AsyncTpmAttestationCreateCertRequestByProfile" label=""/>
+  <suffix name="AsyncTpmAttestationCreateEnrollRequest" label=""/>
+  <suffix name="AsyncTpmAttestationCreateEnrollRequestNew" label=""/>
+  <suffix name="AsyncTpmAttestationEnroll" label=""/>
+  <suffix name="AsyncTpmAttestationEnrollNew" label=""/>
+  <suffix name="AsyncTpmAttestationFinishCertRequest" label=""/>
+  <suffix name="CheckKeyEx" label=""/>
+  <suffix name="FinalizeBootLockbox" label=""/>
+  <suffix name="FlushAndSignBootAttributes" label=""/>
+  <suffix name="GetAccountDiskUsage" label=""/>
+  <suffix name="GetBootAttribute" label=""/>
+  <suffix name="GetCurrentSpaceForGid" label=""/>
+  <suffix name="GetCurrentSpaceForUid" label=""/>
+  <suffix name="GetEndorsementInfo" label=""/>
+  <suffix name="GetFirmwareManagementParameters" label=""/>
+  <suffix name="GetKeyDataEx" label=""/>
+  <suffix name="GetLoginStatus" label=""/>
+  <suffix name="GetSanitizedUsername" label=""/>
+  <suffix name="GetStatusString" label=""/>
+  <suffix name="GetSupportedKeyPolicies" label=""/>
+  <suffix name="GetSystemSalt" label=""/>
+  <suffix name="GetTpmStatus" label=""/>
+  <suffix name="InstallAttributesCount" label=""/>
+  <suffix name="InstallAttributesFinalize" label=""/>
+  <suffix name="InstallAttributesGet" label=""/>
+  <suffix name="InstallAttributesIsFirstInstall" label=""/>
+  <suffix name="InstallAttributesIsInvalid" label=""/>
+  <suffix name="InstallAttributesIsReady" label=""/>
+  <suffix name="InstallAttributesIsSecure" label=""/>
+  <suffix name="InstallAttributesSet" label=""/>
+  <suffix name="IsMounted" label=""/>
+  <suffix name="IsQuotaSupported" label=""/>
+  <suffix name="MigrateKey" label=""/>
+  <suffix name="MigrateKeyEx" label=""/>
+  <suffix name="MigrateToDircrypto" label=""/>
+  <suffix name="Mount" label=""/>
+  <suffix name="MountEx" label=""/>
+  <suffix name="MountGuest" label=""/>
+  <suffix name="MountGuestEx" label=""/>
+  <suffix name="NeedsDircryptoMigration" label=""/>
+  <suffix name="Pkcs11GetTpmTokenInfo" label=""/>
+  <suffix name="Pkcs11GetTpmTokenInfoForUser" label=""/>
+  <suffix name="Pkcs11IsTpmTokenReady" label=""/>
+  <suffix name="RemoveEx" label=""/>
+  <suffix name="RemoveFirmwareManagementParameters" label=""/>
+  <suffix name="RemoveKeyEx" label=""/>
+  <suffix name="RemoveTrackedSubdirectories" label=""/>
+  <suffix name="RenameCryptohome" label=""/>
+  <suffix name="SetBootAttribute" label=""/>
+  <suffix name="SetFirmwareManagementParameters" label=""/>
+  <suffix name="SignBootLockbox" label=""/>
+  <suffix name="TpmAttestationCreateCertRequest" label=""/>
+  <suffix name="TpmAttestationCreateEnrollRequest" label=""/>
+  <suffix name="TpmAttestationDeleteKeys" label=""/>
+  <suffix name="TpmAttestationDoesKeyExist" label=""/>
+  <suffix name="TpmAttestationEnroll" label=""/>
+  <suffix name="TpmAttestationFinishCertRequest" label=""/>
+  <suffix name="TpmAttestationGetCertificate" label=""/>
+  <suffix name="TpmAttestationGetEnrollmentId" label=""/>
+  <suffix name="TpmAttestationGetKeyPayload" label=""/>
+  <suffix name="TpmAttestationGetPublicKey" label=""/>
+  <suffix name="TpmAttestationRegisterKey" label=""/>
+  <suffix name="TpmAttestationSetKeyPayload" label=""/>
+  <suffix name="TpmAttestationSignEnterpriseChallenge" label=""/>
+  <suffix name="TpmAttestationSignEnterpriseVaChallenge" label=""/>
+  <suffix name="TpmAttestationSignSimpleChallenge" label=""/>
+  <suffix name="TpmCanAttemptOwnership" label=""/>
+  <suffix name="TpmClearStoredPassword" label=""/>
+  <suffix name="TpmGetPassword" label=""/>
+  <suffix name="TpmGetVersionStructured" label=""/>
+  <suffix name="TpmIsAttestationEnrolled" label=""/>
+  <suffix name="TpmIsAttestationPrepared" label=""/>
+  <suffix name="TpmIsBeingOwned" label=""/>
+  <suffix name="TpmIsEnabled" label=""/>
+  <suffix name="TpmIsOwned" label=""/>
+  <suffix name="TpmIsReady" label=""/>
+  <suffix name="Unmount" label=""/>
+  <suffix name="UpdateKeyEx" label=""/>
+  <suffix name="VerifyBootLockbox" label=""/>
   <affected-histogram name="CryptohomeClient"/>
 </histogram_suffixes>
 
@@ -166713,12 +166713,12 @@
 </histogram_suffixes>
 
 <histogram_suffixes name="DataUse.AppTabState.Dimensions" separator=".">
-  <suffix name="Downstream.AppBackground"/>
-  <suffix name="Downstream.AppForeground.TabBackground"/>
-  <suffix name="Downstream.AppForeground.TabForeground"/>
-  <suffix name="Upstream.AppBackground"/>
-  <suffix name="Upstream.AppForeground.TabBackground"/>
-  <suffix name="Upstream.AppForeground.TabForeground"/>
+  <suffix name="Downstream.AppBackground" label=""/>
+  <suffix name="Downstream.AppForeground.TabBackground" label=""/>
+  <suffix name="Downstream.AppForeground.TabForeground" label=""/>
+  <suffix name="Upstream.AppBackground" label=""/>
+  <suffix name="Upstream.AppForeground.TabBackground" label=""/>
+  <suffix name="Upstream.AppForeground.TabForeground" label=""/>
   <affected-histogram name="DataUse.AppTabState"/>
 </histogram_suffixes>
 
@@ -166732,18 +166732,18 @@
 </histogram_suffixes>
 
 <histogram_suffixes name="DataUse.Dimensions" separator=".">
-  <suffix name="Downstream.Background.Cellular"/>
-  <suffix name="Downstream.Background.NotCellular"/>
-  <suffix name="Downstream.Foreground.Cellular"/>
-  <suffix name="Downstream.Foreground.NotCellular"/>
-  <suffix name="Downstream.Unknown.Cellular"/>
-  <suffix name="Downstream.Unknown.NotCellular"/>
-  <suffix name="Upstream.Background.Cellular"/>
-  <suffix name="Upstream.Background.NotCellular"/>
-  <suffix name="Upstream.Foreground.Cellular"/>
-  <suffix name="Upstream.Foreground.NotCellular"/>
-  <suffix name="Upstream.Unknown.Cellular"/>
-  <suffix name="Upstream.Unknown.NotCellular"/>
+  <suffix name="Downstream.Background.Cellular" label=""/>
+  <suffix name="Downstream.Background.NotCellular" label=""/>
+  <suffix name="Downstream.Foreground.Cellular" label=""/>
+  <suffix name="Downstream.Foreground.NotCellular" label=""/>
+  <suffix name="Downstream.Unknown.Cellular" label=""/>
+  <suffix name="Downstream.Unknown.NotCellular" label=""/>
+  <suffix name="Upstream.Background.Cellular" label=""/>
+  <suffix name="Upstream.Background.NotCellular" label=""/>
+  <suffix name="Upstream.Foreground.Cellular" label=""/>
+  <suffix name="Upstream.Foreground.NotCellular" label=""/>
+  <suffix name="Upstream.Unknown.Cellular" label=""/>
+  <suffix name="Upstream.Unknown.NotCellular" label=""/>
   <affected-histogram name="DataUse.TrafficSize.System"/>
   <affected-histogram name="DataUse.TrafficSize.User"/>
 </histogram_suffixes>
@@ -166752,86 +166752,86 @@
   <obsolete>
     Replaced by version without network-type breakdown in June, 2018.
   </obsolete>
-  <suffix name="Downstream.Background.Cellular">
+  <suffix name="Downstream.Background.Cellular" label="">
     <obsolete>
       Replaced by KB version in October, 2017.
     </obsolete>
   </suffix>
-  <suffix name="Downstream.Background.CellularKB"/>
-  <suffix name="Downstream.Background.NotCellular">
+  <suffix name="Downstream.Background.CellularKB" label=""/>
+  <suffix name="Downstream.Background.NotCellular" label="">
     <obsolete>
       Replaced by KB version in October, 2017.
     </obsolete>
   </suffix>
-  <suffix name="Downstream.Background.NotCellularKB"/>
-  <suffix name="Downstream.Foreground.Cellular">
+  <suffix name="Downstream.Background.NotCellularKB" label=""/>
+  <suffix name="Downstream.Foreground.Cellular" label="">
     <obsolete>
       Replaced by KB version in October, 2017.
     </obsolete>
   </suffix>
-  <suffix name="Downstream.Foreground.CellularKB"/>
-  <suffix name="Downstream.Foreground.NotCellular">
+  <suffix name="Downstream.Foreground.CellularKB" label=""/>
+  <suffix name="Downstream.Foreground.NotCellular" label="">
     <obsolete>
       Replaced by KB version in October, 2017.
     </obsolete>
   </suffix>
-  <suffix name="Downstream.Foreground.NotCellularKB"/>
-  <suffix name="Downstream.Unknown.Cellular">
+  <suffix name="Downstream.Foreground.NotCellularKB" label=""/>
+  <suffix name="Downstream.Unknown.Cellular" label="">
     <obsolete>
       Replaced by KB version in October, 2017.
     </obsolete>
   </suffix>
-  <suffix name="Downstream.Unknown.CellularKB"/>
-  <suffix name="Downstream.Unknown.NotCellular">
+  <suffix name="Downstream.Unknown.CellularKB" label=""/>
+  <suffix name="Downstream.Unknown.NotCellular" label="">
     <obsolete>
       Replaced by KB version in October, 2017.
     </obsolete>
   </suffix>
-  <suffix name="Downstream.Unknown.NotCellularKB"/>
-  <suffix name="Upstream.Background.Cellular">
+  <suffix name="Downstream.Unknown.NotCellularKB" label=""/>
+  <suffix name="Upstream.Background.Cellular" label="">
     <obsolete>
       Replaced by KB version in October, 2017.
     </obsolete>
   </suffix>
-  <suffix name="Upstream.Background.CellularKB"/>
-  <suffix name="Upstream.Background.NotCellular">
+  <suffix name="Upstream.Background.CellularKB" label=""/>
+  <suffix name="Upstream.Background.NotCellular" label="">
     <obsolete>
       Replaced by KB version in October, 2017.
     </obsolete>
   </suffix>
-  <suffix name="Upstream.Background.NotCellularKB"/>
-  <suffix name="Upstream.Foreground.Cellular">
+  <suffix name="Upstream.Background.NotCellularKB" label=""/>
+  <suffix name="Upstream.Foreground.Cellular" label="">
     <obsolete>
       Replaced by KB version in October, 2017.
     </obsolete>
   </suffix>
-  <suffix name="Upstream.Foreground.CellularKB"/>
-  <suffix name="Upstream.Foreground.NotCellular">
+  <suffix name="Upstream.Foreground.CellularKB" label=""/>
+  <suffix name="Upstream.Foreground.NotCellular" label="">
     <obsolete>
       Replaced by KB version in October, 2017.
     </obsolete>
   </suffix>
-  <suffix name="Upstream.Foreground.NotCellularKB"/>
-  <suffix name="Upstream.Unknown.Cellular">
+  <suffix name="Upstream.Foreground.NotCellularKB" label=""/>
+  <suffix name="Upstream.Unknown.Cellular" label="">
     <obsolete>
       Replaced by KB version in October, 2017.
     </obsolete>
   </suffix>
-  <suffix name="Upstream.Unknown.CellularKB"/>
-  <suffix name="Upstream.Unknown.NotCellular">
+  <suffix name="Upstream.Unknown.CellularKB" label=""/>
+  <suffix name="Upstream.Unknown.NotCellular" label="">
     <obsolete>
       Replaced by KB version in October, 2017.
     </obsolete>
   </suffix>
-  <suffix name="Upstream.Unknown.NotCellularKB"/>
+  <suffix name="Upstream.Unknown.NotCellularKB" label=""/>
   <affected-histogram name="DataUse.MessageSize.AllServices"/>
 </histogram_suffixes>
 
 <histogram_suffixes name="DataUse.Dimensions.AllServicesKB" separator=".">
-  <suffix name="Downstream.Background"/>
-  <suffix name="Downstream.Foreground"/>
-  <suffix name="Upstream.Background"/>
-  <suffix name="Upstream.Foreground"/>
+  <suffix name="Downstream.Background" label=""/>
+  <suffix name="Downstream.Foreground" label=""/>
+  <suffix name="Upstream.Background" label=""/>
+  <suffix name="Upstream.Foreground" label=""/>
   <affected-histogram name="DataReductionProxy.LastWeekAggregateKB.Services"/>
   <affected-histogram name="DataReductionProxy.ThisWeekAggregateKB.Services"/>
   <affected-histogram name="DataUse.AllServicesKB"/>
@@ -166841,42 +166841,42 @@
   <obsolete>
     Deprecated Oct 2018
   </obsolete>
-  <suffix name="Autofill"/>
-  <suffix name="DomainReliability"/>
-  <suffix name="GAIA"/>
-  <suffix name="GCMDriver"/>
-  <suffix name="GoogleURLTracker"/>
-  <suffix name="ImageFetcherUntagged"/>
-  <suffix name="Invalidation"/>
-  <suffix name="LargeIconService"/>
-  <suffix name="MachineIntelligence"/>
-  <suffix name="NotTagged"/>
-  <suffix name="NTPSnippets">
+  <suffix name="Autofill" label=""/>
+  <suffix name="DomainReliability" label=""/>
+  <suffix name="GAIA" label=""/>
+  <suffix name="GCMDriver" label=""/>
+  <suffix name="GoogleURLTracker" label=""/>
+  <suffix name="ImageFetcherUntagged" label=""/>
+  <suffix name="Invalidation" label=""/>
+  <suffix name="LargeIconService" label=""/>
+  <suffix name="MachineIntelligence" label=""/>
+  <suffix name="NotTagged" label=""/>
+  <suffix name="NTPSnippets" label="">
     <obsolete>
       Deprecated March 2017
     </obsolete>
   </suffix>
-  <suffix name="NTPSnippetsSuggestions"/>
-  <suffix name="NTPSnippetsThumbnails"/>
-  <suffix name="Omnibox"/>
-  <suffix name="Policy"/>
-  <suffix name="ProfileDownloader"/>
-  <suffix name="Rappor"/>
-  <suffix name="SafeBrowsing"/>
-  <suffix name="SpellChecker"/>
-  <suffix name="Suggestions"/>
-  <suffix name="Sync"/>
-  <suffix name="Translate"/>
-  <suffix name="UMA"/>
-  <suffix name="UpdateClient"/>
-  <suffix name="Variations"/>
-  <suffix name="WebResourceService"/>
+  <suffix name="NTPSnippetsSuggestions" label=""/>
+  <suffix name="NTPSnippetsThumbnails" label=""/>
+  <suffix name="Omnibox" label=""/>
+  <suffix name="Policy" label=""/>
+  <suffix name="ProfileDownloader" label=""/>
+  <suffix name="Rappor" label=""/>
+  <suffix name="SafeBrowsing" label=""/>
+  <suffix name="SpellChecker" label=""/>
+  <suffix name="Suggestions" label=""/>
+  <suffix name="Sync" label=""/>
+  <suffix name="Translate" label=""/>
+  <suffix name="UMA" label=""/>
+  <suffix name="UpdateClient" label=""/>
+  <suffix name="Variations" label=""/>
+  <suffix name="WebResourceService" label=""/>
   <affected-histogram name="DataUse.MessageSize"/>
 </histogram_suffixes>
 
 <histogram_suffixes name="DataUse.TrafficSource" separator=".">
-  <suffix name="System"/>
-  <suffix name="User"/>
+  <suffix name="System" label=""/>
+  <suffix name="User" label=""/>
   <affected-histogram name="DataUse.BackgroundToDataRecievedPerByte"/>
   <affected-histogram name="DataUse.BackgroundToFirstDownstream"/>
 </histogram_suffixes>
@@ -166924,9 +166924,9 @@
   <obsolete>
     Deprecated as of 12/2013. Default pinned apps trial is finished.
   </obsolete>
-  <suffix name="Alternate"/>
-  <suffix name="Control"/>
-  <suffix name="Existing"/>
+  <suffix name="Alternate" label=""/>
+  <suffix name="Control" label=""/>
+  <suffix name="Existing" label=""/>
   <affected-histogram name="Cros.ClickOnShelf"/>
 </histogram_suffixes>
 
@@ -167204,10 +167204,10 @@
   <obsolete>
     Deprecated 11/2018 in issue 894963.
   </obsolete>
-  <suffix name="BookmarksFootNote"/>
-  <suffix name="BookmarksNewBubble"/>
-  <suffix name="HistoryPage"/>
-  <suffix name="SavePasswordsNewBubble"/>
+  <suffix name="BookmarksFootNote" label=""/>
+  <suffix name="BookmarksNewBubble" label=""/>
+  <suffix name="HistoryPage" label=""/>
+  <suffix name="SavePasswordsNewBubble" label=""/>
   <affected-histogram name="DesktopIOSPromotion.DismissalReason"/>
   <affected-histogram name="DesktopIOSPromotion.SMSToSigninTime"/>
 </histogram_suffixes>
@@ -167642,8 +167642,8 @@
 </histogram_suffixes>
 
 <histogram_suffixes name="DriveCommonTimings" separator=".">
-  <suffix name="FailTime"/>
-  <suffix name="SuccessTime"/>
+  <suffix name="FailTime" label=""/>
+  <suffix name="SuccessTime" label=""/>
   <affected-histogram name="DriveCommon.Lifecycle.MountTime"/>
   <affected-histogram name="DriveCommon.LocalSearch.OfflineSearchTime"/>
   <affected-histogram name="DriveCommon.LocalSearch.SharedSearchTime"/>
@@ -167653,8 +167653,8 @@
 </histogram_suffixes>
 
 <histogram_suffixes name="DualCertVerifierTrial" separator="_">
-  <suffix name="TrialPrimary"/>
-  <suffix name="TrialSecondary"/>
+  <suffix name="TrialPrimary" label=""/>
+  <suffix name="TrialSecondary" label=""/>
   <affected-histogram name="Net.CertVerifier_First_Job_Latency"/>
   <affected-histogram name="Net.CertVerifier_Job_Latency"/>
 </histogram_suffixes>
@@ -167713,17 +167713,17 @@
 
 <histogram_suffixes name="EngagementScoreBuckets" separator="_">
   <owner>calamity@chromium.org</owner>
-  <suffix name="0"/>
-  <suffix name="10"/>
-  <suffix name="20"/>
-  <suffix name="30"/>
-  <suffix name="40"/>
-  <suffix name="50"/>
-  <suffix name="60"/>
-  <suffix name="70"/>
-  <suffix name="80"/>
-  <suffix name="90"/>
-  <suffix name="100"/>
+  <suffix name="0" label=""/>
+  <suffix name="10" label=""/>
+  <suffix name="20" label=""/>
+  <suffix name="30" label=""/>
+  <suffix name="40" label=""/>
+  <suffix name="50" label=""/>
+  <suffix name="60" label=""/>
+  <suffix name="70" label=""/>
+  <suffix name="80" label=""/>
+  <suffix name="90" label=""/>
+  <suffix name="100" label=""/>
   <affected-histogram name="SiteEngagementService.EngagementScoreBucket"/>
 </histogram_suffixes>
 
@@ -167823,37 +167823,37 @@
 </histogram_suffixes>
 
 <histogram_suffixes name="EventLatencyOS" separator=".">
-  <suffix name="MOUSE_WHEEL"/>
-  <suffix name="TOUCH_MOVED"/>
-  <suffix name="TOUCH_PRESSED"/>
-  <suffix name="TOUCH_RELEASED"/>
+  <suffix name="MOUSE_WHEEL" label=""/>
+  <suffix name="TOUCH_MOVED" label=""/>
+  <suffix name="TOUCH_PRESSED" label=""/>
+  <suffix name="TOUCH_RELEASED" label=""/>
   <affected-histogram name="Event.Latency.OS"/>
 </histogram_suffixes>
 
 <histogram_suffixes name="ExitFunnels" separator=".">
-  <suffix name="BackgroundOff"/>
-  <suffix name="BackgroundOn"/>
-  <suffix name="BrowserExit"/>
-  <suffix name="EndSession"/>
-  <suffix name="ES_CloseApp"/>
-  <suffix name="ES_Critical"/>
-  <suffix name="ES_Logoff"/>
-  <suffix name="ES_Other"/>
-  <suffix name="HungBrowserTerminated"/>
-  <suffix name="KillProcess"/>
-  <suffix name="LastWindowClose"/>
-  <suffix name="MessageWindowHung"/>
-  <suffix name="MessageWindowNotFound"/>
-  <suffix name="MessageWindowVanished"/>
-  <suffix name="ProcessSingletonIsShuttingDown"/>
-  <suffix name="RendezvousToHungBrowser"/>
-  <suffix name="SessionEnding"/>
-  <suffix name="TraybarEndSession"/>
-  <suffix name="TraybarExit"/>
-  <suffix name="WatcherEndSession"/>
-  <suffix name="WatcherLogoff"/>
-  <suffix name="WatcherQueryEndSession"/>
-  <suffix name="WM_ENDSESSION"/>
+  <suffix name="BackgroundOff" label=""/>
+  <suffix name="BackgroundOn" label=""/>
+  <suffix name="BrowserExit" label=""/>
+  <suffix name="EndSession" label=""/>
+  <suffix name="ES_CloseApp" label=""/>
+  <suffix name="ES_Critical" label=""/>
+  <suffix name="ES_Logoff" label=""/>
+  <suffix name="ES_Other" label=""/>
+  <suffix name="HungBrowserTerminated" label=""/>
+  <suffix name="KillProcess" label=""/>
+  <suffix name="LastWindowClose" label=""/>
+  <suffix name="MessageWindowHung" label=""/>
+  <suffix name="MessageWindowNotFound" label=""/>
+  <suffix name="MessageWindowVanished" label=""/>
+  <suffix name="ProcessSingletonIsShuttingDown" label=""/>
+  <suffix name="RendezvousToHungBrowser" label=""/>
+  <suffix name="SessionEnding" label=""/>
+  <suffix name="TraybarEndSession" label=""/>
+  <suffix name="TraybarExit" label=""/>
+  <suffix name="WatcherEndSession" label=""/>
+  <suffix name="WatcherLogoff" label=""/>
+  <suffix name="WatcherQueryEndSession" label=""/>
+  <suffix name="WM_ENDSESSION" label=""/>
   <affected-histogram name="Stability.ExitFunnel"/>
 </histogram_suffixes>
 
@@ -168027,8 +168027,8 @@
 </histogram_suffixes>
 
 <histogram_suffixes name="FeedOrHostOlder" separator=".">
-  <suffix name="FeedIsOlder"/>
-  <suffix name="HostIsOlder"/>
+  <suffix name="FeedIsOlder" label=""/>
+  <suffix name="HostIsOlder" label=""/>
   <affected-histogram
       name="ContentSuggestions.Feed.Scheduler.ContentAgeDifference"/>
 </histogram_suffixes>
@@ -168221,8 +168221,8 @@
 </histogram_suffixes>
 
 <histogram_suffixes name="FileOperations" separator=".">
-  <suffix name="DeleteFile.NonRecursive"/>
-  <suffix name="DeleteFile.Recursive"/>
+  <suffix name="DeleteFile.NonRecursive" label=""/>
+  <suffix name="DeleteFile.Recursive" label=""/>
   <affected-histogram name="Windows.FilesystemError"/>
   <affected-histogram name="Windows.PostOperationState"/>
 </histogram_suffixes>
@@ -168942,8 +168942,8 @@
 </histogram_suffixes>
 
 <histogram_suffixes name="ImportantFileWriterSuffix" separator=".">
-  <suffix name="BookmarkStorage"/>
-  <suffix name="FeedbackReport"/>
+  <suffix name="BookmarkStorage" label=""/>
+  <suffix name="FeedbackReport" label=""/>
   <affected-histogram name="ImportantFile.FileCreateError"/>
   <affected-histogram name="ImportantFile.FileDeleteError"/>
   <affected-histogram name="ImportantFile.FileOpenError"/>
@@ -169114,8 +169114,8 @@
 </histogram_suffixes>
 
 <histogram_suffixes name="IOMode" separator=".">
-  <suffix name="Asynchronous"/>
-  <suffix name="Synchronous"/>
+  <suffix name="Asynchronous" label=""/>
+  <suffix name="Synchronous" label=""/>
   <affected-histogram name="Net.QuicSession.PacketWriteTime"/>
 </histogram_suffixes>
 
@@ -169127,10 +169127,10 @@
 </histogram_suffixes>
 
 <histogram_suffixes name="IOSProductTourScreens" separator="">
-  <suffix name="Incognito"/>
-  <suffix name="Sync"/>
-  <suffix name="Unknown"/>
-  <suffix name="VoiceSearch"/>
+  <suffix name="Incognito" label=""/>
+  <suffix name="Sync" label=""/>
+  <suffix name="Unknown" label=""/>
+  <suffix name="VoiceSearch" label=""/>
   <affected-histogram name="ProductTour.IOSScreens"/>
 </histogram_suffixes>
 
@@ -169161,14 +169161,14 @@
   </suffix>
   <suffix name="IPH_ChromeHomePullToRefresh"
       label="In product help for Chrome Home shown after a pull-to-refresh."/>
-  <suffix name="IPH_ContextualSearch">
+  <suffix name="IPH_ContextualSearch" label="">
     <obsolete>
       Replaced with IPH_ContextualSearchWebSearch.
     </obsolete>
   </suffix>
   <suffix name="IPH_ContextualSearchOptIn"
       label="In product help for opting-in for contextual search."/>
-  <suffix name="IPH_ContextualSearchPanel">
+  <suffix name="IPH_ContextualSearchPanel" label="">
     <obsolete>
       Replaced with IPH_ContextualSearchPromotePanelOpen.
     </obsolete>
@@ -169177,7 +169177,7 @@
       label="In product help for opening the contextual search panel."/>
   <suffix name="IPH_ContextualSearchPromoteTap"
       label="In product help for tap trigger for contextual search."/>
-  <suffix name="IPH_ContextualSearchTap">
+  <suffix name="IPH_ContextualSearchTap" label="">
     <obsolete>
       Replaced with IPH_ContextualSearchPromoteTap.
     </obsolete>
@@ -169264,8 +169264,8 @@
 </histogram_suffixes>
 
 <histogram_suffixes name="IPProtocolType" separator="_">
-  <suffix name="TCP"/>
-  <suffix name="UDP"/>
+  <suffix name="TCP" label=""/>
+  <suffix name="UDP" label=""/>
   <affected-histogram name="WebRTC.PeerConnection.CandidatePairType"/>
   <affected-histogram name="WebRTC.SystemMaxConsecutiveBytesDelayed"/>
   <affected-histogram name="WebRTC.SystemPercentPacketsDelayed"/>
@@ -169328,8 +169328,8 @@
 </histogram_suffixes>
 
 <histogram_suffixes name="JSDialogs.UserGestureSinceLoad" separator=".">
-  <suffix name="NoUserGestureSinceLoad"/>
-  <suffix name="UserGestureSinceLoad"/>
+  <suffix name="NoUserGestureSinceLoad" label=""/>
+  <suffix name="UserGestureSinceLoad" label=""/>
   <affected-histogram name="JSDialogs.CharacterCount"/>
 </histogram_suffixes>
 
@@ -169392,22 +169392,22 @@
 </histogram_suffixes>
 
 <histogram_suffixes name="LECredentialOps" separator=".">
-  <suffix name="Check"/>
-  <suffix name="Insert"/>
-  <suffix name="Remove"/>
-  <suffix name="Reset"/>
-  <suffix name="ResetTree"/>
-  <suffix name="Sync"/>
-  <suffix name="SyncOutcome"/>
+  <suffix name="Check" label=""/>
+  <suffix name="Insert" label=""/>
+  <suffix name="Remove" label=""/>
+  <suffix name="Reset" label=""/>
+  <suffix name="ResetTree" label=""/>
+  <suffix name="Sync" label=""/>
+  <suffix name="SyncOutcome" label=""/>
   <affected-histogram name="Cryptohome.LECredential"/>
 </histogram_suffixes>
 
 <histogram_suffixes name="LECredentialOpsActions" separator=".">
-  <suffix name="Backend"/>
-  <suffix name="BackendGetLog"/>
-  <suffix name="BackendReplayLog"/>
-  <suffix name="LoadFromDisk"/>
-  <suffix name="SaveToDisk"/>
+  <suffix name="Backend" label=""/>
+  <suffix name="BackendGetLog" label=""/>
+  <suffix name="BackendReplayLog" label=""/>
+  <suffix name="LoadFromDisk" label=""/>
+  <suffix name="SaveToDisk" label=""/>
   <affected-histogram name="Cryptohome.LECredential.Check"/>
   <affected-histogram name="Cryptohome.LECredential.Insert"/>
   <affected-histogram name="Cryptohome.LECredential.Remove"/>
@@ -169771,11 +169771,11 @@
 </histogram_suffixes>
 
 <histogram_suffixes name="LockScreenAppDataItemOperation" separator=".">
-  <suffix name="DeleteItem"/>
-  <suffix name="GetRegisteredItems"/>
-  <suffix name="ReadItem"/>
-  <suffix name="RegisterItem"/>
-  <suffix name="WriteItem"/>
+  <suffix name="DeleteItem" label=""/>
+  <suffix name="GetRegisteredItems" label=""/>
+  <suffix name="ReadItem" label=""/>
+  <suffix name="RegisterItem" label=""/>
+  <suffix name="WriteItem" label=""/>
   <affected-histogram
       name="Apps.LockScreen.DataItemStorage.FailedOperationDuration"/>
   <affected-histogram name="Apps.LockScreen.DataItemStorage.OperationDuration"/>
@@ -169850,9 +169850,9 @@
 
 <histogram_suffixes name="MachineLearningServiceRequests" separator="."
     ordering="prefix">
-  <suffix base="true" name="CreateGraphExecutorResult"/>
-  <suffix base="true" name="ExecuteResult"/>
-  <suffix base="true" name="LoadModelResult"/>
+  <suffix base="true" name="CreateGraphExecutorResult" label=""/>
+  <suffix base="true" name="ExecuteResult" label=""/>
+  <suffix base="true" name="LoadModelResult" label=""/>
   <affected-histogram name="MachineLearningService.CpuTimeMicrosec"/>
   <affected-histogram name="MachineLearningService.ElapsedTimeMicrosec"/>
   <affected-histogram name="MachineLearningService.PrivateMemoryDeltaKb">
@@ -169875,13 +169875,13 @@
 </histogram_suffixes>
 
 <histogram_suffixes name="ManifestProperties" separator=".">
-  <suffix name="display"/>
-  <suffix name="gcm_sender_id"/>
-  <suffix name="icons"/>
-  <suffix name="name"/>
-  <suffix name="orientation"/>
-  <suffix name="short_name"/>
-  <suffix name="start_url"/>
+  <suffix name="display" label=""/>
+  <suffix name="gcm_sender_id" label=""/>
+  <suffix name="icons" label=""/>
+  <suffix name="name" label=""/>
+  <suffix name="orientation" label=""/>
+  <suffix name="short_name" label=""/>
+  <suffix name="start_url" label=""/>
   <affected-histogram name="Manifest.HasProperty"/>
 </histogram_suffixes>
 
@@ -169996,10 +169996,10 @@
   <obsolete>
     Removed from code as of 07/2019.
   </obsolete>
-  <suffix name="FullscreenLandscape"/>
-  <suffix name="FullscreenPortrait"/>
-  <suffix name="InlineLandscape"/>
-  <suffix name="InlinePortrait"/>
+  <suffix name="FullscreenLandscape" label=""/>
+  <suffix name="FullscreenPortrait" label=""/>
+  <suffix name="InlineLandscape" label=""/>
+  <suffix name="InlinePortrait" label=""/>
   <affected-histogram name="Media.Timeline.Width"/>
 </histogram_suffixes>
 
@@ -170104,12 +170104,12 @@
 </histogram_suffixes>
 
 <histogram_suffixes name="MediaTimelineWidths" separator=".">
-  <suffix name="32_47"/>
-  <suffix name="48_79"/>
-  <suffix name="80_127"/>
-  <suffix name="128_255"/>
-  <suffix name="256_511"/>
-  <suffix name="512_inf"/>
+  <suffix name="32_47" label=""/>
+  <suffix name="48_79" label=""/>
+  <suffix name="80_127" label=""/>
+  <suffix name="128_255" label=""/>
+  <suffix name="256_511" label=""/>
+  <suffix name="512_inf" label=""/>
   <affected-histogram name="Media.Timeline.DragGestureDuration"/>
   <affected-histogram name="Media.Timeline.DragPercent"/>
   <affected-histogram name="Media.Timeline.DragSumAbsTimeDelta"/>
@@ -170264,10 +170264,10 @@
 </histogram_suffixes>
 
 <histogram_suffixes name="MediaWMPIMemoryUsage" separator=".">
-  <suffix name="Audio"/>
-  <suffix name="DataSource"/>
-  <suffix name="Demuxer"/>
-  <suffix name="Video"/>
+  <suffix name="Audio" label=""/>
+  <suffix name="DataSource" label=""/>
+  <suffix name="Demuxer" label=""/>
+  <suffix name="Video" label=""/>
   <affected-histogram name="Media.WebMediaPlayerImpl.Memory"/>
 </histogram_suffixes>
 
@@ -170298,12 +170298,12 @@
 </histogram_suffixes>
 
 <histogram_suffixes name="MemoryStateTransition" separator=".">
-  <suffix name="NormalToSuspended"/>
-  <suffix name="NormalToThrottled"/>
-  <suffix name="SuspendedToNormal"/>
-  <suffix name="SuspendedToThrottled"/>
-  <suffix name="ThrottledToNormal"/>
-  <suffix name="ThrottledToSuspended"/>
+  <suffix name="NormalToSuspended" label=""/>
+  <suffix name="NormalToThrottled" label=""/>
+  <suffix name="SuspendedToNormal" label=""/>
+  <suffix name="SuspendedToThrottled" label=""/>
+  <suffix name="ThrottledToNormal" label=""/>
+  <suffix name="ThrottledToSuspended" label=""/>
   <affected-histogram name="Memory.Coordinator.StateDuration"/>
   <affected-histogram name="Memory.Coordinator.TotalPrivate"/>
 </histogram_suffixes>
@@ -170322,8 +170322,8 @@
 </histogram_suffixes>
 
 <histogram_suffixes name="MixedContentDownloadDownloadSecurity" separator=".">
-  <suffix name="DownloadInsecure"/>
-  <suffix name="DownloadSecure"/>
+  <suffix name="DownloadInsecure" label=""/>
+  <suffix name="DownloadSecure" label=""/>
   <affected-histogram
       name="Download.InsecureBlocking.Extensions.InitiatorInsecure"/>
   <affected-histogram
@@ -170333,23 +170333,23 @@
 </histogram_suffixes>
 
 <histogram_suffixes name="MixedContentDownloadInitiatorSecurity" separator=".">
-  <suffix base="true" name="InitiatorInsecure"/>
-  <suffix base="true" name="InitiatorSecure"/>
-  <suffix base="true" name="InitiatorUnknown"/>
+  <suffix base="true" name="InitiatorInsecure" label=""/>
+  <suffix base="true" name="InitiatorSecure" label=""/>
+  <suffix base="true" name="InitiatorUnknown" label=""/>
   <affected-histogram name="Download.InsecureBlocking.Extensions"/>
 </histogram_suffixes>
 
 <histogram_suffixes name="MixedContentDownloadMimeSecurity" separator=".">
-  <suffix name="Insecure"/>
-  <suffix name="Other"/>
-  <suffix name="Secure"/>
+  <suffix name="Insecure" label=""/>
+  <suffix name="Other" label=""/>
+  <suffix name="Secure" label=""/>
   <affected-histogram name="Download.InsecureBlocking.Verification.Item"/>
   <affected-histogram name="Download.InsecureBlocking.Verification.Manager"/>
 </histogram_suffixes>
 
 <histogram_suffixes name="MixedContentDownloadMimeSource" separator=".">
-  <suffix base="true" name="Item"/>
-  <suffix base="true" name="Manager"/>
+  <suffix base="true" name="Item" label=""/>
+  <suffix base="true" name="Manager" label=""/>
   <affected-histogram name="Download.InsecureBlocking.Verification"/>
 </histogram_suffixes>
 
@@ -170369,27 +170369,27 @@
 </histogram_suffixes>
 
 <histogram_suffixes name="Mobile.Messages.Password.Type" separator=".">
-  <suffix name="InfobarTypePasswordSave"/>
-  <suffix name="InfobarTypePasswordUpdate"/>
+  <suffix name="InfobarTypePasswordSave" label=""/>
+  <suffix name="InfobarTypePasswordUpdate" label=""/>
   <affected-histogram name="Mobile.Messages.Passwords.Modal.Dismiss"/>
   <affected-histogram name="Mobile.Messages.Passwords.Modal.Event"/>
   <affected-histogram name="Mobile.Messages.Passwords.Modal.Present"/>
 </histogram_suffixes>
 
 <histogram_suffixes name="Mobile.Messages.Type" separator=".">
-  <suffix name="InfobarTypeConfirm"/>
-  <suffix name="InfobarTypePasswordSave"/>
-  <suffix name="InfobarTypePasswordUpdate"/>
+  <suffix name="InfobarTypeConfirm" label=""/>
+  <suffix name="InfobarTypePasswordSave" label=""/>
+  <suffix name="InfobarTypePasswordUpdate" label=""/>
   <affected-histogram name="Mobile.Messages.Banner.Dismiss"/>
   <affected-histogram name="Mobile.Messages.Banner.Event"/>
   <affected-histogram name="Mobile.Messages.Modal.Event"/>
 </histogram_suffixes>
 
 <histogram_suffixes name="MobileDownloadBytesDownloadedTypes" separator=".">
-  <suffix name="ChromeNetworkStack.Failure"/>
-  <suffix name="ChromeNetworkStack.Success"/>
-  <suffix name="DownloadManager.Failure"/>
-  <suffix name="DownloadManager.Success"/>
+  <suffix name="ChromeNetworkStack.Failure" label=""/>
+  <suffix name="ChromeNetworkStack.Success" label=""/>
+  <suffix name="DownloadManager.Failure" label=""/>
+  <suffix name="DownloadManager.Success" label=""/>
   <affected-histogram name="MobileDownload.BytesDownloaded"/>
 </histogram_suffixes>
 
@@ -170401,25 +170401,25 @@
 </histogram_suffixes>
 
 <histogram_suffixes name="MobileDownloadDownloadTimeTypes" separator=".">
-  <suffix name="ChromeNetworkStack.Cancel"/>
-  <suffix name="ChromeNetworkStack.Failure"/>
-  <suffix name="ChromeNetworkStack.Success"/>
-  <suffix name="DownloadManager.Failure"/>
-  <suffix name="DownloadManager.Success"/>
+  <suffix name="ChromeNetworkStack.Cancel" label=""/>
+  <suffix name="ChromeNetworkStack.Failure" label=""/>
+  <suffix name="ChromeNetworkStack.Success" label=""/>
+  <suffix name="DownloadManager.Failure" label=""/>
+  <suffix name="DownloadManager.Success" label=""/>
   <affected-histogram name="MobileDownload.DownloadTime"/>
 </histogram_suffixes>
 
 <histogram_suffixes name="MobileDownloadInterruptionsCountTypes" separator=".">
-  <suffix name="ChromeNetworkStack.Cancel"/>
-  <suffix name="ChromeNetworkStack.Failure"/>
-  <suffix name="ChromeNetworkStack.Success"/>
+  <suffix name="ChromeNetworkStack.Cancel" label=""/>
+  <suffix name="ChromeNetworkStack.Failure" label=""/>
+  <suffix name="ChromeNetworkStack.Success" label=""/>
   <affected-histogram name="MobileDownload.InterruptionsCount"/>
 </histogram_suffixes>
 
 <histogram_suffixes name="MobileDownloadResumptionsCountTypes" separator=".">
-  <suffix name="Automatic"/>
-  <suffix name="Manual"/>
-  <suffix name="Total"/>
+  <suffix name="Automatic" label=""/>
+  <suffix name="Manual" label=""/>
+  <suffix name="Total" label=""/>
   <affected-histogram name="MobileDownload.ResumptionsCount"/>
 </histogram_suffixes>
 
@@ -170474,16 +170474,16 @@
 </histogram_suffixes>
 
 <histogram_suffixes name="NativeFileSystemAPIChooserType" separator=".">
-  <suffix name="OpenDirectory"/>
-  <suffix name="OpenFile"/>
-  <suffix name="OpenMultipleFiles"/>
-  <suffix name="SaveFile"/>
+  <suffix name="OpenDirectory" label=""/>
+  <suffix name="OpenFile" label=""/>
+  <suffix name="OpenMultipleFiles" label=""/>
+  <suffix name="SaveFile" label=""/>
   <affected-histogram name="NativeFileSystemAPI.FileChooserResult"/>
 </histogram_suffixes>
 
 <histogram_suffixes name="NativeFileSystemAPIHandleType" separator=".">
-  <suffix name="Directory"/>
-  <suffix name="File"/>
+  <suffix name="Directory" label=""/>
+  <suffix name="File" label=""/>
   <affected-histogram name="NativeFileSystemAPI.WritePermissionRequestOutcome"/>
 </histogram_suffixes>
 
@@ -170499,10 +170499,10 @@
 </histogram_suffixes>
 
 <histogram_suffixes name="NatType" separator=".">
-  <suffix name="NoNAT"/>
-  <suffix name="NonSymNAT"/>
-  <suffix name="SymNAT"/>
-  <suffix name="UnknownNAT"/>
+  <suffix name="NoNAT" label=""/>
+  <suffix name="NonSymNAT" label=""/>
+  <suffix name="SymNAT" label=""/>
+  <suffix name="UnknownNAT" label=""/>
   <affected-histogram name="WebRTC.Stun.BatchSuccessPercent"/>
   <affected-histogram name="WebRTC.Stun.ResponseLatency"/>
   <affected-histogram name="WebRTC.Stun.SuccessPercent"/>
@@ -171986,9 +171986,9 @@
 </histogram_suffixes>
 
 <histogram_suffixes name="NetHttpContentLengthType" separator=".">
-  <suffix name="Http"/>
-  <suffix name="Https"/>
-  <suffix name="Video"/>
+  <suffix name="Http" label=""/>
+  <suffix name="Https" label=""/>
+  <suffix name="Video" label=""/>
   <affected-histogram name="Net.HttpContentLength"/>
   <affected-histogram name="Net.HttpContentLengthV2"/>
   <affected-histogram name="Net.HttpOriginalContentLength"/>
@@ -172191,7 +172191,7 @@
 
 <histogram_suffixes name="NewTabPageProviders" separator=".">
   <suffix name="client" label="Suggestions coming from the client."/>
-  <suffix name="client0">
+  <suffix name="client0" label="">
     <obsolete>
       Hasn't been used for a while, as of 2016-07.
     </obsolete>
@@ -172212,27 +172212,27 @@
     </obsolete>
   </suffix>
   <suffix name="server" label="Suggestions coming from the server."/>
-  <suffix name="server0">
+  <suffix name="server0" label="">
     <obsolete>
       Hasn't been used for a while, as of 2016-07.
     </obsolete>
   </suffix>
-  <suffix name="server8">
+  <suffix name="server8" label="">
     <obsolete>
       Not used anymore as of 2016-07.
     </obsolete>
   </suffix>
-  <suffix name="server9">
+  <suffix name="server9" label="">
     <obsolete>
       Has never been used.
     </obsolete>
   </suffix>
-  <suffix name="server10">
+  <suffix name="server10" label="">
     <obsolete>
       Has never been used.
     </obsolete>
   </suffix>
-  <suffix name="server11">
+  <suffix name="server11" label="">
     <obsolete>
       Has never been used.
     </obsolete>
@@ -172310,10 +172310,10 @@
   <obsolete>
     Deprecated in June 2019.
   </obsolete>
-  <suffix name="ActionIcon"/>
-  <suffix name="Badge"/>
-  <suffix name="Icon"/>
-  <suffix name="Image"/>
+  <suffix name="ActionIcon" label=""/>
+  <suffix name="Badge" label=""/>
+  <suffix name="Icon" label=""/>
+  <suffix name="Image" label=""/>
   <affected-histogram name="Notifications.LoadFailTime"/>
   <affected-histogram name="Notifications.LoadFileSize"/>
   <affected-histogram name="Notifications.LoadFinishTime"/>
@@ -172321,9 +172321,9 @@
 </histogram_suffixes>
 
 <histogram_suffixes name="NotificationSchedulerClientType" separator=".">
-  <suffix name="__Test__"/>
-  <suffix name="Unknown"/>
-  <suffix name="WebUI"/>
+  <suffix name="__Test__" label=""/>
+  <suffix name="Unknown" label=""/>
+  <suffix name="WebUI" label=""/>
   <affected-histogram name="Notifications.Scheduler.IhnrActionButtonEvent"/>
   <affected-histogram name="Notifications.Scheduler.Impression.Count"/>
   <affected-histogram
@@ -172876,43 +172876,43 @@
 </histogram_suffixes>
 
 <histogram_suffixes name="OmniboxProviderTime" separator=".">
-  <suffix name="Bookmark"/>
-  <suffix name="Builtin"/>
-  <suffix name="Contact"/>
-  <suffix name="ExtensionApp"/>
-  <suffix name="HistoryContents"/>
-  <suffix name="HistoryQuick"/>
-  <suffix name="HistoryURL"/>
-  <suffix name="Keyword"/>
-  <suffix name="Search"/>
-  <suffix name="Shortcuts"/>
-  <suffix name="ZeroSuggest"/>
+  <suffix name="Bookmark" label=""/>
+  <suffix name="Builtin" label=""/>
+  <suffix name="Contact" label=""/>
+  <suffix name="ExtensionApp" label=""/>
+  <suffix name="HistoryContents" label=""/>
+  <suffix name="HistoryQuick" label=""/>
+  <suffix name="HistoryURL" label=""/>
+  <suffix name="Keyword" label=""/>
+  <suffix name="Search" label=""/>
+  <suffix name="Shortcuts" label=""/>
+  <suffix name="ZeroSuggest" label=""/>
   <affected-histogram name="Omnibox.ProviderTime"/>
   <affected-histogram name="Omnibox.ProviderTime2"/>
 </histogram_suffixes>
 
 <histogram_suffixes name="OobeScreenName" separator=".">
-  <suffix name="App-downloading"/>
-  <suffix name="Arc_tos"/>
-  <suffix name="Assistant-optin-flow"/>
-  <suffix name="Auto-enrollment-check"/>
-  <suffix name="Demo-preferences"/>
-  <suffix name="Discover"/>
-  <suffix name="Enroll"/>
-  <suffix name="Eula"/>
-  <suffix name="Fingerprint-setup"/>
-  <suffix name="Hid-detection"/>
-  <suffix name="Image"/>
-  <suffix name="Marketing-opt-in"/>
-  <suffix name="Multidevice-setup"/>
-  <suffix name="Network"/>
-  <suffix name="Network-selection"/>
-  <suffix name="Recommend-apps"/>
-  <suffix name="Reset"/>
-  <suffix name="Sync-consent"/>
-  <suffix name="Tos"/>
-  <suffix name="Update"/>
-  <suffix name="Wrong-hwid"/>
+  <suffix name="App-downloading" label=""/>
+  <suffix name="Arc_tos" label=""/>
+  <suffix name="Assistant-optin-flow" label=""/>
+  <suffix name="Auto-enrollment-check" label=""/>
+  <suffix name="Demo-preferences" label=""/>
+  <suffix name="Discover" label=""/>
+  <suffix name="Enroll" label=""/>
+  <suffix name="Eula" label=""/>
+  <suffix name="Fingerprint-setup" label=""/>
+  <suffix name="Hid-detection" label=""/>
+  <suffix name="Image" label=""/>
+  <suffix name="Marketing-opt-in" label=""/>
+  <suffix name="Multidevice-setup" label=""/>
+  <suffix name="Network" label=""/>
+  <suffix name="Network-selection" label=""/>
+  <suffix name="Recommend-apps" label=""/>
+  <suffix name="Reset" label=""/>
+  <suffix name="Sync-consent" label=""/>
+  <suffix name="Tos" label=""/>
+  <suffix name="Update" label=""/>
+  <suffix name="Wrong-hwid" label=""/>
   <affected-histogram name="OOBE.StepCompletionTime"/>
 </histogram_suffixes>
 
@@ -172944,11 +172944,11 @@
 </histogram_suffixes>
 
 <histogram_suffixes name="OtherActivityProcesses" separator=".">
-  <suffix name="gpu-process"/>
-  <suffix name="ppapi"/>
-  <suffix name="renderer"/>
-  <suffix name="setup"/>
-  <suffix name="utility"/>
+  <suffix name="gpu-process" label=""/>
+  <suffix name="ppapi" label=""/>
+  <suffix name="renderer" label=""/>
+  <suffix name="setup" label=""/>
+  <suffix name="utility" label=""/>
   <affected-histogram name="UMA.Histograms.Activity"/>
 </histogram_suffixes>
 
@@ -173082,11 +173082,11 @@
 </histogram_suffixes>
 
 <histogram_suffixes name="PageLoadEventConditions" separator=".">
-  <suffix name="AfterCommit.BeforePaint"/>
-  <suffix base="true" name="AfterPaint.Before1sDelayedInteraction"/>
-  <suffix base="true" name="AfterPaint.BeforeInteraction"/>
-  <suffix name="BeforeCommit"/>
-  <suffix name="DuringParse"/>
+  <suffix name="AfterCommit.BeforePaint" label=""/>
+  <suffix base="true" name="AfterPaint.Before1sDelayedInteraction" label=""/>
+  <suffix base="true" name="AfterPaint.BeforeInteraction" label=""/>
+  <suffix name="BeforeCommit" label=""/>
+  <suffix name="DuringParse" label=""/>
   <affected-histogram name="PageLoad.AbortTiming.Background"/>
   <affected-histogram name="PageLoad.AbortTiming.ClientRedirect"/>
   <affected-histogram name="PageLoad.AbortTiming.Close"/>
@@ -173990,7 +173990,7 @@
              process"/>
   <suffix name="UserGesture"
       label="(experimental) Page load that has a user gesture"/>
-  <suffix name="UserInputEvent">
+  <suffix name="UserInputEvent" label="">
     <obsolete>
       Deprecated in favor of UserGesture.
     </obsolete>
@@ -174113,8 +174113,8 @@
 </histogram_suffixes>
 
 <histogram_suffixes name="PasswordCustomPassphrase" separator=".">
-  <suffix name="WithCustomPassphrase"/>
-  <suffix name="WithoutCustomPassphrase"/>
+  <suffix name="WithCustomPassphrase" label=""/>
+  <suffix name="WithoutCustomPassphrase" label=""/>
   <affected-histogram name="PasswordManager.AccountsPerSite"/>
   <affected-histogram name="PasswordManager.AccountsPerSite.AutoGenerated"/>
   <affected-histogram name="PasswordManager.AccountsPerSite.UserCreated"/>
@@ -174133,9 +174133,9 @@
 </histogram_suffixes>
 
 <histogram_suffixes name="PasswordGenerated" separator=".">
-  <suffix base="true" name="AutoGenerated"/>
-  <suffix base="true" name="Overall"/>
-  <suffix base="true" name="UserCreated"/>
+  <suffix base="true" name="AutoGenerated" label=""/>
+  <suffix base="true" name="Overall" label=""/>
+  <suffix base="true" name="UserCreated" label=""/>
   <affected-histogram name="PasswordManager.AccountsPerSite"/>
   <affected-histogram name="PasswordManager.TimesPasswordUsed"/>
   <affected-histogram name="PasswordManager.TotalAccounts"/>
@@ -174143,8 +174143,8 @@
 </histogram_suffixes>
 
 <histogram_suffixes name="PasswordGenerationType" separator=".">
-  <suffix name="Automatic"/>
-  <suffix name="Manual"/>
+  <suffix name="Automatic" label=""/>
+  <suffix name="Manual" label=""/>
   <affected-histogram name="KeyboardAccessory.GenerationDialogChoice"/>
 </histogram_suffixes>
 
@@ -174407,15 +174407,15 @@
 </histogram_suffixes>
 
 <histogram_suffixes name="PerformanceMonitor" separator=".">
-  <suffix name="BrowserProcess"/>
-  <suffix name="GPUProcess"/>
-  <suffix name="PluginProcess"/>
-  <suffix name="PPAPIFlashProcess"/>
-  <suffix name="PPAPIProcess"/>
-  <suffix name="RendererExtensionEventProcess"/>
-  <suffix name="RendererExtensionPersistentProcess"/>
-  <suffix name="RendererProcess"/>
-  <suffix name="WorkerProcess"/>
+  <suffix name="BrowserProcess" label=""/>
+  <suffix name="GPUProcess" label=""/>
+  <suffix name="PluginProcess" label=""/>
+  <suffix name="PPAPIFlashProcess" label=""/>
+  <suffix name="PPAPIProcess" label=""/>
+  <suffix name="RendererExtensionEventProcess" label=""/>
+  <suffix name="RendererExtensionPersistentProcess" label=""/>
+  <suffix name="RendererProcess" label=""/>
+  <suffix name="WorkerProcess" label=""/>
   <affected-histogram name="PerformanceMonitor.AverageCPU"/>
   <affected-histogram name="PerformanceMonitor.AverageDisk"/>
   <affected-histogram name="PerformanceMonitor.EnergyImpact"/>
@@ -175246,8 +175246,8 @@
 </histogram_suffixes>
 
 <histogram_suffixes name="ProviderPermissionType" separator=".">
-  <suffix name="READ_HISTORY_BOOKMARKS"/>
-  <suffix name="WRITE_HISTORY_BOOKMARKS"/>
+  <suffix name="READ_HISTORY_BOOKMARKS" label=""/>
+  <suffix name="WRITE_HISTORY_BOOKMARKS" label=""/>
   <affected-histogram name="Android.ChromeBrowserProvider.CallerHasPermission"/>
   <affected-histogram name="Android.ChromeBrowserProvider.SignaturePassed"/>
 </histogram_suffixes>
@@ -175422,7 +175422,7 @@
 </histogram_suffixes>
 
 <histogram_suffixes name="ReadErrorSourceNetwork" separator=".">
-  <suffix name="AnyNetwork"/>
+  <suffix name="AnyNetwork" label=""/>
   <suffix name="CurrentNetwork"
       label="This metric is for current network only."/>
   <suffix name="OtherNetworks"
@@ -175432,9 +175432,9 @@
 </histogram_suffixes>
 
 <histogram_suffixes name="RecurrenceRankerModel" separator=".">
-  <suffix name="QueryBasedMixedTypes"/>
-  <suffix name="QueryBasedMixedTypesGroup"/>
-  <suffix name="ZeroStateMixedTypes"/>
+  <suffix name="QueryBasedMixedTypes" label=""/>
+  <suffix name="QueryBasedMixedTypesGroup" label=""/>
+  <suffix name="ZeroStateMixedTypes" label=""/>
   <affected-histogram name="RecurrenceRanker.InitializationStatus"/>
   <affected-histogram name="RecurrenceRanker.SerializationStatus"/>
   <affected-histogram name="RecurrenceRanker.Usage"/>
@@ -175448,7 +175448,7 @@
       label="Malware interstitial referrer attribution."/>
   <suffix name="NativeFileSystemWriteAttribution"
       label="Native File System Write attribution."/>
-  <suffix name="PasswordEventAttribution"/>
+  <suffix name="PasswordEventAttribution" label=""/>
   <suffix name="PhishingInterstitialAttribution"
       label="Phishing interstitial referrer attribution."/>
   <suffix name="PPAPIDownloadAttribution"
@@ -175796,8 +175796,8 @@
 
 <histogram_suffixes name="RendererScheduler.ProcessVisibilityStateSplit"
     separator=".">
-  <suffix name="Background"/>
-  <suffix name="Foreground"/>
+  <suffix name="Background" label=""/>
+  <suffix name="Foreground" label=""/>
   <affected-histogram name="RendererScheduler.TaskCPUDurationPerThreadType"/>
   <affected-histogram name="RendererScheduler.TaskCPUDurationPerThreadType2"/>
   <affected-histogram name="RendererScheduler.TaskDurationPerTaskType"/>
@@ -175807,20 +175807,20 @@
 </histogram_suffixes>
 
 <histogram_suffixes name="RendererScheduler.QueueType" separator=".">
-  <suffix name="Compositor"/>
-  <suffix name="Input"/>
-  <suffix name="Loading"/>
-  <suffix name="Other"/>
+  <suffix name="Compositor" label=""/>
+  <suffix name="Input" label=""/>
+  <suffix name="Loading" label=""/>
+  <suffix name="Other" label=""/>
   <affected-histogram name="RendererScheduler.QueueingDurationPerQueueType"/>
 </histogram_suffixes>
 
 <histogram_suffixes name="RendererScheduler.TaskCountPerTaskLength"
     separator=".">
-  <suffix name="LongerThan1s"/>
-  <suffix name="LongerThan16ms"/>
-  <suffix name="LongerThan50ms"/>
-  <suffix name="LongerThan100ms"/>
-  <suffix name="LongerThan150ms"/>
+  <suffix name="LongerThan1s" label=""/>
+  <suffix name="LongerThan16ms" label=""/>
+  <suffix name="LongerThan50ms" label=""/>
+  <suffix name="LongerThan100ms" label=""/>
+  <suffix name="LongerThan150ms" label=""/>
   <affected-histogram name="RendererScheduler.TaskCountPerFrameType"/>
   <affected-histogram
       name="RendererScheduler.TaskCountPerFrameType.HasSafePoint"/>
@@ -175829,8 +175829,8 @@
 
 <histogram_suffixes
     name="RendererScheduler.TaskDurationPerFrameOriginTypeSplit" separator=".">
-  <suffix name="DedicatedWorker"/>
-  <suffix name="DedicatedWorker.Background"/>
+  <suffix name="DedicatedWorker" label=""/>
+  <suffix name="DedicatedWorker.Background" label=""/>
   <affected-histogram name="RendererScheduler.TaskDurationPerFrameOriginType"/>
 </histogram_suffixes>
 
@@ -175902,9 +175902,9 @@
 
 <histogram_suffixes name="RendererScheduler.TaskDurationPerTaskTypeSplit"
     separator=".">
-  <suffix name="UseCaseInputHandling"/>
-  <suffix name="UseCaseLoading"/>
-  <suffix name="UseCaseNone"/>
+  <suffix name="UseCaseInputHandling" label=""/>
+  <suffix name="UseCaseLoading" label=""/>
+  <suffix name="UseCaseNone" label=""/>
   <affected-histogram name="RendererScheduler.TaskDurationPerTaskType2"/>
 </histogram_suffixes>
 
@@ -176165,20 +176165,20 @@
 </histogram_suffixes>
 
 <histogram_suffixes name="ResourceType" separator=".">
-  <suffix name="CSSStyleSheet"/>
-  <suffix name="Font"/>
-  <suffix name="Image"/>
-  <suffix name="ImportResource"/>
-  <suffix name="LinkPrefetch"/>
-  <suffix name="LinkSubresource"/>
-  <suffix name="MainResource"/>
-  <suffix name="Manifest"/>
-  <suffix name="Media"/>
-  <suffix name="Raw"/>
-  <suffix name="Script"/>
-  <suffix name="SVGDocument"/>
-  <suffix name="TextTrack"/>
-  <suffix name="XSLStyleSheet"/>
+  <suffix name="CSSStyleSheet" label=""/>
+  <suffix name="Font" label=""/>
+  <suffix name="Image" label=""/>
+  <suffix name="ImportResource" label=""/>
+  <suffix name="LinkPrefetch" label=""/>
+  <suffix name="LinkSubresource" label=""/>
+  <suffix name="MainResource" label=""/>
+  <suffix name="Manifest" label=""/>
+  <suffix name="Media" label=""/>
+  <suffix name="Raw" label=""/>
+  <suffix name="Script" label=""/>
+  <suffix name="SVGDocument" label=""/>
+  <suffix name="TextTrack" label=""/>
+  <suffix name="XSLStyleSheet" label=""/>
   <affected-histogram name="Blink.MemoryCache.RevalidationPolicy"/>
   <affected-histogram name="Blink.MemoryCache.RevalidationPolicy.Dead"/>
   <affected-histogram name="Blink.MemoryCache.RevalidationPolicy.Preload"/>
@@ -176207,20 +176207,20 @@
 </histogram_suffixes>
 
 <histogram_suffixes name="SafeBrowsing.V4Store.Metrics" separator=".">
-  <suffix name="CertCsdDownloadWhitelist"/>
-  <suffix name="ChromeExtMalware"/>
-  <suffix name="ChromeUrlClientIncident"/>
-  <suffix name="IpMalware"/>
-  <suffix name="UrlBilling"/>
-  <suffix name="UrlCsdDownloadWhitelist"/>
-  <suffix name="UrlCsdWhitelist"/>
-  <suffix name="UrlHighConfidenceAllowlist"/>
-  <suffix name="UrlMalBin"/>
-  <suffix name="UrlMalware"/>
-  <suffix name="UrlSoceng"/>
-  <suffix name="UrlSubresourceFilter"/>
-  <suffix name="UrlSuspiciousSite"/>
-  <suffix name="UrlUws"/>
+  <suffix name="CertCsdDownloadWhitelist" label=""/>
+  <suffix name="ChromeExtMalware" label=""/>
+  <suffix name="ChromeUrlClientIncident" label=""/>
+  <suffix name="IpMalware" label=""/>
+  <suffix name="UrlBilling" label=""/>
+  <suffix name="UrlCsdDownloadWhitelist" label=""/>
+  <suffix name="UrlCsdWhitelist" label=""/>
+  <suffix name="UrlHighConfidenceAllowlist" label=""/>
+  <suffix name="UrlMalBin" label=""/>
+  <suffix name="UrlMalware" label=""/>
+  <suffix name="UrlSoceng" label=""/>
+  <suffix name="UrlSubresourceFilter" label=""/>
+  <suffix name="UrlSuspiciousSite" label=""/>
+  <suffix name="UrlUws" label=""/>
   <affected-histogram name="SafeBrowsing.V4Database.Size"/>
   <affected-histogram
       name="SafeBrowsing.V4ProcessFullUpdate.ApplyUpdate.Result"/>
@@ -176257,26 +176257,26 @@
   <obsolete>
     Removed in M73. See https://crbug.com/916192
   </obsolete>
-  <suffix name="Bloom"/>
-  <suffix name="BloomPrefixSet"/>
-  <suffix name="CsdWhitelist"/>
-  <suffix name="Download"/>
-  <suffix name="DownloadWhitelist"/>
-  <suffix name="ExtensionBlacklist"/>
-  <suffix name="InclusionWhitelist"/>
-  <suffix name="IPBlacklist"/>
-  <suffix name="ModuleWhitelist"/>
-  <suffix name="ResourceBlacklist"/>
-  <suffix name="Side-EffectFreeWhitelist"/>
-  <suffix name="UwSList"/>
-  <suffix name="UwSListPrefixSet"/>
+  <suffix name="Bloom" label=""/>
+  <suffix name="BloomPrefixSet" label=""/>
+  <suffix name="CsdWhitelist" label=""/>
+  <suffix name="Download" label=""/>
+  <suffix name="DownloadWhitelist" label=""/>
+  <suffix name="ExtensionBlacklist" label=""/>
+  <suffix name="InclusionWhitelist" label=""/>
+  <suffix name="IPBlacklist" label=""/>
+  <suffix name="ModuleWhitelist" label=""/>
+  <suffix name="ResourceBlacklist" label=""/>
+  <suffix name="Side-EffectFreeWhitelist" label=""/>
+  <suffix name="UwSList" label=""/>
+  <suffix name="UwSListPrefixSet" label=""/>
   <affected-histogram name="SafeBrowsing.V4UnusedStoreFileExists.V3"/>
 </histogram_suffixes>
 
 <histogram_suffixes name="SafeBrowsing.V4UnusedStore.Metrics" separator=".">
-  <suffix name="AnyIpMalware"/>
-  <suffix name="ChromeFilenameClientIncident"/>
-  <suffix name="UrlSuspiciousSiteId"/>
+  <suffix name="AnyIpMalware" label=""/>
+  <suffix name="ChromeFilenameClientIncident" label=""/>
+  <suffix name="UrlSuspiciousSiteId" label=""/>
   <affected-histogram name="SafeBrowsing.V4UnusedStoreFileExists"/>
 </histogram_suffixes>
 
@@ -176473,8 +176473,8 @@
 </histogram_suffixes>
 
 <histogram_suffixes name="SchedulerTotalDurationHistograms" separator=".">
-  <suffix name="Negative"/>
-  <suffix name="Positive"/>
+  <suffix name="Negative" label=""/>
+  <suffix name="Positive" label=""/>
   <affected-histogram
       name="Scheduler.Experimental.Renderer.TotalTime.Wall.MainThread"/>
 </histogram_suffixes>
@@ -176529,17 +176529,17 @@
 </histogram_suffixes>
 
 <histogram_suffixes name="SearchEnginePromoDeviceType" separator=".">
-  <suffix name="ExistingDevice"/>
-  <suffix name="NewDevice"/>
+  <suffix name="ExistingDevice" label=""/>
+  <suffix name="NewDevice" label=""/>
   <affected-histogram name="Search.SearchEngineListedInPromoDialog"/>
   <affected-histogram name="Search.SearchEngineSelectionInPromoDialog"/>
 </histogram_suffixes>
 
 <histogram_suffixes name="SearchEnginePromoOrdering" separator="."
     ordering="prefix,2">
-  <suffix name="First"/>
-  <suffix name="Second"/>
-  <suffix name="Third"/>
+  <suffix name="First" label=""/>
+  <suffix name="Second" label=""/>
+  <suffix name="Third" label=""/>
   <affected-histogram
       name="Search.SearchEngineListedInPromoDialog.ExistingDevice"/>
   <affected-histogram name="Search.SearchEngineListedInPromoDialog.NewDevice"/>
@@ -176547,7 +176547,7 @@
 
 <histogram_suffixes name="SecurityInterstitialLookalikeType" separator="."
     ordering="prefix">
-  <suffix name="lookalike"/>
+  <suffix name="lookalike" label=""/>
   <affected-histogram name="interstitial.decision"/>
   <affected-histogram name="interstitial.decision.repeat_visit"/>
   <affected-histogram name="interstitial.interaction"/>
@@ -176555,19 +176555,19 @@
 
 <histogram_suffixes name="SecurityInterstitialSBType" separator="."
     ordering="prefix">
-  <suffix name="billing"/>
-  <suffix name="billing_subresource"/>
-  <suffix name="harmful"/>
-  <suffix name="harmful_subresource"/>
-  <suffix name="malware"/>
-  <suffix name="malware_subresource"/>
-  <suffix name="origin_policy"/>
-  <suffix name="phishing"/>
-  <suffix name="phishing_subresource"/>
-  <suffix name="social_engineering_ads"/>
-  <suffix name="social_engineering_ads_subresource"/>
-  <suffix name="social_engineering_landing"/>
-  <suffix name="social_engineering_landing_subresource"/>
+  <suffix name="billing" label=""/>
+  <suffix name="billing_subresource" label=""/>
+  <suffix name="harmful" label=""/>
+  <suffix name="harmful_subresource" label=""/>
+  <suffix name="malware" label=""/>
+  <suffix name="malware_subresource" label=""/>
+  <suffix name="origin_policy" label=""/>
+  <suffix name="phishing" label=""/>
+  <suffix name="phishing_subresource" label=""/>
+  <suffix name="social_engineering_ads" label=""/>
+  <suffix name="social_engineering_ads_subresource" label=""/>
+  <suffix name="social_engineering_landing" label=""/>
+  <suffix name="social_engineering_landing_subresource" label=""/>
   <affected-histogram name="interstitial.decision"/>
   <affected-histogram name="interstitial.decision.repeat_visit"/>
   <affected-histogram name="interstitial.interaction"/>
@@ -176637,9 +176637,9 @@
 
 <histogram_suffixes name="SecurityInterstitialSSLType" separator="."
     ordering="prefix">
-  <suffix name="bad_clock"/>
-  <suffix name="ssl_nonoverridable"/>
-  <suffix name="ssl_overridable"/>
+  <suffix name="bad_clock" label=""/>
+  <suffix name="ssl_nonoverridable" label=""/>
+  <suffix name="ssl_overridable" label=""/>
   <affected-histogram name="interstitial.decision"/>
   <affected-histogram name="interstitial.decision.repeat_visit"/>
   <affected-histogram name="interstitial.interaction"/>
@@ -176724,10 +176724,10 @@
 
 <histogram_suffixes name="ServiceWorker.EventType" separator="_">
   <suffix name="ACTIVATE" label="ACTIVATE"/>
-  <suffix name="BACKGROUND_FETCH_ABORT"/>
-  <suffix name="BACKGROUND_FETCH_CLICK"/>
-  <suffix name="BACKGROUND_FETCH_FAIL"/>
-  <suffix name="BACKGROUND_FETCH_SUCCESS"/>
+  <suffix name="BACKGROUND_FETCH_ABORT" label=""/>
+  <suffix name="BACKGROUND_FETCH_CLICK" label=""/>
+  <suffix name="BACKGROUND_FETCH_FAIL" label=""/>
+  <suffix name="BACKGROUND_FETCH_SUCCESS" label=""/>
   <suffix name="COOKIE_CHANGE" label="COOKIE_CHANGE"/>
   <suffix name="FETCH_MAIN_FRAME" label="FETCH_MAIN_FRAME"/>
   <suffix name="FETCH_SHARED_WORKER" label="FETCH_SHARED_WORKER"/>
@@ -176846,7 +176846,7 @@
 
   <suffix name="DuringStartup"
       label="The worker started up during browser startup."/>
-  <suffix name="ExistingProcess">
+  <suffix name="ExistingProcess" label="">
     <obsolete>
       Deprecated as of 07/2017. Replaced by ExistingUnreadyProcess and
       ExistingReadyProcess.
@@ -176877,7 +176877,7 @@
       label="The activated worker was already starting up."/>
   <suffix name="StartWorkerDuringStartup"
       label="Started a worker during browser startup."/>
-  <suffix name="StartWorkerExistingProcess">
+  <suffix name="StartWorkerExistingProcess" label="">
     <obsolete>
       Deprecated as of 07/2017. Replaced by StartWorkerExistingUnreadyProcess
       and StartWorkerExistingReadyProcess.
@@ -176895,7 +176895,7 @@
 </histogram_suffixes>
 
 <histogram_suffixes name="ServiceWorkerCache.Cache" separator=".">
-  <suffix name="Batch">
+  <suffix name="Batch" label="">
     <obsolete>
       Deprecated as of 08/2018. Replaced by ServiceWorkerCache.Cache.Put and
       ServiceWorkerCache.Cache.Delete.
@@ -176909,7 +176909,7 @@
       ServiceWorkerCache.Cache.Renderer.DeleteOne.
     </obsolete>
   </suffix>
-  <suffix name="Keys">
+  <suffix name="Keys" label="">
     <obsolete>
       Deprecated as of 08/2018. Replaced by ServiceWorkerCache.Cache.Keys2 in
       order to use a larger maximum value.
@@ -176923,7 +176923,7 @@
       ServiceWorkerCache.Cache.Renderer.Keys.
     </obsolete>
   </suffix>
-  <suffix name="Match">
+  <suffix name="Match" label="">
     <obsolete>
       Deprecated as of 08/2018. Replaced by ServiceWorkerCache.Cache.Match2 in
       order to use a larger maximum value.
@@ -176937,7 +176937,7 @@
       ServiceWorkerCache.Cache.Renderer.Match.Hit.
     </obsolete>
   </suffix>
-  <suffix name="MatchAll">
+  <suffix name="MatchAll" label="">
     <obsolete>
       Deprecated as of 08/2018. Replaced by ServiceWorkerCache.Cache.MatchAll2
       in order to use a larger maximum value.
@@ -177097,7 +177097,7 @@
       ServiceWorkerCache.CacheStorage.Renderer.Keys.
     </obsolete>
   </suffix>
-  <suffix name="Match">
+  <suffix name="Match" label="">
     <obsolete>
       Deprecated as of 08/2018. Replaced by
       ServiceWorkerCache.CacheStorage.Match2 in order to use a larger maximum
@@ -177195,20 +177195,20 @@
 </histogram_suffixes>
 
 <histogram_suffixes name="ServiceWorkerSchedulerOp" separator=".">
-  <suffix name="Close"/>
-  <suffix name="Delete"/>
-  <suffix name="GetAllMatched"/>
-  <suffix name="Has"/>
-  <suffix name="Init"/>
-  <suffix name="Keys"/>
-  <suffix name="Match"/>
-  <suffix name="MatchAll"/>
-  <suffix name="Open"/>
-  <suffix name="Put"/>
-  <suffix name="Size"/>
-  <suffix name="SizeThenClose"/>
-  <suffix name="WriteIndex"/>
-  <suffix name="WriteSideData"/>
+  <suffix name="Close" label=""/>
+  <suffix name="Delete" label=""/>
+  <suffix name="GetAllMatched" label=""/>
+  <suffix name="Has" label=""/>
+  <suffix name="Init" label=""/>
+  <suffix name="Keys" label=""/>
+  <suffix name="Match" label=""/>
+  <suffix name="MatchAll" label=""/>
+  <suffix name="Open" label=""/>
+  <suffix name="Put" label=""/>
+  <suffix name="Size" label=""/>
+  <suffix name="SizeThenClose" label=""/>
+  <suffix name="WriteIndex" label=""/>
+  <suffix name="WriteSideData" label=""/>
   <affected-histogram
       name="ServiceWorkerCache.Cache.Scheduler.IsOperationSlow"/>
   <affected-histogram
@@ -177359,10 +177359,10 @@
 </histogram_suffixes>
 
 <histogram_suffixes name="SetupInstallWin32Apis" separator=".">
-  <suffix name="ChangeServiceConfig"/>
-  <suffix name="CreateService"/>
-  <suffix name="DeleteService"/>
-  <suffix name="OpenSCManager"/>
+  <suffix name="ChangeServiceConfig" label=""/>
+  <suffix name="CreateService" label=""/>
+  <suffix name="DeleteService" label=""/>
+  <suffix name="OpenSCManager" label=""/>
   <affected-histogram name="Setup.Install.Win32ApiError"/>
 </histogram_suffixes>
 
@@ -177411,7 +177411,7 @@
 </histogram_suffixes>
 
 <histogram_suffixes name="Signin.Actions" separator=".">
-  <suffix name="AllAccessPointActions"/>
+  <suffix name="AllAccessPointActions" label=""/>
   <suffix name="AndroidAccountConsistencyFirstRunActions"
       label="Signin Flow shown on android after Account Consistency flag was
              enabled."/>
@@ -177430,14 +177430,14 @@
   <obsolete>
     Deprecated as of 12/2014.
   </obsolete>
-  <suffix name="AppLauncherActions"/>
-  <suffix name="ExtensionInstallBubbleActions"/>
-  <suffix name="MenuActions"/>
-  <suffix name="NTPLinkActions"/>
-  <suffix name="OneClickActions"/>
-  <suffix name="SettingsActions"/>
-  <suffix name="StartPageActions"/>
-  <suffix name="UnknownActions"/>
+  <suffix name="AppLauncherActions" label=""/>
+  <suffix name="ExtensionInstallBubbleActions" label=""/>
+  <suffix name="MenuActions" label=""/>
+  <suffix name="NTPLinkActions" label=""/>
+  <suffix name="OneClickActions" label=""/>
+  <suffix name="SettingsActions" label=""/>
+  <suffix name="StartPageActions" label=""/>
+  <suffix name="UnknownActions" label=""/>
   <affected-histogram name="Signin"/>
 </histogram_suffixes>
 
@@ -177519,8 +177519,8 @@
 </histogram_suffixes>
 
 <histogram_suffixes name="Size" separator=".">
-  <suffix name="Height"/>
-  <suffix name="Width"/>
+  <suffix name="Height" label=""/>
+  <suffix name="Width" label=""/>
   <affected-histogram name="BrowserWindow.Resize.StepBoundsChange"/>
 </histogram_suffixes>
 
@@ -177534,8 +177534,8 @@
 </histogram_suffixes>
 
 <histogram_suffixes name="SmartLockStatusTypes" separator=".">
-  <suffix name="Other"/>
-  <suffix name="Unlockable"/>
+  <suffix name="Other" label=""/>
+  <suffix name="Unlockable" label=""/>
   <affected-histogram
       name="SmartLock.Performance.AuthenticationToReceiveFirstRemoteStatusDuration.Unlock"/>
   <affected-histogram
@@ -177585,9 +177585,9 @@
 </histogram_suffixes>
 
 <histogram_suffixes name="SocketOperation" separator=".">
-  <suffix name="Connect"/>
-  <suffix name="Read"/>
-  <suffix name="Write"/>
+  <suffix name="Connect" label=""/>
+  <suffix name="Read" label=""/>
+  <suffix name="Write" label=""/>
   <affected-histogram name="Net.SSLProtocolErrorCipher"/>
   <affected-histogram name="Net.SSLProtocolErrorReason"/>
 </histogram_suffixes>
@@ -177621,18 +177621,18 @@
 </histogram_suffixes>
 
 <histogram_suffixes name="SoftwareReporterEngine" separator="_">
-  <suffix name="ESET"/>
-  <suffix name="Experimental">
+  <suffix name="ESET" label=""/>
+  <suffix name="Experimental" label="">
     <obsolete>
       Deprecated 10/2018. Replaced by ESET suffix.
     </obsolete>
   </suffix>
-  <suffix name="Original">
+  <suffix name="Original" label="">
     <obsolete>
       Deprecated 10/2018. Replaced by URZA suffix.
     </obsolete>
   </suffix>
-  <suffix name="URZA"/>
+  <suffix name="URZA" label=""/>
   <affected-histogram name="SoftwareReporter.FoundUwSReadError"/>
   <affected-histogram name="SoftwareReporter.LogsUploadEnabled"/>
   <affected-histogram name="SoftwareReporter.LogsUploadResult"/>
@@ -177697,9 +177697,9 @@
 </histogram_suffixes>
 
 <histogram_suffixes name="SplitViewResizeModes" separator=".">
-  <suffix name="TabletMode.MultiWindow"/>
-  <suffix name="TabletMode.SingleWindow"/>
-  <suffix name="TabletMode.WithOverview"/>
+  <suffix name="TabletMode.MultiWindow" label=""/>
+  <suffix name="TabletMode.SingleWindow" label=""/>
+  <suffix name="TabletMode.WithOverview" label=""/>
   <affected-histogram name="Ash.SplitViewResize.PresentationTime"/>
   <affected-histogram name="Ash.SplitViewResize.PresentationTime.MaxLatency"/>
 </histogram_suffixes>
@@ -177767,8 +177767,8 @@
   <obsolete>
     Removed 2011-06-01.
   </obsolete>
-  <suffix name="FalseStart_disabled"/>
-  <suffix name="FalseStart_enabled"/>
+  <suffix name="FalseStart_disabled" label=""/>
+  <suffix name="FalseStart_enabled" label=""/>
   <affected-histogram name="Net.SSL_Connection_Latency"/>
   <affected-histogram name="Net.SSL_Connection_Latency_2"/>
   <affected-histogram name="PLT.BeginToFinish_LinkLoadNormal"/>
@@ -177776,9 +177776,9 @@
 </histogram_suffixes>
 
 <histogram_suffixes name="StaleWhileRevalidate" separator=".">
-  <suffix name="Cache"/>
-  <suffix name="Network"/>
-  <suffix name="StaleCache"/>
+  <suffix name="Cache" label=""/>
+  <suffix name="Network" label=""/>
+  <suffix name="StaleCache" label=""/>
   <affected-histogram
       name="PageLoad.Clients.StaleWhileRevalidate.PaintTiming.FirstContentfulPaint"/>
   <affected-histogram
@@ -178244,52 +178244,52 @@
   <obsolete>
     No longer logged.
   </obsolete>
-  <suffix name="PreRead_0"/>
-  <suffix name="PreRead_5"/>
-  <suffix name="PreRead_10"/>
-  <suffix name="PreRead_15"/>
-  <suffix name="PreRead_20"/>
-  <suffix name="PreRead_25"/>
-  <suffix name="PreRead_30"/>
-  <suffix name="PreRead_35"/>
-  <suffix name="PreRead_40"/>
-  <suffix name="PreRead_45"/>
-  <suffix name="PreRead_50"/>
-  <suffix name="PreRead_55"/>
-  <suffix name="PreRead_60"/>
-  <suffix name="PreRead_65"/>
-  <suffix name="PreRead_70"/>
-  <suffix name="PreRead_75"/>
-  <suffix name="PreRead_80"/>
-  <suffix name="PreRead_85"/>
-  <suffix name="PreRead_90"/>
-  <suffix name="PreRead_95"/>
-  <suffix name="PreRead_100"/>
-  <suffix name="PreReadDisabled"/>
-  <suffix name="PreReadEnabled"/>
-  <suffix name="XP_PreRead_0"/>
-  <suffix name="XP_PreRead_5"/>
-  <suffix name="XP_PreRead_10"/>
-  <suffix name="XP_PreRead_15"/>
-  <suffix name="XP_PreRead_20"/>
-  <suffix name="XP_PreRead_25"/>
-  <suffix name="XP_PreRead_30"/>
-  <suffix name="XP_PreRead_35"/>
-  <suffix name="XP_PreRead_40"/>
-  <suffix name="XP_PreRead_45"/>
-  <suffix name="XP_PreRead_50"/>
-  <suffix name="XP_PreRead_55"/>
-  <suffix name="XP_PreRead_60"/>
-  <suffix name="XP_PreRead_65"/>
-  <suffix name="XP_PreRead_70"/>
-  <suffix name="XP_PreRead_75"/>
-  <suffix name="XP_PreRead_80"/>
-  <suffix name="XP_PreRead_85"/>
-  <suffix name="XP_PreRead_90"/>
-  <suffix name="XP_PreRead_95"/>
-  <suffix name="XP_PreRead_100"/>
-  <suffix name="XP_PreReadDisabled"/>
-  <suffix name="XP_PreReadEnabled"/>
+  <suffix name="PreRead_0" label=""/>
+  <suffix name="PreRead_5" label=""/>
+  <suffix name="PreRead_10" label=""/>
+  <suffix name="PreRead_15" label=""/>
+  <suffix name="PreRead_20" label=""/>
+  <suffix name="PreRead_25" label=""/>
+  <suffix name="PreRead_30" label=""/>
+  <suffix name="PreRead_35" label=""/>
+  <suffix name="PreRead_40" label=""/>
+  <suffix name="PreRead_45" label=""/>
+  <suffix name="PreRead_50" label=""/>
+  <suffix name="PreRead_55" label=""/>
+  <suffix name="PreRead_60" label=""/>
+  <suffix name="PreRead_65" label=""/>
+  <suffix name="PreRead_70" label=""/>
+  <suffix name="PreRead_75" label=""/>
+  <suffix name="PreRead_80" label=""/>
+  <suffix name="PreRead_85" label=""/>
+  <suffix name="PreRead_90" label=""/>
+  <suffix name="PreRead_95" label=""/>
+  <suffix name="PreRead_100" label=""/>
+  <suffix name="PreReadDisabled" label=""/>
+  <suffix name="PreReadEnabled" label=""/>
+  <suffix name="XP_PreRead_0" label=""/>
+  <suffix name="XP_PreRead_5" label=""/>
+  <suffix name="XP_PreRead_10" label=""/>
+  <suffix name="XP_PreRead_15" label=""/>
+  <suffix name="XP_PreRead_20" label=""/>
+  <suffix name="XP_PreRead_25" label=""/>
+  <suffix name="XP_PreRead_30" label=""/>
+  <suffix name="XP_PreRead_35" label=""/>
+  <suffix name="XP_PreRead_40" label=""/>
+  <suffix name="XP_PreRead_45" label=""/>
+  <suffix name="XP_PreRead_50" label=""/>
+  <suffix name="XP_PreRead_55" label=""/>
+  <suffix name="XP_PreRead_60" label=""/>
+  <suffix name="XP_PreRead_65" label=""/>
+  <suffix name="XP_PreRead_70" label=""/>
+  <suffix name="XP_PreRead_75" label=""/>
+  <suffix name="XP_PreRead_80" label=""/>
+  <suffix name="XP_PreRead_85" label=""/>
+  <suffix name="XP_PreRead_90" label=""/>
+  <suffix name="XP_PreRead_95" label=""/>
+  <suffix name="XP_PreRead_100" label=""/>
+  <suffix name="XP_PreReadDisabled" label=""/>
+  <suffix name="XP_PreReadEnabled" label=""/>
   <affected-histogram name="Startup.BrowserMessageLoopStartTime"/>
   <affected-histogram name="Startup.BrowserOpenTabs"/>
 </histogram_suffixes>
@@ -178706,7 +178706,7 @@
 </histogram_suffixes>
 
 <histogram_suffixes name="TeamDrivesSupport" separator=".">
-  <suffix name="TeamDrives"/>
+  <suffix name="TeamDrives" label=""/>
   <affected-histogram name="Drive.DeltaFeedLoadTime"/>
   <affected-histogram name="Drive.DirectoryFeedLoadTime"/>
   <affected-histogram name="Drive.FullFeedLoadTime"/>
@@ -178834,23 +178834,23 @@
   <obsolete>
     Deprecated as of 11/2017 in Issue 650338. Using a DCHECK instead.
   </obsolete>
-  <suffix name="Browser"/>
-  <suffix name="Renderer"/>
+  <suffix name="Browser" label=""/>
+  <suffix name="Renderer" label=""/>
   <affected-histogram name="Event.TimestampHasValidTimebase"/>
 </histogram_suffixes>
 
 <histogram_suffixes name="TotalTimeToHttpsGoogle" separator=".">
-  <suffix name="NotQuic">
+  <suffix name="NotQuic" label="">
     <obsolete>
       Deprecated as of 08/2015. Use Net.HttpJob.*Secure.NotQuic instead.
     </obsolete>
   </suffix>
-  <suffix name="Quic">
+  <suffix name="Quic" label="">
     <obsolete>
       Deprecated as of 08/2015. Use Net.HttpJob.*Secure.Quic instead.
     </obsolete>
   </suffix>
-  <suffix name="Secure.NotQuic">
+  <suffix name="Secure.NotQuic" label="">
     <obsolete>
       Deprecated as of 08/2018. No longer used.
     </obsolete>
@@ -179012,10 +179012,10 @@
 </histogram_suffixes>
 
 <histogram_suffixes name="VideoCaptureFrameDrop" separator=".">
-  <suffix name="DeviceCapture"/>
-  <suffix name="DisplayCapture"/>
-  <suffix name="GumDesktopCapture"/>
-  <suffix name="GumTabCapture"/>
+  <suffix name="DeviceCapture" label=""/>
+  <suffix name="DisplayCapture" label=""/>
+  <suffix name="GumDesktopCapture" label=""/>
+  <suffix name="GumTabCapture" label=""/>
   <affected-histogram name="Media.VideoCapture.FrameDrop"/>
   <affected-histogram name="Media.VideoCapture.MaxFrameDropExceeded"/>
 </histogram_suffixes>
@@ -179232,9 +179232,9 @@
 </histogram_suffixes>
 
 <histogram_suffixes name="WebMediaPlayerContentTypes" separator=".">
-  <suffix name="Audio"/>
-  <suffix name="AudioVideo"/>
-  <suffix name="Video"/>
+  <suffix name="Audio" label=""/>
+  <suffix name="AudioVideo" label=""/>
+  <suffix name="Video" label=""/>
   <affected-histogram name="Media.PreloadMetadataSuspendWasIdeal"/>
 </histogram_suffixes>
 
@@ -179292,14 +179292,14 @@
 
 <histogram_suffixes name="WebRTCVideoExperimentGroupId" separator=".">
   <owner>ilnik@chromium.org</owner>
-  <suffix name="ExperimentGroup0"/>
-  <suffix name="ExperimentGroup1"/>
-  <suffix name="ExperimentGroup2"/>
-  <suffix name="ExperimentGroup3"/>
-  <suffix name="ExperimentGroup4"/>
-  <suffix name="S0"/>
-  <suffix name="S1"/>
-  <suffix name="S2"/>
+  <suffix name="ExperimentGroup0" label=""/>
+  <suffix name="ExperimentGroup1" label=""/>
+  <suffix name="ExperimentGroup2" label=""/>
+  <suffix name="ExperimentGroup3" label=""/>
+  <suffix name="ExperimentGroup4" label=""/>
+  <suffix name="S0" label=""/>
+  <suffix name="S1" label=""/>
+  <suffix name="S2" label=""/>
   <affected-histogram name="WebRTC.Video.Decoded.Vp8.Qp"/>
   <affected-histogram name="WebRTC.Video.EndToEndDelayInMs"/>
   <affected-histogram name="WebRTC.Video.EndToEndDelayMaxInMs"/>
@@ -179326,21 +179326,21 @@
 </histogram_suffixes>
 
 <histogram_suffixes name="WebSocketErrorCodesVariants" separator="_">
-  <suffix name="Localhost"/>
-  <suffix name="NotLocalhost"/>
+  <suffix name="Localhost" label=""/>
+  <suffix name="NotLocalhost" label=""/>
   <affected-histogram name="Net.WebSocket.ErrorCodes"/>
 </histogram_suffixes>
 
 <histogram_suffixes name="WebSocketMessageSizeReceive" separator=".">
-  <suffix name="ArrayBuffer"/>
-  <suffix name="Blob"/>
+  <suffix name="ArrayBuffer" label=""/>
+  <suffix name="Blob" label=""/>
   <affected-histogram name="WebCore.WebSocket.MessageSize.Receive"/>
 </histogram_suffixes>
 
 <histogram_suffixes name="WebSocketMessageSizeSend" separator=".">
-  <suffix name="ArrayBuffer"/>
-  <suffix name="ArrayBufferView"/>
-  <suffix name="Blob"/>
+  <suffix name="ArrayBuffer" label=""/>
+  <suffix name="ArrayBufferView" label=""/>
+  <suffix name="Blob" label=""/>
   <affected-histogram name="WebCore.WebSocket.MessageSize.Send"/>
 </histogram_suffixes>
 
@@ -179353,13 +179353,13 @@
 </histogram_suffixes>
 
 <histogram_suffixes name="WeekdayNames" separator="_">
-  <suffix name="Friday"/>
-  <suffix name="Monday"/>
-  <suffix name="Saturday"/>
-  <suffix name="Sunday"/>
-  <suffix name="Thursday"/>
-  <suffix name="Tuesday"/>
-  <suffix name="Wednesday"/>
+  <suffix name="Friday" label=""/>
+  <suffix name="Monday" label=""/>
+  <suffix name="Saturday" label=""/>
+  <suffix name="Sunday" label=""/>
+  <suffix name="Thursday" label=""/>
+  <suffix name="Tuesday" label=""/>
+  <suffix name="Wednesday" label=""/>
   <affected-histogram name="NewTabPage.ContentSuggestions.UsageTimeLocal"/>
 </histogram_suffixes>
 
@@ -179388,72 +179388,72 @@
 </histogram_suffixes>
 
 <histogram_suffixes name="WrenchMenuActionTimings" separator=".">
-  <suffix name="About"/>
-  <suffix name="AppInfo"/>
-  <suffix name="BetaForum"/>
-  <suffix name="BookmarkAllTabs"/>
-  <suffix name="BookmarkOpen">
+  <suffix name="About" label=""/>
+  <suffix name="AppInfo" label=""/>
+  <suffix name="BetaForum" label=""/>
+  <suffix name="BookmarkAllTabs" label=""/>
+  <suffix name="BookmarkOpen" label="">
     <obsolete>
       Deprecated as of 02/2015. Use WrenchMenu.TimeToAction.OpenBookmark
       instead.
     </obsolete>
   </suffix>
-  <suffix name="BookmarkPage"/>
-  <suffix name="Cast"/>
-  <suffix name="ChromeOSRestart"/>
-  <suffix name="ClearBrowsingData"/>
-  <suffix name="Copy"/>
-  <suffix name="CopyUrl"/>
-  <suffix name="CreateHostedApp"/>
-  <suffix name="CreateShortcuts">
+  <suffix name="BookmarkPage" label=""/>
+  <suffix name="Cast" label=""/>
+  <suffix name="ChromeOSRestart" label=""/>
+  <suffix name="ClearBrowsingData" label=""/>
+  <suffix name="Copy" label=""/>
+  <suffix name="CopyUrl" label=""/>
+  <suffix name="CreateHostedApp" label=""/>
+  <suffix name="CreateShortcuts" label="">
     <obsolete>
       Deprecated as of 04/2017. Replaced by Bookmark Apps (CreateHostedApp).
     </obsolete>
   </suffix>
-  <suffix name="Cut"/>
-  <suffix name="DevTools"/>
-  <suffix name="DevToolsConsole"/>
-  <suffix name="DevToolsDevices"/>
-  <suffix name="DistillPage"/>
-  <suffix name="EnterFullScreen"/>
-  <suffix name="Exit"/>
-  <suffix name="Feedback"/>
-  <suffix name="Find"/>
-  <suffix name="HelpPage"/>
-  <suffix name="ImportSettings"/>
-  <suffix name="ManageExtensions"/>
-  <suffix name="NewIncognitoWindow"/>
-  <suffix name="NewTab"/>
-  <suffix name="NewWindow"/>
-  <suffix name="OpenBookmark"/>
-  <suffix name="OpenInChrome"/>
-  <suffix name="OpenRecentTab"/>
-  <suffix name="Paste"/>
-  <suffix name="PinToStartScreen"/>
-  <suffix name="Print"/>
-  <suffix name="ProfilingEnabled"/>
-  <suffix name="RecentTab">
+  <suffix name="Cut" label=""/>
+  <suffix name="DevTools" label=""/>
+  <suffix name="DevToolsConsole" label=""/>
+  <suffix name="DevToolsDevices" label=""/>
+  <suffix name="DistillPage" label=""/>
+  <suffix name="EnterFullScreen" label=""/>
+  <suffix name="Exit" label=""/>
+  <suffix name="Feedback" label=""/>
+  <suffix name="Find" label=""/>
+  <suffix name="HelpPage" label=""/>
+  <suffix name="ImportSettings" label=""/>
+  <suffix name="ManageExtensions" label=""/>
+  <suffix name="NewIncognitoWindow" label=""/>
+  <suffix name="NewTab" label=""/>
+  <suffix name="NewWindow" label=""/>
+  <suffix name="OpenBookmark" label=""/>
+  <suffix name="OpenInChrome" label=""/>
+  <suffix name="OpenRecentTab" label=""/>
+  <suffix name="Paste" label=""/>
+  <suffix name="PinToStartScreen" label=""/>
+  <suffix name="Print" label=""/>
+  <suffix name="ProfilingEnabled" label=""/>
+  <suffix name="RecentTab" label="">
     <obsolete>
       Deprecated as of 02/2015. Use WrenchMenu.TimeToAction.OpenRecentTab
       instead.
     </obsolete>
   </suffix>
-  <suffix name="RequestTabletSite"/>
-  <suffix name="RestoreTab"/>
-  <suffix name="SavePage"/>
-  <suffix name="Settings"/>
-  <suffix name="ShowBookmarkBar"/>
-  <suffix name="ShowBookmarkMgr"/>
-  <suffix name="ShowDownloads"/>
-  <suffix name="ShowHistory"/>
-  <suffix name="ShowSyncSetup"/>
-  <suffix name="SiteSettings"/>
-  <suffix name="TaskManager"/>
-  <suffix name="ViewSource"/>
-  <suffix name="Win8MetroRestart"/>
-  <suffix name="WinDesktopRestart"/>
-  <suffix name="ZoomMinus"/>
-  <suffix name="ZoomPlus"/>
+  <suffix name="RequestTabletSite" label=""/>
+  <suffix name="RestoreTab" label=""/>
+  <suffix name="SavePage" label=""/>
+  <suffix name="Settings" label=""/>
+  <suffix name="ShowBookmarkBar" label=""/>
+  <suffix name="ShowBookmarkMgr" label=""/>
+  <suffix name="ShowDownloads" label=""/>
+  <suffix name="ShowHistory" label=""/>
+  <suffix name="ShowSyncSetup" label=""/>
+  <suffix name="SiteSettings" label=""/>
+  <suffix name="TaskManager" label=""/>
+  <suffix name="ViewSource" label=""/>
+  <suffix name="Win8MetroRestart" label=""/>
+  <suffix name="WinDesktopRestart" label=""/>
+  <suffix name="ZoomMinus" label=""/>
+  <suffix name="ZoomPlus" label=""/>
   <affected-histogram name="WrenchMenu.TimeToAction"/>
 </histogram_suffixes>
 
diff --git a/tools/perf/benchmarks/blink_perf.py b/tools/perf/benchmarks/blink_perf.py
index aa3dce7..9e306350 100644
--- a/tools/perf/benchmarks/blink_perf.py
+++ b/tools/perf/benchmarks/blink_perf.py
@@ -563,4 +563,5 @@
     return 'blink_perf.display_locking'
 
   def SetExtraBrowserOptions(self, options):
-    options.AppendExtraBrowserArgs(['--enable-blink-features=DisplayLocking'])
+    options.AppendExtraBrowserArgs(
+      ['--enable-blink-features=DisplayLocking,CSSContentSize'])
diff --git a/ui/accessibility/platform/ax_platform_node_textrangeprovider_win.cc b/ui/accessibility/platform/ax_platform_node_textrangeprovider_win.cc
index 6587ba0..3e7d499 100644
--- a/ui/accessibility/platform/ax_platform_node_textrangeprovider_win.cc
+++ b/ui/accessibility/platform/ax_platform_node_textrangeprovider_win.cc
@@ -155,6 +155,14 @@
   // is on the next TextUnit boundary, if one exists.
   switch (unit) {
     case TextUnit_Character: {
+      // Sometimes, the start endpoint will be positioned at the end of anchor,
+      // meaning the end endpoint will be positioned in another anchor. Because
+      // Windows ATs behave undesirably when the start and end endpoints are not
+      // in the same anchor (for character and word navigation), move the start
+      // endpoint to the start of the other anchor.
+      if (start_->AtEndOfAnchor() && !start_->AtEndOfDocument()) {
+        start_ = start_->AsPositionBeforeCharacter();
+      }
       // For characters, the start endpoint will always be on a TextUnit
       // boundary, thus we only need to move the end position.
       AXPositionInstance end_backup = end_->Clone();
@@ -193,6 +201,12 @@
       // in order to move to the next one (stopping at the last anchor's end).
       end_ = start_->CreateNextWordStartPosition(
           AXBoundaryBehavior::StopAtLastAnchorBoundary);
+      // Because Windows ATs behave undesirably when the start and end endpoints
+      // are not in the same anchor (for character and word navigation), make
+      // sure to bring back the end endpoint to the end of the start's anchor.
+      if (start_->anchor_id() != end_->anchor_id()) {
+        end_ = start_->CreatePositionAtEndOfAnchor();
+      }
       break;
     case TextUnit_Line:
       start_ = start_->CreatePreviousLineStartPosition(
@@ -205,6 +219,11 @@
           AXBoundaryBehavior::StopIfAlreadyAtBoundary);
       end_ = start_->CreateNextParagraphEndPosition(
           AXBoundaryBehavior::StopIfAlreadyAtBoundary);
+
+      if (!start_->AtEndOfDocument())
+        start_ = start_->AsPositionBeforeCharacter();
+      if (!end_->AtEndOfDocument())
+        end_ = end_->AsPositionBeforeCharacter();
       break;
     case TextUnit_Page: {
       // If the document doesn't support pagination, default to document units
@@ -227,20 +246,6 @@
       return UIA_E_NOTSUPPORTED;
   }
 
-  // Some text positions are equal when compared, but they could be located at
-  // different anchors, affecting how `GetEnclosingElement` works. Normalize the
-  // endpoints to correctly enclose characters of the text representation.
-  AXPositionInstance normalized_start = start_->AsPositionBeforeCharacter();
-  AXPositionInstance normalized_end = end_->AsPositionBeforeCharacter();
-
-  if (!normalized_start->IsNullPosition()) {
-    DCHECK_EQ(*start_, *normalized_start);
-    start_ = std::move(normalized_start);
-  }
-  if (!normalized_end->IsNullPosition()) {
-    DCHECK_EQ(*end_, *normalized_end);
-    end_ = std::move(normalized_end);
-  }
   return S_OK;
 }
 
diff --git a/ui/aura/BUILD.gn b/ui/aura/BUILD.gn
index ff3692c..61cb4cb 100644
--- a/ui/aura/BUILD.gn
+++ b/ui/aura/BUILD.gn
@@ -39,6 +39,7 @@
     "scoped_enable_unadjusted_mouse_events.h",
     "scoped_keyboard_hook.h",
     "scoped_simple_keyboard_hook.h",
+    "scoped_window_event_targeting_blocker.h",
     "scoped_window_targeter.h",
     "window.h",
     "window_delegate.h",
@@ -81,6 +82,7 @@
     "null_window_targeter.cc",
     "scoped_keyboard_hook.cc",
     "scoped_simple_keyboard_hook.cc",
+    "scoped_window_event_targeting_blocker.cc",
     "scoped_window_targeter.cc",
     "window.cc",
     "window_delegate.cc",
diff --git a/ui/aura/scoped_window_event_targeting_blocker.cc b/ui/aura/scoped_window_event_targeting_blocker.cc
new file mode 100644
index 0000000..219076d
--- /dev/null
+++ b/ui/aura/scoped_window_event_targeting_blocker.cc
@@ -0,0 +1,42 @@
+// Copyright 2019 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 "ui/aura/scoped_window_event_targeting_blocker.h"
+
+#include "ui/aura/window.h"
+
+namespace aura {
+
+ScopedWindowEventTargetingBlocker::ScopedWindowEventTargetingBlocker(
+    Window* window)
+    : window_(window) {
+  if (window_->event_targeting_blocker_count_ == 0) {
+    window_->restore_event_targeting_policy_ = window_->event_targeting_policy_;
+    window_->SetEventTargetingPolicy(EventTargetingPolicy::kNone);
+  }
+  // Increase |Window::event_targeting_blocker_count_| after setting the event
+  // targeting policy to kNone as Window::SetEventTargetingPolicy() relies on
+  // |Window::event_targeting_blocker_count_| to see if the policy is allowed
+  // to be changed.
+  window_->event_targeting_blocker_count_++;
+  window_->AddObserver(this);
+}
+
+ScopedWindowEventTargetingBlocker::~ScopedWindowEventTargetingBlocker() {
+  if (!window_)
+    return;
+  window_->RemoveObserver(this);
+  window_->event_targeting_blocker_count_--;
+  DCHECK_GE(window_->event_targeting_blocker_count_, 0);
+  if (window_->event_targeting_blocker_count_ == 0)
+    window_->SetEventTargetingPolicy(window_->restore_event_targeting_policy_);
+}
+
+void ScopedWindowEventTargetingBlocker::OnWindowDestroying(Window* window) {
+  DCHECK_EQ(window, window_);
+  window_->RemoveObserver(this);
+  window_ = nullptr;
+}
+
+}  // namespace aura
diff --git a/ui/aura/scoped_window_event_targeting_blocker.h b/ui/aura/scoped_window_event_targeting_blocker.h
new file mode 100644
index 0000000..e240f35
--- /dev/null
+++ b/ui/aura/scoped_window_event_targeting_blocker.h
@@ -0,0 +1,34 @@
+// Copyright 2019 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 UI_AURA_SCOPED_WINDOW_EVENT_TARGETING_BLOCKER_H_
+#define UI_AURA_SCOPED_WINDOW_EVENT_TARGETING_BLOCKER_H_
+
+#include "base/macros.h"
+#include "ui/aura/aura_export.h"
+#include "ui/aura/window_observer.h"
+
+namespace aura {
+
+class Window;
+
+// Temporarily blocks the event targeting by setting kNone targeting policy to
+// |window_|. The original event targeting policy will be restored if all
+// targeting blockers are removed from |window_|.
+class AURA_EXPORT ScopedWindowEventTargetingBlocker : public WindowObserver {
+ public:
+  explicit ScopedWindowEventTargetingBlocker(Window* window);
+  ~ScopedWindowEventTargetingBlocker() override;
+
+  // WindowObserver:
+  void OnWindowDestroying(Window* window) override;
+
+ private:
+  Window* window_;
+  DISALLOW_COPY_AND_ASSIGN(ScopedWindowEventTargetingBlocker);
+};
+
+}  // namespace aura
+
+#endif  // UI_AURA_SCOPED_WINDOW_EVENT_TARGETING_BLOCKER_H_
diff --git a/ui/aura/window.cc b/ui/aura/window.cc
index 4828e77f..88272e4 100644
--- a/ui/aura/window.cc
+++ b/ui/aura/window.cc
@@ -108,6 +108,8 @@
       delegate_(delegate),
       event_targeting_policy_(
           aura::EventTargetingPolicy::kTargetAndDescendants),
+      restore_event_targeting_policy_(
+          aura::EventTargetingPolicy::kTargetAndDescendants),
       // Don't notify newly added observers during notification. This causes
       // problems for code that adds an observer as part of an observer
       // notification (such as the workspace code).
@@ -570,6 +572,14 @@
 }
 
 void Window::SetEventTargetingPolicy(EventTargetingPolicy policy) {
+  // If the event targeting is blocked on the window, do not allow change event
+  // targeting policy until all event targeting blockers are removed from the
+  // window.
+  if (event_targeting_blocker_count_ > 0) {
+    restore_event_targeting_policy_ = policy;
+    return;
+  }
+
 #if DCHECK_IS_ON()
   const bool old_window_accepts_events =
       (event_targeting_policy_ == EventTargetingPolicy::kTargetOnly) ||
diff --git a/ui/aura/window.h b/ui/aura/window.h
index fcfdd77..8558a5c 100644
--- a/ui/aura/window.h
+++ b/ui/aura/window.h
@@ -69,13 +69,13 @@
 
 class LayoutManager;
 class ScopedKeyboardHook;
+class ScopedWindowEventTargetingBlocker;
 class WindowDelegate;
-class WindowObserver;
 class WindowTargeter;
 class WindowTreeHost;
 
 // Defined in class_property.h (which we do not include)
-template<typename T>
+template <typename T>
 using WindowProperty = ui::ClassProperty<T>;
 
 namespace test {
@@ -110,10 +110,7 @@
   static constexpr int kInitialId = -1;
 
   // Used when stacking windows.
-  enum StackDirection {
-    STACK_ABOVE,
-    STACK_BELOW
-  };
+  enum StackDirection { STACK_ABOVE, STACK_BELOW };
 
   // These values are persisted to logs. Entries should not be renumbered and
   // numeric values should never be reused.
@@ -397,7 +394,7 @@
   void* GetNativeWindowProperty(const char* key) const;
 
   // Type of a function to delete a property that this window owns.
-  //typedef void (*PropertyDeallocator)(int64_t value);
+  // typedef void (*PropertyDeallocator)(int64_t value);
 
   // Overridden from ui::LayerDelegate:
   void OnDeviceScaleFactorChanged(float old_device_scale_factor,
@@ -513,6 +510,7 @@
   friend class HitTestDataProviderAura;
   friend class LayoutManager;
   friend class PropertyConverter;
+  friend class ScopedWindowEventTargetingBlocker;
   friend class WindowTargeter;
   friend class test::WindowTestApi;
 
@@ -682,6 +680,10 @@
 
   // Makes the window pass all events through to any windows behind it.
   EventTargetingPolicy event_targeting_policy_;
+  // Used to restore to the original event targeting policy after all event
+  // targeting blockers on this window are removed.
+  EventTargetingPolicy restore_event_targeting_policy_;
+  int event_targeting_blocker_count_ = 0;
 
   base::ReentrantObserverList<WindowObserver, true> observers_;
 
diff --git a/ui/aura/window_unittest.cc b/ui/aura/window_unittest.cc
index b94aa8c..941e2463 100644
--- a/ui/aura/window_unittest.cc
+++ b/ui/aura/window_unittest.cc
@@ -24,6 +24,7 @@
 #include "ui/aura/client/visibility_client.h"
 #include "ui/aura/client/window_parenting_client.h"
 #include "ui/aura/layout_manager.h"
+#include "ui/aura/scoped_window_event_targeting_blocker.h"
 #include "ui/aura/test/aura_test_base.h"
 #include "ui/aura/test/aura_test_utils.h"
 #include "ui/aura/test/test_window_delegate.h"
@@ -1612,6 +1613,39 @@
   EXPECT_TRUE(w111.get()->layer()->accept_events());
 }
 
+TEST_F(WindowTest, ScopedEventTargetingBlockerTest) {
+  // Test only when all event targeting blockers are removed from the window,
+  // its event targeting policy will restore back to its original value.
+  std::unique_ptr<Window> window(CreateTestWindowWithDelegate(
+      nullptr, 1, gfx::Rect(0, 0, 500, 500), root_window()));
+  EXPECT_EQ(window->event_targeting_policy(),
+            EventTargetingPolicy::kTargetAndDescendants);
+  auto event_targeting_blocker1 =
+      std::make_unique<ScopedWindowEventTargetingBlocker>(window.get());
+  EXPECT_EQ(window->event_targeting_policy(), EventTargetingPolicy::kNone);
+  auto event_targeting_blocker2 =
+      std::make_unique<ScopedWindowEventTargetingBlocker>(window.get());
+  EXPECT_EQ(window->event_targeting_policy(), EventTargetingPolicy::kNone);
+  event_targeting_blocker2.reset();
+  EXPECT_EQ(window->event_targeting_policy(), EventTargetingPolicy::kNone);
+  event_targeting_blocker1.reset();
+  EXPECT_EQ(window->event_targeting_policy(),
+            EventTargetingPolicy::kTargetAndDescendants);
+
+  // It's possible that the event target policy changes when there is an event
+  // targeting blocker in place. In this case when the event targeting blocker
+  // is removed from the window, the window should restore to the changed event
+  // targeting policy.
+  auto event_targeting_blocker3 =
+      std::make_unique<ScopedWindowEventTargetingBlocker>(window.get());
+  EXPECT_EQ(window->event_targeting_policy(), EventTargetingPolicy::kNone);
+  window->SetEventTargetingPolicy(EventTargetingPolicy::kTargetOnly);
+  EXPECT_EQ(window->event_targeting_policy(), EventTargetingPolicy::kNone);
+  event_targeting_blocker3.reset();
+  EXPECT_EQ(window->event_targeting_policy(),
+            EventTargetingPolicy::kTargetOnly);
+}
+
 // Tests transformation on the root window.
 TEST_F(WindowTest, Transform) {
   gfx::Size size = host()->GetBoundsInPixels().size();
diff --git a/ui/base/template_expressions.cc b/ui/base/template_expressions.cc
index e67b048..8adaa61d 100644
--- a/ui/base/template_expressions.cc
+++ b/ui/base/template_expressions.cc
@@ -21,18 +21,18 @@
 const size_t kHtmlTemplateStartSize = base::size(kHtmlTemplateStart) - 1;
 
 // Currently only legacy _template: html`...`, syntax is supported.
-enum HtmlTemplateType { NONE = 0, LEGACY = 1 };
+enum HtmlTemplateType { INVALID = 0, NONE = 1, LEGACY = 2 };
 
 struct TemplatePosition {
   HtmlTemplateType type;
   base::StringPiece::size_type position;
 };
 
-TemplatePosition FindHtmlTemplateStart(const base::StringPiece& source) {
-  base::StringPiece::size_type found = source.find(kHtmlTemplateStart);
-  HtmlTemplateType type = found == base::StringPiece::npos ? NONE : LEGACY;
-  return {type, found + kHtmlTemplateStartSize};
-}
+struct HtmlTemplate {
+  base::StringPiece::size_type start;
+  base::StringPiece::size_type length;
+  HtmlTemplateType type;
+};
 
 TemplatePosition FindHtmlTemplateEnd(const base::StringPiece& source) {
   enum State { OPEN, IN_ESCAPE, IN_TICK };
@@ -62,6 +62,36 @@
   return {NONE, base::StringPiece::npos};
 }
 
+HtmlTemplate FindHtmlTemplate(const base::StringPiece& source) {
+  HtmlTemplate out;
+  base::StringPiece::size_type found = source.find(kHtmlTemplateStart);
+
+  // No template found, return early.
+  if (found == base::StringPiece::npos) {
+    out.type = NONE;
+    return out;
+  }
+
+  out.start = found + kHtmlTemplateStartSize;
+  TemplatePosition end = FindHtmlTemplateEnd(source.substr(out.start));
+  // Template is not terminated.
+  if (end.type == NONE) {
+    out.type = INVALID;
+    return out;
+  }
+
+  out.length = end.position;
+  // Check for a nested template
+  if (source.substr(out.start, out.length).find(kHtmlTemplateStart) !=
+      base::StringPiece::npos) {
+    out.type = INVALID;
+    return out;
+  }
+
+  out.type = LEGACY;
+  return out;
+}
+
 // Escape quotes and backslashes ('"\).
 std::string PolymerParameterEscape(const std::string& in_string) {
   std::string out;
@@ -200,42 +230,45 @@
 bool ReplaceTemplateExpressionsInJS(base::StringPiece source,
                                     const TemplateReplacements& replacements,
                                     std::string* formatted) {
-  // Replacement is only done in JS for the contents of the HTML _template
-  // string.
-  TemplatePosition start_result = FindHtmlTemplateStart(source);
-  if (start_result.type == NONE) {
-    *formatted = source.as_string();
-    return true;
+  CHECK(formatted->empty());
+  base::StringPiece remaining = source;
+  while (true) {
+    // Replacement is only done in JS for the contents of HTML _template
+    // strings.
+    HtmlTemplate current_template = FindHtmlTemplate(remaining);
+
+    // If there was an error finding a template, return false.
+    if (current_template.type == INVALID)
+      return false;
+
+    // If there are no more templates, copy the remaining JS to the output and
+    // return true.
+    if (current_template.type == NONE) {
+      formatted->append(remaining.as_string());
+      return true;
+    }
+
+    // Copy the JS before the template to the output.
+    formatted->append(remaining.substr(0, current_template.start).as_string());
+
+    // Retrieve the HTML portion of the source.
+    base::StringPiece html_template =
+        remaining.substr(current_template.start, current_template.length);
+
+    // Perform replacements with JS escaping.
+    std::string formatted_html;
+    if (!ReplaceTemplateExpressionsInternal(html_template, replacements, true,
+                                            &formatted_html)) {
+      return false;
+    }
+
+    // Append the formatted HTML template.
+    formatted->append(formatted_html);
+
+    // Increment to the end of the current template.
+    remaining =
+        remaining.substr(current_template.start + current_template.length);
   }
-
-  // Only one template allowed per file.
-  TemplatePosition second_start_result =
-      FindHtmlTemplateStart(source.substr(start_result.position));
-  if (second_start_result.type != NONE)
-    return false;
-
-  TemplatePosition end_result =
-      FindHtmlTemplateEnd(source.substr(start_result.position));
-
-  // Template must be properly terminated.
-  if (start_result.type != end_result.type)
-    return false;
-
-  // Retrieve the HTML portion of the source.
-  base::StringPiece html_template =
-      source.substr(start_result.position, end_result.position);
-
-  // Perform replacements with JS escaping.
-  std::string formatted_html;
-  if (!ReplaceTemplateExpressionsInternal(html_template, replacements, true,
-                                          &formatted_html)) {
-    return false;
-  }
-
-  // Re-assemble the JS file.
-  *formatted =
-      source.substr(0, start_result.position).as_string() + formatted_html +
-      source.substr(start_result.position + end_result.position).as_string();
   return true;
 }
 
diff --git a/ui/base/template_expressions_unittest.cc b/ui/base/template_expressions_unittest.cc
index e254137e..6f82f387f 100644
--- a/ui/base/template_expressions_unittest.cc
+++ b/ui/base/template_expressions_unittest.cc
@@ -275,17 +275,6 @@
 
   // All these cases should fail.
   const TestCase kTestCases[] = {
-      // 2 HTML template strings are not allowed.
-      {"Polymer({\n"
-       "  _template: html`\n"
-       "    <span>Hello</span>\n"
-       "  `,\n"
-       "  _template: html`\n"
-       "    <div>World</div>\n"
-       "  `,\n"
-       "  is: 'foo-element',\n"
-       "});",
-       ""},
       // Nested templates not allowed.
       {"Polymer({\n"
        "  _template: html`\n"
@@ -349,4 +338,54 @@
   }
 }
 
+TEST(TemplateExpressionsTest, JSMultipleTemplates) {
+  TemplateReplacements substitutions;
+  substitutions["test"] = "word";
+  substitutions["5"] = "number";
+
+  const TestCase kTestCases[] = {
+      // Only the second template has substitutions
+      {"Polymer({\n"
+       "  _template: html`<div>Hello</div>`,\n"
+       "  is: 'foo-element',\n"
+       "});"
+       "Polymer({\n"
+       "  _template: html`<div>$i18n{5}$i18n{test}</div>`,\n"
+       "  is: 'bar-element',\n"
+       "});",
+       "Polymer({\n"
+       "  _template: html`<div>Hello</div>`,\n"
+       "  is: 'foo-element',\n"
+       "});"
+       "Polymer({\n"
+       "  _template: html`<div>numberword</div>`,\n"
+       "  is: 'bar-element',\n"
+       "});"},
+      // 2 templates, both with substitutions.
+      {"Polymer({\n"
+       "  _template: html`<div>$i18n{test}</div>`,\n"
+       "  is: 'foo-element',\n"
+       "});"
+       "Polymer({\n"
+       "  _template: html`<div>$i18n{5}</div>`,\n"
+       "  is: 'bar-element',\n"
+       "});",
+       "Polymer({\n"
+       "  _template: html`<div>word</div>`,\n"
+       "  is: 'foo-element',\n"
+       "});"
+       "Polymer({\n"
+       "  _template: html`<div>number</div>`,\n"
+       "  is: 'bar-element',\n"
+       "});"}};
+
+  std::string formatted;
+  for (const TestCase test_case : kTestCases) {
+    ASSERT_TRUE(ReplaceTemplateExpressionsInJS(test_case.js_in, substitutions,
+                                               &formatted));
+    EXPECT_EQ(test_case.expected_out, formatted);
+    formatted.clear();
+  }
+}
+
 }  // namespace ui
diff --git a/ui/ozone/demo/BUILD.gn b/ui/ozone/demo/BUILD.gn
index e76ca1f..f7530e8 100644
--- a/ui/ozone/demo/BUILD.gn
+++ b/ui/ozone/demo/BUILD.gn
@@ -4,7 +4,7 @@
 
 import("//gpu/vulkan/features.gni")
 if (is_fuchsia) {
-  import("//build/config/fuchsia/rules.gni")
+  import("//build/config/fuchsia/generate_runner_scripts.gni")
 }
 
 group("demo") {
diff --git a/ui/views/BUILD.gn b/ui/views/BUILD.gn
index b92fe5397..1b7d70e8 100644
--- a/ui/views/BUILD.gn
+++ b/ui/views/BUILD.gn
@@ -639,6 +639,7 @@
       "corewm/tooltip.h",
       "corewm/tooltip_aura.h",
       "corewm/tooltip_controller.h",
+      "corewm/tooltip_win.h",
       "event_monitor_aura.h",
       "touchui/touch_selection_controller_impl.h",
       "touchui/touch_selection_menu_runner_views.h",
@@ -666,6 +667,7 @@
       "corewm/cursor_height_provider_win.cc",
       "corewm/tooltip_aura.cc",
       "corewm/tooltip_controller.cc",
+      "corewm/tooltip_win.cc",
       "drag_utils_aura.cc",
       "event_monitor_aura.cc",
       "metrics_aura.cc",
diff --git a/ui/views/corewm/tooltip_win.cc b/ui/views/corewm/tooltip_win.cc
new file mode 100644
index 0000000..971e0dd
--- /dev/null
+++ b/ui/views/corewm/tooltip_win.cc
@@ -0,0 +1,178 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/views/corewm/tooltip_win.h"
+
+#include "base/i18n/rtl.h"
+#include "base/logging.h"
+#include "base/win/windowsx_shim.h"
+#include "ui/base/l10n/l10n_util_win.h"
+#include "ui/display/display.h"
+#include "ui/display/screen.h"
+#include "ui/display/win/screen_win.h"
+#include "ui/gfx/geometry/rect.h"
+#include "ui/gfx/system_fonts_win.h"
+#include "ui/views/corewm/cursor_height_provider_win.h"
+
+namespace views {
+namespace corewm {
+
+TooltipWin::TooltipWin(HWND parent)
+    : parent_hwnd_(parent), tooltip_hwnd_(nullptr), showing_(false) {
+  memset(&toolinfo_, 0, sizeof(toolinfo_));
+  toolinfo_.cbSize = sizeof(toolinfo_);
+  toolinfo_.uFlags = TTF_IDISHWND | TTF_TRACK | TTF_ABSOLUTE;
+  toolinfo_.uId = reinterpret_cast<UINT_PTR>(parent_hwnd_);
+  toolinfo_.hwnd = parent_hwnd_;
+  toolinfo_.lpszText = nullptr;
+  toolinfo_.lpReserved = nullptr;
+  SetRectEmpty(&toolinfo_.rect);
+}
+
+TooltipWin::~TooltipWin() {
+  if (tooltip_hwnd_)
+    DestroyWindow(tooltip_hwnd_);
+}
+
+bool TooltipWin::HandleNotify(int w_param, NMHDR* l_param, LRESULT* l_result) {
+  if (tooltip_hwnd_ == nullptr)
+    return false;
+
+  switch (l_param->code) {
+    case TTN_POP:
+      showing_ = false;
+      return true;
+    case TTN_SHOW:
+      *l_result = TRUE;
+      PositionTooltip();
+      showing_ = true;
+      return true;
+    default:
+      break;
+  }
+  return false;
+}
+
+bool TooltipWin::EnsureTooltipWindow() {
+  if (tooltip_hwnd_)
+    return true;
+
+  tooltip_hwnd_ =
+      CreateWindowEx(WS_EX_TRANSPARENT | l10n_util::GetExtendedTooltipStyles(),
+                     TOOLTIPS_CLASS, nullptr, TTS_NOPREFIX | WS_POPUP, 0, 0, 0,
+                     0, parent_hwnd_, nullptr, nullptr, nullptr);
+  if (!tooltip_hwnd_) {
+    PLOG(WARNING) << "tooltip creation failed, disabling tooltips";
+    return false;
+  }
+
+  MaybeOverrideFont();
+
+  SendMessage(tooltip_hwnd_, TTM_ADDTOOL, 0,
+              reinterpret_cast<LPARAM>(&toolinfo_));
+  return true;
+}
+
+void TooltipWin::PositionTooltip() {
+  gfx::Point screen_point =
+      display::win::ScreenWin::DIPToScreenPoint(location_);
+  const int cursoroffset = GetCurrentCursorVisibleHeight();
+  screen_point.Offset(0, cursoroffset);
+
+  DWORD tooltip_size = SendMessage(tooltip_hwnd_, TTM_GETBUBBLESIZE, 0,
+                                   reinterpret_cast<LPARAM>(&toolinfo_));
+  const gfx::Size size(LOWORD(tooltip_size), HIWORD(tooltip_size));
+
+  const display::Display display(
+      display::Screen::GetScreen()->GetDisplayNearestPoint(location_));
+
+  gfx::Rect tooltip_bounds(screen_point, size);
+  tooltip_bounds.AdjustToFit(
+      display::win::ScreenWin::DIPToScreenRect(parent_hwnd_,
+                                               display.work_area()));
+  SetWindowPos(tooltip_hwnd_, nullptr, tooltip_bounds.x(), tooltip_bounds.y(),
+               0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE);
+
+  MaybeOverrideFont();
+}
+
+void TooltipWin::MaybeOverrideFont() {
+  gfx::win::FontAdjustment font_adjustment;
+  const HFONT old_font = GetWindowFont(tooltip_hwnd_);
+
+  // Determine if we need to override the font.
+  if ((!override_font_.get() || override_font_.get() != old_font) &&
+      l10n_util::NeedOverrideDefaultUIFont(
+          &font_adjustment.font_family_override, &font_adjustment.font_scale)) {
+    // Determine if we need to regenerate the font.
+    // There are a number of situations under which Windows can replace the
+    // font in a tooltip, but we don't actually need to regenerate our override
+    // font unless the underlying text/DPI scale of the window has changed.
+    const float current_scale =
+        display::win::ScreenWin::GetScaleFactorForHWND(tooltip_hwnd_);
+    if (!override_font_.get() || current_scale != override_scale_) {
+      override_font_.reset(
+          gfx::win::AdjustExistingSystemFont(old_font, font_adjustment));
+      override_scale_ = current_scale;
+    }
+
+    // Override the font in the tooltip.
+    SetWindowFont(tooltip_hwnd_, override_font_.get(), FALSE);
+  }
+}
+
+int TooltipWin::GetMaxWidth(const gfx::Point& location) const {
+  const gfx::Point screen_point =
+      display::win::ScreenWin::DIPToScreenPoint(location);
+  display::Display display(
+      display::Screen::GetScreen()->GetDisplayNearestPoint(screen_point));
+  const gfx::Rect monitor_bounds = display.bounds();
+  return (monitor_bounds.width() + 1) / 2;
+}
+
+void TooltipWin::SetText(aura::Window* window,
+                         const base::string16& tooltip_text,
+                         const gfx::Point& location) {
+  if (!EnsureTooltipWindow())
+    return;
+
+  // See comment in header for details on why |location_| is needed.
+  location_ = location;
+
+  base::string16 adjusted_text(tooltip_text);
+  base::i18n::AdjustStringForLocaleDirection(&adjusted_text);
+  toolinfo_.lpszText = const_cast<WCHAR*>(adjusted_text.c_str());
+  SendMessage(tooltip_hwnd_, TTM_SETTOOLINFO, 0,
+              reinterpret_cast<LPARAM>(&toolinfo_));
+
+  int max_width = GetMaxWidth(location_);
+  SendMessage(tooltip_hwnd_, TTM_SETMAXTIPWIDTH, 0, max_width);
+}
+
+void TooltipWin::Show() {
+  if (!EnsureTooltipWindow())
+    return;
+
+  SendMessage(tooltip_hwnd_, TTM_TRACKACTIVATE,
+              TRUE, reinterpret_cast<LPARAM>(&toolinfo_));
+
+  // Bring the window to the front.
+  SetWindowPos(tooltip_hwnd_, HWND_TOPMOST, 0, 0, 0, 0,
+               SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOOWNERZORDER | SWP_NOSIZE);
+}
+
+void TooltipWin::Hide() {
+  if (!tooltip_hwnd_)
+    return;
+
+  SendMessage(tooltip_hwnd_, TTM_TRACKACTIVATE, FALSE,
+              reinterpret_cast<LPARAM>(&toolinfo_));
+}
+
+bool TooltipWin::IsVisible() {
+  return showing_;
+}
+
+}  // namespace corewm
+}  // namespace views
diff --git a/ui/views/corewm/tooltip_win.h b/ui/views/corewm/tooltip_win.h
new file mode 100644
index 0000000..9ed24d3
--- /dev/null
+++ b/ui/views/corewm/tooltip_win.h
@@ -0,0 +1,84 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_VIEWS_COREWM_TOOLTIP_WIN_H_
+#define UI_VIEWS_COREWM_TOOLTIP_WIN_H_
+
+#include <windows.h>
+#include <commctrl.h>
+
+#include "base/compiler_specific.h"
+#include "base/macros.h"
+#include "base/optional.h"
+#include "base/strings/string16.h"
+#include "base/win/scoped_gdi_object.h"
+#include "ui/gfx/geometry/point.h"
+#include "ui/views/corewm/tooltip.h"
+
+namespace views {
+namespace corewm {
+
+// Implementation of Tooltip that uses the native win32 control for showing the
+// tooltip.
+class VIEWS_EXPORT TooltipWin : public Tooltip {
+ public:
+  explicit TooltipWin(HWND parent);
+  ~TooltipWin() override;
+
+  // HandleNotify() is forwarded from DesktopWindowTreeHostWin to keep the
+  // native tooltip in sync.
+  bool HandleNotify(int w_param, NMHDR* l_param, LRESULT* l_result);
+
+ private:
+  // Ensures |tooltip_hwnd_| is valid. Returns true if valid, false if there
+  // a problem creating |tooltip_hwnd_|.
+  bool EnsureTooltipWindow();
+
+  // Sets the position of the tooltip.
+  void PositionTooltip();
+
+  // Might override the font size for localization (e.g. Hindi).
+  void MaybeOverrideFont();
+
+  // Tooltip:
+  int GetMaxWidth(const gfx::Point& location) const override;
+  void SetText(aura::Window* window,
+               const base::string16& tooltip_text,
+               const gfx::Point& location) override;
+  void Show() override;
+  void Hide() override;
+  bool IsVisible() override;
+
+  // Font we're currently overriding our UI font with.
+  // Should outlast |tooltip_hwnd_|.
+  base::win::ScopedHFONT override_font_;
+
+  // The window |tooltip_hwnd_| is parented to.
+  HWND parent_hwnd_;
+
+  // Shows the tooltip.
+  HWND tooltip_hwnd_;
+
+  // Used to modify the tooltip.
+  TOOLINFO toolinfo_;
+
+  // Is the tooltip showing?
+  bool showing_;
+
+  // Location to show the tooltip at. In order to position the tooltip we need
+  // to know the size. The size is only available from TTN_SHOW, so we have to
+  // cache it.
+  gfx::Point location_;
+
+  // What the scale was the last time we overrode the font, to see if we can
+  // re-use our previous override.
+  float override_scale_ = 0.0f;
+
+  DISALLOW_COPY_AND_ASSIGN(TooltipWin);
+};
+
+}  // namespace corewm
+}  // namespace views
+
+#endif  // UI_VIEWS_COREWM_TOOLTIP_WIN_H_
diff --git a/ui/views/views_features.cc b/ui/views/views_features.cc
index 65609e6..4f2750ce 100644
--- a/ui/views/views_features.cc
+++ b/ui/views/views_features.cc
@@ -11,6 +11,12 @@
 
 // Please keep alphabetized.
 
+#if defined(OS_WIN)
+// Uses aura tooltips instead of the native comctl32 tooltips on Windows.
+const base::Feature kEnableAuraTooltipsOnWindows{
+    "EnableAuraTooltipsOnWindows", base::FEATURE_ENABLED_BY_DEFAULT};
+#endif  // OS_WIN
+
 // Increases corner radius on Dialogs for the material design refresh.
 // TODO(sajadm): Remove this feature flag when platform inconsistencies
 // have been fixed as recorded on: https://crbug.com/932970
diff --git a/ui/views/views_features.h b/ui/views/views_features.h
index 3c064f7..de370cbf 100644
--- a/ui/views/views_features.h
+++ b/ui/views/views_features.h
@@ -6,12 +6,17 @@
 #define UI_VIEWS_VIEWS_FEATURES_H_
 
 #include "base/feature_list.h"
+#include "build/build_config.h"
 #include "ui/views/views_export.h"
 
 namespace views {
 namespace features {
 
 // Please keep alphabetized.
+#if defined(OS_WIN)
+VIEWS_EXPORT extern const base::Feature kEnableAuraTooltipsOnWindows;
+#endif  // OS_WIN
+
 VIEWS_EXPORT extern const base::Feature kEnableMDRoundedCornersOnDialogs;
 VIEWS_EXPORT extern const base::Feature kEnableViewPaintOptimization;
 
diff --git a/ui/views/widget/desktop_aura/desktop_window_tree_host_win.cc b/ui/views/widget/desktop_aura/desktop_window_tree_host_win.cc
index 2f78bf6..b5041a5 100644
--- a/ui/views/widget/desktop_aura/desktop_window_tree_host_win.cc
+++ b/ui/views/widget/desktop_aura/desktop_window_tree_host_win.cc
@@ -31,6 +31,8 @@
 #include "ui/gfx/native_widget_types.h"
 #include "ui/gfx/path_win.h"
 #include "ui/views/corewm/tooltip_aura.h"
+#include "ui/views/corewm/tooltip_win.h"
+#include "ui/views/views_features.h"
 #include "ui/views/views_switches.h"
 #include "ui/views/widget/desktop_aura/desktop_drag_drop_client_win.h"
 #include "ui/views/widget/desktop_aura/desktop_native_cursor_manager.h"
@@ -92,7 +94,8 @@
       drag_drop_client_(nullptr),
       should_animate_window_close_(false),
       pending_close_(false),
-      has_non_client_view_(false) {}
+      has_non_client_view_(false),
+      tooltip_(nullptr) {}
 
 DesktopWindowTreeHostWin::~DesktopWindowTreeHostWin() {
   desktop_native_widget_aura_->OnDesktopWindowTreeHostDestroyed(this);
@@ -163,7 +166,12 @@
 void DesktopWindowTreeHostWin::OnWidgetInitDone() {}
 
 std::unique_ptr<corewm::Tooltip> DesktopWindowTreeHostWin::CreateTooltip() {
-  return std::make_unique<corewm::TooltipAura>();
+  if (base::FeatureList::IsEnabled(features::kEnableAuraTooltipsOnWindows))
+    return std::make_unique<corewm::TooltipAura>();
+
+  DCHECK(!tooltip_);
+  tooltip_ = new corewm::TooltipWin(GetAcceleratedWidget());
+  return base::WrapUnique(tooltip_);
 }
 
 std::unique_ptr<aura::client::DragDropClient>
@@ -990,6 +998,12 @@
     compositor()->ScheduleRedrawRect(invalid_rect);
 }
 
+bool DesktopWindowTreeHostWin::HandleTooltipNotify(int w_param,
+                                                   NMHDR* l_param,
+                                                   LRESULT* l_result) {
+  return tooltip_ && tooltip_->HandleNotify(w_param, l_param, l_result);
+}
+
 void DesktopWindowTreeHostWin::HandleMenuLoop(bool in_menu_loop) {
   if (in_menu_loop) {
     tooltip_disabler_ = std::make_unique<wm::ScopedTooltipDisabler>(window());
diff --git a/ui/views/widget/desktop_aura/desktop_window_tree_host_win.h b/ui/views/widget/desktop_aura/desktop_window_tree_host_win.h
index e63ced1..b195b58 100644
--- a/ui/views/widget/desktop_aura/desktop_window_tree_host_win.h
+++ b/ui/views/widget/desktop_aura/desktop_window_tree_host_win.h
@@ -37,6 +37,10 @@
 class HWNDMessageHandler;
 class NonClientFrameView;
 
+namespace corewm {
+class TooltipWin;
+}
+
 namespace test {
 class DesktopWindowTreeHostWinTestApi;
 }
@@ -209,6 +213,9 @@
   void HandleInputLanguageChange(DWORD character_set,
                                  HKL input_language_id) override;
   void HandlePaintAccelerated(const gfx::Rect& invalid_rect) override;
+  bool HandleTooltipNotify(int w_param,
+                           NMHDR* l_param,
+                           LRESULT* l_result) override;
   void HandleMenuLoop(bool in_menu_loop) override;
   bool PreHandleMSG(UINT message,
                     WPARAM w_param,
@@ -281,6 +288,10 @@
   // True if the window should have the frame removed.
   bool remove_standard_frame_;
 
+  // Owned by TooltipController, but we need to forward events to it so we keep
+  // a reference.
+  corewm::TooltipWin* tooltip_;
+
   // Visibility of the cursor. On Windows we can have multiple root windows and
   // the implementation of ::ShowCursor() is based on a counter, so making this
   // member static ensures that ::ShowCursor() is always called exactly once
diff --git a/ui/views/win/hwnd_message_handler.cc b/ui/views/win/hwnd_message_handler.cc
index c1dc0c75..a4649b8 100644
--- a/ui/views/win/hwnd_message_handler.cc
+++ b/ui/views/win/hwnd_message_handler.cc
@@ -2409,6 +2409,12 @@
   return 0;
 }
 
+LRESULT HWNDMessageHandler::OnNotify(int w_param, NMHDR* l_param) {
+  LRESULT l_result = 0;
+  SetMsgHandled(delegate_->HandleTooltipNotify(w_param, l_param, &l_result));
+  return l_result;
+}
+
 void HWNDMessageHandler::OnPaint(HDC dc) {
   // Call BeginPaint()/EndPaint() around the paint handling, as that seems
   // to do more to actually validate the window's drawing region. This only
diff --git a/ui/views/win/hwnd_message_handler.h b/ui/views/win/hwnd_message_handler.h
index a67e0e7..cbc7961 100644
--- a/ui/views/win/hwnd_message_handler.h
+++ b/ui/views/win/hwnd_message_handler.h
@@ -444,6 +444,7 @@
     CR_MSG_WM_NCCREATE(OnNCCreate)
     CR_MSG_WM_NCHITTEST(OnNCHitTest)
     CR_MSG_WM_NCPAINT(OnNCPaint)
+    CR_MSG_WM_NOTIFY(OnNotify)
     CR_MSG_WM_PAINT(OnPaint)
     CR_MSG_WM_SETFOCUS(OnSetFocus)
     CR_MSG_WM_SETICON(OnSetIcon)
@@ -501,6 +502,7 @@
   void OnNCPaint(HRGN rgn);
   LRESULT OnNCUAHDrawCaption(UINT message, WPARAM w_param, LPARAM l_param);
   LRESULT OnNCUAHDrawFrame(UINT message, WPARAM w_param, LPARAM l_param);
+  LRESULT OnNotify(int w_param, NMHDR* l_param);
   void OnPaint(HDC dc);
   LRESULT OnReflectedMessage(UINT message, WPARAM w_param, LPARAM l_param);
   LRESULT OnScrollMessage(UINT message, WPARAM w_param, LPARAM l_param);
diff --git a/ui/views/win/hwnd_message_handler_delegate.h b/ui/views/win/hwnd_message_handler_delegate.h
index ddc640e..45c4e5b2 100644
--- a/ui/views/win/hwnd_message_handler_delegate.h
+++ b/ui/views/win/hwnd_message_handler_delegate.h
@@ -221,6 +221,11 @@
   // Called to compel the delegate to paint |invalid_rect| accelerated.
   virtual void HandlePaintAccelerated(const gfx::Rect& invalid_rect) = 0;
 
+  // Called to forward a WM_NOTIFY message to the tooltip manager.
+  virtual bool HandleTooltipNotify(int w_param,
+                                   NMHDR* l_param,
+                                   LRESULT* l_result) = 0;
+
   // Invoked on entering/exiting a menu loop.
   virtual void HandleMenuLoop(bool in_menu_loop) = 0;
 
diff --git a/ui/webui/resources/cr_elements/BUILD.gn b/ui/webui/resources/cr_elements/BUILD.gn
index c3a7ff4..d463d3ec 100644
--- a/ui/webui/resources/cr_elements/BUILD.gn
+++ b/ui/webui/resources/cr_elements/BUILD.gn
@@ -91,6 +91,12 @@
   html_type = "style-module"
 }
 
+polymer_modulizer("cr_page_host_style_css") {
+  js_file = "cr_page_host_style_css.m.js"
+  html_file = "cr_page_host_style_css.html"
+  html_type = "style-module"
+}
+
 polymer_modulizer("shared_vars_css") {
   js_file = "shared_vars_css.m.js"
   html_file = "shared_vars_css.html"
@@ -136,6 +142,7 @@
   deps = [
     ":action_link_css_module",
     ":cr_icons_css_module",
+    ":cr_page_host_style_css_module",
     ":hidden_style_css_module",
     ":icons_module",
     ":md_select_css_module",
diff --git a/ui/webui/resources/cr_elements/cr_dialog/cr_dialog.js b/ui/webui/resources/cr_elements/cr_dialog/cr_dialog.js
index ddc9f58..fb555d65 100644
--- a/ui/webui/resources/cr_elements/cr_dialog/cr_dialog.js
+++ b/ui/webui/resources/cr_elements/cr_dialog/cr_dialog.js
@@ -265,14 +265,14 @@
       return;
     }
 
-    // Accept Enter keys from either the dialog, or a child input or cr-input
-    // element (but consider that the event may have been retargeted).
-    const origTarget = e.composedPath()[0];
-    const accept = e.target == this || origTarget.tagName == 'CR-INPUT' ||
-        (origTarget.tagName == 'INPUT' &&
-         // <cr-input> can only be text-like; apply the same limit to <input> so
-         // that e.g. enter on a checkbox does not submit the dialog.
-         ['text', 'password', 'number', 'search'].includes(origTarget.type));
+    // Accept Enter keys from either the dialog itself, or a child cr-input,
+    // considering that the event may have been retargeted, for example if the
+    // cr-input is nested inside another element. Also exclude inputs of type
+    // 'search', since hitting 'Enter' on a search field most likely intends to
+    // trigger searching.
+    const accept = e.target === this ||
+        e.composedPath().some(
+            el => el.tagName == 'CR-INPUT' && el.type != 'search');
     if (!accept) {
       return;
     }
diff --git a/ui/webui/resources/cr_elements_resources_v3.grdp b/ui/webui/resources/cr_elements_resources_v3.grdp
index 39d855b..4185ee4 100644
--- a/ui/webui/resources/cr_elements_resources_v3.grdp
+++ b/ui/webui/resources/cr_elements_resources_v3.grdp
@@ -61,6 +61,11 @@
          use_base_dir="false"
          type="BINDATA"
          compress="gzip" />
+  <include name="IDR_CR_ELEMENTS_CR_PAGE_HOST_STYLE_CSS_M_JS"
+         file="${root_gen_dir}/ui/webui/resources/cr_elements/cr_page_host_style_css.m.js"
+         use_base_dir="false"
+         type="BINDATA"
+         compress="gzip" />
   <include name="IDR_CR_ELEMENTS_CR_LAZY_RENDER_M_JS"
          file="${root_gen_dir}/ui/webui/resources/cr_elements/cr_lazy_render/cr_lazy_render.m.js"
          use_base_dir="false"