diff --git a/DEPS b/DEPS
index 8ea41a2..1291b00 100644
--- a/DEPS
+++ b/DEPS
@@ -180,7 +180,7 @@
   # luci-go CIPD package version.
   # Make sure the revision is uploaded by infra-packagers builder.
   # https://ci.chromium.org/p/infra-internal/g/infra-packagers/console
-  'luci_go': 'git_revision:e1c81c53ccd0366e8fff438f89030043343d4d6b',
+  'luci_go': 'git_revision:40e3c704aad0fceec04344d281ae333de04fd2a5',
 
   # This can be overridden, e.g. with custom_vars, to build clang from HEAD
   # instead of downloading the prebuilt pinned revision.
@@ -209,11 +209,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': 'd1de126c257b74d676ebdf1f11b7815b86d48500',
+  'skia_revision': '9753413043001b5b2eae16ab9197fdc9b55138e3',
   # 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': '246e3704f3f6607dacf22c24fb71b5d1e54ecc54',
+  'v8_revision': '5b556c639a354045bf8d8991d2c30d2598daf59a',
   # 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.
@@ -229,7 +229,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling PDFium
   # and whatever else without interference from each other.
-  'pdfium_revision': '21c8586341999205105ec9a89680d8622fbabb81',
+  'pdfium_revision': 'a11d7fa5144a88cd7f0bd7cd05df3a90711d9c6c',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling BoringSSL
   # and whatever else without interference from each other.
@@ -288,7 +288,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling devtools-frontend
   # and whatever else without interference from each other.
-  'devtools_frontend_revision': '543c28e9b344ea2eee940e67ce707be0de1a8c07',
+  'devtools_frontend_revision': 'dc5a1c43f9bbdcc46a246486253bdc4f1302fe7c',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libprotobuf-mutator
   # and whatever else without interference from each other.
@@ -723,7 +723,7 @@
     'packages': [
       {
           'package': 'chromium/third_party/androidx',
-          'version': 'g8SLuoOc1bCcY1mN-J9JLpK6ha0jgDwjWRJqsDwEtM4C',
+          'version': 'v-p1zbJ800vLETiv98_a04Og1z_1IR6Cph3aB-RvpO0C',
       },
     ],
     'condition': 'checkout_android',
@@ -1636,7 +1636,7 @@
     Var('chromium_git') + '/v8/v8.git' + '@' +  Var('v8_revision'),
 
   'src-internal': {
-    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@924f592fada7927f1b3c21774fa95ca33914a1fa',
+    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@9d5b0749e1c36915a8bf0a61c6ec1fe8fb75b6a4',
     'condition': 'checkout_src_internal',
   },
 
@@ -1644,7 +1644,7 @@
     'packages': [
       {
         'package': 'chromeos_internal/apps/eche_app/app',
-        'version': 'o9GqtEifaYwdNlq0ymD7vHlW4ce76Qknjpd535QA5h8C',
+        'version': '1nItDYhYyrhWg4RAgQ5uCjojvZ20pmBLG0zZiuRWIf8C',
       },
     ],
     'condition': 'checkout_chromeos and checkout_src_internal',
@@ -1666,7 +1666,7 @@
     'packages': [
       {
         'package': 'chromeos_internal/apps/media_app/app',
-        'version': 'HerPX5kPiZcf3Z1X2Mr4q2qi9Y-8dCxlANBhoqU0Uf4C',
+        'version': 'q4c5UkB_mGNFs6-MYBG9wfHiVuomSNeI-szBxCVlvawC',
       },
     ],
     'condition': 'checkout_chromeos and checkout_src_internal',
diff --git a/ash/app_list/app_list_controller_impl_unittest.cc b/ash/app_list/app_list_controller_impl_unittest.cc
index a434ce63..36533069 100644
--- a/ash/app_list/app_list_controller_impl_unittest.cc
+++ b/ash/app_list/app_list_controller_impl_unittest.cc
@@ -49,6 +49,7 @@
 #include "base/test/metrics/histogram_tester.h"
 #include "base/test/scoped_feature_list.h"
 #include "base/test/with_feature_override.h"
+#include "ui/base/emoji/emoji_panel_helper.h"
 #include "ui/base/ui_base_features.h"
 #include "ui/compositor/scoped_animation_duration_scale_mode.h"
 #include "ui/events/test/event_generator.h"
@@ -199,6 +200,8 @@
 // Verify that when the emoji panel shows and AppListView is in Peeking state,
 // AppListView's rounded corners should be hidden (see https://crbug.com/950468)
 TEST_F(AppListControllerImplTest, HideRoundingCornersWhenEmojiShows) {
+  ui::SetShowEmojiKeyboardCallback(
+      base::BindRepeating(ui::ShowTabletModeEmojiPanel));
   // Set IME client. Otherwise the emoji panel is unable to show.
   ImeController* ime_controller = Shell::Get()->ime_controller();
   TestImeControllerClient client;
diff --git a/ash/constants/ash_features.cc b/ash/constants/ash_features.cc
index 94d7dae..f8e9e26 100644
--- a/ash/constants/ash_features.cc
+++ b/ash/constants/ash_features.cc
@@ -420,11 +420,11 @@
 
 // Enable or disable IME decoder via Mojo connection on Chrome OS.
 const base::Feature kImeMojoDecoder{"ImeMojoDecoder",
-                                    base::FEATURE_DISABLED_BY_DEFAULT};
+                                    base::FEATURE_ENABLED_BY_DEFAULT};
 
 // Enable or disable system emoji picker.
 const base::Feature kImeSystemEmojiPicker{"SystemEmojiPicker",
-                                          base::FEATURE_DISABLED_BY_DEFAULT};
+                                          base::FEATURE_ENABLED_BY_DEFAULT};
 
 // Enable or disable using the floating virtual keyboard as the default option
 // on Chrome OS.
@@ -708,6 +708,10 @@
 const base::Feature kVmCameraMicIndicatorsAndNotifications{
     "VmCameraMicIndicatorsAndNotifications", base::FEATURE_ENABLED_BY_DEFAULT};
 
+// Controls whether to allow enabling wake on WiFi features in shill.
+const base::Feature kWakeOnWifiAllowed{"WakeOnWifiAllowed",
+                                       base::FEATURE_DISABLED_BY_DEFAULT};
+
 // Enable new wallpaper experience in WebUI inside system settings.
 const base::Feature kWallpaperWebUI{"WallpaperWebUI",
                                     base::FEATURE_DISABLED_BY_DEFAULT};
diff --git a/ash/constants/ash_features.h b/ash/constants/ash_features.h
index 9622f32..5a57fed 100644
--- a/ash/constants/ash_features.h
+++ b/ash/constants/ash_features.h
@@ -317,6 +317,8 @@
 COMPONENT_EXPORT(ASH_CONSTANTS)
 extern const base::Feature kVmCameraMicIndicatorsAndNotifications;
 COMPONENT_EXPORT(ASH_CONSTANTS)
+extern const base::Feature kWakeOnWifiAllowed;
+COMPONENT_EXPORT(ASH_CONSTANTS)
 extern const base::Feature kWallpaperWebUI;
 COMPONENT_EXPORT(ASH_CONSTANTS)
 extern const base::Feature kWifiSyncAndroid;
diff --git a/base/BUILD.gn b/base/BUILD.gn
index 9749c2d..b142527 100644
--- a/base/BUILD.gn
+++ b/base/BUILD.gn
@@ -1394,7 +1394,10 @@
       all_dependent_configs += [ "//base/allocator:wrap_malloc_symbols" ]
     }
     if (is_apple) {
-      sources += [ "allocator/allocator_shim_override_mac_symbols.h" ]
+      sources += [
+        "allocator/allocator_shim_override_mac_default_zone.h",
+        "allocator/allocator_shim_override_mac_symbols.h",
+      ]
     }
     if (is_chromeos || is_linux) {
       sources += [
diff --git a/base/allocator/allocator_shim.cc b/base/allocator/allocator_shim.cc
index e085adf..37e2f9d 100644
--- a/base/allocator/allocator_shim.cc
+++ b/base/allocator/allocator_shim.cc
@@ -27,6 +27,7 @@
 #include <malloc/malloc.h>
 
 #include "base/allocator/allocator_interception_mac.h"
+#include "base/mac/mach_logging.h"
 #endif
 
 // No calls to malloc / new in this file. They would would cause re-entrancy of
@@ -338,7 +339,11 @@
 // On Windows we use plain link-time overriding of the CRT symbols.
 #include "base/allocator/allocator_shim_override_ucrt_symbols_win.h"
 #elif defined(OS_APPLE)
+#if BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC)
+#include "base/allocator/allocator_shim_override_mac_default_zone.h"
+#else  // BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC)
 #include "base/allocator/allocator_shim_override_mac_symbols.h"
+#endif  // BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC)
 #else
 #include "base/allocator/allocator_shim_override_libc_symbols.h"
 #endif
@@ -371,7 +376,11 @@
 #if defined(OS_APPLE)
 namespace base {
 namespace allocator {
+
 void InitializeAllocatorShim() {
+#if BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC)
+  AddMacMallocZoneAsDefaultZone();
+#else   // BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC)
   // Prepares the default dispatch. After the intercepted malloc calls have
   // traversed the shim this will route them to the default malloc zone.
   InitializeDefaultDispatchToMacAllocator();
@@ -381,7 +390,9 @@
   // This replaces the default malloc zone, causing calls to malloc & friends
   // from the codebase to be routed to ShimMalloc() above.
   base::allocator::ReplaceFunctionsForStoredZones(&functions);
+#endif  // BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC)
 }
+
 }  // namespace allocator
 }  // namespace base
 #endif
diff --git a/base/allocator/allocator_shim_default_dispatch_to_partition_alloc.cc b/base/allocator/allocator_shim_default_dispatch_to_partition_alloc.cc
index 5a284c4..de2e6e4 100644
--- a/base/allocator/allocator_shim_default_dispatch_to_partition_alloc.cc
+++ b/base/allocator/allocator_shim_default_dispatch_to_partition_alloc.cc
@@ -324,8 +324,18 @@
 size_t PartitionGetSizeEstimate(const AllocatorDispatch*,
                                 void* address,
                                 void* context) {
+  if (!(base::IsManagedByPartitionAllocNonBRPPool(address) ||
+        base::IsManagedByPartitionAllocBRPPool(address))) {
+    // The object pointed to by `address` is not allocated by the
+    // PartitionAlloc.  The return value `0` means that the pointer does not
+    // belong to this malloc zone.
+    return 0;
+  }
+
   // TODO(lizeb): Returns incorrect values for aligned allocations.
-  return base::ThreadSafePartitionRoot::GetUsableSize(address);
+  const size_t size = base::ThreadSafePartitionRoot::GetUsableSize(address);
+  PA_CHECK(size);
+  return size;
 }
 
 // static
@@ -523,3 +533,21 @@
 }  // extern "C"
 
 #endif  // BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC)
+
+#if defined(OS_APPLE)
+
+namespace base {
+namespace allocator {
+
+void InitializeDefaultAllocatorPartitionRoot() {
+  // On OS_APPLE, the initialization of PartitionRoot uses memory allocations
+  // internally, e.g. __builtin_available, and it's not easy to avoid it.
+  // Thus, we initialize the PartitionRoot with using the system default
+  // allocator before we intercept the system default allocator.
+  ignore_result(Allocator());
+}
+
+}  // namespace allocator
+}  // namespace base
+
+#endif  // defined(OS_APPLE)
diff --git a/base/allocator/allocator_shim_override_mac_default_zone.h b/base/allocator/allocator_shim_override_mac_default_zone.h
new file mode 100644
index 0000000..c2a68f4f
--- /dev/null
+++ b/base/allocator/allocator_shim_override_mac_default_zone.h
@@ -0,0 +1,223 @@
+// Copyright 2021 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.
+
+#ifdef BASE_ALLOCATOR_ALLOCATOR_SHIM_OVERRIDE_MAC_DEFAULT_ZONE_H_
+#error This header is meant to be included only once by allocator_shim.cc
+#endif
+#define BASE_ALLOCATOR_ALLOCATOR_SHIM_OVERRIDE_MAC_DEFAULT_ZONE_H_
+
+namespace base {
+namespace allocator {
+
+namespace {
+
+// malloc_introspection_t's callback functions for our own zone
+
+kern_return_t MallocIntrospectionEnumerator(task_t task,
+                                            void*,
+                                            unsigned type_mask,
+                                            vm_address_t zone_address,
+                                            memory_reader_t reader,
+                                            vm_range_recorder_t recorder) {
+  NOTREACHED();
+  return KERN_FAILURE;
+}
+
+size_t MallocIntrospectionGoodSize(malloc_zone_t* zone, size_t size) {
+  return size;
+}
+
+boolean_t MallocIntrospectionCheck(malloc_zone_t* zone) {
+  NOTREACHED();
+  return true;
+}
+
+void MallocIntrospectionPrint(malloc_zone_t* zone, boolean_t verbose) {
+  NOTREACHED();
+}
+
+void MallocIntrospectionLog(malloc_zone_t* zone, void* address) {
+  NOTREACHED();
+}
+
+void MallocIntrospectionForceLock(malloc_zone_t* zone) {
+  NOTREACHED();
+}
+
+void MallocIntrospectionForceUnlock(malloc_zone_t* zone) {
+  NOTREACHED();
+}
+
+void MallocIntrospectionStatistics(malloc_zone_t* zone,
+                                   malloc_statistics_t* stats) {
+  NOTREACHED();
+}
+
+boolean_t MallocIntrospectionZoneLocked(malloc_zone_t* zone) {
+  NOTREACHED();
+  return false;
+}
+
+boolean_t MallocIntrospectionEnableDischargeChecking(malloc_zone_t* zone) {
+  NOTREACHED();
+  return false;
+}
+
+void MallocIntrospectionDisableDischargeChecking(malloc_zone_t* zone) {
+  NOTREACHED();
+}
+
+void MallocIntrospectionDischarge(malloc_zone_t* zone, void* memory) {
+  NOTREACHED();
+}
+
+void MallocIntrospectionEnumerateDischargedPointers(
+    malloc_zone_t* zone,
+    void (^report_discharged)(void* memory, void* info)) {
+  NOTREACHED();
+}
+
+void MallocIntrospectionReinitLock(malloc_zone_t* zone) {
+  NOTREACHED();
+}
+
+void MallocIntrospectionPrintTask(task_t task,
+                                  unsigned level,
+                                  vm_address_t zone_address,
+                                  memory_reader_t reader,
+                                  print_task_printer_t printer) {
+  NOTREACHED();
+}
+
+void MallocIntrospectionTaskStatistics(task_t task,
+                                       vm_address_t zone_address,
+                                       memory_reader_t reader,
+                                       malloc_statistics_t* stats) {
+  NOTREACHED();
+}
+
+// malloc_zone_t's callback functions for our own zone
+
+size_t MallocZoneSize(malloc_zone_t* zone, const void* ptr) {
+  return ShimGetSizeEstimate(ptr, nullptr);
+}
+
+void* MallocZoneMalloc(malloc_zone_t* zone, size_t size) {
+  return ShimMalloc(size, nullptr);
+}
+
+void* MallocZoneCalloc(malloc_zone_t* zone, size_t n, size_t size) {
+  return ShimCalloc(n, size, nullptr);
+}
+
+void* MallocZoneValloc(malloc_zone_t* zone, size_t size) {
+  return ShimValloc(size, nullptr);
+}
+
+void MallocZoneFree(malloc_zone_t* zone, void* ptr) {
+  return ShimFree(ptr, nullptr);
+}
+
+void* MallocZoneRealloc(malloc_zone_t* zone, void* ptr, size_t size) {
+  return ShimRealloc(ptr, size, nullptr);
+}
+
+void MallocZoneDestroy(malloc_zone_t* zone) {
+  NOTREACHED();
+  IMMEDIATE_CRASH();
+}
+
+void* MallocZoneMemalign(malloc_zone_t* zone, size_t alignment, size_t size) {
+  return ShimMemalign(alignment, size, nullptr);
+}
+
+void MallocZoneFreeDefiniteSize(malloc_zone_t* zone, void* ptr, size_t size) {
+  return ShimFree(ptr, nullptr);
+}
+
+malloc_introspection_t g_mac_malloc_introspection{};
+malloc_zone_t g_mac_malloc_zone{};
+
+}  // namespace
+
+void InitializeDefaultAllocatorPartitionRoot();
+
+void AddMacMallocZoneAsDefaultZone() {
+  // Instantiate the existing regular and purgeable zones in order to make the
+  // existing purgeable zone use the existing regular zone since PartitionAlloc
+  // doesn't support a purgeable zone.
+  ignore_result(malloc_default_zone());
+  ignore_result(malloc_default_purgeable_zone());
+
+  // Initialize the default allocator's PartitionRoot with the existing zone.
+  InitializeDefaultAllocatorPartitionRoot();
+
+  // Create our own malloc zone.
+  g_mac_malloc_introspection.enumerator = MallocIntrospectionEnumerator;
+  g_mac_malloc_introspection.good_size = MallocIntrospectionGoodSize;
+  g_mac_malloc_introspection.check = MallocIntrospectionCheck;
+  g_mac_malloc_introspection.print = MallocIntrospectionPrint;
+  g_mac_malloc_introspection.log = MallocIntrospectionLog;
+  g_mac_malloc_introspection.force_lock = MallocIntrospectionForceLock;
+  g_mac_malloc_introspection.force_unlock = MallocIntrospectionForceUnlock;
+  g_mac_malloc_introspection.statistics = MallocIntrospectionStatistics;
+  g_mac_malloc_introspection.zone_locked = MallocIntrospectionZoneLocked;
+  g_mac_malloc_introspection.enable_discharge_checking =
+      MallocIntrospectionEnableDischargeChecking;
+  g_mac_malloc_introspection.disable_discharge_checking =
+      MallocIntrospectionDisableDischargeChecking;
+  g_mac_malloc_introspection.discharge = MallocIntrospectionDischarge;
+  g_mac_malloc_introspection.enumerate_discharged_pointers =
+      MallocIntrospectionEnumerateDischargedPointers;
+  g_mac_malloc_introspection.reinit_lock = MallocIntrospectionReinitLock;
+  g_mac_malloc_introspection.print_task = MallocIntrospectionPrintTask;
+  g_mac_malloc_introspection.task_statistics =
+      MallocIntrospectionTaskStatistics;
+  // `version` member indicates which APIs are supported in this zone.
+  //   version >= 5: memalign is supported
+  //   version >= 6: free_definite_size is supported
+  //   version >= 8: pressure_relief is supported
+  //   version >= 10: claimed_address is supported
+  g_mac_malloc_zone.version = 6;
+  g_mac_malloc_zone.zone_name = "PartitionAlloc";
+  g_mac_malloc_zone.introspect = &g_mac_malloc_introspection;
+  g_mac_malloc_zone.size = MallocZoneSize;
+  g_mac_malloc_zone.malloc = MallocZoneMalloc;
+  g_mac_malloc_zone.calloc = MallocZoneCalloc;
+  g_mac_malloc_zone.valloc = MallocZoneValloc;
+  g_mac_malloc_zone.free = MallocZoneFree;
+  g_mac_malloc_zone.realloc = MallocZoneRealloc;
+  g_mac_malloc_zone.destroy = MallocZoneDestroy;
+  g_mac_malloc_zone.batch_malloc = nullptr;
+  g_mac_malloc_zone.batch_free = nullptr;
+  g_mac_malloc_zone.memalign = MallocZoneMemalign;
+  g_mac_malloc_zone.free_definite_size = MallocZoneFreeDefiniteSize;
+  g_mac_malloc_zone.pressure_relief = nullptr;
+  g_mac_malloc_zone.claimed_address = nullptr;
+
+  // Install our own malloc zone.
+  malloc_zone_register(&g_mac_malloc_zone);
+
+  // Make our own zone the default zone.
+  for (unsigned int retry_count = 0;; ++retry_count) {
+    vm_address_t* zones = nullptr;
+    unsigned int zone_count = 0;
+    kern_return_t result =
+        malloc_get_all_zones(mach_task_self(), nullptr, &zones, &zone_count);
+    MACH_CHECK(result == KERN_SUCCESS, result) << "malloc_get_all_zones";
+
+    malloc_zone_t* top_zone = reinterpret_cast<malloc_zone_t*>(zones[0]);
+    if (top_zone == &g_mac_malloc_zone) {
+      break;  // Our own malloc zone is now the default zone.
+    }
+    CHECK_LE(retry_count, zone_count);
+
+    // Reorder malloc zones so that our own zone becomes the default one.
+    malloc_zone_unregister(top_zone);
+    malloc_zone_register(top_zone);
+  }
+}
+
+}  // namespace allocator
+}  // namespace base
diff --git a/base/allocator/partition_allocator/starscan/pcscan.cc b/base/allocator/partition_allocator/starscan/pcscan.cc
index e0c5228a..313490e1 100644
--- a/base/allocator/partition_allocator/starscan/pcscan.cc
+++ b/base/allocator/partition_allocator/starscan/pcscan.cc
@@ -6,7 +6,6 @@
 
 #include <algorithm>
 #include <array>
-#include <atomic>
 #include <condition_variable>
 #include <mutex>
 #include <numeric>
@@ -1358,7 +1357,7 @@
 
 void PCScanTask::FinishScanner() {
   stats_.ReportTracesAndHists();
-  LogStats(stats_.swept_size(), pcscan_.quarantine_data_.quarantine_size(),
+  LogStats(stats_.swept_size(), pcscan_.quarantine_data_.last_size(),
            stats_.survived_quarantine_size());
 
   const size_t total_pa_heap_size =
@@ -1496,10 +1495,10 @@
   TaskHandle posted_task_;
 };
 
-constexpr intptr_t PCScan::QuarantineData::kQuarantineSizeMinLimit;
+constexpr size_t PCScan::QuarantineData::kQuarantineSizeMinLimit;
 
 void PCScan::QuarantineData::ResetAndAdvanceEpoch() {
-  quarantine_size_ = limit_ - trigger_limit_.load(std::memory_order_relaxed);
+  last_size_ = current_size_.exchange(0, std::memory_order_relaxed);
   epoch_.fetch_add(1, std::memory_order_relaxed);
 }
 
@@ -1507,15 +1506,10 @@
   static constexpr double kQuarantineSizeFraction = 0.1;
   // |heap_size| includes the current quarantine size, we intentionally leave
   // some slack till hitting the limit.
-  limit_ = std::max(kQuarantineSizeMinLimit,
-                    static_cast<intptr_t>(kQuarantineSizeFraction * heap_size));
-  // Force a new scan on the next deallocation if the too many deallocations
-  // accumulated during the current scan.
-  const intptr_t old_trigger_limit =
-      trigger_limit_.fetch_add(limit_, std::memory_order_relaxed);
-  if (old_trigger_limit + limit_ < 0) {
-    trigger_limit_.store(0, std::memory_order_relaxed);
-  }
+  size_limit_.store(
+      std::max(kQuarantineSizeMinLimit,
+               static_cast<size_t>(kQuarantineSizeFraction * heap_size)),
+      std::memory_order_relaxed);
 }
 
 void PCScan::PerformScan(InvocationMode invocation_mode) {
diff --git a/base/allocator/partition_allocator/starscan/pcscan.h b/base/allocator/partition_allocator/starscan/pcscan.h
index e31b9f4..ab4ce44 100644
--- a/base/allocator/partition_allocator/starscan/pcscan.h
+++ b/base/allocator/partition_allocator/starscan/pcscan.h
@@ -107,25 +107,22 @@
     void ResetAndAdvanceEpoch();
 
     size_t epoch() const { return epoch_.load(std::memory_order_relaxed); }
-    size_t limit() const { return limit_; }
-
-    size_t quarantine_size() const { return quarantine_size_; }
+    size_t size() const {
+      return current_size_.load(std::memory_order_relaxed);
+    }
+    size_t last_size() const { return last_size_; }
 
     bool MinimumScanningThresholdReached() const {
-      return limit_ - trigger_limit_.load(std::memory_order_relaxed) >
-             kQuarantineSizeMinLimit;
+      return size() > kQuarantineSizeMinLimit;
     }
 
    private:
-    static constexpr intptr_t kQuarantineSizeMinLimit = 1 * 1024 * 1024;
+    static constexpr size_t kQuarantineSizeMinLimit = 1 * 1024 * 1024;
 
-    // The next scan will be triggered after limit_ deallocations.
-    intptr_t limit_{kQuarantineSizeMinLimit};
-    // Deallocations decrement from this counter. When it reaches <=0 a scan
-    // is triggered.
-    std::atomic<intptr_t> trigger_limit_{limit_};
+    std::atomic<size_t> current_size_{0u};
+    std::atomic<size_t> size_limit_{kQuarantineSizeMinLimit};
     std::atomic<size_t> epoch_{0u};
-    size_t quarantine_size_ = 0;
+    size_t last_size_ = 0;
   };
 
   enum class State : uint8_t {
@@ -166,11 +163,8 @@
 constexpr PCScan::QuarantineData::QuarantineData() = default;
 
 ALWAYS_INLINE bool PCScan::QuarantineData::Account(size_t size) {
-  const intptr_t trigger_limit_before =
-      trigger_limit_.fetch_sub(size, std::memory_order_relaxed);
-  const intptr_t trigger_limit_after =
-      trigger_limit_before - static_cast<intptr_t>(size);
-  return trigger_limit_before >= 0 && trigger_limit_after < 0;
+  size_t size_before = current_size_.fetch_add(size, std::memory_order_relaxed);
+  return size_before + size > size_limit_.load(std::memory_order_relaxed);
 }
 
 // To please Chromium's clang plugin.
diff --git a/build/fuchsia/linux.sdk.sha1 b/build/fuchsia/linux.sdk.sha1
index db9268b4..c9c6568 100644
--- a/build/fuchsia/linux.sdk.sha1
+++ b/build/fuchsia/linux.sdk.sha1
@@ -1 +1 @@
-3.20210328.0.1
+3.20210329.0.1
diff --git a/build/fuchsia/mac.sdk.sha1 b/build/fuchsia/mac.sdk.sha1
index db9268b4..c9c6568 100644
--- a/build/fuchsia/mac.sdk.sha1
+++ b/build/fuchsia/mac.sdk.sha1
@@ -1 +1 @@
-3.20210328.0.1
+3.20210329.0.1
diff --git a/build/lacros/mojo_connection_lacros_launcher.py b/build/lacros/mojo_connection_lacros_launcher.py
index e863685..786176e3 100755
--- a/build/lacros/mojo_connection_lacros_launcher.py
+++ b/build/lacros/mojo_connection_lacros_launcher.py
@@ -36,6 +36,9 @@
 import subprocess
 
 
+_NUM_FDS_MAX = 3
+
+
 # contextlib.nullcontext is introduced in 3.7, while Python version on
 # CrOS is still 3.6. This is for backward compatibility.
 class NullContext:
@@ -63,7 +66,8 @@
   fds = array.array("i")  # Array of ints
   # Along with the file descriptor, ash-chrome also sends the version in the
   # regular data.
-  version, ancdata, _, _ = sock.recvmsg(1, socket.CMSG_LEN(fds.itemsize))
+  version, ancdata, _, _ = sock.recvmsg(
+      1, socket.CMSG_LEN(fds.itemsize * _NUM_FDS_MAX))
   for cmsg_level, cmsg_type, cmsg_data in ancdata:
     if cmsg_level == socket.SOL_SOCKET and cmsg_type == socket.SCM_RIGHTS:
       # There are three versions currently this script supports.
@@ -78,8 +82,10 @@
       # oldest one after M91.
       # TODO(crbug.com/1180712): Clean up the mojo procedure support of the
       # the middle one after M92.
-      assert len(cmsg_data) in (fds.itemsize, fds.itemsize * 2, fds.itemsize *
-                                3), ('Expecting exactly 1, 2, or 3 FDs')
+      cmsg_len_candidates = [(i + 1) * fds.itemsize
+                             for i in range(_NUM_FDS_MAX)]
+      assert len(cmsg_data) in cmsg_len_candidates, (
+          'CMSG_LEN is unexpected: %d' % (len(cmsg_data), ))
       fds.frombytes(cmsg_data[:])
 
   assert version == b'\x00', 'Expecting version code to be 0'
diff --git a/build/symlink.py b/build/symlink.py
index 6c0586b..0f90696 100755
--- a/build/symlink.py
+++ b/build/symlink.py
@@ -7,15 +7,14 @@
 Make a symlink and optionally touch a file (to handle dependencies).
 """
 usage = "%prog [options] source[ source ...] linkname"
-epilog = """
-A sym link to source is created at linkname. If multiple sources are specfied,
+epilog = """\
+A symlink to source is created at linkname. If multiple sources are specified,
 then linkname is assumed to be a directory, and will contain all the links to
 the sources (basenames identical to their source).
 
 On Windows, this will use hard links (mklink /H) to avoid requiring elevation.
 This means that if the original is deleted and replaced, the link will still
-have the old contents. This is not expected to interfere with the Chromium
-build.
+have the old contents.
 """
 
 import errno
@@ -84,7 +83,7 @@
 
 
   if options.touch:
-    with open(options.touch, 'w') as f:
+    with open(options.touch, 'w'):
       pass
 
 
diff --git a/buildtools/mac/clang-format.sha1 b/buildtools/mac/clang-format.sha1
index feb8155..ab9b8273 100644
--- a/buildtools/mac/clang-format.sha1
+++ b/buildtools/mac/clang-format.sha1
@@ -1 +1 @@
-ae6765c699ed32e9dca305645456dcdf5cda0438
\ No newline at end of file
+12625542faa127039e54b0d97efd5c29ce97f275
\ No newline at end of file
diff --git a/chrome/VERSION b/chrome/VERSION
index bba6b083..4d2a7e4 100644
--- a/chrome/VERSION
+++ b/chrome/VERSION
@@ -1,4 +1,4 @@
 MAJOR=91
 MINOR=0
-BUILD=4462
+BUILD=4463
 PATCH=0
diff --git a/chrome/android/chrome_java_sources.gni b/chrome/android/chrome_java_sources.gni
index a4a8de1..cb2747d 100644
--- a/chrome/android/chrome_java_sources.gni
+++ b/chrome/android/chrome_java_sources.gni
@@ -1195,10 +1195,10 @@
   "java/src/org/chromium/chrome/browser/signin/SigninActivity.java",
   "java/src/org/chromium/chrome/browser/signin/SigninActivityLauncherImpl.java",
   "java/src/org/chromium/chrome/browser/signin/SigninBridge.java",
-  "java/src/org/chromium/chrome/browser/signin/SigninFragmentBase.java",
   "java/src/org/chromium/chrome/browser/signin/SigninHelperProvider.java",
   "java/src/org/chromium/chrome/browser/signin/SigninManagerImpl.java",
   "java/src/org/chromium/chrome/browser/signin/SyncConsentFragment.java",
+  "java/src/org/chromium/chrome/browser/signin/SyncConsentFragmentBase.java",
   "java/src/org/chromium/chrome/browser/signin/SyncPromoView.java",
   "java/src/org/chromium/chrome/browser/site_settings/ChromeSiteSettingsDelegate.java",
   "java/src/org/chromium/chrome/browser/site_settings/CookieControlsServiceBridge.java",
diff --git a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/v2/FeedProcessScopeDependencyProvider.java b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/v2/FeedProcessScopeDependencyProvider.java
index 8def531..7de82ac6 100644
--- a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/v2/FeedProcessScopeDependencyProvider.java
+++ b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/v2/FeedProcessScopeDependencyProvider.java
@@ -64,7 +64,7 @@
         CoreAccountInfo primaryAccount =
                 IdentityServicesProvider.get()
                         .getIdentityManager(Profile.getLastUsedRegularProfile())
-                        .getPrimaryAccountInfo(ConsentLevel.NOT_REQUIRED);
+                        .getPrimaryAccountInfo(ConsentLevel.SIGNIN);
         return (primaryAccount == null) ? "" : primaryAccount.getEmail();
     }
 
diff --git a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/v2/FeedStreamSurface.java b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/v2/FeedStreamSurface.java
index c6b7895..19aab51 100644
--- a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/v2/FeedStreamSurface.java
+++ b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/v2/FeedStreamSurface.java
@@ -282,7 +282,7 @@
             CoreAccountInfo primaryAccount =
                     IdentityServicesProvider.get()
                             .getIdentityManager(Profile.getLastUsedRegularProfile())
-                            .getPrimaryAccountInfo(ConsentLevel.NOT_REQUIRED);
+                            .getPrimaryAccountInfo(ConsentLevel.SIGNIN);
             return (primaryAccount == null) ? "" : primaryAccount.getEmail();
         }
 
diff --git a/chrome/android/java/src/PRESUBMIT.py b/chrome/android/java/src/PRESUBMIT.py
index 11c0b1f..13e5b05 100644
--- a/chrome/android/java/src/PRESUBMIT.py
+++ b/chrome/android/java/src/PRESUBMIT.py
@@ -96,7 +96,7 @@
       SIGNIN_UI_BROWSER_ROOT + 'ConfirmImportSyncDataDialog.java',
       SIGNIN_UI_BROWSER_ROOT + 'ConfirmManagedSyncDataDialog.java',
       SIGNIN_UI_BROWSER_ROOT + 'ConfirmSyncDataStateMachineDelegate.java',
-      BROWSER_ROOT + 'signin/SigninFragmentBase.java',
+      BROWSER_ROOT + 'signin/SyncConsentFragmentBase.java',
       SIGNIN_UI_BROWSER_ROOT + 'SignOutDialogFragment.java',
       BROWSER_ROOT + 'site_settings/AddExceptionPreference.java',
       BROWSER_ROOT + 'site_settings/ChosenObjectSettings.java',
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkPromoHeader.java b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkPromoHeader.java
index 98d77d0..0995f5f 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkPromoHeader.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkPromoHeader.java
@@ -226,8 +226,7 @@
                 return PromoState.PROMO_NONE;
             }
             CoreAccountInfo primaryAccount =
-                    mSignInManager.getIdentityManager().getPrimaryAccountInfo(
-                            ConsentLevel.NOT_REQUIRED);
+                    mSignInManager.getIdentityManager().getPrimaryAccountInfo(ConsentLevel.SIGNIN);
             return primaryAccount == null ? PromoState.PROMO_SIGNIN_PERSONALIZED
                                           : PromoState.PROMO_SYNC_PERSONALIZED;
         }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/SyncConsentFirstRunFragment.java b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/SyncConsentFirstRunFragment.java
index 7c318f3..91b9db7 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/SyncConsentFirstRunFragment.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/SyncConsentFirstRunFragment.java
@@ -14,7 +14,7 @@
 import org.chromium.base.metrics.RecordUserAction;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ntp.cards.SignInPromo;
-import org.chromium.chrome.browser.signin.SigninFragmentBase;
+import org.chromium.chrome.browser.signin.SyncConsentFragmentBase;
 import org.chromium.components.signin.AccountManagerFacadeProvider;
 import org.chromium.components.signin.ChildAccountStatus;
 import org.chromium.components.signin.metrics.SigninAccessPoint;
@@ -22,9 +22,10 @@
 import java.util.List;
 
 /**
- * Implementation of {@link SigninFragmentBase} for the first run experience.
+ * Implementation of {@link SyncConsentFragmentBase} for the first run experience.
  */
-public class SyncConsentFirstRunFragment extends SigninFragmentBase implements FirstRunFragment {
+public class SyncConsentFirstRunFragment
+        extends SyncConsentFragmentBase implements FirstRunFragment {
     // Per-page parameters:
     // TODO(crbug/1168516): Remove CHILD_ACCOUNT_STATUS
     public static final String CHILD_ACCOUNT_STATUS = "ChildAccountStatus";
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/identity_disc/IdentityDiscController.java b/chrome/android/java/src/org/chromium/chrome/browser/identity_disc/IdentityDiscController.java
index 5e17d8e..5eb8641 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/identity_disc/IdentityDiscController.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/identity_disc/IdentityDiscController.java
@@ -265,7 +265,7 @@
      */
     @Override
     public void onPrimaryAccountChanged(PrimaryAccountChangeEvent eventDetails) {
-        switch (eventDetails.getEventTypeFor(ConsentLevel.NOT_REQUIRED)) {
+        switch (eventDetails.getEventTypeFor(ConsentLevel.SIGNIN)) {
             case PrimaryAccountChangeEvent.Type.SET:
                 resetIdentityDiscCache();
                 notifyObservers(true);
@@ -325,7 +325,7 @@
         @ConsentLevel
         int consentLevel =
                 ChromeFeatureList.isEnabled(ChromeFeatureList.MOBILE_IDENTITY_CONSISTENCY)
-                ? ConsentLevel.NOT_REQUIRED
+                ? ConsentLevel.SIGNIN
                 : ConsentLevel.SYNC;
         return mIdentityManager != null ? mIdentityManager.getPrimaryAccountInfo(consentLevel)
                                         : null;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/RecentTabsManager.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/RecentTabsManager.java
index ebfd3dfe..0134e2e9 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/RecentTabsManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/RecentTabsManager.java
@@ -376,7 +376,7 @@
             }
             if (ChromeFeatureList.isEnabled(ChromeFeatureList.MOBILE_IDENTITY_CONSISTENCY)
                     && mSignInManager.getIdentityManager().getPrimaryAccountInfo(
-                               ConsentLevel.NOT_REQUIRED)
+                               ConsentLevel.SIGNIN)
                             != null) {
                 return PromoState.PROMO_SYNC_PERSONALIZED;
             }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/SignInPromo.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/SignInPromo.java
index 91f9717..6c67f45 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/SignInPromo.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/SignInPromo.java
@@ -138,7 +138,7 @@
         }
         IdentityManager identityManager = IdentityServicesProvider.get().getIdentityManager(
                 Profile.getLastUsedRegularProfile());
-        return identityManager.getPrimaryAccountInfo(ConsentLevel.NOT_REQUIRED) != null
+        return identityManager.getPrimaryAccountInfo(ConsentLevel.SIGNIN) != null
                 && identityManager.getPrimaryAccountInfo(ConsentLevel.SYNC) == null;
     }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/services/AccountsChangedReceiver.java b/chrome/android/java/src/org/chromium/chrome/browser/services/AccountsChangedReceiver.java
index 12dfa79..6506201 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/services/AccountsChangedReceiver.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/services/AccountsChangedReceiver.java
@@ -24,6 +24,10 @@
  * This receiver is notified when accounts are added, accounts are removed, or
  * an account's credentials (saved password, etc) are changed.
  * All public methods must be called from the UI thread.
+ *
+ * TODO(crbug/1193412): We can trigger the signed-in account validation directly
+ * after the seeding to avoid listening to the same LOGIN_ACCOUNTS_CHANGED_ACTION
+ * event in two different places.
  */
 public class AccountsChangedReceiver extends BroadcastReceiver {
     @Override
@@ -44,15 +48,10 @@
                     AccountTrackerService trackerService =
                             IdentityServicesProvider.get().getAccountTrackerService(
                                     Profile.getLastUsedRegularProfile());
-                    // TODO(bsazonov): Check whether invalidateAccountSeedStatus is needed here.
-                    trackerService.invalidateAccountSeedStatus(false /* don't refresh right now */);
+                    trackerService.seedAccounts();
                     SigninHelperProvider.get().validateAccountSettings();
                 });
             }
-
-            @Override
-            public void onStartupFailure(Exception failureCause) {
-            }
         };
         ChromeBrowserInitializer.getInstance().handlePreNativeStartupAndLoadLibraries(parts);
         ChromeBrowserInitializer.getInstance().handlePostNativeStartup(true, parts);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/settings/MainSettings.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/MainSettings.java
index 949f5a97..3ad2ee3 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/settings/MainSettings.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/MainSettings.java
@@ -291,7 +291,7 @@
         String primaryAccountName = CoreAccountInfo.getEmailFrom(
                 IdentityServicesProvider.get()
                         .getIdentityManager(Profile.getLastUsedRegularProfile())
-                        .getPrimaryAccountInfo(ConsentLevel.NOT_REQUIRED));
+                        .getPrimaryAccountInfo(ConsentLevel.SIGNIN));
         boolean showManageSync =
                 ChromeFeatureList.isEnabled(ChromeFeatureList.MOBILE_IDENTITY_CONSISTENCY)
                 && primaryAccountName != null;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninActivity.java
index ead49519..885af41 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninActivity.java
@@ -17,7 +17,7 @@
 
 /**
  * Allows the user to pick an account, sign in and enable sync. Started from Settings and various
- * sign-in promos. For more details see {@link SigninFragmentBase}.
+ * sign-in promos. For more details see {@link SyncConsentFragmentBase}.
  */
 // TODO(https://crbug.com/820491): extend AsyncInitializationActivity.
 public class SigninActivity extends ChromeBaseAppCompatActivity {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninActivityLauncherImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninActivityLauncherImpl.java
index 2791a2fe..9bb889d 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninActivityLauncherImpl.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninActivityLauncherImpl.java
@@ -90,7 +90,7 @@
         SigninManager signinManager = IdentityServicesProvider.get().getSigninManager(
                 Profile.getLastUsedRegularProfile());
         if (signinManager.isSignInAllowed()) {
-            launchInternal(context, SigninFragmentBase.createArguments(accessPoint, null));
+            launchInternal(context, SyncConsentFragmentBase.createArguments(accessPoint, null));
             return true;
         }
         if (signinManager.isSigninDisabledByPolicy()) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninManagerImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninManagerImpl.java
index 305718b..8a9d2496 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninManagerImpl.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninManagerImpl.java
@@ -134,7 +134,7 @@
                     mIdentityManager::forceRefreshOfExtendedAccountInfo);
         }
         mIdentityMutator.reloadAllAccountsFromSystemWithPrimaryAccount(CoreAccountInfo.getIdFrom(
-                mIdentityManager.getPrimaryAccountInfo(ConsentLevel.NOT_REQUIRED)));
+                mIdentityManager.getPrimaryAccountInfo(ConsentLevel.SIGNIN)));
 
         maybeRollbackMobileIdentityConsistency();
     }
@@ -158,7 +158,7 @@
     private void maybeRollbackMobileIdentityConsistency() {
         if (ChromeFeatureList.isEnabled(ChromeFeatureList.MOBILE_IDENTITY_CONSISTENCY)) return;
         // Nothing to do if there's no primary account.
-        if (mIdentityManager.getPrimaryAccountInfo(ConsentLevel.NOT_REQUIRED) == null) return;
+        if (mIdentityManager.getPrimaryAccountInfo(ConsentLevel.SIGNIN) == null) return;
         // Nothing to do if sync is on - this state existed before MobileIdentityConsistency.
         if (mIdentityManager.getPrimaryAccountInfo(ConsentLevel.SYNC) != null) return;
 
@@ -409,7 +409,7 @@
 
         @ConsentLevel
         int consentLevel =
-                mSignInState.shouldTurnSyncOn() ? ConsentLevel.SYNC : ConsentLevel.NOT_REQUIRED;
+                mSignInState.shouldTurnSyncOn() ? ConsentLevel.SYNC : ConsentLevel.SIGNIN;
         if (!mIdentityMutator.setPrimaryAccount(
                     mSignInState.mCoreAccountInfo.getId(), consentLevel)) {
             Log.w(TAG, "Failed to set the PrimaryAccount in IdentityManager, aborting signin");
@@ -441,8 +441,8 @@
             RecordUserAction.record("Signin_Signin_Succeed");
             RecordHistogram.recordEnumeratedHistogram("Signin.SigninCompletedAccessPoint",
                     mSignInState.getAccessPoint(), SigninAccessPoint.MAX);
-            RecordHistogram.recordEnumeratedHistogram(
-                    "Signin.SigninReason", SigninReason.SIGNIN_PRIMARY_ACCOUNT, SigninReason.MAX);
+            RecordHistogram.recordEnumeratedHistogram("Signin.SigninReason",
+                    SigninReason.REASON_SIGNIN_PRIMARY_ACCOUNT, SigninReason.MAX_VALUE + 1);
         }
 
         if (mSignInState.mCallback != null) {
@@ -476,7 +476,7 @@
                 // - Syncing account is signed out. User may choose to delete data from UI prompt
                 //   if account is not managed. In this case mSigninOutState is set.
                 // - RevokeSyncConsent() is called in native code. In this case the user may still
-                //   be signed in with Consentlevel::NOT_REQUIRED and just lose sync privileges.
+                //   be signed in with Consentlevel::SIGNIN and just lose sync privileges.
                 //   If the account is managed then the data should be wiped.
                 //
                 //   TODO(https://crbug.com/1173016): It might be too late to get management status
@@ -493,7 +493,7 @@
                 disableSyncAndWipeData(mSignOutState.mShouldWipeUserData, this::finishSignOut);
                 break;
             case PrimaryAccountChangeEvent.Type.NONE:
-                if (eventDetails.getEventTypeFor(ConsentLevel.NOT_REQUIRED)
+                if (eventDetails.getEventTypeFor(ConsentLevel.SIGNIN)
                         == PrimaryAccountChangeEvent.Type.CLEARED) {
                     if (mSignOutState == null) {
                         // Don't wipe data as the user is not syncing.
@@ -626,7 +626,7 @@
 
     @Override
     public void onAccountsCookieDeletedByUserAction() {
-        if (mIdentityManager.getPrimaryAccountInfo(ConsentLevel.NOT_REQUIRED) != null
+        if (mIdentityManager.getPrimaryAccountInfo(ConsentLevel.SIGNIN) != null
                 && mIdentityManager.getPrimaryAccountInfo(ConsentLevel.SYNC) == null) {
             // Clearing account cookies should trigger sign-out only when user is signed in
             // without sync.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/signin/SyncConsentFragment.java b/chrome/android/java/src/org/chromium/chrome/browser/signin/SyncConsentFragment.java
index 1f726f92..6dca9c55 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/signin/SyncConsentFragment.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/signin/SyncConsentFragment.java
@@ -30,8 +30,8 @@
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 
-/** Implementation of {@link SigninFragmentBase} for {@link SigninActivity}. */
-public class SyncConsentFragment extends SigninFragmentBase {
+/** Implementation of {@link SyncConsentFragmentBase} for {@link SigninActivity}. */
+public class SyncConsentFragment extends SyncConsentFragmentBase {
     private static final String ARGUMENT_PERSONALIZED_PROMO_ACTION =
             "SigninFragment.PersonalizedPromoAction";
 
@@ -54,7 +54,7 @@
      */
     public static Bundle createArgumentsForPromoDefaultFlow(
             @SigninAccessPoint int accessPoint, String accountName) {
-        Bundle result = SigninFragmentBase.createArguments(accessPoint, accountName);
+        Bundle result = SyncConsentFragmentBase.createArguments(accessPoint, accountName);
         result.putInt(ARGUMENT_PERSONALIZED_PROMO_ACTION, PromoAction.WITH_DEFAULT);
         return result;
     }
@@ -67,8 +67,8 @@
      */
     public static Bundle createArgumentsForPromoChooseAccountFlow(
             @SigninAccessPoint int accessPoint, String accountName) {
-        Bundle result =
-                SigninFragmentBase.createArgumentsForChooseAccountFlow(accessPoint, accountName);
+        Bundle result = SyncConsentFragmentBase.createArgumentsForChooseAccountFlow(
+                accessPoint, accountName);
         result.putInt(ARGUMENT_PERSONALIZED_PROMO_ACTION, PromoAction.NOT_DEFAULT);
         return result;
     }
@@ -79,7 +79,7 @@
      * @param accessPoint The access point for starting sign-in flow.
      */
     public static Bundle createArgumentsForPromoAddAccountFlow(@SigninAccessPoint int accessPoint) {
-        Bundle result = SigninFragmentBase.createArgumentsForAddAccountFlow(accessPoint);
+        Bundle result = SyncConsentFragmentBase.createArgumentsForAddAccountFlow(accessPoint);
         result.putInt(ARGUMENT_PERSONALIZED_PROMO_ACTION, PromoAction.NEW_ACCOUNT);
         return result;
     }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninFragmentBase.java b/chrome/android/java/src/org/chromium/chrome/browser/signin/SyncConsentFragmentBase.java
similarity index 99%
rename from chrome/android/java/src/org/chromium/chrome/browser/signin/SigninFragmentBase.java
rename to chrome/android/java/src/org/chromium/chrome/browser/signin/SyncConsentFragmentBase.java
index 1aafb5e..f2392a4 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninFragmentBase.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/signin/SyncConsentFragmentBase.java
@@ -74,7 +74,7 @@
  * Derived classes must implement {@link #onSigninAccepted}/{@link #onSigninRefused} to define
  * what happens after the signin flow.
  */
-public abstract class SigninFragmentBase
+public abstract class SyncConsentFragmentBase
         extends Fragment implements AccountPickerCoordinator.Listener {
     private static final String TAG = "SigninFragmentBase";
 
@@ -186,7 +186,7 @@
         return result;
     }
 
-    protected SigninFragmentBase() {
+    protected SyncConsentFragmentBase() {
         mAccountManagerFacade = AccountManagerFacadeProvider.getInstance();
         mAccountsChangedObserver = this::triggerUpdateAccounts;
         mProfileDataCacheObserver = this::updateProfileData;
@@ -489,8 +489,7 @@
                 mConsentTextTracker.recordConsent(new CoreAccountId(accountId),
                         ConsentAuditorFeature.CHROME_SYNC, confirmationView, mView);
             }
-        }
-                .executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
+        }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
     }
 
     private void showAccountPicker() {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/sync/settings/AccountManagementFragment.java b/chrome/android/java/src/org/chromium/chrome/browser/sync/settings/AccountManagementFragment.java
index e5e1352..a9433a3 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/sync/settings/AccountManagementFragment.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/sync/settings/AccountManagementFragment.java
@@ -162,7 +162,7 @@
                         .getPrimaryAccountInfo(
                                 ChromeFeatureList.isEnabled(
                                         ChromeFeatureList.MOBILE_IDENTITY_CONSISTENCY)
-                                        ? ConsentLevel.NOT_REQUIRED
+                                        ? ConsentLevel.SIGNIN
                                         : ConsentLevel.SYNC));
         if (mSignedInAccountName == null) {
             // The AccountManagementFragment can only be shown when the user is signed in. If the
@@ -404,7 +404,7 @@
         // we do not hit a native crash.
         if (IdentityServicesProvider.get()
                         .getIdentityManager(Profile.getLastUsedRegularProfile())
-                        .getPrimaryAccountInfo(ConsentLevel.NOT_REQUIRED)
+                        .getPrimaryAccountInfo(ConsentLevel.SIGNIN)
                 == null) {
             return;
         }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/sync/settings/GoogleServicesSettings.java b/chrome/android/java/src/org/chromium/chrome/browser/sync/settings/GoogleServicesSettings.java
index 1ae9e04..fce0c5c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/sync/settings/GoogleServicesSettings.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/sync/settings/GoogleServicesSettings.java
@@ -173,7 +173,7 @@
             IdentityManager identityManager = IdentityServicesProvider.get().getIdentityManager(
                     Profile.getLastUsedRegularProfile());
             boolean shouldSignUserOut =
-                    identityManager.getPrimaryAccountInfo(ConsentLevel.NOT_REQUIRED) != null
+                    identityManager.getPrimaryAccountInfo(ConsentLevel.SIGNIN) != null
                     && !((boolean) newValue);
             if (!shouldSignUserOut) {
                 mPrefService.setBoolean(Pref.SIGNIN_ALLOWED, (boolean) newValue);
@@ -290,7 +290,7 @@
         // we do not hit a native crash.
         if (IdentityServicesProvider.get()
                         .getIdentityManager(Profile.getLastUsedRegularProfile())
-                        .getPrimaryAccountInfo(ConsentLevel.NOT_REQUIRED)
+                        .getPrimaryAccountInfo(ConsentLevel.SIGNIN)
                 == null) {
             return;
         }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/sync/settings/SignInPreference.java b/chrome/android/java/src/org/chromium/chrome/browser/sync/settings/SignInPreference.java
index feb3329..e6c2780 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/sync/settings/SignInPreference.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/sync/settings/SignInPreference.java
@@ -135,7 +135,7 @@
         CoreAccountInfo accountInfo =
                 IdentityServicesProvider.get()
                         .getIdentityManager(Profile.getLastUsedRegularProfile())
-                        .getPrimaryAccountInfo(ConsentLevel.NOT_REQUIRED);
+                        .getPrimaryAccountInfo(ConsentLevel.SIGNIN);
         if (accountInfo != null) {
             setupSignedIn(accountInfo.getEmail());
             return;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/sync/settings/SyncPromoPreference.java b/chrome/android/java/src/org/chromium/chrome/browser/sync/settings/SyncPromoPreference.java
index bcd83b2..6412f99b 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/sync/settings/SyncPromoPreference.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/sync/settings/SyncPromoPreference.java
@@ -148,7 +148,7 @@
                 && SigninPromoController.hasNotReachedImpressionLimit(SigninAccessPoint.SETTINGS)) {
             IdentityManager identityManager = IdentityServicesProvider.get().getIdentityManager(
                     Profile.getLastUsedRegularProfile());
-            if (identityManager.getPrimaryAccountInfo(ConsentLevel.NOT_REQUIRED) == null) {
+            if (identityManager.getPrimaryAccountInfo(ConsentLevel.SIGNIN) == null) {
                 setupPersonalizedPromo(State.PERSONALIZED_SIGNIN_PROMO);
                 return;
             } else if (identityManager.getPrimaryAccountInfo(ConsentLevel.SYNC) == null) {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/sync/AccountManagementFragmentTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/sync/AccountManagementFragmentTest.java
index f8fc2a6..5166e36 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/sync/AccountManagementFragmentTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/sync/AccountManagementFragmentTest.java
@@ -171,7 +171,7 @@
                         -> Assert.assertNull("Account should be signed out!",
                                 IdentityServicesProvider.get()
                                         .getIdentityManager(Profile.getLastUsedRegularProfile())
-                                        .getPrimaryAccountInfo(ConsentLevel.NOT_REQUIRED)));
+                                        .getPrimaryAccountInfo(ConsentLevel.SIGNIN)));
     }
 
     @Test
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/sync/GoogleServicesSettingsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/sync/GoogleServicesSettingsTest.java
index 974a783..cf2edb2 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/sync/GoogleServicesSettingsTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/sync/GoogleServicesSettingsTest.java
@@ -98,7 +98,7 @@
                         -> Assert.assertNull("Account should be signed out!",
                                 IdentityServicesProvider.get()
                                         .getIdentityManager(Profile.getLastUsedRegularProfile())
-                                        .getPrimaryAccountInfo(ConsentLevel.NOT_REQUIRED)));
+                                        .getPrimaryAccountInfo(ConsentLevel.SIGNIN)));
         TestThreadUtils.runOnUiThreadBlocking(
                 ()
                         -> Assert.assertFalse("SIGNIN_ALLOWED pref should be unset",
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/signin/SigninManagerImplTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/signin/SigninManagerImplTest.java
index d43e8fe3..f5ec7dc 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/signin/SigninManagerImplTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/signin/SigninManagerImplTest.java
@@ -141,7 +141,7 @@
         // Signin without turning on sync shouldn't apply policies.
         verify(mNativeMock, never()).fetchAndApplyCloudPolicy(anyLong(), any(), any());
 
-        verify(mIdentityMutator).setPrimaryAccount(ACCOUNT_INFO.getId(), ConsentLevel.NOT_REQUIRED);
+        verify(mIdentityMutator).setPrimaryAccount(ACCOUNT_INFO.getId(), ConsentLevel.SIGNIN);
 
         verify(mAndroidSyncSettings, never()).updateAccount(any());
         verify(mAndroidSyncSettings, never()).enableChromeSync();
@@ -319,7 +319,7 @@
     @Test
     public void clearingAccountCookieTriggersSignoutWhenUserIsSignedInWithoutSync() {
         when(mIdentityManagerNativeMock.getPrimaryAccountInfo(
-                     NATIVE_IDENTITY_MANAGER, ConsentLevel.NOT_REQUIRED))
+                     NATIVE_IDENTITY_MANAGER, ConsentLevel.SIGNIN))
                 .thenReturn(ACCOUNT_INFO);
 
         mIdentityManager.onAccountsCookieDeletedByUserAction();
@@ -335,7 +335,7 @@
     @Test
     public void rollbackWhenMobileIdentityConsistencyIsDisabled() {
         when(mIdentityManagerNativeMock.getPrimaryAccountInfo(
-                     NATIVE_IDENTITY_MANAGER, ConsentLevel.NOT_REQUIRED))
+                     NATIVE_IDENTITY_MANAGER, ConsentLevel.SIGNIN))
                 .thenReturn(ACCOUNT_INFO);
 
         mSigninManager = new SigninManagerImpl(NATIVE_SIGNIN_MANAGER, mAccountTrackerService,
@@ -357,7 +357,7 @@
     @Features.EnableFeatures(ChromeFeatureList.MOBILE_IDENTITY_CONSISTENCY)
     public void noRollbackWhenMobileIdentityConsistencyIsEnabled() {
         when(mIdentityManagerNativeMock.getPrimaryAccountInfo(
-                     NATIVE_IDENTITY_MANAGER, ConsentLevel.NOT_REQUIRED))
+                     NATIVE_IDENTITY_MANAGER, ConsentLevel.SIGNIN))
                 .thenReturn(ACCOUNT_INFO);
 
         mSigninManager = new SigninManagerImpl(NATIVE_SIGNIN_MANAGER, mAccountTrackerService,
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index b6ba304..aabd5dc 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -887,6 +887,8 @@
     "net/system_network_context_manager.h",
     "net_benchmarking.cc",
     "net_benchmarking.h",
+    "nfc/chrome_nfc_permission_context_delegate.cc",
+    "nfc/chrome_nfc_permission_context_delegate.h",
     "nfc/nfc_permission_context.cc",
     "nfc/nfc_permission_context.h",
     "notifications/metrics/notification_metrics_logger.cc",
@@ -1638,8 +1640,6 @@
     "signin/identity_manager_factory.h",
     "signin/investigator_dependency_provider.cc",
     "signin/investigator_dependency_provider.h",
-    "signin/local_auth.cc",
-    "signin/local_auth.h",
     "signin/reauth_result.h",
     "signin/reauth_tab_helper.cc",
     "signin/reauth_tab_helper.h",
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index 4e84b54..4212da6 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -3089,6 +3089,9 @@
     {"stylus-battery-status", flag_descriptions::kStylusBatteryStatusName,
      flag_descriptions::kStylusBatteryStatusDescription, kOsCrOS,
      FEATURE_VALUE_TYPE(ash::features::kStylusBatteryStatus)},
+    {"wake-on-wifi-allowed", flag_descriptions::kWakeOnWifiAllowedName,
+     flag_descriptions::kWakeOnWifiAllowedDescription, kOsCrOS,
+     FEATURE_VALUE_TYPE(chromeos::features::kWakeOnWifiAllowed)},
 #endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 
 #if defined(OS_CHROMEOS)
@@ -6208,12 +6211,13 @@
     {"enable-heavy-ad-intervention",
      flag_descriptions::kHeavyAdInterventionName,
      flag_descriptions::kHeavyAdInterventionDescription, kOsAll,
-     FEATURE_VALUE_TYPE(features::kHeavyAdIntervention)},
+     FEATURE_VALUE_TYPE(heavy_ad_intervention::features::kHeavyAdIntervention)},
 
     {"heavy-ad-privacy-mitigations",
      flag_descriptions::kHeavyAdPrivacyMitigationsName,
      flag_descriptions::kHeavyAdPrivacyMitigationsDescription, kOsAll,
-     FEATURE_VALUE_TYPE(features::kHeavyAdPrivacyMitigations)},
+     FEATURE_VALUE_TYPE(
+         heavy_ad_intervention::features::kHeavyAdPrivacyMitigations)},
 
 #if !BUILDFLAG(DISABLE_FTP_SUPPORT)
     {"enable-ftp", flag_descriptions::kEnableFtpName,
diff --git a/chrome/browser/android/signin/signin_metrics_utils.cc b/chrome/browser/android/signin/signin_metrics_utils.cc
index e7b597b..63f489cc 100644
--- a/chrome/browser/android/signin/signin_metrics_utils.cc
+++ b/chrome/browser/android/signin/signin_metrics_utils.cc
@@ -51,7 +51,7 @@
     const std::vector<std::string>& gaia_ids) {
   signin::AccountsInCookieJarInfo accounts_in_cookie_jar_info =
       identity_manager->GetAccountsInCookieJar();
-  if (identity_manager->HasPrimaryAccount(signin::ConsentLevel::kNotRequired)) {
+  if (identity_manager->HasPrimaryAccount(signin::ConsentLevel::kSignin)) {
     // Account is signed in to Chrome. The metrics recorded here are only for
     // web signin.
     return false;
diff --git a/chrome/browser/ash/account_manager/account_manager_policy_controller_browsertest.cc b/chrome/browser/ash/account_manager/account_manager_policy_controller_browsertest.cc
index d481c084..a7ac11b4 100644
--- a/chrome/browser/ash/account_manager/account_manager_policy_controller_browsertest.cc
+++ b/chrome/browser/ash/account_manager/account_manager_policy_controller_browsertest.cc
@@ -169,7 +169,7 @@
                 ->GetAccountId()
                 .GetGaiaId(),
             identity_manager()
-                ->GetPrimaryAccountInfo(signin::ConsentLevel::kNotRequired)
+                ->GetPrimaryAccountInfo(signin::ConsentLevel::kSignin)
                 .gaia);
   EXPECT_EQ(ProfileHelper::Get()
                 ->GetUserByProfile(profile())
@@ -202,7 +202,7 @@
                 ->GetAccountId()
                 .GetGaiaId(),
             identity_manager()
-                ->GetPrimaryAccountInfo(signin::ConsentLevel::kNotRequired)
+                ->GetPrimaryAccountInfo(signin::ConsentLevel::kSignin)
                 .gaia);
   EXPECT_EQ(ProfileHelper::Get()
                 ->GetUserByProfile(profile())
diff --git a/chrome/browser/ash/arc/arc_support_host.cc b/chrome/browser/ash/arc/arc_support_host.cc
index 6bf5b84..423b9c8 100644
--- a/chrome/browser/ash/arc/arc_support_host.cc
+++ b/chrome/browser/ash/arc/arc_support_host.cc
@@ -722,10 +722,9 @@
 
     auto* identity_manager = IdentityManagerFactory::GetForProfile(profile_);
     // This class doesn't care about browser sync consent.
-    DCHECK(identity_manager->HasPrimaryAccount(
-        signin::ConsentLevel::kNotRequired));
-    CoreAccountId account_id = identity_manager->GetPrimaryAccountId(
-        signin::ConsentLevel::kNotRequired);
+    DCHECK(identity_manager->HasPrimaryAccount(signin::ConsentLevel::kSignin));
+    CoreAccountId account_id =
+        identity_manager->GetPrimaryAccountId(signin::ConsentLevel::kSignin);
     bool is_child = user_manager::UserManager::Get()->IsLoggedInAsChildUser();
 
     // Record acceptance of ToS if it was shown to the user, otherwise simply
diff --git a/chrome/browser/ash/arc/auth/arc_auth_service.cc b/chrome/browser/ash/arc/auth/arc_auth_service.cc
index b840778..6bf5077 100644
--- a/chrome/browser/ash/arc/auth/arc_auth_service.cc
+++ b/chrome/browser/ash/arc/auth/arc_auth_service.cc
@@ -197,7 +197,7 @@
     case mojom::ChromeAccountType::USER_ACCOUNT:
     case mojom::ChromeAccountType::CHILD_ACCOUNT:
       // IdentityManager::GetPrimaryAccountInfo(
-      //    signin::ConsentLevel::kNotRequired).email might be more appropriate
+      //    signin::ConsentLevel::kSignin).email might be more appropriate
       // here, but this is what we have done historically.
       return chromeos::ProfileHelper::Get()
           ->GetUserByProfile(profile)
@@ -484,11 +484,9 @@
     // Optionally retrieve auth code in silent mode. Use the "unconsented"
     // primary account because this class doesn't care about browser sync
     // consent.
-    DCHECK(identity_manager_->HasPrimaryAccount(
-        signin::ConsentLevel::kNotRequired));
+    DCHECK(identity_manager_->HasPrimaryAccount(signin::ConsentLevel::kSignin));
     auth_code_fetcher = CreateArcBackgroundAuthCodeFetcher(
-        identity_manager_->GetPrimaryAccountId(
-            signin::ConsentLevel::kNotRequired),
+        identity_manager_->GetPrimaryAccountId(signin::ConsentLevel::kSignin),
         initial_signin);
   }
 
diff --git a/chrome/browser/ash/arc/policy/arc_android_management_checker.cc b/chrome/browser/ash/arc/policy/arc_android_management_checker.cc
index 8e58c8d..d76b6bc 100644
--- a/chrome/browser/ash/arc/policy/arc_android_management_checker.cc
+++ b/chrome/browser/ash/arc/policy/arc_android_management_checker.cc
@@ -41,8 +41,7 @@
       IdentityManagerFactory::GetForProfile(profile);
 
   // The account is the same whether or not the user consented to browser sync.
-  return identity_manager->GetPrimaryAccountId(
-      signin::ConsentLevel::kNotRequired);
+  return identity_manager->GetPrimaryAccountId(signin::ConsentLevel::kSignin);
 }
 
 }  // namespace
diff --git a/chrome/browser/ash/arc/session/arc_play_store_enabled_preference_handler.cc b/chrome/browser/ash/arc/session/arc_play_store_enabled_preference_handler.cc
index dbc90d0..38d1dc06 100644
--- a/chrome/browser/ash/arc/session/arc_play_store_enabled_preference_handler.cc
+++ b/chrome/browser/ash/arc/session/arc_play_store_enabled_preference_handler.cc
@@ -130,12 +130,11 @@
       // setting up the state of identity_manager and enable the DCHECK instead
       // of the conditional below.
       // DCHECK(identity_manager->HasPrimaryAccount(
-      //            signin::ConsentLevel::kNotRequired));
-      if (identity_manager->HasPrimaryAccount(
-              signin::ConsentLevel::kNotRequired)) {
+      //            signin::ConsentLevel::kSignin));
+      if (identity_manager->HasPrimaryAccount(signin::ConsentLevel::kSignin)) {
         // This class doesn't care about browser sync consent.
         const CoreAccountId account_id = identity_manager->GetPrimaryAccountId(
-            signin::ConsentLevel::kNotRequired);
+            signin::ConsentLevel::kSignin);
 
         UserConsentTypes::ArcPlayTermsOfServiceConsent play_consent;
         play_consent.set_status(UserConsentTypes::NOT_GIVEN);
diff --git a/chrome/browser/ash/arc/session/arc_play_store_enabled_preference_handler_unittest.cc b/chrome/browser/ash/arc/session/arc_play_store_enabled_preference_handler_unittest.cc
index 0a7c7e1..055221d 100644
--- a/chrome/browser/ash/arc/session/arc_play_store_enabled_preference_handler_unittest.cc
+++ b/chrome/browser/ash/arc/session/arc_play_store_enabled_preference_handler_unittest.cc
@@ -123,7 +123,7 @@
         identity_test_env_profile_adaptor_->identity_test_env()
             ->identity_manager();
     return identity_manager
-        ->GetPrimaryAccountInfo(signin::ConsentLevel::kNotRequired)
+        ->GetPrimaryAccountInfo(signin::ConsentLevel::kSignin)
         .account_id;
   }
 
diff --git a/chrome/browser/ash/arc/session/arc_session_manager_browsertest.cc b/chrome/browser/ash/arc/session/arc_session_manager_browsertest.cc
index 7b0b7d78..60d5773 100644
--- a/chrome/browser/ash/arc/session/arc_session_manager_browsertest.cc
+++ b/chrome/browser/ash/arc/session/arc_session_manager_browsertest.cc
@@ -236,8 +236,7 @@
 IN_PROC_BROWSER_TEST_F(ArcSessionManagerTest, ConsumerAccount) {
   EnableArc();
   identity_test_env()->WaitForAccessTokenRequestIfNecessaryAndRespondWithToken(
-      identity_manager()->GetPrimaryAccountId(
-          signin::ConsentLevel::kNotRequired),
+      identity_manager()->GetPrimaryAccountId(signin::ConsentLevel::kSignin),
       kUnmanagedAuthToken, base::Time::Max());
   ASSERT_EQ(ArcSessionManager::State::ACTIVE,
             ArcSessionManager::Get()->state());
@@ -263,8 +262,7 @@
 IN_PROC_BROWSER_TEST_F(ArcSessionManagerTest, ManagedAndroidAccount) {
   EnableArc();
   identity_test_env()->WaitForAccessTokenRequestIfNecessaryAndRespondWithToken(
-      identity_manager()->GetPrimaryAccountId(
-          signin::ConsentLevel::kNotRequired),
+      identity_manager()->GetPrimaryAccountId(signin::ConsentLevel::kSignin),
       kManagedAuthToken, base::Time::Max());
   ArcPlayStoreDisabledWaiter().Wait();
   EXPECT_FALSE(IsArcPlayStoreEnabledForProfile(profile()));
diff --git a/chrome/browser/ash/assistant/assistant_util.cc b/chrome/browser/ash/assistant/assistant_util.cc
index b56f742..de6caeb 100644
--- a/chrome/browser/ash/assistant/assistant_util.cc
+++ b/chrome/browser/ash/assistant/assistant_util.cc
@@ -32,8 +32,7 @@
   if (!identity_manager)
     return false;
 
-  return identity_manager->HasPrimaryAccount(
-      signin::ConsentLevel::kNotRequired);
+  return identity_manager->HasPrimaryAccount(signin::ConsentLevel::kSignin);
 }
 
 bool IsGoogleDevice() {
diff --git a/chrome/browser/ash/assistant/assistant_util_unittest.cc b/chrome/browser/ash/assistant/assistant_util_unittest.cc
index 42f3e19..c9364f25 100644
--- a/chrome/browser/ash/assistant/assistant_util_unittest.cc
+++ b/chrome/browser/ash/assistant/assistant_util_unittest.cc
@@ -103,7 +103,7 @@
       return;
 
     if (!identity_test_env_->identity_manager()->HasPrimaryAccount(
-            signin::ConsentLevel::kNotRequired)) {
+            signin::ConsentLevel::kSignin)) {
       identity_test_env_->MakeUnconsentedPrimaryAccountAvailable(
           account_id_.GetUserEmail());
     }
diff --git a/chrome/browser/ash/borealis/borealis_context_manager_impl.cc b/chrome/browser/ash/borealis/borealis_context_manager_impl.cc
index e6eaa3e..f7b08b84 100644
--- a/chrome/browser/ash/borealis/borealis_context_manager_impl.cc
+++ b/chrome/browser/ash/borealis/borealis_context_manager_impl.cc
@@ -16,6 +16,7 @@
 #include "chrome/browser/ash/borealis/borealis_task.h"
 #include "chrome/browser/ash/borealis/infra/described.h"
 #include "chrome/browser/ash/profiles/profile_helper.h"
+#include "chromeos/dbus/concierge_client.h"
 #include "chromeos/dbus/dbus_thread_manager.h"
 
 namespace {
@@ -84,6 +85,7 @@
     : profile_(profile), weak_factory_(this) {
   // DBusThreadManager may not be initialized in tests.
   if (chromeos::DBusThreadManager::IsInitialized()) {
+    ShutDownBorealisIfChromeCrashed();
     chromeos::DBusThreadManager::Get()->GetConciergeClient()->AddVmObserver(
         this);
   }
@@ -100,6 +102,61 @@
   }
 }
 
+// Note that this method gets called in the constructor.
+void BorealisContextManagerImpl::ShutDownBorealisIfChromeCrashed() {
+  if (profile_->GetLastSessionExitType() != Profile::EXIT_CRASHED) {
+    return;
+  }
+  vm_tools::concierge::GetVmInfoRequest request;
+  request.set_owner_id(
+      chromeos::ProfileHelper::GetUserIdHashFromProfile(profile_));
+  request.set_name(kBorealisVmName);
+  chromeos::DBusThreadManager::Get()->GetConciergeClient()->GetVmInfo(
+      std::move(request),
+      base::BindOnce(
+          [](base::WeakPtr<BorealisContextManagerImpl> weak_this,
+             base::Optional<vm_tools::concierge::GetVmInfoResponse> reply) {
+            if (reply.has_value() && reply->success()) {
+              weak_this->SendShutdownRequest(base::DoNothing(),
+                                             kBorealisVmName);
+            }
+          },
+          weak_factory_.GetWeakPtr()));
+}
+
+void BorealisContextManagerImpl::SendShutdownRequest(
+    base::OnceCallback<void(BorealisShutdownResult)> on_shutdown_callback,
+    const std::string& vm_name) {
+  // TODO(b/172178036): This could have been a task-sequence but that
+  // abstraction is proving insufficient.
+  vm_tools::concierge::StopVmRequest request;
+  request.set_owner_id(
+      chromeos::ProfileHelper::GetUserIdHashFromProfile(profile_));
+  request.set_name(vm_name);
+  chromeos::DBusThreadManager::Get()->GetConciergeClient()->StopVm(
+      std::move(request),
+      base::BindOnce(
+          [](base::OnceCallback<void(BorealisShutdownResult)>
+                 on_shutdown_callback,
+             base::Optional<vm_tools::concierge::StopVmResponse> response) {
+            // We don't have a good way to deal with a vm failing to stop (and
+            // this would be a very rare occurrence anyway). We log an error if
+            // it actually wasn't successful.
+            BorealisShutdownResult result = BorealisShutdownResult::kSuccess;
+            if (!response.has_value()) {
+              LOG(ERROR) << "Failed to stop Borealis VM: No response";
+              result = BorealisShutdownResult::kFailed;
+            } else if (!response.value().success()) {
+              LOG(ERROR) << "Failed to stop Borealis VM: "
+                         << response.value().failure_reason();
+              result = BorealisShutdownResult::kFailed;
+            }
+            RecordBorealisShutdownResultHistogram(result);
+            std::move(on_shutdown_callback).Run(result);
+          },
+          std::move(on_shutdown_callback)));
+}
+
 void BorealisContextManagerImpl::StartBorealis(ResultCallback callback) {
   if (context_) {
     std::move(callback).Run(
@@ -137,34 +194,8 @@
   }
   RecordBorealisShutdownNumAttemptsHistogram();
 
-  // TODO(b/172178036): This could have been a task-sequence but that
-  // abstraction is proving insufficient.
-  vm_tools::concierge::StopVmRequest request;
-  request.set_owner_id(
-      chromeos::ProfileHelper::GetUserIdHashFromProfile(profile_));
-  request.set_name(shutdown_context->vm_name());
-  chromeos::DBusThreadManager::Get()->GetConciergeClient()->StopVm(
-      std::move(request),
-      base::BindOnce(
-          [](base::OnceCallback<void(BorealisShutdownResult)>
-                 on_shutdown_callback,
-             base::Optional<vm_tools::concierge::StopVmResponse> response) {
-            // We don't have a good way to deal with a vm failing to stop (and
-            // this would be a very rare occurrence anyway). We log an error if
-            // it actually wasn't successful.
-            BorealisShutdownResult result = BorealisShutdownResult::kSuccess;
-            if (!response.has_value()) {
-              LOG(ERROR) << "Failed to stop Borealis VM: No response";
-              result = BorealisShutdownResult::kFailed;
-            } else if (!response.value().success()) {
-              LOG(ERROR) << "Failed to stop Borealis VM: "
-                         << response.value().failure_reason();
-              result = BorealisShutdownResult::kFailed;
-            }
-            RecordBorealisShutdownResultHistogram(result);
-            std::move(on_shutdown_callback).Run(result);
-          },
-          std::move(on_shutdown_callback)));
+  SendShutdownRequest(std::move(on_shutdown_callback),
+                      shutdown_context->vm_name());
 }
 
 base::queue<std::unique_ptr<BorealisTask>>
diff --git a/chrome/browser/ash/borealis/borealis_context_manager_impl.h b/chrome/browser/ash/borealis/borealis_context_manager_impl.h
index 4f8cec5..b14a0e9 100644
--- a/chrome/browser/ash/borealis/borealis_context_manager_impl.h
+++ b/chrome/browser/ash/borealis/borealis_context_manager_impl.h
@@ -90,6 +90,12 @@
   void OnVmStarted(const vm_tools::concierge::VmStartedSignal& signal) override;
   void OnVmStopped(const vm_tools::concierge::VmStoppedSignal& signal) override;
 
+  void SendShutdownRequest(
+      base::OnceCallback<void(BorealisShutdownResult)> on_shutdown_callback,
+      const std::string& vm_name);
+
+  void ShutDownBorealisIfChromeCrashed();
+
   Profile* const profile_;
 
   std::unique_ptr<Startup> in_progress_startup_;
diff --git a/chrome/browser/ash/borealis/borealis_context_manager_unittest.cc b/chrome/browser/ash/borealis/borealis_context_manager_unittest.cc
index ca0d2de..e7a1b6a 100644
--- a/chrome/browser/ash/borealis/borealis_context_manager_unittest.cc
+++ b/chrome/browser/ash/borealis/borealis_context_manager_unittest.cc
@@ -428,5 +428,15 @@
                                         guest_os::FailureClasses::VmStopped, 1);
 }
 
+TEST_F(BorealisContextManagerTest, VmShutsDownAfterChromeCrashes) {
+  chromeos::FakeConciergeClient* fake_concierge_client =
+      static_cast<chromeos::FakeConciergeClient*>(
+          chromeos::DBusThreadManager::Get()->GetConciergeClient());
+  profile_->set_last_session_exited_cleanly(false);
+  BorealisContextManagerImpl context_manager(profile_.get());
+  task_environment_.RunUntilIdle();
+  EXPECT_TRUE(fake_concierge_client->stop_vm_called());
+}
+
 }  // namespace
 }  // namespace borealis
diff --git a/chrome/browser/ash/login/app_mode/kiosk_browsertest.cc b/chrome/browser/ash/login/app_mode/kiosk_browsertest.cc
index e3510511..8433cc1 100644
--- a/chrome/browser/ash/login/app_mode/kiosk_browsertest.cc
+++ b/chrome/browser/ash/login/app_mode/kiosk_browsertest.cc
@@ -1016,7 +1016,7 @@
   Profile* app_profile = ProfileManager::GetPrimaryUserProfile();
   ASSERT_TRUE(app_profile);
   EXPECT_FALSE(IdentityManagerFactory::GetForProfile(app_profile)
-                   ->HasPrimaryAccount(signin::ConsentLevel::kNotRequired));
+                   ->HasPrimaryAccount(signin::ConsentLevel::kSignin));
 }
 
 IN_PROC_BROWSER_TEST_F(KioskDeviceOwnedTest, PRE_LaunchAppNetworkDown) {
@@ -2586,7 +2586,7 @@
   Profile* app_profile = ProfileManager::GetPrimaryUserProfile();
   ASSERT_TRUE(app_profile);
   EXPECT_FALSE(IdentityManagerFactory::GetForProfile(app_profile)
-                   ->HasPrimaryAccount(signin::ConsentLevel::kNotRequired));
+                   ->HasPrimaryAccount(signin::ConsentLevel::kSignin));
 
   // Terminate the app.
   window->GetBaseWindow()->Close();
diff --git a/chrome/browser/ash/login/encryption_migration_browsertest.cc b/chrome/browser/ash/login/encryption_migration_browsertest.cc
index 936d96e..52de088 100644
--- a/chrome/browser/ash/login/encryption_migration_browsertest.cc
+++ b/chrome/browser/ash/login/encryption_migration_browsertest.cc
@@ -23,10 +23,10 @@
 #include "chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.h"
 #include "chrome/browser/ui/webui/chromeos/login/oobe_ui.h"
 #include "chromeos/dbus/cryptohome/account_identifier_operators.h"
-#include "chromeos/dbus/cryptohome/fake_cryptohome_client.h"
 #include "chromeos/dbus/cryptohome/rpc.pb.h"
 #include "chromeos/dbus/power/fake_power_manager_client.h"
 #include "chromeos/dbus/session_manager/fake_session_manager_client.h"
+#include "chromeos/dbus/userdataauth/fake_userdataauth_client.h"
 #include "chromeos/login/auth/stub_authenticator_builder.h"
 #include "chromeos/login/auth/user_context.h"
 #include "components/account_id/account_id.h"
@@ -73,9 +73,9 @@
   void SetUpOnMainThread() override {
     OobeBaseTest::SetUpOnMainThread();
 
-    FakeCryptohomeClient::Get()->SetEcryptfsUserHome(GetTestCryptohomeId(),
-                                                     true);
-    FakeCryptohomeClient::Get()->set_run_default_dircrypto_migration(false);
+    FakeUserDataAuthClient::Get()->SetEcryptfsUserHome(GetTestCryptohomeId(),
+                                                       true);
+    FakeUserDataAuthClient::Get()->set_run_default_dircrypto_migration(false);
 
     // Configure encryption migration screen for test.
     EncryptionMigrationScreen* screen =
@@ -122,23 +122,25 @@
 
     EXPECT_EQ(
         GetTestCryptohomeId(),
-        FakeCryptohomeClient::Get()->get_id_for_disk_migrated_to_dircrypto());
-    EXPECT_FALSE(FakeCryptohomeClient::Get()->minimal_migration());
+        FakeUserDataAuthClient::Get()->get_id_for_disk_migrated_to_dircrypto());
+    EXPECT_FALSE(FakeUserDataAuthClient::Get()->minimal_migration());
 
     EXPECT_EQ(0, FakePowerManagerClient::Get()->num_request_restart_calls());
 
     // Simulate successful migration - restart should be requested immediately
     // after success is reported.
-    FakeCryptohomeClient::Get()->NotifyDircryptoMigrationProgress(
-        cryptohome::DIRCRYPTO_MIGRATION_INITIALIZING, 0 /*current*/,
-        5 /*total*/);
+    FakeUserDataAuthClient::Get()->NotifyDircryptoMigrationProgress(
+        ::user_data_auth::DircryptoMigrationStatus::
+            DIRCRYPTO_MIGRATION_INITIALIZING,
+        0 /*current*/, 5 /*total*/);
     EXPECT_EQ(0, FakePowerManagerClient::Get()->num_request_restart_calls());
 
     test::OobeJS().ExpectAttributeEQ("indeterminate", kMigrationProgress, true);
 
-    FakeCryptohomeClient::Get()->NotifyDircryptoMigrationProgress(
-        cryptohome::DIRCRYPTO_MIGRATION_IN_PROGRESS, 3 /*current*/,
-        5 /*total*/);
+    FakeUserDataAuthClient::Get()->NotifyDircryptoMigrationProgress(
+        ::user_data_auth::DircryptoMigrationStatus::
+            DIRCRYPTO_MIGRATION_IN_PROGRESS,
+        3 /*current*/, 5 /*total*/);
     EXPECT_EQ(0, FakePowerManagerClient::Get()->num_request_restart_calls());
 
     test::OobeJS().ExpectAttributeEQ("indeterminate", kMigrationProgress,
@@ -146,8 +148,9 @@
     test::OobeJS().ExpectAttributeEQ("value * 100", kMigrationProgress, 60);
     test::OobeJS().ExpectAttributeEQ("max", kMigrationProgress, 1);
 
-    FakeCryptohomeClient::Get()->NotifyDircryptoMigrationProgress(
-        cryptohome::DIRCRYPTO_MIGRATION_SUCCESS, 5 /*current*/, 5 /*total*/);
+    FakeUserDataAuthClient::Get()->NotifyDircryptoMigrationProgress(
+        ::user_data_auth::DircryptoMigrationStatus::DIRCRYPTO_MIGRATION_SUCCESS,
+        5 /*current*/, 5 /*total*/);
 
     EXPECT_EQ(1, FakePowerManagerClient::Get()->num_request_restart_calls());
   }
@@ -198,7 +201,7 @@
 
   WaitForActiveSession();
 
-  EXPECT_FALSE(FakeCryptohomeClient::Get()
+  EXPECT_FALSE(FakeUserDataAuthClient::Get()
                    ->get_id_for_disk_migrated_to_dircrypto()
                    .has_account_id());
 }
@@ -216,7 +219,7 @@
   test::OobeJS().ExpectVisiblePath(kSkipButton);
   test::OobeJS().ExpectVisiblePath(kUpgradeButton);
 
-  EXPECT_FALSE(FakeCryptohomeClient::Get()
+  EXPECT_FALSE(FakeUserDataAuthClient::Get()
                    ->get_id_for_disk_migrated_to_dircrypto()
                    .has_account_id());
 
@@ -271,7 +274,7 @@
   test::OobeJS().TapOnPath(kInsufficientSpaceSkipButton);
 
   WaitForActiveSession();
-  EXPECT_FALSE(FakeCryptohomeClient::Get()
+  EXPECT_FALSE(FakeUserDataAuthClient::Get()
                    ->get_id_for_disk_migrated_to_dircrypto()
                    .has_account_id());
 }
@@ -295,7 +298,7 @@
   test::OobeJS().TapOnPath(kInsufficientSpaceRestartButton);
 
   EXPECT_EQ(1, FakePowerManagerClient::Get()->num_request_restart_calls());
-  EXPECT_FALSE(FakeCryptohomeClient::Get()
+  EXPECT_FALSE(FakeUserDataAuthClient::Get()
                    ->get_id_for_disk_migrated_to_dircrypto()
                    .has_account_id());
 }
@@ -319,7 +322,7 @@
   test::OobeJS().TapOnPath(kInsufficientSpaceRestartButton);
 
   EXPECT_EQ(1, FakePowerManagerClient::Get()->num_request_restart_calls());
-  EXPECT_FALSE(FakeCryptohomeClient::Get()
+  EXPECT_FALSE(FakeUserDataAuthClient::Get()
                    ->get_id_for_disk_migrated_to_dircrypto()
                    .has_account_id());
 }
@@ -336,9 +339,10 @@
 
   EXPECT_EQ(
       GetTestCryptohomeId(),
-      FakeCryptohomeClient::Get()->get_id_for_disk_migrated_to_dircrypto());
-  FakeCryptohomeClient::Get()->NotifyDircryptoMigrationProgress(
-      cryptohome::DIRCRYPTO_MIGRATION_FAILED, 5 /*current*/, 5 /*total*/);
+      FakeUserDataAuthClient::Get()->get_id_for_disk_migrated_to_dircrypto());
+  FakeUserDataAuthClient::Get()->NotifyDircryptoMigrationProgress(
+      ::user_data_auth::DircryptoMigrationStatus::DIRCRYPTO_MIGRATION_FAILED,
+      5 /*current*/, 5 /*total*/);
 
   EXPECT_EQ(0, FakePowerManagerClient::Get()->num_request_restart_calls());
 
@@ -376,7 +380,7 @@
   test::OobeJS().TapOnPath(kSkipButton);
 
   WaitForActiveSession();
-  EXPECT_FALSE(FakeCryptohomeClient::Get()
+  EXPECT_FALSE(FakeUserDataAuthClient::Get()
                    ->get_id_for_disk_migrated_to_dircrypto()
                    .has_account_id());
 }
@@ -398,7 +402,7 @@
   test::OobeJS().ExpectPathDisplayed(false, kSkipButton);
   test::OobeJS().ExpectPathDisplayed(false, kUpgradeButton);
 
-  EXPECT_FALSE(FakeCryptohomeClient::Get()
+  EXPECT_FALSE(FakeUserDataAuthClient::Get()
                    ->get_id_for_disk_migrated_to_dircrypto()
                    .has_account_id());
 }
@@ -417,7 +421,7 @@
   test::OobeJS().ExpectHiddenPath(kInsufficientSpaceDialog);
   test::OobeJS().ExpectHiddenPath(kErrorDialog);
 
-  EXPECT_FALSE(FakeCryptohomeClient::Get()
+  EXPECT_FALSE(FakeUserDataAuthClient::Get()
                    ->get_id_for_disk_migrated_to_dircrypto()
                    .has_account_id());
 
diff --git a/chrome/browser/ash/login/saml/password_sync_token_fetcher.cc b/chrome/browser/ash/login/saml/password_sync_token_fetcher.cc
index fa432463..5e801a0 100644
--- a/chrome/browser/ash/login/saml/password_sync_token_fetcher.cc
+++ b/chrome/browser/ash/login/saml/password_sync_token_fetcher.cc
@@ -167,7 +167,7 @@
           base::BindOnce(&PasswordSyncTokenFetcher::OnAccessTokenFetchComplete,
                          weak_ptr_factory_.GetWeakPtr()),
           signin::PrimaryAccountAccessTokenFetcher::Mode::kWaitUntilAvailable,
-          signin::ConsentLevel::kNotRequired);
+          signin::ConsentLevel::kSignin);
 }
 
 void PasswordSyncTokenFetcher::OnAccessTokenFetchComplete(
diff --git a/chrome/browser/ash/login/screens/encryption_migration_screen.cc b/chrome/browser/ash/login/screens/encryption_migration_screen.cc
index ee48fc2..9c4b0d87 100644
--- a/chrome/browser/ash/login/screens/encryption_migration_screen.cc
+++ b/chrome/browser/ash/login/screens/encryption_migration_screen.cc
@@ -31,11 +31,13 @@
 #include "chrome/browser/profiles/profile.h"
 #include "chromeos/cryptohome/cryptohome_util.h"
 #include "chromeos/cryptohome/homedir_methods.h"
+#include "chromeos/cryptohome/userdataauth_util.h"
 #include "chromeos/dbus/cryptohome/cryptohome_client.h"
 #include "chromeos/dbus/dbus_thread_manager.h"
 #include "chromeos/dbus/power/power_manager_client.h"
 #include "chromeos/dbus/power/power_policy_controller.h"
 #include "chromeos/dbus/power_manager/power_supply_properties.pb.h"
+#include "chromeos/dbus/userdataauth/userdataauth_client.h"
 #include "components/user_manager/user_manager.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/device_service.h"
@@ -250,7 +252,7 @@
 }
 
 EncryptionMigrationScreen::~EncryptionMigrationScreen() {
-  cryptohome_observer_.reset();
+  userdataauth_observer_.reset();
   power_manager_observer_.reset();
   if (view_)
     view_->SetDelegate(nullptr);
@@ -484,7 +486,9 @@
     initial_battery_percent_ = *current_battery_percent_;
 
   // Mount the existing eCryptfs vault to a temporary location for migration.
-  cryptohome::MountRequest mount;
+  user_data_auth::MountRequest mount;
+  *mount.mutable_account() = cryptohome::CreateAccountIdentifierFromAccountId(
+      user_context_.GetAccountId());
   cryptohome::AuthorizationRequest auth_request;
   mount.set_to_migrate_from_ecryptfs(true);
   if (IsArcKiosk()) {
@@ -492,18 +496,15 @@
   } else {
     auth_request = CreateAuthorizationRequest();
   }
-  CryptohomeClient::Get()->MountEx(
-      cryptohome::CreateAccountIdentifierFromAccountId(
-          user_context_.GetAccountId()),
-      auth_request, mount,
-      base::BindOnce(&EncryptionMigrationScreen::OnMountExistingVault,
-                     weak_ptr_factory_.GetWeakPtr()));
+  *mount.mutable_authorization() = auth_request;
+  UserDataAuthClient::Get()->Mount(
+      mount, base::BindOnce(&EncryptionMigrationScreen::OnMountExistingVault,
+                            weak_ptr_factory_.GetWeakPtr()));
 }
 
 void EncryptionMigrationScreen::OnMountExistingVault(
-    base::Optional<cryptohome::BaseReply> reply) {
-  cryptohome::MountError return_code =
-      cryptohome::MountExReplyToMountError(reply);
+    base::Optional<user_data_auth::MountReply> reply) {
+  cryptohome::MountError return_code = user_data_auth::ReplyToMountError(reply);
   if (return_code != cryptohome::MOUNT_ERROR_NONE) {
     RecordMigrationResultMountFailure(IsResumingIncompleteMigration(),
                                       IsArcKiosk());
@@ -512,16 +513,16 @@
     return;
   }
 
-  cryptohome::MigrateToDircryptoRequest request;
-  cryptohome_observer_ = std::make_unique<
-      ScopedObserver<CryptohomeClient, CryptohomeClient::Observer>>(this);
-  cryptohome_observer_->Add(CryptohomeClient::Get());
-  CryptohomeClient::Get()->MigrateToDircrypto(
+  user_data_auth::StartMigrateToDircryptoRequest request;
+  *request.mutable_account_id() =
       cryptohome::CreateAccountIdentifierFromAccountId(
-          user_context_.GetAccountId()),
-      request,
-      base::BindOnce(&EncryptionMigrationScreen::OnMigrationRequested,
-                     weak_ptr_factory_.GetWeakPtr()));
+          user_context_.GetAccountId());
+  userdataauth_observer_ = std::make_unique<base::ScopedObservation<
+      UserDataAuthClient, UserDataAuthClient::Observer>>(this);
+  userdataauth_observer_->Observe(UserDataAuthClient::Get());
+  UserDataAuthClient::Get()->StartMigrateToDircrypto(
+      request, base::BindOnce(&EncryptionMigrationScreen::OnMigrationRequested,
+                              weak_ptr_factory_.GetWeakPtr()));
 }
 
 device::mojom::WakeLock* EncryptionMigrationScreen::GetWakeLock() {
@@ -553,24 +554,21 @@
 
   const cryptohome::Identification cryptohome_id(user_context_.GetAccountId());
 
-  cryptohome::AccountIdentifier account_id_proto;
-  account_id_proto.set_account_id(cryptohome_id.id());
-
-  CryptohomeClient::Get()->RemoveEx(
-      account_id_proto,
-      base::BindOnce(&EncryptionMigrationScreen::OnRemoveCryptohome,
-                     weak_ptr_factory_.GetWeakPtr()));
+  user_data_auth::RemoveRequest request;
+  request.mutable_identifier()->set_account_id(cryptohome_id.id());
+  UserDataAuthClient::Get()->Remove(
+      request, base::BindOnce(&EncryptionMigrationScreen::OnRemoveCryptohome,
+                              weak_ptr_factory_.GetWeakPtr()));
 }
 
 void EncryptionMigrationScreen::OnRemoveCryptohome(
-    base::Optional<cryptohome::BaseReply> reply) {
-  cryptohome::MountError error = BaseReplyToMountError(reply);
+    base::Optional<user_data_auth::RemoveReply> reply) {
+  cryptohome::MountError error = user_data_auth::ReplyToMountError(reply);
   if (error == cryptohome::MOUNT_ERROR_NONE) {
     RecordRemoveCryptohomeResultSuccess(IsResumingIncompleteMigration(),
                                         IsArcKiosk());
   } else {
-    LOG(ERROR) << "Removing cryptohome failed. return code: "
-               << reply.value().error();
+    LOG(ERROR) << "Removing cryptohome failed. return code: " << reply->error();
     RecordRemoveCryptohomeResultFailure(IsResumingIncompleteMigration(),
                                         IsArcKiosk());
   }
@@ -601,22 +599,24 @@
 }
 
 void EncryptionMigrationScreen::DircryptoMigrationProgress(
-    cryptohome::DircryptoMigrationStatus status,
-    uint64_t current,
-    uint64_t total) {
-  switch (status) {
-    case cryptohome::DIRCRYPTO_MIGRATION_INITIALIZING:
+    const ::user_data_auth::DircryptoMigrationProgress& progress) {
+  switch (progress.status()) {
+    case user_data_auth::DircryptoMigrationStatus::
+        DIRCRYPTO_MIGRATION_INITIALIZING:
       UpdateUIState(EncryptionMigrationScreenView::MIGRATING);
       break;
-    case cryptohome::DIRCRYPTO_MIGRATION_IN_PROGRESS:
+    case user_data_auth::DircryptoMigrationStatus::
+        DIRCRYPTO_MIGRATION_IN_PROGRESS:
       UpdateUIState(EncryptionMigrationScreenView::MIGRATING);
-      view_->SetMigrationProgress(static_cast<double>(current) / total);
+      view_->SetMigrationProgress(
+          static_cast<double>(progress.current_bytes()) /
+          progress.total_bytes());
       break;
-    case cryptohome::DIRCRYPTO_MIGRATION_SUCCESS:
+    case user_data_auth::DircryptoMigrationStatus::DIRCRYPTO_MIGRATION_SUCCESS:
       RecordMigrationResultSuccess(IsResumingIncompleteMigration(),
                                    IsArcKiosk());
       // Stop listening to the progress updates.
-      cryptohome_observer_.reset();
+      userdataauth_observer_.reset();
       // If the battery level decreased during migration, record the consumed
       // battery level.
       if (current_battery_percent_ &&
@@ -631,11 +631,11 @@
           power_manager::REQUEST_RESTART_OTHER,
           "login encryption migration success");
       break;
-    case cryptohome::DIRCRYPTO_MIGRATION_FAILED:
+    case user_data_auth::DircryptoMigrationStatus::DIRCRYPTO_MIGRATION_FAILED:
       RecordMigrationResultGeneralFailure(IsResumingIncompleteMigration(),
                                           IsArcKiosk());
       // Stop listening to the progress updates.
-      cryptohome_observer_.reset();
+      userdataauth_observer_.reset();
       // Shows error screen after removing user directory is completed.
       RemoveCryptohome();
       break;
@@ -644,8 +644,11 @@
   }
 }
 
-void EncryptionMigrationScreen::OnMigrationRequested(bool success) {
-  if (!success) {
+void EncryptionMigrationScreen::OnMigrationRequested(
+    base::Optional<user_data_auth::StartMigrateToDircryptoReply> reply) {
+  if (!reply.has_value() ||
+      reply->error() !=
+          user_data_auth::CryptohomeErrorCode::CRYPTOHOME_ERROR_NOT_SET) {
     LOG(ERROR) << "Requesting MigrateToDircrypto failed.";
     RecordMigrationResultRequestFailure(IsResumingIncompleteMigration(),
                                         IsArcKiosk());
diff --git a/chrome/browser/ash/login/screens/encryption_migration_screen.h b/chrome/browser/ash/login/screens/encryption_migration_screen.h
index a9acb6d..7abf1157 100644
--- a/chrome/browser/ash/login/screens/encryption_migration_screen.h
+++ b/chrome/browser/ash/login/screens/encryption_migration_screen.h
@@ -11,6 +11,7 @@
 #include "base/callback_forward.h"
 #include "base/macros.h"
 #include "base/optional.h"
+#include "base/scoped_observation.h"
 #include "base/scoped_observer.h"
 #include "chrome/browser/ash/login/screens/base_screen.h"
 #include "chrome/browser/ash/login/screens/encryption_migration_mode.h"
@@ -19,6 +20,7 @@
 #include "chromeos/dbus/cryptohome/cryptohome_client.h"
 #include "chromeos/dbus/cryptohome/rpc.pb.h"
 #include "chromeos/dbus/power/power_manager_client.h"
+#include "chromeos/dbus/userdataauth/userdataauth_client.h"
 #include "chromeos/login/auth/user_context.h"
 #include "mojo/public/cpp/bindings/remote.h"
 #include "services/device/public/mojom/wake_lock.mojom.h"
@@ -32,7 +34,7 @@
 
 class EncryptionMigrationScreen : public BaseScreen,
                                   public PowerManagerClient::Observer,
-                                  public CryptohomeClient::Observer {
+                                  public UserDataAuthClient::Observer {
  public:
   using TView = EncryptionMigrationScreenView;
 
@@ -81,10 +83,9 @@
   // PowerManagerClient::Observer implementation:
   void PowerChanged(const power_manager::PowerSupplyProperties& proto) override;
 
-  // CryptohomeClient::Observer implementation:
-  void DircryptoMigrationProgress(cryptohome::DircryptoMigrationStatus status,
-                                  uint64_t current,
-                                  uint64_t total) override;
+  // UserDataAuthClient::Observer implementation:
+  void DircryptoMigrationProgress(
+      const ::user_data_auth::DircryptoMigrationProgress& progress) override;
   // Handlers for user actions.
   void HandleStartMigration();
   void HandleSkipMigration();
@@ -99,10 +100,10 @@
   void OnGetAvailableStorage(int64_t size);
   void WaitBatteryAndMigrate();
   void StartMigration();
-  void OnMountExistingVault(base::Optional<cryptohome::BaseReply> reply);
+  void OnMountExistingVault(base::Optional<user_data_auth::MountReply> reply);
   // Removes cryptohome and shows the error screen after the removal finishes.
   void RemoveCryptohome();
-  void OnRemoveCryptohome(base::Optional<cryptohome::BaseReply> reply);
+  void OnRemoveCryptohome(base::Optional<user_data_auth::RemoveReply> reply);
 
   // Creates authorization request for MountEx method using |user_context_|.
   cryptohome::AuthorizationRequest CreateAuthorizationRequest();
@@ -111,7 +112,8 @@
   bool IsArcKiosk() const;
 
   // Handlers for cryptohome API callbacks.
-  void OnMigrationRequested(bool success);
+  void OnMigrationRequested(
+      base::Optional<user_data_auth::StartMigrateToDircryptoReply> reply);
 
   // Records UMA about visible screen after delay.
   void OnDelayedRecordVisibleScreen(
@@ -159,8 +161,9 @@
 
   FreeDiskSpaceFetcher free_disk_space_fetcher_;
 
-  std::unique_ptr<ScopedObserver<CryptohomeClient, CryptohomeClient::Observer>>
-      cryptohome_observer_;
+  std::unique_ptr<
+      base::ScopedObservation<UserDataAuthClient, UserDataAuthClient::Observer>>
+      userdataauth_observer_;
 
   std::unique_ptr<
       ScopedObserver<PowerManagerClient, PowerManagerClient::Observer>>
diff --git a/chrome/browser/ash/login/screens/encryption_migration_screen_unittest.cc b/chrome/browser/ash/login/screens/encryption_migration_screen_unittest.cc
index 694ba453..6c2213a 100644
--- a/chrome/browser/ash/login/screens/encryption_migration_screen_unittest.cc
+++ b/chrome/browser/ash/login/screens/encryption_migration_screen_unittest.cc
@@ -16,9 +16,9 @@
 #include "chrome/browser/ui/webui/chromeos/login/encryption_migration_screen_handler.h"
 #include "chromeos/cryptohome/homedir_methods.h"
 #include "chromeos/dbus/cryptohome/account_identifier_operators.h"
-#include "chromeos/dbus/cryptohome/fake_cryptohome_client.h"
 #include "chromeos/dbus/power/fake_power_manager_client.h"
 #include "chromeos/dbus/power/power_policy_controller.h"
+#include "chromeos/dbus/userdataauth/fake_userdataauth_client.h"
 #include "chromeos/login/auth/key.h"
 #include "chromeos/login/auth/user_context.h"
 #include "components/account_id/account_id.h"
@@ -126,8 +126,8 @@
             base::WrapUnique(mock_user_manager));
 
     // Set up fake dbus clients.
-    CryptohomeClient::InitializeFake();
-    fake_cryptohome_client_ = FakeCryptohomeClient::Get();
+    UserDataAuthClient::InitializeFake();
+    fake_userdataauth_client_ = FakeUserDataAuthClient::Get();
     PowerManagerClient::InitializeFake();
 
     PowerPolicyController::Initialize(PowerManagerClient::Get());
@@ -152,7 +152,7 @@
 
     PowerPolicyController::Shutdown();
     PowerManagerClient::Shutdown();
-    CryptohomeClient::Shutdown();
+    UserDataAuthClient::Shutdown();
   }
 
  protected:
@@ -166,7 +166,7 @@
   base::test::TaskEnvironment task_environment_;
 
   std::unique_ptr<user_manager::ScopedUserManager> scoped_user_manager_enabler_;
-  FakeCryptohomeClient* fake_cryptohome_client_ = nullptr;  // unowned
+  FakeUserDataAuthClient* fake_userdataauth_client_ = nullptr;  // unowned
 
   // Will be set to true in ContinueLogin.
   bool skip_migration_callback_called_ = false;
diff --git a/chrome/browser/ash/login/screens/locale_switch_screen.cc b/chrome/browser/ash/login/screens/locale_switch_screen.cc
index 06ee9a91..1eef7b8 100644
--- a/chrome/browser/ash/login/screens/locale_switch_screen.cc
+++ b/chrome/browser/ash/login/screens/locale_switch_screen.cc
@@ -97,7 +97,7 @@
   }
 
   CoreAccountId primary_account_id =
-      identity_manager->GetPrimaryAccountId(signin::ConsentLevel::kNotRequired);
+      identity_manager->GetPrimaryAccountId(signin::ConsentLevel::kSignin);
 
   if (!identity_manager->HasAccountWithRefreshToken(primary_account_id)) {
     exit_callback_.Run(Result::LOCALE_FETCH_FAILED);
diff --git a/chrome/browser/ash/login/screens/sync_consent_screen.cc b/chrome/browser/ash/login/screens/sync_consent_screen.cc
index bca2ba8..87176d4 100644
--- a/chrome/browser/ash/login/screens/sync_consent_screen.cc
+++ b/chrome/browser/ash/login/screens/sync_consent_screen.cc
@@ -230,7 +230,7 @@
   // Set a "sync-consented" primary account. See comment above.
   auto* identity_manager = IdentityManagerFactory::GetForProfile(profile_);
   CoreAccountId account_id =
-      identity_manager->GetPrimaryAccountId(signin::ConsentLevel::kNotRequired);
+      identity_manager->GetPrimaryAccountId(signin::ConsentLevel::kSignin);
   DCHECK(!account_id.empty());
   identity_manager->GetPrimaryAccountMutator()->SetPrimaryAccount(account_id);
 
@@ -345,7 +345,7 @@
   // The user might not consent to browser sync, so use the "unconsented" ID.
   const CoreAccountId& google_account_id =
       IdentityManagerFactory::GetForProfile(profile_)->GetPrimaryAccountId(
-          signin::ConsentLevel::kNotRequired);
+          signin::ConsentLevel::kSignin);
   // TODO(alemate): Support unified_consent_enabled
   sync_pb::UserConsentTypes::SyncConsent sync_consent;
   sync_consent.set_confirmation_grd_id(consent_confirmation);
diff --git a/chrome/browser/ash/login/session/user_session_manager.cc b/chrome/browser/ash/login/session/user_session_manager.cc
index 9fd1386..0dfa094b 100644
--- a/chrome/browser/ash/login/session/user_session_manager.cc
+++ b/chrome/browser/ash/login/session/user_session_manager.cc
@@ -642,8 +642,7 @@
   auto* identity_manager = IdentityManagerFactory::GetForProfile(user_profile);
   const bool account_id_valid =
       identity_manager &&
-      !identity_manager->GetPrimaryAccountId(ConsentLevel::kNotRequired)
-           .empty();
+      !identity_manager->GetPrimaryAccountId(ConsentLevel::kSignin).empty();
   if (!account_id_valid)
     LOG(ERROR) << "No account is associated with sign-in manager on restore.";
 
@@ -945,8 +944,7 @@
       user_status =
           (identity_manager &&
            identity_manager->HasAccountWithRefreshTokenInPersistentErrorState(
-               identity_manager
-                   ->GetPrimaryAccountInfo(ConsentLevel::kNotRequired)
+               identity_manager->GetPrimaryAccountInfo(ConsentLevel::kSignin)
                    .account_id))
               ? user_manager::User::OAUTH2_TOKEN_STATUS_INVALID
               : user_manager::User::OAUTH2_TOKEN_STATUS_VALID;
@@ -1333,16 +1331,15 @@
       // profile prefs failed to save or the prefs are corrupted by a crash then
       // the IdentityManager will start up without a primary account. See test
       // CrashRestoreComplexTest.RestoreSessionForThreeUsers.
-      if (!identity_manager->HasPrimaryAccount(ConsentLevel::kNotRequired)) {
+      if (!identity_manager->HasPrimaryAccount(ConsentLevel::kSignin)) {
         // Set the account without recording browser sync consent.
         identity_manager->GetPrimaryAccountMutator()
             ->SetUnconsentedPrimaryAccount(account_info->account_id);
       }
 
-      CHECK(identity_manager->HasPrimaryAccount(ConsentLevel::kNotRequired));
+      CHECK(identity_manager->HasPrimaryAccount(ConsentLevel::kSignin));
       CHECK_EQ(
-          identity_manager->GetPrimaryAccountInfo(ConsentLevel::kNotRequired)
-              .gaia,
+          identity_manager->GetPrimaryAccountInfo(ConsentLevel::kSignin).gaia,
           gaia_id);
     } else {
       // Set a primary account here because the profile might have been
@@ -1358,7 +1355,7 @@
     }
 
     CoreAccountId account_id =
-        identity_manager->GetPrimaryAccountId(ConsentLevel::kNotRequired);
+        identity_manager->GetPrimaryAccountId(ConsentLevel::kSignin);
     VLOG(1) << "Seed IdentityManager with the authenticated account info, "
             << "success=" << !account_id.empty();
 
diff --git a/chrome/browser/ash/login/signin/auth_error_observer.cc b/chrome/browser/ash/login/signin/auth_error_observer.cc
index 8bea583..fc4da71 100644
--- a/chrome/browser/ash/login/signin/auth_error_observer.cc
+++ b/chrome/browser/ash/login/signin/auth_error_observer.cc
@@ -72,8 +72,7 @@
   signin::IdentityManager* identity_manager =
       IdentityManagerFactory::GetForProfile(profile_);
   HandleAuthError(identity_manager->GetErrorStateOfRefreshTokenForAccount(
-      identity_manager->GetPrimaryAccountId(
-          signin::ConsentLevel::kNotRequired)));
+      identity_manager->GetPrimaryAccountId(signin::ConsentLevel::kSignin)));
 }
 
 void AuthErrorObserver::HandleAuthError(
diff --git a/chrome/browser/ash/login/signin/oauth2_login_manager.cc b/chrome/browser/ash/login/signin/oauth2_login_manager.cc
index 5117fa0..245fa785 100644
--- a/chrome/browser/ash/login/signin/oauth2_login_manager.cc
+++ b/chrome/browser/ash/login/signin/oauth2_login_manager.cc
@@ -95,7 +95,7 @@
     user_manager::UserManager::Get()->SaveUserOAuthStatus(
         AccountId::FromUserEmail(
             identity_manager
-                ->GetPrimaryAccountInfo(signin::ConsentLevel::kNotRequired)
+                ->GetPrimaryAccountInfo(signin::ConsentLevel::kSignin)
                 .email),
         user_manager::User::OAUTH_TOKEN_STATUS_UNKNOWN);
   }
@@ -147,8 +147,7 @@
 CoreAccountId OAuth2LoginManager::GetUnconsentedPrimaryAccountId() {
   // Use the primary ID whether or not the user has consented to browser sync.
   const CoreAccountId primary_account_id =
-      GetIdentityManager()->GetPrimaryAccountId(
-          signin::ConsentLevel::kNotRequired);
+      GetIdentityManager()->GetPrimaryAccountId(signin::ConsentLevel::kSignin);
   LOG_IF(ERROR, primary_account_id.empty()) << "Primary account id is empty.";
   return primary_account_id;
 }
@@ -158,11 +157,9 @@
 
   signin::IdentityManager* identity_manager = GetIdentityManager();
   // The primary account must be already set at this point.
-  DCHECK(
-      identity_manager->HasPrimaryAccount(signin::ConsentLevel::kNotRequired));
+  DCHECK(identity_manager->HasPrimaryAccount(signin::ConsentLevel::kSignin));
   const CoreAccountInfo primary_account_info =
-      identity_manager->GetPrimaryAccountInfo(
-          signin::ConsentLevel::kNotRequired);
+      identity_manager->GetPrimaryAccountInfo(signin::ConsentLevel::kSignin);
 
   // We already have the refresh token at this
   // point, and will not get any additional callbacks from Account Manager or
diff --git a/chrome/browser/ash/login/signin/signin_error_notifier_ash.cc b/chrome/browser/ash/login/signin/signin_error_notifier_ash.cc
index 85050a92..ac4f3d5 100644
--- a/chrome/browser/ash/login/signin/signin_error_notifier_ash.cc
+++ b/chrome/browser/ash/login/signin/signin_error_notifier_ash.cc
@@ -178,8 +178,7 @@
 
   const CoreAccountId error_account_id = error_controller_->error_account_id();
   const CoreAccountId primary_account_id =
-      identity_manager_->GetPrimaryAccountId(
-          signin::ConsentLevel::kNotRequired);
+      identity_manager_->GetPrimaryAccountId(signin::ConsentLevel::kSignin);
   if (error_account_id == primary_account_id) {
     RecordReauthReason(account_id, chromeos::ReauthReason::SYNC_FAILED);
     HandleDeviceAccountError();
diff --git a/chrome/browser/ash/login/signin/token_handle_fetcher.cc b/chrome/browser/ash/login/signin/token_handle_fetcher.cc
index 89285f0..64e693a3 100644
--- a/chrome/browser/ash/login/signin/token_handle_fetcher.cc
+++ b/chrome/browser/ash/login/signin/token_handle_fetcher.cc
@@ -62,7 +62,7 @@
   // This class doesn't care about browser sync consent.
   if (!identity_manager_->HasAccountWithRefreshToken(
           identity_manager_->GetPrimaryAccountId(
-              signin::ConsentLevel::kNotRequired))) {
+              signin::ConsentLevel::kSignin))) {
     profile_shutdown_subscription_ =
         TokenHandleFetcherShutdownNotifierFactory::GetInstance()
             ->Get(profile)
@@ -87,7 +87,7 @@
           base::BindOnce(&TokenHandleFetcher::OnAccessTokenFetchComplete,
                          base::Unretained(this)),
           signin::PrimaryAccountAccessTokenFetcher::Mode::kWaitUntilAvailable,
-          signin::ConsentLevel::kNotRequired);
+          signin::ConsentLevel::kSignin);
 }
 
 void TokenHandleFetcher::OnAccessTokenFetchComplete(
diff --git a/chrome/browser/ash/login/users/avatar/user_image_manager_browsertest.cc b/chrome/browser/ash/login/users/avatar/user_image_manager_browsertest.cc
index 97cdc72..6ac9ad1 100644
--- a/chrome/browser/ash/login/users/avatar/user_image_manager_browsertest.cc
+++ b/chrome/browser/ash/login/users/avatar/user_image_manager_browsertest.cc
@@ -258,8 +258,8 @@
   void UpdatePrimaryAccountInfo(Profile* profile) {
     auto* identity_manager = IdentityManagerFactory::GetForProfile(profile);
     // Sync consent level doesn't matter here.
-    CoreAccountInfo core_info = identity_manager->GetPrimaryAccountInfo(
-        signin::ConsentLevel::kNotRequired);
+    CoreAccountInfo core_info =
+        identity_manager->GetPrimaryAccountInfo(signin::ConsentLevel::kSignin);
     signin::SetRefreshTokenForAccount(identity_manager, core_info.account_id,
                                       kRandomTokenStrForTesting);
     AccountInfo account_info;
diff --git a/chrome/browser/ash/plugin_vm/plugin_vm_drive_image_download_service.cc b/chrome/browser/ash/plugin_vm/plugin_vm_drive_image_download_service.cc
index dd4af2f..5e541f0 100644
--- a/chrome/browser/ash/plugin_vm/plugin_vm_drive_image_download_service.cc
+++ b/chrome/browser/ash/plugin_vm/plugin_vm_drive_image_download_service.cc
@@ -140,8 +140,8 @@
       identity_manager, url_loader_factory, blocking_task_runner.get(),
       base_url, base_thumbnail_url, std::string{},
       kPluginVmNetworkTrafficAnnotation);
-  drive_service_->Initialize(identity_manager->GetPrimaryAccountId(
-      signin::ConsentLevel::kNotRequired));
+  drive_service_->Initialize(
+      identity_manager->GetPrimaryAccountId(signin::ConsentLevel::kSignin));
 }
 
 void PluginVmDriveImageDownloadService::StartDownload(
diff --git a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc b/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc
index dec02fc..f80828c 100644
--- a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc
+++ b/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc
@@ -558,7 +558,7 @@
       }
     }
 
-    HeavyAdService* heavy_ad_service =
+    heavy_ad_intervention::HeavyAdService* heavy_ad_service =
         HeavyAdServiceFactory::GetForBrowserContext(profile_);
     if (heavy_ad_service && heavy_ad_service->heavy_ad_blocklist()) {
       heavy_ad_service->heavy_ad_blocklist()->ClearBlockList(delete_begin_,
diff --git a/chrome/browser/chrome_browser_interface_binders.cc b/chrome/browser/chrome_browser_interface_binders.cc
index e1087c20..8f78a67 100644
--- a/chrome/browser/chrome_browser_interface_binders.cc
+++ b/chrome/browser/chrome_browser_interface_binders.cc
@@ -304,8 +304,7 @@
       frame_host->GetProcess()->GetBrowserContext());
   auto* identity_manager = IdentityManagerFactory::GetForProfile(profile);
   ProfileManager* profile_manager = g_browser_process->profile_manager();
-  if (!identity_manager->HasPrimaryAccount(
-          signin::ConsentLevel::kNotRequired) &&
+  if (!identity_manager->HasPrimaryAccount(signin::ConsentLevel::kSignin) &&
       profile_manager->GetNumberOfProfiles() <= 1) {
     return;
   }
diff --git a/chrome/browser/chromeos/child_accounts/secondary_account_consent_logger.cc b/chrome/browser/chromeos/child_accounts/secondary_account_consent_logger.cc
index 777e5ae1..962e97e6 100644
--- a/chrome/browser/chromeos/child_accounts/secondary_account_consent_logger.cc
+++ b/chrome/browser/chromeos/child_accounts/secondary_account_consent_logger.cc
@@ -108,8 +108,8 @@
     const std::string& parent_obfuscated_gaia_id,
     const std::string& re_auth_proof_token,
     base::OnceCallback<void(Result)> callback)
-    : primary_account_id_(identity_manager->GetPrimaryAccountId(
-          signin::ConsentLevel::kNotRequired)),
+    : primary_account_id_(
+          identity_manager->GetPrimaryAccountId(signin::ConsentLevel::kSignin)),
       identity_manager_(identity_manager),
       url_loader_factory_(std::move(url_loader_factory)),
       pref_service_(pref_service),
@@ -132,7 +132,7 @@
               base::Unretained(this)),
           signin::PrimaryAccountAccessTokenFetcher::Mode::
               kWaitUntilAvailable /*mode*/,
-          signin::ConsentLevel::kNotRequired /*consent*/);
+          signin::ConsentLevel::kSignin /*consent*/);
 }
 
 void SecondaryAccountConsentLogger::OnAccessTokenFetchComplete(
diff --git a/chrome/browser/chromeos/child_accounts/secondary_account_consent_logger_unittest.cc b/chrome/browser/chromeos/child_accounts/secondary_account_consent_logger_unittest.cc
index 9ab377ae..0510e9e0 100644
--- a/chrome/browser/chromeos/child_accounts/secondary_account_consent_logger_unittest.cc
+++ b/chrome/browser/chromeos/child_accounts/secondary_account_consent_logger_unittest.cc
@@ -109,7 +109,7 @@
   void WaitForAccessTokenRequestAndIssueToken() {
     identity_test_env_.WaitForAccessTokenRequestIfNecessaryAndRespondWithToken(
         identity_test_env_.identity_manager()->GetPrimaryAccountId(
-            signin::ConsentLevel::kNotRequired),
+            signin::ConsentLevel::kSignin),
         "access_token", base::Time::Now() + base::TimeDelta::FromHours(1));
   }
 
@@ -163,7 +163,7 @@
                          SecondaryAccountConsentLogger::Result::kTokenError));
   identity_test_env_.WaitForAccessTokenRequestIfNecessaryAndRespondWithError(
       identity_test_env_.identity_manager()->GetPrimaryAccountId(
-          signin::ConsentLevel::kNotRequired),
+          signin::ConsentLevel::kSignin),
       GoogleServiceAuthError(GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS));
 }
 
diff --git a/chrome/browser/chromeos/extensions/file_manager/private_api_drive.cc b/chrome/browser/chromeos/extensions/file_manager/private_api_drive.cc
index 5c246794..41d57571 100644
--- a/chrome/browser/chromeos/extensions/file_manager/private_api_drive.cc
+++ b/chrome/browser/chromeos/extensions/file_manager/private_api_drive.cc
@@ -861,7 +861,7 @@
       IdentityManagerFactory::GetForProfile(chrome_details.GetProfile());
   // This class doesn't care about browser sync consent.
   const CoreAccountId& account_id =
-      identity_manager->GetPrimaryAccountId(signin::ConsentLevel::kNotRequired);
+      identity_manager->GetPrimaryAccountId(signin::ConsentLevel::kSignin);
   std::vector<std::string> scopes;
   scopes.emplace_back("https://www.googleapis.com/auth/drive.readonly");
 
diff --git a/chrome/browser/chromeos/extensions/file_manager/private_api_misc.cc b/chrome/browser/chromeos/extensions/file_manager/private_api_misc.cc
index ba56492..94e8fe1 100644
--- a/chrome/browser/chromeos/extensions/file_manager/private_api_misc.cc
+++ b/chrome/browser/chromeos/extensions/file_manager/private_api_misc.cc
@@ -379,7 +379,7 @@
   // "Unconsented" because this class doesn't care about browser sync consent.
   auth_service_ = std::make_unique<google_apis::AuthService>(
       identity_manager,
-      identity_manager->GetPrimaryAccountId(signin::ConsentLevel::kNotRequired),
+      identity_manager->GetPrimaryAccountId(signin::ConsentLevel::kSignin),
       g_browser_process->system_network_context_manager()
           ->GetSharedURLLoaderFactory(),
       scopes);
diff --git a/chrome/browser/chromeos/file_manager/file_manager_string_util.cc b/chrome/browser/chromeos/file_manager/file_manager_string_util.cc
index 9e652cb..f432993 100644
--- a/chrome/browser/chromeos/file_manager/file_manager_string_util.cc
+++ b/chrome/browser/chromeos/file_manager/file_manager_string_util.cc
@@ -1074,15 +1074,9 @@
   dict->SetBoolean("FILES_SINGLE_PARTITION_FORMAT_ENABLED",
                    base::FeatureList::IsEnabled(
                        chromeos::features::kFilesSinglePartitionFormat));
-  dict->SetBoolean(
-      "FILES_JS_MODULES_ENABLED",
-      base::FeatureList::IsEnabled(chromeos::features::kFilesJsModules));
-  dict->SetBoolean(
-      "AUDIO_PLAYER_JS_MODULES_ENABLED",
-      base::FeatureList::IsEnabled(chromeos::features::kAudioPlayerJsModules));
-  dict->SetBoolean(
-      "VIDEO_PLAYER_JS_MODULES_ENABLED",
-      base::FeatureList::IsEnabled(chromeos::features::kVideoPlayerJsModules));
+  dict->SetBoolean("FILES_JS_MODULES_ENABLED", true);
+  dict->SetBoolean("AUDIO_PLAYER_JS_MODULES_ENABLED", true);
+  dict->SetBoolean("VIDEO_PLAYER_JS_MODULES_ENABLED", true);
 
   dict->SetString("UI_LOCALE", locale);
 }
diff --git a/chrome/browser/chromeos/file_manager/url_util.cc b/chrome/browser/chromeos/file_manager/url_util.cc
index 872b716..78a6938 100644
--- a/chrome/browser/chromeos/file_manager/url_util.cc
+++ b/chrome/browser/chromeos/file_manager/url_util.cc
@@ -9,7 +9,6 @@
 #include <memory>
 #include <utility>
 
-#include "ash/constants/ash_features.h"
 #include "base/json/json_writer.h"
 #include "base/values.h"
 #include "chrome/browser/chromeos/file_manager/app_id.h"
@@ -66,11 +65,7 @@
 }  // namespace
 
 GURL GetFileManagerMainPageUrl() {
-  if (base::FeatureList::IsEnabled(chromeos::features::kFilesJsModules)) {
-    return GetFileManagerUrl("/main_modules.html");
-  } else {
-    return GetFileManagerUrl("/main.html");
-  }
+  return GetFileManagerUrl("/main_modules.html");
 }
 
 GURL GetFileManagerMainPageUrlWithParams(
diff --git a/chrome/browser/chromeos/file_manager/url_util_unittest.cc b/chrome/browser/chromeos/file_manager/url_util_unittest.cc
index bfbc3e2..70fa2a7 100644
--- a/chrome/browser/chromeos/file_manager/url_util_unittest.cc
+++ b/chrome/browser/chromeos/file_manager/url_util_unittest.cc
@@ -6,7 +6,6 @@
 
 #include <memory>
 
-#include "ash/constants/ash_features.h"
 #include "base/files/file_path.h"
 #include "base/json/json_reader.h"
 #include "base/json/json_writer.h"
@@ -38,14 +37,9 @@
 }
 
 TEST(FileManagerUrlUtilTest, GetFileManagerMainPageUrl) {
-  if (base::FeatureList::IsEnabled(chromeos::features::kFilesJsModules)) {
-    EXPECT_EQ(
-        "chrome-extension://hhaomjibdihmijegdhdafkllkbggdgoj/main_modules.html",
-        GetFileManagerMainPageUrl().spec());
-  } else {
-    EXPECT_EQ("chrome-extension://hhaomjibdihmijegdhdafkllkbggdgoj/main.html",
-              GetFileManagerMainPageUrl().spec());
-  }
+  EXPECT_EQ(
+      "chrome-extension://hhaomjibdihmijegdhdafkllkbggdgoj/main_modules.html",
+      GetFileManagerMainPageUrl().spec());
 }
 
 TEST(FileManagerUrlUtilTest, GetFileManagerMainPageUrlWithParams_NoFileTypes) {
@@ -60,11 +54,7 @@
   );
   EXPECT_EQ(extensions::kExtensionScheme, url.scheme());
   EXPECT_EQ("hhaomjibdihmijegdhdafkllkbggdgoj", url.host());
-  if (base::FeatureList::IsEnabled(chromeos::features::kFilesJsModules)) {
-    EXPECT_EQ("/main_modules.html", url.path());
-  } else {
-    EXPECT_EQ("/main.html", url.path());
-  }
+  EXPECT_EQ("/main_modules.html", url.path());
   // Confirm that "%20" is used instead of "+" in the query.
   EXPECT_TRUE(url.query().find("+") == std::string::npos);
   EXPECT_TRUE(url.query().find("%20") != std::string::npos);
@@ -112,11 +102,7 @@
   );
   EXPECT_EQ(extensions::kExtensionScheme, url.scheme());
   EXPECT_EQ("hhaomjibdihmijegdhdafkllkbggdgoj", url.host());
-  if (base::FeatureList::IsEnabled(chromeos::features::kFilesJsModules)) {
-    EXPECT_EQ("/main_modules.html", url.path());
-  } else {
-    EXPECT_EQ("/main.html", url.path());
-  }
+  EXPECT_EQ("/main_modules.html", url.path());
   // Confirm that "%20" is used instead of "+" in the query.
   EXPECT_TRUE(url.query().find("+") == std::string::npos);
   EXPECT_TRUE(url.query().find("%20") != std::string::npos);
diff --git a/chrome/browser/chromeos/policy/device_local_account_browsertest.cc b/chrome/browser/chromeos/policy/device_local_account_browsertest.cc
index 1bac6d6..b9c09f4 100644
--- a/chrome/browser/chromeos/policy/device_local_account_browsertest.cc
+++ b/chrome/browser/chromeos/policy/device_local_account_browsertest.cc
@@ -1028,7 +1028,7 @@
   ASSERT_TRUE(profile);
   EXPECT_FALSE(
       IdentityManagerFactory::GetForProfile(profile)->HasPrimaryAccount(
-          signin::ConsentLevel::kNotRequired));
+          signin::ConsentLevel::kSignin));
 }
 
 IN_PROC_BROWSER_TEST_F(DeviceLocalAccountTest, FullscreenAllowed) {
diff --git a/chrome/browser/chromeos/policy/lock_to_single_user_manager.cc b/chrome/browser/chromeos/policy/lock_to_single_user_manager.cc
index 6094a1bf..a89ad2f 100644
--- a/chrome/browser/chromeos/policy/lock_to_single_user_manager.cc
+++ b/chrome/browser/chromeos/policy/lock_to_single_user_manager.cc
@@ -14,8 +14,8 @@
 #include "chrome/browser/chromeos/crostini/crostini_manager.h"
 #include "chrome/browser/lifetime/application_lifetime.h"
 #include "chromeos/cryptohome/cryptohome_parameters.h"
-#include "chromeos/dbus/cryptohome/cryptohome_client.h"
 #include "chromeos/dbus/dbus_thread_manager.h"
+#include "chromeos/dbus/userdataauth/cryptohome_misc_client.h"
 #include "chromeos/login/session/session_termination_manager.h"
 #include "chromeos/settings/cros_settings_names.h"
 #include "components/policy/proto/chrome_device_policy.pb.h"
@@ -23,10 +23,9 @@
 using RebootOnSignOutPolicy =
     enterprise_management::DeviceRebootOnUserSignoutProto;
 using RebootOnSignOutRequest =
-    cryptohome::LockToSingleUserMountUntilRebootRequest;
-using RebootOnSignOutReply = cryptohome::LockToSingleUserMountUntilRebootReply;
-using RebootOnSignOutResult =
-    cryptohome::LockToSingleUserMountUntilRebootResult;
+    user_data_auth::LockToSingleUserMountUntilRebootRequest;
+using RebootOnSignOutReply =
+    user_data_auth::LockToSingleUserMountUntilRebootReply;
 
 namespace policy {
 
@@ -144,7 +143,7 @@
           user_manager::UserManager::Get()->GetPrimaryUser()->GetAccountId());
   RebootOnSignOutRequest request;
   request.mutable_account_id()->CopyFrom(account_id);
-  chromeos::CryptohomeClient::Get()->LockToSingleUserMountUntilReboot(
+  chromeos::CryptohomeMiscClient::Get()->LockToSingleUserMountUntilReboot(
       request,
       base::BindOnce(
           &LockToSingleUserManager::OnLockToSingleUserMountUntilRebootDone,
@@ -152,8 +151,8 @@
 }
 
 void LockToSingleUserManager::OnLockToSingleUserMountUntilRebootDone(
-    base::Optional<cryptohome::BaseReply> reply) {
-  if (!reply || !reply->HasExtension(RebootOnSignOutReply::reply)) {
+    base::Optional<RebootOnSignOutReply> reply) {
+  if (!reply.has_value()) {
     LOG(ERROR) << "Signing out user: no reply from "
                   "LockToSingleUserMountUntilReboot D-Bus call.";
     chrome::AttemptUserExit();
@@ -161,17 +160,15 @@
   }
 
   // Force user logout if failed to lock the device to single user mount.
-  const RebootOnSignOutReply extension =
-      reply->GetExtension(RebootOnSignOutReply::reply);
-
-  if (extension.result() == RebootOnSignOutResult::SUCCESS ||
-      extension.result() == RebootOnSignOutResult::PCR_ALREADY_EXTENDED) {
+  if (reply->error() ==
+          user_data_auth::CryptohomeErrorCode::CRYPTOHOME_ERROR_NOT_SET ||
+      reply->error() == user_data_auth::CRYPTOHOME_ERROR_PCR_ALREADY_EXTENDED) {
     // The device is locked to single user on TPM level. Update the cache in
     // SessionTerminationManager, so that it triggers reboot on sign out.
     chromeos::SessionTerminationManager::Get()->SetDeviceLockedToSingleUser();
   } else {
     LOG(ERROR) << "Signing out user: failed to lock device to single user: "
-               << extension.result();
+               << reply->error();
     chrome::AttemptUserExit();
   }
 }
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 eeaf53e..97a0665c 100644
--- a/chrome/browser/chromeos/policy/lock_to_single_user_manager.h
+++ b/chrome/browser/chromeos/policy/lock_to_single_user_manager.h
@@ -12,7 +12,7 @@
 #include "chrome/browser/ash/arc/session/arc_session_manager.h"
 #include "chrome/browser/chromeos/vm_starting_observer.h"
 #include "chromeos/dbus/concierge_client.h"
-#include "chromeos/dbus/cryptohome/rpc.pb.h"
+#include "chromeos/dbus/cryptohome/UserDataAuth.pb.h"
 #include "components/user_manager/user_manager.h"
 
 namespace policy {
@@ -60,7 +60,8 @@
 
   // Processes the response from D-Bus call.
   void OnLockToSingleUserMountUntilRebootDone(
-      base::Optional<cryptohome::BaseReply> reply);
+      base::Optional<user_data_auth::LockToSingleUserMountUntilRebootReply>
+          reply);
 
   // true if locking is required when DbusNotifyVmStarting() is called
   bool lock_to_single_user_on_dbus_call_ = false;
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 8a03155f..18a17c9 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
@@ -14,9 +14,9 @@
 #include "chrome/browser/ash/login/users/fake_chrome_user_manager.h"
 #include "chrome/browser/ui/app_list/arc/arc_app_test.h"
 #include "chrome/test/base/browser_with_test_window_test.h"
-#include "chromeos/dbus/cryptohome/fake_cryptohome_client.h"
 #include "chromeos/dbus/dbus_thread_manager.h"
 #include "chromeos/dbus/fake_concierge_client.h"
+#include "chromeos/dbus/userdataauth/fake_cryptohome_misc_client.h"
 #include "chromeos/login/session/session_termination_manager.h"
 #include "chromeos/settings/cros_settings_names.h"
 #include "components/account_id/account_id.h"
@@ -42,7 +42,7 @@
 
     arc::SetArcAvailableCommandLineForTesting(
         base::CommandLine::ForCurrentProcess());
-    chromeos::CryptohomeClient::InitializeFake();
+    chromeos::CryptohomeMiscClient::InitializeFake();
     lock_to_single_user_manager_ = std::make_unique<LockToSingleUserManager>();
 
     BrowserWithTestWindowTest::SetUp();
@@ -71,7 +71,7 @@
     arc_service_manager_->set_browser_context(nullptr);
     arc_service_manager_.reset();
     BrowserWithTestWindowTest::TearDown();
-    chromeos::CryptohomeClient::Shutdown();
+    chromeos::CryptohomeMiscClient::Shutdown();
     chromeos::DBusThreadManager::Shutdown();
   }
 
@@ -127,7 +127,7 @@
   }
 
   bool is_device_locked() const {
-    return chromeos::FakeCryptohomeClient::Get()
+    return chromeos::FakeCryptohomeMiscClient::Get()
         ->is_device_locked_to_single_user();
   }
 
@@ -235,8 +235,8 @@
 }
 
 TEST_F(LockToSingleUserManagerTest, DbusCallErrorTest) {
-  chromeos::FakeCryptohomeClient::Get()->set_cryptohome_error(
-      cryptohome::CRYPTOHOME_ERROR_KEY_NOT_FOUND);
+  chromeos::FakeCryptohomeMiscClient::Get()->set_cryptohome_error(
+      ::user_data_auth::CryptohomeErrorCode::CRYPTOHOME_ERROR_KEY_NOT_FOUND);
   SetPolicyValue(enterprise_management::DeviceRebootOnUserSignoutProto::ALWAYS);
   LogInUser(false /* is_affiliated */);
   EXPECT_FALSE(is_device_locked());
diff --git a/chrome/browser/chromeos/policy/user_cloud_policy_token_forwarder.cc b/chrome/browser/chromeos/policy/user_cloud_policy_token_forwarder.cc
index 99be3355..a7310df 100644
--- a/chrome/browser/chromeos/policy/user_cloud_policy_token_forwarder.cc
+++ b/chrome/browser/chromeos/policy/user_cloud_policy_token_forwarder.cc
@@ -114,7 +114,7 @@
               &UserCloudPolicyTokenForwarder::OnAccessTokenFetchCompleted,
               base::Unretained(this)),
           signin::PrimaryAccountAccessTokenFetcher::Mode::kWaitUntilAvailable,
-          signin::ConsentLevel::kNotRequired);
+          signin::ConsentLevel::kSignin);
 }
 
 void UserCloudPolicyTokenForwarder::OnAccessTokenFetchCompleted(
diff --git a/chrome/browser/chromeos/sync/turn_sync_on_helper.cc b/chrome/browser/chromeos/sync/turn_sync_on_helper.cc
index 71baba3..67ebc2fd 100644
--- a/chrome/browser/chromeos/sync/turn_sync_on_helper.cc
+++ b/chrome/browser/chromeos/sync/turn_sync_on_helper.cc
@@ -204,8 +204,8 @@
       }
       if (consent_service)
         consent_service->SetUrlKeyedAnonymizedDataCollectionEnabled(true);
-      CoreAccountId account_id = identity_manager_->GetPrimaryAccountId(
-          signin::ConsentLevel::kNotRequired);
+      CoreAccountId account_id =
+          identity_manager_->GetPrimaryAccountId(signin::ConsentLevel::kSignin);
       DCHECK(!account_id.empty());
       // TODO(https://crbug.com/1046746): Switch to consent-aware API
       // PrimaryAccountMutator::GrantSyncConsent() when that exists.
diff --git a/chrome/browser/chromeos/ui/low_disk_notification.cc b/chrome/browser/chromeos/ui/low_disk_notification.cc
index 9735d76..51e0a361 100644
--- a/chrome/browser/chromeos/ui/low_disk_notification.cc
+++ b/chrome/browser/chromeos/ui/low_disk_notification.cc
@@ -21,7 +21,6 @@
 #include "chrome/browser/ui/webui/settings/chromeos/constants/routes.mojom.h"
 #include "chrome/common/webui_url_constants.h"
 #include "chrome/grit/generated_resources.h"
-#include "chromeos/dbus/cryptohome/cryptohome_client.h"
 #include "chromeos/dbus/dbus_thread_manager.h"
 #include "chromeos/settings/cros_settings_names.h"
 #include "components/user_manager/user_manager.h"
@@ -47,16 +46,17 @@
 
 LowDiskNotification::LowDiskNotification()
     : notification_interval_(kNotificationInterval) {
-  DCHECK(CryptohomeClient::Get());
-  CryptohomeClient::Get()->AddObserver(this);
+  DCHECK(UserDataAuthClient::Get());
+  UserDataAuthClient::Get()->AddObserver(this);
 }
 
 LowDiskNotification::~LowDiskNotification() {
-  DCHECK(CryptohomeClient::Get());
-  CryptohomeClient::Get()->RemoveObserver(this);
+  DCHECK(UserDataAuthClient::Get());
+  UserDataAuthClient::Get()->RemoveObserver(this);
 }
 
-void LowDiskNotification::LowDiskSpace(uint64_t free_disk_bytes) {
+void LowDiskNotification::LowDiskSpace(
+    const ::user_data_auth::LowDiskSpace& status) {
   DCHECK(thread_checker_.CalledOnValidThread());
 
   bool show_low_disk_space_notification = true;
@@ -75,7 +75,7 @@
                  << "suppressed on a managed device.";
     return;
   }
-  Severity severity = GetSeverity(free_disk_bytes);
+  Severity severity = GetSeverity(status.disk_free_bytes());
   base::Time now = base::Time::Now();
   if (severity != last_notification_severity_ ||
       (severity == HIGH &&
diff --git a/chrome/browser/chromeos/ui/low_disk_notification.h b/chrome/browser/chromeos/ui/low_disk_notification.h
index 38241c75..0f2250d 100644
--- a/chrome/browser/chromeos/ui/low_disk_notification.h
+++ b/chrome/browser/chromeos/ui/low_disk_notification.h
@@ -13,7 +13,7 @@
 #include "base/memory/weak_ptr.h"
 #include "base/threading/thread_checker.h"
 #include "base/time/time.h"
-#include "chromeos/dbus/cryptohome/cryptohome_client.h"
+#include "chromeos/dbus/userdataauth/userdataauth_client.h"
 
 namespace message_center {
 class Notification;
@@ -27,19 +27,19 @@
 // This class should be created after DBus has been initialized and destroyed
 // before DBus has been shutdown.
 // This class must be instantiated on the UI thread.
-class LowDiskNotification : public CryptohomeClient::Observer {
+class LowDiskNotification : public UserDataAuthClient::Observer {
  public:
-  // Registers this class as the CryptohomeClient LowDiskSpaceHandler.
+  // Registers this class as the UserDataAuthClient LowDiskSpaceHandler.
   LowDiskNotification();
 
-  // Resets CryptohomeClient LowDiskSpaceHandler.
+  // Resets UserDataAuthClient LowDiskSpaceHandler.
   ~LowDiskNotification() override;
 
   // Called when the device is running low on disk space.  This is responsible
   // for deciding whether a notification should be shown or not and showing it
   // if appropriate.  This must be called from the thread that instantiated this
   // object.
-  void LowDiskSpace(uint64_t free_disk_bytes) override;
+  void LowDiskSpace(const ::user_data_auth::LowDiskSpace& status) override;
 
  private:
   friend class LowDiskNotificationTest;
diff --git a/chrome/browser/chromeos/ui/low_disk_notification_unittest.cc b/chrome/browser/chromeos/ui/low_disk_notification_unittest.cc
index 0caf6da..8d400b5 100644
--- a/chrome/browser/chromeos/ui/low_disk_notification_unittest.cc
+++ b/chrome/browser/chromeos/ui/low_disk_notification_unittest.cc
@@ -17,8 +17,8 @@
 #include "chrome/test/base/browser_with_test_window_test.h"
 #include "chrome/test/base/testing_browser_process.h"
 #include "chrome/test/base/testing_profile_manager.h"
-#include "chromeos/dbus/cryptohome/fake_cryptohome_client.h"
 #include "chromeos/dbus/dbus_thread_manager.h"
+#include "chromeos/dbus/userdataauth/fake_userdataauth_client.h"
 #include "chromeos/settings/cros_settings_names.h"
 #include "components/user_manager/fake_user_manager.h"
 #include "components/user_manager/scoped_user_manager.h"
@@ -43,7 +43,7 @@
 
   void SetUp() override {
     BrowserWithTestWindowTest::SetUp();
-    CryptohomeClient::InitializeFake();
+    UserDataAuthClient::InitializeFake();
 
     GetCrosSettingsHelper()->ReplaceDeviceSettingsProviderWithStub();
     GetCrosSettingsHelper()->SetBoolean(
@@ -62,11 +62,14 @@
         &LowDiskNotificationTest::OnNotificationAdded, base::Unretained(this)));
     low_disk_notification_ = std::make_unique<LowDiskNotification>();
     notification_count_ = 0;
+
+    medium_message_.set_disk_free_bytes(kMediumNotification);
+    high_message_.set_disk_free_bytes(kHighNotification);
   }
 
   void TearDown() override {
     low_disk_notification_.reset();
-    CryptohomeClient::Shutdown();
+    UserDataAuthClient::Shutdown();
     BrowserWithTestWindowTest::TearDown();
   }
 
@@ -87,12 +90,17 @@
   std::unique_ptr<NotificationDisplayServiceTester> tester_;
   std::unique_ptr<LowDiskNotification> low_disk_notification_;
   int notification_count_;
+
+  // A LowDiskSpace protobuf message that contains `kMediumNotification`.
+  ::user_data_auth::LowDiskSpace medium_message_;
+  // A LowDiskSpace protobuf message that contains `kHighNotification`.
+  ::user_data_auth::LowDiskSpace high_message_;
 };
 
 TEST_F(LowDiskNotificationTest, MediumLevelNotification) {
   std::u16string expected_title =
       l10n_util::GetStringUTF16(IDS_LOW_DISK_NOTIFICATION_TITLE);
-  low_disk_notification_->LowDiskSpace(kMediumNotification);
+  low_disk_notification_->LowDiskSpace(medium_message_);
   auto notification = GetNotification();
   ASSERT_TRUE(notification);
   EXPECT_EQ(expected_title, notification->title());
@@ -102,8 +110,8 @@
 TEST_F(LowDiskNotificationTest, HighLevelReplacesMedium) {
   std::u16string expected_title =
       l10n_util::GetStringUTF16(IDS_CRITICALLY_LOW_DISK_NOTIFICATION_TITLE);
-  low_disk_notification_->LowDiskSpace(kMediumNotification);
-  low_disk_notification_->LowDiskSpace(kHighNotification);
+  low_disk_notification_->LowDiskSpace(medium_message_);
+  low_disk_notification_->LowDiskSpace(high_message_);
   auto notification = GetNotification();
   ASSERT_TRUE(notification);
   EXPECT_EQ(expected_title, notification->title());
@@ -112,22 +120,22 @@
 
 TEST_F(LowDiskNotificationTest, NotificationsAreThrottled) {
   SetNotificationThrottlingInterval(10000000);
-  low_disk_notification_->LowDiskSpace(kHighNotification);
-  low_disk_notification_->LowDiskSpace(kHighNotification);
+  low_disk_notification_->LowDiskSpace(high_message_);
+  low_disk_notification_->LowDiskSpace(high_message_);
   EXPECT_EQ(1, notification_count_);
 }
 
 TEST_F(LowDiskNotificationTest, HighNotificationsAreShownAfterThrottling) {
   SetNotificationThrottlingInterval(-1);
-  low_disk_notification_->LowDiskSpace(kHighNotification);
-  low_disk_notification_->LowDiskSpace(kHighNotification);
+  low_disk_notification_->LowDiskSpace(high_message_);
+  low_disk_notification_->LowDiskSpace(high_message_);
   EXPECT_EQ(2, notification_count_);
 }
 
 TEST_F(LowDiskNotificationTest, MediumNotificationsAreNotShownAfterThrottling) {
   SetNotificationThrottlingInterval(-1);
-  low_disk_notification_->LowDiskSpace(kMediumNotification);
-  low_disk_notification_->LowDiskSpace(kMediumNotification);
+  low_disk_notification_->LowDiskSpace(medium_message_);
+  low_disk_notification_->LowDiskSpace(medium_message_);
   EXPECT_EQ(1, notification_count_);
 }
 
@@ -138,7 +146,7 @@
       AccountId::FromUserEmailGaiaId("test_user2@example.com", "1234567892"));
 
   SetNotificationThrottlingInterval(-1);
-  low_disk_notification_->LowDiskSpace(kHighNotification);
+  low_disk_notification_->LowDiskSpace(high_message_);
   EXPECT_EQ(1, notification_count_);
 }
 
@@ -152,7 +160,7 @@
       chromeos::kDeviceShowLowDiskSpaceNotification, false);
 
   SetNotificationThrottlingInterval(-1);
-  low_disk_notification_->LowDiskSpace(kHighNotification);
+  low_disk_notification_->LowDiskSpace(high_message_);
   EXPECT_EQ(0, notification_count_);
 }
 
diff --git a/chrome/browser/extensions/api/feedback_private/chrome_feedback_private_delegate.cc b/chrome/browser/extensions/api/feedback_private/chrome_feedback_private_delegate.cc
index 58082d00..d2eb14c 100644
--- a/chrome/browser/extensions/api/feedback_private/chrome_feedback_private_delegate.cc
+++ b/chrome/browser/extensions/api/feedback_private/chrome_feedback_private_delegate.cc
@@ -258,8 +258,7 @@
   if (!identity_manager)
     return std::string();
   // Browser sync consent is not required to use feedback.
-  return identity_manager
-      ->GetPrimaryAccountInfo(signin::ConsentLevel::kNotRequired)
+  return identity_manager->GetPrimaryAccountInfo(signin::ConsentLevel::kSignin)
       .email;
 }
 
diff --git a/chrome/browser/extensions/api/identity/gaia_remote_consent_flow.cc b/chrome/browser/extensions/api/identity/gaia_remote_consent_flow.cc
index c94ddd0..25cb3d2 100644
--- a/chrome/browser/extensions/api/identity/gaia_remote_consent_flow.cc
+++ b/chrome/browser/extensions/api/identity/gaia_remote_consent_flow.cc
@@ -144,9 +144,10 @@
 
 std::unique_ptr<GaiaAuthFetcher>
 GaiaRemoteConsentFlow::CreateGaiaAuthFetcherForPartition(
-    GaiaAuthConsumer* consumer) {
+    GaiaAuthConsumer* consumer,
+    const gaia::GaiaSource& source) {
   return std::make_unique<GaiaAuthFetcher>(
-      consumer, gaia::GaiaSource::kChrome,
+      consumer, source,
       web_flow_->GetGuestPartition()->GetURLLoaderFactoryForBrowserProcess());
 }
 
@@ -211,6 +212,7 @@
               this,
               {gaia::MultiloginMode::MULTILOGIN_UPDATE_COOKIE_ACCOUNTS_ORDER,
                accounts},
+              gaia::GaiaSource::kChrome,
               base::BindOnce(&GaiaRemoteConsentFlow::OnSetAccountsComplete,
                              base::Unretained(this)));
 }
diff --git a/chrome/browser/extensions/api/identity/gaia_remote_consent_flow.h b/chrome/browser/extensions/api/identity/gaia_remote_consent_flow.h
index ec2b56e..169ed44f 100644
--- a/chrome/browser/extensions/api/identity/gaia_remote_consent_flow.h
+++ b/chrome/browser/extensions/api/identity/gaia_remote_consent_flow.h
@@ -73,7 +73,9 @@
 
   // signin::AccountsCookieMutator::PartitionDelegate:
   std::unique_ptr<GaiaAuthFetcher> CreateGaiaAuthFetcherForPartition(
-      GaiaAuthConsumer* consumer) override;
+
+      GaiaAuthConsumer* consumer,
+      const gaia::GaiaSource& source) override;
   network::mojom::CookieManager* GetCookieManagerForPartition() override;
 
   // signin::IdentityManager::Observer:
diff --git a/chrome/browser/extensions/api/identity/identity_get_profile_user_info_function.cc b/chrome/browser/extensions/api/identity/identity_get_profile_user_info_function.cc
index 5ce89bdf..aac2b5c 100644
--- a/chrome/browser/extensions/api/identity/identity_get_profile_user_info_function.cc
+++ b/chrome/browser/extensions/api/identity/identity_get_profile_user_info_function.cc
@@ -26,7 +26,7 @@
 
   switch (account_status) {
     case api::identity::ACCOUNT_STATUS_ANY:
-      return signin::ConsentLevel::kNotRequired;
+      return signin::ConsentLevel::kSignin;
     case api::identity::ACCOUNT_STATUS_NONE:
     case api::identity::ACCOUNT_STATUS_SYNC:
       return signin::ConsentLevel::kSync;
diff --git a/chrome/browser/feedback/feedback_uploader_chrome.cc b/chrome/browser/feedback/feedback_uploader_chrome.cc
index 2b54c36..2d7db98 100644
--- a/chrome/browser/feedback/feedback_uploader_chrome.cc
+++ b/chrome/browser/feedback/feedback_uploader_chrome.cc
@@ -128,7 +128,7 @@
   // Sync consent is not required to send feedback because the feedback dialog
   // has its own privacy notice.
   if (identity_manager &&
-      identity_manager->HasPrimaryAccount(signin::ConsentLevel::kNotRequired)) {
+      identity_manager->HasPrimaryAccount(signin::ConsentLevel::kSignin)) {
     signin::ScopeSet scopes;
     scopes.insert(kScope);
     primary_account_token_fetcher_ =
@@ -138,7 +138,7 @@
                 &FeedbackUploaderChrome::PrimaryAccountAccessTokenAvailable,
                 base::Unretained(this)),
             signin::PrimaryAccountAccessTokenFetcher::Mode::kImmediate,
-            signin::ConsentLevel::kNotRequired);
+            signin::ConsentLevel::kSignin);
     return;
   }
 
diff --git a/chrome/browser/feedback/show_feedback_page.cc b/chrome/browser/feedback/show_feedback_page.cc
index 6ac0043..5fd7e58 100644
--- a/chrome/browser/feedback/show_feedback_page.cc
+++ b/chrome/browser/feedback/show_feedback_page.cc
@@ -47,8 +47,8 @@
   if (!identity_manager)  // Non-GAIA account, e.g. guest mode.
     return false;
   // Browser sync consent is not required to use feedback.
-  CoreAccountInfo account_info = identity_manager->GetPrimaryAccountInfo(
-      signin::ConsentLevel::kNotRequired);
+  CoreAccountInfo account_info =
+      identity_manager->GetPrimaryAccountInfo(signin::ConsentLevel::kSignin);
   return gaia::IsGoogleInternalAccountEmail(account_info.email);
 }
 
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
index 3613208..85f7b96 100644
--- a/chrome/browser/flag-metadata.json
+++ b/chrome/browser/flag-metadata.json
@@ -5183,6 +5183,11 @@
     "expiry_milestone": 93
   },
   {
+    "name": "wake-on-wifi-allowed",
+    "owners": [ "yenlinlai", "chromeos-wifi-team" ],
+    "expiry_milestone": 95
+  },
+  {
     "name": "wallet-requires-first-sync-setup",
     "owners": [ "treib", "butter-team@google.com" ],
     "expiry_milestone": 95
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index e3fe615..38174f97 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -4805,6 +4805,10 @@
 const char kVmCameraMicIndicatorsAndNotificationsDescription[] =
     "Show VM camera/mic indicators/notifications";
 
+const char kWakeOnWifiAllowedName[] = "Allow enabling wake on WiFi features";
+const char kWakeOnWifiAllowedDescription[] =
+    "Allows wake on WiFi features in shill to be enabled.";
+
 const char kWebuiDarkModeName[] = "WebUI dark mode";
 const char kWebuiDarkModeDescription[] =
     "Allows dark mode usage in WebUI. Note that this does not necessary enable "
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index e9cfc8f..ce36af0 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -2792,6 +2792,9 @@
 extern const char kVmCameraMicIndicatorsAndNotificationsName[];
 extern const char kVmCameraMicIndicatorsAndNotificationsDescription[];
 
+extern const char kWakeOnWifiAllowedName[];
+extern const char kWakeOnWifiAllowedDescription[];
+
 extern const char kWebuiDarkModeName[];
 extern const char kWebuiDarkModeDescription[];
 
diff --git a/chrome/browser/heavy_ad_intervention/heavy_ad_helper_browsertest.cc b/chrome/browser/heavy_ad_intervention/heavy_ad_helper_browsertest.cc
index 91e7c73..bc90980 100644
--- a/chrome/browser/heavy_ad_intervention/heavy_ad_helper_browsertest.cc
+++ b/chrome/browser/heavy_ad_intervention/heavy_ad_helper_browsertest.cc
@@ -66,7 +66,8 @@
   content::TestNavigationObserver error_observer(web_contents);
   controller.LoadPostCommitErrorPage(
       child, url,
-      heavy_ads::PrepareHeavyAdPage(g_browser_process->GetApplicationLocale()),
+      heavy_ad_intervention::PrepareHeavyAdPage(
+          g_browser_process->GetApplicationLocale()),
       net::ERR_BLOCKED_BY_CLIENT);
   error_observer.Wait();
 
@@ -94,7 +95,8 @@
   content::TestNavigationObserver error_observer(web_contents);
   controller.LoadPostCommitErrorPage(
       child, url,
-      heavy_ads::PrepareHeavyAdPage(g_browser_process->GetApplicationLocale()),
+      heavy_ad_intervention::PrepareHeavyAdPage(
+          g_browser_process->GetApplicationLocale()),
       net::ERR_BLOCKED_BY_CLIENT);
   error_observer.Wait();
 
diff --git a/chrome/browser/heavy_ad_intervention/heavy_ad_service_factory.cc b/chrome/browser/heavy_ad_intervention/heavy_ad_service_factory.cc
index 8a749e50..f918aea 100644
--- a/chrome/browser/heavy_ad_intervention/heavy_ad_service_factory.cc
+++ b/chrome/browser/heavy_ad_intervention/heavy_ad_service_factory.cc
@@ -18,9 +18,9 @@
 }  // namespace
 
 // static
-HeavyAdService* HeavyAdServiceFactory::GetForBrowserContext(
-    content::BrowserContext* context) {
-  return static_cast<HeavyAdService*>(
+heavy_ad_intervention::HeavyAdService*
+HeavyAdServiceFactory::GetForBrowserContext(content::BrowserContext* context) {
+  return static_cast<heavy_ad_intervention::HeavyAdService*>(
       GetInstance()->GetServiceForBrowserContext(context, true));
 }
 
@@ -38,7 +38,7 @@
 
 KeyedService* HeavyAdServiceFactory::BuildServiceInstanceFor(
     content::BrowserContext* context) const {
-  return new HeavyAdService();
+  return new heavy_ad_intervention::HeavyAdService();
 }
 
 content::BrowserContext* HeavyAdServiceFactory::GetBrowserContextToUse(
diff --git a/chrome/browser/heavy_ad_intervention/heavy_ad_service_factory.h b/chrome/browser/heavy_ad_intervention/heavy_ad_service_factory.h
index 2a97731..71f67b87 100644
--- a/chrome/browser/heavy_ad_intervention/heavy_ad_service_factory.h
+++ b/chrome/browser/heavy_ad_intervention/heavy_ad_service_factory.h
@@ -13,14 +13,17 @@
 class BrowserContext;
 }
 
+namespace heavy_ad_intervention {
 class HeavyAdService;
+}
 
 // LazyInstance that owns all HeavyAdServices and associates them with
 // Profiles.
 class HeavyAdServiceFactory : public BrowserContextKeyedServiceFactory {
  public:
   // Gets the HeavyAdService instance for |context|.
-  static HeavyAdService* GetForBrowserContext(content::BrowserContext* context);
+  static heavy_ad_intervention::HeavyAdService* GetForBrowserContext(
+      content::BrowserContext* context);
 
   // Gets the LazyInstance that owns all HeavyAdServices.
   static HeavyAdServiceFactory* GetInstance();
diff --git a/chrome/browser/lacros/feedback_util.cc b/chrome/browser/lacros/feedback_util.cc
index e8d39f1..0db82d8 100644
--- a/chrome/browser/lacros/feedback_util.cc
+++ b/chrome/browser/lacros/feedback_util.cc
@@ -18,8 +18,7 @@
   if (!identity_manager)
     return std::string();
   // Browser sync consent is not required to use feedback.
-  return identity_manager
-      ->GetPrimaryAccountInfo(signin::ConsentLevel::kNotRequired)
+  return identity_manager->GetPrimaryAccountInfo(signin::ConsentLevel::kSignin)
       .email;
 }
 
diff --git a/chrome/browser/metrics/family_link_user_metrics_provider.cc b/chrome/browser/metrics/family_link_user_metrics_provider.cc
index 62ede665..b8843d5 100644
--- a/chrome/browser/metrics/family_link_user_metrics_provider.cc
+++ b/chrome/browser/metrics/family_link_user_metrics_provider.cc
@@ -84,7 +84,7 @@
               // primary_account_access_token_fetcher.h.
               base::Unretained(this)),
           signin::PrimaryAccountAccessTokenFetcher::Mode::kImmediate,
-          signin::ConsentLevel::kNotRequired);
+          signin::ConsentLevel::kSignin);
 }
 
 // static
diff --git a/chrome/browser/nearby_sharing/client/nearby_share_client_impl.cc b/chrome/browser/nearby_sharing/client/nearby_share_client_impl.cc
index b8d2bf8..90bd3090 100644
--- a/chrome/browser/nearby_sharing/client/nearby_share_client_impl.cc
+++ b/chrome/browser/nearby_sharing/client/nearby_share_client_impl.cc
@@ -305,7 +305,7 @@
               weak_ptr_factory_.GetWeakPtr(), request_type, serialized_request,
               request_as_query_parameters, std::move(response_callback)),
           signin::PrimaryAccountAccessTokenFetcher::Mode::kWaitUntilAvailable,
-          signin::ConsentLevel::kNotRequired);
+          signin::ConsentLevel::kSignin);
 }
 
 template <class ResponseProto>
diff --git a/chrome/browser/nearby_sharing/instantmessaging/token_fetcher.cc b/chrome/browser/nearby_sharing/instantmessaging/token_fetcher.cc
index f49354cf..c74f3fe 100644
--- a/chrome/browser/nearby_sharing/instantmessaging/token_fetcher.cc
+++ b/chrome/browser/nearby_sharing/instantmessaging/token_fetcher.cc
@@ -22,8 +22,7 @@
   // users.
 
   token_fetcher_ = identity_manager_->CreateAccessTokenFetcherForAccount(
-      identity_manager_->GetPrimaryAccountId(
-          signin::ConsentLevel::kNotRequired),
+      identity_manager_->GetPrimaryAccountId(signin::ConsentLevel::kSignin),
       kOAuthConsumerName, {GaiaConstants::kTachyonOAuthScope},
       base::BindOnce(&TokenFetcher::OnOAuthTokenFetched,
                      weak_ptr_factory_.GetWeakPtr(), std::move(callback)),
diff --git a/chrome/browser/nfc/chrome_nfc_permission_context_delegate.cc b/chrome/browser/nfc/chrome_nfc_permission_context_delegate.cc
new file mode 100644
index 0000000..d450e770
--- /dev/null
+++ b/chrome/browser/nfc/chrome_nfc_permission_context_delegate.cc
@@ -0,0 +1,23 @@
+// Copyright 2021 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 "chrome/browser/nfc/chrome_nfc_permission_context_delegate.h"
+
+#if defined(OS_ANDROID)
+#include "chrome/browser/android/tab_android.h"
+#endif
+
+ChromeNfcPermissionContextDelegate::ChromeNfcPermissionContextDelegate() =
+    default;
+
+ChromeNfcPermissionContextDelegate::~ChromeNfcPermissionContextDelegate() =
+    default;
+
+#if defined(OS_ANDROID)
+bool ChromeNfcPermissionContextDelegate::IsInteractable(
+    content::WebContents* web_contents) {
+  TabAndroid* tab = TabAndroid::FromWebContents(web_contents);
+  return tab && tab->IsUserInteractable();
+}
+#endif
diff --git a/chrome/browser/nfc/chrome_nfc_permission_context_delegate.h b/chrome/browser/nfc/chrome_nfc_permission_context_delegate.h
new file mode 100644
index 0000000..ada03bb
--- /dev/null
+++ b/chrome/browser/nfc/chrome_nfc_permission_context_delegate.h
@@ -0,0 +1,29 @@
+// Copyright 2021 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 CHROME_BROWSER_NFC_CHROME_NFC_PERMISSION_CONTEXT_DELEGATE_H_
+#define CHROME_BROWSER_NFC_CHROME_NFC_PERMISSION_CONTEXT_DELEGATE_H_
+
+#include "build/build_config.h"
+#include "chrome/browser/nfc/nfc_permission_context.h"
+
+class ChromeNfcPermissionContextDelegate
+    : public NfcPermissionContext::Delegate {
+ public:
+  ChromeNfcPermissionContextDelegate();
+
+  ChromeNfcPermissionContextDelegate(
+      const ChromeNfcPermissionContextDelegate&) = delete;
+  ChromeNfcPermissionContextDelegate& operator=(
+      const ChromeNfcPermissionContextDelegate&) = delete;
+
+  ~ChromeNfcPermissionContextDelegate() override;
+
+  // NfcPermissionContext::Delegate:
+#if defined(OS_ANDROID)
+  bool IsInteractable(content::WebContents* web_contents) override;
+#endif
+};
+
+#endif  // CHROME_BROWSER_NFC_CHROME_NFC_PERMISSION_CONTEXT_DELEGATE_H_
diff --git a/chrome/browser/nfc/nfc_permission_context.cc b/chrome/browser/nfc/nfc_permission_context.cc
index e688a0d6..fb6682fc 100644
--- a/chrome/browser/nfc/nfc_permission_context.cc
+++ b/chrome/browser/nfc/nfc_permission_context.cc
@@ -8,11 +8,12 @@
 #include "components/permissions/permission_request_id.h"
 
 NfcPermissionContext::NfcPermissionContext(
-    content::BrowserContext* browser_context)
+    content::BrowserContext* browser_context,
+    std::unique_ptr<Delegate> delegate)
     : PermissionContextBase(browser_context,
                             ContentSettingsType::NFC,
-                            blink::mojom::PermissionsPolicyFeature::kNotFound) {
-}
+                            blink::mojom::PermissionsPolicyFeature::kNotFound),
+      delegate_(std::move(delegate)) {}
 
 NfcPermissionContext::~NfcPermissionContext() = default;
 
diff --git a/chrome/browser/nfc/nfc_permission_context.h b/chrome/browser/nfc/nfc_permission_context.h
index 063a4eb2..20ea5aa 100644
--- a/chrome/browser/nfc/nfc_permission_context.h
+++ b/chrome/browser/nfc/nfc_permission_context.h
@@ -5,17 +5,33 @@
 #ifndef CHROME_BROWSER_NFC_NFC_PERMISSION_CONTEXT_H_
 #define CHROME_BROWSER_NFC_NFC_PERMISSION_CONTEXT_H_
 
+#include "build/build_config.h"
 #include "components/permissions/permission_context_base.h"
 
 class NfcPermissionContext : public permissions::PermissionContextBase {
  public:
-  explicit NfcPermissionContext(content::BrowserContext* browser_context);
+  // The delegate allows embedders to modify the permission context logic.
+  class Delegate {
+   public:
+    virtual ~Delegate() = default;
+
+#if defined(OS_ANDROID)
+    // Returns whether or not this |web_contents| is interactable.
+    virtual bool IsInteractable(content::WebContents* web_contents) = 0;
+#endif
+  };
+
+  NfcPermissionContext(content::BrowserContext* browser_context,
+                       std::unique_ptr<Delegate> delegate);
 
   NfcPermissionContext(const NfcPermissionContext&) = delete;
   NfcPermissionContext& operator=(const NfcPermissionContext&) = delete;
 
   ~NfcPermissionContext() override;
 
+ protected:
+  std::unique_ptr<Delegate> delegate_;
+
  private:
   // PermissionContextBase:
 #if !defined(OS_ANDROID)
diff --git a/chrome/browser/nfc/nfc_permission_context_android.cc b/chrome/browser/nfc/nfc_permission_context_android.cc
index eba079f8..ce9df96 100644
--- a/chrome/browser/nfc/nfc_permission_context_android.cc
+++ b/chrome/browser/nfc/nfc_permission_context_android.cc
@@ -6,14 +6,14 @@
 
 #include "base/android/jni_android.h"
 #include "base/bind.h"
-#include "chrome/browser/android/tab_android.h"
 #include "components/permissions/android/nfc/nfc_system_level_setting_impl.h"
 #include "components/permissions/permission_request_id.h"
 #include "content/public/browser/web_contents.h"
 
 NfcPermissionContextAndroid::NfcPermissionContextAndroid(
-    content::BrowserContext* browser_context)
-    : NfcPermissionContext(browser_context),
+    content::BrowserContext* browser_context,
+    std::unique_ptr<Delegate> delegate)
+    : NfcPermissionContext(browser_context, std::move(delegate)),
       nfc_system_level_setting_(
           std::make_unique<permissions::NfcSystemLevelSettingImpl>()) {}
 
@@ -49,8 +49,7 @@
   // Only show the NFC system level setting prompt if the tab for |web_contents|
   // is user-interactable (i.e. is the current tab, and Chrome is active and not
   // in tab-switching mode).
-  TabAndroid* tab = TabAndroid::FromWebContents(web_contents);
-  if (tab && !tab->IsUserInteractable()) {
+  if (!delegate_->IsInteractable(web_contents)) {
     permissions::PermissionContextBase::NotifyPermissionSet(
         id, requesting_origin, embedding_origin, std::move(callback),
         false /* persist */, CONTENT_SETTING_BLOCK, /*is_one_time=*/false);
diff --git a/chrome/browser/nfc/nfc_permission_context_android.h b/chrome/browser/nfc/nfc_permission_context_android.h
index 9b2f2bf..1bc0e7dc 100644
--- a/chrome/browser/nfc/nfc_permission_context_android.h
+++ b/chrome/browser/nfc/nfc_permission_context_android.h
@@ -14,8 +14,8 @@
 
 class NfcPermissionContextAndroid : public NfcPermissionContext {
  public:
-  explicit NfcPermissionContextAndroid(
-      content::BrowserContext* browser_context);
+  NfcPermissionContextAndroid(content::BrowserContext* browser_context,
+                              std::unique_ptr<Delegate> delegate);
   ~NfcPermissionContextAndroid() override;
 
  private:
diff --git a/chrome/browser/nfc/nfc_permission_context_unittest.cc b/chrome/browser/nfc/nfc_permission_context_unittest.cc
index 7a189c9d..c2b2e993 100644
--- a/chrome/browser/nfc/nfc_permission_context_unittest.cc
+++ b/chrome/browser/nfc/nfc_permission_context_unittest.cc
@@ -5,14 +5,12 @@
 #include "chrome/browser/nfc/nfc_permission_context.h"
 
 #include "build/build_config.h"
-#include "chrome/browser/content_settings/host_content_settings_map_factory.h"
-#include "chrome/browser/content_settings/page_specific_content_settings_delegate.h"
-#include "chrome/browser/permissions/permission_manager_factory.h"
 #include "chrome/test/base/chrome_render_view_host_test_harness.h"
-#include "components/content_settings/browser/page_specific_content_settings.h"
+#include "components/content_settings/browser/test_page_specific_content_settings_delegate.h"
 #include "components/permissions/permission_manager.h"
 #include "components/permissions/permission_request_id.h"
 #include "components/permissions/permission_request_manager.h"
+#include "components/permissions/permissions_client.h"
 #include "components/permissions/test/mock_permission_prompt_factory.h"
 #include "content/public/test/mock_render_process_host.h"
 #include "content/public/test/test_utils.h"
@@ -26,6 +24,17 @@
 
 using content::MockRenderProcessHost;
 
+namespace {
+class TestNfcPermissionContextDelegate : public NfcPermissionContext::Delegate {
+ public:
+#if defined(OS_ANDROID)
+  bool IsInteractable(content::WebContents* web_contents) override {
+    return true;
+  }
+#endif
+};
+}  // namespace
+
 // NfcPermissionContextTests ------------------------------------------
 
 class NfcPermissionContextTests : public ChromeRenderViewHostTestHarness {
@@ -61,10 +70,11 @@
   void DenyPrompt();
   void ClosePrompt();
 
-  // owned by the browser context
+  // Owned by |manager_|.
   NfcPermissionContext* nfc_permission_context_;
   std::vector<std::unique_ptr<permissions::MockPermissionPromptFactory>>
       mock_permission_prompt_factories_;
+  std::unique_ptr<permissions::PermissionManager> manager_;
 
   // A map between renderer child id and a pair represending the bridge id and
   // whether the requested permission was allowed.
@@ -117,26 +127,43 @@
 
   content_settings::PageSpecificContentSettings::CreateForWebContents(
       web_contents(),
-      std::make_unique<chrome::PageSpecificContentSettingsDelegate>(
-          web_contents()));
-  nfc_permission_context_ = static_cast<NfcPermissionContext*>(
-      PermissionManagerFactory::GetForProfile(profile())
-          ->GetPermissionContextForTesting(ContentSettingsType::NFC));
+      std::make_unique<
+          content_settings::TestPageSpecificContentSettingsDelegate>(
+          /*prefs=*/nullptr,
+          permissions::PermissionsClient::Get()->GetSettingsMap(
+              browser_context())));
   SetupRequestManager(web_contents());
 
+  auto delegate = std::make_unique<TestNfcPermissionContextDelegate>();
+
 #if defined(OS_ANDROID)
-  static_cast<NfcPermissionContextAndroid*>(nfc_permission_context_)
-      ->set_nfc_system_level_setting_for_testing(
-          std::unique_ptr<permissions::NfcSystemLevelSetting>(
-              new MockNfcSystemLevelSetting()));
+  auto context = std::make_unique<NfcPermissionContextAndroid>(
+      browser_context(), std::move(delegate));
+  context->set_nfc_system_level_setting_for_testing(
+      std::unique_ptr<permissions::NfcSystemLevelSetting>(
+          new MockNfcSystemLevelSetting()));
   MockNfcSystemLevelSetting::SetNfcSystemLevelSettingEnabled(true);
   MockNfcSystemLevelSetting::SetNfcAccessIsPossible(true);
   MockNfcSystemLevelSetting::ClearHasShownNfcSettingPrompt();
+#else
+  auto context = std::make_unique<NfcPermissionContext>(browser_context(),
+                                                        std::move(delegate));
 #endif
+
+  nfc_permission_context_ = context.get();
+
+  permissions::PermissionManager::PermissionContextMap context_map;
+  context_map[ContentSettingsType::NFC] = std::move(context);
+  manager_ = std::make_unique<permissions::PermissionManager>(
+      browser_context(), std::move(context_map));
 }
 
 void NfcPermissionContextTests::TearDown() {
   mock_permission_prompt_factories_.clear();
+  DeleteContents();
+  nfc_permission_context_ = nullptr;
+  manager_->Shutdown();
+  manager_.reset();
   ChromeRenderViewHostTestHarness::TearDown();
 }
 
@@ -166,7 +193,8 @@
 
 ContentSetting NfcPermissionContextTests::GetNfcContentSetting(GURL frame_0,
                                                                GURL frame_1) {
-  return HostContentSettingsMapFactory::GetForProfile(profile())
+  return permissions::PermissionsClient::Get()
+      ->GetSettingsMap(browser_context())
       ->GetContentSetting(frame_0, frame_1, ContentSettingsType::NFC);
 }
 
@@ -174,7 +202,8 @@
     GURL frame_0,
     GURL frame_1,
     ContentSetting content_setting) {
-  return HostContentSettingsMapFactory::GetForProfile(profile())
+  return permissions::PermissionsClient::Get()
+      ->GetSettingsMap(browser_context())
       ->SetContentSettingDefaultScope(
           frame_0, frame_1, ContentSettingsType::NFC, content_setting);
 }
diff --git a/chrome/browser/page_load_metrics/observers/ad_metrics/ads_page_load_metrics_observer_browsertest.cc b/chrome/browser/page_load_metrics/observers/ad_metrics/ads_page_load_metrics_observer_browsertest.cc
index 489ed63..0a7a8d2 100644
--- a/chrome/browser/page_load_metrics/observers/ad_metrics/ads_page_load_metrics_observer_browsertest.cc
+++ b/chrome/browser/page_load_metrics/observers/ad_metrics/ads_page_load_metrics_observer_browsertest.cc
@@ -1261,8 +1261,9 @@
     scoped_feature_list_.InitWithFeaturesAndParameters(
         {{subresource_filter::kAdTagging, {}},
          {subresource_filter::kAdsInterventionsEnforced, {}},
-         {features::kHeavyAdIntervention, {}},
-         {features::kHeavyAdPrivacyMitigations, {{"host-threshold", "3"}}}},
+         {heavy_ad_intervention::features::kHeavyAdIntervention, {}},
+         {heavy_ad_intervention::features::kHeavyAdPrivacyMitigations,
+          {{"host-threshold", "3"}}}},
         {});
   }
 
@@ -1708,8 +1709,9 @@
  public:
   AdsPageLoadMetricsObserverResourceBrowserTestWithoutHeavyAdIntervention() {
     // The experiment is "on" if either intervention or reporting is active.
-    feature_list_.InitWithFeatures({}, {features::kHeavyAdIntervention,
-                                        features::kHeavyAdInterventionWarning});
+    feature_list_.InitWithFeatures(
+        {}, {heavy_ad_intervention::features::kHeavyAdIntervention,
+             heavy_ad_intervention::features::kHeavyAdInterventionWarning});
   }
 
  private:
@@ -1779,7 +1781,8 @@
 
   // Verify that the trial is not activated if no heavy ads are seen.
   EXPECT_FALSE(base::FieldTrialList::IsTrialActive(
-      base::FeatureList::GetFieldTrial(features::kHeavyAdIntervention)
+      base::FeatureList::GetFieldTrial(
+          heavy_ad_intervention::features::kHeavyAdIntervention)
           ->trial_name()));
 }
 
diff --git a/chrome/browser/page_load_metrics/observers/core/amp_page_load_metrics_observer.cc b/chrome/browser/page_load_metrics/observers/core/amp_page_load_metrics_observer.cc
index 8ebaa08..d0d652d 100644
--- a/chrome/browser/page_load_metrics/observers/core/amp_page_load_metrics_observer.cc
+++ b/chrome/browser/page_load_metrics/observers/core/amp_page_load_metrics_observer.cc
@@ -161,7 +161,8 @@
   subframe_info.navigation_start = navigation_handle->NavigationStart();
 }
 
-void AMPPageLoadMetricsObserver::OnFrameDeleted(content::RenderFrameHost* rfh) {
+void AMPPageLoadMetricsObserver::OnRenderFrameDeleted(
+    content::RenderFrameHost* rfh) {
   if (current_main_frame_nav_info_ &&
       current_main_frame_nav_info_->subframe_rfh == rfh) {
     MaybeRecordAmpDocumentMetrics();
diff --git a/chrome/browser/page_load_metrics/observers/core/amp_page_load_metrics_observer.h b/chrome/browser/page_load_metrics/observers/core/amp_page_load_metrics_observer.h
index 3b7e4e3..1abbe310 100644
--- a/chrome/browser/page_load_metrics/observers/core/amp_page_load_metrics_observer.h
+++ b/chrome/browser/page_load_metrics/observers/core/amp_page_load_metrics_observer.h
@@ -55,7 +55,7 @@
       content::NavigationHandle* navigation_handle) override;
   void OnDidFinishSubFrameNavigation(
       content::NavigationHandle* navigation_handle) override;
-  void OnFrameDeleted(content::RenderFrameHost* rfh) override;
+  void OnRenderFrameDeleted(content::RenderFrameHost* rfh) override;
   void OnTimingUpdate(
       content::RenderFrameHost* subframe_rfh,
       const page_load_metrics::mojom::PageLoadTiming& timing) override;
diff --git a/chrome/browser/page_load_metrics/observers/third_party_metrics_observer.cc b/chrome/browser/page_load_metrics/observers/third_party_metrics_observer.cc
index 8a9ecf5..0632d2f 100644
--- a/chrome/browser/page_load_metrics/observers/third_party_metrics_observer.cc
+++ b/chrome/browser/page_load_metrics/observers/third_party_metrics_observer.cc
@@ -199,7 +199,7 @@
   recorded_frames_.erase(navigation_handle->GetRenderFrameHost());
 }
 
-void ThirdPartyMetricsObserver::OnFrameDeleted(
+void ThirdPartyMetricsObserver::OnRenderFrameDeleted(
     content::RenderFrameHost* render_frame_host) {
   recorded_frames_.erase(render_frame_host);
 }
diff --git a/chrome/browser/page_load_metrics/observers/third_party_metrics_observer.h b/chrome/browser/page_load_metrics/observers/third_party_metrics_observer.h
index 92180dc..78752dd 100644
--- a/chrome/browser/page_load_metrics/observers/third_party_metrics_observer.h
+++ b/chrome/browser/page_load_metrics/observers/third_party_metrics_observer.h
@@ -58,7 +58,8 @@
                          page_load_metrics::StorageType storage_type) override;
   void OnDidFinishSubFrameNavigation(
       content::NavigationHandle* navigation_handle) override;
-  void OnFrameDeleted(content::RenderFrameHost* render_frame_host) override;
+  void OnRenderFrameDeleted(
+      content::RenderFrameHost* render_frame_host) override;
   void OnTimingUpdate(
       content::RenderFrameHost* subframe_rfh,
       const page_load_metrics::mojom::PageLoadTiming& timing) override;
diff --git a/chrome/browser/password_entry_edit/android/internal/java/src/org/chromium/chrome/browser/password_entry_edit/CredentialEditMediator.java b/chrome/browser/password_entry_edit/android/internal/java/src/org/chromium/chrome/browser/password_entry_edit/CredentialEditMediator.java
index 705cb0d..e1ec979 100644
--- a/chrome/browser/password_entry_edit/android/internal/java/src/org/chromium/chrome/browser/password_entry_edit/CredentialEditMediator.java
+++ b/chrome/browser/password_entry_edit/android/internal/java/src/org/chromium/chrome/browser/password_entry_edit/CredentialEditMediator.java
@@ -168,8 +168,8 @@
         mOriginalPassword = password;
 
         mModel.set(USERNAME, username);
-        mModel.set(PASSWORD, password);
         mModel.set(PASSWORD_VISIBLE, false);
+        mModel.set(PASSWORD, password);
     }
 
     void setExistingUsernames(String[] existingUsernames) {
diff --git a/chrome/browser/password_entry_edit/android/internal/java/src/org/chromium/chrome/browser/password_entry_edit/CredentialEditViewBinder.java b/chrome/browser/password_entry_edit/android/internal/java/src/org/chromium/chrome/browser/password_entry_edit/CredentialEditViewBinder.java
index 0844818..16a39c2e 100644
--- a/chrome/browser/password_entry_edit/android/internal/java/src/org/chromium/chrome/browser/password_entry_edit/CredentialEditViewBinder.java
+++ b/chrome/browser/password_entry_edit/android/internal/java/src/org/chromium/chrome/browser/password_entry_edit/CredentialEditViewBinder.java
@@ -38,9 +38,7 @@
         } else if (propertyKey == PASSWORD_VISIBLE) {
             fragmentView.changePasswordVisibility(model.get(PASSWORD_VISIBLE));
         } else if (propertyKey == PASSWORD) {
-            if (model.get(FEDERATION_ORIGIN).isEmpty()) {
                 fragmentView.setPassword(model.get(PASSWORD));
-            }
         } else if (propertyKey == EMPTY_PASSWORD_ERROR) {
             fragmentView.changePasswordError(model.get(EMPTY_PASSWORD_ERROR));
         } else if (propertyKey == UI_DISMISSED_BY_NATIVE) {
diff --git a/chrome/browser/password_entry_edit/android/java/res/layout/credential_edit_view.xml b/chrome/browser/password_entry_edit/android/java/res/layout/credential_edit_view.xml
index 828c323..167ce57 100644
--- a/chrome/browser/password_entry_edit/android/java/res/layout/credential_edit_view.xml
+++ b/chrome/browser/password_entry_edit/android/java/res/layout/credential_edit_view.xml
@@ -9,9 +9,7 @@
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:paddingStart="@dimen/password_entry_editor_content_spacing"
-    android:paddingEnd="@dimen/password_entry_editor_content_spacing"
-    android:paddingLeft="@dimen/password_entry_editor_content_spacing"
-    android:paddingRight="@dimen/password_entry_editor_content_spacing">
+    android:paddingEnd="@dimen/password_entry_editor_content_spacing">
 
     <LinearLayout
         android:layout_width="match_parent"
@@ -23,18 +21,18 @@
         <!-- Username -->
         <FrameLayout
             android:layout_width="match_parent"
-            android:layout_height="wrap_content">
+            android:layout_height="wrap_content"
+            android:layout_marginTop="14dp">
 
             <com.google.android.material.textfield.TextInputLayout
                 android:id="@+id/username_text_input_layout"
                 android:labelFor="@+id/username"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
-                android:layout_marginTop="@dimen/password_entry_editor_field_top_margin"
-                android:layout_marginBottom="@dimen/password_entry_editor_field_bottom_margin"
                 android:hint="@string/password_entry_viewer_username_title"
                 app:hintTextAppearance="@style/TextAppearance.TextSmall.Secondary"
-                app:errorTextAppearance="@style/TextAppearance.ErrorCaption">
+                app:errorTextAppearance="@style/TextAppearance.ErrorCaption"
+                app:errorEnabled="true">
 
                 <com.google.android.material.textfield.TextInputEditText
                     tools:ignore="LabelFor"
@@ -43,7 +41,7 @@
                     android:layout_height="wrap_content"
                     android:imeOptions="flagNoExtractUi"
                     android:importantForAutofill="noExcludeDescendants"
-                    android:inputType="text"
+                    android:inputType="textMultiLine"
                     android:textAppearance="@style/TextAppearance.TextLarge.Primary"/>
             </com.google.android.material.textfield.TextInputLayout>
 
@@ -53,6 +51,7 @@
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
                     android:layout_gravity="center_vertical | end"
+                    android:layout_marginBottom="@dimen/credential_edit_text_icon_margin_bottom"
                     android:contentDescription="@string/password_entry_viewer_copy_stored_username"
                     app:srcCompat="@drawable/ic_content_copy_black"
                     app:tint="@color/default_icon_color_tint_list"
@@ -69,11 +68,10 @@
                 android:labelFor="@+id/password"
                 android:layout_height="wrap_content"
                 android:layout_width="match_parent"
-                android:layout_marginTop="@dimen/password_entry_editor_field_top_margin"
-                android:layout_marginBottom="@dimen/password_entry_editor_field_bottom_margin"
                 android:hint="@string/password_entry_viewer_password"
                 app:hintTextAppearance="@style/TextAppearance.TextSmall.Secondary"
-                app:errorTextAppearance="@style/TextAppearance.ErrorCaption">
+                app:errorTextAppearance="@style/TextAppearance.ErrorCaption"
+                app:errorEnabled="true">
 
                 <com.google.android.material.textfield.TextInputEditText
                     tools:ignore="LabelFor"
@@ -90,6 +88,7 @@
                 android:id="@+id/password_icons"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
+                android:layout_marginBottom="@dimen/credential_edit_text_icon_margin_bottom"
                 android:layout_gravity="center_vertical | end"
                 android:orientation="horizontal">
 
diff --git a/chrome/browser/password_entry_edit/android/java/res/values/dimens.xml b/chrome/browser/password_entry_edit/android/java/res/values/dimens.xml
index 0cc4261..a95a276c 100644
--- a/chrome/browser/password_entry_edit/android/java/res/values/dimens.xml
+++ b/chrome/browser/password_entry_edit/android/java/res/values/dimens.xml
@@ -8,6 +8,7 @@
     of the TextInputLayout elements -->
     <dimen name="credential_edit_text_view_margin">4dp</dimen>
     <dimen name="credential_edit_text_view_label_margin_bottom">2dp</dimen>
+    <dimen name="credential_edit_text_icon_margin_bottom">12dp</dimen>
     <dimen name="credential_edit_button_layout_padding">10dp</dimen>
     <dimen name="credential_edit_button_layout_stacked_margin">24dp</dimen>
 </resources>
diff --git a/chrome/browser/password_manager/generated_password_leak_detection_pref.cc b/chrome/browser/password_manager/generated_password_leak_detection_pref.cc
index cf328b19..88d81b1 100644
--- a/chrome/browser/password_manager/generated_password_leak_detection_pref.cc
+++ b/chrome/browser/password_manager/generated_password_leak_detection_pref.cc
@@ -36,8 +36,7 @@
 
   // Password leak detection only requires a signed in account and a functioning
   // sync service, it does not require sync consent.
-  return identity_manager->HasPrimaryAccount(
-             signin::ConsentLevel::kNotRequired) &&
+  return identity_manager->HasPrimaryAccount(signin::ConsentLevel::kSignin) &&
          !sync_error;
 }
 
diff --git a/chrome/browser/permissions/permission_manager_factory.cc b/chrome/browser/permissions/permission_manager_factory.cc
index b42cf18..3949d27 100644
--- a/chrome/browser/permissions/permission_manager_factory.cc
+++ b/chrome/browser/permissions/permission_manager_factory.cc
@@ -19,6 +19,7 @@
 #include "chrome/browser/media/midi_sysex_permission_context.h"
 #include "chrome/browser/media/webrtc/camera_pan_tilt_zoom_permission_context.h"
 #include "chrome/browser/media/webrtc/media_stream_device_permission_context.h"
+#include "chrome/browser/nfc/chrome_nfc_permission_context_delegate.h"
 #include "chrome/browser/notifications/notification_permission_context.h"
 #include "chrome/browser/profiles/incognito_helpers.h"
 #include "chrome/browser/profiles/profile.h"
@@ -111,12 +112,14 @@
   permission_contexts[ContentSettingsType::WAKE_LOCK_SYSTEM] =
       std::make_unique<WakeLockPermissionContext>(
           profile, ContentSettingsType::WAKE_LOCK_SYSTEM);
+  auto nfc_delegate = std::make_unique<ChromeNfcPermissionContextDelegate>();
 #if !defined(OS_ANDROID)
   permission_contexts[ContentSettingsType::NFC] =
-      std::make_unique<NfcPermissionContext>(profile);
+      std::make_unique<NfcPermissionContext>(profile, std::move(nfc_delegate));
 #else
   permission_contexts[ContentSettingsType::NFC] =
-      std::make_unique<NfcPermissionContextAndroid>(profile);
+      std::make_unique<NfcPermissionContextAndroid>(profile,
+                                                    std::move(nfc_delegate));
 #endif
   permission_contexts[ContentSettingsType::VR] =
       std::make_unique<permissions::WebXrPermissionContext>(
diff --git a/chrome/browser/printing/cloud_print/privet_notifications.cc b/chrome/browser/printing/cloud_print/privet_notifications.cc
index 77b3828..c6c60f24 100644
--- a/chrome/browser/printing/cloud_print/privet_notifications.cc
+++ b/chrome/browser/printing/cloud_print/privet_notifications.cc
@@ -280,8 +280,8 @@
       Profile::FromBrowserContext(profile_));
 
   // Only show notifications for signed-in accounts. https://crbug.com/349098
-  if (!identity_manager || !identity_manager->HasPrimaryAccount(
-                               signin::ConsentLevel::kNotRequired)) {
+  if (!identity_manager ||
+      !identity_manager->HasPrimaryAccount(signin::ConsentLevel::kSignin)) {
     return;
   }
 #endif  // BUILDFLAG(IS_CHROMEOS_ASH)
diff --git a/chrome/browser/profiles/gaia_info_update_service.cc b/chrome/browser/profiles/gaia_info_update_service.cc
index 5fe513fc..b58c719 100644
--- a/chrome/browser/profiles/gaia_info_update_service.cc
+++ b/chrome/browser/profiles/gaia_info_update_service.cc
@@ -63,8 +63,7 @@
     return;
 
   auto unconsented_primary_account_info =
-      identity_manager_->GetPrimaryAccountInfo(
-          signin::ConsentLevel::kNotRequired);
+      identity_manager_->GetPrimaryAccountInfo(signin::ConsentLevel::kSignin);
 
   if (!gaia_id_of_profile_attribute_entry_.empty() &&
       unconsented_primary_account_info.gaia !=
@@ -149,7 +148,7 @@
 
 void GAIAInfoUpdateService::OnPrimaryAccountChanged(
     const signin::PrimaryAccountChangeEvent& event) {
-  switch (event.GetEventTypeFor(signin::ConsentLevel::kNotRequired)) {
+  switch (event.GetEventTypeFor(signin::ConsentLevel::kSignin)) {
     case signin::PrimaryAccountChangeEvent::Type::kSet:
       UpdatePrimaryAccount();
       break;
@@ -168,8 +167,8 @@
   if (!ShouldUpdatePrimaryAccount())
     return;
 
-  CoreAccountInfo account_info = identity_manager_->GetPrimaryAccountInfo(
-      signin::ConsentLevel::kNotRequired);
+  CoreAccountInfo account_info =
+      identity_manager_->GetPrimaryAccountInfo(signin::ConsentLevel::kSignin);
 
   if (info.account_id != account_info.account_id)
     return;
@@ -209,6 +208,5 @@
 }
 
 bool GAIAInfoUpdateService::ShouldUpdatePrimaryAccount() {
-  return identity_manager_->HasPrimaryAccount(
-      signin::ConsentLevel::kNotRequired);
+  return identity_manager_->HasPrimaryAccount(signin::ConsentLevel::kSignin);
 }
diff --git a/chrome/browser/profiles/gaia_info_update_service_unittest.cc b/chrome/browser/profiles/gaia_info_update_service_unittest.cc
index bd44fa8..74e84ef8 100644
--- a/chrome/browser/profiles/gaia_info_update_service_unittest.cc
+++ b/chrome/browser/profiles/gaia_info_update_service_unittest.cc
@@ -216,7 +216,7 @@
   // Revoke sync consent (stay signed in with the primary account).
   identity_test_env()->RevokeSyncConsent();
   ASSERT_TRUE(identity_test_env()->identity_manager()->HasPrimaryAccount(
-      signin::ConsentLevel::kNotRequired));
+      signin::ConsentLevel::kSignin));
   // Verify that the GAIA name and picture, and picture URL are not cleared
   // as unconsented primary account still exists.
   EXPECT_EQ(entry->GetGAIAGivenName(), u"Pat");
@@ -230,7 +230,7 @@
   AccountInfo info =
       identity_test_env()->MakeUnconsentedPrimaryAccountAvailable(email);
   EXPECT_TRUE(identity_test_env()->identity_manager()->HasPrimaryAccount(
-      signin::ConsentLevel::kNotRequired));
+      signin::ConsentLevel::kSignin));
   EXPECT_FALSE(identity_test_env()->identity_manager()->HasPrimaryAccount(
       signin::ConsentLevel::kSync));
   info = GetValidAccountInfo(info.email, info.account_id, "Pat", "Pat Foo",
@@ -387,7 +387,7 @@
   // Simulate a state where the profile entry has GAIA related information
   // when there is not primary account set.
   ASSERT_FALSE(identity_test_env()->identity_manager()->HasPrimaryAccount(
-      signin::ConsentLevel::kNotRequired));
+      signin::ConsentLevel::kSignin));
   ASSERT_EQ(1u, storage()->GetNumberOfProfiles());
   ProfileAttributesEntry* entry = storage()->GetAllProfilesAttributes().front();
   entry->SetGAIAName(u"foo");
diff --git a/chrome/browser/profiles/guest_signin_observer_factory.cc b/chrome/browser/profiles/guest_signin_observer_factory.cc
index 9038ef9..a53b2d5 100644
--- a/chrome/browser/profiles/guest_signin_observer_factory.cc
+++ b/chrome/browser/profiles/guest_signin_observer_factory.cc
@@ -26,7 +26,7 @@
 
   void OnPrimaryAccountChanged(
       const signin::PrimaryAccountChangeEvent& event) override {
-    switch (event.GetEventTypeFor(signin::ConsentLevel::kNotRequired)) {
+    switch (event.GetEventTypeFor(signin::ConsentLevel::kSignin)) {
       case signin::PrimaryAccountChangeEvent::Type::kSet:
         base::UmaHistogramBoolean("Profile.EphemeralGuest.Signin", true);
         break;
diff --git a/chrome/browser/profiles/profile_attributes_entry.cc b/chrome/browser/profiles/profile_attributes_entry.cc
index e0035d6..7bf5dc4e 100644
--- a/chrome/browser/profiles/profile_attributes_entry.cc
+++ b/chrome/browser/profiles/profile_attributes_entry.cc
@@ -50,8 +50,6 @@
 const char kGAIANameKey[] = "gaia_name";
 const char kShortcutNameKey[] = "shortcut_name";
 const char kActiveTimeKey[] = "active_time";
-const char kAuthCredentialsKey[] = "local_auth_credentials";
-const char kPasswordTokenKey[] = "gaia_password_token";
 const char kIsAuthErrorKey[] = "is_auth_error";
 const char kMetricsBucketIndex[] = "metrics_bucket_index";
 const char kSigninRequiredKey[] = "signin_required";
@@ -73,6 +71,10 @@
 // Deprecated 2/2021.
 const char kIsOmittedFromProfileListKey[] = "is_omitted_from_profile_list";
 
+// Deprecated 3/2021.
+const char kAuthCredentialsKey[] = "local_auth_credentials";
+const char kPasswordTokenKey[] = "gaia_password_token";
+
 constexpr int kIntegerNotSet = -1;
 
 // Persisted in prefs.
@@ -163,7 +165,6 @@
     // Profiles that require signin in the absence of an enterprise policy are
     // left-overs from legacy supervised users. Just unlock them, so users can
     // keep using them.
-    SetLocalAuthCredentials(std::string());
     SetAuthInfo(std::string(), std::u16string(), false);
     SetIsSigninRequired(false);
 #endif
@@ -324,14 +325,6 @@
       resource_id);
 }
 
-std::string ProfileAttributesEntry::GetLocalAuthCredentials() const {
-  return GetString(kAuthCredentialsKey);
-}
-
-std::string ProfileAttributesEntry::GetPasswordChangeDetectionToken() const {
-  return GetString(kPasswordTokenKey);
-}
-
 bool ProfileAttributesEntry::GetBackgroundStatus() const {
   return GetBool(kBackgroundAppsKey);
 }
@@ -527,15 +520,6 @@
     profile_info_cache_->NotifyProfileSupervisedUserIdChanged(GetPath());
 }
 
-void ProfileAttributesEntry::SetLocalAuthCredentials(const std::string& auth) {
-  SetString(kAuthCredentialsKey, auth);
-}
-
-void ProfileAttributesEntry::SetPasswordChangeDetectionToken(
-    const std::string& token) {
-  SetString(kPasswordTokenKey, token);
-}
-
 void ProfileAttributesEntry::SetBackgroundStatus(bool running_background_apps) {
   SetBool(kBackgroundAppsKey, running_background_apps);
 }
@@ -959,4 +943,8 @@
 void ProfileAttributesEntry::MigrateObsoleteProfileAttributes() {
   // Added 2/2021.
   ClearValue(kIsOmittedFromProfileListKey);
+
+  // Added 3/2021.
+  ClearValue(kAuthCredentialsKey);
+  ClearValue(kPasswordTokenKey);
 }
diff --git a/chrome/browser/profiles/profile_attributes_entry.h b/chrome/browser/profiles/profile_attributes_entry.h
index 7c741c9..3109a536 100644
--- a/chrome/browser/profiles/profile_attributes_entry.h
+++ b/chrome/browser/profiles/profile_attributes_entry.h
@@ -84,8 +84,6 @@
   // profiles::GetSizedAvatarIcon().
   gfx::Image GetAvatarIcon(int size_for_placeholder_avatar = 74,
                            bool use_high_res_file = true) const;
-  std::string GetLocalAuthCredentials() const;
-  std::string GetPasswordChangeDetectionToken() const;
   // Returns true if the profile is currently running any background apps. Note
   // that a return value of false could mean an error in collection or that
   // there are currently no background apps running. However, the action which
@@ -165,8 +163,6 @@
   // Only ephemeral profiles can be set as omitted.
   void SetIsOmitted(bool is_omitted);
   void SetSupervisedUserId(const std::string& id);
-  void SetLocalAuthCredentials(const std::string& auth);
-  void SetPasswordChangeDetectionToken(const std::string& token);
   void SetBackgroundStatus(bool running_background_apps);
   void SetGAIAName(const std::u16string& name);
   void SetGAIAGivenName(const std::u16string& name);
diff --git a/chrome/browser/profiles/profile_attributes_storage_unittest.cc b/chrome/browser/profiles/profile_attributes_storage_unittest.cc
index a093cbb..dcd45f1 100644
--- a/chrome/browser/profiles/profile_attributes_storage_unittest.cc
+++ b/chrome/browser/profiles/profile_attributes_storage_unittest.cc
@@ -329,9 +329,6 @@
   VerifyAndResetCallExpectations();
 
   TEST_STRING16_ACCESSORS(ProfileAttributesEntry, entry, ShortcutName);
-  TEST_STRING_ACCESSORS(ProfileAttributesEntry, entry, LocalAuthCredentials);
-  TEST_STRING_ACCESSORS(
-      ProfileAttributesEntry, entry, PasswordChangeDetectionToken);
   TEST_ACCESSORS(ProfileAttributesEntry, entry, BackgroundStatus, true, false);
 
   EXPECT_CALL(observer(), OnProfileNameChanged(path, _)).Times(4);
diff --git a/chrome/browser/profiles/profile_downloader.cc b/chrome/browser/profiles/profile_downloader.cc
index 0167b10c..a50809df 100644
--- a/chrome/browser/profiles/profile_downloader.cc
+++ b/chrome/browser/profiles/profile_downloader.cc
@@ -66,7 +66,7 @@
   }
 
   account_id_ = account_id.empty() ? identity_manager_->GetPrimaryAccountId(
-                                         signin::ConsentLevel::kNotRequired)
+                                         signin::ConsentLevel::kSignin)
                                    : account_id;
   StartFetchingOAuth2AccessToken();
 }
diff --git a/chrome/browser/profiles/profile_list_desktop_browsertest.cc b/chrome/browser/profiles/profile_list_desktop_browsertest.cc
index 55e19f1..1475d46 100644
--- a/chrome/browser/profiles/profile_list_desktop_browsertest.cc
+++ b/chrome/browser/profiles/profile_list_desktop_browsertest.cc
@@ -55,55 +55,6 @@
   DISALLOW_COPY_AND_ASSIGN(ProfileListDesktopBrowserTest);
 };
 
-#if defined(OS_WIN) || defined(OS_MAC)
-// SignOut is flaky on Windows (crbug.com/357329)
-// and Mac (crbug.com/674497, crbug.com/1110452).
-#define MAYBE_SignOut DISABLED_SignOut
-#elif BUILDFLAG(IS_CHROMEOS_ASH)
-// This test doesn't make sense for Chrome OS since it has a different
-// multi-profiles menu in the system tray instead.
-#define MAYBE_SignOut DISABLED_SignOut
-#elif defined(OS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
-// Flaky on Linux debug builds with libc++ (https://crbug.com/734875)
-#define MAYBE_SignOut DISABLED_SignOut
-#else
-#define MAYBE_SignOut SignOut
-#endif
-IN_PROC_BROWSER_TEST_F(ProfileListDesktopBrowserTest, MAYBE_SignOut) {
-  if (!profiles::IsMultipleProfilesEnabled())
-    return;
-
-  ProfileManager* profile_manager = g_browser_process->profile_manager();
-  Profile* current_profile = browser()->profile();
-  ProfileAttributesStorage& storage =
-      profile_manager->GetProfileAttributesStorage();
-  ProfileAttributesEntry* entry =
-      storage.GetProfileAttributesWithPath(current_profile->GetPath());
-  ASSERT_NE(entry, nullptr);
-
-  std::unique_ptr<AvatarMenu> menu = CreateAvatarMenu(&storage);
-  menu->RebuildMenu();
-
-  BrowserList* browser_list = BrowserList::GetInstance();
-  EXPECT_EQ(1u, browser_list->size());
-
-  ProfileWaiter profile_waiter;
-
-  EXPECT_FALSE(entry->IsSigninRequired());
-  profiles::LockProfile(current_profile);
-  // Rely on test time-out for failure indication.
-  ui_test_utils::WaitForBrowserToClose(browser());
-
-  EXPECT_TRUE(entry->IsSigninRequired());
-  EXPECT_EQ(0u, browser_list->size());
-
-  // Signing out brings up the User Manager which we should close before exit.
-  // But the User Manager is shown only when the system profile is created,
-  // which happens asynchronously.
-  profile_waiter.WaitForProfileAdded();
-  ProfilePicker::Hide();
-}
-
 #if BUILDFLAG(IS_CHROMEOS_ASH)
 // This test doesn't make sense for Chrome OS since it has a different
 // multi-profiles menu in the system tray instead.
diff --git a/chrome/browser/profiles/profile_manager.cc b/chrome/browser/profiles/profile_manager.cc
index 4a0a8f42..0d45661 100644
--- a/chrome/browser/profiles/profile_manager.cc
+++ b/chrome/browser/profiles/profile_manager.cc
@@ -1893,8 +1893,8 @@
       IdentityManagerFactory::GetForProfile(profile);
   bool is_consented_primary_account =
       identity_manager->HasPrimaryAccount(signin::ConsentLevel::kSync);
-  CoreAccountInfo account_info = identity_manager->GetPrimaryAccountInfo(
-      signin::ConsentLevel::kNotRequired);
+  CoreAccountInfo account_info =
+      identity_manager->GetPrimaryAccountInfo(signin::ConsentLevel::kSignin);
 
   std::u16string username = base::UTF8ToUTF16(account_info.email);
 
diff --git a/chrome/browser/profiles/profile_window.cc b/chrome/browser/profiles/profile_window.cc
index 81641fd8..dde5b55 100644
--- a/chrome/browser/profiles/profile_window.cc
+++ b/chrome/browser/profiles/profile_window.cc
@@ -73,12 +73,6 @@
 namespace {
 
 #if BUILDFLAG(ENABLE_EXTENSIONS)
-void BlockExtensions(Profile* profile) {
-  extensions::ExtensionService* extension_service =
-      extensions::ExtensionSystem::Get(profile)->extension_service();
-  extension_service->BlockAllExtensions();
-}
-
 void UnblockExtensions(Profile* profile) {
   extensions::ExtensionService* extension_service =
       extensions::ExtensionSystem::Get(profile)->extension_service();
@@ -248,69 +242,6 @@
   return number_of_profiles >= min_profiles;
 }
 
-void LockBrowserCloseSuccess(const base::FilePath& profile_path) {
-  ProfileManager* profile_manager = g_browser_process->profile_manager();
-  ProfileAttributesEntry* entry =
-      profile_manager->GetProfileAttributesStorage()
-          .GetProfileAttributesWithPath(profile_path);
-  DCHECK(entry);
-  entry->SetIsSigninRequired(true);
-
-#if BUILDFLAG(ENABLE_EXTENSIONS)
-  // Profile guaranteed to exist for it to have been locked.
-  BlockExtensions(profile_manager->GetProfileByPath(profile_path));
-#endif  // BUILDFLAG(ENABLE_EXTENSIONS)
-
-  chrome::HideTaskManager();
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
-  ProfilePicker::Show(ProfilePicker::EntryPoint::kProfileLocked);
-#endif  // !BUILDFLAG(IS_CHROMEOS_ASH)
-}
-
-void LockProfile(Profile* profile) {
-  DCHECK(profile);
-  if (profile) {
-    BrowserList::CloseAllBrowsersWithProfile(
-        profile, base::BindRepeating(&LockBrowserCloseSuccess),
-        BrowserList::CloseCallback(), false);
-  }
-}
-
-bool IsLockAvailable(Profile* profile) {
-  DCHECK(profile);
-  if (profile->IsGuestSession() || profile->IsSystemProfile() ||
-      profile->IsEphemeralGuestProfile()) {
-    return false;
-  }
-
-  signin::IdentityManager* identity_manager =
-      IdentityManagerFactory::GetForProfile(profile);
-  if (!identity_manager->HasPrimaryAccount(signin::ConsentLevel::kSync))
-    return false;
-  base::Optional<AccountInfo> primary_account_info =
-      identity_manager->FindExtendedAccountInfoForAccountWithRefreshToken(
-          identity_manager->GetPrimaryAccountInfo(signin::ConsentLevel::kSync));
-  std::string hosted_domain = primary_account_info.has_value()
-                                  ? primary_account_info.value().hosted_domain
-                                  : "";
-
-  // TODO(mlerman): Prohibit only users who authenticate using SAML. Until then,
-  // prohibited users who use hosted domains (aside from google.com).
-  if (hosted_domain != kNoHostedDomainFound && hosted_domain != "google.com") {
-    return false;
-  }
-
-  // Lock only when there is at least one supervised user on the machine.
-  std::vector<ProfileAttributesEntry*> entries =
-      g_browser_process->profile_manager()->GetProfileAttributesStorage().
-          GetAllProfilesAttributes();
-  for (ProfileAttributesEntry* entry : entries) {
-    if (entry->IsSupervised())
-      return true;
-  }
-  return false;
-}
-
 void CloseProfileWindows(Profile* profile) {
   DCHECK(profile);
   BrowserList::CloseAllBrowsersWithProfile(profile,
diff --git a/chrome/browser/profiles/profile_window.h b/chrome/browser/profiles/profile_window.h
index b2c97138..2f3f8ec 100644
--- a/chrome/browser/profiles/profile_window.h
+++ b/chrome/browser/profiles/profile_window.h
@@ -75,16 +75,9 @@
 // one and the current window is a guest window.
 bool HasProfileSwitchTargets(Profile* profile);
 
-// Closes and locks all the browser windows for |profile| and opens the user
-// manager.
-void LockProfile(Profile* profile);
-
 // Close all the browser windows for |profile|.
 void CloseProfileWindows(Profile* profile);
 
-// Returns whether lock is available to this profile.
-bool IsLockAvailable(Profile* profile);
-
 // Converts from modes in the avatar menu to modes understood by
 // ProfileMenuView.
 void BubbleViewModeFromAvatarBubbleMode(BrowserWindow::AvatarBubbleMode mode,
diff --git a/chrome/browser/profiles/profiles_state.cc b/chrome/browser/profiles/profiles_state.cc
index 7aea889..1a12b92 100644
--- a/chrome/browser/profiles/profiles_state.cc
+++ b/chrome/browser/profiles/profiles_state.cc
@@ -334,30 +334,6 @@
   profile->Wipe();
 }
 
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
-bool AreAllNonChildNonSupervisedProfilesLocked() {
-  bool at_least_one_regular_profile_present = false;
-
-  std::vector<ProfileAttributesEntry*> entries =
-      g_browser_process->profile_manager()
-          ->GetProfileAttributesStorage()
-          .GetAllProfilesAttributes();
-  for (const ProfileAttributesEntry* entry : entries) {
-    if (entry->IsOmitted())
-      continue;
-
-    // Only consider non-child profiles.
-    if (!entry->IsChild()) {
-      at_least_one_regular_profile_present = true;
-
-      if (!entry->IsSigninRequired())
-        return false;
-    }
-  }
-  return at_least_one_regular_profile_present;
-}
-#endif
-
 bool IsPublicSession() {
 #if BUILDFLAG(IS_CHROMEOS_ASH)
   if (chromeos::LoginState::IsInitialized()) {
diff --git a/chrome/browser/profiles/profiles_state.h b/chrome/browser/profiles/profiles_state.h
index 6be2532..331675ae 100644
--- a/chrome/browser/profiles/profiles_state.h
+++ b/chrome/browser/profiles/profiles_state.h
@@ -112,12 +112,6 @@
 // a BrowsingDataRemover to delete all the Profile's data.
 void RemoveBrowsingDataForProfile(const base::FilePath& profile_path);
 
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
-// Returns true if there exists at least one non-supervised or non-child profile
-// and they are all locked.
-bool AreAllNonChildNonSupervisedProfilesLocked();
-#endif
-
 // Returns whether a public session is being run currently.
 bool IsPublicSession();
 
diff --git a/chrome/browser/renderer_context_menu/render_view_context_menu_browsertest.cc b/chrome/browser/renderer_context_menu/render_view_context_menu_browsertest.cc
index 36c3f7a..0441ebc 100644
--- a/chrome/browser/renderer_context_menu/render_view_context_menu_browsertest.cc
+++ b/chrome/browser/renderer_context_menu/render_view_context_menu_browsertest.cc
@@ -720,7 +720,20 @@
   // Emoji context menu item should never be present on a non-editable field.
   EXPECT_FALSE(menu.IsItemPresent(IDC_CONTENT_CONTEXT_EMOJI));
 }
-
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+// Executing the emoji panel item with no associated browser should not crash.
+IN_PROC_BROWSER_TEST_F(ContextMenuBrowserTest,
+                       ContextMenuForEmojiPanel_NullBrowserCrash) {
+  ui::SetShowEmojiKeyboardCallback(
+      base::BindRepeating(ui::ShowTabletModeEmojiPanel));
+  std::unique_ptr<content::WebContents> detached_web_contents =
+      content::WebContents::Create(
+          content::WebContents::CreateParams(browser()->profile()));
+  TestRenderViewContextMenu menu(detached_web_contents->GetMainFrame(), {});
+  menu.Init();
+  menu.ExecuteCommand(IDC_CONTENT_CONTEXT_EMOJI, 0);
+}
+#else
 // Executing the emoji panel item with no associated browser should not crash.
 IN_PROC_BROWSER_TEST_F(ContextMenuBrowserTest,
                        ContextMenuForEmojiPanel_NullBrowserCrash) {
@@ -731,6 +744,7 @@
   menu.Init();
   menu.ExecuteCommand(IDC_CONTENT_CONTEXT_EMOJI, 0);
 }
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 
 // Only Chrome OS supports emoji panel callbacks.
 #if BUILDFLAG(IS_CHROMEOS_ASH)
diff --git a/chrome/browser/resources/settings/privacy_page/privacy_page.html b/chrome/browser/resources/settings/privacy_page/privacy_page.html
index 1095f8e..5063ac2 100644
--- a/chrome/browser/resources/settings/privacy_page/privacy_page.html
+++ b/chrome/browser/resources/settings/privacy_page/privacy_page.html
@@ -1327,37 +1327,37 @@
           <settings-subpage page-title="$i18n{fonts}"
               search-label="$i18n{siteSettingsAllSitesSearch}"
               search-term="{{searchFilter_}}">
-              <template is="dom-if" if="[[enableContentSettingsRedesign_]]">
-                <div class="content-settings-header secondary">
-                  $i18n{siteSettingsFontsDescription}
-                </div>
-                <settings-category-default-radio-group
-                    category="[[ContentSettingsTypes.FONT_ACCESS]]"
-                    allow-option-label="$i18n{siteSettingsFontsAllowed}"
-                    allow-option-icon="settings:font-access"
-                    block-option-label="$i18n{siteSettingsFontsBlocked}"
-                    block-option-icon="settings:font-access-off">
-                </settings-category-default-radio-group>
-                <category-setting-exceptions
-                    category="[[ContentSettingsTypes.FONT_ACCESS]]"
-                    block-header="$i18n{siteSettingsFontsBlockedExceptions}"
-                    allow-header="$i18n{siteSettingsFontsAllowedExceptions}"
-                    search-filter="[[searchFilter_]]">
-                </category-setting-exceptions>
-              </template>
-              <template is="dom-if" if="[[!enableContentSettingsRedesign_]]">
-                <category-default-setting
-                    toggle-off-label="$i18n{siteSettingsFontAccessBlock}"
-                    toggle-on-label="$i18n{siteSettingsFontAccessAsk}"
-                    category="[[ContentSettingsTypes.FONT_ACCESS]]">
-                </category-default-setting>
-                <category-setting-exceptions
-                    category="[[ContentSettingsTypes.FONT_ACCESS]]"
-                    block-header="$i18n{siteSettingsBlock}"
-                    allow-header="$i18n{siteSettingsAllow}"
-                    search-filter="[[searchFilter_]]">
-                </category-setting-exceptions>
-              </template>
+            <template is="dom-if" if="[[enableContentSettingsRedesign_]]">
+              <div class="content-settings-header secondary">
+                $i18n{siteSettingsFontsDescription}
+              </div>
+              <settings-category-default-radio-group
+                  category="[[ContentSettingsTypes.FONT_ACCESS]]"
+                  allow-option-label="$i18n{siteSettingsFontsAllowed}"
+                  allow-option-icon="settings:font-access"
+                  block-option-label="$i18n{siteSettingsFontsBlocked}"
+                  block-option-icon="settings:font-access-off">
+              </settings-category-default-radio-group>
+              <category-setting-exceptions
+                  category="[[ContentSettingsTypes.FONT_ACCESS]]"
+                  block-header="$i18n{siteSettingsFontsBlockedExceptions}"
+                  allow-header="$i18n{siteSettingsFontsAllowedExceptions}"
+                  search-filter="[[searchFilter_]]">
+              </category-setting-exceptions>
+            </template>
+            <template is="dom-if" if="[[!enableContentSettingsRedesign_]]">
+              <category-default-setting
+                  toggle-off-label="$i18n{siteSettingsFontAccessBlock}"
+                  toggle-on-label="$i18n{siteSettingsFontAccessAsk}"
+                  category="[[ContentSettingsTypes.FONT_ACCESS]]">
+              </category-default-setting>
+              <category-setting-exceptions
+                  category="[[ContentSettingsTypes.FONT_ACCESS]]"
+                  block-header="$i18n{siteSettingsBlock}"
+                  allow-header="$i18n{siteSettingsAllow}"
+                  search-filter="[[searchFilter_]]">
+              </category-setting-exceptions>
+            </template>
           </settings-subpage>
         </template>
       </template>
diff --git a/chrome/browser/resources/settings/site_settings/settings_category_default_radio_group.js b/chrome/browser/resources/settings/site_settings/settings_category_default_radio_group.js
index 1c518cb7..70cf461 100644
--- a/chrome/browser/resources/settings/site_settings/settings_category_default_radio_group.js
+++ b/chrome/browser/resources/settings/site_settings/settings_category_default_radio_group.js
@@ -110,6 +110,7 @@
       case ContentSettingsTypes.VR:
       case ContentSettingsTypes.AR:
       case ContentSettingsTypes.WINDOW_PLACEMENT:
+      case ContentSettingsTypes.FONT_ACCESS:
         // "Ask" vs "Blocked".
         return ContentSetting.ASK;
       default:
diff --git a/chrome/browser/resources/tools/optimize_webui.gni b/chrome/browser/resources/tools/optimize_webui.gni
index 88d4b6fd..f21fbd98 100644
--- a/chrome/browser/resources/tools/optimize_webui.gni
+++ b/chrome/browser/resources/tools/optimize_webui.gni
@@ -2,32 +2,7 @@
 # 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")
-
-template("node") {
-  # TODO(crbug.com/1112471): Get this to run cleanly under Python 3.
-  python2_action(target_name) {
-    forward_variables_from(invoker, "*", TESTONLY_AND_VISIBILITY)
-    forward_variables_from(invoker, TESTONLY_AND_VISIBILITY)
-
-    # Declare dependencies to all involved tools.
-    inputs += [
-      "//third_party/node/node.py",
-      "//third_party/node/node_modules.py",
-      "//third_party/node/node_modules.tar.gz.sha1",
-    ]
-
-    if (is_linux || is_chromeos) {
-      inputs += [ "//third_party/node/linux/node-linux-x64.tar.gz.sha1" ]
-    }
-    if (is_win) {
-      inputs += [ "//third_party/node/win/node.exe.sha1" ]
-    }
-    if (is_mac) {
-      inputs += [ "//third_party/node/mac/node-darwin-x64.tar.gz.sha1" ]
-    }
-  }
-}
+import("//third_party/node/node.gni")
 
 template("optimize_webui") {
   node(target_name) {
diff --git a/chrome/browser/safe_browsing/advanced_protection_status_manager.cc b/chrome/browser/safe_browsing/advanced_protection_status_manager.cc
index 1e6f299..ba0ef3d5 100644
--- a/chrome/browser/safe_browsing/advanced_protection_status_manager.cc
+++ b/chrome/browser/safe_browsing/advanced_protection_status_manager.cc
@@ -55,8 +55,8 @@
 
 void AdvancedProtectionStatusManager::MaybeRefreshOnStartUp() {
   // Retrieves advanced protection service status from primary account's info.
-  CoreAccountInfo core_info = identity_manager_->GetPrimaryAccountInfo(
-      signin::ConsentLevel::kNotRequired);
+  CoreAccountInfo core_info =
+      identity_manager_->GetPrimaryAccountInfo(signin::ConsentLevel::kSignin);
   if (core_info.account_id.empty())
     return;
 
@@ -125,7 +125,7 @@
 
 void AdvancedProtectionStatusManager::OnPrimaryAccountChanged(
     const signin::PrimaryAccountChangeEvent& event) {
-  switch (event.GetEventTypeFor(signin::ConsentLevel::kNotRequired)) {
+  switch (event.GetEventTypeFor(signin::ConsentLevel::kSignin)) {
     case signin::PrimaryAccountChangeEvent::Type::kSet: {
       // TODO(crbug.com/926204): remove IdentityManager ensures that primary
       // account always has valid refresh token when it is set.
@@ -298,7 +298,7 @@
 CoreAccountId AdvancedProtectionStatusManager::GetUnconsentedPrimaryAccountId()
     const {
   return identity_manager_ ? identity_manager_->GetPrimaryAccountId(
-                                 signin::ConsentLevel::kNotRequired)
+                                 signin::ConsentLevel::kSignin)
                            : CoreAccountId();
 }
 
diff --git a/chrome/browser/safe_browsing/chrome_password_protection_service.cc b/chrome/browser/safe_browsing/chrome_password_protection_service.cc
index 753e042f..6337d21 100644
--- a/chrome/browser/safe_browsing/chrome_password_protection_service.cc
+++ b/chrome/browser/safe_browsing/chrome_password_protection_service.cc
@@ -735,7 +735,7 @@
     if (identity_manager) {
       CoreAccountInfo unconsented_primary_account_info =
           identity_manager->GetPrimaryAccountInfo(
-              signin::ConsentLevel::kNotRequired);
+              signin::ConsentLevel::kSignin);
       // SecurityEventRecorder only supports unconsented primary accounts.
       if (gaia::AreEmailsSame(unconsented_primary_account_info.email,
                               username_for_last_shown_warning())) {
diff --git a/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_utils.cc b/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_utils.cc
index 64607585..7e33556 100644
--- a/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_utils.cc
+++ b/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_utils.cc
@@ -338,7 +338,7 @@
   // empty account info.
   return identity_manager
              ? identity_manager
-                   ->GetPrimaryAccountInfo(signin::ConsentLevel::kNotRequired)
+                   ->GetPrimaryAccountInfo(signin::ConsentLevel::kSignin)
                    .email
              : std::string();
 }
diff --git a/chrome/browser/signin/account_reconcilor_factory.cc b/chrome/browser/signin/account_reconcilor_factory.cc
index 36bc499..df21e94 100644
--- a/chrome/browser/signin/account_reconcilor_factory.cc
+++ b/chrome/browser/signin/account_reconcilor_factory.cc
@@ -86,7 +86,7 @@
 
     if (!GetIdentityManager()->HasAccountWithRefreshTokenInPersistentErrorState(
             GetIdentityManager()->GetPrimaryAccountId(
-                signin::ConsentLevel::kNotRequired))) {
+                signin::ConsentLevel::kSignin))) {
       return;
     }
 
diff --git a/chrome/browser/signin/chrome_signin_client.cc b/chrome/browser/signin/chrome_signin_client.cc
index e65b7f5..0ed9cc9d 100644
--- a/chrome/browser/signin/chrome_signin_client.cc
+++ b/chrome/browser/signin/chrome_signin_client.cc
@@ -109,7 +109,6 @@
 }
 
 void ChromeSigninClient::DoFinalInit() {
-  MaybeFetchSigninTokenHandle();
   VerifySyncToken();
 }
 
@@ -205,46 +204,6 @@
   }
 }
 
-void ChromeSigninClient::OnGetTokenInfoResponse(
-    std::unique_ptr<base::DictionaryValue> token_info) {
-  if (!token_info->HasKey("error")) {
-    std::string handle;
-    if (token_info->GetString("token_handle", &handle)) {
-      ProfileAttributesEntry* entry =
-          g_browser_process->profile_manager()
-              ->GetProfileAttributesStorage()
-              .GetProfileAttributesWithPath(profile_->GetPath());
-      DCHECK(entry);
-      entry->SetPasswordChangeDetectionToken(handle);
-    }
-  }
-  access_token_fetcher_.reset();
-}
-
-void ChromeSigninClient::OnOAuthError() {
-  // Ignore the failure.  It's not essential and we'll try again next time.
-  access_token_fetcher_.reset();
-}
-
-void ChromeSigninClient::OnNetworkError(int response_code) {
-  // Ignore the failure.  It's not essential and we'll try again next time.
-  access_token_fetcher_.reset();
-}
-
-void ChromeSigninClient::OnAccessTokenAvailable(
-    GoogleServiceAuthError error,
-    signin::AccessTokenInfo access_token_info) {
-  access_token_fetcher_.reset();
-
-  // Exchange the access token for a handle that can be used for later
-  // verification that the token is still valid (i.e. the password has not
-  // been changed).
-  if (!oauth_client_) {
-    oauth_client_.reset(new gaia::GaiaOAuthClient(GetURLLoaderFactory()));
-  }
-  oauth_client_->GetTokenInfo(access_token_info.token, 3 /* retries */, this);
-}
-
 #if !BUILDFLAG(IS_CHROMEOS_ASH)
 void ChromeSigninClient::OnConnectionChanged(
     network::mojom::ConnectionType type) {
@@ -295,36 +254,6 @@
 #endif
 }
 
-void ChromeSigninClient::MaybeFetchSigninTokenHandle() {
-#if !defined(OS_ANDROID) && !BUILDFLAG(IS_CHROMEOS_ASH)
-  // We get a "handle" that can be used to reference the signin token on the
-  // server.  We fetch this if we don't have one so that later we can check
-  // it to know if the signin token to which it is attached has been revoked
-  // and thus distinguish between a password mismatch due to the password
-  // being changed and the user simply mis-typing it.
-  if (profiles::IsLockAvailable(profile_)) {
-    ProfileAttributesStorage& storage =
-        g_browser_process->profile_manager()->GetProfileAttributesStorage();
-    ProfileAttributesEntry* entry =
-        storage.GetProfileAttributesWithPath(profile_->GetPath());
-    // If we don't have a token for detecting a password change, create one.
-    if (entry && entry->GetPasswordChangeDetectionToken().empty() &&
-        !access_token_fetcher_) {
-      auto* identity_manager = IdentityManagerFactory::GetForProfile(profile_);
-      if (identity_manager->HasPrimaryAccount(signin::ConsentLevel::kSync)) {
-        const signin::ScopeSet scopes{GaiaConstants::kGoogleUserInfoEmail};
-        access_token_fetcher_ =
-            std::make_unique<signin::PrimaryAccountAccessTokenFetcher>(
-                "chrome_signin_client", identity_manager, scopes,
-                base::BindOnce(&ChromeSigninClient::OnAccessTokenAvailable,
-                               base::Unretained(this)),
-                signin::PrimaryAccountAccessTokenFetcher::Mode::kImmediate);
-      }
-    }
-  }
-#endif
-}
-
 void ChromeSigninClient::SetDiceMigrationCompleted() {
 #if BUILDFLAG(ENABLE_DICE_SUPPORT)
   AccountConsistencyModeManager::GetForProfile(profile_)
diff --git a/chrome/browser/signin/chrome_signin_client.h b/chrome/browser/signin/chrome_signin_client.h
index ecc45caf..3395faf7 100644
--- a/chrome/browser/signin/chrome_signin_client.h
+++ b/chrome/browser/signin/chrome_signin_client.h
@@ -16,8 +16,6 @@
 #include "build/build_config.h"
 #include "build/chromeos_buildflags.h"
 #include "components/signin/public/base/signin_client.h"
-#include "components/signin/public/identity_manager/primary_account_access_token_fetcher.h"
-#include "google_apis/gaia/gaia_oauth_client.h"
 #include "services/network/public/cpp/shared_url_loader_factory.h"
 #include "services/network/public/mojom/network_change_manager.mojom-forward.h"
 
@@ -31,11 +29,12 @@
 class Profile;
 
 class ChromeSigninClient
-    : public SigninClient,
+    : public SigninClient
 #if !BUILDFLAG(IS_CHROMEOS_ASH)
-      public network::NetworkConnectionTracker::NetworkConnectionObserver,
+    ,
+      public network::NetworkConnectionTracker::NetworkConnectionObserver
 #endif
-      public gaia::GaiaOAuthClient::Delegate {
+{
  public:
   explicit ChromeSigninClient(Profile* profile);
   ~ChromeSigninClient() override;
@@ -64,12 +63,6 @@
       gaia::GaiaSource source) override;
   bool IsNonEnterpriseUser(const std::string& username) override;
 
-  // gaia::GaiaOAuthClient::Delegate implementation.
-  void OnGetTokenInfoResponse(
-      std::unique_ptr<base::DictionaryValue> token_info) override;
-  void OnOAuthError() override;
-  void OnNetworkError(int response_code) override;
-
 #if !BUILDFLAG(IS_CHROMEOS_ASH)
   // network::NetworkConnectionTracker::NetworkConnectionObserver
   // implementation.
@@ -88,17 +81,12 @@
   virtual void LockForceSigninProfile(const base::FilePath& profile_path);
 
  private:
-  void MaybeFetchSigninTokenHandle();
   void VerifySyncToken();
   void OnCloseBrowsersSuccess(
       const signin_metrics::ProfileSignout signout_source_metric,
       const base::FilePath& profile_path);
   void OnCloseBrowsersAborted(const base::FilePath& profile_path);
 
-  // signin::PrimaryAccountAccessTokenFetcher callback
-  void OnAccessTokenAvailable(GoogleServiceAuthError error,
-                              signin::AccessTokenInfo access_token_info);
-
   Profile* profile_;
 
   // Stored callback from PreSignOut();
@@ -113,10 +101,6 @@
   std::unique_ptr<ForceSigninVerifier> force_signin_verifier_;
 #endif
 
-  std::unique_ptr<gaia::GaiaOAuthClient> oauth_client_;
-  std::unique_ptr<signin::PrimaryAccountAccessTokenFetcher>
-      access_token_fetcher_;
-
   scoped_refptr<network::SharedURLLoaderFactory>
       url_loader_factory_for_testing_;
 
diff --git a/chrome/browser/signin/chrome_signin_helper.cc b/chrome/browser/signin/chrome_signin_helper.cc
index b0902763..d2c4da4 100644
--- a/chrome/browser/signin/chrome_signin_helper.cc
+++ b/chrome/browser/signin/chrome_signin_helper.cc
@@ -253,8 +253,8 @@
     // (See the reason below.)
     signin::IdentityManager* const identity_manager =
         IdentityManagerFactory::GetForProfile(profile);
-    CoreAccountInfo primary_account = identity_manager->GetPrimaryAccountInfo(
-        signin::ConsentLevel::kNotRequired);
+    CoreAccountInfo primary_account =
+        identity_manager->GetPrimaryAccountInfo(signin::ConsentLevel::kSignin);
     if (profile->IsChild() &&
         gaia::AreEmailsSame(primary_account.email,
                             manage_accounts_params.email)) {
diff --git a/chrome/browser/signin/dice_web_signin_interceptor.cc b/chrome/browser/signin/dice_web_signin_interceptor.cc
index 1645c50..def1cd7 100644
--- a/chrome/browser/signin/dice_web_signin_interceptor.cc
+++ b/chrome/browser/signin/dice_web_signin_interceptor.cc
@@ -63,7 +63,7 @@
 // fields may be missing if they are not available.
 AccountInfo GetPrimaryAccountInfo(signin::IdentityManager* manager) {
   CoreAccountInfo primary_core_account_info =
-      manager->GetPrimaryAccountInfo(signin::ConsentLevel::kNotRequired);
+      manager->GetPrimaryAccountInfo(signin::ConsentLevel::kSignin);
   if (primary_core_account_info.IsEmpty())
     return AccountInfo();
 
@@ -362,8 +362,7 @@
   DCHECK(intercepted_account_info.IsValid());
   // Check if the intercepted account or the primary account is managed.
   CoreAccountInfo primary_core_account_info =
-      identity_manager_->GetPrimaryAccountInfo(
-          signin::ConsentLevel::kNotRequired);
+      identity_manager_->GetPrimaryAccountInfo(signin::ConsentLevel::kSignin);
 
   if (primary_core_account_info.IsEmpty() ||
       primary_core_account_info.account_id ==
diff --git a/chrome/browser/signin/dice_web_signin_interceptor_unittest.cc b/chrome/browser/signin/dice_web_signin_interceptor_unittest.cc
index 0569c9e..d247094 100644
--- a/chrome/browser/signin/dice_web_signin_interceptor_unittest.cc
+++ b/chrome/browser/signin/dice_web_signin_interceptor_unittest.cc
@@ -258,7 +258,7 @@
   MakeValidAccountInfo(&account_info);
   identity_test_env()->UpdateAccountInfoForAccount(account_info);
   ASSERT_EQ(identity_test_env()->identity_manager()->GetPrimaryAccountId(
-                signin::ConsentLevel::kNotRequired),
+                signin::ConsentLevel::kSignin),
             primary_account_info.account_id);
 
   // The primary account does not have full account info (empty domain).
@@ -301,7 +301,7 @@
 
   // Primary account is not set.
   ASSERT_FALSE(identity_test_env()->identity_manager()->HasPrimaryAccount(
-      signin::ConsentLevel::kNotRequired));
+      signin::ConsentLevel::kSignin));
   EXPECT_FALSE(interceptor()->ShouldShowEnterpriseBubble(account_info_1));
 }
 
diff --git a/chrome/browser/signin/header_modification_delegate_impl.cc b/chrome/browser/signin/header_modification_delegate_impl.cc
index 38e4597..4b83419 100644
--- a/chrome/browser/signin/header_modification_delegate_impl.cc
+++ b/chrome/browser/signin/header_modification_delegate_impl.cc
@@ -73,7 +73,7 @@
   ConsentLevel consent_level = ConsentLevel::kSync;
 #if defined(OS_ANDROID)
   if (base::FeatureList::IsEnabled(kMobileIdentityConsistency))
-    consent_level = ConsentLevel::kNotRequired;
+    consent_level = ConsentLevel::kSignin;
 #endif
 
   IdentityManager* identity_manager =
diff --git a/chrome/browser/signin/local_auth.cc b/chrome/browser/signin/local_auth.cc
deleted file mode 100644
index d534b7c..0000000
--- a/chrome/browser/signin/local_auth.cc
+++ /dev/null
@@ -1,270 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/signin/local_auth.h"
-
-#include <memory>
-
-#include "base/base64.h"
-#include "base/check_op.h"
-#include "base/files/file_path.h"
-#include "base/metrics/histogram_macros.h"
-#include "base/notreached.h"
-#include "base/strings/string_util.h"
-#include "chrome/browser/browser_process.h"
-#include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/profiles/profile_attributes_entry.h"
-#include "chrome/browser/profiles/profile_attributes_storage.h"
-#include "chrome/browser/profiles/profile_manager.h"
-#include "chrome/common/pref_names.h"
-#include "components/os_crypt/os_crypt.h"
-#include "components/pref_registry/pref_registry_syncable.h"
-#include "components/prefs/pref_service.h"
-#include "crypto/random.h"
-#include "crypto/secure_util.h"
-#include "crypto/symmetric_key.h"
-
-namespace {
-
-struct HashEncoding {
-  char version;
-  unsigned hash_bits;
-  unsigned hash_bytes;
-  unsigned iteration_count;
-  unsigned stored_bits;
-  unsigned stored_bytes;
-
-  public:
-   HashEncoding(char version,
-                unsigned hash_bits,
-                unsigned hash_bytes,
-                unsigned iteration_count,
-                unsigned stored_bits,
-                unsigned stored_bytes) :
-      version(version),
-      hash_bits(hash_bits),
-      hash_bytes(hash_bytes),
-      iteration_count(iteration_count),
-      stored_bits(stored_bits),
-      stored_bytes(stored_bytes) {}
-};
-
-// WARNING: Changing these values will make it impossible to do off-line
-// authentication until the next successful on-line authentication.  To change
-// these safely, add a new HashEncoding object below and increment
-// NUM_HASH_ENCODINGS.
-const char kHash1Version = '1';
-const unsigned kHash1Bits = 256;
-const unsigned kHash1Bytes = kHash1Bits / 8;
-const unsigned kHash1IterationCount = 100000;
-
-// Store 13 bits to provide pin-like security (8192 possible values), without
-// providing a complete oracle for the user's GAIA password.
-const char kHash2Version = '2';
-const unsigned kHash2Bits = 256;
-const unsigned kHash2Bytes = kHash2Bits / 8;
-const unsigned kHash2IterationCount = 100000;
-const unsigned kHash2StoredBits = 13;
-const unsigned kHash2StoredBytes = (kHash2StoredBits + 7) / 8;
-
-const int NUM_HASH_ENCODINGS = 2;
-HashEncoding encodings[NUM_HASH_ENCODINGS] = {
-  HashEncoding(
-      kHash1Version, kHash1Bits, kHash1Bytes, kHash1IterationCount, 0, 0),
-  HashEncoding(
-      kHash2Version, kHash2Bits, kHash2Bytes, kHash2IterationCount,
-          kHash2StoredBits, kHash2StoredBytes)
-};
-
-const HashEncoding* GetEncodingForVersion(char version) {
-  // Note that versions are 1-indexed.
-  DCHECK(version > '0' && version <= ('0' + NUM_HASH_ENCODINGS));
-  return &encodings[(version - '0') - 1];
-}
-
-std::string TruncateStringByBits(const std::string& str,
-                                 const size_t len_bits) {
-  if (len_bits % 8 == 0)
-    return str.substr(0, len_bits / 8);
-
-  // The initial truncation copies whole bytes
-  int number_bytes = (len_bits + 7) / 8;
-  std::string truncated_string = str.substr(0, number_bytes);
-
-  // Keep the prescribed number of bits from the last byte.
-  unsigned last_char_bitmask = (1 << (len_bits % 8)) - 1;
-  truncated_string[number_bytes - 1] &= last_char_bitmask;
-  return truncated_string;
-}
-
-std::string CreateSecurePasswordHash(const std::string& salt,
-                                     const std::string& password,
-                                     const HashEncoding& encoding) {
-  DCHECK_EQ(encoding.hash_bytes, salt.length());
-  base::Time start_time = base::Time::Now();
-
-  // Library call to create secure password hash as SymmetricKey (uses PBKDF2).
-  std::unique_ptr<crypto::SymmetricKey> password_key(
-      crypto::SymmetricKey::DeriveKeyFromPasswordUsingPbkdf2(
-          crypto::SymmetricKey::AES, password, salt, encoding.iteration_count,
-          encoding.hash_bits));
-  std::string password_hash = password_key->key();
-  DCHECK_EQ(encoding.hash_bytes, password_hash.length());
-
-  UMA_HISTOGRAM_TIMES("PasswordHash.CreateTime",
-                      base::Time::Now() - start_time);
-
-  if (encoding.stored_bits) {
-    password_hash = TruncateStringByBits(password_hash, encoding.stored_bits);
-    DCHECK_EQ(encoding.stored_bytes, password_hash.length());
-  }
-  DCHECK_EQ(encoding.stored_bytes ? encoding.stored_bytes : encoding.hash_bytes,
-            password_hash.length());
-  return password_hash;
-}
-
-std::string EncodePasswordHashRecord(const std::string& record,
-                                     const HashEncoding& encoding) {
-  // Encrypt the hash using the OS account-password protection (if available).
-  std::string encoded;
-  const bool success = OSCrypt::EncryptString(record, &encoded);
-  DCHECK(success);
-
-  // Convert binary record to text for preference database.
-  std::string encoded64;
-  base::Base64Encode(encoded, &encoded64);
-
-  // Stuff the "encoding" value into the first byte.
-  encoded64.insert(0, &encoding.version, sizeof(encoding.version));
-
-  return encoded64;
-}
-
-bool DecodePasswordHashRecord(const std::string& encoded,
-                              std::string* decoded,
-                              char* encoding) {
-  // Extract the "encoding" value from the first byte and validate.
-  if (encoded.length() < 1)
-    return false;
-  *encoding = encoded[0];
-  if (!GetEncodingForVersion(*encoding))
-    return false;
-
-  // Stored record is base64; convert to binary.
-  std::string unbase64;
-  if (!base::Base64Decode(encoded.substr(1), &unbase64))
-    return false;
-
-  // Decrypt the record using the OS account-password protection (if available).
-  return OSCrypt::DecryptString(unbase64, decoded);
-}
-
-}  // namespace
-
-std::string LocalAuth::TruncateStringByBits(const std::string& str,
-                                            const size_t len_bits) {
-  return ::TruncateStringByBits(str, len_bits);
-}
-
-void LocalAuth::SetLocalAuthCredentialsWithEncoding(
-    ProfileAttributesEntry* entry,
-    const std::string& password,
-    char encoding_version) {
-  const HashEncoding& encoding = encodings[(encoding_version - '0') - 1];
-
-  // Salt should be random data, as long as the hash length, and different with
-  // every save.
-  std::string salt_str;
-  crypto::RandBytes(base::WriteInto(&salt_str, encoding.hash_bytes + 1),
-                    encoding.hash_bytes);
-
-  // Perform secure hash of password for storage.
-  std::string password_hash = CreateSecurePasswordHash(
-      salt_str, password, encoding);
-
-  // Group all fields into a single record for storage;
-  std::string record;
-  record.append(salt_str);
-  record.append(password_hash);
-
-  // Encode it and store it.
-  std::string encoded = EncodePasswordHashRecord(record, encoding);
-  entry->SetLocalAuthCredentials(encoded);
-}
-
-void LocalAuth::SetLocalAuthCredentials(ProfileAttributesEntry* entry,
-                                        const std::string& password) {
-  DCHECK(entry);
-  DCHECK(password.length());
-  SetLocalAuthCredentialsWithEncoding(
-      entry, password, '0' + NUM_HASH_ENCODINGS);
-}
-
-void LocalAuth::SetLocalAuthCredentials(const Profile* profile,
-                                        const std::string& password) {
-  DCHECK(g_browser_process->profile_manager()->IsValidProfile(profile));
-  ProfileAttributesEntry* entry =
-      g_browser_process->profile_manager()
-          ->GetProfileAttributesStorage()
-          .GetProfileAttributesWithPath(profile->GetPath());
-  DCHECK(entry);
-  SetLocalAuthCredentials(entry, password);
-}
-
-bool LocalAuth::ValidateLocalAuthCredentials(ProfileAttributesEntry* entry,
-                                             const std::string& password) {
-  DCHECK(entry);
-
-  std::string record;
-  char encoding;
-
-  std::string encodedhash = entry->GetLocalAuthCredentials();
-  if (encodedhash.length() == 0 && password.length() == 0)
-    return true;
-  if (!DecodePasswordHashRecord(encodedhash, &record, &encoding))
-    return false;
-
-  std::string password_hash;
-  const char* password_saved;
-  const char* password_check;
-  size_t password_length;
-
-  const HashEncoding* hash_encoding = GetEncodingForVersion(encoding);
-  if (!hash_encoding) {
-    // Unknown encoding.
-    return false;
-  }
-
-  // Extract salt.
-  std::string salt_str(record.data(), hash_encoding->hash_bytes);
-  // Extract password.
-  password_saved = record.data() + hash_encoding->hash_bytes;
-  password_hash = CreateSecurePasswordHash(salt_str, password, *hash_encoding);
-  password_length = hash_encoding->stored_bytes;
-  password_check = password_hash.data();
-
-  bool passwords_match = crypto::SecureMemEqual(
-      password_saved, password_check, password_length);
-
-  // Update the stored credentials to the latest encoding if necessary.
-  if (passwords_match && (hash_encoding->version - '0') != NUM_HASH_ENCODINGS)
-    SetLocalAuthCredentials(entry, password);
-  return passwords_match;
-}
-
-bool LocalAuth::ValidateLocalAuthCredentials(const Profile* profile,
-                                             const std::string& password) {
-  DCHECK(g_browser_process->profile_manager()->IsValidProfile(profile));
-  ProfileAttributesEntry* entry =
-      g_browser_process->profile_manager()
-          ->GetProfileAttributesStorage()
-          .GetProfileAttributesWithPath(profile->GetPath());
-
-  if (!entry) {
-    NOTREACHED();
-    return false;
-  }
-
-  return ValidateLocalAuthCredentials(entry, password);
-}
diff --git a/chrome/browser/signin/local_auth.h b/chrome/browser/signin/local_auth.h
deleted file mode 100644
index df764e8..0000000
--- a/chrome/browser/signin/local_auth.h
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// The local-auth module allows for user authentication in the case when
-// on-line authentication is not possible (e.g. there is no network
-// connection).
-
-#ifndef CHROME_BROWSER_SIGNIN_LOCAL_AUTH_H_
-#define CHROME_BROWSER_SIGNIN_LOCAL_AUTH_H_
-
-#include <stddef.h>
-
-#include <string>
-
-#include "base/gtest_prod_util.h"
-
-class LocalAuthTest;
-class Profile;
-class ProfileAttributesEntry;
-
-class LocalAuth {
- public:
-  static void SetLocalAuthCredentials(ProfileAttributesEntry* entry,
-                                      const std::string& password);
-
-  static void SetLocalAuthCredentials(const Profile* profile,
-                                      const std::string& password);
-
-  static bool ValidateLocalAuthCredentials(ProfileAttributesEntry* entry,
-                                           const std::string& password);
-
-  static bool ValidateLocalAuthCredentials(const Profile* profile,
-                                           const std::string& password);
-
- private:
-  FRIEND_TEST_ALL_PREFIXES(LocalAuthTest, SetUpgradeAndCheckCredentials);
-  FRIEND_TEST_ALL_PREFIXES(LocalAuthTest, TruncateStringEvenly);
-  FRIEND_TEST_ALL_PREFIXES(LocalAuthTest, TruncateStringUnevenly);
-
-  // Return only the first |len_bits| bits of the string |str|. Defined here for
-  // testing.
-  static std::string TruncateStringByBits(const std::string& str,
-                                          const size_t len_bits);
-
-  static void SetLocalAuthCredentialsWithEncoding(ProfileAttributesEntry* entry,
-                                                  const std::string& password,
-                                                  char encoding_version);
-};
-
-#endif  // CHROME_BROWSER_SIGNIN_LOCAL_AUTH_H_
diff --git a/chrome/browser/signin/local_auth_unittest.cc b/chrome/browser/signin/local_auth_unittest.cc
deleted file mode 100644
index 4dbee9f6..0000000
--- a/chrome/browser/signin/local_auth_unittest.cc
+++ /dev/null
@@ -1,121 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/signin/local_auth.h"
-
-#include <stddef.h>
-
-#include "base/base64.h"
-#include "build/build_config.h"
-#include "chrome/browser/profiles/profile_attributes_entry.h"
-#include "chrome/browser/profiles/profile_attributes_storage.h"
-#include "chrome/test/base/testing_browser_process.h"
-#include "chrome/test/base/testing_profile.h"
-#include "chrome/test/base/testing_profile_manager.h"
-#include "components/os_crypt/os_crypt_mocker.h"
-#include "components/prefs/pref_service.h"
-#include "components/sync_preferences/testing_pref_service_syncable.h"
-#include "content/public/test/browser_task_environment.h"
-
-#include "testing/gtest/include/gtest/gtest.h"
-
-class LocalAuthTest : public testing::Test {
- public:
-  LocalAuthTest() { OSCryptMocker::SetUp(); }
-
-  ~LocalAuthTest() override { OSCryptMocker::TearDown(); }
-
- private:
-  content::BrowserTaskEnvironment task_environment_;
-};
-
-TEST_F(LocalAuthTest, SetAndCheckCredentials) {
-  TestingProfileManager testing_profile_manager(
-      TestingBrowserProcess::GetGlobal());
-  ASSERT_TRUE(testing_profile_manager.SetUp());
-  Profile* prof = testing_profile_manager.CreateTestingProfile("p1");
-  ProfileAttributesEntry* entry =
-      testing_profile_manager.profile_attributes_storage()
-          ->GetProfileAttributesWithPath(prof->GetPath());
-  ASSERT_NE(entry, nullptr);
-  EXPECT_EQ("", entry->GetLocalAuthCredentials());
-
-  std::string password("Some Password");
-  EXPECT_FALSE(LocalAuth::ValidateLocalAuthCredentials(prof, password));
-
-  LocalAuth::SetLocalAuthCredentials(prof, password);
-  std::string passhash = entry->GetLocalAuthCredentials();
-
-  // We perform basic validation on the written record to ensure bugs don't slip
-  // in that cannot be seen from the API:
-  //  - The encoding exists (we can guarantee future backward compatibility).
-  //  - The plaintext version of the password is not mistakenly stored anywhere.
-  EXPECT_FALSE(passhash.empty());
-  EXPECT_EQ('2', passhash[0]);
-  EXPECT_EQ(passhash.find(password), std::string::npos);
-
-  std::string decodedhash;
-  base::Base64Decode(passhash.substr(1), &decodedhash);
-  EXPECT_FALSE(decodedhash.empty());
-  EXPECT_EQ(decodedhash.find(password), std::string::npos);
-
-  EXPECT_TRUE(LocalAuth::ValidateLocalAuthCredentials(prof, password));
-  EXPECT_FALSE(LocalAuth::ValidateLocalAuthCredentials(prof, password + "1"));
-
-  LocalAuth::SetLocalAuthCredentials(prof, password);  // makes different salt
-  EXPECT_NE(passhash, entry->GetLocalAuthCredentials());
-}
-
-TEST_F(LocalAuthTest, SetUpgradeAndCheckCredentials) {
-  TestingProfileManager testing_profile_manager(
-      TestingBrowserProcess::GetGlobal());
-  ASSERT_TRUE(testing_profile_manager.SetUp());
-  Profile* prof = testing_profile_manager.CreateTestingProfile("p1");
-
-  std::string password("Some Password");
-  ProfileAttributesEntry* entry =
-      testing_profile_manager.profile_attributes_storage()
-          ->GetProfileAttributesWithPath(prof->GetPath());
-  ASSERT_NE(entry, nullptr);
-  LocalAuth::SetLocalAuthCredentialsWithEncoding(entry, password, '1');
-
-  // Ensure we indeed persisted the correct encoding.
-  std::string oldpasshash = entry->GetLocalAuthCredentials();
-  EXPECT_EQ('1', oldpasshash[0]);
-
-  // Validate, ensure we can validate against the old encoding.
-  EXPECT_TRUE(LocalAuth::ValidateLocalAuthCredentials(prof, password));
-
-  // Ensure we updated the encoding.
-  std::string newpasshash = entry->GetLocalAuthCredentials();
-  EXPECT_EQ('2', newpasshash[0]);
-  // Encoding '2' writes fewer bytes than encoding '1'.
-  EXPECT_LE(newpasshash.length(), oldpasshash.length());
-
-  // Validate, ensure we validate against the new encoding.
-  EXPECT_TRUE(LocalAuth::ValidateLocalAuthCredentials(prof, password));
-}
-
-// Test truncation where each byte is left whole.
-TEST_F(LocalAuthTest, TruncateStringEvenly) {
-  std::string two_chars = "A6";
-  std::string three_chars = "A6C";
-  EXPECT_EQ(two_chars, LocalAuth::TruncateStringByBits(two_chars, 16));
-  EXPECT_EQ(two_chars, LocalAuth::TruncateStringByBits(three_chars, 16));
-
-  EXPECT_EQ(two_chars, LocalAuth::TruncateStringByBits(two_chars, 14));
-  EXPECT_EQ(two_chars, LocalAuth::TruncateStringByBits(three_chars, 14));
-}
-
-// Test truncation that affects the results within a byte.
-TEST_F(LocalAuthTest, TruncateStringUnevenly) {
-  std::string two_chars = "Az";
-  std::string three_chars = "AzC";
-  // 'z' = 0x7A, ':' = 0x3A.
-  std::string two_chars_truncated = "A:";
-  EXPECT_EQ(two_chars_truncated,
-      LocalAuth::TruncateStringByBits(two_chars, 14));
-  EXPECT_EQ(two_chars_truncated,
-      LocalAuth::TruncateStringByBits(three_chars, 14));
-}
diff --git a/chrome/browser/signin/signin_manager.cc b/chrome/browser/signin/signin_manager.cc
index 9c28467..61c8a41f 100644
--- a/chrome/browser/signin/signin_manager.cc
+++ b/chrome/browser/signin/signin_manager.cc
@@ -28,14 +28,14 @@
   DCHECK(!account || !account->IsEmpty());
   if (account) {
     if (identity_manager_->GetPrimaryAccountInfo(
-            signin::ConsentLevel::kNotRequired) != account) {
+            signin::ConsentLevel::kSignin) != account) {
       DCHECK(
           !identity_manager_->HasPrimaryAccount(signin::ConsentLevel::kSync));
       identity_manager_->GetPrimaryAccountMutator()
           ->SetUnconsentedPrimaryAccount(account->account_id);
     }
   } else if (identity_manager_->HasPrimaryAccount(
-                 signin::ConsentLevel::kNotRequired)) {
+                 signin::ConsentLevel::kSignin)) {
     DCHECK(!identity_manager_->HasPrimaryAccount(signin::ConsentLevel::kSync));
     identity_manager_->GetPrimaryAccountMutator()->ClearPrimaryAccount(
         signin_metrics::USER_DELETED_ACCOUNT_COOKIES,
@@ -82,14 +82,14 @@
     return error_state ? base::nullopt : account_info;
   }
 
-  if (!identity_manager_->HasPrimaryAccount(signin::ConsentLevel::kNotRequired))
+  if (!identity_manager_->HasPrimaryAccount(signin::ConsentLevel::kSignin))
     return base::nullopt;
 
   // If cookies or tokens are not loaded, it is not possible to fully compute
   // the unconsented primary account. However, if the current unconsented
   // primary account is no longer valid, it has to be removed.
-  CoreAccountId current_account = identity_manager_->GetPrimaryAccountId(
-      signin::ConsentLevel::kNotRequired);
+  CoreAccountId current_account =
+      identity_manager_->GetPrimaryAccountId(signin::ConsentLevel::kSignin);
 
   if (are_refresh_tokens_loaded &&
       !identity_manager_->HasAccountWithRefreshToken(current_account)) {
@@ -115,7 +115,7 @@
 
   // No indication that the current UPA is invalid, return current UPA.
   return identity_manager_->GetPrimaryAccountInfo(
-      signin::ConsentLevel::kNotRequired);
+      signin::ConsentLevel::kSignin);
 }
 
 // signin::IdentityManager::Observer implementation.
@@ -149,10 +149,9 @@
 void SigninManager::OnRefreshTokenRemovedForAccount(
     const CoreAccountId& account_id) {
   if (!identity_manager_->AreRefreshTokensLoaded() &&
-      identity_manager_->HasPrimaryAccount(
-          signin::ConsentLevel::kNotRequired) &&
+      identity_manager_->HasPrimaryAccount(signin::ConsentLevel::kSignin) &&
       account_id == identity_manager_->GetPrimaryAccountId(
-                        signin::ConsentLevel::kNotRequired)) {
+                        signin::ConsentLevel::kSignin)) {
     unconsented_primary_account_revoked_during_load_ = true;
   }
   UpdateUnconsentedPrimaryAccount();
@@ -175,8 +174,8 @@
 void SigninManager::OnErrorStateOfRefreshTokenUpdatedForAccount(
     const CoreAccountInfo& account_info,
     const GoogleServiceAuthError& error) {
-  CoreAccountInfo current_account = identity_manager_->GetPrimaryAccountInfo(
-      signin::ConsentLevel::kNotRequired);
+  CoreAccountInfo current_account =
+      identity_manager_->GetPrimaryAccountInfo(signin::ConsentLevel::kSignin);
 
   bool should_update = false;
   if (error == GoogleServiceAuthError::AuthErrorNone()) {
diff --git a/chrome/browser/signin/signin_manager_unittest.cc b/chrome/browser/signin/signin_manager_unittest.cc
index 3bd0628..1502232 100644
--- a/chrome/browser/signin/signin_manager_unittest.cc
+++ b/chrome/browser/signin/signin_manager_unittest.cc
@@ -81,7 +81,7 @@
     EXPECT_EQ(1U, observer().events().size());
     auto event = observer().events()[0];
     EXPECT_EQ(PrimaryAccountChangeEvent::Type::kSet,
-              event.GetEventTypeFor(ConsentLevel::kNotRequired));
+              event.GetEventTypeFor(ConsentLevel::kSignin));
     EXPECT_TRUE(event.GetPreviousState().primary_account.IsEmpty());
     EXPECT_EQ(expected_primary_account,
               event.GetCurrentState().primary_account);
@@ -93,7 +93,7 @@
     EXPECT_EQ(1U, observer().events().size());
     auto event = observer().events()[0];
     EXPECT_EQ(PrimaryAccountChangeEvent::Type::kCleared,
-              event.GetEventTypeFor(ConsentLevel::kNotRequired));
+              event.GetEventTypeFor(ConsentLevel::kSignin));
     EXPECT_EQ(expected_cleared_account,
               event.GetPreviousState().primary_account);
     EXPECT_TRUE(event.GetCurrentState().primary_account.IsEmpty());
@@ -105,7 +105,7 @@
     EXPECT_EQ(1U, observer().events().size());
     auto event = observer().events()[0];
     EXPECT_EQ(PrimaryAccountChangeEvent::Type::kSet,
-              event.GetEventTypeFor(ConsentLevel::kNotRequired));
+              event.GetEventTypeFor(ConsentLevel::kSignin));
     EXPECT_EQ(PrimaryAccountChangeEvent::Type::kSet,
               event.GetEventTypeFor(ConsentLevel::kSync));
     EXPECT_TRUE(event.GetPreviousState().primary_account.IsEmpty());
@@ -125,10 +125,9 @@
     identity_test_env_.MakeAccountAvailableWithCookies(account.email,
                                                        account.gaia);
     EXPECT_FALSE(account.IsEmpty());
-    EXPECT_TRUE(
-        identity_manager()->HasPrimaryAccount(ConsentLevel::kNotRequired));
-    EXPECT_EQ(account, identity_manager()->GetPrimaryAccountInfo(
-                           ConsentLevel::kNotRequired));
+    EXPECT_TRUE(identity_manager()->HasPrimaryAccount(ConsentLevel::kSignin));
+    EXPECT_EQ(account,
+              identity_manager()->GetPrimaryAccountInfo(ConsentLevel::kSignin));
     EXPECT_FALSE(identity_manager()->HasPrimaryAccount(ConsentLevel::kSync));
     return account;
   }
@@ -136,8 +135,8 @@
   AccountInfo MakeSyncAccountAvailableWithCookies(const std::string& email) {
     AccountInfo account = identity_test_env_.MakePrimaryAccountAvailable(email);
     identity_test_env_.SetCookieAccounts({{account.email, account.gaia}});
-    EXPECT_EQ(account, identity_manager()->GetPrimaryAccountInfo(
-                           ConsentLevel::kNotRequired));
+    EXPECT_EQ(account,
+              identity_manager()->GetPrimaryAccountInfo(ConsentLevel::kSignin));
     EXPECT_EQ(account,
               identity_manager()->GetPrimaryAccountInfo(ConsentLevel::kSync));
     EXPECT_TRUE(identity_manager()->HasPrimaryAccountWithRefreshToken(
@@ -161,8 +160,8 @@
   // Add an unconsented primary account, incl. proper cookies.
   AccountInfo account = MakeAccountAvailableWithCookies(kTestEmail);
   ExpectUnconsentedPrimaryAccountSetEvent(account);
-  EXPECT_EQ(account, identity_manager()->GetPrimaryAccountInfo(
-                         ConsentLevel::kNotRequired));
+  EXPECT_EQ(account,
+            identity_manager()->GetPrimaryAccountInfo(ConsentLevel::kSignin));
 }
 
 TEST_F(
@@ -175,15 +174,13 @@
   // Invalid token.
   SetInvalidRefreshTokenForAccount(identity_manager(), account.account_id);
   ExpectUnconsentedPrimaryAccountClearedEvent(account);
-  EXPECT_FALSE(
-      identity_manager()->HasPrimaryAccount(ConsentLevel::kNotRequired));
+  EXPECT_FALSE(identity_manager()->HasPrimaryAccount(ConsentLevel::kSignin));
 
   // Update with a valid token.
   SetRefreshTokenForAccount(identity_manager(), account.account_id, "");
   ExpectUnconsentedPrimaryAccountSetEvent(account);
-  EXPECT_EQ(
-      identity_manager()->GetPrimaryAccountInfo(ConsentLevel::kNotRequired),
-      account);
+  EXPECT_EQ(identity_manager()->GetPrimaryAccountInfo(ConsentLevel::kSignin),
+            account);
 }
 
 TEST_F(
@@ -196,15 +193,14 @@
   // With no refresh token, there is no unconsented primary account any more.
   identity_test_env()->RemoveRefreshTokenForAccount(account.account_id);
   ExpectUnconsentedPrimaryAccountClearedEvent(account);
-  EXPECT_FALSE(
-      identity_manager()->HasPrimaryAccount(ConsentLevel::kNotRequired));
+  EXPECT_FALSE(identity_manager()->HasPrimaryAccount(ConsentLevel::kSignin));
 }
 
 TEST_F(SigninManagerTest, UnconsentedPrimaryAccountNotChangedOnSignout) {
   // Set a primary account at sync consent level.
   AccountInfo account = MakeSyncAccountAvailableWithCookies(kTestEmail);
-  EXPECT_EQ(account, identity_manager()->GetPrimaryAccountInfo(
-                         ConsentLevel::kNotRequired));
+  EXPECT_EQ(account,
+            identity_manager()->GetPrimaryAccountInfo(ConsentLevel::kSignin));
   EXPECT_EQ(account,
             identity_manager()->GetPrimaryAccountInfo(ConsentLevel::kSync));
   EXPECT_TRUE(identity_manager()->HasPrimaryAccountWithRefreshToken(
@@ -217,14 +213,14 @@
   identity_test_env()->RevokeSyncConsent();
   base::RunLoop().RunUntilIdle();
 
-  EXPECT_EQ(account, identity_manager()->GetPrimaryAccountInfo(
-                         ConsentLevel::kNotRequired));
+  EXPECT_EQ(account,
+            identity_manager()->GetPrimaryAccountInfo(ConsentLevel::kSignin));
   EXPECT_FALSE(identity_manager()->HasPrimaryAccount(ConsentLevel::kSync));
 
   EXPECT_EQ(1U, observer().events().size());
   auto event = observer().events()[0];
   EXPECT_EQ(PrimaryAccountChangeEvent::Type::kNone,
-            event.GetEventTypeFor(ConsentLevel::kNotRequired));
+            event.GetEventTypeFor(ConsentLevel::kSignin));
   EXPECT_EQ(PrimaryAccountChangeEvent::Type::kCleared,
             event.GetEventTypeFor(ConsentLevel::kSync));
   EXPECT_EQ(account, event.GetPreviousState().primary_account);
@@ -245,8 +241,7 @@
   ASSERT_FALSE(identity_manager()->GetAccountsInCookieJar().accounts_are_fresh);
 
   // Unconsented account was removed.
-  EXPECT_FALSE(
-      identity_manager()->HasPrimaryAccount(ConsentLevel::kNotRequired));
+  EXPECT_FALSE(identity_manager()->HasPrimaryAccount(ConsentLevel::kSignin));
   ExpectUnconsentedPrimaryAccountClearedEvent(account);
 }
 
@@ -261,11 +256,10 @@
       {{main_account.email, main_account.gaia},
        {secondary_account.email, secondary_account.gaia}});
 
-  EXPECT_TRUE(
-      identity_manager()->HasPrimaryAccount(ConsentLevel::kNotRequired));
+  EXPECT_TRUE(identity_manager()->HasPrimaryAccount(ConsentLevel::kSignin));
   EXPECT_FALSE(identity_manager()->HasPrimaryAccount(ConsentLevel::kSync));
-  EXPECT_EQ(main_account, identity_manager()->GetPrimaryAccountInfo(
-                              ConsentLevel::kNotRequired));
+  EXPECT_EQ(main_account,
+            identity_manager()->GetPrimaryAccountInfo(ConsentLevel::kSignin));
   ExpectUnconsentedPrimaryAccountSetEvent(main_account);
 
   // Make the cookies stale and remove the main account.
@@ -274,8 +268,7 @@
   ASSERT_FALSE(identity_manager()->GetAccountsInCookieJar().accounts_are_fresh);
 
   // Unconsented account was removed.
-  EXPECT_FALSE(
-      identity_manager()->HasPrimaryAccount(ConsentLevel::kNotRequired));
+  EXPECT_FALSE(identity_manager()->HasPrimaryAccount(ConsentLevel::kSignin));
   ExpectUnconsentedPrimaryAccountClearedEvent(main_account);
 }
 
@@ -288,8 +281,8 @@
   identity_test_env()->SetCookieAccounts(
       {{main_account.email, main_account.gaia},
        {secondary_account.email, secondary_account.gaia}});
-  ASSERT_EQ(main_account, identity_manager()->GetPrimaryAccountInfo(
-                              ConsentLevel::kNotRequired));
+  ASSERT_EQ(main_account,
+            identity_manager()->GetPrimaryAccountInfo(ConsentLevel::kSignin));
   ASSERT_FALSE(identity_manager()->HasPrimaryAccount(ConsentLevel::kSync));
   ExpectUnconsentedPrimaryAccountSetEvent(main_account);
 
@@ -298,27 +291,25 @@
   RecreateSigninManager();
 
   // Unconsented primary account is available while tokens are not loaded.
-  EXPECT_EQ(main_account, identity_manager()->GetPrimaryAccountInfo(
-                              ConsentLevel::kNotRequired));
+  EXPECT_EQ(main_account,
+            identity_manager()->GetPrimaryAccountInfo(ConsentLevel::kSignin));
   EXPECT_TRUE(observer().events().empty());
 
   // Revoking an unrelated token doesn't change the unconsented primary account.
   identity_test_env()->RemoveRefreshTokenForAccount(
       secondary_account.account_id);
-  EXPECT_EQ(main_account, identity_manager()->GetPrimaryAccountInfo(
-                              ConsentLevel::kNotRequired));
+  EXPECT_EQ(main_account,
+            identity_manager()->GetPrimaryAccountInfo(ConsentLevel::kSignin));
   EXPECT_TRUE(observer().events().empty());
 
   // Revoke the unconsented primary account while tokens are not loaded.
   identity_test_env()->RemoveRefreshTokenForAccount(main_account.account_id);
-  EXPECT_FALSE(
-      identity_manager()->HasPrimaryAccount(ConsentLevel::kNotRequired));
+  EXPECT_FALSE(identity_manager()->HasPrimaryAccount(ConsentLevel::kSignin));
   ExpectUnconsentedPrimaryAccountClearedEvent(main_account);
 
   // Finish the token load.
   identity_test_env()->ReloadAccountsFromDisk();
-  EXPECT_FALSE(
-      identity_manager()->HasPrimaryAccount(ConsentLevel::kNotRequired));
+  EXPECT_FALSE(identity_manager()->HasPrimaryAccount(ConsentLevel::kSignin));
   EXPECT_TRUE(observer().events().empty());
 }
 
@@ -331,8 +322,8 @@
   identity_test_env()->SetCookieAccounts(
       {{first_account.email, first_account.gaia},
        {second_account.email, second_account.gaia}});
-  ASSERT_EQ(first_account, identity_manager()->GetPrimaryAccountInfo(
-                               ConsentLevel::kNotRequired));
+  ASSERT_EQ(first_account,
+            identity_manager()->GetPrimaryAccountInfo(ConsentLevel::kSignin));
   ExpectUnconsentedPrimaryAccountSetEvent(first_account);
 
   // Set the sync primary account to the second account in cookies.
@@ -357,17 +348,16 @@
   EXPECT_FALSE(
       identity_manager()->HasPrimaryAccount(signin::ConsentLevel::kSync));
   EXPECT_FALSE(identity_manager()->HasPrimaryAccount(ConsentLevel::kSync));
-  EXPECT_TRUE(
-      identity_manager()->HasPrimaryAccount(ConsentLevel::kNotRequired));
-  EXPECT_EQ(first_account, identity_manager()->GetPrimaryAccountInfo(
-                               ConsentLevel::kNotRequired));
+  EXPECT_TRUE(identity_manager()->HasPrimaryAccount(ConsentLevel::kSignin));
+  EXPECT_EQ(first_account,
+            identity_manager()->GetPrimaryAccountInfo(ConsentLevel::kSignin));
 
   EXPECT_EQ(2U, observer().events().size());
   event = observer().events()[0];
   EXPECT_EQ(PrimaryAccountChangeEvent::Type::kCleared,
             event.GetEventTypeFor(ConsentLevel::kSync));
   EXPECT_EQ(PrimaryAccountChangeEvent::Type::kNone,
-            event.GetEventTypeFor(ConsentLevel::kNotRequired));
+            event.GetEventTypeFor(ConsentLevel::kSignin));
   EXPECT_EQ(second_account, event.GetPreviousState().primary_account);
   EXPECT_EQ(second_account, event.GetCurrentState().primary_account);
 
@@ -375,7 +365,7 @@
   EXPECT_EQ(PrimaryAccountChangeEvent::Type::kNone,
             event.GetEventTypeFor(ConsentLevel::kSync));
   EXPECT_EQ(PrimaryAccountChangeEvent::Type::kSet,
-            event.GetEventTypeFor(ConsentLevel::kNotRequired));
+            event.GetEventTypeFor(ConsentLevel::kSignin));
   EXPECT_EQ(second_account, event.GetPreviousState().primary_account);
   EXPECT_EQ(first_account, event.GetCurrentState().primary_account);
 }
@@ -390,7 +380,7 @@
   EXPECT_EQ(1U, observer().events().size());
   auto event = observer().events()[0];
   EXPECT_EQ(PrimaryAccountChangeEvent::Type::kCleared,
-            event.GetEventTypeFor(ConsentLevel::kNotRequired));
+            event.GetEventTypeFor(ConsentLevel::kSignin));
   EXPECT_EQ(PrimaryAccountChangeEvent::Type::kCleared,
             event.GetEventTypeFor(ConsentLevel::kSync));
   EXPECT_EQ(account, event.GetPreviousState().primary_account);
diff --git a/chrome/browser/signin/signin_profile_attributes_updater.cc b/chrome/browser/signin/signin_profile_attributes_updater.cc
index 2af891a..51d3624 100644
--- a/chrome/browser/signin/signin_profile_attributes_updater.cc
+++ b/chrome/browser/signin/signin_profile_attributes_updater.cc
@@ -51,8 +51,8 @@
     return;
   }
 
-  CoreAccountInfo account_info = identity_manager_->GetPrimaryAccountInfo(
-      signin::ConsentLevel::kNotRequired);
+  CoreAccountInfo account_info =
+      identity_manager_->GetPrimaryAccountInfo(signin::ConsentLevel::kSignin);
 
   bool clear_profile = account_info.IsEmpty();
 
@@ -65,7 +65,6 @@
   }
 
   if (clear_profile) {
-    entry->SetLocalAuthCredentials(std::string());
     entry->SetAuthInfo(std::string(), std::u16string(),
                        /*is_consented_primary_account=*/false);
     if (!signin_util::IsForceSigninEnabled())
diff --git a/chrome/browser/signin/signin_promo.cc b/chrome/browser/signin/signin_promo.cc
index 7ae725c..007be6c 100644
--- a/chrome/browser/signin/signin_promo.cc
+++ b/chrome/browser/signin/signin_promo.cc
@@ -42,8 +42,8 @@
            static_cast<int>(signin_metrics::AccessPoint::ACCESS_POINT_MAX));
   CHECK_NE(static_cast<int>(access_point),
            static_cast<int>(signin_metrics::AccessPoint::ACCESS_POINT_UNKNOWN));
-  CHECK_LT(static_cast<int>(reason),
-           static_cast<int>(signin_metrics::Reason::REASON_MAX));
+  CHECK_LE(static_cast<int>(reason),
+           static_cast<int>(signin_metrics::Reason::kMaxValue));
   CHECK_NE(static_cast<int>(reason),
            static_cast<int>(signin_metrics::Reason::REASON_UNKNOWN_REASON));
 
@@ -129,23 +129,13 @@
   base::StringToInt(value, &reason);
   if (reason < static_cast<int>(
                    signin_metrics::Reason::REASON_SIGNIN_PRIMARY_ACCOUNT) ||
-      reason >= static_cast<int>(signin_metrics::Reason::REASON_MAX)) {
+      reason > static_cast<int>(signin_metrics::Reason::kMaxValue)) {
     return signin_metrics::Reason::REASON_UNKNOWN_REASON;
   }
 
   return static_cast<signin_metrics::Reason>(reason);
 }
 
-bool IsAutoCloseEnabledInEmbeddedURL(const GURL& url) {
-  std::string value;
-  if (net::GetValueForKeyInQuery(url, kSignInPromoQueryKeyAutoClose, &value)) {
-    int enabled = 0;
-    if (base::StringToInt(value, &enabled) && enabled == 1)
-      return true;
-  }
-  return false;
-}
-
 void RegisterProfilePrefs(
     user_prefs::PrefRegistrySyncable* registry) {
   registry->RegisterIntegerPref(prefs::kDiceSigninUserMenuPromoCount, 0);
diff --git a/chrome/browser/signin/signin_promo.h b/chrome/browser/signin/signin_promo.h
index 9a3fe0c5..ad9551c 100644
--- a/chrome/browser/signin/signin_promo.h
+++ b/chrome/browser/signin/signin_promo.h
@@ -74,9 +74,6 @@
 // Gets the sign in reason from the query portion of the sign in promo URL.
 signin_metrics::Reason GetSigninReasonForEmbeddedPromoURL(const GURL& url);
 
-// Returns true if the auto_close parameter in the given URL is set to true.
-bool IsAutoCloseEnabledInEmbeddedURL(const GURL& url);
-
 // Registers the preferences the Sign In Promo needs.
 void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry);
 
diff --git a/chrome/browser/signin/signin_promo_unittest.cc b/chrome/browser/signin/signin_promo_unittest.cc
index 28c3b9a..7d863f4 100644
--- a/chrome/browser/signin/signin_promo_unittest.cc
+++ b/chrome/browser/signin/signin_promo_unittest.cc
@@ -21,25 +21,25 @@
       GetEmbeddedPromoURL(signin_metrics::AccessPoint::ACCESS_POINT_START_PAGE,
                           signin_metrics::Reason::REASON_SIGNIN_PRIMARY_ACCOUNT,
                           true));
-  replace_query.SetQueryStr("access_point=15&reason=3");
+  replace_query.SetQueryStr("access_point=15&reason=1");
   EXPECT_EQ(
       GURL(chrome::kChromeUIChromeSigninURL).ReplaceComponents(replace_query),
       GetEmbeddedPromoURL(
           signin_metrics::AccessPoint::ACCESS_POINT_SIGNIN_PROMO,
-          signin_metrics::Reason::REASON_UNLOCK, false));
+          signin_metrics::Reason::REASON_ADD_SECONDARY_ACCOUNT, false));
 }
 
 TEST(SigninPromoTest, TestReauthURL) {
   GURL::Replacements replace_query;
   replace_query.SetQueryStr(
-      "access_point=0&reason=3&auto_close=1"
+      "access_point=0&reason=6&auto_close=1"
       "&email=example%40domain.com&validateEmail=1"
       "&readOnlyEmail=1");
   EXPECT_EQ(
       GURL(chrome::kChromeUIChromeSigninURL).ReplaceComponents(replace_query),
       GetEmbeddedReauthURLWithEmail(
           signin_metrics::AccessPoint::ACCESS_POINT_START_PAGE,
-          signin_metrics::Reason::REASON_UNLOCK, "example@domain.com"));
+          signin_metrics::Reason::REASON_FETCH_LST_ONLY, "example@domain.com"));
 }
 #endif  // !BUILDFLAG(IS_CHROMEOS_ASH)
 
diff --git a/chrome/browser/signin/signin_ui_util.cc b/chrome/browser/signin/signin_ui_util.cc
index 3a1ae45..4785638 100644
--- a/chrome/browser/signin/signin_ui_util.cc
+++ b/chrome/browser/signin/signin_ui_util.cc
@@ -297,7 +297,7 @@
 
   // Compute the default account.
   CoreAccountId default_account_id =
-      identity_manager->GetPrimaryAccountId(signin::ConsentLevel::kNotRequired);
+      identity_manager->GetPrimaryAccountId(signin::ConsentLevel::kSignin);
 
   // Fetch account information for each id and make sure that the first account
   // in the list matches the unconsented primary account (if available).
@@ -331,8 +331,8 @@
   DCHECK(profile);
   signin::IdentityManager* identity_manager =
       IdentityManagerFactory::GetForProfile(profile);
-  CoreAccountInfo core_info = identity_manager->GetPrimaryAccountInfo(
-      signin::ConsentLevel::kNotRequired);
+  CoreAccountInfo core_info =
+      identity_manager->GetPrimaryAccountInfo(signin::ConsentLevel::kSignin);
   // If there's no unconsented primary account, simply return the name of the
   // profile according to profile attributes.
   if (core_info.IsEmpty())
diff --git a/chrome/browser/signin/signin_ui_util_unittest.cc b/chrome/browser/signin/signin_ui_util_unittest.cc
index 1fd7a8b..f6abe9f 100644
--- a/chrome/browser/signin/signin_ui_util_unittest.cc
+++ b/chrome/browser/signin/signin_ui_util_unittest.cc
@@ -101,7 +101,8 @@
         signin_metrics::AccessPoint::ACCESS_POINT_MAX;
     signin_metrics::PromoAction signin_promo_action =
         signin_metrics::PromoAction::PROMO_ACTION_NO_SIGNIN_PROMO;
-    signin_metrics::Reason signin_reason = signin_metrics::Reason::REASON_MAX;
+    signin_metrics::Reason signin_reason =
+        signin_metrics::Reason::REASON_UNKNOWN_REASON;
     CoreAccountId account_id;
     DiceTurnSyncOnHelper::SigninAbortedMode signin_aborted_mode =
         DiceTurnSyncOnHelper::SigninAbortedMode::REMOVE_ACCOUNT;
diff --git a/chrome/browser/signin/signin_util_win.cc b/chrome/browser/signin/signin_util_win.cc
index 9f053eb..c524678 100644
--- a/chrome/browser/signin/signin_util_win.cc
+++ b/chrome/browser/signin/signin_util_win.cc
@@ -305,16 +305,6 @@
   return false;
 }
 
-// Chrome doesn't allow signing into current profile if the same user is signed
-// in another profile.
-bool CanSignInToCurrentProfile(const std::string& gaia_id,
-                               const std::string& email,
-                               Profile* profile) {
-  return CanOfferSignin(profile, CAN_OFFER_SIGNIN_FOR_ALL_ACCOUNTS, gaia_id,
-                        email)
-      .IsOk();
-}
-
 void SigninWithCredentialProviderIfPossible(Profile* profile) {
   bool import_only_on_first_run = true;
   bool import_when_primary_account_exists = false;
@@ -327,9 +317,11 @@
   if (cred_provider_gaia_id.empty() || cred_provider_email.empty())
     return;
 
-  if (!CanSignInToCurrentProfile(base::WideToUTF8(cred_provider_gaia_id),
-                                 base::WideToUTF8(cred_provider_email),
-                                 profile) ||
+  // Chrome doesn't allow signing into current profile if the same user is
+  // signed in another profile.
+  if (!CanOfferSignin(profile, base::WideToUTF8(cred_provider_gaia_id),
+                      base::WideToUTF8(cred_provider_email))
+           .IsOk() ||
       IsGCPWUsedInOtherProfile(profile)) {
     return;
   }
diff --git a/chrome/browser/signin/ui/android/java/src/org/chromium/chrome/browser/signin/ui/SigninPromoUtil.java b/chrome/browser/signin/ui/android/java/src/org/chromium/chrome/browser/signin/ui/SigninPromoUtil.java
index 21e41198..65e923809 100644
--- a/chrome/browser/signin/ui/android/java/src/org/chromium/chrome/browser/signin/ui/SigninPromoUtil.java
+++ b/chrome/browser/signin/ui/android/java/src/org/chromium/chrome/browser/signin/ui/SigninPromoUtil.java
@@ -121,7 +121,7 @@
         String signedInAccount = CoreAccountInfo.getEmailFrom(
                 IdentityServicesProvider.get()
                         .getIdentityManager(Profile.getLastUsedRegularProfile())
-                        .getPrimaryAccountInfo(ConsentLevel.NOT_REQUIRED));
+                        .getPrimaryAccountInfo(ConsentLevel.SIGNIN));
         assert signedInAccount != null : "Sync promo should only be shown for a signed in account";
         signinPromoController.setupPromoView(
                 view, profileDataCache.getProfileDataOrDefault(signedInAccount), listener);
diff --git a/chrome/browser/signin/ui/android/java/src/org/chromium/chrome/browser/signin/ui/account_picker/AccountPickerDelegateImpl.java b/chrome/browser/signin/ui/android/java/src/org/chromium/chrome/browser/signin/ui/account_picker/AccountPickerDelegateImpl.java
index 9f527c20..b7cc4c14 100644
--- a/chrome/browser/signin/ui/android/java/src/org/chromium/chrome/browser/signin/ui/account_picker/AccountPickerDelegateImpl.java
+++ b/chrome/browser/signin/ui/android/java/src/org/chromium/chrome/browser/signin/ui/account_picker/AccountPickerDelegateImpl.java
@@ -82,7 +82,7 @@
     @Override
     public void signIn(CoreAccountInfo coreAccountInfo,
             Callback<GoogleServiceAuthError> onSignInErrorCallback) {
-        if (mIdentityManager.getPrimaryAccountInfo(ConsentLevel.NOT_REQUIRED) != null) {
+        if (mIdentityManager.getPrimaryAccountInfo(ConsentLevel.SIGNIN) != null) {
             // In case an error is fired because cookies are taking longer to generate than usual,
             // if user retries the sign-in from the error screen, we need to sign out the user
             // first before signing in again.
diff --git a/chrome/browser/supervised_user/child_accounts/child_account_service.cc b/chrome/browser/supervised_user/child_accounts/child_account_service.cc
index dfde8b52..c29c35b7 100644
--- a/chrome/browser/supervised_user/child_accounts/child_account_service.cc
+++ b/chrome/browser/supervised_user/child_accounts/child_account_service.cc
@@ -105,7 +105,7 @@
   base::Optional<AccountInfo> primary_account_info =
       identity_manager_->FindExtendedAccountInfoForAccountWithRefreshToken(
           identity_manager_->GetPrimaryAccountInfo(
-              signin::ConsentLevel::kNotRequired));
+              signin::ConsentLevel::kSignin));
 
   if (primary_account_info.has_value())
     OnExtendedAccountInfoUpdated(primary_account_info.value());
@@ -248,7 +248,7 @@
 
 void ChildAccountService::OnPrimaryAccountChanged(
     const signin::PrimaryAccountChangeEvent& event_details) {
-  if (event_details.GetEventTypeFor(signin::ConsentLevel::kNotRequired) ==
+  if (event_details.GetEventTypeFor(signin::ConsentLevel::kSignin) ==
       signin::PrimaryAccountChangeEvent::Type::kSet) {
     auto account_info =
         identity_manager_->FindExtendedAccountInfoForAccountWithRefreshToken(
@@ -273,8 +273,8 @@
   }
 
   // This class doesn't care about browser sync consent.
-  CoreAccountId auth_account_id = identity_manager_->GetPrimaryAccountId(
-      signin::ConsentLevel::kNotRequired);
+  CoreAccountId auth_account_id =
+      identity_manager_->GetPrimaryAccountId(signin::ConsentLevel::kSignin);
   if (info.account_id != auth_account_id)
     return;
 
@@ -284,8 +284,8 @@
 void ChildAccountService::OnExtendedAccountInfoRemoved(
     const AccountInfo& info) {
   // This class doesn't care about browser sync consent.
-  if (info.account_id != identity_manager_->GetPrimaryAccountId(
-                             signin::ConsentLevel::kNotRequired))
+  if (info.account_id !=
+      identity_manager_->GetPrimaryAccountId(signin::ConsentLevel::kSignin))
     return;
 
   SetIsChildAccount(false);
diff --git a/chrome/browser/supervised_user/child_accounts/family_info_fetcher.cc b/chrome/browser/supervised_user/child_accounts/family_info_fetcher.cc
index 313c4606..c83a887 100644
--- a/chrome/browser/supervised_user/child_accounts/family_info_fetcher.cc
+++ b/chrome/browser/supervised_user/child_accounts/family_info_fetcher.cc
@@ -89,8 +89,8 @@
     scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory)
     : consumer_(consumer),
       // This feature doesn't care about browser sync consent.
-      primary_account_id_(identity_manager->GetPrimaryAccountId(
-          signin::ConsentLevel::kNotRequired)),
+      primary_account_id_(
+          identity_manager->GetPrimaryAccountId(signin::ConsentLevel::kSignin)),
       identity_manager_(identity_manager),
       url_loader_factory_(std::move(url_loader_factory)),
       access_token_expired_(false) {}
@@ -134,7 +134,7 @@
                          base::Unretained(this)),
           signin::PrimaryAccountAccessTokenFetcher::Mode::kWaitUntilAvailable,
           // This feature doesn't care about browser sync consent.
-          signin::ConsentLevel::kNotRequired);
+          signin::ConsentLevel::kSignin);
 }
 
 void FamilyInfoFetcher::OnAccessTokenFetchComplete(
diff --git a/chrome/browser/supervised_user/child_accounts/family_info_fetcher_unittest.cc b/chrome/browser/supervised_user/child_accounts/family_info_fetcher_unittest.cc
index a7cd79fe..764609d 100644
--- a/chrome/browser/supervised_user/child_accounts/family_info_fetcher_unittest.cc
+++ b/chrome/browser/supervised_user/child_accounts/family_info_fetcher_unittest.cc
@@ -173,7 +173,7 @@
   void WaitForAccessTokenRequestAndIssueToken() {
     identity_test_env_.WaitForAccessTokenRequestIfNecessaryAndRespondWithToken(
         identity_test_env_.identity_manager()->GetPrimaryAccountId(
-            signin::ConsentLevel::kNotRequired),
+            signin::ConsentLevel::kSignin),
         "access_token", base::Time::Now() + base::TimeDelta::FromHours(1));
   }
 
@@ -322,7 +322,7 @@
   EXPECT_CALL(*this, OnFailure(FamilyInfoFetcher::ErrorCode::kTokenError));
   identity_test_env_.WaitForAccessTokenRequestIfNecessaryAndRespondWithError(
       identity_test_env_.identity_manager()->GetPrimaryAccountId(
-          signin::ConsentLevel::kNotRequired),
+          signin::ConsentLevel::kSignin),
       GoogleServiceAuthError(GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS));
 }
 
diff --git a/chrome/browser/supervised_user/child_accounts/permission_request_creator_apiary.cc b/chrome/browser/supervised_user/child_accounts/permission_request_creator_apiary.cc
index e3da8f2..dddb065e 100644
--- a/chrome/browser/supervised_user/child_accounts/permission_request_creator_apiary.cc
+++ b/chrome/browser/supervised_user/child_accounts/permission_request_creator_apiary.cc
@@ -161,7 +161,7 @@
               base::Unretained(this), request),
           signin::PrimaryAccountAccessTokenFetcher::Mode::kImmediate,
           // This class doesn't care about browser sync consent.
-          signin::ConsentLevel::kNotRequired);
+          signin::ConsentLevel::kSignin);
 }
 
 void PermissionRequestCreatorApiary::OnAccessTokenFetchComplete(
@@ -263,8 +263,7 @@
     scopes.insert(GetApiScope());
     // "Unconsented" because this class doesn't care about browser sync consent.
     identity_manager_->RemoveAccessTokenFromCache(
-        identity_manager_->GetPrimaryAccountId(
-            signin::ConsentLevel::kNotRequired),
+        identity_manager_->GetPrimaryAccountId(signin::ConsentLevel::kSignin),
         scopes, request->access_token);
     StartFetching(request);
     return;
diff --git a/chrome/browser/supervised_user/kids_chrome_management/kids_chrome_management_client.cc b/chrome/browser/supervised_user/kids_chrome_management/kids_chrome_management_client.cc
index 0457d7f..59ab846 100644
--- a/chrome/browser/supervised_user/kids_chrome_management/kids_chrome_management_client.cc
+++ b/chrome/browser/supervised_user/kids_chrome_management/kids_chrome_management_client.cc
@@ -230,7 +230,7 @@
               base::Unretained(this), it),
           signin::PrimaryAccountAccessTokenFetcher::Mode::kImmediate,
           // This class doesn't care about browser sync consent.
-          signin::ConsentLevel::kNotRequired);
+          signin::ConsentLevel::kSignin);
 }
 
 void KidsChromeManagementClient::OnAccessTokenFetchComplete(
@@ -302,8 +302,7 @@
       req->access_token_expired = true;
       signin::ScopeSet scopes{req->scope};
       identity_manager_->RemoveAccessTokenFromCache(
-          identity_manager_->GetPrimaryAccountId(
-              signin::ConsentLevel::kNotRequired),
+          identity_manager_->GetPrimaryAccountId(signin::ConsentLevel::kSignin),
           scopes, token_info.token);
       StartFetching(it);
       return;
diff --git a/chrome/browser/supervised_user/supervised_user_google_auth_navigation_throttle.cc b/chrome/browser/supervised_user/supervised_user_google_auth_navigation_throttle.cc
index f407ea5..cc7d471b 100644
--- a/chrome/browser/supervised_user/supervised_user_google_auth_navigation_throttle.cc
+++ b/chrome/browser/supervised_user/supervised_user_google_auth_navigation_throttle.cc
@@ -138,8 +138,8 @@
         Profile::FromBrowserContext(web_contents->GetBrowserContext());
     auto* identity_manager = IdentityManagerFactory::GetForProfile(profile);
     // This class doesn't care about browser sync consent.
-    CoreAccountInfo account_info = identity_manager->GetPrimaryAccountInfo(
-        signin::ConsentLevel::kNotRequired);
+    CoreAccountInfo account_info =
+        identity_manager->GetPrimaryAccountInfo(signin::ConsentLevel::kSignin);
     if (account_info.IsEmpty()) {
       // No primary account (can happen when it was removed from the device).
       return content::NavigationThrottle::DEFER;
diff --git a/chrome/browser/sync/test/integration/migration_test.cc b/chrome/browser/sync/test/integration/migration_test.cc
index 1f28ca0..db0f423 100644
--- a/chrome/browser/sync/test/integration/migration_test.cc
+++ b/chrome/browser/sync/test/integration/migration_test.cc
@@ -316,14 +316,13 @@
 class MigrationTwoClientTest : public MigrationTest {
  public:
   MigrationTwoClientTest() : MigrationTest(TWO_CLIENT) {}
-  ~MigrationTwoClientTest() override {}
+  ~MigrationTwoClientTest() override = default;
 
   // Helper function that verifies that preferences sync still works.
   void VerifyPrefSync() {
     ASSERT_TRUE(BooleanPrefMatches(prefs::kShowHomeButton));
     ChangeBooleanPref(0, prefs::kShowHomeButton);
-    ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
-    ASSERT_TRUE(BooleanPrefMatches(prefs::kShowHomeButton));
+    ASSERT_TRUE(BooleanPrefMatchChecker(prefs::kShowHomeButton).Wait());
   }
 
   void RunTwoClientMigrationTest(const MigrationList& migration_list,
diff --git a/chrome/browser/sync/test/integration/sync_test.cc b/chrome/browser/sync/test/integration/sync_test.cc
index b7fff5d5..fa888fed 100644
--- a/chrome/browser/sync/test/integration/sync_test.cc
+++ b/chrome/browser/sync/test/integration/sync_test.cc
@@ -181,7 +181,7 @@
   signin::IdentityManager* identity_manager =
       IdentityManagerFactory::GetForProfile(profile);
   if (!identity_manager ||
-      !identity_manager->HasPrimaryAccount(signin::ConsentLevel::kNotRequired))
+      !identity_manager->HasPrimaryAccount(signin::ConsentLevel::kSignin))
     return nullptr;
 
   auto it = profile_to_fcm_network_handler_map->find(profile);
diff --git a/chrome/browser/sync/test/integration/two_client_bookmarks_sync_test.cc b/chrome/browser/sync/test/integration/two_client_bookmarks_sync_test.cc
index 77e9cb8..f6837de 100644
--- a/chrome/browser/sync/test/integration/two_client_bookmarks_sync_test.cc
+++ b/chrome/browser/sync/test/integration/two_client_bookmarks_sync_test.cc
@@ -19,7 +19,6 @@
 #include "chrome/browser/sync/test/integration/profile_sync_service_harness.h"
 #include "chrome/browser/sync/test/integration/sync_integration_test_util.h"
 #include "chrome/browser/sync/test/integration/sync_test.h"
-#include "chrome/browser/sync/test/integration/updated_progress_marker_checker.h"
 #include "components/bookmarks/browser/bookmark_model.h"
 #include "components/bookmarks/browser/bookmark_node.h"
 #include "components/policy/core/common/mock_configuration_policy_provider.h"
@@ -41,6 +40,7 @@
 using bookmarks_helper::AddFolder;
 using bookmarks_helper::AddURL;
 using bookmarks_helper::AllModelsMatch;
+using bookmarks_helper::BookmarkModelMatchesFakeServerChecker;
 using bookmarks_helper::BookmarksMatchChecker;
 using bookmarks_helper::BookmarksTitleChecker;
 using bookmarks_helper::CheckFaviconExpired;
@@ -83,6 +83,7 @@
 using testing::IsEmpty;
 using testing::NotNull;
 using testing::SizeIs;
+using testing::UnorderedElementsAreArray;
 
 using BookmarkNodeMatcher = testing::Matcher<std::unique_ptr<BookmarkNode>>;
 
@@ -112,7 +113,8 @@
 
   GURL google_url("http://www.google.com");
   ASSERT_NE(nullptr, AddURL(0, "Google", google_url));
-  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
+  ASSERT_TRUE(BookmarksMatchChecker().Wait());
+
   ASSERT_NE(nullptr, AddURL(1, "Yahoo", GURL("http://www.yahoo.com")));
   ASSERT_TRUE(BookmarksMatchChecker().Wait());
 
@@ -137,15 +139,14 @@
 
 IN_PROC_BROWSER_TEST_F(TwoClientBookmarksSyncTest, SimultaneousURLChanges) {
   ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
-  ASSERT_TRUE(BookmarksMatchChecker().Wait());
 
-  GURL initial_url("http://www.google.com");
-  GURL second_url("http://www.google.com/abc");
-  GURL third_url("http://www.google.com/def");
-  std::string title = "Google";
+  const GURL initial_url("http://www.google.com");
+  const GURL second_url("http://www.google.com/abc");
+  const GURL third_url("http://www.google.com/def");
+  const std::string title = "Google";
 
   ASSERT_NE(nullptr, AddURL(0, title, initial_url));
-  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
+  ASSERT_TRUE(BookmarksMatchChecker().Wait());
 
   ASSERT_NE(nullptr, SetURL(0, GetUniqueNodeByURL(0, initial_url), second_url));
   ASSERT_NE(nullptr, SetURL(1, GetUniqueNodeByURL(1, initial_url), third_url));
@@ -200,7 +201,8 @@
 
   const BookmarkNode* bookmark = AddURL(0, kGenericURLTitle, page_url);
   ASSERT_NE(nullptr, bookmark);
-  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
+  ASSERT_TRUE(BookmarksMatchChecker().Wait());
+
   SetFavicon(0, bookmark, icon_url, favicon, bookmarks_helper::FROM_UI);
   EXPECT_TRUE(BookmarksMatchChecker().Wait());
 
@@ -233,7 +235,7 @@
 
   const BookmarkNode* bookmark0 = AddURL(0, kGenericURLTitle, page_url);
   ASSERT_NE(nullptr, bookmark0);
-  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
+  ASSERT_TRUE(BookmarksMatchChecker().Wait());
 
   gfx::Image favicon = CreateFavicon(SK_ColorWHITE);
   SetFavicon(0, bookmark0, icon_url1, favicon, bookmarks_helper::FROM_UI);
@@ -1194,7 +1196,6 @@
     matchers_in_folder.push_back(matchers[2]);
     matchers.erase(matchers.begin() + 2);
 
-    ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
     ASSERT_TRUE(BookmarksMatchChecker().Wait());
 
     EXPECT_THAT(GetBookmarkBarNode(1)->children(), ElementsAreArray(matchers));
@@ -1238,7 +1239,6 @@
     matchers.back() = IsFolderWithTitleAndChildren(
         kGenericFolderName, ElementsAreArray(matchers_in_folder));
 
-    ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
     ASSERT_TRUE(BookmarksMatchChecker().Wait());
     EXPECT_THAT(GetBookmarkBarNode(1)->children(), ElementsAreArray(matchers));
   }
@@ -2163,12 +2163,10 @@
 
 IN_PROC_BROWSER_TEST_F(TwoClientBookmarksSyncTest, DisableBookmarks) {
   ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
-  ASSERT_TRUE(BookmarksMatchChecker().Wait());
 
   ASSERT_TRUE(
       GetClient(1)->DisableSyncForType(syncer::UserSelectableType::kBookmarks));
   ASSERT_NE(nullptr, AddFolder(1, kGenericFolderName));
-  ASSERT_TRUE(AwaitQuiescence());
   ASSERT_FALSE(AllModelsMatch());
 
   ASSERT_TRUE(
@@ -2178,11 +2176,12 @@
 
 IN_PROC_BROWSER_TEST_F(TwoClientBookmarksSyncTest, DisableSync) {
   ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
-  ASSERT_TRUE(BookmarksMatchChecker().Wait());
 
   ASSERT_TRUE(GetClient(1)->DisableSyncForAllDatatypes());
   ASSERT_NE(nullptr, AddFolder(0, IndexedFolderName(0)));
-  ASSERT_TRUE(UpdatedProgressMarkerChecker(GetSyncService(0)).Wait());
+  ASSERT_TRUE(BookmarkModelMatchesFakeServerChecker(0, GetSyncService(0),
+                                                    GetFakeServer())
+                  .Wait());
   ASSERT_FALSE(AllModelsMatch());
 
   ASSERT_NE(nullptr, AddFolder(1, IndexedFolderName(1)));
@@ -2210,7 +2209,6 @@
   }
 
   ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
-  ASSERT_TRUE(BookmarksMatchChecker().Wait());
   ASSERT_FALSE(ContainsDuplicateBookmarks(0));
 }
 
@@ -2225,7 +2223,9 @@
   ASSERT_NE(nullptr, AddURL(0, GetBookmarkBarNode(0), 0, "bar", bar_url));
   ASSERT_NE(nullptr, AddURL(0, GetOtherNode(0), 0, "other", other_url));
 
-  ASSERT_TRUE(UpdatedProgressMarkerChecker(GetSyncService(0)).Wait());
+  ASSERT_TRUE(BookmarkModelMatchesFakeServerChecker(0, GetSyncService(0),
+                                                    GetFakeServer())
+                  .Wait());
 
   ASSERT_TRUE(HasNodeWithURL(0, bar_url));
   ASSERT_TRUE(HasNodeWithURL(0, other_url));
@@ -2233,14 +2233,16 @@
   ASSERT_FALSE(HasNodeWithURL(1, other_url));
 
   Remove(0, GetBookmarkBarNode(0), 0);
-  ASSERT_TRUE(UpdatedProgressMarkerChecker(GetSyncService(0)).Wait());
+  ASSERT_TRUE(BookmarkModelMatchesFakeServerChecker(0, GetSyncService(0),
+                                                    GetFakeServer())
+                  .Wait());
 
   ASSERT_FALSE(HasNodeWithURL(0, bar_url));
   ASSERT_TRUE(HasNodeWithURL(0, other_url));
 
   ASSERT_TRUE(
       GetClient(1)->EnableSyncForType(syncer::UserSelectableType::kBookmarks));
-  ASSERT_TRUE(AwaitQuiescence());
+  ASSERT_TRUE(BookmarksMatchChecker().Wait());
 
   ASSERT_FALSE(HasNodeWithURL(0, bar_url));
   ASSERT_TRUE(HasNodeWithURL(0, other_url));
@@ -2419,16 +2421,16 @@
 // order is).
 IN_PROC_BROWSER_TEST_F(TwoClientBookmarksSyncTest, RacyPositionChanges) {
   ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
-  ASSERT_TRUE(BookmarksMatchChecker().Wait());
 
   // Add initial bookmarks.
-  size_t num_bookmarks = 5;
+  const size_t num_bookmarks = 5;
+  std::vector<BookmarkNodeMatcher> matchers;
   for (size_t i = 0; i < num_bookmarks; ++i) {
     ASSERT_NE(nullptr, AddURL(0, i, IndexedURLTitle(i), GURL(IndexedURL(i))));
+    matchers.push_back(
+        IsUrlBookmarkWithTitleAndUrl(IndexedURLTitle(i), GURL(IndexedURL(i))));
   }
 
-  // Once we make diverging changes the verifer is helpless.
-  ASSERT_TRUE(AwaitQuiescence());
   ASSERT_TRUE(BookmarksMatchChecker().Wait());
 
   // Make changes on client 0.
@@ -2469,7 +2471,9 @@
     Move(0, node, node->parent(), rand_pos);
   }
 
-  ASSERT_TRUE(BookmarksMatchChecker().Wait());
+  EXPECT_TRUE(BookmarksMatchChecker().Wait());
+  EXPECT_THAT(GetBookmarkBarNode(0)->children(),
+              UnorderedElementsAreArray(matchers));
 }
 
 // Trigger the server side creation of Synced Bookmarks. Ensure both clients
@@ -2543,12 +2547,11 @@
 
   // Remove all
   RemoveAll(0);
+  ASSERT_TRUE(BookmarksMatchChecker().Wait());
 
-  ASSERT_TRUE(GetClient(0)->AwaitMutualSyncCycleCompletion(GetClient(1)));
   // Verify other node has no children now.
-  EXPECT_TRUE(GetOtherNode(0)->children().empty());
-  EXPECT_TRUE(GetBookmarkBarNode(0)->children().empty());
-  ASSERT_TRUE(AllModelsMatch());
+  EXPECT_TRUE(GetOtherNode(1)->children().empty());
+  EXPECT_TRUE(GetBookmarkBarNode(1)->children().empty());
 }
 
 // Verifies that managed bookmarks (installed by policy) don't get synced.
diff --git a/chrome/browser/ui/ash/ambient/ambient_client_impl.cc b/chrome/browser/ui/ash/ambient/ambient_client_impl.cc
index 29b97b2..ceb7ff4 100644
--- a/chrome/browser/ui/ash/ambient/ambient_client_impl.cc
+++ b/chrome/browser/ui/ash/ambient/ambient_client_impl.cc
@@ -61,8 +61,7 @@
   if (!identity_manager)
     return false;
 
-  return identity_manager->HasPrimaryAccount(
-      signin::ConsentLevel::kNotRequired);
+  return identity_manager->HasPrimaryAccount(signin::ConsentLevel::kSignin);
 }
 
 bool IsEmailDomainSupported(const user_manager::User* user) {
@@ -120,8 +119,8 @@
       IdentityManagerFactory::GetForProfile(profile);
   DCHECK(identity_manager);
 
-  CoreAccountInfo account_info = identity_manager->GetPrimaryAccountInfo(
-      signin::ConsentLevel::kNotRequired);
+  CoreAccountInfo account_info =
+      identity_manager->GetPrimaryAccountInfo(signin::ConsentLevel::kSignin);
   const signin::ScopeSet scopes{kPhotosOAuthScope, kBackdropOAuthScope};
   // TODO(b/148463064): Handle retry refresh token and multiple requests.
   // Currently only one request is allowed.
diff --git a/chrome/browser/ui/ash/ambient/ambient_client_impl_unittest.cc b/chrome/browser/ui/ash/ambient/ambient_client_impl_unittest.cc
index fb94be9..de1b6e1e 100644
--- a/chrome/browser/ui/ash/ambient/ambient_client_impl_unittest.cc
+++ b/chrome/browser/ui/ash/ambient/ambient_client_impl_unittest.cc
@@ -73,7 +73,7 @@
 
   void MaybeMakeAccountAsPrimaryAccount(const AccountId& account_id) {
     if (!identity_test_env()->identity_manager()->HasPrimaryAccount(
-            signin::ConsentLevel::kNotRequired)) {
+            signin::ConsentLevel::kSignin)) {
       identity_test_env()->MakeUnconsentedPrimaryAccountAvailable(
           account_id.GetUserEmail());
     }
diff --git a/chrome/browser/ui/ash/quick_answers/quick_answers_browser_client_impl.cc b/chrome/browser/ui/ash/quick_answers/quick_answers_browser_client_impl.cc
index 1df6d09..dbd3f89 100644
--- a/chrome/browser/ui/ash/quick_answers/quick_answers_browser_client_impl.cc
+++ b/chrome/browser/ui/ash/quick_answers/quick_answers_browser_client_impl.cc
@@ -64,8 +64,8 @@
       IdentityManagerFactory::GetForProfile(profile);
   DCHECK(identity_manager);
 
-  CoreAccountInfo account_info = identity_manager->GetPrimaryAccountInfo(
-      signin::ConsentLevel::kNotRequired);
+  CoreAccountInfo account_info =
+      identity_manager->GetPrimaryAccountInfo(signin::ConsentLevel::kSignin);
 
   const signin::ScopeSet scopes{kCloudTranslationScope};
   DCHECK(!access_token_fetcher_);
diff --git a/chrome/browser/ui/autofill/chrome_autofill_client.cc b/chrome/browser/ui/autofill/chrome_autofill_client.cc
index c6637d73..81c0f91 100644
--- a/chrome/browser/ui/autofill/chrome_autofill_client.cc
+++ b/chrome/browser/ui/autofill/chrome_autofill_client.cc
@@ -824,7 +824,7 @@
   signin::IdentityManager* identity_manager =
       IdentityManagerFactory::GetForProfile(GetProfile());
   CoreAccountId account_id =
-      identity_manager->GetPrimaryAccountId(signin::ConsentLevel::kNotRequired);
+      identity_manager->GetPrimaryAccountId(signin::ConsentLevel::kSignin);
   return identity_manager
       ->FindExtendedAccountInfoForAccountWithRefreshTokenByAccountId(
           account_id);
diff --git a/chrome/browser/ui/chrome_pages.cc b/chrome/browser/ui/chrome_pages.cc
index 5b3ee8b6..a20362b 100644
--- a/chrome/browser/ui/chrome_pages.cc
+++ b/chrome/browser/ui/chrome_pages.cc
@@ -500,7 +500,7 @@
       case signin::ConsentLevel::kSync:
         bubble_view_mode = profiles::BUBBLE_VIEW_MODE_GAIA_SIGNIN;
         break;
-      case signin::ConsentLevel::kNotRequired:
+      case signin::ConsentLevel::kSignin:
         bubble_view_mode = profiles::BUBBLE_VIEW_MODE_GAIA_ADD_ACCOUNT;
         break;
     }
diff --git a/chrome/browser/ui/passwords/account_storage_auth_helper.cc b/chrome/browser/ui/passwords/account_storage_auth_helper.cc
index f2e62c1..79b8d36 100644
--- a/chrome/browser/ui/passwords/account_storage_auth_helper.cc
+++ b/chrome/browser/ui/passwords/account_storage_auth_helper.cc
@@ -56,7 +56,7 @@
     return;
   }
   CoreAccountId primary_account_id =
-      identity_manager->GetPrimaryAccountId(signin::ConsentLevel::kNotRequired);
+      identity_manager->GetPrimaryAccountId(signin::ConsentLevel::kSignin);
   if (primary_account_id.empty()) {
     std::move(reauth_callback).Run(ReauthSucceeded(false));
     return;
diff --git a/chrome/browser/ui/passwords/bubble_controllers/move_to_account_store_bubble_controller.cc b/chrome/browser/ui/passwords/bubble_controllers/move_to_account_store_bubble_controller.cc
index af8a14e..078c559 100644
--- a/chrome/browser/ui/passwords/bubble_controllers/move_to_account_store_bubble_controller.cc
+++ b/chrome/browser/ui/passwords/bubble_controllers/move_to_account_store_bubble_controller.cc
@@ -88,7 +88,7 @@
   base::Optional<AccountInfo> primary_account_info =
       identity_manager->FindExtendedAccountInfoForAccountWithRefreshToken(
           identity_manager->GetPrimaryAccountInfo(
-              signin::ConsentLevel::kNotRequired));
+              signin::ConsentLevel::kSignin));
   DCHECK(primary_account_info.has_value());
 
   gfx::Image account_icon = primary_account_info->account_image;
diff --git a/chrome/browser/ui/passwords/bubble_controllers/save_update_with_account_store_bubble_controller.cc b/chrome/browser/ui/passwords/bubble_controllers/save_update_with_account_store_bubble_controller.cc
index 046d452e..6f0b039 100644
--- a/chrome/browser/ui/passwords/bubble_controllers/save_update_with_account_store_bubble_controller.cc
+++ b/chrome/browser/ui/passwords/bubble_controllers/save_update_with_account_store_bubble_controller.cc
@@ -269,8 +269,7 @@
       IdentityManagerFactory::GetForProfile(profile);
   if (!identity_manager)
     return std::string();
-  return identity_manager
-      ->GetPrimaryAccountInfo(signin::ConsentLevel::kNotRequired)
+  return identity_manager->GetPrimaryAccountInfo(signin::ConsentLevel::kSignin)
       .email;
 }
 
@@ -287,7 +286,7 @@
   base::Optional<AccountInfo> primary_account_info =
       identity_manager->FindExtendedAccountInfoForAccountWithRefreshToken(
           identity_manager->GetPrimaryAccountInfo(
-              signin::ConsentLevel::kNotRequired));
+              signin::ConsentLevel::kSignin));
   DCHECK(primary_account_info.has_value());
   gfx::Image account_icon = primary_account_info->account_image;
   if (account_icon.IsEmpty()) {
diff --git a/chrome/browser/ui/profile_picker.h b/chrome/browser/ui/profile_picker.h
index 56c849a..65f7c6c9 100644
--- a/chrome/browser/ui/profile_picker.h
+++ b/chrome/browser/ui/profile_picker.h
@@ -172,19 +172,6 @@
   static constexpr int kDialogHeight = 512;
   static constexpr int kDialogWidth = 448;
 
-  // Shows a dialog where the user can re-authenticate the profile with the
-  // given |email|. This is called from the profile picker when a profile is
-  // locked and the user's password is detected to have been changed.
-  static void ShowUnlockDialog(content::BrowserContext* browser_context,
-                               const std::string& email);
-
-  // Shows a reauth dialog with profile path so that the sign in error message
-  // can be displayed without browser window.
-  static void ShowUnlockDialogWithProfilePath(
-      content::BrowserContext* browser_context,
-      const std::string& email,
-      const base::FilePath& profile_path);
-
   // Shows a dialog where the user logs into their profile for the first time
   // via the profile picker, when force signin is enabled.
   static void ShowForceSigninDialog(content::BrowserContext* browser_context,
diff --git a/chrome/browser/ui/signin_view_controller.cc b/chrome/browser/ui/signin_view_controller.cc
index ef457b1f..1659324 100644
--- a/chrome/browser/ui/signin_view_controller.cc
+++ b/chrome/browser/ui/signin_view_controller.cc
@@ -205,7 +205,7 @@
   // For now, Reauth is restricted to the primary account only.
   // TODO(crbug.com/1083429): add support for secondary accounts.
   CoreAccountId primary_account_id =
-      identity_manager->GetPrimaryAccountId(signin::ConsentLevel::kNotRequired);
+      identity_manager->GetPrimaryAccountId(signin::ConsentLevel::kSignin);
 
   if (account_id != primary_account_id) {
     signin_ui_util::RecordTransactionalReauthResult(
diff --git a/chrome/browser/ui/startup/startup_browser_creator_corrupt_profiles_browsertest_win.cc b/chrome/browser/ui/startup/startup_browser_creator_corrupt_profiles_browsertest_win.cc
index ff075e383..61149c9b 100644
--- a/chrome/browser/ui/startup/startup_browser_creator_corrupt_profiles_browsertest_win.cc
+++ b/chrome/browser/ui/startup/startup_browser_creator_corrupt_profiles_browsertest_win.cc
@@ -374,18 +374,6 @@
   ADD_FAILURE() << "Test body is not expected to run.";
 }
 
-// DoNotStartLockedProfile : Profiles that are locked should never be
-// initialized. Since there are no unlocked profiles, the browser should not
-// start.
-IN_PROC_BROWSER_TEST_P(StartupBrowserCreatorCorruptProfileTest,
-                       PRE_DoNotStartLockedProfile) {
-  // Lock the default profile. The user manager is shown after the profile is
-  // locked.
-  signin_util::SetForceSigninForTesting(true);
-  profiles::LockProfile(browser()->profile());
-  ExpectUserManagerToShow();
-}
-
 bool StartupBrowserCreatorCorruptProfileTest::
     SetUpUserDataDirectoryForDoNotStartLockedProfile() {
   SetExpectTestBodyToRun(false);
diff --git a/chrome/browser/ui/views/profiles/avatar_toolbar_button_delegate.cc b/chrome/browser/ui/views/profiles/avatar_toolbar_button_delegate.cc
index ee9cf742..bc72ec4 100644
--- a/chrome/browser/ui/views/profiles/avatar_toolbar_button_delegate.cc
+++ b/chrome/browser/ui/views/profiles/avatar_toolbar_button_delegate.cc
@@ -146,12 +146,12 @@
   signin::IdentityManager* identity_manager =
       IdentityManagerFactory::GetForProfile(profile_);
   if (identity_manager &&
-      identity_manager->HasPrimaryAccount(signin::ConsentLevel::kNotRequired)) {
+      identity_manager->HasPrimaryAccount(signin::ConsentLevel::kSignin)) {
     base::Optional<AccountInfo> account_info =
         identity_manager
             ->FindExtendedAccountInfoForAccountWithRefreshTokenByAccountId(
                 identity_manager->GetPrimaryAccountId(
-                    signin::ConsentLevel::kNotRequired));
+                    signin::ConsentLevel::kSignin));
     if (account_info.has_value())
       return account_info->account_image;
   }
@@ -184,8 +184,7 @@
       IdentityManagerFactory::GetForProfile(profile_);
   ProfileAttributesEntry* entry = GetProfileAttributesEntry(profile_);
   if (!entry ||  // This can happen if the user deletes the current profile.
-      (!identity_manager->HasPrimaryAccount(
-           signin::ConsentLevel::kNotRequired) &&
+      (!identity_manager->HasPrimaryAccount(signin::ConsentLevel::kSignin) &&
        IsGenericProfile(*entry))) {
     return AvatarToolbarButton::State::kGenericProfile;
   }
@@ -250,7 +249,7 @@
   // Check that the user is still signed in. See https://crbug.com/1025674
   CoreAccountInfo user_identity =
       IdentityManagerFactory::GetForProfile(profile_)->GetPrimaryAccountInfo(
-          signin::ConsentLevel::kNotRequired);
+          signin::ConsentLevel::kSignin);
   if (user_identity.IsEmpty()) {
     identity_animation_state_ = IdentityAnimationState::kNotShowing;
     return;
@@ -326,7 +325,7 @@
 
 void AvatarToolbarButtonDelegate::OnPrimaryAccountChanged(
     const signin::PrimaryAccountChangeEvent& event) {
-  if (event.GetEventTypeFor(signin::ConsentLevel::kNotRequired) !=
+  if (event.GetEventTypeFor(signin::ConsentLevel::kSignin) !=
       signin::PrimaryAccountChangeEvent::Type::kSet) {
     return;
   }
@@ -351,7 +350,7 @@
   }
   CoreAccountInfo account =
       IdentityManagerFactory::GetForProfile(profile_)->GetPrimaryAccountInfo(
-          signin::ConsentLevel::kNotRequired);
+          signin::ConsentLevel::kSignin);
   if (account.IsEmpty())
     return;
   OnUserIdentityChanged();
@@ -390,7 +389,7 @@
     CoreAccountId account_id) {
   CoreAccountInfo user_identity =
       IdentityManagerFactory::GetForProfile(profile_)->GetPrimaryAccountInfo(
-          signin::ConsentLevel::kNotRequired);
+          signin::ConsentLevel::kSignin);
   // If another account is signed-in then the one that initiated this animation,
   // don't hide it. There's one more pending OnIdentityAnimationTimeout() that
   // will properly hide it after the proper delay.
diff --git a/chrome/browser/ui/views/profiles/profile_menu_view.cc b/chrome/browser/ui/views/profiles/profile_menu_view.cc
index 55f8a7cc..18fb6f13 100644
--- a/chrome/browser/ui/views/profiles/profile_menu_view.cc
+++ b/chrome/browser/ui/views/profiles/profile_menu_view.cc
@@ -284,12 +284,11 @@
   Profile* profile = browser()->profile();
   signin::IdentityManager* identity_manager =
       IdentityManagerFactory::GetForProfile(profile);
-  DCHECK(
-      identity_manager->HasPrimaryAccount(signin::ConsentLevel::kNotRequired));
+  DCHECK(identity_manager->HasPrimaryAccount(signin::ConsentLevel::kSignin));
   NavigateToGoogleAccountPage(
-      profile, identity_manager
-                   ->GetPrimaryAccountInfo(signin::ConsentLevel::kNotRequired)
-                   .email);
+      profile,
+      identity_manager->GetPrimaryAccountInfo(signin::ConsentLevel::kSignin)
+          .email);
 }
 
 void ProfileMenuView::OnPasswordsButtonClicked() {
@@ -475,8 +474,8 @@
   Profile* profile = browser()->profile();
   signin::IdentityManager* identity_manager =
       IdentityManagerFactory::GetForProfile(profile);
-  CoreAccountInfo account = identity_manager->GetPrimaryAccountInfo(
-      signin::ConsentLevel::kNotRequired);
+  CoreAccountInfo account =
+      identity_manager->GetPrimaryAccountInfo(signin::ConsentLevel::kSignin);
   base::Optional<AccountInfo> account_info =
       identity_manager->FindExtendedAccountInfoForAccountWithRefreshToken(
           account);
@@ -594,8 +593,8 @@
   }
 
   // Show sync promos.
-  CoreAccountInfo unconsented_account = identity_manager->GetPrimaryAccountInfo(
-      signin::ConsentLevel::kNotRequired);
+  CoreAccountInfo unconsented_account =
+      identity_manager->GetPrimaryAccountInfo(signin::ConsentLevel::kSignin);
   base::Optional<AccountInfo> account_info =
       identity_manager->FindExtendedAccountInfoForAccountWithRefreshToken(
           unconsented_account);
@@ -627,7 +626,7 @@
       IdentityManagerFactory::GetForProfile(profile);
   const bool has_unconsented_account =
       !IsGuest(profile) &&
-      identity_manager->HasPrimaryAccount(signin::ConsentLevel::kNotRequired);
+      identity_manager->HasPrimaryAccount(signin::ConsentLevel::kSignin);
 
   if (has_unconsented_account && !IsSyncPaused(profile)) {
 #if BUILDFLAG(GOOGLE_CHROME_BRANDING)
diff --git a/chrome/browser/ui/views/profiles/profile_menu_view_browsertest.cc b/chrome/browser/ui/views/profiles/profile_menu_view_browsertest.cc
index c5a6f2b..215a46b 100644
--- a/chrome/browser/ui/views/profiles/profile_menu_view_browsertest.cc
+++ b/chrome/browser/ui/views/profiles/profile_menu_view_browsertest.cc
@@ -88,8 +88,7 @@
   // StatusChangeChecker overrides:
   bool IsExitConditionSatisfied(std::ostream* os) override {
     *os << "Waiting for unconsented primary account";
-    return identity_manager_->HasPrimaryAccount(
-        signin::ConsentLevel::kNotRequired);
+    return identity_manager_->HasPrimaryAccount(signin::ConsentLevel::kSignin);
   }
 
   // signin::IdentityManager::Observer overrides:
@@ -789,8 +788,8 @@
   // Check that the setup was successful.
   ASSERT_FALSE(
       identity_manager()->HasPrimaryAccount(signin::ConsentLevel::kSync));
-  ASSERT_TRUE(identity_manager()->HasPrimaryAccount(
-      signin::ConsentLevel::kNotRequired));
+  ASSERT_TRUE(
+      identity_manager()->HasPrimaryAccount(signin::ConsentLevel::kSignin));
 
   RunTest();
 }
diff --git a/chrome/browser/ui/views/profiles/profile_picker_view.cc b/chrome/browser/ui/views/profiles/profile_picker_view.cc
index 65f773f3..47401a4 100644
--- a/chrome/browser/ui/views/profiles/profile_picker_view.cc
+++ b/chrome/browser/ui/views/profiles/profile_picker_view.cc
@@ -391,30 +391,6 @@
 // -------------------------------------------------------------
 
 // static
-void ProfilePickerForceSigninDialog::ShowUnlockDialog(
-    content::BrowserContext* browser_context,
-    const std::string& email) {
-  ShowUnlockDialogWithProfilePath(browser_context, email, base::FilePath());
-}
-
-// static
-void ProfilePickerForceSigninDialog::ShowUnlockDialogWithProfilePath(
-    content::BrowserContext* browser_context,
-    const std::string& email,
-    const base::FilePath& profile_path) {
-  // This method should only be called if the profile picker is already showing.
-  if (!ProfilePicker::IsActive())
-    return;
-  // Load the re-auth URL, prepopulated with the user's email address.
-  // Add the index of the profile to the URL so that the inline login page
-  // knows which profile to load and update the credentials.
-  GURL url = signin::GetEmbeddedReauthURLWithEmail(
-      signin_metrics::AccessPoint::ACCESS_POINT_USER_MANAGER,
-      signin_metrics::Reason::REASON_UNLOCK, email);
-  ProfilePicker::ShowDialog(browser_context, url, profile_path);
-}
-
-// static
 void ProfilePickerForceSigninDialog::ShowForceSigninDialog(
     content::BrowserContext* browser_context,
     const base::FilePath& profile_path) {
diff --git a/chrome/browser/ui/views/sync/inline_login_ui_browsertest.cc b/chrome/browser/ui/views/sync/inline_login_ui_browsertest.cc
index 737639d..76ea153a 100644
--- a/chrome/browser/ui/views/sync/inline_login_ui_browsertest.cc
+++ b/chrome/browser/ui/views/sync/inline_login_ui_browsertest.cc
@@ -338,17 +338,14 @@
 }
 
 IN_PROC_BROWSER_TEST_F(InlineLoginUIBrowserTest, CanOfferNoProfile) {
-  SigninUIError error = CanOfferSignin(
-      nullptr, CAN_OFFER_SIGNIN_FOR_ALL_ACCOUNTS, "12345", "user@gmail.com");
+  SigninUIError error = CanOfferSignin(nullptr, "12345", "user@gmail.com");
   EXPECT_FALSE(error.IsOk());
   EXPECT_EQ(error, SigninUIError::Other("user@gmail.com"));
 }
 
 IN_PROC_BROWSER_TEST_F(InlineLoginUIBrowserTest, CanOffer) {
-  EXPECT_TRUE(CanOfferSignin(browser()->profile(),
-                             CAN_OFFER_SIGNIN_FOR_ALL_ACCOUNTS, "12345",
-                             "user@gmail.com")
-                  .IsOk());
+  EXPECT_TRUE(
+      CanOfferSignin(browser()->profile(), "12345", "user@gmail.com").IsOk());
 }
 
 IN_PROC_BROWSER_TEST_F(InlineLoginUIBrowserTest, CanOfferProfileConnected) {
@@ -357,16 +354,11 @@
   signin::MakePrimaryAccountAvailable(identity_manager, "foo@gmail.com");
   EnableSigninAllowed(true);
 
-  EXPECT_TRUE(CanOfferSignin(browser()->profile(),
-                             CAN_OFFER_SIGNIN_FOR_ALL_ACCOUNTS, "12345",
-                             "foo@gmail.com")
-                  .IsOk());
-  EXPECT_TRUE(CanOfferSignin(browser()->profile(),
-                             CAN_OFFER_SIGNIN_FOR_ALL_ACCOUNTS, "12345", "foo")
-                  .IsOk());
+  EXPECT_TRUE(
+      CanOfferSignin(browser()->profile(), "12345", "foo@gmail.com").IsOk());
+  EXPECT_TRUE(CanOfferSignin(browser()->profile(), "12345", "foo").IsOk());
   SigninUIError error =
-      CanOfferSignin(browser()->profile(), CAN_OFFER_SIGNIN_FOR_ALL_ACCOUNTS,
-                     "12345", "user@gmail.com");
+      CanOfferSignin(browser()->profile(), "12345", "user@gmail.com");
   EXPECT_FALSE(error.IsOk());
   EXPECT_EQ(error, SigninUIError::WrongReauthAccount("user@gmail.com",
                                                      "foo@gmail.com"));
@@ -376,8 +368,7 @@
   SetAllowedUsernamePattern("*.google.com");
 
   SigninUIError error =
-      CanOfferSignin(browser()->profile(), CAN_OFFER_SIGNIN_FOR_ALL_ACCOUNTS,
-                     "12345", "foo@gmail.com");
+      CanOfferSignin(browser()->profile(), "12345", "foo@gmail.com");
   EXPECT_FALSE(error.IsOk());
   EXPECT_EQ(error, SigninUIError::UsernameNotAllowedByPatternFromPrefs(
                        "foo@gmail.com"));
@@ -389,14 +380,10 @@
   AddEmailToOneClickRejectedList("foo@gmail.com");
   AddEmailToOneClickRejectedList("user@gmail.com");
 
-  EXPECT_TRUE(CanOfferSignin(browser()->profile(),
-                             CAN_OFFER_SIGNIN_FOR_ALL_ACCOUNTS, "12345",
-                             "foo@gmail.com")
-                  .IsOk());
-  EXPECT_TRUE(CanOfferSignin(browser()->profile(),
-                             CAN_OFFER_SIGNIN_FOR_ALL_ACCOUNTS, "12345",
-                             "user@gmail.com")
-                  .IsOk());
+  EXPECT_TRUE(
+      CanOfferSignin(browser()->profile(), "12345", "foo@gmail.com").IsOk());
+  EXPECT_TRUE(
+      CanOfferSignin(browser()->profile(), "12345", "user@gmail.com").IsOk());
 }
 
 IN_PROC_BROWSER_TEST_F(InlineLoginUIBrowserTest, CanOfferNoSigninCookies) {
@@ -404,8 +391,7 @@
   EnableSigninAllowed(true);
 
   SigninUIError error =
-      CanOfferSignin(browser()->profile(), CAN_OFFER_SIGNIN_FOR_ALL_ACCOUNTS,
-                     "12345", "user@gmail.com");
+      CanOfferSignin(browser()->profile(), "12345", "user@gmail.com");
   EXPECT_FALSE(error.IsOk());
   EXPECT_EQ(error, SigninUIError::Other("user@gmail.com"));
 }
@@ -675,32 +661,6 @@
   SimulateOnClientOAuthSuccess(helper, "refresh_token");
 }
 
-// Test signin helper does not create sync starter when reauthenticating.
-IN_PROC_BROWSER_TEST_F(InlineLoginHelperBrowserTest,
-                       ReauthCallsUpdateCredentials) {
-  ASSERT_EQ(0ul, identity_manager()->GetAccountsWithRefreshTokens().size());
-
-  std::string email = "foo@gmail.com";
-  signin::SetPrimaryAccount(identity_manager(), email);
-
-  InlineLoginHandlerImpl handler;
-  // See Source enum in components/signin/public/base/signin_metrics.h for
-  // possible values of access_point=, reason=.
-  GURL url("chrome://chrome-signin/?access_point=3&reason=3");
-  // InlineSigninHelper will delete itself when done using
-  // base::ThreadTaskRunnerHandle::DeleteSoon(), so need to delete here.  But
-  // do need the RunUntilIdle() at the end.
-  InlineSigninHelper* helper = new InlineSigninHelper(
-      handler.GetWeakPtr(), test_shared_loader_factory(), profile(),
-      Profile::CreateStatus::CREATE_STATUS_INITIALIZED, url, email,
-      signin::GetTestGaiaIdForEmail(email), "password", "auth_code",
-      /*signin_scoped_device_id=*/std::string(),
-      /*confirm_untrusted_signin=*/false,
-      /*is_force_sign_in_with_usermanager=*/false);
-  SimulateOnClientOAuthSuccess(helper, "refresh_token");
-  ASSERT_EQ(1ul, identity_manager()->GetAccountsWithRefreshTokens().size());
-}
-
 IN_PROC_BROWSER_TEST_F(InlineLoginHelperBrowserTest,
                        ForceSigninWithUserManager) {
   InlineLoginHandlerImpl handler;
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 9d789f65..5f60d36 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
@@ -100,8 +100,7 @@
 
   oauth2_access_token_fetcher_ =
       identity_manager_->CreateAccessTokenFetcherForAccount(
-          identity_manager_->GetPrimaryAccountId(
-              signin::ConsentLevel::kNotRequired),
+          identity_manager_->GetPrimaryAccountId(signin::ConsentLevel::kSignin),
           "add_supervision", scopes,
           base::BindOnce(&AddSupervisionHandler::OnAccessTokenFetchComplete,
                          weak_ptr_factory_.GetWeakPtr(), std::move(callback)),
diff --git a/chrome/browser/ui/webui/chromeos/assistant_optin/assistant_optin_utils.cc b/chrome/browser/ui/webui/chromeos/assistant_optin/assistant_optin_utils.cc
index c689f9a..750c79d 100644
--- a/chrome/browser/ui/webui/chromeos/assistant_optin/assistant_optin_utils.cc
+++ b/chrome/browser/ui/webui/chromeos/assistant_optin/assistant_optin_utils.cc
@@ -234,10 +234,9 @@
                                   bool opted_in) {
   auto* identity_manager = IdentityManagerFactory::GetForProfile(profile);
   // This function doesn't care about browser sync consent.
-  DCHECK(
-      identity_manager->HasPrimaryAccount(signin::ConsentLevel::kNotRequired));
+  DCHECK(identity_manager->HasPrimaryAccount(signin::ConsentLevel::kSignin));
   const CoreAccountId account_id =
-      identity_manager->GetPrimaryAccountId(signin::ConsentLevel::kNotRequired);
+      identity_manager->GetPrimaryAccountId(signin::ConsentLevel::kSignin);
 
   using sync_pb::UserConsentTypes;
   UserConsentTypes::AssistantActivityControlConsent consent;
diff --git a/chrome/browser/ui/webui/chromeos/edu_account_login_handler_chromeos.cc b/chrome/browser/ui/webui/chromeos/edu_account_login_handler_chromeos.cc
index c88265b..c60b8b0e 100644
--- a/chrome/browser/ui/webui/chromeos/edu_account_login_handler_chromeos.cc
+++ b/chrome/browser/ui/webui/chromeos/edu_account_login_handler_chromeos.cc
@@ -261,7 +261,7 @@
               base::Unretained(this), std::move(obfuscated_gaia_id),
               std::move(password)),
           signin::PrimaryAccountAccessTokenFetcher::Mode::kImmediate,
-          signin::ConsentLevel::kNotRequired);
+          signin::ConsentLevel::kSignin);
 }
 
 void EduAccountLoginHandler::FetchReAuthProofTokenForParent(
diff --git a/chrome/browser/ui/webui/chromeos/edu_coexistence/edu_coexistence_login_handler_chromeos.cc b/chrome/browser/ui/webui/chromeos/edu_coexistence/edu_coexistence_login_handler_chromeos.cc
index 6f3ad29..9880a5b 100644
--- a/chrome/browser/ui/webui/chromeos/edu_coexistence/edu_coexistence_login_handler_chromeos.cc
+++ b/chrome/browser/ui/webui/chromeos/edu_coexistence/edu_coexistence_login_handler_chromeos.cc
@@ -159,7 +159,7 @@
               &EduCoexistenceLoginHandler::OnOAuthAccessTokensFetched,
               base::Unretained(this)),
           signin::PrimaryAccountAccessTokenFetcher::Mode::kWaitUntilAvailable,
-          signin::ConsentLevel::kNotRequired);
+          signin::ConsentLevel::kSignin);
 }
 
 EduCoexistenceLoginHandler::~EduCoexistenceLoginHandler() {
diff --git a/chrome/browser/ui/webui/chromeos/login/arc_terms_of_service_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/arc_terms_of_service_screen_handler.cc
index 7479250..22452b5 100644
--- a/chrome/browser/ui/webui/chromeos/login/arc_terms_of_service_screen_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/arc_terms_of_service_screen_handler.cc
@@ -375,10 +375,9 @@
       ConsentAuditorFactory::GetForProfile(profile);
   auto* identity_manager = IdentityManagerFactory::GetForProfile(profile);
   // The account may or may not have consented to browser sync.
-  DCHECK(
-      identity_manager->HasPrimaryAccount(signin::ConsentLevel::kNotRequired));
+  DCHECK(identity_manager->HasPrimaryAccount(signin::ConsentLevel::kSignin));
   const CoreAccountId account_id =
-      identity_manager->GetPrimaryAccountId(signin::ConsentLevel::kNotRequired);
+      identity_manager->GetPrimaryAccountId(signin::ConsentLevel::kSignin);
 
   ArcPlayTermsOfServiceConsent play_consent;
   play_consent.set_status(tos_accepted ? UserConsentTypes::GIVEN
diff --git a/chrome/browser/ui/webui/settings/chromeos/account_manager_handler.cc b/chrome/browser/ui/webui/settings/chromeos/account_manager_handler.cc
index a28fc07..2568153 100644
--- a/chrome/browser/ui/webui/settings/chromeos/account_manager_handler.cc
+++ b/chrome/browser/ui/webui/settings/chromeos/account_manager_handler.cc
@@ -272,7 +272,7 @@
       device_account.SetOrganization(
           chrome::enterprise_util::GetDomainFromEmail(
               identity_manager_
-                  ->GetPrimaryAccountInfo(signin::ConsentLevel::kNotRequired)
+                  ->GetPrimaryAccountInfo(signin::ConsentLevel::kSignin)
                   .email));
     }
 
diff --git a/chrome/browser/ui/webui/settings/people_handler.cc b/chrome/browser/ui/webui/settings/people_handler.cc
index bea45dc9..e86763d 100644
--- a/chrome/browser/ui/webui/settings/people_handler.cc
+++ b/chrome/browser/ui/webui/settings/people_handler.cc
@@ -491,7 +491,7 @@
   auto* identity_manager = IdentityManagerFactory::GetForProfile(profile_);
   base::Optional<AccountInfo> primary_account_info =
       identity_manager->FindExtendedAccountInfoForAccountWithRefreshToken(
-          identity_manager->GetPrimaryAccountInfo(ConsentLevel::kNotRequired));
+          identity_manager->GetPrimaryAccountInfo(ConsentLevel::kSignin));
   if (primary_account_info.has_value())
     accounts.Append(GetAccountValue(primary_account_info.value()));
   return accounts;
diff --git a/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper.cc b/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper.cc
index e720d0e..867be2a 100644
--- a/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper.cc
+++ b/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper.cc
@@ -281,8 +281,7 @@
 
 bool DiceTurnSyncOnHelper::HasCanOfferSigninError() {
   SigninUIError can_offer_error =
-      CanOfferSignin(profile_, CAN_OFFER_SIGNIN_FOR_ALL_ACCOUNTS,
-                     account_info_.gaia, account_info_.email);
+      CanOfferSignin(profile_, account_info_.gaia, account_info_.email);
   if (can_offer_error.IsOk())
     return false;
 
diff --git a/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper_unittest.cc b/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper_unittest.cc
index c2a8b96..8e6c176 100644
--- a/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper_unittest.cc
+++ b/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper_unittest.cc
@@ -885,7 +885,7 @@
       IdentityManagerFactory::GetForProfile(new_profile());
   DCHECK_NE(new_identity_manager, identity_manager());
   EXPECT_EQ(account_id(), new_identity_manager->GetPrimaryAccountId(
-                              signin::ConsentLevel::kNotRequired));
+                              signin::ConsentLevel::kSignin));
   CheckDelegateCalls();
 }
 
diff --git a/chrome/browser/ui/webui/signin/inline_login_handler.cc b/chrome/browser/ui/webui/signin/inline_login_handler.cc
index 25a5f21..488daa03 100644
--- a/chrome/browser/ui/webui/signin/inline_login_handler.cc
+++ b/chrome/browser/ui/webui/signin/inline_login_handler.cc
@@ -112,7 +112,6 @@
       signin::GetSigninReasonForEmbeddedPromoURL(current_url);
 
   if (reason != signin_metrics::Reason::REASON_REAUTHENTICATION &&
-      reason != signin_metrics::Reason::REASON_UNLOCK &&
       reason != signin_metrics::Reason::REASON_ADD_SECONDARY_ACCOUNT) {
     signin_metrics::LogSigninAccessPointStarted(
         access_point,
diff --git a/chrome/browser/ui/webui/signin/inline_login_handler_chromeos.cc b/chrome/browser/ui/webui/signin/inline_login_handler_chromeos.cc
index 969ba20..1c681e36a 100644
--- a/chrome/browser/ui/webui/signin/inline_login_handler_chromeos.cc
+++ b/chrome/browser/ui/webui/signin/inline_login_handler_chromeos.cc
@@ -74,7 +74,7 @@
 
   std::string primary_account_email =
       IdentityManagerFactory::GetForProfile(profile)
-          ->GetPrimaryAccountInfo(signin::ConsentLevel::kNotRequired)
+          ->GetPrimaryAccountInfo(signin::ConsentLevel::kSignin)
           .email;
   // If provided email is for primary account - it's a reauthentication, use
   // normal add account flow.
@@ -336,8 +336,7 @@
   signin::IdentityManager* identity_manager =
       IdentityManagerFactory::GetForProfile(profile);
   std::string primary_account_email =
-      identity_manager
-          ->GetPrimaryAccountInfo(signin::ConsentLevel::kNotRequired)
+      identity_manager->GetPrimaryAccountInfo(signin::ConsentLevel::kSignin)
           .email;
 
   // Child user added a secondary account.
diff --git a/chrome/browser/ui/webui/signin/inline_login_handler_impl.cc b/chrome/browser/ui/webui/signin/inline_login_handler_impl.cc
index 9a0b312..b77ce6b7 100644
--- a/chrome/browser/ui/webui/signin/inline_login_handler_impl.cc
+++ b/chrome/browser/ui/webui/signin/inline_login_handler_impl.cc
@@ -36,7 +36,6 @@
 #include "chrome/browser/signin/account_consistency_mode_manager.h"
 #include "chrome/browser/signin/chrome_device_id_helper.h"
 #include "chrome/browser/signin/identity_manager_factory.h"
-#include "chrome/browser/signin/local_auth.h"
 #include "chrome/browser/signin/signin_promo.h"
 #include "chrome/browser/signin/signin_util.h"
 #include "chrome/browser/themes/theme_service.h"
@@ -94,7 +93,6 @@
 // InlineLoginHandlerImpl.
 enum class HandlerSigninReason {
   FORCED_SIGNIN_PRIMARY_ACCOUNT,
-  UNLOCK,
   FETCH_LST_ONLY
 };
 
@@ -105,8 +103,6 @@
   switch (reason) {
     case signin_metrics::Reason::REASON_FORCED_SIGNIN_PRIMARY_ACCOUNT:
       return HandlerSigninReason::FORCED_SIGNIN_PRIMARY_ACCOUNT;
-    case signin_metrics::Reason::REASON_UNLOCK:
-      return HandlerSigninReason::UNLOCK;
     case signin_metrics::Reason::REASON_FETCH_LST_ONLY:
       return HandlerSigninReason::FETCH_LST_ONLY;
     default:
@@ -115,19 +111,6 @@
   }
 }
 
-// Converts from HandlerSigninReason to signin_metrics::Reason.
-signin_metrics::Reason GetSigninReasonFromHandlerSigninReason(
-    HandlerSigninReason r) {
-  switch (r) {
-    case HandlerSigninReason::FORCED_SIGNIN_PRIMARY_ACCOUNT:
-      return signin_metrics::Reason::REASON_FORCED_SIGNIN_PRIMARY_ACCOUNT;
-    case HandlerSigninReason::UNLOCK:
-      return signin_metrics::Reason::REASON_UNLOCK;
-    case HandlerSigninReason::FETCH_LST_ONLY:
-      return signin_metrics::Reason::REASON_FETCH_LST_ONLY;
-  }
-}
-
 // Specific implementation of DiceTurnSyncOnHelper::Delegate for forced
 // signin flows. Some confirmation prompts are skipped.
 class ForcedSigninDiceTurnSyncOnHelperDelegate
@@ -282,9 +265,6 @@
         /*is_primary_account_=*/true,
         password_manager::metrics_util::GaiaPasswordHashChange::
             SAVED_ON_CHROME_SIGNIN);
-
-    if (profiles::IsLockAvailable(profile))
-      LocalAuth::SetLocalAuthCredentials(profile, password);
   }
 
   if (has_primary_account && is_force_sign_in_with_usermanager &&
@@ -412,11 +392,6 @@
   std::string primary_email =
       identity_manager->GetPrimaryAccountInfo(signin::ConsentLevel::kSync)
           .email;
-  if (gaia::AreEmailsSame(email_, primary_email) &&
-      reason == HandlerSigninReason::UNLOCK && !password_.empty() &&
-      profiles::IsLockAvailable(profile_)) {
-    LocalAuth::SetLocalAuthCredentials(profile_, password_);
-  }
 
   if (!password_.empty()) {
     scoped_refptr<password_manager::PasswordStore> password_store =
@@ -430,44 +405,19 @@
     }
   }
 
-  if (reason == HandlerSigninReason::UNLOCK) {
-    DCHECK(!identity_manager->GetPrimaryAccountInfo(signin::ConsentLevel::kSync)
-                .IsEmpty());
-
-    identity_manager->GetAccountsMutator()->AddOrUpdateAccount(
-        gaia_id_, email_, result.refresh_token,
-        result.is_under_advanced_protection,
-        signin_metrics::SourceForRefreshTokenOperation::
-            kInlineLoginHandler_Signin);
-
-    if (signin::IsAutoCloseEnabledInEmbeddedURL(current_url_)) {
-      // Close the gaia sign in tab via a task to make sure we aren't in the
-      // middle of any webui handler code.
-      base::ThreadTaskRunnerHandle::Get()->PostTask(
-          FROM_HERE,
-          base::BindOnce(&InlineLoginHandlerImpl::CloseTab, handler_));
-    }
-
-    identity_manager->GetAccountsCookieMutator()->AddAccountToCookie(
-        identity_manager->GetPrimaryAccountId(signin::ConsentLevel::kSync),
-        gaia::GaiaSource::kPrimaryAccountManager, {});
-
-    signin_metrics::LogSigninReason(
-        GetSigninReasonFromHandlerSigninReason(reason));
-  } else {
-    if (confirm_untrusted_signin_) {
-      // Display a confirmation dialog to the user.
-      base::RecordAction(
-          base::UserMetricsAction("Signin_Show_UntrustedSigninPrompt"));
-      Browser* browser = chrome::FindLastActiveWithProfile(profile_);
-      browser->window()->ShowOneClickSigninConfirmation(
-          base::UTF8ToUTF16(email_),
-          base::BindOnce(&InlineSigninHelper::UntrustedSigninConfirmed,
-                         base::Unretained(this), result.refresh_token));
-      return;
-    }
-    CreateSyncStarter(result.refresh_token);
+  if (confirm_untrusted_signin_) {
+    // Display a confirmation dialog to the user.
+    base::RecordAction(
+        base::UserMetricsAction("Signin_Show_UntrustedSigninPrompt"));
+    Browser* browser = chrome::FindLastActiveWithProfile(profile_);
+    browser->window()->ShowOneClickSigninConfirmation(
+        base::UTF8ToUTF16(email_),
+        base::BindOnce(&InlineSigninHelper::UntrustedSigninConfirmed,
+                       base::Unretained(this), result.refresh_token));
+    return;
   }
+  CreateSyncStarter(result.refresh_token);
+
   base::ThreadTaskRunnerHandle::Get()->DeleteSoon(FROM_HERE, this);
 }
 
@@ -603,9 +553,6 @@
 
   std::string flow;
   switch (reason) {
-    case HandlerSigninReason::UNLOCK:
-      flow = "reauth";
-      break;
     case HandlerSigninReason::FORCED_SIGNIN_PRIMARY_ACCOUNT:
       flow = "enterprisefsi";
       break;
@@ -678,8 +625,7 @@
     return;
   }
 
-  DCHECK(reason == HandlerSigninReason::FORCED_SIGNIN_PRIMARY_ACCOUNT ||
-         reason == HandlerSigninReason::UNLOCK);
+  DCHECK(reason == HandlerSigninReason::FORCED_SIGNIN_PRIMARY_ACCOUNT);
   DCHECK(signin_util::IsForceSigninEnabled());
 
   ProfileManager* manager = g_browser_process->profile_manager();
@@ -791,21 +737,10 @@
                         ? signin_metrics::HISTOGRAM_WITH_ADVANCED
                         : signin_metrics::HISTOGRAM_WITH_DEFAULTS);
 
-  CanOfferSigninType can_offer_for = CAN_OFFER_SIGNIN_FOR_ALL_ACCOUNTS;
-  if (reason == HandlerSigninReason::UNLOCK) {
-    std::string primary_username =
-        IdentityManagerFactory::GetForProfile(profile)
-            ->GetPrimaryAccountInfo(signin::ConsentLevel::kSync)
-            .email;
-    if (!gaia::AreEmailsSame(default_email, primary_username))
-      can_offer_for = CAN_OFFER_SIGNIN_FOR_SECONDARY_ACCOUNT;
-  }
-
   SigninUIError can_offer_error = SigninUIError::Ok();
-  if (reason != HandlerSigninReason::FETCH_LST_ONLY) {
-    can_offer_error =
-        CanOfferSignin(profile, can_offer_for, params.gaia_id, params.email);
-  }
+  if (reason != HandlerSigninReason::FETCH_LST_ONLY)
+    can_offer_error = CanOfferSignin(profile, params.gaia_id, params.email);
+
   if (!can_offer_error.IsOk()) {
     params.handler->HandleLoginError(can_offer_error);
     return;
diff --git a/chrome/browser/ui/webui/signin/inline_login_ui.cc b/chrome/browser/ui/webui/signin/inline_login_ui.cc
index 17f65f9..5c6e5ef50 100644
--- a/chrome/browser/ui/webui/signin/inline_login_ui.cc
+++ b/chrome/browser/ui/webui/signin/inline_login_ui.cc
@@ -251,7 +251,6 @@
 
   switch (reason) {
     case signin_metrics::Reason::REASON_FORCED_SIGNIN_PRIMARY_ACCOUNT:
-    case signin_metrics::Reason::REASON_UNLOCK:
       // Used by the user manager.
       return true;
     case signin_metrics::Reason::REASON_FETCH_LST_ONLY:
@@ -266,9 +265,6 @@
     case signin_metrics::Reason::REASON_REAUTHENTICATION:
     case signin_metrics::Reason::REASON_UNKNOWN_REASON:
       return false;
-    case signin_metrics::Reason::REASON_MAX:
-      NOTREACHED();
-      return false;
   }
   NOTREACHED();
 #endif  // BUILDFLAG(IS_CHROMEOS_ASH)
diff --git a/chrome/browser/ui/webui/signin/signin_reauth_ui.cc b/chrome/browser/ui/webui/signin/signin_reauth_ui.cc
index 8ef0059..e722b84 100644
--- a/chrome/browser/ui/webui/signin/signin_reauth_ui.cc
+++ b/chrome/browser/ui/webui/signin/signin_reauth_ui.cc
@@ -43,7 +43,7 @@
   // TODO(crbug.com/1083429): generalize for arbitrary accounts by passing an
   // account id as a method parameter.
   CoreAccountId account_id =
-      identity_manager->GetPrimaryAccountId(signin::ConsentLevel::kNotRequired);
+      identity_manager->GetPrimaryAccountId(signin::ConsentLevel::kSignin);
   // Sync shouldn't be enabled. Otherwise, the primary account and the first
   // cookie account may diverge.
   DCHECK(!identity_manager->HasPrimaryAccount(signin::ConsentLevel::kSync));
diff --git a/chrome/browser/ui/webui/signin/signin_utils_desktop.cc b/chrome/browser/ui/webui/signin/signin_utils_desktop.cc
index 8d1b3360..80fc440 100644
--- a/chrome/browser/ui/webui/signin/signin_utils_desktop.cc
+++ b/chrome/browser/ui/webui/signin/signin_utils_desktop.cc
@@ -26,7 +26,6 @@
 #include "ui/base/l10n/l10n_util.h"
 
 SigninUIError CanOfferSignin(Profile* profile,
-                             CanOfferSigninType can_offer,
                              const std::string& gaia_id,
                              const std::string& email) {
   if (!profile)
@@ -49,11 +48,8 @@
       return SigninUIError::UsernameNotAllowedByPatternFromPrefs(email);
     }
 
-    if (can_offer == CAN_OFFER_SIGNIN_FOR_SECONDARY_ACCOUNT)
-      return SigninUIError::Ok();
-
     // If the identity manager already has a primary account, then this is a
-    // re-auth scenario.  Make sure the email just signed in corresponds to
+    // re-auth scenario. Make sure the email just signed in corresponds to
     // the one sign in manager expects.
     std::string current_email =
         identity_manager->GetPrimaryAccountInfo(signin::ConsentLevel::kSync)
diff --git a/chrome/browser/ui/webui/signin/signin_utils_desktop.h b/chrome/browser/ui/webui/signin/signin_utils_desktop.h
index 0eb1101..a9b8ae2 100644
--- a/chrome/browser/ui/webui/signin/signin_utils_desktop.h
+++ b/chrome/browser/ui/webui/signin/signin_utils_desktop.h
@@ -10,17 +10,10 @@
 class Profile;
 class SigninUIError;
 
-// Argument for |CanOfferSignin|.
-enum CanOfferSigninType {
-  CAN_OFFER_SIGNIN_FOR_ALL_ACCOUNTS,
-  CAN_OFFER_SIGNIN_FOR_SECONDARY_ACCOUNT
-};
-
 // Returns a non-error if sign-in is allowed for account with |email| and
 // |gaia_id| to |profile|. If the sign-in is not allowed, then the error type
 // and the error message are passed in the returned value.
 SigninUIError CanOfferSignin(Profile* profile,
-                             CanOfferSigninType can_offer_type,
                              const std::string& gaia_id,
                              const std::string& email);
 
diff --git a/chrome/browser/ui/webui/signin/sync_confirmation_handler.cc b/chrome/browser/ui/webui/signin/sync_confirmation_handler.cc
index 2953d8d1..bc04421 100644
--- a/chrome/browser/ui/webui/signin/sync_confirmation_handler.cc
+++ b/chrome/browser/ui/webui/signin/sync_confirmation_handler.cc
@@ -108,7 +108,7 @@
   DCHECK(ProfileSyncServiceFactory::IsSyncAllowed(profile_));
   base::Optional<AccountInfo> primary_account_info =
       identity_manager_->FindExtendedAccountInfoForAccountWithRefreshToken(
-          identity_manager_->GetPrimaryAccountInfo(ConsentLevel::kNotRequired));
+          identity_manager_->GetPrimaryAccountInfo(ConsentLevel::kSignin));
 
   // Fire the "account-image-changed" listener from |SetUserImageURL()|.
   // Note: If the account info is not available yet in the
@@ -151,7 +151,7 @@
   consent_auditor::ConsentAuditor* consent_auditor =
       ConsentAuditorFactory::GetForProfile(profile_);
   consent_auditor->RecordSyncConsent(
-      identity_manager_->GetPrimaryAccountId(ConsentLevel::kNotRequired),
+      identity_manager_->GetPrimaryAccountId(ConsentLevel::kSignin),
       sync_consent);
 }
 
@@ -183,7 +183,7 @@
     return;
 
   if (info.account_id !=
-      identity_manager_->GetPrimaryAccountId(ConsentLevel::kNotRequired)) {
+      identity_manager_->GetPrimaryAccountId(ConsentLevel::kSignin)) {
     return;
   }
 
@@ -221,7 +221,7 @@
 
   base::Optional<AccountInfo> primary_account_info =
       identity_manager_->FindExtendedAccountInfoForAccountWithRefreshToken(
-          identity_manager_->GetPrimaryAccountInfo(ConsentLevel::kNotRequired));
+          identity_manager_->GetPrimaryAccountInfo(ConsentLevel::kSignin));
   if (!primary_account_info) {
     // No account is signed in, so there is nothing to be displayed in the sync
     // confirmation dialog.
diff --git a/chrome/browser/ui/webui/signin/sync_confirmation_handler.h b/chrome/browser/ui/webui/signin/sync_confirmation_handler.h
index becbc76..db09ee78 100644
--- a/chrome/browser/ui/webui/signin/sync_confirmation_handler.h
+++ b/chrome/browser/ui/webui/signin/sync_confirmation_handler.h
@@ -23,7 +23,7 @@
 }
 
 // WebUI message handler for the sync confirmation dialog. IdentityManager calls
-// in this class use signin::ConsentLevel::kNotRequired because the user hasn't
+// in this class use signin::ConsentLevel::kSignin because the user hasn't
 // consented to sync yet.
 class SyncConfirmationHandler : public content::WebUIMessageHandler,
                                 public signin::IdentityManager::Observer,
diff --git a/chrome/browser/web_applications/system_web_apps/system_web_app_background_task.cc b/chrome/browser/web_applications/system_web_apps/system_web_app_background_task.cc
index 5bf3870..471baac 100644
--- a/chrome/browser/web_applications/system_web_apps/system_web_app_background_task.cc
+++ b/chrome/browser/web_applications/system_web_apps/system_web_app_background_task.cc
@@ -3,21 +3,30 @@
 // found in the LICENSE file.
 
 #include "chrome/browser/web_applications/system_web_apps/system_web_app_background_task.h"
+#include "base/bind.h"
 #include "base/memory/weak_ptr.h"
+#include "base/time/time.h"
+#include "base/timer/timer.h"
 #include "chrome/browser/profiles/profile.h"
 #include "content/public/browser/web_contents.h"
 #include "third_party/blink/public/common/web_preferences/web_preferences.h"
 
 namespace web_app {
 
+// Wait for 2 minutes before starting background tasks. User login is busy, and
+// this will give a little time to settle down. We could get even more
+// sophisticated, and smear all the different start_immediately tasks across a
+// couple minutes instead of setting their start timers to the same time.
+const int kInitialWaitForBackgroundTasksSeconds = 120;
+
 SystemAppBackgroundTask::SystemAppBackgroundTask(
     Profile* profile,
     const SystemAppBackgroundTaskInfo& info)
-    // TODO(https://crbug/1169745): Create the webcontents lazily.
-    : web_contents_(content::WebContents::Create(
-          content::WebContents::CreateParams(profile))),
+    : profile_(profile),
+      web_contents_(nullptr),
       web_app_url_loader_(std::make_unique<WebAppUrlLoader>()),
       timer_(std::make_unique<base::RepeatingTimer>()),
+      start_immediately_timer_(std::make_unique<base::OneShotTimer>()),
       url_(info.url),
       period_(info.period),
       opened_count_(0),
@@ -28,7 +37,13 @@
 
 void SystemAppBackgroundTask::StartTask() {
   if (open_immediately_) {
-    NavigateTimerBackgroundPage();
+    DCHECK_GT(period_, base::TimeDelta::FromSeconds(
+                           kInitialWaitForBackgroundTasksSeconds));
+    start_immediately_timer_->Start(
+        FROM_HERE,
+        base::TimeDelta::FromSeconds(kInitialWaitForBackgroundTasksSeconds),
+        base::BindOnce(&SystemAppBackgroundTask::NavigateTimerBackgroundPage,
+                       weak_ptr_factory_.GetWeakPtr()));
   }
   timer_->Start(
       FROM_HERE, period_,
@@ -42,6 +57,11 @@
 }
 
 void SystemAppBackgroundTask::NavigateTimerBackgroundPage() {
+  if (!web_contents_) {
+    web_contents_ = content::WebContents::Create(
+        content::WebContents::CreateParams(profile_));
+  }
+
   timer_activated_count_++;
   auto prefs = web_contents_->GetOrCreateWebPreferences();
 
diff --git a/chrome/browser/web_applications/system_web_apps/system_web_app_background_task.h b/chrome/browser/web_applications/system_web_apps/system_web_app_background_task.h
index 7d5b2554..61f33b2 100644
--- a/chrome/browser/web_applications/system_web_apps/system_web_app_background_task.h
+++ b/chrome/browser/web_applications/system_web_apps/system_web_app_background_task.h
@@ -11,6 +11,7 @@
 #include "base/one_shot_event.h"
 #include "base/time/time.h"
 #include "base/timer/timer.h"
+#include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/web_applications/components/web_app_url_loader.h"
 #include "chrome/browser/web_applications/components/web_application_info.h"
 #include "chrome/browser/web_applications/system_web_apps/system_web_app_types.h"
@@ -32,15 +33,18 @@
   // The amount of time between each opening of the background url.
   // The url is opened using the same WebContents, so if the
   // previous task is still running, it will be closed.
+  // If using open_immediately, this should be greater than 120 seconds,
+  // which how long the immediate background tasks will wait.
   base::TimeDelta period;
 
   // The url of the background page to open. This should do one specific thing.
   // (Probably opening a shared worker, waiting for a response, and closing)
   GURL url;
 
-  // A flag to indicate that the task should be opened immediately upon user
+  // A flag to indicate that the task should be opened soon upon user
   // login, after the SWAs are done installing as opposed to waiting for the
-  // first period to be reached.
+  // first period to be reached. "Soon" means about 2 minutes, to give the
+  // login time processing a chance to settle down.
   bool open_immediately;
 };
 
@@ -79,15 +83,25 @@
     web_app_url_loader_.reset(loader.release());
   }
 
+  base::OneShotTimer* get_start_timer_for_testing() {
+    return start_immediately_timer_.get();
+  }
+
+  base::RepeatingTimer* get_repeating_timer_for_testing() {
+    return timer_.get();
+  }
+
  private:
   void NavigateTimerBackgroundPage();
   void OnLoaderReady(WebAppUrlLoader::Result);
   void OnPageReady(WebAppUrlLoader::Result);
 
+  Profile* profile_;
   SystemAppType app_type_;
   std::unique_ptr<content::WebContents> web_contents_;
   std::unique_ptr<WebAppUrlLoader> web_app_url_loader_;
   std::unique_ptr<base::RepeatingTimer> timer_;
+  std::unique_ptr<base::OneShotTimer> start_immediately_timer_;
   GURL url_;
   base::TimeDelta period_;
   unsigned long opened_count_;
diff --git a/chrome/browser/web_applications/system_web_apps/system_web_app_manager.cc b/chrome/browser/web_applications/system_web_apps/system_web_app_manager.cc
index 496eb74..47719c3f 100644
--- a/chrome/browser/web_applications/system_web_apps/system_web_app_manager.cc
+++ b/chrome/browser/web_applications/system_web_apps/system_web_app_manager.cc
@@ -15,6 +15,7 @@
 #include "base/command_line.h"
 #include "base/containers/contains.h"
 #include "base/metrics/histogram_functions.h"
+#include "base/one_shot_event.h"
 #include "base/optional.h"
 #include "base/run_loop.h"
 #include "base/strings/string_number_conversions.h"
@@ -411,6 +412,7 @@
 SystemWebAppManager::SystemWebAppManager(Profile* profile)
     : profile_(profile),
       on_apps_synchronized_(new base::OneShotEvent()),
+      on_tasks_started_(new base::OneShotEvent()),
       install_result_per_profile_histogram_name_(
           std::string(kInstallResultHistogramName) + ".Profiles." +
           GetProfileCategoryForLogging(profile)),
@@ -513,6 +515,7 @@
 
 void SystemWebAppManager::InstallSystemAppsForTesting() {
   on_apps_synchronized_.reset(new base::OneShotEvent());
+  on_tasks_started_.reset(new base::OneShotEvent());
   system_app_infos_ = CreateSystemWebApps(profile_);
   Start();
 
@@ -911,6 +914,11 @@
   for (const auto& task : tasks_) {
     task->StartTask();
   }
+  // This happens as part of synchronize, and can also be called multiple times
+  // in testing.
+  if (!on_tasks_started_->is_signaled()) {
+    on_tasks_started_->Signal();
+  }
 }
 
 bool SystemWebAppManager::ShouldForceInstallApps() const {
diff --git a/chrome/browser/web_applications/system_web_apps/system_web_app_manager.h b/chrome/browser/web_applications/system_web_apps/system_web_app_manager.h
index 411b3954..edc3d13 100644
--- a/chrome/browser/web_applications/system_web_apps/system_web_app_manager.h
+++ b/chrome/browser/web_applications/system_web_apps/system_web_app_manager.h
@@ -237,6 +237,12 @@
     return *on_apps_synchronized_;
   }
 
+  // Return the OneShotEvent that is fired after all of the background tasks
+  // have started and their timers become active.
+  const base::OneShotEvent& on_tasks_started() const {
+    return *on_tasks_started_;
+  }
+
   // This call will override default System Apps configuration. You should call
   // Start() after this call to install |system_apps|.
   void SetSystemAppsForTesting(
@@ -292,6 +298,7 @@
   Profile* profile_;
 
   std::unique_ptr<base::OneShotEvent> on_apps_synchronized_;
+  std::unique_ptr<base::OneShotEvent> on_tasks_started_;
 
   bool shutting_down_ = false;
 
diff --git a/chrome/browser/web_applications/system_web_apps/test/system_web_app_manager_browsertest.cc b/chrome/browser/web_applications/system_web_apps/test/system_web_app_manager_browsertest.cc
index 880d6fa..c3734c7 100644
--- a/chrome/browser/web_applications/system_web_apps/test/system_web_app_manager_browsertest.cc
+++ b/chrome/browser/web_applications/system_web_apps/test/system_web_app_manager_browsertest.cc
@@ -1402,11 +1402,11 @@
         TestSystemWebAppInstallation::SetUpAppWithBackgroundTask();
   }
 
-  void WaitForSystemAppsSynchronized() {
+  void WaitForSystemAppsBackgroundTasksStart() {
     base::RunLoop run_loop;
     WebAppProvider::Get(browser()->profile())
         ->system_web_app_manager()
-        .on_apps_synchronized()
+        .on_tasks_started()
         .Post(FROM_HERE, run_loop.QuitClosure());
 
     run_loop.Run();
@@ -1424,16 +1424,25 @@
   // a hook in the background pages to detect the navigation as an event. That's
   // a little too much work for one test though, and since this is mostly tested
   // in unittests, this is probably enough.
-
   content::TestNavigationObserver navigation_observer(
       GURL("chrome://test-system-app/page2.html"));
+  navigation_observer.StartWatchingNewWebContents();
 
-  WaitForSystemAppsSynchronized();
-
-  navigation_observer.WatchExistingWebContents();
-  navigation_observer.Wait();
+  WaitForSystemAppsBackgroundTasksStart();
 
   auto& tasks = GetManager().GetBackgroundTasksForTesting();
+  auto* start_timer = tasks[0]->get_start_timer_for_testing();
+  EXPECT_EQ(base::TimeDelta::FromSeconds(120), start_timer->GetCurrentDelay());
+  EXPECT_EQ(base::TimeDelta::FromDays(1),
+            tasks[0]->get_repeating_timer_for_testing()->GetCurrentDelay());
+
+  // The "Immediate" timer waits for 2 minutes, and it's really hard to mock
+  // time properly in a browser test, so just fire the thing now. We're not
+  // testing that base::Timer works.
+  start_timer->FireNow();
+
+  navigation_observer.Wait();
+  EXPECT_FALSE(start_timer->IsRunning());
   EXPECT_EQ(1u, tasks.size());
   EXPECT_TRUE(tasks[0]->open_immediately_for_testing());
   EXPECT_EQ(base::TimeDelta::FromDays(1), tasks[0]->period_for_testing());
diff --git a/chrome/browser/web_applications/system_web_apps/test/system_web_app_manager_unittest.cc b/chrome/browser/web_applications/system_web_apps/test/system_web_app_manager_unittest.cc
index c274ea26..b4ff5a6 100644
--- a/chrome/browser/web_applications/system_web_apps/test/system_web_app_manager_unittest.cc
+++ b/chrome/browser/web_applications/system_web_apps/test/system_web_app_manager_unittest.cc
@@ -1077,7 +1077,7 @@
   system_apps.at(SystemAppType::SETTINGS).timer_info =
       SystemAppBackgroundTaskInfo();
   system_apps.at(SystemAppType::SETTINGS).timer_info->period =
-      base::TimeDelta::FromSeconds(30);
+      base::TimeDelta::FromSeconds(300);
   system_apps.at(SystemAppType::SETTINGS).timer_info->url = AppUrl1();
   system_apps.at(SystemAppType::SETTINGS).timer_info->open_immediately = true;
 
@@ -1105,17 +1105,17 @@
 
   auto& timers = system_web_app_manager().GetBackgroundTasksForTesting();
 
-  task_environment()->FastForwardBy(base::TimeDelta::FromSeconds(1));
+  task_environment()->FastForwardBy(base::TimeDelta::FromSeconds(121));
   EXPECT_EQ(1u, timers.size());
   EXPECT_EQ(true, timers[0]->open_immediately_for_testing());
-  EXPECT_EQ(base::TimeDelta::FromSeconds(30), timers[0]->period_for_testing());
+  EXPECT_EQ(base::TimeDelta::FromSeconds(300), timers[0]->period_for_testing());
   EXPECT_EQ(1u, timers[0]->timer_activated_count_for_testing());
   EXPECT_EQ(1u, timers[0]->opened_count_for_testing());
 
   loader->AddPrepareForLoadResults({WebAppUrlLoader::Result::kUrlLoaded});
   loader->SetNextLoadUrlResult(AppUrl1(), WebAppUrlLoader::Result::kUrlLoaded);
 
-  task_environment()->FastForwardBy(base::TimeDelta::FromSeconds(30));
+  task_environment()->FastForwardBy(base::TimeDelta::FromSeconds(300));
 
   EXPECT_EQ(2u, timers[0]->timer_activated_count_for_testing());
   EXPECT_EQ(2u, timers[0]->opened_count_for_testing());
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt
index c7bfb2cd..066ca11 100644
--- a/chrome/build/linux.pgo.txt
+++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@
-chrome-linux-master-1616909642-b8d668688aa21d581631333d1d259b3ee53161e5.profdata
+chrome-linux-master-1616975470-6dcb0339d1d9313e273b2cd9884f272b0a4a3749.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt
index fa9f689..2f5281727 100644
--- a/chrome/build/mac.pgo.txt
+++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@
-chrome-mac-master-1616909642-cadebb3e3874de51e4b2e526d8a64c952ce04701.profdata
+chrome-mac-master-1616975470-29caecd51260993a5b6699aaf0263e0acb94145c.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt
index f9043e4b..043a2ab 100644
--- a/chrome/build/win32.pgo.txt
+++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@
-chrome-win32-master-1616909642-b3eb7daf8a769d0b70e30ffb0035c5d97d57d140.profdata
+chrome-win32-master-1616981549-9335f07eb4df8fc5de88e55a0287f3564aab4b4a.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt
index 6ad78ec..8c4ebe1 100644
--- a/chrome/build/win64.pgo.txt
+++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@
-chrome-win64-master-1616909642-1e3268681d5ce4b0a1d37afc109b045126e42f09.profdata
+chrome-win64-master-1617008321-f58b5a75a5aff9ba788e708712f2887f2b7f293f.profdata
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index 5fa36f22..6cd1239 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -3820,7 +3820,6 @@
     "../browser/signin/chrome_signin_proxying_url_loader_factory_unittest.cc",
     "../browser/signin/chrome_signin_status_metrics_provider_delegate_unittest.cc",
     "../browser/signin/chrome_signin_url_loader_throttle_unittest.cc",
-    "../browser/signin/local_auth_unittest.cc",
     "../browser/signin/reauth_tab_helper_unittest.cc",
     "../browser/signin/reauth_util_unittest.cc",
     "../browser/signin/signin_profile_attributes_updater_unittest.cc",
diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/signin/SigninTestUtil.java b/chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/signin/SigninTestUtil.java
index 5e6f21c..305ae90 100644
--- a/chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/signin/SigninTestUtil.java
+++ b/chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/signin/SigninTestUtil.java
@@ -68,7 +68,7 @@
             Assert.assertEquals(coreAccountInfo,
                     IdentityServicesProvider.get()
                             .getIdentityManager(Profile.getLastUsedRegularProfile())
-                            .getPrimaryAccountInfo(ConsentLevel.NOT_REQUIRED));
+                            .getPrimaryAccountInfo(ConsentLevel.SIGNIN));
         });
     }
 
diff --git a/chromeos/components/drivefs/drivefs_auth.cc b/chromeos/components/drivefs/drivefs_auth.cc
index 9c8f1f21..d3abbcb 100644
--- a/chromeos/components/drivefs/drivefs_auth.cc
+++ b/chromeos/components/drivefs/drivefs_auth.cc
@@ -70,7 +70,7 @@
           base::BindOnce(&DriveFsAuth::GotChromeAccessToken,
                          base::Unretained(this)),
           signin::PrimaryAccountAccessTokenFetcher::Mode::kWaitUntilAvailable,
-          signin::ConsentLevel::kNotRequired);
+          signin::ConsentLevel::kSignin);
 }
 
 void DriveFsAuth::GotChromeAccessToken(
diff --git a/chromeos/components/media_app_ui/resources/js/launch.js b/chromeos/components/media_app_ui/resources/js/launch.js
index 20896a25..de271c94 100644
--- a/chromeos/components/media_app_ui/resources/js/launch.js
+++ b/chromeos/components/media_app_ui/resources/js/launch.js
@@ -749,22 +749,33 @@
 }
 
 /**
- * Returns whether `filename` has an extension indicating a possible RAW image.
- * @param {string} filename
+ * Returns whether `fileName` has an extension indicating a possible RAW image.
+ * @param {string} fileName
  * @return {boolean}
  */
-function isRawImageFile(filename) {
-  return /\.(arw|cr2|dng|nef|nrw|orf|raf|rw2)$/.test(filename.toLowerCase());
+function isRawImageFile(fileName) {
+  return /\.(arw|cr2|dng|nef|nrw|orf|raf|rw2)$/.test(fileName.toLowerCase());
 }
 
 /**
- * Returns whether fileName is the filename for a video or image.
+ * Returns whether `fileName` is a file potentially containing subtitles.
+ * @param {string} fileName
+ * @return {boolean}
+ */
+function isSubtitleFile(fileName) {
+  return /\.vtt$/.test(fileName.toLowerCase());
+}
+
+/**
+ * Returns whether fileName is the filename for a video or image, or a related
+ * file type (e.g. video subtitles).
  * @param {string} fileName
  * @return {boolean}
  */
 function isVideoOrImage(fileName) {
   const fileType = getMimeTypeFromFilename(fileName);
-  return /^(image)|(video)\//.test(fileType) || isRawImageFile(fileName);
+  return /^(image)|(video)\//.test(fileType) || isRawImageFile(fileName) ||
+      isSubtitleFile(fileName);
 }
 
 /**
diff --git a/chromeos/components/media_app_ui/test/media_app_ui_browsertest.js b/chromeos/components/media_app_ui/test/media_app_ui_browsertest.js
index 00457ab5..194a372 100644
--- a/chromeos/components/media_app_ui/test/media_app_ui_browsertest.js
+++ b/chromeos/components/media_app_ui/test/media_app_ui_browsertest.js
@@ -1094,24 +1094,25 @@
     {name: 'matryoshka.MKV'},
     {name: 'noext', type: ''},
     {name: 'other.txt', type: 'text/plain'},
+    {name: 'subtitles.vtt'},
     {name: 'text.txt', type: 'text/plain'},
     {name: 'world.webm', type: 'video/webm'},
   ];
   const directory = await createMockTestDirectory(testFiles);
-  const [html, jpg, gif, emkv, mkv, MKV, ext, other, txt, webm] =
+  const [html, jpg, gif, emkv, mkv, MKV, ext, other, vtt, txt, webm] =
       directory.getFilesSync();
 
   await loadFilesWithoutSendingToGuest(directory, mkv);
-  assertFilesToBe([mkv, MKV, webm, jpg, gif], 'mkv');
+  assertFilesToBe([mkv, MKV, vtt, webm, jpg, gif], 'mkv');
 
   await loadFilesWithoutSendingToGuest(directory, jpg);
-  assertFilesToBe([jpg, gif, mkv, MKV, webm], 'jpg');
+  assertFilesToBe([jpg, gif, mkv, MKV, vtt, webm], 'jpg');
 
   await loadFilesWithoutSendingToGuest(directory, gif);
-  assertFilesToBe([gif, mkv, MKV, webm, jpg], 'gif');
+  assertFilesToBe([gif, mkv, MKV, vtt, webm, jpg], 'gif');
 
   await loadFilesWithoutSendingToGuest(directory, webm);
-  assertFilesToBe([webm, jpg, gif, mkv, MKV], 'webm');
+  assertFilesToBe([webm, jpg, gif, mkv, MKV, vtt], 'webm');
 
   await loadFilesWithoutSendingToGuest(directory, txt);
   assertFilesToBe([txt, other], 'txt');
diff --git a/chromeos/dbus/session_manager/BUILD.gn b/chromeos/dbus/session_manager/BUILD.gn
index 565cfa8..9de6d73 100644
--- a/chromeos/dbus/session_manager/BUILD.gn
+++ b/chromeos/dbus/session_manager/BUILD.gn
@@ -17,6 +17,7 @@
     "//chromeos/dbus/constants",
     "//chromeos/dbus/cryptohome",
     "//chromeos/dbus/cryptohome:cryptohome_proto",
+    "//chromeos/dbus/userdataauth",
     "//components/policy/proto",
     "//crypto",
     "//dbus",
diff --git a/chromeos/dbus/session_manager/fake_session_manager_client.cc b/chromeos/dbus/session_manager/fake_session_manager_client.cc
index 711535c..e4afa327 100644
--- a/chromeos/dbus/session_manager/fake_session_manager_client.cc
+++ b/chromeos/dbus/session_manager/fake_session_manager_client.cc
@@ -24,8 +24,8 @@
 #include "base/threading/thread_task_runner_handle.h"
 #include "chromeos/dbus/constants/dbus_paths.h"
 #include "chromeos/dbus/cryptohome/account_identifier_operators.h"
-#include "chromeos/dbus/cryptohome/cryptohome_client.h"
 #include "chromeos/dbus/login_manager/policy_descriptor.pb.h"
+#include "chromeos/dbus/userdataauth/userdataauth_client.h"
 #include "components/policy/proto/device_management_backend.pb.h"
 #include "crypto/sha2.h"
 
@@ -154,7 +154,7 @@
       cryptohome::AccountIdentifier cryptohome_id;
       cryptohome_id.set_account_id(descriptor.account_id());
       const std::string sanitized_id =
-          CryptohomeClient::GetStubSanitizedUsername(cryptohome_id);
+          UserDataAuthClient::GetStubSanitizedUsername(cryptohome_id);
       return base::FilePath(sanitized_id)
           .AppendASCII(kStubPerAccountPolicyFileNamePrefix + postfix);
     }
@@ -334,7 +334,7 @@
     const cryptohome::AccountIdentifier& cryptohome_id) {
   DCHECK_EQ(0UL, user_sessions_.count(cryptohome_id.account_id()));
   std::string user_id_hash =
-      CryptohomeClient::GetStubSanitizedUsername(cryptohome_id);
+      UserDataAuthClient::GetStubSanitizedUsername(cryptohome_id);
   user_sessions_[cryptohome_id.account_id()] = user_id_hash;
 }
 
diff --git a/chromeos/dbus/userdataauth/fake_cryptohome_misc_client.cc b/chromeos/dbus/userdataauth/fake_cryptohome_misc_client.cc
index a0701a3e..69bfa33 100644
--- a/chromeos/dbus/userdataauth/fake_cryptohome_misc_client.cc
+++ b/chromeos/dbus/userdataauth/fake_cryptohome_misc_client.cc
@@ -80,14 +80,16 @@
 void FakeCryptohomeMiscClient::CheckHealth(
     const ::user_data_auth::CheckHealthRequest& request,
     CheckHealthCallback callback) {
-  ::user_data_auth::CheckHealthReply reply;
+  base::Optional<::user_data_auth::CheckHealthReply> reply;
   if (cryptohome_error_ ==
       ::user_data_auth::CryptohomeErrorCode::CRYPTOHOME_ERROR_NOT_SET) {
-    reply.set_requires_powerwash(requires_powerwash_);
+    reply = ::user_data_auth::CheckHealthReply();
+    reply->set_requires_powerwash(requires_powerwash_);
   }
-  // Note: In case cryptohome_error_ is set to anything else, we'll return that
-  // no powerwash is required and the call is successful.
-  ReturnProtobufMethodCallback(reply, std::move(callback));
+  // Note: In case cryptohome_error_ is set to anything else, we'll return as if
+  // the dbus call failed.
+  base::ThreadTaskRunnerHandle::Get()->PostTask(
+      FROM_HERE, base::BindOnce(std::move(callback), reply));
 }
 
 base::Optional<::user_data_auth::GetSanitizedUsernameReply>
diff --git a/chromeos/dbus/userdataauth/install_attributes_client.cc b/chromeos/dbus/userdataauth/install_attributes_client.cc
index cffe1ba..bc2c15c 100644
--- a/chromeos/dbus/userdataauth/install_attributes_client.cc
+++ b/chromeos/dbus/userdataauth/install_attributes_client.cc
@@ -130,7 +130,7 @@
       const ::user_data_auth::InstallAttributesGetRequest& request) override {
     return BlockingCallProtoMethod<::user_data_auth::InstallAttributesGetReply>(
         ::user_data_auth::kInstallAttributesGet,
-        ::user_data_auth::kCryptohomeMiscInterface, request);
+        ::user_data_auth::kInstallAttributesInterface, request);
   }
 
   base::Optional<::user_data_auth::InstallAttributesSetReply>
@@ -138,7 +138,7 @@
       const ::user_data_auth::InstallAttributesSetRequest& request) override {
     return BlockingCallProtoMethod<::user_data_auth::InstallAttributesSetReply>(
         ::user_data_auth::kInstallAttributesSet,
-        ::user_data_auth::kCryptohomeMiscInterface, request);
+        ::user_data_auth::kInstallAttributesInterface, request);
   }
 
   base::Optional<::user_data_auth::InstallAttributesFinalizeReply>
@@ -148,7 +148,7 @@
     return BlockingCallProtoMethod<
         ::user_data_auth::InstallAttributesFinalizeReply>(
         ::user_data_auth::kInstallAttributesFinalize,
-        ::user_data_auth::kCryptohomeMiscInterface, request);
+        ::user_data_auth::kInstallAttributesInterface, request);
   }
 
   base::Optional<::user_data_auth::InstallAttributesGetStatusReply>
@@ -158,7 +158,7 @@
     return BlockingCallProtoMethod<
         ::user_data_auth::InstallAttributesGetStatusReply>(
         ::user_data_auth::kInstallAttributesGetStatus,
-        ::user_data_auth::kCryptohomeMiscInterface, request);
+        ::user_data_auth::kInstallAttributesInterface, request);
   }
 
  private:
diff --git a/chromeos/login/session/BUILD.gn b/chromeos/login/session/BUILD.gn
index b9db2b0..043ebe5 100644
--- a/chromeos/login/session/BUILD.gn
+++ b/chromeos/login/session/BUILD.gn
@@ -14,6 +14,8 @@
     "//chromeos/dbus/cryptohome:cryptohome_proto",
     "//chromeos/dbus/power:power",
     "//chromeos/dbus/session_manager:session_manager",
+    "//chromeos/dbus/userdataauth:userdataauth",
+    "//chromeos/dbus/userdataauth:userdataauth_proto",
     "//third_party/protobuf:protobuf_lite",
   ]
   sources = [
@@ -29,6 +31,7 @@
     "//chromeos/dbus/cryptohome:cryptohome",
     "//chromeos/dbus/power:power",
     "//chromeos/dbus/session_manager:session_manager",
+    "//chromeos/dbus/userdataauth:userdataauth",
     "//chromeos/login/session:session",
     "//testing/gtest",
   ]
diff --git a/chromeos/login/session/session_termination_manager.cc b/chromeos/login/session/session_termination_manager.cc
index a8fa6a5e..c48b31f 100644
--- a/chromeos/login/session/session_termination_manager.cc
+++ b/chromeos/login/session/session_termination_manager.cc
@@ -6,9 +6,9 @@
 
 #include "base/bind.h"
 #include "base/logging.h"
-#include "chromeos/dbus/cryptohome/cryptohome_client.h"
 #include "chromeos/dbus/power/power_manager_client.h"
 #include "chromeos/dbus/session_manager/session_manager_client.h"
+#include "chromeos/dbus/userdataauth/cryptohome_misc_client.h"
 #include "third_party/cros_system_api/dbus/service_constants.h"
 
 namespace chromeos {
@@ -44,7 +44,7 @@
 }
 
 void SessionTerminationManager::RebootIfNecessary() {
-  CryptohomeClient::Get()->WaitForServiceToBeAvailable(
+  CryptohomeMiscClient::Get()->WaitForServiceToBeAvailable(
       base::BindOnce(&SessionTerminationManager::DidWaitForServiceToBeAvailable,
                      weak_factory_.GetWeakPtr()));
 }
@@ -63,25 +63,22 @@
     LOG(ERROR) << "WaitForServiceToBeAvailable failed.";
     return;
   }
-  CryptohomeClient::Get()->GetLoginStatus(
-      cryptohome::GetLoginStatusRequest(),
+  CryptohomeMiscClient::Get()->GetLoginStatus(
+      user_data_auth::GetLoginStatusRequest(),
       base::BindOnce(&SessionTerminationManager::RebootIfNecessaryProcessReply,
                      weak_factory_.GetWeakPtr()));
 }
 
 void SessionTerminationManager::ProcessCryptohomeLoginStatusReply(
-    const base::Optional<cryptohome::BaseReply>& reply) {
-  if (!reply.has_value() || reply->has_error() ||
-      !reply->HasExtension(cryptohome::GetLoginStatusReply::reply)) {
+    const base::Optional<user_data_auth::GetLoginStatusReply>& reply) {
+  if (!reply.has_value() ||
+      reply->error() !=
+          user_data_auth::CryptohomeErrorCode::CRYPTOHOME_ERROR_NOT_SET) {
     LOG(ERROR) << "Login status request failed, error: "
-               << (reply.has_value() && reply->has_error() ? reply->error()
-                                                           : 0);
+               << (reply.has_value() ? reply->error() : 0);
     return;
   }
-  auto reply_proto =
-      reply->GetExtension(cryptohome::GetLoginStatusReply::reply);
-  if (reply_proto.has_is_locked_to_single_user() &&
-      reply_proto.is_locked_to_single_user()) {
+  if (reply->is_locked_to_single_user()) {
     is_locked_to_single_user_ = true;
   }
 }
@@ -92,7 +89,7 @@
 }
 
 void SessionTerminationManager::RebootIfNecessaryProcessReply(
-    base::Optional<cryptohome::BaseReply> reply) {
+    base::Optional<user_data_auth::GetLoginStatusReply> reply) {
   ProcessCryptohomeLoginStatusReply(reply);
   if (is_locked_to_single_user_)
     Reboot();
diff --git a/chromeos/login/session/session_termination_manager.h b/chromeos/login/session/session_termination_manager.h
index 056b5af..123a97c1 100644
--- a/chromeos/login/session/session_termination_manager.h
+++ b/chromeos/login/session/session_termination_manager.h
@@ -9,7 +9,7 @@
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
 #include "base/optional.h"
-#include "chromeos/dbus/cryptohome/rpc.pb.h"
+#include "chromeos/dbus/cryptohome/UserDataAuth.pb.h"
 #include "third_party/cros_system_api/dbus/login_manager/dbus-constants.h"
 
 namespace chromeos {
@@ -37,10 +37,10 @@
  private:
   void DidWaitForServiceToBeAvailable(bool service_is_available);
   void ProcessCryptohomeLoginStatusReply(
-      const base::Optional<cryptohome::BaseReply>& reply);
+      const base::Optional<user_data_auth::GetLoginStatusReply>& reply);
   void Reboot();
   void RebootIfNecessaryProcessReply(
-      base::Optional<cryptohome::BaseReply> reply);
+      base::Optional<user_data_auth::GetLoginStatusReply> reply);
 
   bool is_locked_to_single_user_ = false;
   base::WeakPtrFactory<SessionTerminationManager> weak_factory_{this};
diff --git a/chromeos/login/session/session_termination_manager_unittest.cc b/chromeos/login/session/session_termination_manager_unittest.cc
index 2f23887..cc02e00 100644
--- a/chromeos/login/session/session_termination_manager_unittest.cc
+++ b/chromeos/login/session/session_termination_manager_unittest.cc
@@ -5,9 +5,9 @@
 #include "chromeos/login/session/session_termination_manager.h"
 
 #include "base/macros.h"
-#include "chromeos/dbus/cryptohome/cryptohome_client.h"
 #include "chromeos/dbus/power/fake_power_manager_client.h"
 #include "chromeos/dbus/session_manager/session_manager_client.h"
+#include "chromeos/dbus/userdataauth/cryptohome_misc_client.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace chromeos {
@@ -17,11 +17,11 @@
   SessionTerminationManagerTest() {
     PowerManagerClient::InitializeFake();
     power_client_ = FakePowerManagerClient::Get();
-    CryptohomeClient::InitializeFake();
+    CryptohomeMiscClient::InitializeFake();
     SessionManagerClient::InitializeFake();
   }
   ~SessionTerminationManagerTest() override {
-    CryptohomeClient::Shutdown();
+    CryptohomeMiscClient::Shutdown();
     PowerManagerClient::Shutdown();
     SessionManagerClient::Shutdown();
   }
diff --git a/chromeos/network/network_device_handler_impl.cc b/chromeos/network/network_device_handler_impl.cc
index a9e1c289..2022b76 100644
--- a/chromeos/network/network_device_handler_impl.cc
+++ b/chromeos/network/network_device_handler_impl.cc
@@ -370,6 +370,7 @@
   ApplyMACAddressRandomizationToShill();
   ApplyUsbEthernetMacAddressSourceToShill();
   ApplyUseAttachApnToShill();
+  ApplyWakeOnWifiAllowedToShill();
 }
 
 void NetworkDeviceHandlerImpl::DevicePropertiesUpdated(
@@ -414,35 +415,83 @@
   }
 }
 
-void NetworkDeviceHandlerImpl::ApplyMACAddressRandomizationToShill() {
+void NetworkDeviceHandlerImpl::ApplyWifiFeatureToShillIfSupported(
+    std::string enable_property_name,
+    bool enabled,
+    std::string support_property_name,
+    WifiFeatureSupport* supported) {
   const DeviceState* device_state = GetWifiDeviceState();
   if (!device_state) {
-    // We'll need to ask if this is supported when we find a Wi-Fi
-    // device.
-    mac_addr_randomization_supported_ =
-        MACAddressRandomizationSupport::NOT_REQUESTED;
+    *supported = WifiFeatureSupport::NOT_REQUESTED;
     return;
   }
-
-  switch (mac_addr_randomization_supported_) {
-    case MACAddressRandomizationSupport::NOT_REQUESTED:
+  switch (*supported) {
+    case WifiFeatureSupport::NOT_REQUESTED:
       GetDeviceProperties(
           device_state->path(),
           base::BindOnce(
-              &NetworkDeviceHandlerImpl::HandleMACAddressRandomization,
-              weak_ptr_factory_.GetWeakPtr()));
+              &NetworkDeviceHandlerImpl::HandleWifiFeatureSupportedProperty,
+              weak_ptr_factory_.GetWeakPtr(), std::move(enable_property_name),
+              enabled, std::move(support_property_name), supported));
       return;
-    case MACAddressRandomizationSupport::SUPPORTED:
-      SetDevicePropertyInternal(
-          device_state->path(), shill::kMacAddressRandomizationEnabledProperty,
-          base::Value(mac_addr_randomization_enabled_), base::DoNothing(),
-          network_handler::ErrorCallback());
+    case WifiFeatureSupport::SUPPORTED:
+      SetDevicePropertyInternal(device_state->path(), enable_property_name,
+                                base::Value(enabled), base::DoNothing(),
+                                network_handler::ErrorCallback());
       return;
-    case MACAddressRandomizationSupport::UNSUPPORTED:
+    case WifiFeatureSupport::UNSUPPORTED:
       return;
   }
 }
 
+void NetworkDeviceHandlerImpl::HandleWifiFeatureSupportedProperty(
+    std::string enable_property_name,
+    bool enabled,
+    std::string support_property_name,
+    WifiFeatureSupport* feature_support_to_set,
+    const std::string& device_path,
+    base::Optional<base::Value> properties) {
+  if (!properties) {
+    return;
+  }
+  base::Optional<bool> supported_val =
+      properties->FindBoolKey(support_property_name);
+  if (!supported_val.has_value()) {
+    if (base::SysInfo::IsRunningOnChromeOS()) {
+      NET_LOG(ERROR) << "Failed to get support property "
+                     << support_property_name << " from device " << device_path;
+    }
+    return;
+  }
+
+  // Try to set MAC address randomization if it's supported.
+  if (*supported_val) {
+    *feature_support_to_set = WifiFeatureSupport::SUPPORTED;
+    ApplyWifiFeatureToShillIfSupported(std::move(enable_property_name), enabled,
+                                       std::move(support_property_name),
+                                       feature_support_to_set);
+  } else {
+    *feature_support_to_set = WifiFeatureSupport::UNSUPPORTED;
+  }
+}
+
+void NetworkDeviceHandlerImpl::ApplyMACAddressRandomizationToShill() {
+  ApplyWifiFeatureToShillIfSupported(
+      shill::kMacAddressRandomizationEnabledProperty,
+      mac_addr_randomization_enabled_,
+      shill::kMacAddressRandomizationSupportedProperty,
+      &mac_addr_randomization_supported_);
+}
+
+void NetworkDeviceHandlerImpl::ApplyWakeOnWifiAllowedToShill() {
+  // Get the setting from feature flags.
+  wake_on_wifi_allowed_ =
+      base::FeatureList::IsEnabled(chromeos::features::kWakeOnWifiAllowed);
+  ApplyWifiFeatureToShillIfSupported(
+      shill::kWakeOnWiFiAllowedProperty, wake_on_wifi_allowed_,
+      shill::kWakeOnWiFiSupportedProperty, &wake_on_wifi_supported_);
+}
+
 void NetworkDeviceHandlerImpl::ApplyUsbEthernetMacAddressSourceToShill() {
   // Do nothing else if MAC address source is not specified yet.
   if (usb_ethernet_mac_address_source_.empty()) {
@@ -596,32 +645,6 @@
   }
 }
 
-void NetworkDeviceHandlerImpl::HandleMACAddressRandomization(
-    const std::string& device_path,
-    base::Optional<base::Value> properties) {
-  if (!properties)
-    return;
-  base::Optional<bool> supported =
-      properties->FindBoolKey(shill::kMacAddressRandomizationSupportedProperty);
-  if (!supported.has_value()) {
-    if (base::SysInfo::IsRunningOnChromeOS()) {
-      NET_LOG(ERROR) << "Failed to determine if device " << device_path
-                     << " supports MAC address randomization";
-    }
-    return;
-  }
-
-  // Try to set MAC address randomization if it's supported.
-  if (*supported) {
-    mac_addr_randomization_supported_ =
-        MACAddressRandomizationSupport::SUPPORTED;
-    ApplyMACAddressRandomizationToShill();
-  } else {
-    mac_addr_randomization_supported_ =
-        MACAddressRandomizationSupport::UNSUPPORTED;
-  }
-}
-
 const DeviceState* NetworkDeviceHandlerImpl::GetWifiDeviceState() {
   return network_state_handler_->GetDeviceStateByType(
       NetworkTypePattern::WiFi());
diff --git a/chromeos/network/network_device_handler_impl.h b/chromeos/network/network_device_handler_impl.h
index 386ddf2..950deaa71 100644
--- a/chromeos/network/network_device_handler_impl.h
+++ b/chromeos/network/network_device_handler_impl.h
@@ -109,17 +109,15 @@
   friend class NetworkDeviceHandler;
   friend class NetworkDeviceHandlerTest;
 
+  // Some WiFi feature enablement needs to check supported property before
+  // setting. e.g. MAC address randomization, wake on WiFi.
   // When there's no Wi-Fi device or there is one but we haven't asked if
-  // MAC address randomization is supported yet, the value of the member
-  // |mac_addr_randomizaton_supported_| will be |NOT_REQUESTED|. When we
-  // try to apply the |mac_addr_randomization_enabled_| value we will
+  // the feature is supported yet, the value of the member, e.g.
+  // |mac_addr_randomizaton_supported_|, will be |NOT_REQUESTED|. When we
+  // try to apply the value e.g. |mac_addr_randomization_enabled_|, we will
   // check whether it is supported and change to one of the other two
   // values.
-  enum class MACAddressRandomizationSupport {
-    NOT_REQUESTED,
-    SUPPORTED,
-    UNSUPPORTED
-  };
+  enum class WifiFeatureSupport { NOT_REQUESTED, SUPPORTED, UNSUPPORTED };
 
   NetworkDeviceHandlerImpl();
 
@@ -133,6 +131,9 @@
   // devices.
   void ApplyMACAddressRandomizationToShill();
 
+  // Applies the wake-on-wifi-allowed feature flag to WiFi devices.
+  void ApplyWakeOnWifiAllowedToShill();
+
   // Applies the current value of |usb_ethernet_mac_address_source_| to primary
   // enabled USB Ethernet device. Does nothing if MAC address source is not
   // specified yet.
@@ -142,6 +143,30 @@
   // existing cellular devices of Shill.
   void ApplyUseAttachApnToShill();
 
+  // Utility function for applying enabled setting of WiFi features that needs
+  // to check if the feature is supported first.
+  // This function will update |supported| if it is still NOT_REQUESTED by
+  // getting |support_property_name| property of the WiFi device. Then, if it
+  // is supported, set |enable_property_name| property of the WiFi device to
+  // |enabled|.
+  void ApplyWifiFeatureToShillIfSupported(std::string enable_property_name,
+                                          bool enabled,
+                                          std::string support_property_name,
+                                          WifiFeatureSupport* supported);
+
+  // Callback function used by ApplyWifiFeatureToShillIfSupported to get shill
+  // property when the supported property is NOT_REQUESTED. It will extract
+  // |support_property_name| of GetProperties response and update
+  // |feature_support_to_set|, then call ApplyWifiFeatureToShillIfSupported
+  // again if the feature is supported.
+  void HandleWifiFeatureSupportedProperty(
+      std::string enable_property_name,
+      bool enabled,
+      std::string support_property_name,
+      WifiFeatureSupport* feature_support_to_set,
+      const std::string& device_path,
+      base::Optional<base::Value> properties);
+
   // Callback to be called on MAC address source change request failure.
   // The request was called on device with |device_path| path and
   // |device_mac_address| MAC address to change MAC address source to the new
@@ -163,21 +188,17 @@
   // Resets MAC address source property for secondary USB Ethernet devices.
   void ResetMacAddressSourceForSecondaryUsbEthernetDevices() const;
 
-  // Sets the value of |mac_addr_randomization_supported_| based on
-  // whether shill thinks it is supported on the wifi device. If it is
-  // supported, also apply |mac_addr_randomization_enabled_| to the
-  // shill device.
-  void HandleMACAddressRandomization(const std::string& device_path,
-                                     base::Optional<base::Value> properties);
-
   // Get the DeviceState for the wifi device, if any.
   const DeviceState* GetWifiDeviceState();
 
   NetworkStateHandler* network_state_handler_ = nullptr;
   bool cellular_allow_roaming_ = false;
-  MACAddressRandomizationSupport mac_addr_randomization_supported_ =
-      MACAddressRandomizationSupport::NOT_REQUESTED;
+  WifiFeatureSupport mac_addr_randomization_supported_ =
+      WifiFeatureSupport::NOT_REQUESTED;
   bool mac_addr_randomization_enabled_ = false;
+  WifiFeatureSupport wake_on_wifi_supported_ =
+      WifiFeatureSupport::NOT_REQUESTED;
+  bool wake_on_wifi_allowed_ = false;
 
   std::string usb_ethernet_mac_address_source_;
   std::string primary_enabled_usb_ethernet_device_path_;
diff --git a/chromeos/services/assistant/assistant_manager_service_impl.cc b/chromeos/services/assistant/assistant_manager_service_impl.cc
index 7a93a8b..b023be0 100644
--- a/chromeos/services/assistant/assistant_manager_service_impl.cc
+++ b/chromeos/services/assistant/assistant_manager_service_impl.cc
@@ -28,7 +28,6 @@
 #include "base/task/post_task.h"
 #include "base/time/time.h"
 #include "base/unguessable_token.h"
-#include "chromeos/assistant/internal/internal_util.h"
 #include "chromeos/dbus/util/version_loader.h"
 #include "chromeos/services/assistant/device_settings_host.h"
 #include "chromeos/services/assistant/libassistant_service_host_impl.h"
@@ -40,34 +39,18 @@
 #include "chromeos/services/assistant/public/cpp/assistant_enums.h"
 #include "chromeos/services/assistant/public/cpp/device_actions.h"
 #include "chromeos/services/assistant/public/cpp/features.h"
-#include "chromeos/services/assistant/public/cpp/migration/libassistant_v1_api.h"
 #include "chromeos/services/assistant/public/shared/utils.h"
 #include "chromeos/services/assistant/service_context.h"
 #include "chromeos/services/assistant/timer_host.h"
 #include "chromeos/services/libassistant/public/mojom/android_app_info.mojom.h"
 #include "chromeos/services/libassistant/public/mojom/speech_recognition_observer.mojom.h"
 #include "chromeos/strings/grit/chromeos_strings.h"
-#include "libassistant/shared/internal_api/assistant_manager_delegate.h"
-#include "libassistant/shared/internal_api/assistant_manager_internal.h"
-#include "libassistant/shared/public/assistant_manager.h"
 #include "services/network/public/cpp/shared_url_loader_factory.h"
 #include "ui/accessibility/mojom/ax_assistant_structure.mojom.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "url/gurl.h"
 
-// A macro which ensures we are running on the main thread.
-#define ENSURE_MAIN_THREAD(method, ...)                                     \
-  if (!main_task_runner()->RunsTasksInCurrentSequence()) {                  \
-    main_task_runner()->PostTask(                                           \
-        FROM_HERE,                                                          \
-        base::BindOnce(method, weak_factory_.GetWeakPtr(), ##__VA_ARGS__)); \
-    return;                                                                 \
-  }
-
 using media_session::mojom::MediaSessionAction;
-using Resolution = assistant_client::ConversationStateListener::Resolution;
-
-namespace api = ::assistant::api;
 
 namespace chromeos {
 namespace assistant {
@@ -349,7 +332,6 @@
 }
 
 void AssistantManagerServiceImpl::StartVoiceInteraction() {
-  DCHECK(assistant_manager());
   DVLOG(1) << __func__;
 
   audio_input_host_->SetMicState(true);
@@ -372,27 +354,8 @@
 void AssistantManagerServiceImpl::StartScreenContextInteraction(
     ax::mojom::AssistantStructurePtr assistant_structure,
     const std::vector<uint8_t>& assistant_screenshot) {
-  std::vector<std::string> context_protos;
-
-  // Screen context can have the |assistant_structure|, or |assistant_extra| and
-  // |assistant_tree| set to nullptr. This happens in the case where the screen
-  // context is coming from the metalayer or there is no active window. For this
-  // scenario, we don't create a context proto for the AssistantBundle that
-  // consists of the |assistant_extra| and |assistant_tree|.
-  if (assistant_structure && assistant_structure->assistant_extra &&
-      assistant_structure->assistant_tree) {
-    // Note: the value of |is_first_query| for screen context query is a no-op
-    // because it is not used for metalayer and "What's on my screen" queries.
-    context_protos.emplace_back(CreateContextProto(
-        AssistantBundle{assistant_structure->assistant_extra.get(),
-                        assistant_structure->assistant_tree.get()},
-        /*is_first_query=*/true));
-  }
-
-  // Note: the value of |is_first_query| for screen context query is a no-op.
-  context_protos.emplace_back(CreateContextProto(assistant_screenshot,
-                                                 /*is_first_query=*/true));
-  assistant_manager_internal()->SendScreenContextRequest(context_protos);
+  conversation_controller().StartScreenContextInteraction(
+      std::move(assistant_structure), assistant_screenshot);
 }
 
 void AssistantManagerServiceImpl::StartTextInteraction(
@@ -535,10 +498,8 @@
 }
 
 void AssistantManagerServiceImpl::OnServiceRunning() {
-  // It is possible the |assistant_manager()| was destructed before the
-  // rescheduled main thread task got a chance to run. We check this and also
-  // try to avoid double run by checking |GetState()|.
-  if (!assistant_manager() || (GetState() == State::RUNNING))
+  // Try to avoid double run by checking |GetState()|.
+  if (GetState() == State::RUNNING)
     return;
 
   SetStateAndInformObservers(State::RUNNING);
@@ -625,18 +586,6 @@
   return assistant_proxy_->ExtractNotificationDelegate();
 }
 
-void AssistantManagerServiceImpl::SendVoicelessInteraction(
-    const std::string& interaction,
-    const std::string& description,
-    bool is_user_initiated) {
-  assistant_client::VoicelessOptions voiceless_options;
-
-  voiceless_options.is_user_initiated = is_user_initiated;
-
-  assistant_manager_internal()->SendVoicelessInteraction(
-      interaction, description, voiceless_options, [](auto) {});
-}
-
 void AssistantManagerServiceImpl::RecordQueryResponseTypeUMA() {
   AssistantQueryResponseType response_type = GetQueryResponseType();
 
@@ -708,18 +657,6 @@
   return assistant_proxy_->service_controller();
 }
 
-assistant_client::AssistantManager*
-AssistantManagerServiceImpl::assistant_manager() {
-  auto* api = LibassistantV1Api::Get();
-  return api ? api->assistant_manager() : nullptr;
-}
-
-assistant_client::AssistantManagerInternal*
-AssistantManagerServiceImpl::assistant_manager_internal() {
-  auto* api = LibassistantV1Api::Get();
-  return api ? api->assistant_manager_internal() : nullptr;
-}
-
 void AssistantManagerServiceImpl::SetMicState(bool mic_open) {
   DCHECK(audio_input_host_);
   audio_input_host_->SetMicState(mic_open);
diff --git a/chromeos/services/assistant/assistant_manager_service_impl.h b/chromeos/services/assistant/assistant_manager_service_impl.h
index f1ccfe73..b0e5b2c8 100644
--- a/chromeos/services/assistant/assistant_manager_service_impl.h
+++ b/chromeos/services/assistant/assistant_manager_service_impl.h
@@ -29,8 +29,6 @@
 #include "chromeos/services/libassistant/public/cpp/assistant_notification.h"
 #include "chromeos/services/libassistant/public/mojom/notification_delegate.mojom.h"
 #include "chromeos/services/libassistant/public/mojom/service_controller.mojom-forward.h"
-#include "libassistant/shared/public/conversation_state_listener.h"
-#include "libassistant/shared/public/device_state_listener.h"
 #include "mojo/public/cpp/bindings/pending_receiver.h"
 #include "mojo/public/cpp/bindings/pending_remote.h"
 #include "mojo/public/cpp/bindings/receiver.h"
@@ -45,11 +43,6 @@
 class AssistantStateBase;
 }  // namespace ash
 
-namespace assistant_client {
-class AssistantManager;
-class AssistantManagerInternal;
-}  // namespace assistant_client
-
 namespace chromeos {
 namespace assistant {
 
@@ -97,7 +90,6 @@
 // enabled/disabled in settings or switches to a non-primary profile.
 class COMPONENT_EXPORT(ASSISTANT_SERVICE) AssistantManagerServiceImpl
     : public AssistantManagerService,
-      public assistant_client::ConversationStateListener,
       public AppListEventSubscriber,
       private chromeos::libassistant::mojom::StateObserver,
       public ConversationObserver {
@@ -195,9 +187,6 @@
 
   mojo::PendingRemote<network::mojom::URLLoaderFactory> BindURLLoaderFactory();
 
-  assistant_client::AssistantManager* assistant_manager();
-  assistant_client::AssistantManagerInternal* assistant_manager_internal();
-
   void OnModifySettingsAction(const std::string& modify_setting_args_proto);
 
   void OnDeviceAppsEnabled(bool enabled);
diff --git a/chromeos/services/assistant/assistant_manager_service_impl_unittest.cc b/chromeos/services/assistant/assistant_manager_service_impl_unittest.cc
index c4cc97ce..8f9cee85 100644
--- a/chromeos/services/assistant/assistant_manager_service_impl_unittest.cc
+++ b/chromeos/services/assistant/assistant_manager_service_impl_unittest.cc
@@ -16,15 +16,12 @@
 #include "base/test/scoped_feature_list.h"
 #include "base/test/task_environment.h"
 #include "base/values.h"
-#include "chromeos/assistant/internal/test_support/fake_assistant_manager.h"
-#include "chromeos/assistant/internal/test_support/fake_assistant_manager_internal.h"
 #include "chromeos/assistant/test_support/expect_utils.h"
 #include "chromeos/dbus/power/fake_power_manager_client.h"
 #include "chromeos/services/assistant/assistant_manager_service.h"
 #include "chromeos/services/assistant/proxy/libassistant_service_host.h"
 #include "chromeos/services/assistant/public/cpp/assistant_service.h"
 #include "chromeos/services/assistant/public/cpp/features.h"
-#include "chromeos/services/assistant/public/cpp/migration/libassistant_v1_api.h"
 #include "chromeos/services/assistant/service_context.h"
 #include "chromeos/services/assistant/test_support/fake_libassistant_service.h"
 #include "chromeos/services/assistant/test_support/fake_service_context.h"
@@ -35,8 +32,6 @@
 #include "chromeos/services/assistant/test_support/scoped_device_actions.h"
 #include "chromeos/services/libassistant/public/cpp/assistant_timer.h"
 #include "chromeos/services/libassistant/public/mojom/speaker_id_enrollment_controller.mojom.h"
-#include "libassistant/shared/internal_api/assistant_manager_internal.h"
-#include "libassistant/shared/public/assistant_manager.h"
 #include "mojo/public/cpp/bindings/pending_remote.h"
 #include "mojo/public/cpp/bindings/receiver.h"
 #include "services/media_session/public/mojom/media_session.mojom-shared.h"
@@ -114,13 +109,6 @@
   DISALLOW_COPY_AND_ASSIGN(StateObserverMock);
 };
 
-class FakeLibassistantV1Api : public LibassistantV1Api {
- public:
-  explicit FakeLibassistantV1Api(FakeAssistantManager* assistant_manager)
-      : LibassistantV1Api(assistant_manager,
-                          &assistant_manager->assistant_manager_internal()) {}
-};
-
 class AssistantManagerServiceImplTest : public testing::Test {
  public:
   AssistantManagerServiceImplTest() = default;
@@ -195,14 +183,6 @@
 
   FullyInitializedAssistantState& assistant_state() { return assistant_state_; }
 
-  FakeAssistantManager* fake_assistant_manager() {
-    return assistant_manager_.get();
-  }
-
-  FakeAssistantManagerInternal* fake_assistant_manager_internal() {
-    return &fake_assistant_manager()->assistant_manager_internal();
-  }
-
   FakeServiceContext* fake_service_context() { return service_context_.get(); }
 
   base::test::TaskEnvironment& task_environment() { return task_environment_; }
@@ -243,23 +223,6 @@
         "AssistantManagerStateImpl");
   }
 
-  void SetAssistantManagerInternal(std::unique_ptr<FakeAssistantManagerInternal>
-                                       assistant_manager_internal) {
-    assistant_manager_->set_assistant_manager_internal(
-        std::move(assistant_manager_internal));
-    libassistant_v1_api_.reset();
-    libassistant_v1_api_ =
-        std::make_unique<FakeLibassistantV1Api>(assistant_manager_.get());
-  }
-
-  void SetAssistantManager(
-      std::unique_ptr<FakeAssistantManager> assistant_manager) {
-    assistant_manager_ = std::move(assistant_manager);
-    libassistant_v1_api_.reset();
-    libassistant_v1_api_ =
-        std::make_unique<FakeLibassistantV1Api>(assistant_manager_.get());
-  }
-
  private:
   base::Thread& background_thread() {
     return assistant_manager_service()->GetBackgroundThreadForTesting();
@@ -275,11 +238,6 @@
   // Fake implementation of the Libassistant Mojom service.
   FakeLibassistantService libassistant_service_;
 
-  std::unique_ptr<FakeAssistantManager> assistant_manager_{
-      std::make_unique<FakeAssistantManager>()};
-  std::unique_ptr<FakeLibassistantV1Api> libassistant_v1_api_{
-      std::make_unique<FakeLibassistantV1Api>(assistant_manager_.get())};
-
   std::unique_ptr<AssistantAlarmTimerControllerMock> alarm_timer_controller_;
   std::unique_ptr<FakeServiceContext> service_context_;
 
@@ -576,14 +534,14 @@
   StrictMock<StateObserverMock> observer;
   AddStateObserver(&observer);
 
-  fake_assistant_manager()->BlockStartCalls();
+  mojom_service_controller().BlockStartCalls();
 
   EXPECT_CALL(observer,
               OnStateChanged(AssistantManagerService::State::STARTING));
   Start();
 
   assistant_manager_service()->RemoveStateObserver(&observer);
-  fake_assistant_manager()->UnblockStartCalls();
+  mojom_service_controller().UnblockStartCalls();
 }
 
 TEST_F(AssistantManagerServiceImplTest, ShouldFireStateObserverWhenStarted) {
@@ -641,22 +599,6 @@
   Start();
 }
 
-class AssistantManagerMock : public FakeAssistantManager {
- public:
-  AssistantManagerMock() = default;
-  ~AssistantManagerMock() override = default;
-
-  MOCK_METHOD(void, StartAssistantInteraction, (), (override));
-};
-
-class AssistantManagerInternalMock : public FakeAssistantManagerInternal {
- public:
-  AssistantManagerInternalMock() = default;
-  ~AssistantManagerInternalMock() override = default;
-
-  MOCK_METHOD(void, StopAssistantInteractionInternal, (bool), (override));
-};
-
 TEST_F(AssistantManagerServiceImplTest,
        ShouldStartSpeakerIdEnrollmentWhenRequested) {
   NiceMock<SpeakerIdEnrollmentClientMock> client_mock;
@@ -761,6 +703,7 @@
 
   StrictMock<SpeakerIdEnrollmentClientMock> client_mock;
   StrictMock<SpeakerIdEnrollmentControllerMock> mojom_mock;
+
   mojom_mock.Bind(mojom_libassistant_service());
 
   EXPECT_CALL(mojom_mock, GetSpeakerIdEnrollmentStatus)
diff --git a/chromeos/services/assistant/service.cc b/chromeos/services/assistant/service.cc
index e5a5c6a1..2851954 100644
--- a/chromeos/services/assistant/service.cc
+++ b/chromeos/services/assistant/service.cc
@@ -410,8 +410,8 @@
 }
 
 CoreAccountInfo Service::RetrievePrimaryAccountInfo() const {
-  CoreAccountInfo account_info = identity_manager_->GetPrimaryAccountInfo(
-      signin::ConsentLevel::kNotRequired);
+  CoreAccountInfo account_info =
+      identity_manager_->GetPrimaryAccountInfo(signin::ConsentLevel::kSignin);
   CHECK(!account_info.account_id.empty());
   CHECK(!account_info.gaia.empty());
   return account_info;
diff --git a/chromeos/services/device_sync/cryptauth_client_impl.cc b/chromeos/services/device_sync/cryptauth_client_impl.cc
index 91d66fb6..37d3721 100644
--- a/chromeos/services/device_sync/cryptauth_client_impl.cc
+++ b/chromeos/services/device_sync/cryptauth_client_impl.cc
@@ -674,7 +674,7 @@
               weak_ptr_factory_.GetWeakPtr(), request_type, serialized_request,
               request_as_query_parameters, std::move(response_callback)),
           signin::PrimaryAccountAccessTokenFetcher::Mode::kWaitUntilAvailable,
-          signin::ConsentLevel::kNotRequired);
+          signin::ConsentLevel::kSignin);
 }
 
 template <class ResponseProto>
diff --git a/chromeos/services/device_sync/device_sync_impl.cc b/chromeos/services/device_sync/device_sync_impl.cc
index 5f792e61..9a8903d 100644
--- a/chromeos/services/device_sync/device_sync_impl.cc
+++ b/chromeos/services/device_sync/device_sync_impl.cc
@@ -786,7 +786,7 @@
 void DeviceSyncImpl::OnPrimaryAccountChanged(
     const signin::PrimaryAccountChangeEvent& event) {
   PA_LOG(VERBOSE) << "DeviceSyncImpl: OnPrimaryAccountChanged";
-  switch (event.GetEventTypeFor(signin::ConsentLevel::kNotRequired)) {
+  switch (event.GetEventTypeFor(signin::ConsentLevel::kSignin)) {
     case signin::PrimaryAccountChangeEvent::Type::kSet:
       identity_manager_->RemoveObserver(this);
       ProcessPrimaryAccountInfo(event.GetCurrentState().primary_account);
@@ -831,8 +831,8 @@
   status_ = InitializationStatus::kFetchingAccountInfo;
 
   // "Unconsented" because this feature is not tied to browser sync consent.
-  CoreAccountInfo primary_account = identity_manager_->GetPrimaryAccountInfo(
-      signin::ConsentLevel::kNotRequired);
+  CoreAccountInfo primary_account =
+      identity_manager_->GetPrimaryAccountInfo(signin::ConsentLevel::kSignin);
   if (primary_account.account_id.empty()) {
     // Primary profile not loaded yet. This happens when adding a new account.
     PA_LOG(VERBOSE) << "DeviceSyncImpl: Waiting for primary account info";
diff --git a/chromeos/services/device_sync/device_sync_service_unittest.cc b/chromeos/services/device_sync/device_sync_service_unittest.cc
index 563890f21..6b0b73e3 100644
--- a/chromeos/services/device_sync/device_sync_service_unittest.cc
+++ b/chromeos/services/device_sync/device_sync_service_unittest.cc
@@ -596,10 +596,10 @@
               device_manager);
     EXPECT_EQ(fake_cryptauth_v2_device_manager_factory_->instance(),
               v2_device_manager);
-    EXPECT_EQ(identity_manager_
-                  ->GetPrimaryAccountInfo(signin::ConsentLevel::kNotRequired)
-                  .email,
-              user_email);
+    EXPECT_EQ(
+        identity_manager_->GetPrimaryAccountInfo(signin::ConsentLevel::kSignin)
+            .email,
+        user_email);
     if (base::FeatureList::IsEnabled(features::kCryptAuthV2Enrollment)) {
       EXPECT_EQ(fake_cryptauth_v2_enrollment_manager_factory_->instance()
                     ->GetUserPrivateKey(),
diff --git a/chromeos/services/libassistant/conversation_controller.cc b/chromeos/services/libassistant/conversation_controller.cc
index 3947fa4..ed4c7d2 100644
--- a/chromeos/services/libassistant/conversation_controller.cc
+++ b/chromeos/services/libassistant/conversation_controller.cc
@@ -325,6 +325,38 @@
                            /*is_user_initiated=*/true);
 }
 
+void ConversationController::StartScreenContextInteraction(
+    ax::mojom::AssistantStructurePtr assistant_structure,
+    const std::vector<uint8_t>& screenshot) {
+  DCHECK(requests_are_allowed_)
+      << "Should not receive requests before Libassistant is running";
+  if (!assistant_manager_internal_)
+    return;
+
+  std::vector<std::string> context_protos;
+  // Screen context can have the |assistant_structure|, or |assistant_extra| and
+  // |assistant_tree| set to nullptr. This happens in the case where the screen
+  // context is coming from the metalayer or there is no active window. For this
+  // scenario, we don't create a context proto for the AssistantBundle that
+  // consists of the |assistant_extra| and |assistant_tree|.
+  if (assistant_structure && assistant_structure->assistant_extra &&
+      assistant_structure->assistant_tree) {
+    // Note: the value of |is_first_query| for screen context query is a no-op
+    // because it is not used for metalayer and "What's on my screen" queries.
+    context_protos.emplace_back(chromeos::assistant::CreateContextProto(
+        chromeos::assistant::AssistantBundle{
+            assistant_structure->assistant_extra.get(),
+            assistant_structure->assistant_tree.get()},
+        /*is_first_query=*/true));
+  }
+
+  // Note: the value of |is_first_query| for screen context query is a no-op.
+  context_protos.emplace_back(
+      chromeos::assistant::CreateContextProto(screenshot,
+                                              /*is_first_query=*/true));
+  assistant_manager_internal_->SendScreenContextRequest(context_protos);
+}
+
 void ConversationController::StopActiveInteraction(bool cancel_conversation) {
   if (!assistant_manager_internal_) {
     VLOG(1) << "Stopping interaction without assistant manager.";
diff --git a/chromeos/services/libassistant/conversation_controller.h b/chromeos/services/libassistant/conversation_controller.h
index e414854..02cb204 100644
--- a/chromeos/services/libassistant/conversation_controller.h
+++ b/chromeos/services/libassistant/conversation_controller.h
@@ -34,7 +34,7 @@
 class COMPONENT_EXPORT(LIBASSISTANT_SERVICE) ConversationController
     : public mojom::ConversationController,
       public AssistantManagerObserver,
-      public ::chromeos::assistant::action::AssistantActionObserver,
+      public chromeos::assistant::action::AssistantActionObserver,
       public chromeos::assistant::ConversationObserver {
  public:
   using AssistantNotification = ::chromeos::assistant::AssistantNotification;
@@ -76,6 +76,9 @@
                      bool allow_tts) override;
   void StartVoiceInteraction() override;
   void StartEditReminderInteraction(const std::string& client_id) override;
+  void StartScreenContextInteraction(
+      ax::mojom::AssistantStructurePtr assistant_structure,
+      const std::vector<uint8_t>& screenshot) override;
   void StopActiveInteraction(bool cancel_conversation) override;
   void RetrieveNotification(AssistantNotification notification,
                             int32_t action_index) override;
@@ -140,6 +143,8 @@
   std::unique_ptr<assistant::action::CrosActionModule> action_module_;
 
   std::unique_ptr<base::CancelableOnceClosure> stop_interaction_closure_;
+  base::TimeDelta stop_interaction_delay_ =
+      base::TimeDelta::FromMilliseconds(500);
 
   scoped_refptr<base::SequencedTaskRunner> mojom_task_runner_;
   base::WeakPtrFactory<ConversationController> weak_factory_{this};
diff --git a/chromeos/services/libassistant/display_controller.cc b/chromeos/services/libassistant/display_controller.cc
index e42dfc27..5d0f315b 100644
--- a/chromeos/services/libassistant/display_controller.cc
+++ b/chromeos/services/libassistant/display_controller.cc
@@ -72,6 +72,7 @@
 }
 
 void DisplayController::SetDeviceAppsEnabled(bool enabled) {
+  DCHECK(action_module_);
   display_connection_->SetDeviceAppsEnabled(enabled);
 
   DCHECK(action_module_);
diff --git a/chromeos/services/libassistant/libassistant_service.cc b/chromeos/services/libassistant/libassistant_service.cc
index 64e2086..e83fc5b5 100644
--- a/chromeos/services/libassistant/libassistant_service.cc
+++ b/chromeos/services/libassistant/libassistant_service.cc
@@ -62,7 +62,6 @@
       libassistant_factory_(
           FactoryOrDefault(std::move(factory), &platform_api_)),
       service_controller_(libassistant_factory_.get()),
-      conversation_controller_(),
       conversation_state_listener_(
           &speech_recognition_observers_,
           conversation_controller_.conversation_observers(),
diff --git a/chromeos/services/libassistant/public/mojom/BUILD.gn b/chromeos/services/libassistant/public/mojom/BUILD.gn
index 054b678..82944f7 100644
--- a/chromeos/services/libassistant/public/mojom/BUILD.gn
+++ b/chromeos/services/libassistant/public/mojom/BUILD.gn
@@ -36,6 +36,7 @@
     "//services/device/public/mojom",
     "//services/media_session/public/mojom",
     "//services/network/public/mojom",
+    "//ui/accessibility/mojom",
   ]
 
   cpp_typemaps = [
diff --git a/chromeos/services/libassistant/public/mojom/conversation_controller.mojom b/chromeos/services/libassistant/public/mojom/conversation_controller.mojom
index 451e7c84..7e2b648 100644
--- a/chromeos/services/libassistant/public/mojom/conversation_controller.mojom
+++ b/chromeos/services/libassistant/public/mojom/conversation_controller.mojom
@@ -7,6 +7,7 @@
 import "chromeos/services/libassistant/public/mojom/conversation_observer.mojom";
 import "chromeos/services/libassistant/public/mojom/notification_delegate.mojom";
 import "chromeos/services/libassistant/public/mojom/assistant_notification.mojom";
+import "ui/accessibility/mojom/ax_assistant_structure.mojom";
 
 // Interface for controller supporting conversation related functionalities.
 interface ConversationController {
@@ -22,6 +23,12 @@
   // to edit the specified reminder.
   StartEditReminderInteraction(string client_id);
 
+  // Starts a screen context interaction.
+  // |screenshot| contains JPEG data.
+  StartScreenContextInteraction(
+      ax.mojom.AssistantStructure assistant_structure,
+      array<uint8> screenshot);
+
   // Stops the ongoing interaction with a delay to give buffer time to
   // Libassistant when being forcefully stopped.
   StopActiveInteraction(bool cancel_conversation);
diff --git a/chromeos/tast_control.gni b/chromeos/tast_control.gni
index d365fd59..0679e7f9 100644
--- a/chromeos/tast_control.gni
+++ b/chromeos/tast_control.gni
@@ -38,6 +38,9 @@
   # crbug.com/1156006
   "filemanager.DragDrop",
 
+  # crbug.com/1183238
+  "filemanager.DrivefsUI",
+
   # crbug.com/1171146
   "session.LogoutCleanup",
 
diff --git a/components/arc/session/arc_vm_client_adapter_unittest.cc b/components/arc/session/arc_vm_client_adapter_unittest.cc
index 5281dcf..058f7c2 100644
--- a/components/arc/session/arc_vm_client_adapter_unittest.cc
+++ b/components/arc/session/arc_vm_client_adapter_unittest.cc
@@ -1574,49 +1574,6 @@
                      "androidboot.native_bridge=libhoudini.so"));
 }
 
-// Tests that "readahead" mode is used by default.
-TEST_F(ArcVmClientAdapterTest, TestGetArcVmUreadaheadModeDefault) {
-  StartParams start_params(GetPopulatedStartParams());
-  SetValidUserInfo();
-  StartMiniArcWithParams(true, std::move(start_params));
-  EXPECT_TRUE(
-      base::Contains(GetTestConciergeClient()->start_arc_vm_request().params(),
-                     "androidboot.arcvm_ureadahead_mode=readahead"));
-  EXPECT_FALSE(
-      base::Contains(GetTestConciergeClient()->start_arc_vm_request().params(),
-                     "androidboot.arcvm_ureadahead_mode=generate"));
-}
-
-// Tests that the "generate" command line switches the mode.
-TEST_F(ArcVmClientAdapterTest, TestGetArcVmUreadaheadModeGenerate) {
-  base::CommandLine::ForCurrentProcess()->InitFromArgv(
-      {"", "--arcvm-ureadahead-mode=generate"});
-  StartParams start_params(GetPopulatedStartParams());
-  SetValidUserInfo();
-  StartMiniArcWithParams(true, std::move(start_params));
-  EXPECT_FALSE(
-      base::Contains(GetTestConciergeClient()->start_arc_vm_request().params(),
-                     "androidboot.arcvm_ureadahead_mode=readahead"));
-  EXPECT_TRUE(
-      base::Contains(GetTestConciergeClient()->start_arc_vm_request().params(),
-                     "androidboot.arcvm_ureadahead_mode=generate"));
-}
-
-// Tests that the "disabled" command line disables both readahead and generate.
-TEST_F(ArcVmClientAdapterTest, TestGetArcVmUreadaheadModeDisabled) {
-  base::CommandLine::ForCurrentProcess()->InitFromArgv(
-      {"", "--arcvm-ureadahead-mode=disabled"});
-  StartParams start_params(GetPopulatedStartParams());
-  SetValidUserInfo();
-  StartMiniArcWithParams(true, std::move(start_params));
-  EXPECT_FALSE(
-      base::Contains(GetTestConciergeClient()->start_arc_vm_request().params(),
-                     "androidboot.arcvm_ureadahead_mode=readahead"));
-  EXPECT_FALSE(
-      base::Contains(GetTestConciergeClient()->start_arc_vm_request().params(),
-                     "androidboot.arcvm_ureadahead_mode=generate"));
-}
-
 // Tests that ArcVmClientAdapter connects to the boot notification server
 // twice: once in StartMiniArc to check that it is listening, and the second
 // time in UpgradeArc to send props.
diff --git a/components/heavy_ad_intervention/heavy_ad_blocklist.cc b/components/heavy_ad_intervention/heavy_ad_blocklist.cc
index 80be8e55..c72e95c8 100644
--- a/components/heavy_ad_intervention/heavy_ad_blocklist.cc
+++ b/components/heavy_ad_intervention/heavy_ad_blocklist.cc
@@ -11,6 +11,8 @@
 #include "components/blocklist/opt_out_blocklist/opt_out_store.h"
 #include "components/heavy_ad_intervention/heavy_ad_features.h"
 
+namespace heavy_ad_intervention {
+
 namespace {
 
 const char kHostDurationHours[] = "host-duration-hours";
@@ -74,3 +76,5 @@
   return {{static_cast<int>(HeavyAdBlocklistType::kHeavyAdOnlyType),
            GetBlocklistParamValue(kTypeVersion, 0)}};
 }
+
+}  // namespace heavy_ad_intervention
diff --git a/components/heavy_ad_intervention/heavy_ad_blocklist.h b/components/heavy_ad_intervention/heavy_ad_blocklist.h
index 19e6e63..68c1908 100644
--- a/components/heavy_ad_intervention/heavy_ad_blocklist.h
+++ b/components/heavy_ad_intervention/heavy_ad_blocklist.h
@@ -20,6 +20,8 @@
 class OptOutStore;
 }  // namespace blocklist
 
+namespace heavy_ad_intervention {
+
 // The heavy ad intervention only supports one type for the blocklist.
 enum class HeavyAdBlocklistType {
   kHeavyAdOnlyType = 0,
@@ -58,4 +60,6 @@
   DISALLOW_COPY_AND_ASSIGN(HeavyAdBlocklist);
 };
 
+}  // namespace heavy_ad_intervention
+
 #endif  // COMPONENTS_HEAVY_AD_INTERVENTION_HEAVY_AD_BLOCKLIST_H_
diff --git a/components/heavy_ad_intervention/heavy_ad_blocklist_unittest.cc b/components/heavy_ad_intervention/heavy_ad_blocklist_unittest.cc
index e1d77879..2e8bdba 100644
--- a/components/heavy_ad_intervention/heavy_ad_blocklist_unittest.cc
+++ b/components/heavy_ad_intervention/heavy_ad_blocklist_unittest.cc
@@ -18,6 +18,8 @@
 #include "components/variations/variations_associated_data.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
+namespace heavy_ad_intervention {
+
 namespace {
 
 // Empty mock class to test the HeavyAdBlocklist.
@@ -138,3 +140,5 @@
 }
 
 }  // namespace
+
+}  // namespace heavy_ad_intervention
diff --git a/components/heavy_ad_intervention/heavy_ad_features.cc b/components/heavy_ad_intervention/heavy_ad_features.cc
index e87c48b..b748bf4 100644
--- a/components/heavy_ad_intervention/heavy_ad_features.cc
+++ b/components/heavy_ad_intervention/heavy_ad_features.cc
@@ -4,6 +4,8 @@
 
 #include "components/heavy_ad_intervention/heavy_ad_features.h"
 
+namespace heavy_ad_intervention {
+
 namespace features {
 
 const char kHeavyAdReportingOnlyParamName[] = "reporting-only";
@@ -29,3 +31,5 @@
     "HeavyAdPrivacyMitigations", base::FEATURE_ENABLED_BY_DEFAULT};
 
 }  // namespace features
+
+}  // namespace heavy_ad_intervention
diff --git a/components/heavy_ad_intervention/heavy_ad_features.h b/components/heavy_ad_intervention/heavy_ad_features.h
index 2998b52..634b24b 100644
--- a/components/heavy_ad_intervention/heavy_ad_features.h
+++ b/components/heavy_ad_intervention/heavy_ad_features.h
@@ -7,6 +7,8 @@
 
 #include "base/feature_list.h"
 
+namespace heavy_ad_intervention {
+
 namespace features {
 
 // Param that enabled heavy ad intervention with reporting only, does not
@@ -23,4 +25,6 @@
 
 }  // namespace features
 
+}  // namespace heavy_ad_intervention
+
 #endif  // COMPONENTS_HEAVY_AD_INTERVENTION_HEAVY_AD_FEATURES_H_
diff --git a/components/heavy_ad_intervention/heavy_ad_helper.cc b/components/heavy_ad_intervention/heavy_ad_helper.cc
index e81f05c..5f5f7c7 100644
--- a/components/heavy_ad_intervention/heavy_ad_helper.cc
+++ b/components/heavy_ad_intervention/heavy_ad_helper.cc
@@ -15,7 +15,7 @@
 #include "ui/base/webui/jstemplate_builder.h"
 #include "ui/base/webui/web_ui_util.h"
 
-namespace heavy_ads {
+namespace heavy_ad_intervention {
 
 // NOTE: If adding usage of more strings/resources here, make sure that they
 // are allowlisted in //weblayer/grit_{resources, strings}_allowlist.txt;
@@ -62,4 +62,4 @@
   return heavy_ad_html;
 }
 
-}  // namespace heavy_ads
+}  // namespace heavy_ad_intervention
diff --git a/components/heavy_ad_intervention/heavy_ad_helper.h b/components/heavy_ad_intervention/heavy_ad_helper.h
index 7522fbaf..1b80e44 100644
--- a/components/heavy_ad_intervention/heavy_ad_helper.h
+++ b/components/heavy_ad_intervention/heavy_ad_helper.h
@@ -7,12 +7,12 @@
 
 #include <string>
 
-namespace heavy_ads {
+namespace heavy_ad_intervention {
 
 // Returns a string containing HTML of an error page for the heavy ad
 // intervention.
 std::string PrepareHeavyAdPage(const std::string& application_locale);
 
-}  // namespace heavy_ads
+}  // namespace heavy_ad_intervention
 
 #endif  // COMPONENTS_HEAVY_AD_INTERVENTION_HEAVY_AD_HELPER_H_
diff --git a/components/heavy_ad_intervention/heavy_ad_service.cc b/components/heavy_ad_intervention/heavy_ad_service.cc
index cc7cddf..3aa6d16 100644
--- a/components/heavy_ad_intervention/heavy_ad_service.cc
+++ b/components/heavy_ad_intervention/heavy_ad_service.cc
@@ -17,6 +17,8 @@
 #include "content/public/browser/browser_task_traits.h"
 #include "content/public/browser/browser_thread.h"
 
+namespace heavy_ad_intervention {
+
 namespace {
 
 const base::FilePath::CharType kHeavyAdInterventionOptOutDBFilename[] =
@@ -98,3 +100,5 @@
   if (!on_blocklist_cleared_callback_.is_null())
     std::move(on_blocklist_cleared_callback_).Run();
 }
+
+}  // namespace heavy_ad_intervention
diff --git a/components/heavy_ad_intervention/heavy_ad_service.h b/components/heavy_ad_intervention/heavy_ad_service.h
index 2a64431..1c1c9409 100644
--- a/components/heavy_ad_intervention/heavy_ad_service.h
+++ b/components/heavy_ad_intervention/heavy_ad_service.h
@@ -17,6 +17,8 @@
 class FilePath;
 }
 
+namespace heavy_ad_intervention {
+
 class HeavyAdBlocklist;
 
 // Keyed service that owns the heavy ad intervention blocklist.
@@ -61,4 +63,6 @@
   DISALLOW_COPY_AND_ASSIGN(HeavyAdService);
 };
 
+}  // namespace heavy_ad_intervention
+
 #endif  // COMPONENTS_HEAVY_AD_INTERVENTION_HEAVY_AD_SERVICE_H_
diff --git a/components/invalidation/impl/profile_identity_provider.cc b/components/invalidation/impl/profile_identity_provider.cc
index 1778857cd..30c0d2e 100644
--- a/components/invalidation/impl/profile_identity_provider.cc
+++ b/components/invalidation/impl/profile_identity_provider.cc
@@ -63,8 +63,8 @@
     : identity_manager_(identity_manager) {
   identity_manager_->AddObserver(this);
 
-  active_account_id_ = identity_manager_->GetPrimaryAccountId(
-      signin::ConsentLevel::kNotRequired);
+  active_account_id_ =
+      identity_manager_->GetPrimaryAccountId(signin::ConsentLevel::kSignin);
 }
 
 ProfileIdentityProvider::~ProfileIdentityProvider() {
diff --git a/components/omnibox/browser/local_history_zero_suggest_provider.cc b/components/omnibox/browser/local_history_zero_suggest_provider.cc
index c4cccf2..b73524d 100644
--- a/components/omnibox/browser/local_history_zero_suggest_provider.cc
+++ b/components/omnibox/browser/local_history_zero_suggest_provider.cc
@@ -202,7 +202,7 @@
 bool LocalHistoryZeroSuggestProvider::IsSignedIn() {
   const auto* identity_manager = client_->GetIdentityManager();
   return identity_manager ? identity_manager->HasPrimaryAccount(
-                                signin::ConsentLevel::kNotRequired)
+                                signin::ConsentLevel::kSignin)
                           : false;
 }
 
diff --git a/components/page_load_metrics/browser/metrics_web_contents_observer.cc b/components/page_load_metrics/browser/metrics_web_contents_observer.cc
index 42d7723..6b2db038 100644
--- a/components/page_load_metrics/browser/metrics_web_contents_observer.cc
+++ b/components/page_load_metrics/browser/metrics_web_contents_observer.cc
@@ -138,15 +138,16 @@
 }
 
 void MetricsWebContentsObserver::FrameDeleted(content::RenderFrameHost* rfh) {
-  if (auto* memory_tracker = GetMemoryTracker())
-    memory_tracker->OnFrameDeleted(rfh, this);
-
   if (committed_load_)
-    committed_load_->FrameDeleted(rfh);
+    committed_load_->FrameDeleted(rfh->GetFrameTreeNodeId());
 }
 
 void MetricsWebContentsObserver::RenderFrameDeleted(
     content::RenderFrameHost* rfh) {
+  if (auto* memory_tracker = GetMemoryTracker())
+    memory_tracker->OnRenderFrameDeleted(rfh, this);
+  if (committed_load_)
+    committed_load_->RenderFrameDeleted(rfh);
   // PageLoadTracker can be associated only with a main frame.
   if (rfh->GetParent())
     return;
diff --git a/components/page_load_metrics/browser/observers/ad_metrics/ads_page_load_metrics_observer.cc b/components/page_load_metrics/browser/observers/ad_metrics/ads_page_load_metrics_observer.cc
index df9d203..600ddd9 100644
--- a/components/page_load_metrics/browser/observers/ad_metrics/ads_page_load_metrics_observer.cc
+++ b/components/page_load_metrics/browser/observers/ad_metrics/ads_page_load_metrics_observer.cc
@@ -168,7 +168,7 @@
 std::unique_ptr<AdsPageLoadMetricsObserver>
 AdsPageLoadMetricsObserver::CreateIfNeeded(
     content::WebContents* web_contents,
-    HeavyAdService* heavy_ad_service,
+    heavy_ad_intervention::HeavyAdService* heavy_ad_service,
     const ApplicationLocaleGetter& application_locale_getter) {
   if (!base::FeatureList::IsEnabled(subresource_filter::kAdTagging) ||
       !subresource_filter::ContentSubresourceFilterThrottleManager::
@@ -229,10 +229,10 @@
 }
 
 AdsPageLoadMetricsObserver::AdsPageLoadMetricsObserver(
-    HeavyAdService* heavy_ad_service,
+    heavy_ad_intervention::HeavyAdService* heavy_ad_service,
     const ApplicationLocaleGetter& application_locale_getter,
     base::TickClock* clock,
-    HeavyAdBlocklist* blocklist)
+    heavy_ad_intervention::HeavyAdBlocklist* blocklist)
     : subresource_observer_(this),
       clock_(clock ? clock : base::DefaultTickClock::GetInstance()),
       restricted_navigation_ad_tagging_enabled_(base::FeatureList::IsEnabled(
@@ -240,8 +240,8 @@
       heavy_ad_service_(heavy_ad_service),
       application_locale_getter_(application_locale_getter),
       heavy_ad_blocklist_(blocklist),
-      heavy_ad_privacy_mitigations_enabled_(
-          base::FeatureList::IsEnabled(features::kHeavyAdPrivacyMitigations)),
+      heavy_ad_privacy_mitigations_enabled_(base::FeatureList::IsEnabled(
+          heavy_ad_intervention::features::kHeavyAdPrivacyMitigations)),
       heavy_ad_threshold_noise_provider_(
           std::make_unique<HeavyAdThresholdNoiseProvider>(
               heavy_ad_privacy_mitigations_enabled_ /* use_noise */)) {
@@ -654,13 +654,8 @@
 #endif
 }
 
-void AdsPageLoadMetricsObserver::OnFrameDeleted(
-    content::RenderFrameHost* render_frame_host) {
-  if (!render_frame_host)
-    return;
-
-  const auto& id_and_data =
-      ad_frames_data_.find(render_frame_host->GetFrameTreeNodeId());
+void AdsPageLoadMetricsObserver::OnFrameDeleted(int frame_tree_node_id) {
+  const auto& id_and_data = ad_frames_data_.find(frame_tree_node_id);
   if (id_and_data == ad_frames_data_.end())
     return;
 
@@ -1279,7 +1274,8 @@
     blocklist->AddEntry(
         GetDelegate().GetWebContents()->GetLastCommittedURL().host(),
         true /* opt_out */,
-        static_cast<int>(HeavyAdBlocklistType::kHeavyAdOnlyType));
+        static_cast<int>(
+            heavy_ad_intervention::HeavyAdBlocklistType::kHeavyAdOnlyType));
     // Once we report, we need to check and see if we are now blocklisted.
     // If we are, then we might trigger stricter interventions.
     // TODO(ericrobinson): This does a couple fetches of the blocklist.  It
@@ -1316,7 +1312,8 @@
 
   GetDelegate().GetWebContents()->GetController().LoadPostCommitErrorPage(
       render_frame_host, render_frame_host->GetLastCommittedURL(),
-      heavy_ads::PrepareHeavyAdPage(application_locale_getter_.Run()),
+      heavy_ad_intervention::PrepareHeavyAdPage(
+          application_locale_getter_.Run()),
       net::ERR_BLOCKED_BY_CLIENT);
 }
 
@@ -1340,7 +1337,8 @@
     std::vector<blocklist::BlocklistReason> passed_reasons;
     heavy_ads_blocklist_reason_ = blocklist->IsLoadedAndAllowed(
         GetDelegate().GetWebContents()->GetLastCommittedURL().host(),
-        static_cast<int>(HeavyAdBlocklistType::kHeavyAdOnlyType),
+        static_cast<int>(
+            heavy_ad_intervention::HeavyAdBlocklistType::kHeavyAdOnlyType),
         false /* opt_out */, &passed_reasons);
   }
 
@@ -1353,7 +1351,8 @@
   return heavy_ads_blocklist_reason_ != blocklist::BlocklistReason::kAllowed;
 }
 
-HeavyAdBlocklist* AdsPageLoadMetricsObserver::GetHeavyAdBlocklist() {
+heavy_ad_intervention::HeavyAdBlocklist*
+AdsPageLoadMetricsObserver::GetHeavyAdBlocklist() {
   if (heavy_ad_blocklist_)
     return heavy_ad_blocklist_;
   if (!heavy_ad_service_)
diff --git a/components/page_load_metrics/browser/observers/ad_metrics/ads_page_load_metrics_observer.h b/components/page_load_metrics/browser/observers/ad_metrics/ads_page_load_metrics_observer.h
index 7946743..6722b0d 100644
--- a/components/page_load_metrics/browser/observers/ad_metrics/ads_page_load_metrics_observer.h
+++ b/components/page_load_metrics/browser/observers/ad_metrics/ads_page_load_metrics_observer.h
@@ -34,8 +34,10 @@
 extern const base::Feature kRestrictedNavigationAdTagging;
 }
 
+namespace heavy_ad_intervention {
 class HeavyAdBlocklist;
 class HeavyAdService;
+}  // namespace heavy_ad_intervention
 
 // This observer labels each sub-frame as an ad or not, and keeps track of
 // relevant per-frame and whole-page byte statistics.
@@ -76,7 +78,7 @@
   // returns nullptr.
   static std::unique_ptr<AdsPageLoadMetricsObserver> CreateIfNeeded(
       content::WebContents* web_contents,
-      HeavyAdService* heavy_ad_service,
+      heavy_ad_intervention::HeavyAdService* heavy_ad_service,
       const ApplicationLocaleGetter& application_local_getter);
 
   // For a given subframe, returns whether or not the subframe's url would be
@@ -87,10 +89,10 @@
   // |clock| and |blocklist| should be set only by tests. In particular,
   // |blocklist| should be set only if |heavy_ad_service| is null.
   explicit AdsPageLoadMetricsObserver(
-      HeavyAdService* heavy_ad_service,
+      heavy_ad_intervention::HeavyAdService* heavy_ad_service,
       const ApplicationLocaleGetter& application_local_getter,
       base::TickClock* clock = nullptr,
-      HeavyAdBlocklist* blocklist = nullptr);
+      heavy_ad_intervention::HeavyAdBlocklist* blocklist = nullptr);
   ~AdsPageLoadMetricsObserver() override;
 
   // page_load_metrics::PageLoadMetricsObserver
@@ -129,7 +131,7 @@
       content::RenderFrameHost* render_frame_host,
       const page_load_metrics::mojom::FrameIntersectionUpdate&
           intersection_update) override;
-  void OnFrameDeleted(content::RenderFrameHost* render_frame_host) override;
+  void OnFrameDeleted(int frame_tree_node_id) override;
 
   void SetHeavyAdThresholdNoiseProviderForTesting(
       std::unique_ptr<HeavyAdThresholdNoiseProvider> noise_provider) {
@@ -252,7 +254,7 @@
       FrameTreeData* frame_data);
 
   bool IsBlocklisted(bool report);
-  HeavyAdBlocklist* GetHeavyAdBlocklist();
+  heavy_ad_intervention::HeavyAdBlocklist* GetHeavyAdBlocklist();
 
   // Maps a frame (by id) to the corresponding FrameInstance. Multiple frame ids
   // can point to the same underlying FrameTreeData. The responsible frame is
@@ -305,13 +307,13 @@
 
   // Pointer to the HeavyAdService from which the heavy ad blocklist is obtained
   // in production.
-  HeavyAdService* heavy_ad_service_;
+  heavy_ad_intervention::HeavyAdService* heavy_ad_service_;
 
   ApplicationLocaleGetter application_locale_getter_;
 
   // Pointer to the blocklist used to throttle the heavy ad intervention. Can
   // be replaced by tests.
-  HeavyAdBlocklist* heavy_ad_blocklist_;
+  heavy_ad_intervention::HeavyAdBlocklist* heavy_ad_blocklist_;
 
   // Whether the heavy ad privacy mitigations feature is enabled.
   const bool heavy_ad_privacy_mitigations_enabled_;
diff --git a/components/page_load_metrics/browser/observers/ad_metrics/ads_page_load_metrics_observer_unittest.cc b/components/page_load_metrics/browser/observers/ad_metrics/ads_page_load_metrics_observer_unittest.cc
index 1f576d2d..007eb1d 100644
--- a/components/page_load_metrics/browser/observers/ad_metrics/ads_page_load_metrics_observer_unittest.cc
+++ b/components/page_load_metrics/browser/observers/ad_metrics/ads_page_load_metrics_observer_unittest.cc
@@ -446,10 +446,11 @@
       public blocklist::OptOutBlocklistDelegate {
  public:
   AdsPageLoadMetricsObserverTest()
-      : test_blocklist_(std::make_unique<HeavyAdBlocklist>(
-            nullptr,
-            base::DefaultClock::GetInstance(),
-            this)) {}
+      : test_blocklist_(
+            std::make_unique<heavy_ad_intervention::HeavyAdBlocklist>(
+                nullptr,
+                base::DefaultClock::GetInstance(),
+                this)) {}
 
   void SetUp() override {
     SubresourceFilterTestHarness::SetUp();
@@ -739,7 +740,9 @@
     return test_ukm_recorder_;
   }
 
-  HeavyAdBlocklist* blocklist() { return test_blocklist_.get(); }
+  heavy_ad_intervention::HeavyAdBlocklist* blocklist() {
+    return test_blocklist_.get();
+  }
 
   // Flushes all intervention report messages and returns a bool if there was
   // a message.
@@ -833,7 +836,7 @@
     }
   }
 
-  std::unique_ptr<HeavyAdBlocklist> test_blocklist_;
+  std::unique_ptr<heavy_ad_intervention::HeavyAdBlocklist> test_blocklist_;
   base::HistogramTester histogram_tester_;
   ukm::TestAutoSetUkmRecorder test_ukm_recorder_;
   std::unique_ptr<page_load_metrics::PageLoadMetricsObserverTester> tester_;
@@ -1988,8 +1991,9 @@
 // computed heavy ad types for ad frames
 TEST_F(AdsPageLoadMetricsObserverTest, HeavyAdFeatureOff_UMARecorded) {
   base::test::ScopedFeatureList feature_list;
-  feature_list.InitWithFeatures({}, {features::kHeavyAdIntervention,
-                                     features::kHeavyAdInterventionWarning});
+  feature_list.InitWithFeatures(
+      {}, {heavy_ad_intervention::features::kHeavyAdIntervention,
+           heavy_ad_intervention::features::kHeavyAdInterventionWarning});
   OverrideVisibilityTrackerWithMockClock();
 
   RenderFrameHost* main_frame = NavigateMainFrame(kNonAdUrl);
@@ -2069,7 +2073,8 @@
 
 TEST_F(AdsPageLoadMetricsObserverTest, HeavyAdNetworkUsage_InterventionFired) {
   base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndEnableFeature(features::kHeavyAdIntervention);
+  feature_list.InitAndEnableFeature(
+      heavy_ad_intervention::features::kHeavyAdIntervention);
 
   RenderFrameHost* main_frame = NavigateMainFrame(kNonAdUrl);
   RenderFrameHost* ad_frame = CreateAndNavigateSubFrame(kAdUrl, main_frame);
@@ -2125,7 +2130,8 @@
 // record histograms, but continue to monitor for CPU heavy ad interventions.
 TEST_F(AdsPageLoadMetricsObserverTest, HeavyAdCpuInterventionInBackground) {
   base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndEnableFeature(features::kHeavyAdIntervention);
+  feature_list.InitAndEnableFeature(
+      heavy_ad_intervention::features::kHeavyAdIntervention);
   OverrideVisibilityTrackerWithMockClock();
 
   RenderFrameHost* main_frame = NavigateMainFrame(kNonAdUrl);
@@ -2175,7 +2181,8 @@
 TEST_F(AdsPageLoadMetricsObserverTest,
        HeavyAdNetworkInterventionInBackgrounded) {
   base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndEnableFeature(features::kHeavyAdIntervention);
+  feature_list.InitAndEnableFeature(
+      heavy_ad_intervention::features::kHeavyAdIntervention);
 
   RenderFrameHost* main_frame = NavigateMainFrame(kNonAdUrl);
   RenderFrameHost* ad_frame = CreateAndNavigateSubFrame(kAdUrl, main_frame);
@@ -2220,7 +2227,8 @@
 TEST_F(AdsPageLoadMetricsObserverTest,
        HeavyAdNetworkUsageWithNoise_InterventionFired) {
   base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndEnableFeature(features::kHeavyAdIntervention);
+  feature_list.InitAndEnableFeature(
+      heavy_ad_intervention::features::kHeavyAdIntervention);
 
   RenderFrameHost* main_frame = NavigateMainFrame(kNonAdUrl);
 
@@ -2273,7 +2281,8 @@
 TEST_F(AdsPageLoadMetricsObserverTest,
        HeavyAdNetworkUsageLessThanNoisedThreshold_NotFired) {
   base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndEnableFeature(features::kHeavyAdIntervention);
+  feature_list.InitAndEnableFeature(
+      heavy_ad_intervention::features::kHeavyAdIntervention);
 
   RenderFrameHost* main_frame = NavigateMainFrame(kNonAdUrl);
 
@@ -2299,7 +2308,8 @@
 TEST_F(AdsPageLoadMetricsObserverTest,
        HeavyAdNetworkUsageLessThanNoisedThreshold_CpuTriggers) {
   base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndEnableFeature(features::kHeavyAdIntervention);
+  feature_list.InitAndEnableFeature(
+      heavy_ad_intervention::features::kHeavyAdIntervention);
   OverrideVisibilityTrackerWithMockClock();
 
   RenderFrameHost* main_frame = NavigateMainFrame(kNonAdUrl);
@@ -2353,7 +2363,8 @@
 
 TEST_F(AdsPageLoadMetricsObserverTest, HeavyAdTotalCpuUsage_InterventionFired) {
   base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndEnableFeature(features::kHeavyAdIntervention);
+  feature_list.InitAndEnableFeature(
+      heavy_ad_intervention::features::kHeavyAdIntervention);
   OverrideVisibilityTrackerWithMockClock();
 
   RenderFrameHost* main_frame = NavigateMainFrame(kNonAdUrl);
@@ -2394,7 +2405,8 @@
 
 TEST_F(AdsPageLoadMetricsObserverTest, HeavyAdPeakCpuUsage_InterventionFired) {
   base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndEnableFeature(features::kHeavyAdIntervention);
+  feature_list.InitAndEnableFeature(
+      heavy_ad_intervention::features::kHeavyAdIntervention);
   OverrideVisibilityTrackerWithMockClock();
 
   RenderFrameHost* main_frame = NavigateMainFrame(kNonAdUrl);
@@ -2439,8 +2451,9 @@
 
 TEST_F(AdsPageLoadMetricsObserverTest, HeavyAdFeatureDisabled_NotFired) {
   base::test::ScopedFeatureList feature_list;
-  feature_list.InitWithFeatures({}, {features::kHeavyAdIntervention,
-                                     features::kHeavyAdInterventionWarning});
+  feature_list.InitWithFeatures(
+      {}, {heavy_ad_intervention::features::kHeavyAdIntervention,
+           heavy_ad_intervention::features::kHeavyAdInterventionWarning});
 
   RenderFrameHost* main_frame = NavigateMainFrame(kNonAdUrl);
   RenderFrameHost* ad_frame = CreateAndNavigateSubFrame(kAdUrl, main_frame);
@@ -2459,7 +2472,8 @@
 TEST_F(AdsPageLoadMetricsObserverTest,
        HeavyAdWithUserGesture_NotConsideredHeavy) {
   base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndEnableFeature(features::kHeavyAdIntervention);
+  feature_list.InitAndEnableFeature(
+      heavy_ad_intervention::features::kHeavyAdIntervention);
 
   RenderFrameHost* main_frame = NavigateMainFrame(kNonAdUrl);
   RenderFrameHost* ad_frame = CreateAndNavigateSubFrame(kAdUrl, main_frame);
@@ -2523,7 +2537,8 @@
         test_case.exceed_cpu, test_case.intervention_expected));
     base::test::ScopedFeatureList feature_list;
     feature_list.InitAndEnableFeatureWithParameters(
-        features::kHeavyAdIntervention, {{"kUnloadPolicy", test_case.policy}});
+        heavy_ad_intervention::features::kHeavyAdIntervention,
+        {{"kUnloadPolicy", test_case.policy}});
     RenderFrameHost* main_frame = NavigateMainFrame(kNonAdUrl);
     RenderFrameHost* ad_frame = CreateAndNavigateSubFrame(kAdUrl, main_frame);
     // Clear out any pending messages.
@@ -2554,7 +2569,8 @@
 TEST_F(AdsPageLoadMetricsObserverTest,
        HeavyAdPageNavigated_FrameMarkedAsNotRemoved) {
   base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndEnableFeature(features::kHeavyAdIntervention);
+  feature_list.InitAndEnableFeature(
+      heavy_ad_intervention::features::kHeavyAdIntervention);
 
   RenderFrameHost* main_frame = NavigateMainFrame(kNonAdUrl);
   RenderFrameHost* ad_frame = CreateAndNavigateSubFrame(kAdUrl, main_frame);
@@ -2572,8 +2588,9 @@
 TEST_F(AdsPageLoadMetricsObserverTest,
        HeavyAdFrameRemoved_FrameMarkedAsRemoved) {
   base::test::ScopedFeatureList feature_list;
-  feature_list.InitWithFeatures({}, {features::kHeavyAdIntervention,
-                                     features::kHeavyAdInterventionWarning});
+  feature_list.InitWithFeatures(
+      {}, {heavy_ad_intervention::features::kHeavyAdIntervention,
+           heavy_ad_intervention::features::kHeavyAdInterventionWarning});
 
   RenderFrameHost* main_frame = NavigateMainFrame(kNonAdUrl);
   RenderFrameHost* ad_frame = CreateAndNavigateSubFrame(kAdUrl, main_frame);
@@ -2594,7 +2611,8 @@
 // Verifies when a user reloads a page with a heavy ad we log it to metrics.
 TEST_F(AdsPageLoadMetricsObserverTest, HeavyAdPageReload_MetricsRecorded) {
   base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndEnableFeature(features::kHeavyAdIntervention);
+  feature_list.InitAndEnableFeature(
+      heavy_ad_intervention::features::kHeavyAdIntervention);
 
   RenderFrameHost* main_frame = NavigateMainFrame(kNonAdUrl);
   RenderFrameHost* ad_frame = CreateAndNavigateSubFrame(kAdUrl, main_frame);
@@ -2617,7 +2635,8 @@
 // intevention.
 TEST_F(AdsPageLoadMetricsObserverTest, HeavyAdPageReload_InterventionIgnored) {
   base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndEnableFeature(features::kHeavyAdIntervention);
+  feature_list.InitAndEnableFeature(
+      heavy_ad_intervention::features::kHeavyAdIntervention);
 
   RenderFrameHost* main_frame = NavigateMainFrame(kNonAdUrl);
 
@@ -2645,8 +2664,9 @@
 TEST_F(AdsPageLoadMetricsObserverTest,
        HeavyAdPageReloadPrivacyMitigationsDisabled_InterventionAllowed) {
   base::test::ScopedFeatureList feature_list;
-  feature_list.InitWithFeatures({features::kHeavyAdIntervention},
-                                {features::kHeavyAdPrivacyMitigations});
+  feature_list.InitWithFeatures(
+      {heavy_ad_intervention::features::kHeavyAdIntervention},
+      {heavy_ad_intervention::features::kHeavyAdPrivacyMitigations});
 
   RenderFrameHost* main_frame = NavigateMainFrame(kNonAdUrl);
 
@@ -2673,7 +2693,8 @@
 TEST_F(AdsPageLoadMetricsObserverTest,
        HeavyAdsNoHeavyAdFrame_AggregateHistogramsNotRecorded) {
   base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndEnableFeature(features::kHeavyAdIntervention);
+  feature_list.InitAndEnableFeature(
+      heavy_ad_intervention::features::kHeavyAdIntervention);
 
   RenderFrameHost* main_frame = NavigateMainFrame(kNonAdUrl);
   RenderFrameHost* ad_frame = CreateAndNavigateSubFrame(kAdUrl, main_frame);
@@ -2691,7 +2712,8 @@
 
 TEST_F(AdsPageLoadMetricsObserverTest, HeavyAdBlocklistFull_NotFired) {
   base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndEnableFeature(features::kHeavyAdIntervention);
+  feature_list.InitAndEnableFeature(
+      heavy_ad_intervention::features::kHeavyAdIntervention);
 
   // Five interventions are allowed to occur, per origin per day. Add five
   // entries to the blocklist.
@@ -2712,8 +2734,9 @@
 TEST_F(AdsPageLoadMetricsObserverTest,
        HeavyAdBlocklistDisabled_InterventionNotBlocked) {
   base::test::ScopedFeatureList feature_list;
-  feature_list.InitWithFeatures({features::kHeavyAdIntervention},
-                                {features::kHeavyAdPrivacyMitigations});
+  feature_list.InitWithFeatures(
+      {heavy_ad_intervention::features::kHeavyAdIntervention},
+      {heavy_ad_intervention::features::kHeavyAdPrivacyMitigations});
 
   // Fill up the blocklist to verify the blocklist logic is correctly ignored
   // when disabled.
@@ -2751,7 +2774,8 @@
 
 TEST_F(AdsPageLoadMetricsObserverTest, HeavyAdBlocklist_InterventionReported) {
   base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndEnableFeature(features::kHeavyAdIntervention);
+  feature_list.InitAndEnableFeature(
+      heavy_ad_intervention::features::kHeavyAdIntervention);
 
   // Five interventions are allowed to occur, per origin per day. Add four
   // entries to the blocklist.
@@ -2791,8 +2815,9 @@
 TEST_F(AdsPageLoadMetricsObserverTest,
        HeavyAdReportingOnly_ReportSentNoUnload) {
   base::test::ScopedFeatureList feature_list;
-  feature_list.InitWithFeatures({features::kHeavyAdInterventionWarning},
-                                {features::kHeavyAdIntervention});
+  feature_list.InitWithFeatures(
+      {heavy_ad_intervention::features::kHeavyAdInterventionWarning},
+      {heavy_ad_intervention::features::kHeavyAdIntervention});
 
   RenderFrameHost* main_frame = NavigateMainFrame(kNonAdUrl);
   RenderFrameHost* ad_frame = CreateAndNavigateSubFrame(kAdUrl, main_frame);
diff --git a/components/page_load_metrics/browser/observers/ad_metrics/frame_tree_data.cc b/components/page_load_metrics/browser/observers/ad_metrics/frame_tree_data.cc
index ad89fdd..22c3d33 100644
--- a/components/page_load_metrics/browser/observers/ad_metrics/frame_tree_data.cc
+++ b/components/page_load_metrics/browser/observers/ad_metrics/frame_tree_data.cc
@@ -29,7 +29,7 @@
 
 // Controls what types of heavy ads will be unloaded by the intervention.
 const base::FeatureParam<int> kHeavyAdUnloadPolicyParam = {
-    &features::kHeavyAdIntervention, "kUnloadPolicy",
+    &heavy_ad_intervention::features::kHeavyAdIntervention, "kUnloadPolicy",
     static_cast<int>(ad_metrics::HeavyAdUnloadPolicy::kAll)};
 
 }  // namespace
@@ -300,10 +300,12 @@
   // Only check if the feature is enabled once we have a heavy ad. This is done
   // to ensure that any experiment for this feature will only be comparing
   // groups who have seen a heavy ad.
-  if (!base::FeatureList::IsEnabled(features::kHeavyAdIntervention)) {
+  if (!base::FeatureList::IsEnabled(
+          heavy_ad_intervention::features::kHeavyAdIntervention)) {
     // If the intervention is not enabled, we return whether reporting is
     // enabled.
-    return base::FeatureList::IsEnabled(features::kHeavyAdInterventionWarning)
+    return base::FeatureList::IsEnabled(
+               heavy_ad_intervention::features::kHeavyAdInterventionWarning)
                ? HeavyAdAction::kReport
                : HeavyAdAction::kNone;
   }
diff --git a/components/page_load_metrics/browser/observers/core/largest_contentful_paint_handler.cc b/components/page_load_metrics/browser/observers/core/largest_contentful_paint_handler.cc
index 98b36bab..68a9eb654 100644
--- a/components/page_load_metrics/browser/observers/core/largest_contentful_paint_handler.cc
+++ b/components/page_load_metrics/browser/observers/core/largest_contentful_paint_handler.cc
@@ -292,10 +292,8 @@
       navigation_handle->GetFrameTreeNodeId(), navigation_delta));
 }
 
-void LargestContentfulPaintHandler::OnFrameDeleted(
-    content::RenderFrameHost* render_frame_host) {
-  subframe_navigation_start_offset_.erase(
-      render_frame_host->GetFrameTreeNodeId());
+void LargestContentfulPaintHandler::OnFrameDeleted(int frame_tree_node_id) {
+  subframe_navigation_start_offset_.erase(frame_tree_node_id);
 }
 
 void LargestContentfulPaintHandler::MergeForSubframes(
diff --git a/components/page_load_metrics/browser/observers/core/largest_contentful_paint_handler.h b/components/page_load_metrics/browser/observers/core/largest_contentful_paint_handler.h
index 9346543b..4dac00b 100644
--- a/components/page_load_metrics/browser/observers/core/largest_contentful_paint_handler.h
+++ b/components/page_load_metrics/browser/observers/core/largest_contentful_paint_handler.h
@@ -132,7 +132,7 @@
   void OnDidFinishSubFrameNavigation(
       content::NavigationHandle* navigation_handle,
       base::TimeTicks navigation_start);
-  void OnFrameDeleted(content::RenderFrameHost* render_frame_host);
+  void OnFrameDeleted(int frame_tree_node_id);
 
  private:
   void RecordSubframeTiming(
diff --git a/components/page_load_metrics/browser/page_load_metrics_memory_tracker.cc b/components/page_load_metrics/browser/page_load_metrics_memory_tracker.cc
index 4850195..09607a5 100644
--- a/components/page_load_metrics/browser/page_load_metrics_memory_tracker.cc
+++ b/components/page_load_metrics/browser/page_load_metrics_memory_tracker.cc
@@ -129,7 +129,7 @@
   }
 }
 
-void PageLoadMetricsMemoryTracker::OnFrameDeleted(
+void PageLoadMetricsMemoryTracker::OnRenderFrameDeleted(
     content::RenderFrameHost* render_frame_host,
     MetricsWebContentsObserver* observer) {
   DCHECK(render_frame_host);
diff --git a/components/page_load_metrics/browser/page_load_metrics_memory_tracker.h b/components/page_load_metrics/browser/page_load_metrics_memory_tracker.h
index 6729018..7be82ec 100644
--- a/components/page_load_metrics/browser/page_load_metrics_memory_tracker.h
+++ b/components/page_load_metrics/browser/page_load_metrics_memory_tracker.h
@@ -46,8 +46,8 @@
           FrameDataMap& frame_data) override;
 
   // Removes the entry for a deleted frame from `per_frame_memory_usage_map_`.
-  void OnFrameDeleted(content::RenderFrameHost* render_frame_host,
-                      MetricsWebContentsObserver* observer);
+  void OnRenderFrameDeleted(content::RenderFrameHost* render_frame_host,
+                            MetricsWebContentsObserver* observer);
 
  private:
   int64_t UpdateMemoryUsageAndGetDelta(
diff --git a/components/page_load_metrics/browser/page_load_metrics_observer.h b/components/page_load_metrics/browser/page_load_metrics_observer.h
index 26b921a..83bb21fd 100644
--- a/components/page_load_metrics/browser/page_load_metrics_observer.h
+++ b/components/page_load_metrics/browser/page_load_metrics_observer.h
@@ -528,7 +528,9 @@
   virtual void FrameSizeChanged(content::RenderFrameHost* render_frame_host,
                                 const gfx::Size& frame_size) {}
 
-  virtual void OnFrameDeleted(content::RenderFrameHost* render_frame_host) {}
+  virtual void OnRenderFrameDeleted(
+      content::RenderFrameHost* render_frame_host) {}
+  virtual void OnFrameDeleted(int frame_tree_node_id) {}
 
   // Called when a cookie is read for a resource request or by document.cookie.
   virtual void OnCookiesRead(const GURL& url,
diff --git a/components/page_load_metrics/browser/page_load_metrics_update_dispatcher.cc b/components/page_load_metrics/browser/page_load_metrics_update_dispatcher.cc
index ac123f1..53b357b4 100644
--- a/components/page_load_metrics/browser/page_load_metrics_update_dispatcher.cc
+++ b/components/page_load_metrics/browser/page_load_metrics_update_dispatcher.cc
@@ -566,10 +566,8 @@
       navigation_handle->GetFrameTreeNodeId(), navigation_delta));
 }
 
-void PageLoadMetricsUpdateDispatcher::OnFrameDeleted(
-    content::RenderFrameHost* render_frame_host) {
-  subframe_navigation_start_offset_.erase(
-      render_frame_host->GetFrameTreeNodeId());
+void PageLoadMetricsUpdateDispatcher::OnFrameDeleted(int frame_tree_node_id) {
+  subframe_navigation_start_offset_.erase(frame_tree_node_id);
 }
 
 void PageLoadMetricsUpdateDispatcher::UpdateSubFrameTiming(
diff --git a/components/page_load_metrics/browser/page_load_metrics_update_dispatcher.h b/components/page_load_metrics/browser/page_load_metrics_update_dispatcher.h
index eb74cf4..8f619d1 100644
--- a/components/page_load_metrics/browser/page_load_metrics_update_dispatcher.h
+++ b/components/page_load_metrics/browser/page_load_metrics_update_dispatcher.h
@@ -173,7 +173,7 @@
   void DidFinishSubFrameNavigation(
       content::NavigationHandle* navigation_handle);
 
-  void OnFrameDeleted(content::RenderFrameHost* render_frame_host);
+  void OnFrameDeleted(int frame_tree_node_id);
 
   void ShutDown();
 
diff --git a/components/page_load_metrics/browser/page_load_tracker.cc b/components/page_load_metrics/browser/page_load_tracker.cc
index 846cfaa1..f89ce8b 100644
--- a/components/page_load_metrics/browser/page_load_tracker.cc
+++ b/components/page_load_metrics/browser/page_load_tracker.cc
@@ -402,11 +402,17 @@
   INVOKE_AND_PRUNE_OBSERVERS(observers_, OnShown);
 }
 
-void PageLoadTracker::FrameDeleted(content::RenderFrameHost* rfh) {
-  metrics_update_dispatcher_.OnFrameDeleted(rfh);
-  largest_contentful_paint_handler_.OnFrameDeleted(rfh);
+void PageLoadTracker::FrameDeleted(int frame_tree_node_id) {
+  metrics_update_dispatcher_.OnFrameDeleted(frame_tree_node_id);
+  largest_contentful_paint_handler_.OnFrameDeleted(frame_tree_node_id);
   for (const auto& observer : observers_) {
-    observer->OnFrameDeleted(rfh);
+    observer->OnFrameDeleted(frame_tree_node_id);
+  }
+}
+
+void PageLoadTracker::RenderFrameDeleted(content::RenderFrameHost* rfh) {
+  for (const auto& observer : observers_) {
+    observer->OnRenderFrameDeleted(rfh);
   }
 }
 
diff --git a/components/page_load_metrics/browser/page_load_tracker.h b/components/page_load_metrics/browser/page_load_tracker.h
index d814a9b..d1f7f84b 100644
--- a/components/page_load_metrics/browser/page_load_tracker.h
+++ b/components/page_load_metrics/browser/page_load_tracker.h
@@ -257,7 +257,8 @@
                              base::TimeTicks failed_load_time);
   void PageHidden();
   void PageShown();
-  void FrameDeleted(content::RenderFrameHost* rfh);
+  void RenderFrameDeleted(content::RenderFrameHost* rfh);
+  void FrameDeleted(int frame_tree_node_id);
 
   void OnInputEvent(const blink::WebInputEvent& event);
 
diff --git a/components/password_manager/core/browser/leak_detection/authenticated_leak_check.cc b/components/password_manager/core/browser/leak_detection/authenticated_leak_check.cc
index 433e797..9848f28b 100644
--- a/components/password_manager/core/browser/leak_detection/authenticated_leak_check.cc
+++ b/components/password_manager/core/browser/leak_detection/authenticated_leak_check.cc
@@ -164,13 +164,12 @@
 // static
 bool AuthenticatedLeakCheck::HasAccountForRequest(
     const signin::IdentityManager* identity_manager) {
-  // On desktop HasPrimaryAccount(signin::ConsentLevel::kNotRequired) will
+  // On desktop HasPrimaryAccount(signin::ConsentLevel::kSignin) will
   // always return something if the user is signed in.
   // On Android it will be empty if the user isn't syncing. Thus,
   // GetAccountsWithRefreshTokens() check is necessary.
   return identity_manager &&
-         (identity_manager->HasPrimaryAccount(
-              signin::ConsentLevel::kNotRequired) ||
+         (identity_manager->HasPrimaryAccount(signin::ConsentLevel::kSignin) ||
           !identity_manager->GetAccountsWithRefreshTokens().empty());
 }
 
diff --git a/components/password_manager/core/browser/leak_detection/leak_detection_request_utils.cc b/components/password_manager/core/browser/leak_detection/leak_detection_request_utils.cc
index 9e529d3..5e98848 100644
--- a/components/password_manager/core/browser/leak_detection/leak_detection_request_utils.cc
+++ b/components/password_manager/core/browser/leak_detection/leak_detection_request_utils.cc
@@ -31,8 +31,8 @@
 // Returns a Google account that can be used for getting a token.
 CoreAccountId GetAccountForRequest(
     const signin::IdentityManager* identity_manager) {
-  CoreAccountInfo result = identity_manager->GetPrimaryAccountInfo(
-      signin::ConsentLevel::kNotRequired);
+  CoreAccountInfo result =
+      identity_manager->GetPrimaryAccountInfo(signin::ConsentLevel::kSignin);
   if (result.IsEmpty()) {
     std::vector<CoreAccountInfo> all_accounts =
         identity_manager->GetAccountsWithRefreshTokens();
diff --git a/components/password_manager/core/browser/password_form_manager.cc b/components/password_manager/core/browser/password_form_manager.cc
index 6991acf..0bdf862 100644
--- a/components/password_manager/core/browser/password_form_manager.cc
+++ b/components/password_manager/core/browser/password_form_manager.cc
@@ -275,8 +275,7 @@
   signin::IdentityManager* identity_manager = client_->GetIdentityManager();
   DCHECK(identity_manager);
   const std::string gaia_id =
-      identity_manager
-          ->GetPrimaryAccountInfo(signin::ConsentLevel::kNotRequired)
+      identity_manager->GetPrimaryAccountInfo(signin::ConsentLevel::kSignin)
           .gaia;
   DCHECK(!gaia_id.empty()) << "Cannot move without signed in user";
 
@@ -440,7 +439,7 @@
     return;
   const std::string gaia_id =
       client_->GetIdentityManager()
-          ->GetPrimaryAccountInfo(signin::ConsentLevel::kNotRequired)
+          ->GetPrimaryAccountInfo(signin::ConsentLevel::kSignin)
           .gaia;
   // The above call to IsMovableToAccountStore() guarantees there is a signed in
   // user.
diff --git a/components/password_manager/core/browser/password_manager_client_helper.cc b/components/password_manager/core/browser/password_manager_client_helper.cc
index c53fd19f..744c220 100644
--- a/components/password_manager/core/browser/password_manager_client_helper.cc
+++ b/components/password_manager/core/browser/password_manager_client_helper.cc
@@ -25,8 +25,8 @@
 bool IsPrimaryAccountSignIn(const signin::IdentityManager& identity_manager,
                             const std::u16string& username,
                             const std::string& signon_realm) {
-  CoreAccountInfo primary_account = identity_manager.GetPrimaryAccountInfo(
-      signin::ConsentLevel::kNotRequired);
+  CoreAccountInfo primary_account =
+      identity_manager.GetPrimaryAccountInfo(signin::ConsentLevel::kSignin);
   return sync_util::IsGaiaCredentialPage(signon_realm) &&
          !primary_account.IsEmpty() &&
          gaia::AreEmailsSame(base::UTF16ToUTF8(username),
diff --git a/components/password_manager/core/browser/sync_credentials_filter.cc b/components/password_manager/core/browser/sync_credentials_filter.cc
index 8659063..faab646 100644
--- a/components/password_manager/core/browser/sync_credentials_filter.cc
+++ b/components/password_manager/core/browser/sync_credentials_filter.cc
@@ -47,7 +47,7 @@
     // not know about the account yet.
     if (sync_util::IsGaiaCredentialPage(form.signon_realm)) {
       CoreAccountInfo primary_account = identity_manager->GetPrimaryAccountInfo(
-          signin::ConsentLevel::kNotRequired);
+          signin::ConsentLevel::kSignin);
       if (primary_account.IsEmpty() ||
           gaia::AreEmailsSame(base::UTF16ToUTF8(form.username_value),
                               primary_account.email)) {
diff --git a/components/policy/resources/webui/policy.html b/components/policy/resources/webui/policy.html
index d731892d..3889cc3 100644
--- a/components/policy/resources/webui/policy.html
+++ b/components/policy/resources/webui/policy.html
@@ -8,6 +8,18 @@
 <link rel="stylesheet" href="chrome://policy/policy.css">
 <link rel="stylesheet" href="chrome://resources/css/text_defaults_md.css">
 
+<if expr="is_ios">
+    <!-- TODO(crbug.com/487000): Remove this once injected by web. -->
+    <script src="chrome://resources/js/ios/web_ui.js"></script>
+</if>
+
+<script src="chrome://resources/js/action_link.js"></script>
+<script src="chrome://resources/js/cr.js"></script>
+<script src="chrome://resources/js/cr/ui.js"></script>
+<script src="chrome://resources/js/cr/ui/focus_outline_manager.js"></script>
+<script src="chrome://resources/js/load_time_data.js"></script>
+<script src="chrome://resources/js/assert.js"></script>
+<script src="chrome://resources/js/util.js"></script>
 </head>
 
 <body>
@@ -203,5 +215,7 @@
   </div>
 </body>
 
-<script type="module" src="policy.js"></script>
+<script src="chrome://policy/strings.js"></script>
+<script src="chrome://policy/policy_base.js"></script>
+<script src="chrome://policy/policy.js"></script>
 </html>
diff --git a/components/policy/resources/webui/policy.js b/components/policy/resources/webui/policy.js
index f400fe1..7f9a6344 100644
--- a/components/policy/resources/webui/policy.js
+++ b/components/policy/resources/webui/policy.js
@@ -2,11 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {Page} from './policy_base.js';
-
 // Have the main initialization function be called when the page finishes
 // loading.
-const page = Page.getInstance();
-document.addEventListener('DOMContentLoaded', () => {
-  page.initialize();
-});
+document.addEventListener(
+    'DOMContentLoaded',
+    policy.Page.getInstance().initialize.bind(policy.Page.getInstance()));
diff --git a/components/policy/resources/webui/policy_base.js b/components/policy/resources/webui/policy_base.js
index b2446276..4aeafb3 100644
--- a/components/policy/resources/webui/policy_base.js
+++ b/components/policy/resources/webui/policy_base.js
@@ -2,681 +2,686 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import './strings.m.js';
-import 'chrome://resources/js/action_link.js';
-
-// <if expr="is_ios">
-import 'chrome://resources/js/ios/web_ui.js';
-// </if>
-
-import {addSingletonGetter, addWebUIListener} from 'chrome://resources/js/cr.m.js';
-import {define as crUiDefine} from 'chrome://resources/js/cr/ui.m.js';
-import {FocusOutlineManager} from 'chrome://resources/js/cr/ui/focus_outline_manager.m.js';
-import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
-import {$} from 'chrome://resources/js/util.m.js';
-
-/**
- * @typedef {{
- *    [id: string]: {
- *      name: string,
- *      policyNames: !Array<string>,
- * }}
- */
-let PolicyNamesResponse;
-
-/**
- * @typedef {!Array<{
- *  name: string,
- *  id: ?String,
- *  policies: {[name: string]: policy.Policy}
- * }>}
- */
-let PolicyValuesResponse;
-
-/**
- * @typedef {{
- *    level: string,
- *    scope: string,
- *    source: string,
- *    value: any,
- * }}
- */
-let Conflict;
-
-/**
- * @typedef {{
- *    ignored?: boolean,
- *    name: string,
- *    level: string,
- *    link: ?string,
- *    scope: string,
- *    source: string,
- *    error: string,
- *    warning: string,
- *    info: string,
- *    value: any,
- *    deprecated: ?boolean,
- *    future: ?boolean,
- *    allSourcesMerged: ?boolean,
- *    conflicts: ?Array<!Conflict>,
- *    superseded: ?Array<!Conflict>,
- * }}
- */
-let Policy;
-
-/**
- * @typedef {{
- *     id: ?string,
- *     isExtension?: boolean,
- *     name: string,
- *     policies: !Array<!Policy>
- * }}
- */
-let PolicyTableModel;
-
-/**
- * A box that shows the status of cloud policy for a device, machine or user.
- * @constructor
- * @extends {HTMLFieldSetElement}
- */
-const StatusBox = crUiDefine(function() {
-  const node = $('status-box-template').cloneNode(true);
-  node.removeAttribute('id');
-  return node;
-});
-
-StatusBox.prototype = {
-  // Set up the prototype chain.
-  __proto__: HTMLFieldSetElement.prototype,
+cr.define('policy', function() {
+  /**
+   * @typedef {{
+   *    [id: string]: {
+   *      name: string,
+   *      policyNames: !Array<string>,
+   * }}
+   */
+  let PolicyNamesResponse;
 
   /**
-   * Initialization function for the cr.ui framework.
+   * @typedef {!Array<{
+   *  name: string,
+   *  id: ?String,
+   *  policies: {[name: string]: policy.Policy}
+   * }>}
    */
-  decorate() {},
+  let PolicyValuesResponse;
 
   /**
-   * Sets the text of a particular named label element in the status box
-   * and updates the visibility if needed.
-   * @param {string} labelName The name of the label element that is being
-   *     updated.
-   * @param {string} labelValue The new text content for the label.
-   * @param {boolean=} needsToBeShown True if we want to show the label
-   *     False otherwise.
+   * @typedef {{
+   *    level: string,
+   *    scope: string,
+   *    source: string,
+   *    value: any,
+   * }}
    */
-  setLabelAndShow_(labelName, labelValue, needsToBeShown = true) {
-    const labelElement = this.querySelector(labelName);
-    labelElement.textContent = labelValue ? ' ' + labelValue : '';
-    if (needsToBeShown) {
-      labelElement.parentElement.hidden = false;
-    }
-  },
+  let Conflict;
+
   /**
-   * Populate the box with the given cloud policy status.
-   * @param {string} scope The policy scope, either "device", "machine",
-   *     "user", or "updater".
-   * @param {Object} status Dictionary with information about the status.
+   * @typedef {{
+   *    ignored?: boolean,
+   *    name: string,
+   *    level: string,
+   *    link: ?string,
+   *    scope: string,
+   *    source: string,
+   *    error: string,
+   *    warning: string,
+   *    info: string,
+   *    value: any,
+   *    deprecated: ?boolean,
+   *    future: ?boolean,
+   *    allSourcesMerged: ?boolean,
+   *    conflicts: ?Array<!Conflict>,
+   *    superseded: ?Array<!Conflict>,
+   * }}
    */
-  initialize(scope, status) {
-    const notSpecifiedString = loadTimeData.getString('notSpecified');
-    if (scope === 'device') {
-      // For device policy, set the appropriate title and populate the topmost
-      // status item with the domain the device is enrolled into.
-      this.querySelector('.legend').textContent =
-          loadTimeData.getString('statusDevice');
-      this.setLabelAndShow_(
-          '.enterprise-enrollment-domain', status.enterpriseEnrollmentDomain);
+  let Policy;
 
-      // Populate the device naming information.
-      // Populate the asset identifier.
-      this.setLabelAndShow_('.asset-id', status.assetId || notSpecifiedString);
+  /**
+   * @typedef {{
+   *     id: ?string,
+   *     isExtension?: boolean,
+   *     name: string,
+   *     policies: !Array<!Policy>
+   * }}
+   */
+  let PolicyTableModel;
 
-      // Populate the device location.
-      this.setLabelAndShow_('.location', status.location || notSpecifiedString);
+  /**
+   * A box that shows the status of cloud policy for a device, machine or user.
+   * @constructor
+   * @extends {HTMLFieldSetElement}
+   */
+  const StatusBox = cr.ui.define(function() {
+    const node = $('status-box-template').cloneNode(true);
+    node.removeAttribute('id');
+    return node;
+  });
 
-      // Populate the directory API ID.
-      this.setLabelAndShow_(
-          '.directory-api-id', status.directoryApiId || notSpecifiedString);
-      this.setLabelAndShow_('.client-id', status.clientId);
-      // For off-hours policy, indicate if it's active or not.
-      if (status.isOffHoursActive != null) {
+  StatusBox.prototype = {
+    // Set up the prototype chain.
+    __proto__: HTMLFieldSetElement.prototype,
+
+    /**
+     * Initialization function for the cr.ui framework.
+     */
+    decorate() {},
+
+    /**
+     * Sets the text of a particular named label element in the status box
+     * and updates the visibility if needed.
+     * @param {string} labelName The name of the label element that is being
+     *     updated.
+     * @param {string} labelValue The new text content for the label.
+     * @param {boolean=} needsToBeShown True if we want to show the label
+     *     False otherwise.
+     */
+    setLabelAndShow_(labelName, labelValue, needsToBeShown = true) {
+      const labelElement = this.querySelector(labelName);
+      labelElement.textContent = labelValue ? ' ' + labelValue : '';
+      if (needsToBeShown) {
+        labelElement.parentElement.hidden = false;
+      }
+    },
+    /**
+     * Populate the box with the given cloud policy status.
+     * @param {string} scope The policy scope, either "device", "machine",
+     *     "user", or "updater".
+     * @param {Object} status Dictionary with information about the status.
+     */
+    initialize(scope, status) {
+      const notSpecifiedString = loadTimeData.getString('notSpecified');
+      if (scope === 'device') {
+        // For device policy, set the appropriate title and populate the topmost
+        // status item with the domain the device is enrolled into.
+        this.querySelector('.legend').textContent =
+            loadTimeData.getString('statusDevice');
         this.setLabelAndShow_(
-            '.is-offhours-active',
-            loadTimeData.getString(
-                status.isOffHoursActive ? 'offHoursActive' :
-                                          'offHoursNotActive'));
-      }
-    } else if (scope === 'machine') {
-      // For machine policy, set the appropriate title and populate
-      // machine enrollment status with the information that applies
-      // to this machine.
-      this.querySelector('.legend').textContent =
-          loadTimeData.getString('statusMachine');
-      this.setLabelAndShow_('.machine-enrollment-device-id', status.deviceId);
-      this.setLabelAndShow_(
-          '.machine-enrollment-token', status.enrollmentToken);
-      this.setLabelAndShow_('.machine-enrollment-name', status.machine);
-      this.setLabelAndShow_('.machine-enrollment-domain', status.domain);
-    } else if (scope === 'updater') {
-      this.querySelector('.legend').textContent =
-          loadTimeData.getString('statusUpdater');
-      if (status.version) {
-        this.setLabelAndShow_('.version', status.version);
-      }
-      if (status.domain) {
-        this.setLabelAndShow_('.enterprise-enrollment-domain', status.domain);
-      }
-    } else {
-      // For user policy, set the appropriate title and populate the topmost
-      // status item with the username that policies apply to.
-      this.querySelector('.legend').textContent =
-          loadTimeData.getString('statusUser');
-      // Populate the topmost item with the username.
-      this.setLabelAndShow_('.username', status.username);
-      // Populate the user gaia id.
-      this.setLabelAndShow_('.gaia-id', status.gaiaId || notSpecifiedString);
-      this.setLabelAndShow_('.client-id', status.clientId);
-      if (status.isAffiliated != null) {
+            '.enterprise-enrollment-domain', status.enterpriseEnrollmentDomain);
+
+        // Populate the device naming information.
+        // Populate the asset identifier.
         this.setLabelAndShow_(
-            '.is-affiliated',
+            '.asset-id', status.assetId || notSpecifiedString);
+
+        // Populate the device location.
+        this.setLabelAndShow_(
+            '.location', status.location || notSpecifiedString);
+
+        // Populate the directory API ID.
+        this.setLabelAndShow_(
+            '.directory-api-id', status.directoryApiId || notSpecifiedString);
+        this.setLabelAndShow_('.client-id', status.clientId);
+        // For off-hours policy, indicate if it's active or not.
+        if (status.isOffHoursActive != null) {
+          this.setLabelAndShow_(
+              '.is-offhours-active',
+              loadTimeData.getString(
+                  status.isOffHoursActive ? 'offHoursActive' :
+                                            'offHoursNotActive'));
+        }
+      } else if (scope === 'machine') {
+        // For machine policy, set the appropriate title and populate
+        // machine enrollment status with the information that applies
+        // to this machine.
+        this.querySelector('.legend').textContent =
+            loadTimeData.getString('statusMachine');
+        this.setLabelAndShow_('.machine-enrollment-device-id', status.deviceId);
+        this.setLabelAndShow_(
+            '.machine-enrollment-token', status.enrollmentToken);
+        this.setLabelAndShow_('.machine-enrollment-name', status.machine);
+        this.setLabelAndShow_('.machine-enrollment-domain', status.domain);
+      } else if (scope === 'updater') {
+        this.querySelector('.legend').textContent =
+            loadTimeData.getString('statusUpdater');
+        if (status.version) {
+          this.setLabelAndShow_('.version', status.version);
+        }
+        if (status.domain) {
+          this.setLabelAndShow_('.enterprise-enrollment-domain', status.domain);
+        }
+      } else {
+        // For user policy, set the appropriate title and populate the topmost
+        // status item with the username that policies apply to.
+        this.querySelector('.legend').textContent =
+            loadTimeData.getString('statusUser');
+        // Populate the topmost item with the username.
+        this.setLabelAndShow_('.username', status.username);
+        // Populate the user gaia id.
+        this.setLabelAndShow_('.gaia-id', status.gaiaId || notSpecifiedString);
+        this.setLabelAndShow_('.client-id', status.clientId);
+        if (status.isAffiliated != null) {
+          this.setLabelAndShow_(
+              '.is-affiliated',
+              loadTimeData.getString(
+                  status.isAffiliated ? 'isAffiliatedYes' : 'isAffiliatedNo'));
+        }
+      }
+
+      if (status.enterpriseDomainManager) {
+        this.setLabelAndShow_('.managed-by', status.enterpriseDomainManager);
+      }
+
+      if (status.timeSinceLastRefresh) {
+        this.setLabelAndShow_(
+            '.time-since-last-refresh', status.timeSinceLastRefresh);
+      }
+
+      if (scope !== 'updater') {
+        this.setLabelAndShow_('.refresh-interval', status.refreshInterval);
+        this.setLabelAndShow_('.status', status.status);
+        this.setLabelAndShow_(
+            '.policy-push',
             loadTimeData.getString(
-                status.isAffiliated ? 'isAffiliatedYes' : 'isAffiliatedNo'));
+                status.policiesPushAvailable ? 'policiesPushOn' :
+                                               'policiesPushOff'));
       }
-    }
-
-    if (status.enterpriseDomainManager) {
-      this.setLabelAndShow_('.managed-by', status.enterpriseDomainManager);
-    }
-
-    if (status.timeSinceLastRefresh) {
-      this.setLabelAndShow_(
-          '.time-since-last-refresh', status.timeSinceLastRefresh);
-    }
-
-    if (scope !== 'updater') {
-      this.setLabelAndShow_('.refresh-interval', status.refreshInterval);
-      this.setLabelAndShow_('.status', status.status);
-      this.setLabelAndShow_(
-          '.policy-push',
-          loadTimeData.getString(
-              status.policiesPushAvailable ? 'policiesPushOn' :
-                                             'policiesPushOff'));
-    }
-  },
-};
-
-/**
- * A single policy conflict's entry in the policy table.
- * @constructor
- * @extends {HTMLDivElement}
- */
-const PolicyConflict = crUiDefine(function() {
-  const node = $('policy-conflict-template').cloneNode(true);
-  node.removeAttribute('id');
-  return node;
-});
-
-PolicyConflict.prototype = {
-  // Set up the prototype chain.
-  __proto__: HTMLDivElement.prototype,
-
-  decorate() {},
+    },
+  };
 
   /**
-   * @param {Conflict} conflict
-   * @param {string} row_label
+   * A single policy conflict's entry in the policy table.
+   * @constructor
+   * @extends {HTMLDivElement}
    */
-  initialize(conflict, row_label) {
-    this.querySelector('.scope').textContent = loadTimeData.getString(
-        conflict.scope === 'user' ? 'scopeUser' : 'scopeDevice');
-    this.querySelector('.level').textContent = loadTimeData.getString(
-        conflict.level === 'recommended' ? 'levelRecommended' :
-                                           'levelMandatory');
-    this.querySelector('.source').textContent =
-        loadTimeData.getString(conflict.source);
-    this.querySelector('.value.row .value').textContent = conflict.value;
-    this.querySelector('.name').textContent = loadTimeData.getString(row_label);
-  }
-};
+  const PolicyConflict = cr.ui.define(function() {
+    const node = $('policy-conflict-template').cloneNode(true);
+    node.removeAttribute('id');
+    return node;
+  });
 
-/**
- * A single policy's row entry in the policy table.
- * @constructor
- * @extends {HTMLDivElement}
- */
-const PolicyRow = crUiDefine(function() {
-  const node = $('policy-template').cloneNode(true);
-  node.removeAttribute('id');
-  return node;
-});
+  PolicyConflict.prototype = {
+    // Set up the prototype chain.
+    __proto__: HTMLDivElement.prototype,
 
-PolicyRow.prototype = {
-  // Set up the prototype chain.
-  __proto__: HTMLDivElement.prototype,
+    decorate() {},
+
+    /**
+     * @param {Conflict} conflict
+     * @param {string} row_label
+     */
+    initialize(conflict, row_label) {
+      this.querySelector('.scope').textContent = loadTimeData.getString(
+          conflict.scope === 'user' ? 'scopeUser' : 'scopeDevice');
+      this.querySelector('.level').textContent = loadTimeData.getString(
+          conflict.level === 'recommended' ? 'levelRecommended' :
+                                             'levelMandatory');
+      this.querySelector('.source').textContent =
+          loadTimeData.getString(conflict.source);
+      this.querySelector('.value.row .value').textContent = conflict.value;
+      this.querySelector('.name').textContent =
+          loadTimeData.getString(row_label);
+    }
+  };
 
   /**
-   * Initialization function for the cr.ui framework.
+   * A single policy's row entry in the policy table.
+   * @constructor
+   * @extends {HTMLDivElement}
    */
-  decorate() {
-    const toggle = this.querySelector('.policy.row .toggle');
-    toggle.addEventListener('click', this.toggleExpanded_.bind(this));
+  const PolicyRow = cr.ui.define(function() {
+    const node = $('policy-template').cloneNode(true);
+    node.removeAttribute('id');
+    return node;
+  });
 
-    const copy = this.querySelector('.copy-value');
-    copy.addEventListener('click', this.copyValue_.bind(this));
-  },
+  PolicyRow.prototype = {
+    // Set up the prototype chain.
+    __proto__: HTMLDivElement.prototype,
 
-  /** @param {Policy} policy */
-  initialize(policy) {
-    /** @type {Policy} */
-    this.policy = policy;
+    /**
+     * Initialization function for the cr.ui framework.
+     */
+    decorate() {
+      const toggle = this.querySelector('.policy.row .toggle');
+      toggle.addEventListener('click', this.toggleExpanded_.bind(this));
 
-    /** @private {boolean} */
-    this.unset_ = policy.value === undefined;
+      const copy = this.querySelector('.copy-value');
+      copy.addEventListener('click', this.copyValue_.bind(this));
+    },
 
-    /** @private {boolean} */
-    this.hasErrors_ = !!policy.error;
+    /** @param {Policy} policy */
+    initialize(policy) {
+      /** @type {Policy} */
+      this.policy = policy;
 
-    /** @private {boolean} */
-    this.hasWarnings_ = !!policy.warning;
+      /** @private {boolean} */
+      this.unset_ = policy.value === undefined;
 
-    /** @private {boolean} */
-    this.hasInfos_ = !!policy.info;
+      /** @private {boolean} */
+      this.hasErrors_ = !!policy.error;
 
-    /** @private {boolean} */
-    this.hasConflicts_ = !!policy.conflicts;
+      /** @private {boolean} */
+      this.hasWarnings_ = !!policy.warning;
 
-    /** @private {boolean} */
-    this.hasSuperseded_ = !!policy.superseded;
+      /** @private {boolean} */
+      this.hasInfos_ = !!policy.info;
 
-    /** @private {boolean} */
-    this.isMergedValue_ = !!policy.allSourcesMerged;
+      /** @private {boolean} */
+      this.hasConflicts_ = !!policy.conflicts;
 
-    /** @private {boolean} */
-    this.deprecated_ = !!policy.deprecated;
+      /** @private {boolean} */
+      this.hasSuperseded_ = !!policy.superseded;
 
-    /** @private {boolean} */
-    this.future_ = !!policy.future;
+      /** @private {boolean} */
+      this.isMergedValue_ = !!policy.allSourcesMerged;
 
-    // Populate the name column.
-    const nameDisplay = this.querySelector('.name .link span');
-    nameDisplay.textContent = policy.name;
-    if (policy.link) {
-      const link = this.querySelector('.name .link');
-      link.href = policy.link;
-      link.title = loadTimeData.getStringF('policyLearnMore', policy.name);
-    } else {
-      this.classList.add('no-help-link');
-    }
+      /** @private {boolean} */
+      this.deprecated_ = !!policy.deprecated;
 
-    // Populate the remaining columns with policy scope, level and value if a
-    // value has been set. Otherwise, leave them blank.
-    if (!this.unset_) {
-      const scopeDisplay = this.querySelector('.scope');
-      scopeDisplay.textContent = loadTimeData.getString(
-          policy.scope === 'user' ? 'scopeUser' : 'scopeDevice');
+      /** @private {boolean} */
+      this.future_ = !!policy.future;
 
-      const levelDisplay = this.querySelector('.level');
-      levelDisplay.textContent = loadTimeData.getString(
-          policy.level === 'recommended' ? 'levelRecommended' :
-                                           'levelMandatory');
-
-      const sourceDisplay = this.querySelector('.source');
-      sourceDisplay.textContent = loadTimeData.getString(policy.source);
-      // Reduces load on the DOM for long values;
-      const truncatedValue =
-          (policy.value && policy.value.toString().length > 256) ?
-          `${policy.value.toString().substr(0, 256)}\u2026` :
-          policy.value;
-
-      const valueDisplay = this.querySelector('.value');
-      valueDisplay.textContent = truncatedValue;
-
-      const copyLink = this.querySelector('.copy .link');
-      copyLink.title = loadTimeData.getStringF('policyCopyValue', policy.name);
-
-      const valueRowContentDisplay = this.querySelector('.value.row .value');
-      valueRowContentDisplay.textContent = policy.value;
-
-      const errorRowContentDisplay = this.querySelector('.errors.row .value');
-      errorRowContentDisplay.textContent = policy.error;
-      const warningRowContentDisplay =
-          this.querySelector('.warnings.row .value');
-      warningRowContentDisplay.textContent = policy.warning;
-      const infoRowContentDisplay = this.querySelector('.infos.row .value');
-      infoRowContentDisplay.textContent = policy.info;
-
-      const messagesDisplay = this.querySelector('.messages');
-      const errorsNotice =
-          this.hasErrors_ ? loadTimeData.getString('error') : '';
-      const deprecationNotice =
-          this.deprecated_ ? loadTimeData.getString('deprecated') : '';
-      const futureNotice = this.future_ ? loadTimeData.getString('future') : '';
-      const warningsNotice =
-          this.hasWarnings_ ? loadTimeData.getString('warning') : '';
-      const conflictsNotice = this.hasConflicts_ && !this.isMergedValue_ ?
-          loadTimeData.getString('conflict') :
-          '';
-      const ignoredNotice =
-          this.policy.ignored ? loadTimeData.getString('ignored') : '';
-      let notice =
-          [
-            errorsNotice, deprecationNotice, futureNotice, warningsNotice,
-            ignoredNotice, conflictsNotice
-          ].filter(x => !!x)
-              .join(', ') ||
-          loadTimeData.getString('ok');
-      const supersededNotice = this.hasSuperseded_ && !this.isMergedValue_ ?
-          loadTimeData.getString('superseding') :
-          '';
-      if (supersededNotice) {
-        // Include superseded notice regardless of other notices
-        notice += `, ${supersededNotice}`;
+      // Populate the name column.
+      const nameDisplay = this.querySelector('.name .link span');
+      nameDisplay.textContent = policy.name;
+      if (policy.link) {
+        const link = this.querySelector('.name .link');
+        link.href = policy.link;
+        link.title = loadTimeData.getStringF('policyLearnMore', policy.name);
+      } else {
+        this.classList.add('no-help-link');
       }
-      messagesDisplay.textContent = notice;
 
-      if (policy.conflicts) {
-        policy.conflicts.forEach(conflict => {
-          const row = new PolicyConflict;
-          row.initialize(conflict, 'conflictValue');
-          this.appendChild(row);
-        });
+      // Populate the remaining columns with policy scope, level and value if a
+      // value has been set. Otherwise, leave them blank.
+      if (!this.unset_) {
+        const scopeDisplay = this.querySelector('.scope');
+        scopeDisplay.textContent = loadTimeData.getString(
+            policy.scope === 'user' ? 'scopeUser' : 'scopeDevice');
+
+        const levelDisplay = this.querySelector('.level');
+        levelDisplay.textContent = loadTimeData.getString(
+            policy.level === 'recommended' ? 'levelRecommended' :
+                                             'levelMandatory');
+
+        const sourceDisplay = this.querySelector('.source');
+        sourceDisplay.textContent = loadTimeData.getString(policy.source);
+        // Reduces load on the DOM for long values;
+        const truncatedValue =
+            (policy.value && policy.value.toString().length > 256) ?
+            `${policy.value.toString().substr(0, 256)}\u2026` :
+            policy.value;
+
+        const valueDisplay = this.querySelector('.value');
+        valueDisplay.textContent = truncatedValue;
+
+        const copyLink = this.querySelector('.copy .link');
+        copyLink.title =
+            loadTimeData.getStringF('policyCopyValue', policy.name);
+
+        const valueRowContentDisplay = this.querySelector('.value.row .value');
+        valueRowContentDisplay.textContent = policy.value;
+
+        const errorRowContentDisplay = this.querySelector('.errors.row .value');
+        errorRowContentDisplay.textContent = policy.error;
+        const warningRowContentDisplay =
+            this.querySelector('.warnings.row .value');
+        warningRowContentDisplay.textContent = policy.warning;
+        const infoRowContentDisplay = this.querySelector('.infos.row .value');
+        infoRowContentDisplay.textContent = policy.info;
+
+        const messagesDisplay = this.querySelector('.messages');
+        const errorsNotice =
+            this.hasErrors_ ? loadTimeData.getString('error') : '';
+        const deprecationNotice =
+            this.deprecated_ ? loadTimeData.getString('deprecated') : '';
+        const futureNotice =
+            this.future_ ? loadTimeData.getString('future') : '';
+        const warningsNotice =
+            this.hasWarnings_ ? loadTimeData.getString('warning') : '';
+        const conflictsNotice = this.hasConflicts_ && !this.isMergedValue_ ?
+            loadTimeData.getString('conflict') :
+            '';
+        const ignoredNotice =
+            this.policy.ignored ? loadTimeData.getString('ignored') : '';
+        let notice =
+            [
+              errorsNotice, deprecationNotice, futureNotice, warningsNotice,
+              ignoredNotice, conflictsNotice
+            ].filter(x => !!x)
+                .join(', ') ||
+            loadTimeData.getString('ok');
+        const supersededNotice = this.hasSuperseded_ && !this.isMergedValue_ ?
+            loadTimeData.getString('superseding') :
+            '';
+        if (supersededNotice) {
+          // Include superseded notice regardless of other notices
+          notice += `, ${supersededNotice}`;
+        }
+        messagesDisplay.textContent = notice;
+
+        if (policy.conflicts) {
+          policy.conflicts.forEach(conflict => {
+            const row = new PolicyConflict;
+            row.initialize(conflict, 'conflictValue');
+            this.appendChild(row);
+          });
+        }
+        if (policy.superseded) {
+          policy.superseded.forEach(superseded => {
+            const row = new PolicyConflict;
+            row.initialize(superseded, 'supersededValue');
+            this.appendChild(row);
+          });
+        }
+      } else {
+        const messagesDisplay = this.querySelector('.messages');
+        messagesDisplay.textContent = loadTimeData.getString('unset');
       }
-      if (policy.superseded) {
-        policy.superseded.forEach(superseded => {
-          const row = new PolicyConflict;
-          row.initialize(superseded, 'supersededValue');
-          this.appendChild(row);
-        });
+    },
+
+    /**
+     * Copies the policy's value to the clipboard.
+     * @private
+     */
+    copyValue_() {
+      const policyValueDisplay = this.querySelector('.value.row .value');
+
+      // Select the text that will be copied.
+      const selection = window.getSelection();
+      const range = window.document.createRange();
+      range.selectNodeContents(policyValueDisplay);
+      selection.removeAllRanges();
+      selection.addRange(range);
+
+      // Copy the policy value to the clipboard.
+      navigator.clipboard.writeText(policyValueDisplay.innerText)
+          .catch(error => {
+            console.error('Unable to copy policy value to clipboard:', error);
+          });
+    },
+
+    /**
+     * Toggle the visibility of an additional row containing the complete text.
+     * @private
+     */
+    toggleExpanded_() {
+      const warningRowDisplay = this.querySelector('.warnings.row');
+      const errorRowDisplay = this.querySelector('.errors.row');
+      const infoRowDisplay = this.querySelector('.infos.row');
+      const valueRowDisplay = this.querySelector('.value.row');
+      valueRowDisplay.hidden = !valueRowDisplay.hidden;
+      if (valueRowDisplay.hidden) {
+        this.classList.remove('expanded');
+      } else {
+        this.classList.add('expanded');
       }
-    } else {
-      const messagesDisplay = this.querySelector('.messages');
-      messagesDisplay.textContent = loadTimeData.getString('unset');
-    }
-  },
+
+      this.querySelector('.show-more').hidden = !valueRowDisplay.hidden;
+      this.querySelector('.show-less').hidden = valueRowDisplay.hidden;
+      if (this.hasWarnings_) {
+        warningRowDisplay.hidden = !warningRowDisplay.hidden;
+      }
+      if (this.hasErrors_) {
+        errorRowDisplay.hidden = !errorRowDisplay.hidden;
+      }
+      if (this.hasInfos_) {
+        infoRowDisplay.hidden = !infoRowDisplay.hidden;
+      }
+      this.querySelectorAll('.policy-conflict-data')
+          .forEach(row => row.hidden = !row.hidden);
+      this.querySelectorAll('.policy-superseded-data')
+          .forEach(row => row.hidden = !row.hidden);
+    },
+  };
 
   /**
-   * Copies the policy's value to the clipboard.
-   * @private
+   * A table of policies and their values.
+   * @constructor
+   * @extends {HTMLDivElement}
    */
-  copyValue_() {
-    const policyValueDisplay = this.querySelector('.value.row .value');
-
-    // Select the text that will be copied.
-    const selection = window.getSelection();
-    const range = window.document.createRange();
-    range.selectNodeContents(policyValueDisplay);
-    selection.removeAllRanges();
-    selection.addRange(range);
-
-    // Copy the policy value to the clipboard.
-    navigator.clipboard.writeText(policyValueDisplay.innerText).catch(error => {
-      console.error('Unable to copy policy value to clipboard:', error);
-    });
-  },
-
-  /**
-   * Toggle the visibility of an additional row containing the complete text.
-   * @private
-   */
-  toggleExpanded_() {
-    const warningRowDisplay = this.querySelector('.warnings.row');
-    const errorRowDisplay = this.querySelector('.errors.row');
-    const infoRowDisplay = this.querySelector('.infos.row');
-    const valueRowDisplay = this.querySelector('.value.row');
-    valueRowDisplay.hidden = !valueRowDisplay.hidden;
-    if (valueRowDisplay.hidden) {
-      this.classList.remove('expanded');
-    } else {
-      this.classList.add('expanded');
-    }
-
-    this.querySelector('.show-more').hidden = !valueRowDisplay.hidden;
-    this.querySelector('.show-less').hidden = valueRowDisplay.hidden;
-    if (this.hasWarnings_) {
-      warningRowDisplay.hidden = !warningRowDisplay.hidden;
-    }
-    if (this.hasErrors_) {
-      errorRowDisplay.hidden = !errorRowDisplay.hidden;
-    }
-    if (this.hasInfos_) {
-      infoRowDisplay.hidden = !infoRowDisplay.hidden;
-    }
-    this.querySelectorAll('.policy-conflict-data')
-        .forEach(row => row.hidden = !row.hidden);
-    this.querySelectorAll('.policy-superseded-data')
-        .forEach(row => row.hidden = !row.hidden);
-  },
-};
-
-/**
- * A table of policies and their values.
- * @constructor
- * @extends {HTMLDivElement}
- */
-const PolicyTable = crUiDefine(function() {
-  const node = $('policy-table-template').cloneNode(true);
-  node.removeAttribute('id');
-  return node;
-});
+  const PolicyTable = cr.ui.define(function() {
+    const node = $('policy-table-template').cloneNode(true);
+    node.removeAttribute('id');
+    return node;
+  });
 
 
-PolicyTable.prototype = {
-  // Set up the prototype chain.
-  __proto__: HTMLDivElement.prototype,
+  PolicyTable.prototype = {
+    // Set up the prototype chain.
+    __proto__: HTMLDivElement.prototype,
 
-  /**
-   * Initialization function for the cr.ui framework.
-   */
-  decorate() {
-    this.policies_ = {};
-    this.filterPattern_ = '';
-  },
+    /**
+     * Initialization function for the cr.ui framework.
+     */
+    decorate() {
+      this.policies_ = {};
+      this.filterPattern_ = '';
+    },
 
-  /** @param {PolicyTableModel} dataModel */
-  update(dataModel) {
-    // Clear policies
-    const mainContent = this.querySelector('.main');
-    const policies = this.querySelectorAll('.policy-data');
-    this.querySelector('.header').textContent = dataModel.name;
-    this.querySelector('.id').textContent = dataModel.id;
-    this.querySelector('.id').hidden = !dataModel.id;
-    policies.forEach(row => mainContent.removeChild(row));
+    /** @param {PolicyTableModel} dataModel */
+    update(dataModel) {
+      // Clear policies
+      const mainContent = this.querySelector('.main');
+      const policies = this.querySelectorAll('.policy-data');
+      this.querySelector('.header').textContent = dataModel.name;
+      this.querySelector('.id').textContent = dataModel.id;
+      this.querySelector('.id').hidden = !dataModel.id;
+      policies.forEach(row => mainContent.removeChild(row));
 
-    dataModel.policies
-        .sort((a, b) => {
-          if ((a.value !== undefined && b.value !== undefined) ||
-              a.value === b.value) {
-            if (a.link !== undefined && b.link !== undefined) {
-              // Sorting the policies in ascending alpha order.
-              return a.name > b.name ? 1 : -1;
+      dataModel.policies
+          .sort((a, b) => {
+            if ((a.value !== undefined && b.value !== undefined) ||
+                a.value === b.value) {
+              if (a.link !== undefined && b.link !== undefined) {
+                // Sorting the policies in ascending alpha order.
+                return a.name > b.name ? 1 : -1;
+              }
+
+              // Sorting so unknown policies are last.
+              return a.link !== undefined ? -1 : 1;
             }
 
-            // Sorting so unknown policies are last.
-            return a.link !== undefined ? -1 : 1;
-          }
+            // Sorting so unset values are last.
+            return a.value !== undefined ? -1 : 1;
+          })
+          .forEach(policy => {
+            const policyRow = new PolicyRow;
+            policyRow.initialize(policy);
+            mainContent.appendChild(policyRow);
+          });
+      this.filter();
+    },
 
-          // Sorting so unset values are last.
-          return a.value !== undefined ? -1 : 1;
-        })
-        .forEach(policy => {
-          const policyRow = new PolicyRow;
-          policyRow.initialize(policy);
-          mainContent.appendChild(policyRow);
-        });
-    this.filter();
-  },
+    /**
+     * Set the filter pattern. Only policies whose name contains |pattern| are
+     * shown in the policy table. The filter is case insensitive. It can be
+     * disabled by setting |pattern| to an empty string.
+     * @param {string} pattern The filter pattern.
+     */
+    setFilterPattern(pattern) {
+      this.filterPattern_ = pattern.toLowerCase();
+      this.filter();
+    },
 
-  /**
-   * Set the filter pattern. Only policies whose name contains |pattern| are
-   * shown in the policy table. The filter is case insensitive. It can be
-   * disabled by setting |pattern| to an empty string.
-   * @param {string} pattern The filter pattern.
-   */
-  setFilterPattern(pattern) {
-    this.filterPattern_ = pattern.toLowerCase();
-    this.filter();
-  },
-
-  /**
-   * Filter policies. Only policies whose name contains the filter pattern are
-   * shown in the table. Furthermore, policies whose value is not currently
-   * set are only shown if the corresponding checkbox is checked.
-   */
-  filter() {
-    const showUnset = $('show-unset').checked;
-    const policies = this.querySelectorAll('.policy-data');
-    for (let i = 0; i < policies.length; i++) {
-      const policyDisplay = policies[i];
-      policyDisplay.hidden =
-          policyDisplay.policy.value === undefined && !showUnset ||
-          policyDisplay.policy.name.toLowerCase().indexOf(
-              this.filterPattern_) === -1;
-    }
-    this.querySelector('.no-policy').hidden =
-        !!this.querySelector('.policy-data:not([hidden])');
-  },
-};
-
-/**
- * A singleton object that handles communication between browser and WebUI.
- */
-export class Page {
-  constructor() {
-    /** @type {?Element} */
-    this.mainSection = null;
-
-    /** @type {{[id: string]: PolicyTable}} */
-    this.policyTables = {};
-  }
-
-  /**
-   * Main initialization function. Called by the browser on page load.
-   */
-  initialize() {
-    FocusOutlineManager.forDocument(document);
-
-    this.mainSection = $('main-section');
-
-    // Place the initial focus on the filter input field.
-    $('filter').focus();
-
-    $('filter').onsearch = () => {
-      for (const policyTable in this.policyTables) {
-        this.policyTables[policyTable].setFilterPattern($('filter').value);
+    /**
+     * Filter policies. Only policies whose name contains the filter pattern are
+     * shown in the table. Furthermore, policies whose value is not currently
+     * set are only shown if the corresponding checkbox is checked.
+     */
+    filter() {
+      const showUnset = $('show-unset').checked;
+      const policies = this.querySelectorAll('.policy-data');
+      for (let i = 0; i < policies.length; i++) {
+        const policyDisplay = policies[i];
+        policyDisplay.hidden =
+            policyDisplay.policy.value === undefined && !showUnset ||
+            policyDisplay.policy.name.toLowerCase().indexOf(
+                this.filterPattern_) === -1;
       }
-    };
-    $('reload-policies').onclick = () => {
-      $('reload-policies').disabled = true;
-      $('screen-reader-message').textContent =
-          loadTimeData.getString('loadingPolicies');
-      chrome.send('reloadPolicies');
-    };
-
-    $('export-policies').onclick = () => {
-      chrome.send('exportPoliciesJSON');
-    };
-
-    $('copy-policies').onclick = () => {
-      chrome.send('copyPoliciesJSON');
-    };
-
-    $('show-unset').onchange = () => {
-      for (const policyTable in this.policyTables) {
-        this.policyTables[policyTable].filter();
-      }
-    };
-
-    chrome.send('listenPoliciesUpdates');
-    addWebUIListener('status-updated', status => this.setStatus(status));
-    addWebUIListener(
-        'policies-updated',
-        (names, values) => this.onPoliciesReceived_(names, values));
-  }
+      this.querySelector('.no-policy').hidden =
+          !!this.querySelector('.policy-data:not([hidden])');
+    },
+  };
 
   /**
-   * @param {PolicyNamesResponse} policyNames
-   * @param {PolicyValuesResponse} policyValues
-   * @private
+   * A singleton object that handles communication between browser and WebUI.
+   * @constructor
    */
-  onPoliciesReceived_(policyNames, policyValues) {
-    /** @type {Array<!PolicyTableModel>} */
-    const policyGroups = policyValues.map(value => {
-      const knownPolicyNames =
-          policyNames[value.id] ? policyNames[value.id].policyNames : [];
-      const knownPolicyNamesSet = new Set(knownPolicyNames);
-      const receivedPolicyNames = Object.keys(value.policies);
-      const allPolicyNames =
-          Array.from(new Set([...knownPolicyNames, ...receivedPolicyNames]));
-      const policies = allPolicyNames.map(
-          name => Object.assign(
-              {
-                name,
-                link: knownPolicyNames === policyNames.chrome.policyNames &&
-                        knownPolicyNamesSet.has(name) ?
-                    `https://cloud.google.com/docs/chrome-enterprise/policies/?policy=${
-                        name}` :
-                    undefined,
-              },
-              value.policies[name]));
+  function Page() {}
 
-      return {
-        name: value.forSigninScreen ?
-            `${value.name} [${loadTimeData.getString('signinProfile')}]` :
-            value.name,
-        id: value.isExtension ? value.id : null,
-        policies
+  // Make Page a singleton.
+  cr.addSingletonGetter(Page);
+
+  Page.prototype = {
+    /**
+     * Main initialization function. Called by the browser on page load.
+     */
+    initialize() {
+      cr.ui.FocusOutlineManager.forDocument(document);
+
+      this.mainSection = $('main-section');
+
+      /** @type {{[id: string]: PolicyTable}} */
+      this.policyTables = {};
+
+      // Place the initial focus on the filter input field.
+      $('filter').focus();
+
+      const self = this;
+      $('filter').onsearch = function(event) {
+        for (policyTable in self.policyTables) {
+          self.policyTables[policyTable].setFilterPattern(this.value);
+        }
       };
-    });
+      $('reload-policies').onclick = function(event) {
+        this.disabled = true;
+        $('screen-reader-message').textContent =
+            loadTimeData.getString('loadingPolicies');
+        chrome.send('reloadPolicies');
+      };
 
-    policyGroups.forEach(group => this.createOrUpdatePolicyTable(group));
+      $('export-policies').onclick = function(event) {
+        chrome.send('exportPoliciesJSON');
+      };
 
-    this.reloadPoliciesDone();
-  }
+      $('copy-policies').onclick = function(event) {
+        chrome.send('copyPoliciesJSON');
+      };
 
-  /** @param {PolicyTableModel} dataModel */
-  createOrUpdatePolicyTable(dataModel) {
-    const id = `${dataModel.name}-${dataModel.id}`;
-    if (!this.policyTables[id]) {
-      this.policyTables[id] = new PolicyTable;
-      this.mainSection.appendChild(this.policyTables[id]);
-    }
-    this.policyTables[id].update(dataModel);
-  }
+      $('show-unset').onchange = function() {
+        for (policyTable in self.policyTables) {
+          self.policyTables[policyTable].filter();
+        }
+      };
 
-  /**
-   * Update the status section of the page to show the current cloud policy
-   * status.
-   * @param {Object} status Dictionary containing the current policy status.
-   */
-  setStatus(status) {
-    // Remove any existing status boxes.
-    const container = $('status-box-container');
-    while (container.firstChild) {
-      container.removeChild(container.firstChild);
-    }
-    // Hide the status section.
-    const section = $('status-section');
-    section.hidden = true;
+      chrome.send('listenPoliciesUpdates');
+      cr.addWebUIListener('status-updated', status => this.setStatus(status));
+      cr.addWebUIListener(
+          'policies-updated',
+          (names, values) => this.onPoliciesReceived_(names, values));
+    },
 
-    // Add a status box for each scope that has a cloud policy status.
-    for (const scope in status) {
-      const box = new StatusBox;
-      box.initialize(scope, status[scope]);
-      container.appendChild(box);
-      // Show the status section.
-      section.hidden = false;
-    }
-  }
+    /**
+     * @param {PolicyNamesResponse} policyNames
+     * @param {PolicyValuesResponse} policyValues
+     * @private
+     */
+    onPoliciesReceived_(policyNames, policyValues) {
+      /** @type {Array<!PolicyTableModel>} */
+      const policyGroups = policyValues.map(value => {
+        const knownPolicyNames =
+            policyNames[value.id] ? policyNames[value.id].policyNames : [];
+        const knownPolicyNamesSet = new Set(knownPolicyNames);
+        const receivedPolicyNames = Object.keys(value.policies);
+        const allPolicyNames =
+            Array.from(new Set([...knownPolicyNames, ...receivedPolicyNames]));
+        const policies = allPolicyNames.map(
+            name => Object.assign(
+                {
+                  name,
+                  link: knownPolicyNames === policyNames.chrome.policyNames &&
+                          knownPolicyNamesSet.has(name) ?
+                      `https://cloud.google.com/docs/chrome-enterprise/policies/?policy=${
+                          name}` :
+                      undefined,
+                },
+                value.policies[name]));
 
-  /**
-   * Re-enable the reload policies button when the previous request to reload
-   * policies values has completed.
-   */
-  reloadPoliciesDone() {
-    $('reload-policies').disabled = false;
-    $('screen-reader-message').textContent =
-        loadTimeData.getString('loadPoliciesDone');
-  }
-}
+        return {
+          name: value.forSigninScreen ?
+              `${value.name} [${loadTimeData.getString('signinProfile')}]` :
+              value.name,
+          id: value.isExtension ? value.id : null,
+          policies
+        };
+      });
 
-// Make Page a singleton.
-addSingletonGetter(Page);
+      policyGroups.forEach(group => this.createOrUpdatePolicyTable(group));
+
+      this.reloadPoliciesDone();
+    },
+
+    /** @param {PolicyTableModel} dataModel */
+    createOrUpdatePolicyTable(dataModel) {
+      const id = `${dataModel.name}-${dataModel.id}`;
+      if (!this.policyTables[id]) {
+        this.policyTables[id] = new PolicyTable;
+        this.mainSection.appendChild(this.policyTables[id]);
+      }
+      this.policyTables[id].update(dataModel);
+    },
+
+    /**
+     * Update the status section of the page to show the current cloud policy
+     * status.
+     * @param {Object} status Dictionary containing the current policy status.
+     */
+    setStatus(status) {
+      // Remove any existing status boxes.
+      const container = $('status-box-container');
+      while (container.firstChild) {
+        container.removeChild(container.firstChild);
+      }
+      // Hide the status section.
+      const section = $('status-section');
+      section.hidden = true;
+
+      // Add a status box for each scope that has a cloud policy status.
+      for (const scope in status) {
+        const box = new StatusBox;
+        box.initialize(scope, status[scope]);
+        container.appendChild(box);
+        // Show the status section.
+        section.hidden = false;
+      }
+    },
+
+    /**
+     * Re-enable the reload policies button when the previous request to reload
+     * policies values has completed.
+     */
+    reloadPoliciesDone() {
+      $('reload-policies').disabled = false;
+      $('screen-reader-message').textContent =
+          loadTimeData.getString('loadPoliciesDone');
+    },
+  };
+
+  return {
+    Page,
+    PolicyTable,
+    Policy,
+    PolicyNamesResponse,
+    PolicyValuesResponse,
+    Conflict,
+    PolicyRow,
+    PolicyTableModel
+  };
+});
diff --git a/components/reporting/storage/storage_queue_unittest.cc b/components/reporting/storage/storage_queue_unittest.cc
index 8fc556e..cf8ecd2 100644
--- a/components/reporting/storage/storage_queue_unittest.cc
+++ b/components/reporting/storage/storage_queue_unittest.cc
@@ -904,7 +904,9 @@
   WriteStringOrDie(kData[2]);
 }
 
-TEST_P(StorageQueueTest, WriteAndRepeatedlyImmediateUploadWithConfirmations) {
+// Disabled because of flakiness. See crbug.com/1193080.
+TEST_P(StorageQueueTest,
+       DISABLED_WriteAndRepeatedlyImmediateUploadWithConfirmations) {
   CreateTestStorageQueueOrDie(BuildStorageQueueOptionsImmediate());
 
   // Upload is initiated asynchronously, so it may happen after the next
diff --git a/components/reporting/storage/storage_unittest.cc b/components/reporting/storage/storage_unittest.cc
index 07c9115..3b818003 100644
--- a/components/reporting/storage/storage_unittest.cc
+++ b/components/reporting/storage/storage_unittest.cc
@@ -733,7 +733,8 @@
   task_environment_.FastForwardBy(base::TimeDelta::FromSeconds(1));
 }
 
-TEST_P(StorageTest, WriteIntoNewStorageAndUploadWithKeyUpdate) {
+// TODO(crbug.com/1193084): crashes on all platforms.
+TEST_P(StorageTest, DISABLED_WriteIntoNewStorageAndUploadWithKeyUpdate) {
   // Run the test only when encryption is enabled.
   if (!is_encryption_enabled()) {
     return;
@@ -1006,7 +1007,9 @@
                    kData[2]);  // Immediately uploads and verifies.
 }
 
-TEST_P(StorageTest, WriteAndRepeatedlyImmediateUploadWithConfirmations) {
+// Disabled because of flakiness. See crbug.com/1193079.
+TEST_P(StorageTest,
+       DISABLED_WriteAndRepeatedlyImmediateUploadWithConfirmations) {
   CreateTestStorageOrDie(BuildTestStorageOptions());
 
   // Upload is initiated asynchronously, so it may happen after the next
diff --git a/components/resources/policy_resources.grdp b/components/resources/policy_resources.grdp
index 427d31ee..ec7fc0f 100644
--- a/components/resources/policy_resources.grdp
+++ b/components/resources/policy_resources.grdp
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <grit-part>
   <include name="IDR_POLICY_CSS" file="../policy/resources/webui/policy.css" preprocess="true" type="BINDATA" />
-  <include name="IDR_POLICY_HTML" file="../policy/resources/webui/policy.html" type="BINDATA" />
-  <include name="IDR_POLICY_BASE_JS" file="../policy/resources/webui/policy_base.js" preprocess="true" type="BINDATA" />
+  <include name="IDR_POLICY_HTML" file="../policy/resources/webui/policy.html" flattenhtml="true" allowexternalscript="true" type="BINDATA" />
+  <include name="IDR_POLICY_BASE_JS" file="../policy/resources/webui/policy_base.js" type="BINDATA" preprocess="true" />
   <include name="IDR_POLICY_JS" file="../policy/resources/webui/policy.js" type="BINDATA" />
 </grit-part>
diff --git a/components/safe_browsing/core/browser/sync/safe_browsing_primary_account_token_fetcher.cc b/components/safe_browsing/core/browser/sync/safe_browsing_primary_account_token_fetcher.cc
index bff9a07..8bc7c0a4 100644
--- a/components/safe_browsing/core/browser/sync/safe_browsing_primary_account_token_fetcher.cc
+++ b/components/safe_browsing/core/browser/sync/safe_browsing_primary_account_token_fetcher.cc
@@ -38,8 +38,8 @@
       std::move(callback),
       base::BindOnce(&SafeBrowsingPrimaryAccountTokenFetcher::OnTokenTimeout,
                      base::Unretained(this)));
-  CoreAccountId account_id = identity_manager_->GetPrimaryAccountId(
-      signin::ConsentLevel::kNotRequired);
+  CoreAccountId account_id =
+      identity_manager_->GetPrimaryAccountId(signin::ConsentLevel::kSignin);
   token_fetchers_[request_id] =
       identity_manager_->CreateAccessTokenFetcherForAccount(
           account_id, "safe_browsing_service", {kAPIScope},
diff --git a/components/safe_browsing/core/browser/sync/sync_utils.cc b/components/safe_browsing/core/browser/sync/sync_utils.cc
index fcceb46..0e47cf5 100644
--- a/components/safe_browsing/core/browser/sync/sync_utils.cc
+++ b/components/safe_browsing/core/browser/sync/sync_utils.cc
@@ -18,8 +18,7 @@
 bool SyncUtils::IsPrimaryAccountSignedIn(
     signin::IdentityManager* identity_manager) {
   CoreAccountInfo primary_account_info =
-      identity_manager->GetPrimaryAccountInfo(
-          signin::ConsentLevel::kNotRequired);
+      identity_manager->GetPrimaryAccountInfo(signin::ConsentLevel::kSignin);
   return !primary_account_info.account_id.empty();
 }
 
diff --git a/components/signin/core/browser/account_investigator.cc b/components/signin/core/browser/account_investigator.cc
index 7b409dd..4924dd4 100644
--- a/components/signin/core/browser/account_investigator.cc
+++ b/components/signin/core/browser/account_investigator.cc
@@ -40,7 +40,7 @@
 base::Optional<AccountInfo> GetExtendedAccountInfo(
     signin::IdentityManager* identity_manager) {
   CoreAccountId account_id =
-      identity_manager->GetPrimaryAccountId(signin::ConsentLevel::kNotRequired);
+      identity_manager->GetPrimaryAccountId(signin::ConsentLevel::kSignin);
   if (account_id.empty())
     return base::nullopt;
   return identity_manager
@@ -51,7 +51,7 @@
 // Returns true if there is primary account (no consent required) but no
 // extended info, yet.
 bool WaitingForExtendedInfo(signin::IdentityManager* identity_manager) {
-  if (!identity_manager->HasPrimaryAccount(signin::ConsentLevel::kNotRequired))
+  if (!identity_manager->HasPrimaryAccount(signin::ConsentLevel::kSignin))
     return false;
   return !GetExtendedAccountInfo(identity_manager).has_value();
 }
@@ -241,8 +241,7 @@
 
   // Report extra metrics only for signed-in accounts that are split by the
   // primary account type.
-  if (identity_manager_->HasPrimaryAccount(
-          signin::ConsentLevel::kNotRequired)) {
+  if (identity_manager_->HasPrimaryAccount(signin::ConsentLevel::kSignin)) {
     const bool is_syncing =
         identity_manager_->HasPrimaryAccount(signin::ConsentLevel::kSync);
     base::Optional<AccountInfo> info =
diff --git a/components/signin/core/browser/mirror_account_reconcilor_delegate.cc b/components/signin/core/browser/mirror_account_reconcilor_delegate.cc
index 2c4872e2..2accff2 100644
--- a/components/signin/core/browser/mirror_account_reconcilor_delegate.cc
+++ b/components/signin/core/browser/mirror_account_reconcilor_delegate.cc
@@ -41,7 +41,7 @@
     const {
 #if defined(OS_ANDROID)
   if (base::FeatureList::IsEnabled(kMobileIdentityConsistency)) {
-    return ConsentLevel::kNotRequired;
+    return ConsentLevel::kSignin;
   }
 #endif
   return ConsentLevel::kSync;
diff --git a/components/signin/core/browser/signin_error_controller.cc b/components/signin/core/browser/signin_error_controller.cc
index 9abb3c4..93f190c5 100644
--- a/components/signin/core/browser/signin_error_controller.cc
+++ b/components/signin/core/browser/signin_error_controller.cc
@@ -31,8 +31,7 @@
   bool error_changed = false;
 
   const CoreAccountId& primary_account_id =
-      identity_manager_->GetPrimaryAccountId(
-          signin::ConsentLevel::kNotRequired);
+      identity_manager_->GetPrimaryAccountId(signin::ConsentLevel::kSignin);
 
   if (identity_manager_->HasAccountWithRefreshTokenInPersistentErrorState(
           primary_account_id)) {
diff --git a/components/signin/internal/identity_manager/accounts_cookie_mutator_impl.cc b/components/signin/internal/identity_manager/accounts_cookie_mutator_impl.cc
index 28a8a1f..d03c005f 100644
--- a/components/signin/internal/identity_manager/accounts_cookie_mutator_impl.cc
+++ b/components/signin/internal/identity_manager/accounts_cookie_mutator_impl.cc
@@ -76,6 +76,7 @@
 AccountsCookieMutatorImpl::SetAccountsInCookieForPartition(
     PartitionDelegate* partition_delegate,
     const MultiloginParameters& parameters,
+    gaia::GaiaSource source,
     base::OnceCallback<void(SetAccountsInCookieResult)>
         set_accounts_in_cookies_completed_callback) {
   // The default partition must go through the GaiaCookieManagerService.
@@ -94,7 +95,7 @@
   return std::make_unique<MultiloginHelperWrapper>(
       std::make_unique<OAuthMultiloginHelper>(
           signin_client_, partition_delegate, token_service_, parameters.mode,
-          accounts, /*external_cc_result=*/std::string(),
+          accounts, /*external_cc_result=*/std::string(), source,
           std::move(set_accounts_in_cookies_completed_callback)));
 }
 
diff --git a/components/signin/internal/identity_manager/accounts_cookie_mutator_impl.h b/components/signin/internal/identity_manager/accounts_cookie_mutator_impl.h
index 1f4d5f5..cf8dc8e 100644
--- a/components/signin/internal/identity_manager/accounts_cookie_mutator_impl.h
+++ b/components/signin/internal/identity_manager/accounts_cookie_mutator_impl.h
@@ -55,6 +55,7 @@
   std::unique_ptr<SetAccountsInCookieTask> SetAccountsInCookieForPartition(
       PartitionDelegate* partition_delegate,
       const MultiloginParameters& parameters,
+      gaia::GaiaSource source,
       base::OnceCallback<void(SetAccountsInCookieResult)>
           set_accounts_in_cookies_completed_callback) override;
 
diff --git a/components/signin/internal/identity_manager/gaia_cookie_manager_service.cc b/components/signin/internal/identity_manager/gaia_cookie_manager_service.cc
index 9ff47fc..773aa606 100644
--- a/components/signin/internal/identity_manager/gaia_cookie_manager_service.cc
+++ b/components/signin/internal/identity_manager/gaia_cookie_manager_service.cc
@@ -959,9 +959,9 @@
 
 std::unique_ptr<GaiaAuthFetcher>
 GaiaCookieManagerService::CreateGaiaAuthFetcherForPartition(
-    GaiaAuthConsumer* consumer) {
-  return signin_client_->CreateGaiaAuthFetcher(consumer,
-                                               gaia::GaiaSource::kChrome);
+    GaiaAuthConsumer* consumer,
+    const gaia::GaiaSource& source) {
+  return signin_client_->CreateGaiaAuthFetcher(consumer, source);
 }
 
 network::mojom::CookieManager*
@@ -1021,9 +1021,9 @@
 
 void GaiaCookieManagerService::StartSetAccounts() {
   DCHECK(!requests_.empty());
-  DCHECK_EQ(GaiaCookieRequestType::SET_ACCOUNTS,
-            requests_.front().request_type());
-  DCHECK(!requests_.front().GetAccounts().empty());
+  const GaiaCookieRequest& request = requests_.front();
+  DCHECK_EQ(GaiaCookieRequestType::SET_ACCOUNTS, request.request_type());
+  DCHECK(!request.GetAccounts().empty());
 
   if (!external_cc_result_fetched_ &&
       !external_cc_result_fetcher_.IsRunning()) {
@@ -1034,9 +1034,9 @@
   }
 
   oauth_multilogin_helper_ = std::make_unique<signin::OAuthMultiloginHelper>(
-      signin_client_, this, token_service_,
-      requests_.front().GetMultiloginMode(), requests_.front().GetAccounts(),
-      external_cc_result_fetcher_.GetExternalCcResult(),
+      signin_client_, this, token_service_, request.GetMultiloginMode(),
+      request.GetAccounts(), external_cc_result_fetcher_.GetExternalCcResult(),
+      request.source(),
       base::BindOnce(&GaiaCookieManagerService::OnSetAccountsFinished,
                      weak_ptr_factory_.GetWeakPtr()));
 }
diff --git a/components/signin/internal/identity_manager/gaia_cookie_manager_service.h b/components/signin/internal/identity_manager/gaia_cookie_manager_service.h
index ae36c7e..b1c73919 100644
--- a/components/signin/internal/identity_manager/gaia_cookie_manager_service.h
+++ b/components/signin/internal/identity_manager/gaia_cookie_manager_service.h
@@ -349,7 +349,8 @@
 
   // Overridden from signin::AccountsCookieMutator::PartitionDelegate.
   std::unique_ptr<GaiaAuthFetcher> CreateGaiaAuthFetcherForPartition(
-      GaiaAuthConsumer* consumer) override;
+      GaiaAuthConsumer* consumer,
+      const gaia::GaiaSource& source) override;
   network::mojom::CookieManager* GetCookieManagerForPartition() override;
 
   // Helper method to initialize listed accounts ids.
diff --git a/components/signin/internal/identity_manager/oauth_multilogin_helper.cc b/components/signin/internal/identity_manager/oauth_multilogin_helper.cc
index 299b12cd..815ee25 100644
--- a/components/signin/internal/identity_manager/oauth_multilogin_helper.cc
+++ b/components/signin/internal/identity_manager/oauth_multilogin_helper.cc
@@ -58,6 +58,7 @@
     gaia::MultiloginMode mode,
     const std::vector<AccountIdGaiaIdPair>& accounts,
     const std::string& external_cc_result,
+    const gaia::GaiaSource& gaia_source,
     base::OnceCallback<void(SetAccountsInCookieResult)> callback)
     : signin_client_(signin_client),
       partition_delegate_(partition_delegate),
@@ -65,6 +66,7 @@
       mode_(mode),
       accounts_(accounts),
       external_cc_result_(external_cc_result),
+      gaia_source_(gaia_source),
       callback_(std::move(callback)) {
   DCHECK(signin_client_);
   DCHECK(partition_delegate_);
@@ -129,8 +131,8 @@
 
 void OAuthMultiloginHelper::StartFetchingMultiLogin() {
   DCHECK_EQ(gaia_id_token_pairs_.size(), accounts_.size());
-  gaia_auth_fetcher_ =
-      partition_delegate_->CreateGaiaAuthFetcherForPartition(this);
+  gaia_auth_fetcher_ = partition_delegate_->CreateGaiaAuthFetcherForPartition(
+      this, gaia_source_);
   gaia_auth_fetcher_->StartOAuthMultilogin(mode_, gaia_id_token_pairs_,
                                            external_cc_result_);
 }
diff --git a/components/signin/internal/identity_manager/oauth_multilogin_helper.h b/components/signin/internal/identity_manager/oauth_multilogin_helper.h
index e2a2048..d60787c 100644
--- a/components/signin/internal/identity_manager/oauth_multilogin_helper.h
+++ b/components/signin/internal/identity_manager/oauth_multilogin_helper.h
@@ -46,6 +46,7 @@
       gaia::MultiloginMode mode,
       const std::vector<AccountIdGaiaIdPair>& accounts,
       const std::string& external_cc_result,
+      const gaia::GaiaSource& gaia_source,
       base::OnceCallback<void(SetAccountsInCookieResult)> callback);
 
   ~OAuthMultiloginHelper() override;
@@ -85,6 +86,9 @@
   const std::vector<AccountIdGaiaIdPair> accounts_;
   // See GaiaCookieManagerService::ExternalCcResultFetcher for details.
   const std::string external_cc_result_;
+  // The Gaia source to be passed when creating GaiaAuthFetchers for the
+  // OAuthmultilogin request.
+  const gaia::GaiaSource gaia_source_;
   // Access tokens, in the same order as the account ids.
   std::vector<GaiaAuthFetcher::MultiloginTokenIDPair> gaia_id_token_pairs_;
 
diff --git a/components/signin/internal/identity_manager/oauth_multilogin_helper_unittest.cc b/components/signin/internal/identity_manager/oauth_multilogin_helper_unittest.cc
index bffb497..6f939c9b 100644
--- a/components/signin/internal/identity_manager/oauth_multilogin_helper_unittest.cc
+++ b/components/signin/internal/identity_manager/oauth_multilogin_helper_unittest.cc
@@ -184,7 +184,7 @@
     return std::make_unique<OAuthMultiloginHelper>(
         &test_signin_client_, this, token_service(),
         gaia::MultiloginMode::MULTILOGIN_UPDATE_COOKIE_ACCOUNTS_ORDER, accounts,
-        std::string(),
+        std::string(), gaia::GaiaSource::kChrome,
         base::BindOnce(&OAuthMultiloginHelperTest::OnOAuthMultiloginFinished,
                        base::Unretained(this)));
   }
@@ -194,7 +194,7 @@
     return std::make_unique<OAuthMultiloginHelper>(
         &test_signin_client_, this, token_service(),
         gaia::MultiloginMode::MULTILOGIN_UPDATE_COOKIE_ACCOUNTS_ORDER, accounts,
-        kExternalCcResult,
+        kExternalCcResult, gaia::GaiaSource::kChrome,
         base::BindOnce(&OAuthMultiloginHelperTest::OnOAuthMultiloginFinished,
                        base::Unretained(this)));
   }
@@ -226,9 +226,9 @@
 
   // AccountsCookieMuator::PartitionDelegate:
   std::unique_ptr<GaiaAuthFetcher> CreateGaiaAuthFetcherForPartition(
-      GaiaAuthConsumer* consumer) override {
-    return test_signin_client_.CreateGaiaAuthFetcher(consumer,
-                                                     gaia::GaiaSource::kChrome);
+      GaiaAuthConsumer* consumer,
+      const gaia::GaiaSource& source) override {
+    return test_signin_client_.CreateGaiaAuthFetcher(consumer, source);
   }
 
   network::mojom::CookieManager* GetCookieManagerForPartition() override {
diff --git a/components/signin/internal/identity_manager/primary_account_manager.cc b/components/signin/internal/identity_manager/primary_account_manager.cc
index 581552c..d949029 100644
--- a/components/signin/internal/identity_manager/primary_account_manager.cc
+++ b/components/signin/internal/identity_manager/primary_account_manager.cc
@@ -219,7 +219,7 @@
     return false;
   }
   switch (consent_level) {
-    case signin::ConsentLevel::kNotRequired:
+    case signin::ConsentLevel::kSignin:
       return true;
     case signin::ConsentLevel::kSync:
       return consented_pref;
@@ -347,7 +347,7 @@
               kPrimaryAccountManager_ClearAccount);
       break;
     case RemoveAccountsOption::kKeepAllAccounts:
-      if (previous_state.consent_level == signin::ConsentLevel::kNotRequired) {
+      if (previous_state.consent_level == signin::ConsentLevel::kSignin) {
         // Nothing to update as the primary account is already at kNotRequired
         // consent level. Prefer returning to avoid firing useless
         // OnPrimaryAccountChanged() notifications.
@@ -365,7 +365,7 @@
 PrimaryAccountChangeEvent::State PrimaryAccountManager::GetPrimaryAccountState()
     const {
   PrimaryAccountChangeEvent::State state(primary_account_info(),
-                                         signin::ConsentLevel::kNotRequired);
+                                         signin::ConsentLevel::kSignin);
   if (HasPrimaryAccount(signin::ConsentLevel::kSync))
     state.consent_level = signin::ConsentLevel::kSync;
   return state;
@@ -378,7 +378,7 @@
 
   DCHECK(event_details.GetEventTypeFor(signin::ConsentLevel::kSync) !=
              PrimaryAccountChangeEvent::Type::kNone ||
-         event_details.GetEventTypeFor(signin::ConsentLevel::kNotRequired) !=
+         event_details.GetEventTypeFor(signin::ConsentLevel::kSignin) !=
              PrimaryAccountChangeEvent::Type::kNone)
       << "PrimaryAccountChangeEvent with no change: " << event_details;
 
diff --git a/components/signin/internal/identity_manager/primary_account_manager_unittest.cc b/components/signin/internal/identity_manager/primary_account_manager_unittest.cc
index 6c15cfd..6c8a587 100644
--- a/components/signin/internal/identity_manager/primary_account_manager_unittest.cc
+++ b/components/signin/internal/identity_manager/primary_account_manager_unittest.cc
@@ -120,7 +120,7 @@
       const signin::PrimaryAccountChangeEvent& event_details) override {
     DCHECK(event_details.GetEventTypeFor(signin::ConsentLevel::kSync) !=
                signin::PrimaryAccountChangeEvent::Type::kNone ||
-           event_details.GetEventTypeFor(signin::ConsentLevel::kNotRequired) !=
+           event_details.GetEventTypeFor(signin::ConsentLevel::kSignin) !=
                signin::PrimaryAccountChangeEvent::Type::kNone)
         << "PrimaryAccountChangeEvent with no change: " << event_details;
 
@@ -134,7 +134,7 @@
       case signin::PrimaryAccountChangeEvent::Type::kNone:
         break;
     }
-    switch (event_details.GetEventTypeFor(ConsentLevel::kNotRequired)) {
+    switch (event_details.GetEventTypeFor(ConsentLevel::kSignin)) {
       case signin::PrimaryAccountChangeEvent::Type::kSet:
       case signin::PrimaryAccountChangeEvent::Type::kCleared:
         num_unconsented_account_changed_++;
@@ -176,8 +176,7 @@
   EXPECT_TRUE(
       manager_->GetPrimaryAccountInfo(ConsentLevel::kSync).email.empty());
   EXPECT_TRUE(manager_->GetPrimaryAccountId(ConsentLevel::kSync).empty());
-  EXPECT_TRUE(
-      manager_->GetPrimaryAccountInfo(ConsentLevel::kNotRequired).IsEmpty());
+  EXPECT_TRUE(manager_->GetPrimaryAccountInfo(ConsentLevel::kSignin).IsEmpty());
   // Should not be persisted anymore
   ShutDownManager();
   CreatePrimaryAccountManager();
@@ -185,8 +184,7 @@
   EXPECT_TRUE(
       manager_->GetPrimaryAccountInfo(ConsentLevel::kSync).email.empty());
   EXPECT_TRUE(manager_->GetPrimaryAccountId(ConsentLevel::kSync).empty());
-  EXPECT_TRUE(
-      manager_->GetPrimaryAccountInfo(ConsentLevel::kNotRequired).IsEmpty());
+  EXPECT_TRUE(manager_->GetPrimaryAccountInfo(ConsentLevel::kSignin).IsEmpty());
 }
 
 TEST_F(PrimaryAccountManagerTest, SignOutRevoke) {
@@ -245,12 +243,12 @@
   CoreAccountId account_id = AddToAccountTracker("gaia_id", "user@gmail.com");
   CoreAccountInfo account_info = account_tracker()->GetAccountInfo(account_id);
   manager_->SetUnconsentedPrimaryAccountInfo(account_info);
-  EXPECT_TRUE(manager_->HasPrimaryAccount(ConsentLevel::kNotRequired));
+  EXPECT_TRUE(manager_->HasPrimaryAccount(ConsentLevel::kSignin));
   EXPECT_FALSE(manager_->HasPrimaryAccount(ConsentLevel::kSync));
   signin_client()->set_is_signout_allowed(false);
   manager_->ClearPrimaryAccount(signin_metrics::SIGNOUT_TEST,
                                 signin_metrics::SignoutDelete::IGNORE_METRIC);
-  EXPECT_FALSE(manager_->HasPrimaryAccount(ConsentLevel::kNotRequired));
+  EXPECT_FALSE(manager_->HasPrimaryAccount(ConsentLevel::kSignin));
 }
 
 TEST_F(PrimaryAccountManagerTest, ProhibitedAtStartup) {
@@ -290,7 +288,7 @@
   CoreAccountInfo account_info = account_tracker()->GetAccountInfo(account_id);
   manager_->SetUnconsentedPrimaryAccountInfo(account_info);
   EXPECT_EQ(1, num_unconsented_account_changed_);
-  EXPECT_TRUE(manager_->HasPrimaryAccount(ConsentLevel::kNotRequired));
+  EXPECT_TRUE(manager_->HasPrimaryAccount(ConsentLevel::kSignin));
   EXPECT_FALSE(manager_->HasPrimaryAccount(ConsentLevel::kSync));
 
   manager_->RevokeSyncConsent(signin_metrics::SIGNOUT_TEST,
@@ -317,7 +315,7 @@
   EXPECT_EQ("user@gmail.com",
             manager_->GetPrimaryAccountInfo(ConsentLevel::kSync).email);
   EXPECT_EQ(account_id, manager_->GetPrimaryAccountId(ConsentLevel::kSync));
-  EXPECT_EQ(manager_->GetPrimaryAccountInfo(ConsentLevel::kNotRequired),
+  EXPECT_EQ(manager_->GetPrimaryAccountInfo(ConsentLevel::kSignin),
             manager_->GetPrimaryAccountInfo(ConsentLevel::kSync));
 }
 
@@ -457,7 +455,7 @@
   CreatePrimaryAccountManager();
   base::RunLoop().RunUntilIdle();
 
-  EXPECT_FALSE(manager_->HasPrimaryAccount(ConsentLevel::kNotRequired));
+  EXPECT_FALSE(manager_->HasPrimaryAccount(ConsentLevel::kSignin));
   EXPECT_EQ("", user_prefs_.GetString(prefs::kGoogleServicesAccountId));
   EXPECT_TRUE(account_tracker()->GetAccounts().empty());
   EXPECT_EQ(AccountTrackerService::MIGRATION_DONE,
@@ -473,7 +471,7 @@
   EXPECT_EQ("user@gmail.com",
             manager_->GetPrimaryAccountInfo(ConsentLevel::kSync).email);
   EXPECT_EQ(account_id, manager_->GetPrimaryAccountId(ConsentLevel::kSync));
-  EXPECT_EQ(manager_->GetPrimaryAccountInfo(ConsentLevel::kNotRequired),
+  EXPECT_EQ(manager_->GetPrimaryAccountInfo(ConsentLevel::kSignin),
             manager_->GetPrimaryAccountInfo(ConsentLevel::kSync));
 }
 
@@ -483,10 +481,9 @@
   user_prefs_.SetBoolean(prefs::kGoogleServicesConsentedToSync, false);
   CreatePrimaryAccountManager();
   EXPECT_EQ("user@gmail.com",
-            manager_->GetPrimaryAccountInfo(ConsentLevel::kNotRequired).email);
-  EXPECT_EQ(
-      account_id,
-      manager_->GetPrimaryAccountInfo(ConsentLevel::kNotRequired).account_id);
+            manager_->GetPrimaryAccountInfo(ConsentLevel::kSignin).email);
+  EXPECT_EQ(account_id,
+            manager_->GetPrimaryAccountInfo(ConsentLevel::kSignin).account_id);
   EXPECT_TRUE(manager_->GetPrimaryAccountInfo(ConsentLevel::kSync).IsEmpty());
 }
 
@@ -506,14 +503,14 @@
   EXPECT_EQ("user@gmail.com",
             manager_->GetPrimaryAccountInfo(ConsentLevel::kSync).email);
   EXPECT_EQ(account_id, manager_->GetPrimaryAccountId(ConsentLevel::kSync));
-  EXPECT_EQ(manager_->GetPrimaryAccountInfo(ConsentLevel::kNotRequired),
+  EXPECT_EQ(manager_->GetPrimaryAccountInfo(ConsentLevel::kSignin),
             manager_->GetPrimaryAccountInfo(ConsentLevel::kSync));
 }
 
 TEST_F(PrimaryAccountManagerTest, SetUnconsentedPrimaryAccountInfo) {
   CreatePrimaryAccountManager();
   EXPECT_EQ(CoreAccountInfo(),
-            manager_->GetPrimaryAccountInfo(ConsentLevel::kNotRequired));
+            manager_->GetPrimaryAccountInfo(ConsentLevel::kSignin));
   EXPECT_EQ(0, num_unconsented_account_changed_);
   EXPECT_EQ(0, num_successful_signins_);
 
@@ -527,7 +524,7 @@
   EXPECT_EQ(0, num_successful_signouts_);
   EXPECT_EQ(1, num_unconsented_account_changed_);
   EXPECT_EQ(account_info,
-            manager_->GetPrimaryAccountInfo(ConsentLevel::kNotRequired));
+            manager_->GetPrimaryAccountInfo(ConsentLevel::kSignin));
   EXPECT_EQ(CoreAccountInfo(),
             manager_->GetPrimaryAccountInfo(ConsentLevel::kSync));
 
@@ -537,7 +534,7 @@
   EXPECT_EQ(0, num_successful_signouts_);
   EXPECT_EQ(1, num_unconsented_account_changed_);
   EXPECT_EQ(account_info,
-            manager_->GetPrimaryAccountInfo(ConsentLevel::kNotRequired));
+            manager_->GetPrimaryAccountInfo(ConsentLevel::kSignin));
   EXPECT_EQ(CoreAccountInfo(),
             manager_->GetPrimaryAccountInfo(ConsentLevel::kSync));
 
@@ -549,7 +546,7 @@
   EXPECT_EQ(0, num_successful_signouts_);
   EXPECT_EQ(1, num_unconsented_account_changed_);
   EXPECT_EQ(account_info,
-            manager_->GetPrimaryAccountInfo(ConsentLevel::kNotRequired));
+            manager_->GetPrimaryAccountInfo(ConsentLevel::kSignin));
   EXPECT_EQ(CoreAccountInfo(),
             manager_->GetPrimaryAccountInfo(ConsentLevel::kSync));
 
@@ -559,7 +556,7 @@
   EXPECT_EQ(0, num_successful_signouts_);
   EXPECT_EQ(2, num_unconsented_account_changed_);
   EXPECT_EQ(CoreAccountInfo(),
-            manager_->GetPrimaryAccountInfo(ConsentLevel::kNotRequired));
+            manager_->GetPrimaryAccountInfo(ConsentLevel::kSignin));
   EXPECT_EQ(CoreAccountInfo(),
             manager_->GetPrimaryAccountInfo(ConsentLevel::kSync));
 }
@@ -575,10 +572,9 @@
                               signin_metrics::SignoutDelete::IGNORE_METRIC);
   EXPECT_EQ(1, num_successful_signouts_);
   EXPECT_FALSE(manager_->HasPrimaryAccount(ConsentLevel::kSync));
-  EXPECT_TRUE(manager_->HasPrimaryAccount(ConsentLevel::kNotRequired));
-  EXPECT_EQ(
-      account_id,
-      manager_->GetPrimaryAccountInfo(ConsentLevel::kNotRequired).account_id);
+  EXPECT_TRUE(manager_->HasPrimaryAccount(ConsentLevel::kSignin));
+  EXPECT_EQ(account_id,
+            manager_->GetPrimaryAccountInfo(ConsentLevel::kSignin).account_id);
 }
 
 #if !BUILDFLAG(IS_CHROMEOS_ASH)
@@ -593,6 +589,6 @@
                                 signin_metrics::SignoutDelete::IGNORE_METRIC);
   EXPECT_EQ(1, num_successful_signouts_);
   EXPECT_FALSE(manager_->HasPrimaryAccount(ConsentLevel::kSync));
-  EXPECT_FALSE(manager_->HasPrimaryAccount(ConsentLevel::kNotRequired));
+  EXPECT_FALSE(manager_->HasPrimaryAccount(ConsentLevel::kSignin));
 }
 #endif  // !BUILDFLAG(IS_CHROMEOS_ASH)
diff --git a/components/signin/internal/identity_manager/primary_account_mutator_impl.cc b/components/signin/internal/identity_manager/primary_account_mutator_impl.cc
index fb06b6a..83900c8 100644
--- a/components/signin/internal/identity_manager/primary_account_mutator_impl.cc
+++ b/components/signin/internal/identity_manager/primary_account_mutator_impl.cc
@@ -71,8 +71,7 @@
 #if BUILDFLAG(IS_CHROMEOS_ASH)
   // On Chrome OS the UPA can only be set once and never removed or changed.
   DCHECK(!account_id.empty());
-  DCHECK(
-      !primary_account_manager_->HasPrimaryAccount(ConsentLevel::kNotRequired));
+  DCHECK(!primary_account_manager_->HasPrimaryAccount(ConsentLevel::kSignin));
 #endif
   AccountInfo account_info;
   if (!account_id.empty()) {
@@ -126,7 +125,7 @@
 bool PrimaryAccountMutatorImpl::ClearPrimaryAccount(
     signin_metrics::ProfileSignout source_metric,
     signin_metrics::SignoutDelete delete_metric) {
-  if (!primary_account_manager_->HasPrimaryAccount(ConsentLevel::kNotRequired))
+  if (!primary_account_manager_->HasPrimaryAccount(ConsentLevel::kSignin))
     return false;
 
   primary_account_manager_->ClearPrimaryAccount(source_metric, delete_metric);
diff --git a/components/signin/ios/browser/account_consistency_service.mm b/components/signin/ios/browser/account_consistency_service.mm
index 3f9f0d9..0b52e088 100644
--- a/components/signin/ios/browser/account_consistency_service.mm
+++ b/components/signin/ios/browser/account_consistency_service.mm
@@ -175,8 +175,7 @@
   GURL url = net::GURLWithNSURL(request.URL);
   if (base::FeatureList::IsEnabled(signin::kRestoreGaiaCookiesOnUserAction) &&
       signin::IsUrlEligibleForMirrorCookie(url) &&
-      identity_manager_->HasPrimaryAccount(
-          signin::ConsentLevel::kNotRequired)) {
+      identity_manager_->HasPrimaryAccount(signin::ConsentLevel::kSignin)) {
     // CHROME_CONNECTED cookies are added asynchronously on google.com and
     // youtube.com domains when Chrome detects that the user is signed-in. By
     // continuing to fulfill the navigation once the cookie request is sent,
@@ -261,8 +260,7 @@
     case signin::GAIA_SERVICE_TYPE_ADDSESSION:
       // This situation is only possible if the all cookies have been deleted by
       // ITP restrictions and Chrome has not triggered a cookie refresh.
-      if (identity_manager_->HasPrimaryAccount(
-              signin::ConsentLevel::kNotRequired)) {
+      if (identity_manager_->HasPrimaryAccount(signin::ConsentLevel::kSignin)) {
         LogIOSGaiaCookiesState(GaiaCookieStateOnSignedInNavigation::
                                    kGaiaCookieAbsentOnAddSessionNavigation);
         if (base::FeatureList::IsEnabled(
@@ -377,8 +375,7 @@
       identity_manager_(identity_manager),
       active_cookie_manager_requests_for_testing_(0) {
   identity_manager_->AddObserver(this);
-  if (identity_manager_->HasPrimaryAccount(
-          signin::ConsentLevel::kNotRequired)) {
+  if (identity_manager_->HasPrimaryAccount(signin::ConsentLevel::kSignin)) {
     AddChromeConnectedCookies();
   } else {
     RemoveAllChromeConnectedCookies(base::OnceClosure());
@@ -433,8 +430,7 @@
   // |GetAllCookies| in the cookie manager.
   if (base::Time::Now() - last_gaia_cookie_verification_time_ <
           GetDelayThresholdToUpdateGaiaCookie() ||
-      !identity_manager_->HasPrimaryAccount(
-          signin::ConsentLevel::kNotRequired)) {
+      !identity_manager_->HasPrimaryAccount(signin::ConsentLevel::kSignin)) {
     return;
   }
   network::mojom::CookieManager* cookie_manager =
@@ -588,7 +584,7 @@
 
 void AccountConsistencyService::OnPrimaryAccountChanged(
     const signin::PrimaryAccountChangeEvent& event) {
-  switch (event.GetEventTypeFor(signin::ConsentLevel::kNotRequired)) {
+  switch (event.GetEventTypeFor(signin::ConsentLevel::kSignin)) {
     case signin::PrimaryAccountChangeEvent::Type::kSet:
     case signin::PrimaryAccountChangeEvent::Type::kNone:
       AddChromeConnectedCookies();
diff --git a/components/signin/public/android/java/src/org/chromium/components/signin/AccountTrackerService.java b/components/signin/public/android/java/src/org/chromium/components/signin/AccountTrackerService.java
index 5e657f2..4b7d807 100644
--- a/components/signin/public/android/java/src/org/chromium/components/signin/AccountTrackerService.java
+++ b/components/signin/public/android/java/src/org/chromium/components/signin/AccountTrackerService.java
@@ -124,7 +124,7 @@
         mSystemAccountsSeedingObservers.addObserver(observer);
     }
 
-    private void seedAccounts() {
+    public void seedAccounts() {
         ThreadUtils.assertOnUiThread();
         final AccountManagerFacade accountManagerFacade =
                 AccountManagerFacadeProvider.getInstance();
@@ -135,8 +135,7 @@
         mAccountsSeedingStatus = AccountsSeedingStatus.IN_PROGRESS;
 
         if (mAccountsChangeObserver == null) {
-            mAccountsChangeObserver =
-                    () -> invalidateAccountSeedStatus(false /* don't reseed right now */);
+            mAccountsChangeObserver = this::seedAccounts;
             accountManagerFacade.addObserver(mAccountsChangeObserver);
         }
 
@@ -195,7 +194,11 @@
     /**
      * Notifies the AccountTrackerService about changed system accounts. without actually triggering
      * @param reSeedAccounts Whether to also start seeding the new account information immediately.
+     *
+     * TODO(crbug/1185712): Replace the only caller of this method SigninManagerImpl to call
+     * seedAccounts() directly.
      */
+    @Deprecated
     public void invalidateAccountSeedStatus(boolean reSeedAccounts) {
         ThreadUtils.assertOnUiThread();
         mAccountsSeedingStatus = AccountsSeedingStatus.NOT_STARTED;
diff --git a/components/signin/public/android/junit/src/org/chromium/components/signin/AccountTrackerServiceTest.java b/components/signin/public/android/junit/src/org/chromium/components/signin/AccountTrackerServiceTest.java
index 6712217a..95d99fb 100644
--- a/components/signin/public/android/junit/src/org/chromium/components/signin/AccountTrackerServiceTest.java
+++ b/components/signin/public/android/junit/src/org/chromium/components/signin/AccountTrackerServiceTest.java
@@ -137,6 +137,18 @@
     }
 
     @Test
+    public void testAddingNewAccountTriggersSeedingAccounts() {
+        mService.seedAccountsIfNeeded(() -> {});
+        final Account newAccount = AccountUtils.createAccountFromName("test2@gmail.com");
+        verify(mNativeMock).seedAccountsInfo(eq(ACCOUNT_TRACKER_SERVICE_NATIVE), any(), any());
+
+        mFakeAccountManagerFacade.addAccount(newAccount);
+
+        verify(mNativeMock, times(2))
+                .seedAccountsInfo(eq(ACCOUNT_TRACKER_SERVICE_NATIVE), any(), any());
+    }
+
+    @Test
     public void testInvalidateAccountsAndReSeed() {
         mService.seedAccountsIfNeeded(() -> {});
 
diff --git a/components/signin/public/base/signin_metrics.cc b/components/signin/public/base/signin_metrics.cc
index 7f19138..fc1da41 100644
--- a/components/signin/public/base/signin_metrics.cc
+++ b/components/signin/public/base/signin_metrics.cc
@@ -603,8 +603,7 @@
 }
 
 void LogSigninReason(Reason reason) {
-  UMA_HISTOGRAM_ENUMERATION("Signin.SigninReason", static_cast<int>(reason),
-                            static_cast<int>(Reason::REASON_MAX));
+  UMA_HISTOGRAM_ENUMERATION("Signin.SigninReason", reason);
 }
 
 void LogSigninAccountReconciliation(int total_number_accounts,
diff --git a/components/signin/public/base/signin_metrics.h b/components/signin/public/base/signin_metrics.h
index 7a712ff..fe42851 100644
--- a/components/signin/public/base/signin_metrics.h
+++ b/components/signin/public/base/signin_metrics.h
@@ -288,21 +288,26 @@
 #endif  // defined(OS_ANDROID)
 
 // Enum values which enumerates all reasons to start sign in process.
+// These values are persisted to logs. Entries should not be renumbered and
+// numeric values should never be reused.
+// Please keep in Sync with "SigninReason" in
+// src/tools/metrics/histograms/enums.xml.
 // A Java counterpart will be generated for this enum.
 // GENERATED_JAVA_ENUM_PACKAGE: org.chromium.components.signin.metrics
 // GENERATED_JAVA_CLASS_NAME_OVERRIDE: SigninReason
 enum class Reason : int {
   REASON_SIGNIN_PRIMARY_ACCOUNT = 0,
-  REASON_ADD_SECONDARY_ACCOUNT,
-  REASON_REAUTHENTICATION,
-  REASON_UNLOCK,
-  REASON_UNKNOWN_REASON,  // This should never have been used to get signin URL.
-  REASON_FORCED_SIGNIN_PRIMARY_ACCOUNT,
-  REASON_FETCH_LST_ONLY,  // Used to simply login and acquire a login scope
-                          // token without actually signing into any profiles on
-                          // Chrome. This allows the chrome signin page to work
-                          // in incognito mode.
-  REASON_MAX,             // This must be last.
+  REASON_ADD_SECONDARY_ACCOUNT = 1,
+  REASON_REAUTHENTICATION = 2,
+  // REASON_UNLOCK = 3,  // DEPRECATED, profile unlocking was removed.
+  // This should never have been used to get signin URL.
+  REASON_UNKNOWN_REASON = 4,
+  REASON_FORCED_SIGNIN_PRIMARY_ACCOUNT = 5,
+  // Used to simply login and acquire a login scope token without actually
+  // signing into any profiles on Chrome. This allows the chrome signin page to
+  // work in incognito mode.
+  REASON_FETCH_LST_ONLY = 6,
+  kMaxValue = REASON_FETCH_LST_ONLY,
 };
 
 // Enum values used for use with the "Signin.Reauth" histogram.
diff --git a/components/signin/public/identity_manager/access_token_constants.h b/components/signin/public/identity_manager/access_token_constants.h
index aed842d..4105f53 100644
--- a/components/signin/public/identity_manager/access_token_constants.h
+++ b/components/signin/public/identity_manager/access_token_constants.h
@@ -13,7 +13,7 @@
 namespace signin {
 
 // Set of Google OAuth2 API scopes that do not require user consent for their
-// usage - these scopes are accessible at ConsentLevel::kNotRequired.
+// usage - these scopes are accessible at ConsentLevel::kSignin.
 const std::set<std::string> GetUnconsentedOAuth2Scopes();
 
 // Set of Google OAuth2 API scopes that require privileged access - these scopes
diff --git a/components/signin/public/identity_manager/accounts_cookie_mutator.h b/components/signin/public/identity_manager/accounts_cookie_mutator.h
index 2cab371..200fd2a 100644
--- a/components/signin/public/identity_manager/accounts_cookie_mutator.h
+++ b/components/signin/public/identity_manager/accounts_cookie_mutator.h
@@ -36,7 +36,8 @@
    public:
     // Creates a new GaiaAuthFetcher for the partition.
     virtual std::unique_ptr<GaiaAuthFetcher> CreateGaiaAuthFetcherForPartition(
-        GaiaAuthConsumer* consumer) = 0;
+        GaiaAuthConsumer* consumer,
+        const gaia::GaiaSource& source) = 0;
 
     // Returns the CookieManager for the partition.
     virtual network::mojom::CookieManager* GetCookieManagerForPartition() = 0;
@@ -105,6 +106,7 @@
   SetAccountsInCookieForPartition(
       PartitionDelegate* partition_delegate,
       const MultiloginParameters& parameters,
+      gaia::GaiaSource source,
       base::OnceCallback<void(SetAccountsInCookieResult)>
           set_accounts_in_cookies_completed_callback) = 0;
 
diff --git a/components/signin/public/identity_manager/accounts_cookie_mutator_unittest.cc b/components/signin/public/identity_manager/accounts_cookie_mutator_unittest.cc
index 216f9e5..77a4839d 100644
--- a/components/signin/public/identity_manager/accounts_cookie_mutator_unittest.cc
+++ b/components/signin/public/identity_manager/accounts_cookie_mutator_unittest.cc
@@ -159,9 +159,9 @@
  private:
   // AccountsCookieMutator::PartitionDelegate
   std::unique_ptr<GaiaAuthFetcher> CreateGaiaAuthFetcherForPartition(
-      GaiaAuthConsumer* consumer) override {
-    return test_signin_client_.CreateGaiaAuthFetcher(consumer,
-                                                     gaia::GaiaSource::kChrome);
+      GaiaAuthConsumer* consumer,
+      const gaia::GaiaSource& source) override {
+    return test_signin_client_.CreateGaiaAuthFetcher(consumer, source);
   }
 
   network::mojom::CookieManager* GetCookieManagerForPartition() override {
@@ -402,7 +402,7 @@
       {account_id, other_account_id}};
   std::unique_ptr<AccountsCookieMutator::SetAccountsInCookieTask> task =
       accounts_cookie_mutator()->SetAccountsInCookieForPartition(
-          this, parameters,
+          this, parameters, gaia::GaiaSource::kChrome,
           base::BindOnce(
               [](base::OnceClosure quit_closure,
                  SetAccountsInCookieResult result) {
@@ -436,7 +436,7 @@
       {account_id, other_account_id}};
   std::unique_ptr<AccountsCookieMutator::SetAccountsInCookieTask> task =
       accounts_cookie_mutator()->SetAccountsInCookieForPartition(
-          this, parameters,
+          this, parameters, gaia::GaiaSource::kChrome,
           base::BindOnce([](SetAccountsInCookieResult) { NOTREACHED(); }));
   task.reset();
 }
diff --git a/components/signin/public/identity_manager/consent_level.h b/components/signin/public/identity_manager/consent_level.h
index 9494ffe..23632cb 100644
--- a/components/signin/public/identity_manager/consent_level.h
+++ b/components/signin/public/identity_manager/consent_level.h
@@ -12,9 +12,11 @@
 // GENERATED_JAVA_ENUM_PACKAGE: org.chromium.components.signin.identitymanager
 enum class ConsentLevel {
   // No specific consent required. In particular, browser sync consent is not
-  // required. Operations are allowed if the user is signed in to Chrome. See
-  // "unconsented primary account" in ./README.md.
-  kNotRequired,
+  // required. Operations are allowed if the user is signed in to Chrome. It is
+  // the responsibility of the client to ask for explicit user consent for any
+  // operation that requires information from the primary account.
+  // See "unconsented primary account" in ./README.md.
+  kSignin,
 
   // Chrome browser sync consent is required. Historically (before DICE and
   // Project Butter) most operations implicitly required this consent. See
diff --git a/components/signin/public/identity_manager/identity_manager.cc b/components/signin/public/identity_manager/identity_manager.cc
index 2fea383..ff1a8f5c 100644
--- a/components/signin/public/identity_manager/identity_manager.cc
+++ b/components/signin/public/identity_manager/identity_manager.cc
@@ -630,9 +630,9 @@
 }
 
 void IdentityManager::OnAccountUpdated(const AccountInfo& info) {
-  if (HasPrimaryAccount(signin::ConsentLevel::kNotRequired)) {
+  if (HasPrimaryAccount(signin::ConsentLevel::kSignin)) {
     const CoreAccountId primary_account_id =
-        GetPrimaryAccountId(ConsentLevel::kNotRequired);
+        GetPrimaryAccountId(ConsentLevel::kSignin);
     if (primary_account_id == info.account_id) {
       primary_account_manager_->UpdatePrimaryAccountInfo();
     }
diff --git a/components/signin/public/identity_manager/identity_manager_unittest.cc b/components/signin/public/identity_manager/identity_manager_unittest.cc
index 8d938f69..051122ac 100644
--- a/components/signin/public/identity_manager/identity_manager_unittest.cc
+++ b/components/signin/public/identity_manager/identity_manager_unittest.cc
@@ -532,8 +532,8 @@
   EXPECT_EQ(kTestEmail, primary_account_info.email);
 
   // Primary account is by definition also unconsented primary account.
-  EXPECT_EQ(primary_account_info, identity_manager()->GetPrimaryAccountInfo(
-                                      ConsentLevel::kNotRequired));
+  EXPECT_EQ(primary_account_info,
+            identity_manager()->GetPrimaryAccountInfo(ConsentLevel::kSignin));
   // There is no guarantee that this will be notified via callback on startup.
 }
 
@@ -550,7 +550,7 @@
   EXPECT_EQ(PrimaryAccountChangeEvent::Type::kSet,
             event.GetEventTypeFor(ConsentLevel::kSync));
   EXPECT_EQ(PrimaryAccountChangeEvent::Type::kSet,
-            event.GetEventTypeFor(ConsentLevel::kNotRequired));
+            event.GetEventTypeFor(ConsentLevel::kSignin));
 
   CoreAccountInfo primary_account_from_set_callback =
       event.GetCurrentState().primary_account;
@@ -563,8 +563,8 @@
   EXPECT_EQ(kTestEmail, primary_account_info.email);
 
   // Primary account is by definition also unconsented primary account.
-  EXPECT_EQ(primary_account_info, identity_manager()->GetPrimaryAccountInfo(
-                                      ConsentLevel::kNotRequired));
+  EXPECT_EQ(primary_account_info,
+            identity_manager()->GetPrimaryAccountInfo(ConsentLevel::kSignin));
 
   CoreAccountId primary_account_id =
       identity_manager()->GetPrimaryAccountId(signin::ConsentLevel::kSync);
@@ -572,7 +572,7 @@
   EXPECT_EQ(primary_account_id, primary_account_info.account_id);
 
   EXPECT_EQ(primary_account_id, identity_manager()->GetPrimaryAccountId(
-                                    signin::ConsentLevel::kNotRequired));
+                                    signin::ConsentLevel::kSignin));
 }
 
 // Test that the user signing out results in firing of the IdentityManager
@@ -590,7 +590,7 @@
   EXPECT_EQ(PrimaryAccountChangeEvent::Type::kCleared,
             event.GetEventTypeFor(ConsentLevel::kSync));
   EXPECT_EQ(PrimaryAccountChangeEvent::Type::kCleared,
-            event.GetEventTypeFor(ConsentLevel::kNotRequired));
+            event.GetEventTypeFor(ConsentLevel::kSignin));
 
   CoreAccountInfo primary_account_from_cleared_callback =
       event.GetPreviousState().primary_account;
@@ -599,22 +599,22 @@
 
   // After the sign-out, there is no unconsented primary account.
   EXPECT_TRUE(identity_manager()
-                  ->GetPrimaryAccountInfo(ConsentLevel::kNotRequired)
+                  ->GetPrimaryAccountInfo(ConsentLevel::kSignin)
                   .IsEmpty());
 
   CoreAccountInfo primary_account_info =
       identity_manager()->GetPrimaryAccountInfo(signin::ConsentLevel::kSync);
   EXPECT_EQ("", primary_account_info.gaia);
   EXPECT_EQ("", primary_account_info.email);
-  EXPECT_EQ(primary_account_info, identity_manager()->GetPrimaryAccountInfo(
-                                      ConsentLevel::kNotRequired));
+  EXPECT_EQ(primary_account_info,
+            identity_manager()->GetPrimaryAccountInfo(ConsentLevel::kSignin));
 
   CoreAccountId primary_account_id =
       identity_manager()->GetPrimaryAccountId(signin::ConsentLevel::kSync);
   EXPECT_TRUE(primary_account_id.empty());
   EXPECT_EQ(primary_account_id, primary_account_info.account_id);
   EXPECT_EQ(primary_account_id, identity_manager()->GetPrimaryAccountId(
-                                    signin::ConsentLevel::kNotRequired));
+                                    signin::ConsentLevel::kSignin));
 }
 
 // Test that the primary account's core info remains tracked by the
@@ -639,22 +639,21 @@
   EXPECT_EQ(kTestGaiaId, primary_account_info.gaia);
   EXPECT_EQ(kTestEmail, primary_account_info.email);
   EXPECT_EQ(CoreAccountId(kTestGaiaId), primary_account_info.account_id);
-  EXPECT_EQ(primary_account_info, identity_manager()->GetPrimaryAccountInfo(
-                                      ConsentLevel::kNotRequired));
+  EXPECT_EQ(primary_account_info,
+            identity_manager()->GetPrimaryAccountInfo(ConsentLevel::kSignin));
 
   CoreAccountId primary_account_id =
       identity_manager()->GetPrimaryAccountId(signin::ConsentLevel::kSync);
   EXPECT_EQ(primary_account_id, CoreAccountId(kTestGaiaId));
-  EXPECT_EQ(primary_account_id, identity_manager()->GetPrimaryAccountId(
-                                    ConsentLevel::kNotRequired));
+  EXPECT_EQ(primary_account_id,
+            identity_manager()->GetPrimaryAccountId(ConsentLevel::kSignin));
 }
 #endif  // !BUILDFLAG(IS_CHROMEOS_ASH)
 
 TEST_F(IdentityManagerTest, HasPrimaryAccount) {
   EXPECT_TRUE(
       identity_manager()->HasPrimaryAccount(signin::ConsentLevel::kSync));
-  EXPECT_TRUE(
-      identity_manager()->HasPrimaryAccount(ConsentLevel::kNotRequired));
+  EXPECT_TRUE(identity_manager()->HasPrimaryAccount(ConsentLevel::kSignin));
 
   // Removing the account from the AccountTrackerService should not cause
   // IdentityManager to think that there is no longer a primary account.
@@ -662,8 +661,7 @@
       identity_manager()->GetPrimaryAccountId(signin::ConsentLevel::kSync));
   EXPECT_TRUE(
       identity_manager()->HasPrimaryAccount(signin::ConsentLevel::kSync));
-  EXPECT_TRUE(
-      identity_manager()->HasPrimaryAccount(ConsentLevel::kNotRequired));
+  EXPECT_TRUE(identity_manager()->HasPrimaryAccount(ConsentLevel::kSignin));
 
 #if !BUILDFLAG(IS_CHROMEOS_ASH)
   // Signing out should cause IdentityManager to recognize that there is no
@@ -671,8 +669,7 @@
   ClearPrimaryAccount(identity_manager());
   EXPECT_FALSE(
       identity_manager()->HasPrimaryAccount(signin::ConsentLevel::kSync));
-  EXPECT_FALSE(
-      identity_manager()->HasPrimaryAccount(ConsentLevel::kNotRequired));
+  EXPECT_FALSE(identity_manager()->HasPrimaryAccount(ConsentLevel::kSignin));
   EXPECT_FALSE(identity_manager_observer()
                    ->GetPrimaryAccountChangedEvent()
                    .GetPreviousState()
@@ -928,10 +925,9 @@
                 ->GetPrimaryAccountInfo(signin::ConsentLevel::kSync)
                 .email,
             kTestEmail);
-  EXPECT_EQ(identity_manager()
-                ->GetPrimaryAccountInfo(ConsentLevel::kNotRequired)
-                .email,
-            kTestEmail);
+  EXPECT_EQ(
+      identity_manager()->GetPrimaryAccountInfo(ConsentLevel::kSignin).email,
+      kTestEmail);
 
   // Add a refresh token for the primary account and check that it
   // also shows up in GetAccountsWithRefreshTokens().
@@ -957,10 +953,9 @@
                 ->GetPrimaryAccountInfo(signin::ConsentLevel::kSync)
                 .email,
             kTestEmail);
-  EXPECT_EQ(identity_manager()
-                ->GetPrimaryAccountInfo(ConsentLevel::kNotRequired)
-                .email,
-            kTestEmail);
+  EXPECT_EQ(
+      identity_manager()->GetPrimaryAccountInfo(ConsentLevel::kSignin).email,
+      kTestEmail);
 
   // Remove the token for the primary account and check that account2 is still
   // present.
@@ -981,10 +976,9 @@
                 ->GetPrimaryAccountInfo(signin::ConsentLevel::kSync)
                 .email,
             kTestEmail);
-  EXPECT_EQ(identity_manager()
-                ->GetPrimaryAccountInfo(ConsentLevel::kNotRequired)
-                .email,
-            kTestEmail);
+  EXPECT_EQ(
+      identity_manager()->GetPrimaryAccountInfo(ConsentLevel::kSignin).email,
+      kTestEmail);
 }
 
 TEST_F(
@@ -992,8 +986,7 @@
     HasPrimaryAccountWithRefreshTokenInteractionBetweenPrimaryAndSecondaryAccounts) {
   EXPECT_FALSE(identity_manager()->HasPrimaryAccountWithRefreshToken(
       signin::ConsentLevel::kSync));
-  EXPECT_TRUE(
-      identity_manager()->HasPrimaryAccount(ConsentLevel::kNotRequired));
+  EXPECT_TRUE(identity_manager()->HasPrimaryAccount(ConsentLevel::kSignin));
 
   // Add a refresh token for a secondary account and check that it doesn't
   // impact the above state.
@@ -1004,8 +997,7 @@
 
   EXPECT_FALSE(identity_manager()->HasPrimaryAccountWithRefreshToken(
       signin::ConsentLevel::kSync));
-  EXPECT_TRUE(
-      identity_manager()->HasPrimaryAccount(ConsentLevel::kNotRequired));
+  EXPECT_TRUE(identity_manager()->HasPrimaryAccount(ConsentLevel::kSignin));
 
   // Add a refresh token for the primary account and check that it
   // *does* impact the stsate of
@@ -1014,8 +1006,7 @@
 
   EXPECT_TRUE(identity_manager()->HasPrimaryAccountWithRefreshToken(
       signin::ConsentLevel::kSync));
-  EXPECT_TRUE(
-      identity_manager()->HasPrimaryAccount(ConsentLevel::kNotRequired));
+  EXPECT_TRUE(identity_manager()->HasPrimaryAccount(ConsentLevel::kSignin));
 
   // Remove the token for the secondary account and check that this doesn't flip
   // the state.
@@ -1023,8 +1014,7 @@
 
   EXPECT_TRUE(identity_manager()->HasPrimaryAccountWithRefreshToken(
       signin::ConsentLevel::kSync));
-  EXPECT_TRUE(
-      identity_manager()->HasPrimaryAccount(ConsentLevel::kNotRequired));
+  EXPECT_TRUE(identity_manager()->HasPrimaryAccount(ConsentLevel::kSignin));
 
   // Remove the token for the primary account and check that this flips the
   // state.
@@ -1032,8 +1022,7 @@
 
   EXPECT_FALSE(identity_manager()->HasPrimaryAccountWithRefreshToken(
       signin::ConsentLevel::kSync));
-  EXPECT_TRUE(
-      identity_manager()->HasPrimaryAccount(ConsentLevel::kNotRequired));
+  EXPECT_TRUE(identity_manager()->HasPrimaryAccount(ConsentLevel::kSignin));
 }
 
 TEST_F(
@@ -1542,9 +1531,8 @@
       identity_manager()->GetPrimaryAccountInfo(signin::ConsentLevel::kSync);
   EXPECT_EQ(kTestGaiaId, primary_account_info.gaia);
   EXPECT_EQ(kTestEmailWithPeriod, primary_account_info.email);
-  EXPECT_EQ(
-      identity_manager()->GetPrimaryAccountInfo(ConsentLevel::kNotRequired),
-      primary_account_info);
+  EXPECT_EQ(identity_manager()->GetPrimaryAccountInfo(ConsentLevel::kSignin),
+            primary_account_info);
 }
 #endif
 
diff --git a/components/signin/public/identity_manager/identity_mutator.cc b/components/signin/public/identity_manager/identity_mutator.cc
index 544fd38..fe5b5bac 100644
--- a/components/signin/public/identity_manager/identity_mutator.cc
+++ b/components/signin/public/identity_manager/identity_mutator.cc
@@ -35,7 +35,7 @@
     case ConsentLevel::kSync:
       return primary_account_mutator->SetPrimaryAccount(
           ConvertFromJavaCoreAccountId(env, primary_account_id));
-    case ConsentLevel::kNotRequired:
+    case ConsentLevel::kSignin:
       primary_account_mutator->SetUnconsentedPrimaryAccount(
           ConvertFromJavaCoreAccountId(env, primary_account_id));
       return true;
diff --git a/components/signin/public/identity_manager/identity_test_environment.cc b/components/signin/public/identity_manager/identity_test_environment.cc
index c186f5f..80e3f17 100644
--- a/components/signin/public/identity_manager/identity_test_environment.cc
+++ b/components/signin/public/identity_manager/identity_test_environment.cc
@@ -396,7 +396,7 @@
 
 AccountInfo IdentityTestEnvironment::MakeUnconsentedPrimaryAccountAvailable(
     const std::string& email) {
-  DCHECK(!identity_manager()->HasPrimaryAccount(ConsentLevel::kNotRequired));
+  DCHECK(!identity_manager()->HasPrimaryAccount(ConsentLevel::kSignin));
 #if BUILDFLAG(IS_CHROMEOS_ASH)
   // Chrome OS sets the unconsented primary account during login and does not
   // allow signout.
@@ -413,16 +413,16 @@
   base::RunLoop().RunUntilIdle();
   // Tests that don't use the |SigninManager| needs the unconsented primary
   // account to be set manually.
-  if (!identity_manager()->HasPrimaryAccount(ConsentLevel::kNotRequired)) {
+  if (!identity_manager()->HasPrimaryAccount(ConsentLevel::kSignin)) {
     identity_manager()
         ->GetPrimaryAccountMutator()
         ->SetUnconsentedPrimaryAccount(account_info.account_id);
   }
 #endif
-  DCHECK(identity_manager()->HasPrimaryAccount(ConsentLevel::kNotRequired));
-  DCHECK_EQ(email, identity_manager()
-                       ->GetPrimaryAccountInfo(ConsentLevel::kNotRequired)
-                       .email);
+  DCHECK(identity_manager()->HasPrimaryAccount(ConsentLevel::kSignin));
+  DCHECK_EQ(
+      email,
+      identity_manager()->GetPrimaryAccountInfo(ConsentLevel::kSignin).email);
   return account_info;
 }
 
diff --git a/components/signin/public/identity_manager/identity_test_environment.h b/components/signin/public/identity_manager/identity_test_environment.h
index 5c2b86a..b1e5512 100644
--- a/components/signin/public/identity_manager/identity_test_environment.h
+++ b/components/signin/public/identity_manager/identity_test_environment.h
@@ -159,7 +159,7 @@
                                               const std::string& gaia_id);
 
   // Revokes sync consent from the primary account: the primary account is left
-  // at ConsentLevel::kNotRequired.
+  // at ConsentLevel::kSignin.
   void RevokeSyncConsent();
 
   // Clears the primary account, removes all accounts and revokes the sync
diff --git a/components/signin/public/identity_manager/identity_test_utils.cc b/components/signin/public/identity_manager/identity_test_utils.cc
index 6997489..f710b17d 100644
--- a/components/signin/public/identity_manager/identity_test_utils.cc
+++ b/components/signin/public/identity_manager/identity_test_utils.cc
@@ -135,7 +135,7 @@
 
 CoreAccountInfo SetUnconsentedPrimaryAccount(IdentityManager* identity_manager,
                                              const std::string& email) {
-  DCHECK(!identity_manager->HasPrimaryAccount(ConsentLevel::kNotRequired));
+  DCHECK(!identity_manager->HasPrimaryAccount(ConsentLevel::kSignin));
 
   AccountInfo account_info =
       EnsureAccountExists(identity_manager->GetAccountTrackerService(), email);
@@ -145,13 +145,12 @@
       identity_manager->GetPrimaryAccountManager();
   primary_account_manager->SetUnconsentedPrimaryAccountInfo(account_info);
 
-  DCHECK(identity_manager->HasPrimaryAccount(ConsentLevel::kNotRequired));
-  DCHECK_EQ(account_info.gaia,
-            identity_manager
-                ->GetPrimaryAccountInfo(signin::ConsentLevel::kNotRequired)
-                .gaia);
-  return identity_manager->GetPrimaryAccountInfo(
-      signin::ConsentLevel::kNotRequired);
+  DCHECK(identity_manager->HasPrimaryAccount(ConsentLevel::kSignin));
+  DCHECK_EQ(
+      account_info.gaia,
+      identity_manager->GetPrimaryAccountInfo(signin::ConsentLevel::kSignin)
+          .gaia);
+  return identity_manager->GetPrimaryAccountInfo(signin::ConsentLevel::kSignin);
 }
 
 void SetRefreshTokenForPrimaryAccount(IdentityManager* identity_manager,
@@ -223,7 +222,7 @@
   // synchronously with IdentityManager.
   NOTREACHED();
 #else
-  if (!identity_manager->HasPrimaryAccount(ConsentLevel::kNotRequired))
+  if (!identity_manager->HasPrimaryAccount(ConsentLevel::kSignin))
     return;
 
   DCHECK(identity_manager->GetPrimaryAccountMutator());
@@ -233,7 +232,7 @@
   TestIdentityManagerObserver signout_observer(identity_manager);
   signout_observer.SetOnPrimaryAccountChangedCallback(base::BindOnce(
       [](base::RunLoop* run_loop, PrimaryAccountChangeEvent event) {
-        if (event.GetEventTypeFor(ConsentLevel::kNotRequired) ==
+        if (event.GetEventTypeFor(ConsentLevel::kSignin) ==
             PrimaryAccountChangeEvent::Type::kCleared) {
           run_loop->Quit();
         }
diff --git a/components/signin/public/identity_manager/identity_test_utils.h b/components/signin/public/identity_manager/identity_test_utils.h
index 6cb4044..815a4a4 100644
--- a/components/signin/public/identity_manager/identity_test_utils.h
+++ b/components/signin/public/identity_manager/identity_test_utils.h
@@ -76,7 +76,7 @@
                                         const std::string& email);
 
 // Revokes sync consent from the primary account: the primary account is left
-// at ConsentLevel::kNotRequired.
+// at ConsentLevel::kSignin.
 // NOTE: See disclaimer at top of file re: direct usage.
 void RevokeSyncConsent(IdentityManager* identity_manager);
 
diff --git a/components/signin/public/identity_manager/primary_account_access_token_fetcher_unittest.cc b/components/signin/public/identity_manager/primary_account_access_token_fetcher_unittest.cc
index 7d96d79..d3aaae7 100644
--- a/components/signin/public/identity_manager/primary_account_access_token_fetcher_unittest.cc
+++ b/components/signin/public/identity_manager/primary_account_access_token_fetcher_unittest.cc
@@ -449,7 +449,7 @@
 // whether or not sync consent is required.
 INSTANTIATE_TEST_SUITE_P(All,
                          PrimaryAccountAccessTokenFetcherTest,
-                         testing::Values(ConsentLevel::kNotRequired,
+                         testing::Values(ConsentLevel::kSignin,
                                          ConsentLevel::kSync));
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
@@ -465,7 +465,7 @@
   // Perform an immediate fetch with consent not required.
   auto fetcher = CreateFetcher(
       callback.Get(), PrimaryAccountAccessTokenFetcher::Mode::kImmediate,
-      ConsentLevel::kNotRequired);
+      ConsentLevel::kSignin);
 
   // We should get called back with the token.
   EXPECT_CALL(callback, Run(GoogleServiceAuthError::AuthErrorNone(),
@@ -499,7 +499,7 @@
   auto fetcher =
       CreateFetcher(callback.Get(),
                     PrimaryAccountAccessTokenFetcher::Mode::kWaitUntilAvailable,
-                    ConsentLevel::kNotRequired);
+                    ConsentLevel::kSignin);
   EXPECT_FALSE(identity_test_env()->IsAccessTokenRequestPending());
 
   // Simulate login.
diff --git a/components/signin/public/identity_manager/primary_account_change_event.cc b/components/signin/public/identity_manager/primary_account_change_event.cc
index 1380a620..3c7c7d2 100644
--- a/components/signin/public/identity_manager/primary_account_change_event.cc
+++ b/components/signin/public/identity_manager/primary_account_change_event.cc
@@ -52,7 +52,7 @@
          !previous_state_.primary_account.IsEmpty());
 
   switch (consent_level) {
-    case ConsentLevel::kNotRequired:
+    case ConsentLevel::kSignin:
       if (previous_state_.primary_account != current_state_.primary_account) {
         return current_state_.primary_account.IsEmpty() ? Type::kCleared
                                                         : Type::kSet;
@@ -66,7 +66,7 @@
       }
       // Cannot change the Sync account without clearing the primary account
       // first.
-      DCHECK_EQ(current_state_.consent_level, ConsentLevel::kNotRequired);
+      DCHECK_EQ(current_state_.consent_level, ConsentLevel::kSignin);
       return Type::kNone;
   }
 }
@@ -91,8 +91,7 @@
                          const PrimaryAccountChangeEvent::State& state) {
   os << "{ primary_account: " << state.primary_account.account_id << ", "
      << "consent_level:"
-     << (state.consent_level == ConsentLevel::kNotRequired ? "NotRequired"
-                                                           : "Sync")
+     << (state.consent_level == ConsentLevel::kSignin ? "NotRequired" : "Sync")
      << " }";
   return os;
 }
@@ -110,7 +109,7 @@
     JNIEnv* env,
     const PrimaryAccountChangeEvent& event_details) {
   PrimaryAccountChangeEvent::Type event_type_not_required =
-      event_details.GetEventTypeFor(ConsentLevel::kNotRequired);
+      event_details.GetEventTypeFor(ConsentLevel::kSignin);
   PrimaryAccountChangeEvent::Type event_type_sync =
       event_details.GetEventTypeFor(ConsentLevel::kSync);
   // Should not fire events if there is no change in primary accounts for any
diff --git a/components/signin/public/identity_manager/primary_account_change_event.h b/components/signin/public/identity_manager/primary_account_change_event.h
index 0be4251..edc4639b 100644
--- a/components/signin/public/identity_manager/primary_account_change_event.h
+++ b/components/signin/public/identity_manager/primary_account_change_event.h
@@ -36,7 +36,7 @@
     State& operator=(const State& other);
 
     CoreAccountInfo primary_account;
-    ConsentLevel consent_level = ConsentLevel::kNotRequired;
+    ConsentLevel consent_level = ConsentLevel::kSignin;
   };
 
   PrimaryAccountChangeEvent();
diff --git a/components/signin/public/identity_manager/primary_account_change_event_unittest.cc b/components/signin/public/identity_manager/primary_account_change_event_unittest.cc
index 33866c8..01cbe36 100644
--- a/components/signin/public/identity_manager/primary_account_change_event_unittest.cc
+++ b/components/signin/public/identity_manager/primary_account_change_event_unittest.cc
@@ -18,9 +18,9 @@
     CoreAccountInfo account_info1 = GetCoreAccountInfoFrom("account1@test.com");
     CoreAccountInfo account_info2 = GetCoreAccountInfoFrom("account2@test.com");
 
-    empty_not_required_ = State(CoreAccountInfo(), ConsentLevel::kNotRequired);
-    account1_not_required_ = State(account_info1, ConsentLevel::kNotRequired);
-    account2_not_required_ = State(account_info2, ConsentLevel::kNotRequired);
+    empty_not_required_ = State(CoreAccountInfo(), ConsentLevel::kSignin);
+    account1_not_required_ = State(account_info1, ConsentLevel::kSignin);
+    account2_not_required_ = State(account_info2, ConsentLevel::kSignin);
     account1_sync_ = State(account_info1, ConsentLevel::kSync);
     account2_sync_ = State(account_info2, ConsentLevel::kSync);
   }
@@ -43,56 +43,56 @@
 
 TEST_F(PrimaryAccountChangeEventTest, NoStateChange) {
   PrimaryAccountChangeEvent event(empty_not_required_, empty_not_required_);
-  EXPECT_EQ(Type::kNone, event.GetEventTypeFor(ConsentLevel::kNotRequired));
+  EXPECT_EQ(Type::kNone, event.GetEventTypeFor(ConsentLevel::kSignin));
   EXPECT_EQ(Type::kNone, event.GetEventTypeFor(ConsentLevel::kSync));
 
   event =
       PrimaryAccountChangeEvent(account1_not_required_, account1_not_required_);
-  EXPECT_EQ(Type::kNone, event.GetEventTypeFor(ConsentLevel::kNotRequired));
+  EXPECT_EQ(Type::kNone, event.GetEventTypeFor(ConsentLevel::kSignin));
   EXPECT_EQ(Type::kNone, event.GetEventTypeFor(ConsentLevel::kSync));
 
   event = PrimaryAccountChangeEvent(account1_sync_, account1_sync_);
-  EXPECT_EQ(Type::kNone, event.GetEventTypeFor(ConsentLevel::kNotRequired));
+  EXPECT_EQ(Type::kNone, event.GetEventTypeFor(ConsentLevel::kSignin));
   EXPECT_EQ(Type::kNone, event.GetEventTypeFor(ConsentLevel::kSync));
 }
 
 TEST_F(PrimaryAccountChangeEventTest,
        ConsentLevelChangeFromNotRequiredToNotRequired) {
   PrimaryAccountChangeEvent event(empty_not_required_, account1_not_required_);
-  EXPECT_EQ(Type::kSet, event.GetEventTypeFor(ConsentLevel::kNotRequired));
+  EXPECT_EQ(Type::kSet, event.GetEventTypeFor(ConsentLevel::kSignin));
   EXPECT_EQ(Type::kNone, event.GetEventTypeFor(ConsentLevel::kSync));
 
   event =
       PrimaryAccountChangeEvent(account1_not_required_, account2_not_required_);
-  EXPECT_EQ(Type::kSet, event.GetEventTypeFor(ConsentLevel::kNotRequired));
+  EXPECT_EQ(Type::kSet, event.GetEventTypeFor(ConsentLevel::kSignin));
   EXPECT_EQ(Type::kNone, event.GetEventTypeFor(ConsentLevel::kSync));
 
   event =
       PrimaryAccountChangeEvent(account1_not_required_, empty_not_required_);
-  EXPECT_EQ(Type::kCleared, event.GetEventTypeFor(ConsentLevel::kNotRequired));
+  EXPECT_EQ(Type::kCleared, event.GetEventTypeFor(ConsentLevel::kSignin));
   EXPECT_EQ(Type::kNone, event.GetEventTypeFor(ConsentLevel::kSync));
 }
 
 TEST_F(PrimaryAccountChangeEventTest, ConsentLevelChangeFromNotRequiredToSync) {
   PrimaryAccountChangeEvent event(empty_not_required_, account1_sync_);
-  EXPECT_EQ(Type::kSet, event.GetEventTypeFor(ConsentLevel::kNotRequired));
+  EXPECT_EQ(Type::kSet, event.GetEventTypeFor(ConsentLevel::kSignin));
   EXPECT_EQ(Type::kSet, event.GetEventTypeFor(ConsentLevel::kSync));
 
   event = PrimaryAccountChangeEvent(account1_not_required_, account1_sync_);
-  EXPECT_EQ(Type::kNone, event.GetEventTypeFor(ConsentLevel::kNotRequired));
+  EXPECT_EQ(Type::kNone, event.GetEventTypeFor(ConsentLevel::kSignin));
   EXPECT_EQ(Type::kSet, event.GetEventTypeFor(ConsentLevel::kSync));
 
   event = PrimaryAccountChangeEvent(account1_not_required_, account2_sync_);
-  EXPECT_EQ(Type::kSet, event.GetEventTypeFor(ConsentLevel::kNotRequired));
+  EXPECT_EQ(Type::kSet, event.GetEventTypeFor(ConsentLevel::kSignin));
   EXPECT_EQ(Type::kSet, event.GetEventTypeFor(ConsentLevel::kSync));
 }
 
 TEST_F(PrimaryAccountChangeEventTest, ConsentLevelChangeFromSyncToNotRequired) {
   PrimaryAccountChangeEvent event(account1_sync_, account1_not_required_);
-  EXPECT_EQ(Type::kNone, event.GetEventTypeFor(ConsentLevel::kNotRequired));
+  EXPECT_EQ(Type::kNone, event.GetEventTypeFor(ConsentLevel::kSignin));
   EXPECT_EQ(Type::kCleared, event.GetEventTypeFor(ConsentLevel::kSync));
 
   event = PrimaryAccountChangeEvent(account1_sync_, empty_not_required_);
-  EXPECT_EQ(Type::kCleared, event.GetEventTypeFor(ConsentLevel::kNotRequired));
+  EXPECT_EQ(Type::kCleared, event.GetEventTypeFor(ConsentLevel::kSignin));
   EXPECT_EQ(Type::kCleared, event.GetEventTypeFor(ConsentLevel::kSync));
 }
diff --git a/components/signin/public/identity_manager/primary_account_mutator.h b/components/signin/public/identity_manager/primary_account_mutator.h
index 05ee706..9695b599 100644
--- a/components/signin/public/identity_manager/primary_account_mutator.h
+++ b/components/signin/public/identity_manager/primary_account_mutator.h
@@ -60,9 +60,9 @@
 
   // Revokes sync consent from the primary account. We distinguish the following
   // cases:
-  // a. If transitioning from ConsentLevel::kSync to ConsentLevel::kNotRequired
+  // a. If transitioning from ConsentLevel::kSync to ConsentLevel::kSignin
   //    is supported (e.g. for DICE), then this method only revokes the sync
-  //    consent and the primary account is left at ConsentLevel::kNotRequired
+  //    consent and the primary account is left at ConsentLevel::kSignin
   //    level.
   // b. Otherwise this method revokes the sync consent and it also  clears the
   //    primary account and removes all other accounts via a call to
diff --git a/components/sync/driver/profile_sync_service.cc b/components/sync/driver/profile_sync_service.cc
index 74c915f..18306eb 100644
--- a/components/sync/driver/profile_sync_service.cc
+++ b/components/sync/driver/profile_sync_service.cc
@@ -896,8 +896,8 @@
         DCHECK(account_mutator);
 
         // Note: On some platforms, revoking the sync consent will also clear
-        // the primary account as transitioning from ConsentLevel::kSync
-        // ConsentLevel::kNotRequired is not supported.
+        // the primary account as transitioning from ConsentLevel::kSync to
+        // ConsentLevel::kSignin is not supported.
         account_mutator->RevokeSyncConsent(
             signin_metrics::SERVER_FORCED_DISABLE,
             signin_metrics::SignoutDelete::IGNORE_METRIC);
diff --git a/components/sync/driver/sync_auth_util.cc b/components/sync/driver/sync_auth_util.cc
index 4812e69..2ce97ded88 100644
--- a/components/sync/driver/sync_auth_util.cc
+++ b/components/sync/driver/sync_auth_util.cc
@@ -22,10 +22,10 @@
 
 SyncAccountInfo DetermineAccountToUse(
     signin::IdentityManager* identity_manager) {
-  return SyncAccountInfo(identity_manager->GetPrimaryAccountInfo(
-                             signin::ConsentLevel::kNotRequired),
-                         /*is_primary=*/identity_manager->HasPrimaryAccount(
-                             signin::ConsentLevel::kSync));
+  return SyncAccountInfo(
+      identity_manager->GetPrimaryAccountInfo(signin::ConsentLevel::kSignin),
+      /*is_primary=*/identity_manager->HasPrimaryAccount(
+          signin::ConsentLevel::kSync));
 }
 
 bool IsWebSignout(const GoogleServiceAuthError& auth_error) {
diff --git a/components/sync/trusted_vault/standalone_trusted_vault_client.cc b/components/sync/trusted_vault/standalone_trusted_vault_client.cc
index a6ecde4..9040c2d 100644
--- a/components/sync/trusted_vault/standalone_trusted_vault_client.cc
+++ b/components/sync/trusted_vault/standalone_trusted_vault_client.cc
@@ -91,8 +91,8 @@
 }
 
 void PrimaryAccountObserver::UpdatePrimaryAccountIfNeeded() {
-  CoreAccountInfo primary_account = identity_manager_->GetPrimaryAccountInfo(
-      signin::ConsentLevel::kNotRequired);
+  CoreAccountInfo primary_account =
+      identity_manager_->GetPrimaryAccountInfo(signin::ConsentLevel::kSignin);
   if (primary_account == primary_account_) {
     return;
   }
diff --git a/components/sync/trusted_vault/trusted_vault_access_token_fetcher_frontend.cc b/components/sync/trusted_vault/trusted_vault_access_token_fetcher_frontend.cc
index 3a329d8ed..0c09c3af 100644
--- a/components/sync/trusted_vault/trusted_vault_access_token_fetcher_frontend.cc
+++ b/components/sync/trusted_vault/trusted_vault_access_token_fetcher_frontend.cc
@@ -57,8 +57,7 @@
 
 void TrustedVaultAccessTokenFetcherFrontend::UpdatePrimaryAccountIfNeeded() {
   CoreAccountInfo primary_account_info =
-      identity_manager_->GetPrimaryAccountInfo(
-          signin::ConsentLevel::kNotRequired);
+      identity_manager_->GetPrimaryAccountInfo(signin::ConsentLevel::kSignin);
   if (primary_account_info.account_id == primary_account_) {
     return;
   }
@@ -80,7 +79,7 @@
           &TrustedVaultAccessTokenFetcherFrontend::OnAccessTokenFetchCompleted,
           base::Unretained(this)),
       signin::PrimaryAccountAccessTokenFetcher::Mode::kWaitUntilAvailable,
-      signin::ConsentLevel::kNotRequired);
+      signin::ConsentLevel::kSignin);
 }
 
 void TrustedVaultAccessTokenFetcherFrontend::OnAccessTokenFetchCompleted(
diff --git a/content/browser/android/dialog_overlay_impl.cc b/content/browser/android/dialog_overlay_impl.cc
index bebfde3..c5a9547e 100644
--- a/content/browser/android/dialog_overlay_impl.cc
+++ b/content/browser/android/dialog_overlay_impl.cc
@@ -82,6 +82,9 @@
   JNIEnv* env = AttachCurrentThread();
   obj_ = JavaObjectWeakGlobalRef(env, obj);
 
+  // Make sure RenderFrameDeleted will be called on RFH and thus we will clean
+  // up.
+  DCHECK(rfhi_->IsRenderFrameCreated());
   web_contents->GetNativeView()->AddObserver(this);
 
   // Note that we're not allowed to call back into |obj| before it calls
@@ -186,12 +189,6 @@
     Stop();
 }
 
-void DialogOverlayImpl::FrameDeleted(RenderFrameHost* render_frame_host) {
-  DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  if (render_frame_host == rfhi_)
-    Stop();
-}
-
 void DialogOverlayImpl::OnVisibilityChanged(content::Visibility visibility) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   if (visibility == content::Visibility::HIDDEN)
diff --git a/content/browser/android/dialog_overlay_impl.h b/content/browser/android/dialog_overlay_impl.h
index 353b5b96..1912e5e 100644
--- a/content/browser/android/dialog_overlay_impl.h
+++ b/content/browser/android/dialog_overlay_impl.h
@@ -57,7 +57,6 @@
   void WebContentsDestroyed() override;
   void DidToggleFullscreenModeForTab(bool entered_fullscreen,
                                      bool will_cause_resize) override;
-  void FrameDeleted(RenderFrameHost* render_frame_host) override;
   void RenderFrameDeleted(RenderFrameHost* render_frame_host) override;
   void RenderFrameHostChanged(RenderFrameHost* old_host,
                               RenderFrameHost* new_host) override;
diff --git a/content/browser/browser_interface_binders.cc b/content/browser/browser_interface_binders.cc
index 2744432..6b72b46 100644
--- a/content/browser/browser_interface_binders.cc
+++ b/content/browser/browser_interface_binders.cc
@@ -84,6 +84,7 @@
 #include "services/metrics/public/mojom/ukm_interface.mojom.h"
 #include "services/metrics/ukm_recorder_interface.h"
 #include "services/network/public/cpp/cross_origin_embedder_policy.h"
+#include "services/network/public/mojom/p2p.mojom.h"
 #include "services/network/public/mojom/restricted_cookie_manager.mojom.h"
 #include "services/shape_detection/public/mojom/barcodedetection_provider.mojom.h"
 #include "services/shape_detection/public/mojom/facedetection_provider.mojom.h"
@@ -552,6 +553,14 @@
     GetDeviceService().BindVibrationManager(std::move(receiver));
 }
 
+void BindSocketManager(
+    RenderFrameHostImpl* frame,
+    mojo::PendingReceiver<network::mojom::P2PSocketManager> receiver) {
+  static_cast<RenderProcessHostImpl*>(frame->GetProcess())
+      ->BindP2PSocketManager(frame->GetNetworkIsolationKey(),
+                             std::move(receiver));
+}
+
 }  // namespace
 
 // Documents/frames
@@ -621,6 +630,9 @@
   map->Add<blink::mojom::NotificationService>(base::BindRepeating(
       &RenderFrameHostImpl::CreateNotificationService, base::Unretained(host)));
 
+  map->Add<network::mojom::P2PSocketManager>(
+      base::BindRepeating(&BindSocketManager, base::Unretained(host)));
+
   map->Add<blink::mojom::PeerConnectionTrackerHost>(
       base::BindRepeating(&RenderFrameHostImpl::BindPeerConnectionTrackerHost,
                           base::Unretained(host)));
diff --git a/content/browser/prerender/prerender_browsertest.cc b/content/browser/prerender/prerender_browsertest.cc
index 92c8d3c..9a5dfcc2 100644
--- a/content/browser/prerender/prerender_browsertest.cc
+++ b/content/browser/prerender/prerender_browsertest.cc
@@ -1401,7 +1401,6 @@
 }
 
 // Tests that prerendering is gated behind CSP:prefetch-src
-// TODO(https://crbug.com/1185679) This is currently not the case. Fix this.
 IN_PROC_BROWSER_TEST_P(PrerenderBrowserTest, CSPPrefetchSrc) {
   GURL initial_url = GetUrl("/prerender/add_prerender.html");
   ASSERT_TRUE(NavigateToURL(shell(), initial_url));
@@ -1410,38 +1409,41 @@
   EXPECT_TRUE(ExecJs(current_frame_host(), R"(
     const meta = document.createElement('meta');
     meta.httpEquiv = "Content-Security-Policy";
-    meta.content = "prefetch-src */empty.html";
+    meta.content = "prefetch-src https://a.test:*/empty.html";
     document.getElementsByTagName('head')[0].appendChild(meta);
   )"));
 
   const char* kConsolePattern =
       "Refused to prefetch content from "
-      "'https://a.test:*/prerender/add_prerender.html' because it violates the "
+      "'https://a.test:*/*.html' because it violates the "
       "following Content Security Policy directive: \"prefetch-src "
-      "*/empty.html\"*";
+      "https://a.test:*/empty.html\"*";
 
   // Check what happens when a prerendering is blocked:
   {
     GURL disallowed_url = GetUrl("/title1.html");
     WebContentsConsoleObserver console_observer(web_contents());
     console_observer.SetPattern(kConsolePattern);
-    PrerenderHostRegistryObserver observer(GetPrerenderHostRegistry());
-    EXPECT_TRUE(ExecJs(shell()->web_contents(),
-                       JsReplace("add_prerender($1)", disallowed_url)));
-    observer.WaitForTrigger(disallowed_url);
-    // TODO(https://crbug.com/1185679): This should be false:
+    // Prerender will fail, but PrerenderHost is not abandoned for navigation
+    // failures. PrerenderHost can be found in the registry, but the request
+    // should not reach the server.
+    AddPrerender(disallowed_url);
+    // TODO(https://crbug.com/1189602): Call AbandonHost even for CSP failure
+    // cases. Then FindHostByUrlForTesting() should return null.
     EXPECT_TRUE(
         GetPrerenderHostRegistry().FindHostByUrlForTesting(disallowed_url));
-    // TODO(https://crbug.com/1185679): This should be 1.
-    EXPECT_EQ(0u, console_observer.messages().size());
+    EXPECT_EQ(1u, console_observer.messages().size());
+    EXPECT_EQ(GetRequestCount(disallowed_url), 0);
   }
 
   // Check what happens when prerendering isn't blocked.
   {
     WebContentsConsoleObserver console_observer(web_contents());
     console_observer.SetPattern(kConsolePattern);
-    AddPrerender(GetUrl("/empty.html"));
+    GURL kAllowedUrl = GetUrl("/empty.html");
+    AddPrerender(kAllowedUrl);
     EXPECT_EQ(0u, console_observer.messages().size());
+    EXPECT_EQ(GetRequestCount(kAllowedUrl), 1);
   }
 }
 
diff --git a/content/browser/prerender/prerender_host.cc b/content/browser/prerender/prerender_host.cc
index a9887cd94..76562a4 100644
--- a/content/browser/prerender/prerender_host.cc
+++ b/content/browser/prerender/prerender_host.cc
@@ -335,10 +335,16 @@
 
 PrerenderHost::PrerenderHost(blink::mojom::PrerenderAttributesPtr attributes,
                              const url::Origin& initiator_origin,
-                             WebContentsImpl& web_contents)
-    : attributes_(std::move(attributes)), initiator_origin_(initiator_origin) {
+                             RenderFrameHostImpl& initiator_render_frame_host)
+    : attributes_(std::move(attributes)),
+      initiator_origin_(initiator_origin),
+      initiator_process_id_(initiator_render_frame_host.GetProcess()->GetID()),
+      initiator_frame_token_(initiator_render_frame_host.GetFrameToken()) {
   DCHECK(blink::features::IsPrerender2Enabled());
-  CreatePageHolder(web_contents);
+  auto* web_contents =
+      WebContents::FromRenderFrameHost(&initiator_render_frame_host);
+  DCHECK(web_contents);
+  CreatePageHolder(*static_cast<WebContentsImpl*>(web_contents));
 }
 
 // TODO(https://crbug.com/1132746): Abort ongoing prerendering and notify the
@@ -363,6 +369,8 @@
   // Start prerendering navigation.
   NavigationController::LoadURLParams load_url_params(attributes_->url);
   load_url_params.initiator_origin = initiator_origin_;
+  load_url_params.initiator_process_id = initiator_process_id_;
+  load_url_params.initiator_frame_token = initiator_frame_token_;
 
   // Just use the referrer from attributes, as NoStatePrefetch does.
   // TODO(crbug.com/1176054): For cross-origin prerender, follow the spec steps
diff --git a/content/browser/prerender/prerender_host.h b/content/browser/prerender/prerender_host.h
index 1373e613..8fd347f 100644
--- a/content/browser/prerender/prerender_host.h
+++ b/content/browser/prerender/prerender_host.h
@@ -15,6 +15,7 @@
 #include "content/public/browser/global_routing_id.h"
 #include "content/public/browser/render_frame_host.h"
 #include "content/public/browser/web_contents_observer.h"
+#include "third_party/blink/public/common/tokens/tokens.h"
 #include "third_party/blink/public/mojom/prerender/prerender.mojom.h"
 #include "url/gurl.h"
 
@@ -67,7 +68,7 @@
 
   PrerenderHost(blink::mojom::PrerenderAttributesPtr attributes,
                 const url::Origin& initiator_origin,
-                WebContentsImpl& web_contents);
+                RenderFrameHostImpl& initiator_render_frame_host);
   ~PrerenderHost() override;
 
   PrerenderHost(const PrerenderHost&) = delete;
@@ -142,8 +143,9 @@
   NavigationController& GetNavigationController();
 
   const blink::mojom::PrerenderAttributesPtr attributes_;
-  const GlobalFrameRoutingId initiator_render_frame_host_id_;
   const url::Origin initiator_origin_;
+  const int initiator_process_id_;
+  const blink::LocalFrameToken initiator_frame_token_;
 
   // Indicates if `page_holder_` is ready for activation.
   bool is_ready_for_activation_ = false;
diff --git a/content/browser/prerender/prerender_host_registry.cc b/content/browser/prerender/prerender_host_registry.cc
index dd2e557..6f239e3 100644
--- a/content/browser/prerender/prerender_host_registry.cc
+++ b/content/browser/prerender/prerender_host_registry.cc
@@ -37,8 +37,8 @@
 
 int PrerenderHostRegistry::CreateAndStartHost(
     blink::mojom::PrerenderAttributesPtr attributes,
-    WebContentsImpl& web_contents,
-    const url::Origin& initiator_origin) {
+    const url::Origin& initiator_origin,
+    RenderFrameHostImpl& initiator_render_frame_host) {
   DCHECK(attributes);
 
   // Ensure observers are notified that a trigger occurred.
@@ -67,7 +67,7 @@
     return found->second;
 
   auto prerender_host = std::make_unique<PrerenderHost>(
-      std::move(attributes), initiator_origin, web_contents);
+      std::move(attributes), initiator_origin, initiator_render_frame_host);
   const int frame_tree_node_id = prerender_host->frame_tree_node_id();
 
   CHECK(!base::Contains(prerender_host_by_frame_tree_node_id_,
diff --git a/content/browser/prerender/prerender_host_registry.h b/content/browser/prerender/prerender_host_registry.h
index f0407d5..e0d4d95 100644
--- a/content/browser/prerender/prerender_host_registry.h
+++ b/content/browser/prerender/prerender_host_registry.h
@@ -13,6 +13,7 @@
 #include "content/browser/prerender/prerender_host.h"
 #include "content/browser/renderer_host/back_forward_cache_impl.h"
 #include "content/common/content_export.h"
+#include "third_party/blink/public/common/tokens/tokens.h"
 #include "third_party/blink/public/mojom/prerender/prerender.mojom.h"
 #include "url/gurl.h"
 #include "url/origin.h"
@@ -69,8 +70,8 @@
   // Creates and starts a host. Returns the root frame tree node id of the
   // prerendered page, which can be used as the id of the host.
   int CreateAndStartHost(blink::mojom::PrerenderAttributesPtr attributes,
-                         WebContentsImpl& web_contents,
-                         const url::Origin& initiator_origin);
+                         const url::Origin& initiator_origin,
+                         RenderFrameHostImpl& initiator_render_frame_host);
 
   // For triggers.
   // Destroys the host registered for `frame_tree_node_id`.
diff --git a/content/browser/prerender/prerender_host_registry_unittest.cc b/content/browser/prerender/prerender_host_registry_unittest.cc
index f1772db9..b6b6df7 100644
--- a/content/browser/prerender/prerender_host_registry_unittest.cc
+++ b/content/browser/prerender/prerender_host_registry_unittest.cc
@@ -71,9 +71,9 @@
   attributes->url = kPrerenderingUrl;
 
   PrerenderHostRegistry* registry = GetPrerenderHostRegistry();
-  const int prerender_frame_tree_node_id =
-      registry->CreateAndStartHost(std::move(attributes), *web_contents,
-                                   render_frame_host->GetLastCommittedOrigin());
+  const int prerender_frame_tree_node_id = registry->CreateAndStartHost(
+      std::move(attributes), render_frame_host->GetLastCommittedOrigin(),
+      *render_frame_host);
   ASSERT_NE(prerender_frame_tree_node_id, kNoFrameTreeNodeId);
   PrerenderHost* prerender_host =
       registry->FindHostByUrlForTesting(kPrerenderingUrl);
@@ -104,17 +104,17 @@
   attributes2->url = kPrerenderingUrl;
 
   PrerenderHostRegistry* registry = GetPrerenderHostRegistry();
-  const int frame_tree_node_id1 =
-      registry->CreateAndStartHost(std::move(attributes1), *web_contents,
-                                   render_frame_host->GetLastCommittedOrigin());
+  const int frame_tree_node_id1 = registry->CreateAndStartHost(
+      std::move(attributes1), render_frame_host->GetLastCommittedOrigin(),
+      *render_frame_host);
   PrerenderHost* prerender_host1 =
       registry->FindHostByUrlForTesting(kPrerenderingUrl);
 
   // Start the prerender host for the same URL. This second host should be
   // ignored, and the first host should still be findable.
-  const int frame_tree_node_id2 =
-      registry->CreateAndStartHost(std::move(attributes2), *web_contents,
-                                   render_frame_host->GetLastCommittedOrigin());
+  const int frame_tree_node_id2 = registry->CreateAndStartHost(
+      std::move(attributes2), render_frame_host->GetLastCommittedOrigin(),
+      *render_frame_host);
   EXPECT_EQ(frame_tree_node_id1, frame_tree_node_id2);
   EXPECT_EQ(registry->FindHostByUrlForTesting(kPrerenderingUrl),
             prerender_host1);
@@ -145,12 +145,12 @@
   attributes2->url = kPrerenderingUrl2;
 
   PrerenderHostRegistry* registry = GetPrerenderHostRegistry();
-  const int frame_tree_node_id1 =
-      registry->CreateAndStartHost(std::move(attributes1), *web_contents,
-                                   render_frame_host->GetLastCommittedOrigin());
-  const int frame_tree_node_id2 =
-      registry->CreateAndStartHost(std::move(attributes2), *web_contents,
-                                   render_frame_host->GetLastCommittedOrigin());
+  const int frame_tree_node_id1 = registry->CreateAndStartHost(
+      std::move(attributes1), render_frame_host->GetLastCommittedOrigin(),
+      *render_frame_host);
+  const int frame_tree_node_id2 = registry->CreateAndStartHost(
+      std::move(attributes2), render_frame_host->GetLastCommittedOrigin(),
+      *render_frame_host);
   EXPECT_NE(frame_tree_node_id1, frame_tree_node_id2);
   PrerenderHost* prerender_host1 =
       registry->FindHostByUrlForTesting(kPrerenderingUrl1);
@@ -193,9 +193,9 @@
   attributes->url = kPrerenderingUrl;
 
   PrerenderHostRegistry* registry = GetPrerenderHostRegistry();
-  const int prerender_frame_tree_node_id =
-      registry->CreateAndStartHost(std::move(attributes), *web_contents,
-                                   render_frame_host->GetLastCommittedOrigin());
+  const int prerender_frame_tree_node_id = registry->CreateAndStartHost(
+      std::move(attributes), render_frame_host->GetLastCommittedOrigin(),
+      *render_frame_host);
   ASSERT_NE(prerender_frame_tree_node_id, kNoFrameTreeNodeId);
   PrerenderHost* prerender_host =
       registry->FindHostByUrlForTesting(kPrerenderingUrl);
@@ -220,9 +220,9 @@
   attributes->url = kPrerenderingUrl;
 
   PrerenderHostRegistry* registry = GetPrerenderHostRegistry();
-  const int prerender_frame_tree_node_id =
-      registry->CreateAndStartHost(std::move(attributes), *web_contents,
-                                   render_frame_host->GetLastCommittedOrigin());
+  const int prerender_frame_tree_node_id = registry->CreateAndStartHost(
+      std::move(attributes), render_frame_host->GetLastCommittedOrigin(),
+      *render_frame_host);
   EXPECT_NE(registry->FindHostByUrlForTesting(kPrerenderingUrl), nullptr);
 
   registry->AbandonHost(prerender_frame_tree_node_id);
diff --git a/content/browser/prerender/prerender_host_unittest.cc b/content/browser/prerender/prerender_host_unittest.cc
index 207217a..8eb9914 100644
--- a/content/browser/prerender/prerender_host_unittest.cc
+++ b/content/browser/prerender/prerender_host_unittest.cc
@@ -118,9 +118,9 @@
   const GURL kPrerenderingUrl("https://example.com/next");
   auto attributes = blink::mojom::PrerenderAttributes::New();
   attributes->url = kPrerenderingUrl;
-  const int prerender_frame_tree_node_id =
-      registry->CreateAndStartHost(std::move(attributes), *web_contents,
-                                   initiator_rfh->GetLastCommittedOrigin());
+  const int prerender_frame_tree_node_id = registry->CreateAndStartHost(
+      std::move(attributes), initiator_rfh->GetLastCommittedOrigin(),
+      *initiator_rfh);
   PrerenderHost* prerender_host =
       registry->FindHostById(prerender_frame_tree_node_id);
 
@@ -164,9 +164,9 @@
   attributes->url = kPrerenderingUrl;
 
   // Start the prerendering navigation, but don't activate it.
-  const int prerender_frame_tree_node_id =
-      registry->CreateAndStartHost(std::move(attributes), *web_contents,
-                                   initiator_rfh->GetLastCommittedOrigin());
+  const int prerender_frame_tree_node_id = registry->CreateAndStartHost(
+      std::move(attributes), initiator_rfh->GetLastCommittedOrigin(),
+      *initiator_rfh);
   registry->AbandonHost(prerender_frame_tree_node_id);
   ExpectFinalStatus(PrerenderHost::FinalStatus::kDestroyed);
 }
diff --git a/content/browser/prerender/prerender_processor.cc b/content/browser/prerender/prerender_processor.cc
index 1d3f30e..3cd2396 100644
--- a/content/browser/prerender/prerender_processor.cc
+++ b/content/browser/prerender/prerender_processor.cc
@@ -72,7 +72,7 @@
     return;
 
   prerender_frame_tree_node_id_ = GetPrerenderHostRegistry().CreateAndStartHost(
-      std::move(attributes), *web_contents, initiator_origin_);
+      std::move(attributes), initiator_origin_, initiator_render_frame_host_);
 }
 
 void PrerenderProcessor::Cancel() {
diff --git a/content/browser/renderer_host/navigation_request.cc b/content/browser/renderer_host/navigation_request.cc
index 22f6781..bcdf227 100644
--- a/content/browser/renderer_host/navigation_request.cc
+++ b/content/browser/renderer_host/navigation_request.cc
@@ -4175,38 +4175,52 @@
     bool url_upgraded_after_redirect,
     bool is_response_check,
     network::CSPContext::CheckCSPDisposition disposition) {
-  bool navigate_to_allowed = true;
+  // Following directive checks' order is important as the `error` code takes
+  // only the result last set.
+  net::Error error = net::OK;
+
   if (base::FeatureList::IsEnabled(
           features::kExperimentalContentSecurityPolicyFeatures) &&
       initiator_policies) {
     RenderFrameHostCSPContext initiator_csp_context(
         RenderFrameHostImpl::FromFrameToken(GetInitiatorProcessID(),
                                             GetInitiatorFrameToken().value()));
+    // [navigate-to]
+    if (!IsAllowedByCSPDirective(
+            initiator_policies->content_security_policies, &initiator_context,
+            network::mojom::CSPDirectiveName::NavigateTo, has_followed_redirect,
+            url_upgraded_after_redirect, is_response_check, disposition)) {
+      // net::ERR_ABORTED is used instead of net::ERR_BLOCKED_BY_CSP. This is a
+      // better user experience as the user is not presented with an error page.
+      // However if other CSP directives life frame-src are violated, it may be
+      // appropriate for them to use ERR_BLOCKED_BY_CSP so this can be overriden
+      // by the checks below.
+      error = net::ERR_ABORTED;
+    }
 
-    navigate_to_allowed = IsAllowedByCSPDirective(
-        initiator_policies->content_security_policies, &initiator_context,
-        network::mojom::CSPDirectiveName::NavigateTo, has_followed_redirect,
-        url_upgraded_after_redirect, is_response_check, disposition);
+    // [prefetch-src]
+    if (blink::features::IsPrerender2Enabled() &&
+        frame_tree_node_->frame_tree()->is_prerendering()) {
+      if (!IsAllowedByCSPDirective(
+              initiator_policies->content_security_policies, &initiator_context,
+              network::mojom::CSPDirectiveName::PrefetchSrc,
+              has_followed_redirect, url_upgraded_after_redirect,
+              is_response_check, disposition)) {
+        error = net::ERR_BLOCKED_BY_CSP;
+      }
+    }
   }
 
-  bool frame_src_allowed = true;
-  if (parent_policies) {
-    frame_src_allowed = IsAllowedByCSPDirective(
-        parent_policies->content_security_policies, &parent_context,
-        network::mojom::CSPDirectiveName::FrameSrc, has_followed_redirect,
-        url_upgraded_after_redirect, is_response_check, disposition);
+  // [frame-src]
+  if (parent_policies &&
+      !IsAllowedByCSPDirective(
+          parent_policies->content_security_policies, &parent_context,
+          network::mojom::CSPDirectiveName::FrameSrc, has_followed_redirect,
+          url_upgraded_after_redirect, is_response_check, disposition)) {
+    error = net::ERR_BLOCKED_BY_CSP;
   }
 
-  if (navigate_to_allowed && frame_src_allowed)
-    return net::OK;
-
-  if (!frame_src_allowed)
-    return net::ERR_BLOCKED_BY_CSP;
-
-  // net::ERR_ABORTED is used to ensure that the navigation is cancelled
-  // when the 'navigate-to' directive check is failed. This is a better user
-  // experience as the user is not presented with an error page.
-  return net::ERR_ABORTED;
+  return error;
 }
 
 net::Error NavigationRequest::CheckContentSecurityPolicy(
@@ -4264,8 +4278,8 @@
   // now. Then this RenderFrameHostCSPContext will do nothing and we won't
   // report violations for this check.
   //
-  // TODO(antoniosartori): Check that the initiator RenderFrameHost has not
-  // committed a new document in between, see failing WPT
+  // TODO(https://crbug.com/1189966): Check that the initiator RenderFrameHost
+  // has not committed a new document in between, see failing WPT
   // content-security-policy/navigate-to/spv-only-sent-to-initiator.sub.html
   RenderFrameHostCSPContext initiator_context(
       GetInitiatorFrameToken().has_value()
diff --git a/content/browser/renderer_host/p2p/socket_dispatcher_host.cc b/content/browser/renderer_host/p2p/socket_dispatcher_host.cc
index 67a67f7..66ae66ac 100644
--- a/content/browser/renderer_host/p2p/socket_dispatcher_host.cc
+++ b/content/browser/renderer_host/p2p/socket_dispatcher_host.cc
@@ -12,7 +12,10 @@
 #include "content/browser/bad_message.h"
 #include "content/browser/renderer_host/render_process_host_impl.h"
 #include "content/browser/storage_partition_impl.h"
+#include "mojo/public/cpp/bindings/pending_receiver.h"
 #include "mojo/public/cpp/bindings/pending_remote.h"
+#include "mojo/public/cpp/bindings/receiver_set.h"
+#include "mojo/public/cpp/bindings/remote_set.h"
 #include "net/base/net_errors.h"
 #include "services/network/public/cpp/p2p_param_traits.h"
 
@@ -24,7 +27,7 @@
 P2PSocketDispatcherHost::P2PSocketDispatcherHost(int render_process_id)
     : render_process_id_(render_process_id) {}
 
-P2PSocketDispatcherHost::~P2PSocketDispatcherHost() {}
+P2PSocketDispatcherHost::~P2PSocketDispatcherHost() = default;
 
 void P2PSocketDispatcherHost::StartRtpDump(
     bool incoming,
@@ -40,8 +43,9 @@
       dump_outgoing_rtp_packet_ = true;
 
     packet_callback_ = std::move(packet_callback);
-    if (trusted_socket_manager_)
-      trusted_socket_manager_->StartRtpDump(incoming, outgoing);
+    for (auto& trusted_socket_manager : trusted_socket_managers_) {
+      trusted_socket_manager->StartRtpDump(incoming, outgoing);
+    }
   }
 }
 
@@ -58,35 +62,36 @@
     if (!dump_incoming_rtp_packet_ && !dump_outgoing_rtp_packet_)
       packet_callback_.Reset();
 
-    if (trusted_socket_manager_)
-      trusted_socket_manager_->StopRtpDump(incoming, outgoing);
+    for (auto& trusted_socket_manager : trusted_socket_managers_) {
+      trusted_socket_manager->StopRtpDump(incoming, outgoing);
+    }
   }
 }
 
 void P2PSocketDispatcherHost::BindReceiver(
-    mojo::PendingReceiver<network::mojom::P2PSocketManager> receiver) {
-  auto* rph = RenderProcessHostImpl::FromID(render_process_id_);
-  if (!rph)
-    return;
+    RenderProcessHostImpl& process,
+    mojo::PendingReceiver<network::mojom::P2PSocketManager> receiver,
+    net::NetworkIsolationKey isolation_key) {
+  DCHECK_EQ(process.GetID(), render_process_id_);
 
-  // In case the renderer was connected previously but the network process
-  // crashed.
-  receiver_.reset();
-  auto trusted_socket_manager_client = receiver_.BindNewPipeAndPassRemote();
+  mojo::PendingRemote<network::mojom::P2PTrustedSocketManagerClient>
+      trusted_socket_manager_client;
+  receivers_.Add(
+      this, trusted_socket_manager_client.InitWithNewPipeAndPassReceiver());
 
-  trusted_socket_manager_.reset();
-  // TODO(https://crbug.com/1085022): Make this interface per-frame instead of
-  // per-process, and grab the correct NetworkIsolationKey from the associated
-  // RenderFrameHost.
-  rph->GetStoragePartition()->GetNetworkContext()->CreateP2PSocketManager(
-      net::NetworkIsolationKey::Todo(),
-      std::move(trusted_socket_manager_client),
-      trusted_socket_manager_.BindNewPipeAndPassReceiver(),
+  mojo::PendingRemote<network::mojom::P2PTrustedSocketManager>
+      pending_trusted_socket_manager;
+  process.GetStoragePartition()->GetNetworkContext()->CreateP2PSocketManager(
+      isolation_key, std::move(trusted_socket_manager_client),
+      pending_trusted_socket_manager.InitWithNewPipeAndPassReceiver(),
       std::move(receiver));
+  mojo::Remote<network::mojom::P2PTrustedSocketManager> trusted_socket_manager(
+      std::move(pending_trusted_socket_manager));
   if (dump_incoming_rtp_packet_ || dump_outgoing_rtp_packet_) {
-    trusted_socket_manager_->StartRtpDump(dump_incoming_rtp_packet_,
-                                          dump_outgoing_rtp_packet_);
+    trusted_socket_manager->StartRtpDump(dump_incoming_rtp_packet_,
+                                         dump_outgoing_rtp_packet_);
   }
+  trusted_socket_managers_.Add(std::move(trusted_socket_manager));
 }
 
 base::WeakPtr<P2PSocketDispatcherHost> P2PSocketDispatcherHost::GetWeakPtr() {
diff --git a/content/browser/renderer_host/p2p/socket_dispatcher_host.h b/content/browser/renderer_host/p2p/socket_dispatcher_host.h
index a130f1a0..2cebb4a8 100644
--- a/content/browser/renderer_host/p2p/socket_dispatcher_host.h
+++ b/content/browser/renderer_host/p2p/socket_dispatcher_host.h
@@ -17,8 +17,9 @@
 #include "base/sequenced_task_runner.h"
 #include "content/public/browser/render_process_host.h"
 #include "mojo/public/cpp/bindings/pending_receiver.h"
-#include "mojo/public/cpp/bindings/receiver.h"
-#include "mojo/public/cpp/bindings/remote.h"
+#include "mojo/public/cpp/bindings/receiver_set.h"
+#include "mojo/public/cpp/bindings/remote_set.h"
+#include "net/base/network_isolation_key.h"
 #include "services/network/public/mojom/p2p.mojom.h"
 #include "services/network/public/mojom/p2p_trusted.mojom.h"
 
@@ -40,7 +41,9 @@
   void StopRtpDump(bool incoming, bool outgoing);
 
   void BindReceiver(
-      mojo::PendingReceiver<network::mojom::P2PSocketManager> receiver);
+      RenderProcessHostImpl& process,
+      mojo::PendingReceiver<network::mojom::P2PSocketManager> receiver,
+      net::NetworkIsolationKey isolation_key);
 
   base::WeakPtr<P2PSocketDispatcherHost> GetWeakPtr();
 
@@ -57,8 +60,16 @@
   bool dump_outgoing_rtp_packet_ = false;
   RenderProcessHost::WebRtcRtpPacketCallback packet_callback_;
 
-  mojo::Receiver<network::mojom::P2PTrustedSocketManagerClient> receiver_{this};
-  mojo::Remote<network::mojom::P2PTrustedSocketManager> trusted_socket_manager_;
+  // TODO(crbug.com/1178670): We use sets of interfaces for now (instead of
+  // creating a host-per-frame) since RTP dumps are started/stopped at the
+  // process level (for now).
+  // There are, however, plans to:
+  // 1. Make WebRtcLoggingAgent per-frame (and RTP dumps along with it)
+  // 2. (Maybe) deprecate RTP dumps.
+  // Once either of these happens, this can be cleaned up.
+  mojo::ReceiverSet<network::mojom::P2PTrustedSocketManagerClient> receivers_;
+  mojo::RemoteSet<network::mojom::P2PTrustedSocketManager>
+      trusted_socket_managers_;
 
   network::mojom::P2PNetworkNotificationClientPtr network_notification_client_;
 
diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc
index 80d3788..bec2688 100644
--- a/content/browser/renderer_host/render_process_host_impl.cc
+++ b/content/browser/renderer_host/render_process_host_impl.cc
@@ -2361,11 +2361,6 @@
 
   AddUIThreadInterface(
       registry.get(),
-      base::BindRepeating(&RenderProcessHostImpl::BindP2PSocketManager,
-                          weak_factory_.GetWeakPtr()));
-
-  AddUIThreadInterface(
-      registry.get(),
       base::BindRepeating(&RenderProcessHostImpl::CreateMediaLogRecordHost,
                           weak_factory_.GetWeakPtr()));
 
@@ -2544,8 +2539,10 @@
 }
 
 void RenderProcessHostImpl::BindP2PSocketManager(
+    net::NetworkIsolationKey isolation_key,
     mojo::PendingReceiver<network::mojom::P2PSocketManager> receiver) {
-  p2p_socket_dispatcher_host_->BindReceiver(std::move(receiver));
+  p2p_socket_dispatcher_host_->BindReceiver(*this, std::move(receiver),
+                                            isolation_key);
 }
 
 void RenderProcessHostImpl::CreateMediaLogRecordHost(
diff --git a/content/browser/renderer_host/render_process_host_impl.h b/content/browser/renderer_host/render_process_host_impl.h
index 6bc63978..a0f10a7 100644
--- a/content/browser/renderer_host/render_process_host_impl.h
+++ b/content/browser/renderer_host/render_process_host_impl.h
@@ -639,6 +639,10 @@
       mojo::PendingReceiver<blink::mojom::WebSocketConnector> receiver)
       override;
 
+  void BindP2PSocketManager(
+      net::NetworkIsolationKey isolation_key,
+      mojo::PendingReceiver<network::mojom::P2PSocketManager> receiver);
+
   // Allows |process_id| to use an additional |allowed_request_initiator|
   // (bypassing |request_initiator_origin_lock| enforcement).
   //
@@ -748,8 +752,6 @@
       mojo::PendingReceiver<blink::mojom::WebDatabaseHost> receiver);
   void BindAecDumpManager(
       mojo::PendingReceiver<blink::mojom::AecDumpManager> receiver);
-  void BindP2PSocketManager(
-      mojo::PendingReceiver<network::mojom::P2PSocketManager> receiver);
   void CreateMediaLogRecordHost(
       mojo::PendingReceiver<content::mojom::MediaInternalLogRecords> receiver);
 #if BUILDFLAG(ENABLE_PLUGINS)
diff --git a/content/browser/renderer_host/render_widget_host_view_aura.cc b/content/browser/renderer_host/render_widget_host_view_aura.cc
index 4301f99..9b474bb 100644
--- a/content/browser/renderer_host/render_widget_host_view_aura.cc
+++ b/content/browser/renderer_host/render_widget_host_view_aura.cc
@@ -1160,7 +1160,7 @@
   DCHECK_NE(GetTextInputType(), ui::TEXT_INPUT_TYPE_NONE);
 
   if (text_input_manager_ && text_input_manager_->GetActiveWidget()) {
-    if (text.length()) {
+    if (text.length() > 0 || !has_composition_text_) {
       const int relative_cursor_position =
           cursor_behavior == InsertTextCursorBehavior::kMoveCursorBeforeText
               ? -text.length()
@@ -1168,7 +1168,8 @@
       text_input_manager_->GetActiveWidget()->ImeCommitText(
           text, std::vector<ui::ImeTextSpan>(), gfx::Range::InvalidRange(),
           relative_cursor_position);
-    } else if (has_composition_text_) {
+    } else {
+      DCHECK(has_composition_text_);
       text_input_manager_->GetActiveWidget()->ImeFinishComposingText(false);
     }
   }
diff --git a/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc b/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc
index de218cf..86344e9 100644
--- a/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc
+++ b/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc
@@ -6080,6 +6080,21 @@
   }
 }
 
+TEST_F(InputMethodResultAuraTest, CommitTextWithEmptyText) {
+  base::RepeatingClosure ime_call = base::BindRepeating(
+      &ui::TextInputClient::InsertText, base::Unretained(text_input_client()),
+      u"", ui::TextInputClient::InsertTextCursorBehavior::kMoveCursorAfterText);
+  for (auto index : active_view_sequence_) {
+    ActivateViewForTextInputManager(views_[index], ui::TEXT_INPUT_TYPE_TEXT);
+    ime_call.Run();
+    base::RunLoop().RunUntilIdle();
+    EXPECT_EQ("CommitText",
+              GetMessageNames(widget_hosts_[index]
+                                  ->input_handler()
+                                  ->GetAndResetDispatchedMessages()));
+  }
+}
+
 TEST_F(InputMethodResultAuraTest, CommitTextBeforeCursor) {
   base::RepeatingClosure ime_call = base::BindRepeating(
       &ui::TextInputClient::InsertText, base::Unretained(text_input_client()),
diff --git a/content/browser/service_worker/service_worker_container_host.cc b/content/browser/service_worker/service_worker_container_host.cc
index dc89354c..470cc96 100644
--- a/content/browser/service_worker/service_worker_container_host.cc
+++ b/content/browser/service_worker/service_worker_container_host.cc
@@ -86,7 +86,6 @@
 ServiceWorkerContainerHost::ServiceWorkerContainerHost(
     base::WeakPtr<ServiceWorkerContextCore> context)
     : context_(std::move(context)), create_time_(base::TimeTicks::Now()) {
-  DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
   DCHECK(IsContainerForServiceWorker());
   DCHECK(context_);
 }
@@ -103,7 +102,6 @@
       is_parent_frame_secure_(is_parent_frame_secure),
       container_(std::move(container_remote)),
       client_info_(frame_tree_node_id) {
-  DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
   DCHECK(IsContainerForWindowClient());
   DCHECK(context_);
   DCHECK(container_.is_bound());
@@ -121,7 +119,8 @@
       process_id_(process_id),
       container_(std::move(container_remote)),
       client_info_(client_info) {
-  DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(IsContainerForWorkerClient());
   DCHECK(context_);
   DCHECK_NE(process_id_, ChildProcessHost::kInvalidUniqueID);
@@ -129,7 +128,7 @@
 }
 
 ServiceWorkerContainerHost::~ServiceWorkerContainerHost() {
-  DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   if (IsContainerForClient()) {
     auto* rfh = RenderFrameHostImpl::FromID(process_id(), frame_id());
@@ -158,7 +157,7 @@
     blink::mojom::FetchClientSettingsObjectPtr
         outside_fetch_client_settings_object,
     RegisterCallback callback) {
-  DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   if (!CanServeContainerHostMethods(
           &callback, options->scope, script_url,
@@ -216,7 +215,7 @@
 void ServiceWorkerContainerHost::GetRegistration(
     const GURL& client_url,
     GetRegistrationCallback callback) {
-  DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   if (!CanServeContainerHostMethods(
           &callback, url_, GURL(),
@@ -248,7 +247,7 @@
 
 void ServiceWorkerContainerHost::GetRegistrations(
     GetRegistrationsCallback callback) {
-  DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   if (!CanServeContainerHostMethods(
           &callback, url_, GURL(),
@@ -281,7 +280,7 @@
 void ServiceWorkerContainerHost::GetRegistrationForReady(
     GetRegistrationForReadyCallback callback) {
   std::string error_message;
-  DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   if (!IsValidGetRegistrationForReadyMessage(&error_message)) {
     mojo::ReportBadMessage(error_message);
@@ -303,7 +302,7 @@
 void ServiceWorkerContainerHost::EnsureControllerServiceWorker(
     mojo::PendingReceiver<blink::mojom::ControllerServiceWorker> receiver,
     blink::mojom::ControllerServiceWorkerPurpose purpose) {
-  DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   // TODO(kinuko): Log the reasons we drop the request.
   if (!context_ || !controller_)
@@ -317,12 +316,12 @@
 
 void ServiceWorkerContainerHost::CloneContainerHost(
     mojo::PendingReceiver<blink::mojom::ServiceWorkerContainerHost> receiver) {
-  DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   additional_receivers_.Add(this, std::move(receiver));
 }
 
 void ServiceWorkerContainerHost::HintToUpdateServiceWorker() {
-  DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   if (!IsContainerForClient()) {
     mojo::ReportBadMessage("SWPH_HTUSW_NOT_CLIENT");
@@ -336,7 +335,7 @@
 void ServiceWorkerContainerHost::EnsureFileAccess(
     const std::vector<base::FilePath>& file_paths,
     EnsureFileAccessCallback callback) {
-  DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   ServiceWorkerVersion* version =
       controller_registration_ ? controller_registration_->active_version()
                                : nullptr;
@@ -363,7 +362,7 @@
 }
 
 void ServiceWorkerContainerHost::OnExecutionReady() {
-  DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   if (!IsContainerForClient()) {
     mojo::ReportBadMessage("SWPH_OER_NOT_CLIENT");
@@ -390,7 +389,7 @@
 void ServiceWorkerContainerHost::OnVersionAttributesChanged(
     ServiceWorkerRegistration* registration,
     blink::mojom::ChangedServiceWorkerObjectsMaskPtr changed_mask) {
-  DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   if (!get_ready_callback_ || get_ready_callback_->is_null())
     return;
   if (changed_mask->active && registration->active_version()) {
@@ -404,19 +403,19 @@
 
 void ServiceWorkerContainerHost::OnRegistrationFailed(
     ServiceWorkerRegistration* registration) {
-  DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   RemoveMatchingRegistration(registration);
 }
 
 void ServiceWorkerContainerHost::OnRegistrationFinishedUninstalling(
     ServiceWorkerRegistration* registration) {
-  DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   RemoveMatchingRegistration(registration);
 }
 
 void ServiceWorkerContainerHost::OnSkippedWaiting(
     ServiceWorkerRegistration* registration) {
-  DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   if (controller_registration_ != registration)
     return;
 
@@ -444,7 +443,7 @@
 
 void ServiceWorkerContainerHost::AddMatchingRegistration(
     ServiceWorkerRegistration* registration) {
-  DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(blink::ServiceWorkerScopeMatches(registration->scope(),
                                           GetUrlForScopeMatch()));
   if (!IsEligibleForServiceWorkerController())
@@ -459,7 +458,7 @@
 
 void ServiceWorkerContainerHost::RemoveMatchingRegistration(
     ServiceWorkerRegistration* registration) {
-  DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK_NE(controller_registration_, registration);
 #if DCHECK_IS_ON()
   DCHECK(IsMatchingRegistration(registration));
@@ -472,7 +471,7 @@
 
 ServiceWorkerRegistration* ServiceWorkerContainerHost::MatchRegistration()
     const {
-  DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   auto it = matching_registrations_.rbegin();
   for (; it != matching_registrations_.rend(); ++it) {
     if (it->second->is_uninstalled())
@@ -486,7 +485,7 @@
 
 void ServiceWorkerContainerHost::AddServiceWorkerToUpdate(
     scoped_refptr<ServiceWorkerVersion> version) {
-  DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   // This is only called for windows now, but it should be called for all
   // clients someday.
@@ -498,7 +497,7 @@
 void ServiceWorkerContainerHost::PostMessageToClient(
     ServiceWorkerVersion* version,
     blink::TransferableMessage message) {
-  DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(IsContainerForClient());
 
   blink::mojom::ServiceWorkerObjectInfoPtr info;
@@ -511,7 +510,7 @@
 
 void ServiceWorkerContainerHost::CountFeature(
     blink::mojom::WebFeature feature) {
-  DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   // CountFeature is a message about the client's controller. It should be sent
   // only for clients.
@@ -532,7 +531,7 @@
 
 void ServiceWorkerContainerHost::SendSetControllerServiceWorker(
     bool notify_controllerchange) {
-  DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(IsContainerForClient());
 
   auto controller_info = blink::mojom::ControllerServiceWorkerInfo::New();
@@ -582,13 +581,13 @@
 }
 
 void ServiceWorkerContainerHost::NotifyControllerLost() {
-  DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   SetControllerRegistration(nullptr, true /* notify_controllerchange */);
 }
 
 void ServiceWorkerContainerHost::ClaimedByRegistration(
     scoped_refptr<ServiceWorkerRegistration> registration) {
-  DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(IsContainerForClient());
   DCHECK(registration->active_version());
   DCHECK(is_execution_ready());
@@ -606,7 +605,7 @@
 blink::mojom::ServiceWorkerRegistrationObjectInfoPtr
 ServiceWorkerContainerHost::CreateServiceWorkerRegistrationObjectInfo(
     scoped_refptr<ServiceWorkerRegistration> registration) {
-  DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   int64_t registration_id = registration->id();
   auto existing_host = registration_object_hosts_.find(registration_id);
   if (existing_host != registration_object_hosts_.end()) {
@@ -620,7 +619,7 @@
 
 void ServiceWorkerContainerHost::RemoveServiceWorkerRegistrationObjectHost(
     int64_t registration_id) {
-  DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(base::Contains(registration_object_hosts_, registration_id));
   // This is a workaround for a really unfavorable ownership structure of
   // service worker content code. This boils down to the following ownership
@@ -652,7 +651,7 @@
 blink::mojom::ServiceWorkerObjectInfoPtr
 ServiceWorkerContainerHost::CreateServiceWorkerObjectInfoToSend(
     scoped_refptr<ServiceWorkerVersion> version) {
-  DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   int64_t version_id = version->version_id();
   auto existing_object_host = service_worker_object_hosts_.find(version_id);
   if (existing_object_host != service_worker_object_hosts_.end()) {
@@ -668,7 +667,7 @@
 base::WeakPtr<ServiceWorkerObjectHost>
 ServiceWorkerContainerHost::GetOrCreateServiceWorkerObjectHost(
     scoped_refptr<ServiceWorkerVersion> version) {
-  DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   if (!context_ || !version)
     return nullptr;
 
@@ -685,7 +684,7 @@
 
 void ServiceWorkerContainerHost::RemoveServiceWorkerObjectHost(
     int64_t version_id) {
-  DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(base::Contains(service_worker_object_hosts_, version_id));
 
   // ServiceWorkerObjectHost to be deleted may have the last reference to
@@ -701,30 +700,30 @@
 }
 
 bool ServiceWorkerContainerHost::IsContainerForServiceWorker() const {
-  DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   return client_info_ == base::nullopt;
 }
 
 bool ServiceWorkerContainerHost::IsContainerForClient() const {
-  DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   return client_info_ != base::nullopt;
 }
 
 blink::mojom::ServiceWorkerClientType
 ServiceWorkerContainerHost::GetClientType() const {
-  DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(client_info_);
   return client_info_->type();
 }
 
 bool ServiceWorkerContainerHost::IsContainerForWindowClient() const {
-  DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   return client_info_ &&
          client_info_->type() == blink::mojom::ServiceWorkerClientType::kWindow;
 }
 
 bool ServiceWorkerContainerHost::IsContainerForWorkerClient() const {
-  DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   using blink::mojom::ServiceWorkerClientType;
   if (!client_info_)
     return false;
@@ -735,7 +734,7 @@
 
 ServiceWorkerClientInfo ServiceWorkerContainerHost::GetServiceWorkerClientInfo()
     const {
-  DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(IsContainerForClient());
 
   return *client_info_;
@@ -748,7 +747,7 @@
     mojo::PendingRemote<network::mojom::CrossOriginEmbedderPolicyReporter>
         coep_reporter,
     ukm::SourceId document_ukm_source_id) {
-  DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(IsContainerForWindowClient());
 
   DCHECK_EQ(ChildProcessHost::kInvalidUniqueID, process_id_);
@@ -790,7 +789,7 @@
 }
 
 void ServiceWorkerContainerHost::OnEndNavigationCommit() {
-  DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(IsContainerForWindowClient());
 
   DCHECK(!navigation_commit_ended_);
@@ -805,7 +804,7 @@
 void ServiceWorkerContainerHost::CompleteWebWorkerPreparation(
     const network::CrossOriginEmbedderPolicy& cross_origin_embedder_policy,
     ukm::SourceId worker_ukm_source_id) {
-  DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(IsContainerForWorkerClient());
 
   DCHECK(!cross_origin_embedder_policy_.has_value());
@@ -830,7 +829,7 @@
     const GURL& url,
     const net::SiteForCookies& site_for_cookies,
     const base::Optional<url::Origin>& top_frame_origin) {
-  DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   GURL previous_url = url_;
 
   DCHECK(!url.has_ref());
@@ -882,7 +881,7 @@
 void ServiceWorkerContainerHost::SetControllerRegistration(
     scoped_refptr<ServiceWorkerRegistration> controller_registration,
     bool notify_controllerchange) {
-  DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(IsContainerForClient());
 
   if (controller_registration) {
@@ -899,7 +898,7 @@
 
 mojo::Remote<blink::mojom::ControllerServiceWorker>
 ServiceWorkerContainerHost::GetRemoteControllerServiceWorker() {
-  DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(IsContainerForClient());
 
   DCHECK(controller_);
@@ -956,7 +955,7 @@
 
 bool ServiceWorkerContainerHost::AllowServiceWorker(const GURL& scope,
                                                     const GURL& script_url) {
-  DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(context_);
   AllowServiceWorkerResult allowed =
       GetContentClient()->browser()->AllowServiceWorker(
@@ -967,7 +966,7 @@
 }
 
 bool ServiceWorkerContainerHost::IsEligibleForServiceWorkerController() const {
-  DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(IsContainerForClient());
 
   if (!url_.is_valid())
@@ -991,7 +990,7 @@
 }
 
 bool ServiceWorkerContainerHost::is_response_committed() const {
-  DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(IsContainerForClient());
   switch (client_phase_) {
     case ClientPhase::kInitial:
@@ -1006,7 +1005,7 @@
 
 void ServiceWorkerContainerHost::AddExecutionReadyCallback(
     ExecutionReadyCallback callback) {
-  DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(IsContainerForClient());
 
   DCHECK(!is_execution_ready());
@@ -1014,21 +1013,21 @@
 }
 
 bool ServiceWorkerContainerHost::is_execution_ready() const {
-  DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(IsContainerForClient());
 
   return client_phase_ == ClientPhase::kExecutionReady;
 }
 
 const std::string& ServiceWorkerContainerHost::client_uuid() const {
-  DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(IsContainerForClient());
   return client_uuid_;
 }
 
 blink::mojom::ControllerServiceWorkerMode
 ServiceWorkerContainerHost::GetControllerMode() const {
-  DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(IsContainerForClient());
   if (!controller_)
     return blink::mojom::ControllerServiceWorkerMode::kNoController;
@@ -1048,7 +1047,7 @@
 
 ServiceWorkerVersion* ServiceWorkerContainerHost::controller() const {
 #if DCHECK_IS_ON()
-  DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   CheckControllerConsistency(false);
 #endif  // DCHECK_IS_ON()
   return controller_.get();
@@ -1057,7 +1056,7 @@
 ServiceWorkerRegistration* ServiceWorkerContainerHost::controller_registration()
     const {
 #if DCHECK_IS_ON()
-  DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   CheckControllerConsistency(false);
 #endif  // DCHECK_IS_ON()
   return controller_registration_.get();
@@ -1072,19 +1071,19 @@
 }
 
 ServiceWorkerHost* ServiceWorkerContainerHost::service_worker_host() {
-  DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(IsContainerForServiceWorker());
   return service_worker_host_;
 }
 
 bool ServiceWorkerContainerHost::IsInBackForwardCache() const {
-  DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   return is_in_back_forward_cache_;
 }
 
 void ServiceWorkerContainerHost::EvictFromBackForwardCache(
     BackForwardCacheMetrics::NotRestoredReason reason) {
-  DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(IsBackForwardCacheEnabled());
   DCHECK(IsContainerForWindowClient());
   is_in_back_forward_cache_ = false;
@@ -1096,7 +1095,7 @@
 }
 
 void ServiceWorkerContainerHost::OnEnterBackForwardCache() {
-  DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(IsBackForwardCacheEnabled());
   DCHECK(IsContainerForWindowClient());
   if (controller_)
@@ -1105,7 +1104,7 @@
 }
 
 void ServiceWorkerContainerHost::OnRestoreFromBackForwardCache() {
-  DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(IsBackForwardCacheEnabled());
   DCHECK(IsContainerForWindowClient());
   if (controller_)
@@ -1115,12 +1114,12 @@
 
 base::WeakPtr<ServiceWorkerContainerHost>
 ServiceWorkerContainerHost::GetWeakPtr() {
-  DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   return weak_factory_.GetWeakPtr();
 }
 
 void ServiceWorkerContainerHost::SyncMatchingRegistrations() {
-  DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(!controller_registration_);
 
   RemoveAllMatchingRegistrations();
@@ -1140,7 +1139,7 @@
 #if DCHECK_IS_ON()
 bool ServiceWorkerContainerHost::IsMatchingRegistration(
     ServiceWorkerRegistration* registration) const {
-  DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   std::string spec = registration->scope().spec();
   size_t key = spec.size();
 
@@ -1154,7 +1153,7 @@
 #endif  // DCHECK_IS_ON()
 
 void ServiceWorkerContainerHost::RemoveAllMatchingRegistrations() {
-  DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(!controller_registration_);
   for (const auto& it : matching_registrations_) {
     ServiceWorkerRegistration* registration = it.second.get();
@@ -1164,7 +1163,7 @@
 }
 
 void ServiceWorkerContainerHost::ReturnRegistrationForReadyIfNeeded() {
-  DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   if (!get_ready_callback_ || get_ready_callback_->is_null())
     return;
   ServiceWorkerRegistration* registration = MatchRegistration();
@@ -1185,7 +1184,7 @@
 }
 
 void ServiceWorkerContainerHost::SetExecutionReady() {
-  DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(!is_execution_ready());
   TransitionToClientPhase(ClientPhase::kExecutionReady);
   RunExecutionReadyCallbacks();
@@ -1195,7 +1194,7 @@
 }
 
 void ServiceWorkerContainerHost::RunExecutionReadyCallbacks() {
-  DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(IsContainerForClient());
 
   std::vector<ExecutionReadyCallback> callbacks;
@@ -1206,7 +1205,7 @@
 
 void ServiceWorkerContainerHost::TransitionToClientPhase(
     ClientPhase new_phase) {
-  DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   if (client_phase_ == new_phase)
     return;
   switch (client_phase_) {
@@ -1225,7 +1224,7 @@
 
 void ServiceWorkerContainerHost::UpdateController(
     bool notify_controllerchange) {
-  DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   ServiceWorkerVersion* version =
       controller_registration_ ? controller_registration_->active_version()
                                : nullptr;
@@ -1258,7 +1257,7 @@
 #if DCHECK_IS_ON()
 void ServiceWorkerContainerHost::CheckControllerConsistency(
     bool should_crash) const {
-  DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   if (!controller_) {
     DCHECK(!controller_registration_);
     return;
@@ -1296,7 +1295,7 @@
 void ServiceWorkerContainerHost::StartControllerComplete(
     mojo::PendingReceiver<blink::mojom::ControllerServiceWorker> receiver,
     blink::ServiceWorkerStatusCode status) {
-  DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(IsContainerForClient());
 
   if (status == blink::ServiceWorkerStatusCode::kOk) {
@@ -1329,7 +1328,7 @@
     blink::ServiceWorkerStatusCode status,
     const std::string& status_message,
     int64_t registration_id) {
-  DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   TRACE_EVENT_ASYNC_END2("ServiceWorker",
                          "ServiceWorkerContainerHost::Register", trace_id,
@@ -1390,7 +1389,7 @@
     int64_t trace_id,
     blink::ServiceWorkerStatusCode status,
     scoped_refptr<ServiceWorkerRegistration> registration) {
-  DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   TRACE_EVENT_ASYNC_END2(
       "ServiceWorker", "ServiceWorkerContainerHost::GetRegistration", trace_id,
@@ -1439,7 +1438,7 @@
     blink::ServiceWorkerStatusCode status,
     const std::vector<scoped_refptr<ServiceWorkerRegistration>>&
         registrations) {
-  DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   TRACE_EVENT_ASYNC_END1(
       "ServiceWorker", "ServiceWorkerContainerHost::GetRegistrations", trace_id,
@@ -1495,7 +1494,7 @@
 bool ServiceWorkerContainerHost::IsValidGetRegistrationMessage(
     const GURL& client_url,
     std::string* out_error) const {
-  DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   if (!IsContainerForWindowClient()) {
     *out_error = ServiceWorkerConsts::kBadMessageFromNonWindow;
     return false;
@@ -1515,7 +1514,7 @@
 
 bool ServiceWorkerContainerHost::IsValidGetRegistrationsMessage(
     std::string* out_error) const {
-  DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   if (!IsContainerForWindowClient()) {
     *out_error = ServiceWorkerConsts::kBadMessageFromNonWindow;
     return false;
@@ -1530,7 +1529,7 @@
 
 bool ServiceWorkerContainerHost::IsValidGetRegistrationForReadyMessage(
     std::string* out_error) const {
-  DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   if (!IsContainerForWindowClient()) {
     *out_error = ServiceWorkerConsts::kBadMessageFromNonWindow;
     return false;
@@ -1552,7 +1551,7 @@
     const GURL& script_url,
     const char* error_prefix,
     Args... args) {
-  DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   if (!context_) {
     std::move(*callback).Run(
         blink::mojom::ServiceWorkerErrorType::kAbort,
@@ -1602,7 +1601,7 @@
 void ServiceWorkerContainerHost::InheritControllerFrom(
     ServiceWorkerContainerHost& creator_host,
     const GURL& blob_url) {
-  DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(IsContainerForClient());
   DCHECK_EQ(blink::mojom::ServiceWorkerClientType::kDedicatedWorker,
             GetClientType());
diff --git a/content/browser/service_worker/service_worker_container_host.h b/content/browser/service_worker/service_worker_container_host.h
index a6ec841..1faae9a9 100644
--- a/content/browser/service_worker/service_worker_container_host.h
+++ b/content/browser/service_worker/service_worker_container_host.h
@@ -719,6 +719,10 @@
   // The ServiceWorkerHost that owns |this|.
   ServiceWorkerHost* service_worker_host_ = nullptr;
 
+  // For all instances --------------------------------------------------------
+
+  SEQUENCE_CHECKER(sequence_checker_);
+
   base::WeakPtrFactory<ServiceWorkerContainerHost> weak_factory_{this};
 };
 
diff --git a/content/renderer/render_thread_impl.cc b/content/renderer/render_thread_impl.cc
index 950b869..952fda1 100644
--- a/content/renderer/render_thread_impl.cc
+++ b/content/renderer/render_thread_impl.cc
@@ -1107,9 +1107,11 @@
 
 media::DecoderFactory* RenderThreadImpl::GetMediaDecoderFactory() {
   DCHECK(IsMainThread());
-  // Note that we don't reset this, ever.  We hand it out to WebRTC once, and it
-  // never asks for another one, even if the gpu process restarts.
-  DCHECK(!media_decoder_factory_);
+
+  // Note that we don't reset this, ever. We instantiate it once and never reset
+  // it, even if the gpu process restarts.
+  if (media_decoder_factory_)
+    return media_decoder_factory_.get();
 
   // MediaInterfaceFactory guarantees that the media::InterfaceFactory is
   // accessed from the current (main) thread.
diff --git a/docs/updating_clang_format_binaries.md b/docs/updating_clang_format_binaries.md
index a214706..0a52be3 100644
--- a/docs/updating_clang_format_binaries.md
+++ b/docs/updating_clang_format_binaries.md
@@ -64,6 +64,7 @@
     -DCMAKE_BUILD_TYPE=Release \
     -DLLVM_ENABLE_PROJECTS=clang \
     -DLLVM_ENABLE_ASSERTIONS=NO \
+    -DLLVM_ENABLE_TERMINFO=OFF \
     -DLLVM_ENABLE_THREADS=NO \
     '-DCMAKE_OSX_ARCHITECTURES=arm64;x86_64' \
     ../llvm/
@@ -74,11 +75,11 @@
     -DCMAKE_BUILD_TYPE=Release \
     -DLLVM_ENABLE_PROJECTS=clang \
     -DLLVM_ENABLE_ASSERTIONS=NO \
+    -DLLVM_ENABLE_TERMINFO=OFF \
     -DLLVM_ENABLE_THREADS=NO \
     -DCMAKE_C_COMPILER=$PWD/../../chromium/src/third_party/llvm-build/Release+Asserts/bin/clang \
     -DCMAKE_CXX_COMPILER=$PWD/../../chromium/src/third_party/llvm-build/Release+Asserts/bin/clang++ \
     -DCMAKE_ASM_COMPILER=$PWD/../../chromium/src/third_party/llvm-build/Release+Asserts/bin/clang \
-    -DLLVM_ENABLE_TERMINFO=OFF \
     -DCMAKE_CXX_STANDARD_LIBRARIES="-static-libgcc -static-libstdc++" \
     ../llvm/
 
diff --git a/ios/chrome/browser/credential_provider/credential_provider_service_unittest.mm b/ios/chrome/browser/credential_provider/credential_provider_service_unittest.mm
index 175c6e7..3198580 100644
--- a/ios/chrome/browser/credential_provider/credential_provider_service_unittest.mm
+++ b/ios/chrome/browser/credential_provider/credential_provider_service_unittest.mm
@@ -179,7 +179,7 @@
   credential_provider_service_->OnPrimaryAccountChanged(
       signin::PrimaryAccountChangeEvent(
           signin::PrimaryAccountChangeEvent::State(
-              CoreAccountInfo(), signin::ConsentLevel::kNotRequired),
+              CoreAccountInfo(), signin::ConsentLevel::kSignin),
           signin::PrimaryAccountChangeEvent::State(
               account, signin::ConsentLevel::kSync)));
 
@@ -198,7 +198,7 @@
           signin::PrimaryAccountChangeEvent::State(account,
                                                    signin::ConsentLevel::kSync),
           signin::PrimaryAccountChangeEvent::State(
-              CoreAccountInfo(), signin::ConsentLevel::kNotRequired)));
+              CoreAccountInfo(), signin::ConsentLevel::kSignin)));
 
   ASSERT_TRUE(WaitUntilConditionOrTimeout(kWaitForFileOperationTimeout, ^{
     base::RunLoop().RunUntilIdle();
diff --git a/ios/chrome/browser/signin/authentication_service.mm b/ios/chrome/browser/signin/authentication_service.mm
index 289aa4e..d224435 100644
--- a/ios/chrome/browser/signin/authentication_service.mm
+++ b/ios/chrome/browser/signin/authentication_service.mm
@@ -286,14 +286,12 @@
 ChromeIdentity* AuthenticationService::GetAuthenticatedIdentity() const {
   // There is no authenticated identity if there is no signed in user or if the
   // user signed in via the client login flow.
-  if (!identity_manager_->HasPrimaryAccount(
-          signin::ConsentLevel::kNotRequired)) {
+  if (!identity_manager_->HasPrimaryAccount(signin::ConsentLevel::kSignin)) {
     return nil;
   }
 
   std::string authenticated_gaia_id =
-      identity_manager_
-          ->GetPrimaryAccountInfo(signin::ConsentLevel::kNotRequired)
+      identity_manager_->GetPrimaryAccountInfo(signin::ConsentLevel::kSignin)
           .gaia;
   if (authenticated_gaia_id.empty())
     return nil;
@@ -336,8 +334,7 @@
   // if there is already a signed in user. Check that there is no signed in
   // account or that the new signed in account matches the old one to avoid a
   // mismatch between the old and the new authenticated accounts.
-  if (!identity_manager_->HasPrimaryAccount(
-          signin::ConsentLevel::kNotRequired)) {
+  if (!identity_manager_->HasPrimaryAccount(signin::ConsentLevel::kSignin)) {
     DCHECK(identity_manager_->GetPrimaryAccountMutator());
     // Initial sign-in to Chrome does not automatically turn on Sync features.
     // The Sync service will be enabled in a separate request to
@@ -348,7 +345,7 @@
 
   // The primary account should now be set to the expected account_id.
   CHECK_EQ(account_id, identity_manager_->GetPrimaryAccountId(
-                           signin::ConsentLevel::kNotRequired));
+                           signin::ConsentLevel::kSignin));
   crash_keys::SetCurrentlySignedIn(true);
 }
 
@@ -356,8 +353,7 @@
   DCHECK(ios::GetChromeBrowserProvider()
              ->GetChromeIdentityService()
              ->IsValidIdentity(identity));
-  DCHECK(
-      identity_manager_->HasPrimaryAccount(signin::ConsentLevel::kNotRequired));
+  DCHECK(identity_manager_->HasPrimaryAccount(signin::ConsentLevel::kSignin));
 
   const CoreAccountId account_id = identity_manager_->PickAccountIdForAccount(
       base::SysNSStringToUTF8(identity.gaiaID),
@@ -381,8 +377,7 @@
     signin_metrics::ProfileSignout signout_source,
     bool force_clear_browsing_data,
     ProceduralBlock completion) {
-  if (!identity_manager_->HasPrimaryAccount(
-          signin::ConsentLevel::kNotRequired)) {
+  if (!identity_manager_->HasPrimaryAccount(signin::ConsentLevel::kSignin)) {
     if (completion)
       completion();
     return;
@@ -560,8 +555,7 @@
 void AuthenticationService::HandleForgottenIdentity(
     ChromeIdentity* invalid_identity,
     bool should_prompt) {
-  if (!identity_manager_->HasPrimaryAccount(
-          signin::ConsentLevel::kNotRequired)) {
+  if (!identity_manager_->HasPrimaryAccount(signin::ConsentLevel::kSignin)) {
     // User is not signed in. Nothing to do here.
     return;
   }
@@ -605,7 +599,7 @@
   base::Optional<AccountInfo> primary_account_info =
       identity_manager_->FindExtendedAccountInfoForAccountWithRefreshToken(
           identity_manager_->GetPrimaryAccountInfo(
-              signin::ConsentLevel::kNotRequired));
+              signin::ConsentLevel::kSignin));
   if (!primary_account_info)
     return false;
 
diff --git a/ios/chrome/browser/signin/authentication_service_unittest.mm b/ios/chrome/browser/signin/authentication_service_unittest.mm
index 42e0e89..210455d 100644
--- a/ios/chrome/browser/signin/authentication_service_unittest.mm
+++ b/ios/chrome/browser/signin/authentication_service_unittest.mm
@@ -662,8 +662,8 @@
 
   EXPECT_NSEQ(identity(0),
               authentication_service()->GetAuthenticatedIdentity());
-  EXPECT_TRUE(identity_manager()->HasPrimaryAccount(
-      signin::ConsentLevel::kNotRequired));
+  EXPECT_TRUE(
+      identity_manager()->HasPrimaryAccount(signin::ConsentLevel::kSignin));
   EXPECT_FALSE(
       identity_manager()->HasPrimaryAccount(signin::ConsentLevel::kSync));
   EXPECT_TRUE(authentication_service()->IsAuthenticated());
@@ -675,8 +675,8 @@
 
   EXPECT_NSEQ(identity(0),
               authentication_service()->GetAuthenticatedIdentity());
-  EXPECT_TRUE(identity_manager()->HasPrimaryAccount(
-      signin::ConsentLevel::kNotRequired));
+  EXPECT_TRUE(
+      identity_manager()->HasPrimaryAccount(signin::ConsentLevel::kSignin));
   EXPECT_TRUE(
       identity_manager()->HasPrimaryAccount(signin::ConsentLevel::kSync));
   EXPECT_TRUE(authentication_service()->IsAuthenticated());
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 ad04120..5503bfb 100644
--- a/ios/chrome/browser/ui/browser_view/browser_view_controller.mm
+++ b/ios/chrome/browser/ui/browser_view/browser_view_controller.mm
@@ -1488,6 +1488,8 @@
 
   if (self.isThumbStripEnabled) {
     [self ensureBrowserViewHiderCoordinatorStarted];
+  } else {
+    self.view.backgroundColor = [UIColor colorNamed:kBackgroundColor];
   }
 }
 
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_header_view.mm b/ios/chrome/browser/ui/content_suggestions/content_suggestions_header_view.mm
index f9b4529..786d343e 100644
--- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_header_view.mm
+++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_header_view.mm
@@ -17,6 +17,7 @@
 #import "ios/chrome/browser/ui/omnibox/omnibox_constants.h"
 #import "ios/chrome/browser/ui/omnibox/omnibox_container_view.h"
 #import "ios/chrome/browser/ui/omnibox/omnibox_text_field_ios.h"
+#import "ios/chrome/browser/ui/start_surface/start_surface_features.h"
 #import "ios/chrome/browser/ui/toolbar/buttons/toolbar_button_factory.h"
 #import "ios/chrome/browser/ui/toolbar/buttons/toolbar_configuration.h"
 #import "ios/chrome/browser/ui/toolbar/public/toolbar_constants.h"
@@ -86,6 +87,10 @@
 // Layout constraint for the invisible button that is where the omnibox should
 // be and that focuses the omnibox when tapped.
 @property(nonatomic, strong) NSLayoutConstraint* invisibleOmniboxConstraint;
+// Height layout constraint for the identity disc button.
+@property(nonatomic, strong) NSLayoutConstraint* identityDiscHeightConstraint;
+// Width layout constraint for the identity disc button.
+@property(nonatomic, strong) NSLayoutConstraint* identityDiscWidthConstraint;
 // View used to add on-touch highlight to the fake omnibox.
 @property(nonatomic, strong) UIView* fakeLocationBarHighlightView;
 
@@ -126,14 +131,19 @@
   self.identityDiscView.translatesAutoresizingMaskIntoConstraints = NO;
   CGFloat dimension =
       ntp_home::kIdentityAvatarDimension + 2 * ntp_home::kIdentityAvatarMargin;
+  self.identityDiscHeightConstraint =
+      [self.identityDiscView.heightAnchor constraintEqualToConstant:dimension];
+  self.identityDiscWidthConstraint =
+      [self.identityDiscView.widthAnchor constraintEqualToConstant:dimension];
   [NSLayoutConstraint activateConstraints:@[
-    [self.identityDiscView.heightAnchor constraintEqualToConstant:dimension],
-    [self.identityDiscView.widthAnchor constraintEqualToConstant:dimension],
+    self.identityDiscHeightConstraint,
+    self.identityDiscWidthConstraint,
     [self.identityDiscView.trailingAnchor
         constraintEqualToAnchor:self.safeAreaLayoutGuide.trailingAnchor],
     [self.identityDiscView.topAnchor
         constraintEqualToAnchor:self.toolBarView.topAnchor],
   ]];
+  [self updateIdentityDiscContraints];
 }
 
 - (void)addViewsToSearchField:(UIView*)searchField {
@@ -427,6 +437,7 @@
       self.traitCollection.preferredContentSizeCategory) {
     self.searchHintLabel.font = [self hintLabelFont];
   }
+  [self updateIdentityDiscContraints];
 }
 
 - (void)updateForTopSafeAreaInset:(CGFloat)topSafeAreaInset {
@@ -457,6 +468,24 @@
 
 #pragma mark - Private
 
+- (void)updateIdentityDiscContraints {
+  if (ShouldShrinkLogoForStartSurface() &&
+      self.traitCollection.verticalSizeClass ==
+          UIUserInterfaceSizeClassCompact) {
+    self.identityDiscWidthConstraint.constant =
+        ntp_home::kIdentityAvatarDimension;
+    self.identityDiscHeightConstraint.constant =
+        ntp_home::kIdentityAvatarDimension;
+  } else {
+    self.identityDiscWidthConstraint.constant =
+        ntp_home::kIdentityAvatarDimension +
+        2 * ntp_home::kIdentityAvatarMargin;
+    self.identityDiscHeightConstraint.constant =
+        ntp_home::kIdentityAvatarDimension +
+        2 * ntp_home::kIdentityAvatarMargin;
+  }
+}
+
 // Returns the font size for the hint label.
 - (UIFont*)hintLabelFont {
   return LocationBarSteadyViewFont(
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_header_view_controller.mm b/ios/chrome/browser/ui/content_suggestions/content_suggestions_header_view_controller.mm
index 9d6c1ba..dcf9c09 100644
--- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_header_view_controller.mm
+++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_header_view_controller.mm
@@ -86,8 +86,6 @@
 @property(nonatomic, strong) NSLayoutConstraint* fakeOmniboxWidthConstraint;
 @property(nonatomic, strong) NSLayoutConstraint* fakeOmniboxHeightConstraint;
 @property(nonatomic, strong) NSLayoutConstraint* fakeOmniboxTopMarginConstraint;
-@property(nonatomic, strong) NSArray* identityDiscLogoLandscapeConstraints;
-@property(nonatomic, strong) NSArray* identityDiscLogoPortraitConstraints;
 @property(nonatomic, assign) BOOL logoFetched;
 
 @end
@@ -125,9 +123,7 @@
   if (self.traitCollection.horizontalSizeClass !=
       previousTraitCollection.horizontalSizeClass) {
     [self updateFakeboxDisplay];
-  }
-  if ([self shouldUseShrunkLogoLayout]) {
-    [self updateIdentityDiscLogoConstraints];
+    [self updateIdentityDiscInsets];
   }
 }
 
@@ -369,21 +365,13 @@
   AddSameConstraints(self.fakeTapButton, toolbar);
 }
 
-- (BOOL)shouldUseShrunkLogoLayout {
-  return ShouldShrinkLogoForStartSurface() && !IsIPadIdiom();
-}
-
 - (void)addIdentityDisc {
   // Set up a button. Details for the button will be set through delegate
   // implementation of UserAccountImageUpdateDelegate.
   self.identityDiscButton = [UIButton buttonWithType:UIButtonTypeCustom];
   self.identityDiscButton.accessibilityLabel =
       l10n_util::GetNSString(IDS_ACCNAME_PARTICLE_DISC);
-  if (![self shouldUseShrunkLogoLayout]) {
-    self.identityDiscButton.imageEdgeInsets = UIEdgeInsetsMake(
-        ntp_home::kIdentityAvatarMargin, ntp_home::kIdentityAvatarMargin,
-        ntp_home::kIdentityAvatarMargin, ntp_home::kIdentityAvatarMargin);
-  }
+  [self updateIdentityDiscInsets];
   [self.identityDiscButton addTarget:self
                               action:@selector(identityDiscTapped)
                     forControlEvents:UIControlEventTouchUpInside];
@@ -406,53 +394,22 @@
       };
   }
 
-  if (![self shouldUseShrunkLogoLayout]) {
     // TODO(crbug.com/965958): Set action on button to launch into Settings.
     [self.headerView setIdentityDiscView:self.identityDiscButton];
-  } else {
-    // Add identity disc as a subview of the logo container view.
-    [self.logoVendor.view addSubview:self.identityDiscButton];
-    self.identityDiscButton.translatesAutoresizingMaskIntoConstraints = NO;
-    CGFloat dimension = ntp_home::kIdentityAvatarDimension;
-    self.identityDiscLogoLandscapeConstraints = @[
-      [self.identityDiscButton.heightAnchor
-          constraintEqualToConstant:dimension],
-      [self.identityDiscButton.widthAnchor constraintEqualToConstant:dimension],
-      [self.identityDiscButton.trailingAnchor
-          constraintEqualToAnchor:self.view.safeAreaLayoutGuide.trailingAnchor
-                         constant:-ntp_home::kIdentityAvatarMargin],
-      [self.identityDiscButton.topAnchor
-          constraintEqualToAnchor:self.logoVendor.view.topAnchor],
-    ];
-    self.identityDiscLogoPortraitConstraints = @[
-      [self.identityDiscButton.heightAnchor
-          constraintEqualToConstant:dimension],
-      [self.identityDiscButton.widthAnchor constraintEqualToConstant:dimension],
-      [self.identityDiscButton.trailingAnchor
-          constraintEqualToAnchor:self.fakeOmnibox.trailingAnchor],
-      [self.identityDiscButton.topAnchor
-          constraintEqualToAnchor:self.logoVendor.view.topAnchor],
-    ];
-    [self updateIdentityDiscLogoConstraints];
-  }
 
   // Register to receive the avatar of the currently signed in user.
   [self.delegate registerImageUpdater:self];
 }
 
-- (void)updateIdentityDiscLogoConstraints {
-  if (IsCompactWidth(self.traitCollection)) {
-    [NSLayoutConstraint
-        activateConstraints:self.identityDiscLogoPortraitConstraints];
-    [NSLayoutConstraint
-        deactivateConstraints:self.identityDiscLogoLandscapeConstraints];
-    ;
+- (void)updateIdentityDiscInsets {
+  if (ShouldShrinkLogoForStartSurface() &&
+      self.traitCollection.verticalSizeClass ==
+          UIUserInterfaceSizeClassCompact) {
+    self.identityDiscButton.imageEdgeInsets = UIEdgeInsetsZero;
   } else {
-    [NSLayoutConstraint
-        activateConstraints:self.identityDiscLogoLandscapeConstraints];
-    [NSLayoutConstraint
-        deactivateConstraints:self.identityDiscLogoPortraitConstraints];
-    ;
+    self.identityDiscButton.imageEdgeInsets = UIEdgeInsetsMake(
+        ntp_home::kIdentityAvatarMargin, ntp_home::kIdentityAvatarMargin,
+        ntp_home::kIdentityAvatarMargin, ntp_home::kIdentityAvatarMargin);
   }
 }
 
diff --git a/ios/chrome/browser/ui/content_suggestions/ntp_home_mediator.mm b/ios/chrome/browser/ui/content_suggestions/ntp_home_mediator.mm
index 452d347..27581e52 100644
--- a/ios/chrome/browser/ui/content_suggestions/ntp_home_mediator.mm
+++ b/ios/chrome/browser/ui/content_suggestions/ntp_home_mediator.mm
@@ -577,7 +577,7 @@
 
 - (void)onPrimaryAccountChanged:
     (const signin::PrimaryAccountChangeEvent&)event {
-  switch (event.GetEventTypeFor(signin::ConsentLevel::kNotRequired)) {
+  switch (event.GetEventTypeFor(signin::ConsentLevel::kSignin)) {
     case signin::PrimaryAccountChangeEvent::Type::kSet:
     case signin::PrimaryAccountChangeEvent::Type::kCleared:
       [self updateAccountImage];
diff --git a/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_manager.mm b/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_manager.mm
index 8d7deae..3a6bf04 100644
--- a/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_manager.mm
+++ b/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_manager.mm
@@ -334,7 +334,7 @@
   // Google Account footer.
   signin::IdentityManager* identityManager =
       IdentityManagerFactory::GetForBrowserState(self.browserState);
-  if (identityManager->HasPrimaryAccount(signin::ConsentLevel::kNotRequired)) {
+  if (identityManager->HasPrimaryAccount(signin::ConsentLevel::kSignin)) {
     [model addSectionWithIdentifier:SectionIdentifierGoogleAccount];
     [model setFooter:[self footerForGoogleAccountSectionItem]
         forSectionWithIdentifier:SectionIdentifierGoogleAccount];
diff --git a/ios/chrome/browser/ui/webui/policy/policy_ui_handler.mm b/ios/chrome/browser/ui/webui/policy/policy_ui_handler.mm
index 7009891..08a7849 100644
--- a/ios/chrome/browser/ui/webui/policy/policy_ui_handler.mm
+++ b/ios/chrome/browser/ui/webui/policy/policy_ui_handler.mm
@@ -66,9 +66,6 @@
       {"unknown", IDS_POLICY_UNKNOWN},
       {"unset", IDS_POLICY_UNSET},
       {"value", IDS_POLICY_LABEL_VALUE},
-      {"sourceDefault", IDS_POLICY_SOURCE_DEFAULT},
-      {"loadPoliciesDone", IDS_POLICY_LOAD_POLICIES_DONE},
-      {"loadingPolicies", IDS_POLICY_LOADING_POLICIES},
   };
   source->AddLocalizedStrings(kStrings);
   source->AddLocalizedStrings(policy::kPolicySources);
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.arm64.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.arm64.zip.sha1
index c0c5ca9..ac088e65 100644
--- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.arm64.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.arm64.zip.sha1
@@ -1 +1 @@
-b8493e8af7e304f4041da41db7cf46a92553dc30
\ No newline at end of file
+1e9f20a478802809be9392e0df9d2fc3c4399915
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.x64.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.x64.zip.sha1
index c03f1bda..8d03a3b 100644
--- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.x64.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.x64.zip.sha1
@@ -1 +1 @@
-2a14fd68c36337d96eb6af847b59336bc76fa611
\ No newline at end of file
+5c899ff4ab20a2939960b6fb4eb0ebe44e8447be
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.arm64.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.arm64.zip.sha1
index 3cf43cb2..2542f24 100644
--- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.arm64.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.arm64.zip.sha1
@@ -1 +1 @@
-0efcc619eadd56f8704deed4f7fbe4fa9c8a6f79
\ No newline at end of file
+c09c04166d85cabda0eb9e3caac0990318198438
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.arm64.zip.sha1 b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.arm64.zip.sha1
index a7c1c8a..23e9c12 100644
--- a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.arm64.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.arm64.zip.sha1
@@ -1 +1 @@
-4dca2eef4c17e56e5bef6faac90ef4e07dc23795
\ No newline at end of file
+b418b65556a46fa84f9e7eafda5ccc95a42b0f6e
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.x64.zip.sha1 b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.x64.zip.sha1
index 2eaf655e..02a75d681 100644
--- a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.x64.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.x64.zip.sha1
@@ -1 +1 @@
-0e0d9d59b4a72f36750f8f8024be264e9974b4c7
\ No newline at end of file
+e2dc870a8ad9352306b14dbc14eedd1e9769b6dd
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.arm64.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.arm64.zip.sha1
index 63537a2..c6682f8 100644
--- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.arm64.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.arm64.zip.sha1
@@ -1 +1 @@
-4bb22c31447f6234cdab1e76c7a15ba09b8043b2
\ No newline at end of file
+fdc44d51a5d82ed327396cbf2a41d65574114b1c
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.x64.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.x64.zip.sha1
index 0dd299b6..03c62da 100644
--- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.x64.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.x64.zip.sha1
@@ -1 +1 @@
-2fca7009b725aa7f6682e9c141d89304be675b52
\ No newline at end of file
+9c28d64882f69a056da591d528a7d97b043af6d2
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.arm64.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.arm64.zip.sha1
index 335269b9..933a040 100644
--- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.arm64.zip.sha1
+++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.arm64.zip.sha1
@@ -1 +1 @@
-f9a3602b252fd607d41119a37d9cc0f286a89f88
\ No newline at end of file
+ef4da518f254acd1dd117d16c5d2e16f0f5da119
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.x64.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.x64.zip.sha1
index c1f0fdb..dbbc3ee 100644
--- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.x64.zip.sha1
+++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.x64.zip.sha1
@@ -1 +1 @@
-584bec3f219834b63d887c3c443456b7fa630733
\ No newline at end of file
+4e7b7ea28b5726f86730ee38163add6288e38dbf
\ No newline at end of file
diff --git a/media/capture/video/chromeos/camera_app_device_bridge_impl.cc b/media/capture/video/chromeos/camera_app_device_bridge_impl.cc
index 73c3509..322a0601 100644
--- a/media/capture/video/chromeos/camera_app_device_bridge_impl.cc
+++ b/media/capture/video/chromeos/camera_app_device_bridge_impl.cc
@@ -147,8 +147,8 @@
 
 void CameraAppDeviceBridgeImpl::RemoveIpcTaskRunner(
     const std::string& device_id) {
-  base::AutoLock lock(device_map_lock_);
-  camera_app_devices_.erase(device_id);
+  base::AutoLock lock(task_runner_map_lock_);
+  ipc_task_runners_.erase(device_id);
 }
 
 void CameraAppDeviceBridgeImpl::GetCameraAppDevice(
diff --git a/remoting/android/BUILD.gn b/remoting/android/BUILD.gn
index dfc46de0..80977f36 100644
--- a/remoting/android/BUILD.gn
+++ b/remoting/android/BUILD.gn
@@ -34,7 +34,7 @@
 
 remoting_localize("remoting_apk_manifest") {
   sources = [ "java/AndroidManifest.xml.jinja2" ]
-  locales = [ "en" ]
+  locale_list = [ "en" ]
   variables = [ rebase_path(branding_path) ]
   output = "$root_gen_dir/remoting/android/{{source_name_part}}"
 }
@@ -160,7 +160,7 @@
 
 remoting_localize("remoting_test_apk_manifest") {
   sources = [ "javatests/AndroidManifest.xml.jinja2" ]
-  locales = [ "en" ]
+  locale_list = [ "en" ]
   variables = [ rebase_path(branding_path) ]
   output = "$root_gen_dir/remoting/android_test/{{source_name_part}}"
 }
diff --git a/remoting/host/win/BUILD.gn b/remoting/host/win/BUILD.gn
index 9738c4c..6431260 100644
--- a/remoting/host/win/BUILD.gn
+++ b/remoting/host/win/BUILD.gn
@@ -246,7 +246,7 @@
 # Makes the .mc file from the .mc.jinja file.
 remoting_localize("messages_localizing") {
   sources = [ "host_messages.mc.jinja2" ]
-  locales = remoting_locales
+  locale_list = remoting_locales_without_pseudolocales
   locale_dir = resources_locale_dir
   encoding = "utf-16"
 
@@ -524,5 +524,5 @@
 
   encoding = "utf-16"
 
-  locales = remoting_locales
+  locale_list = remoting_locales_without_pseudolocales
 }
diff --git a/remoting/remoting_locales.gni b/remoting/remoting_locales.gni
index a9f4d898..3dc3ed8 100644
--- a/remoting/remoting_locales.gni
+++ b/remoting/remoting_locales.gni
@@ -3,11 +3,12 @@
 # found in the LICENSE file.
 
 import("//build/config/chromeos/ui_mode.gni")
+import("//build/config/locales.gni")
 
 resources_locale_dir = "$root_gen_dir/remoting/resources/_locales"
 
 # See also remoting_locales_with_underscores below.
-remoting_locales = [
+remoting_locales_without_pseudolocales = [
   "am",
   "ar",
   "bg",
@@ -67,59 +68,57 @@
   "zh-TW",
 ]
 
-# Some locales have hyphens in the names but for some uses underscores are
-# needed.
-remoting_locales_with_underscores = remoting_locales
-remoting_locales_with_underscores -= [
-  "en-GB",
-
-  "pt-PT",
-  "zh-CN",
-  "zh-TW",
-]
-remoting_locales_with_underscores += [
-  "en_GB",
-
-  "pt_PT",
-  "zh_CN",
-  "zh_TW",
-]
-
 # An additional locale "en-US" is generated for ChromeOS and Chrome on iOS.
 # TODO(yuweih): Our build script doesn't seem to work with en-US and Chrome
 # on iOS doesn't seem to have en-US.lproj. Add is_ios back if we do need to
 # work with en-US.
 if (is_chromeos_ash || is_chromeos_lacros) {
-  remoting_locales += [ "en-US" ]
-  remoting_locales_with_underscores += [ "en_US" ]
-
   # Support Icelandic in ChromeOS
-  remoting_locales += [ "is" ]
-  remoting_locales_with_underscores += [ "is" ]
+  remoting_locales_without_pseudolocales += [
+    "en-US",
+    "is",
+  ]
 }
 
 # Locales "pt-BR" and "es-419" are named "pt" and "es-MX" respectively on iOS.
 if (!is_ios) {
-  remoting_locales += [
+  remoting_locales_without_pseudolocales += [
     "pt-BR",
     "es-419",
   ]
-  remoting_locales_with_underscores += [
-    "pt_BR",
-    "es_419",
-  ]
 } else {
-  remoting_locales += [
+  remoting_locales_without_pseudolocales += [
     "pt",
     "es-MX",
   ]
-  remoting_locales_with_underscores += [
-    "pt",
-    "es_MX",
-  ]
 }
 
-messages_locales = remoting_locales_with_underscores
+remoting_locales_with_underscores_without_pseudolocales = []
+foreach(locale, remoting_locales_without_pseudolocales) {
+  remoting_locales_with_underscores_without_pseudolocales +=
+      [ string_replace(locale, "-", "_") ]
+}
+
+pseudolocales_with_underscores = []
+foreach(locale, pseudolocales) {
+  pseudolocales_with_underscores += [ string_replace(locale, "-", "_") ]
+}
+
+remoting_locales_with_pseudolocales =
+    remoting_locales_without_pseudolocales + pseudolocales
+remoting_locales_with_underscores_with_pseudolocales =
+    remoting_locales_with_underscores_without_pseudolocales +
+    pseudolocales_with_underscores
+
+if (enable_pseudolocales) {
+  remoting_locales = remoting_locales_with_pseudolocales
+  remoting_locales_with_underscores =
+      remoting_locales_with_underscores_with_pseudolocales
+} else {
+  remoting_locales = remoting_locales_without_pseudolocales
+  remoting_locales_with_underscores =
+      remoting_locales_with_underscores_without_pseudolocales
+}
 
 remoting_android_locales = [
   "am",
@@ -170,5 +169,5 @@
 # The list of .json files generated by remoting_strings.grd.
 remoting_resources_locale_files =
     process_file_template(
-        messages_locales,
+        remoting_locales_with_underscores_with_pseudolocales,
         [ "remoting/resources/_locales/{{source_name_part}}/messages.json" ])
diff --git a/remoting/resources/BUILD.gn b/remoting/resources/BUILD.gn
index 868d237..2425066 100644
--- a/remoting/resources/BUILD.gn
+++ b/remoting/resources/BUILD.gn
@@ -61,7 +61,7 @@
   # The grd produces a *.pak file and a messages.json file (this one uses
   # underscores instead of hyphens) for each locale.
   outputs +=
-      process_file_template(remoting_locales,
+      process_file_template(remoting_locales_with_pseudolocales,
                             [ "remoting/resources/{{source_name_part}}.pak" ])
 
   outputs += remoting_resources_locale_files
diff --git a/remoting/resources/remoting_strings.grd b/remoting/resources/remoting_strings.grd
index 408942ace..bda679b 100644
--- a/remoting/resources/remoting_strings.grd
+++ b/remoting/resources/remoting_strings.grd
@@ -80,6 +80,10 @@
     <output filename="remoting/resources/zh-CN.pak" lang="zh-CN" type="data_package"/>
     <output filename="remoting/resources/zh-TW.pak" lang="zh-TW" type="data_package"/>
 
+    <!-- Pseudolocales -->
+    <output filename="remoting/resources/ar-XB.pak" lang="ar-XB" type="data_package"/>
+    <output filename="remoting/resources/en-XA.pak" lang="en-XA" type="data_package"/>
+
     <output filename="remoting/resources/_locales/am/messages.json" lang="am" type="chrome_messages_json"/>
     <output filename="remoting/resources/_locales/ar/messages.json" lang="ar" type="chrome_messages_json"/>
     <output filename="remoting/resources/_locales/bg/messages.json" lang="bg" type="chrome_messages_json"/>
@@ -154,6 +158,10 @@
     <output filename="remoting/resources/_locales/zh_CN/messages.json" lang="zh-CN" type="chrome_messages_json"/>
     <output filename="remoting/resources/_locales/zh_TW/messages.json" lang="zh-TW" type="chrome_messages_json"/>
 
+    <!-- Pseudolocales -->
+    <output filename="remoting/resources/_locales/ar_XB/messages.json" lang="ar-XB" type="chrome_messages_json"/>
+    <output filename="remoting/resources/_locales/en_XA/messages.json" lang="en-XA" type="chrome_messages_json"/>
+
     <if expr="is_android">
       <output filename="remoting/android/res/values-am/remoting_strings.xml" lang="am" type="android" context="android_java"/>
       <output filename="remoting/android/res/values-ar/remoting_strings.xml" lang="ar" type="android" context="android_java"/>
diff --git a/remoting/tools/build/remoting_localize.gni b/remoting/tools/build/remoting_localize.gni
index a0bdb4c..1b4faf3 100644
--- a/remoting/tools/build/remoting_localize.gni
+++ b/remoting/tools/build/remoting_localize.gni
@@ -11,7 +11,7 @@
 #   sources (required)
 #     List of jinja2 files to load. This is the template.
 #
-#   locales (required)
+#   locale_list (required)
 #     List of locales.
 #
 #   locale_dir (optional)
@@ -23,7 +23,7 @@
 #   variables (optional)
 #     List of variables to pass to script.
 #
-#   output (optiona)
+#   output (optional)
 #     Substitution pattern for the output. Defaults to a file in the target
 #     gen dir with the extension stripped (normally the extension is ".jinja2"
 #     which then leaves the non-tempaltized file name).
@@ -98,7 +98,7 @@
       ]
     }
 
-    args += invoker.locales
+    args += invoker.locale_list
 
     if (defined(invoker.deps)) {
       deps = invoker.deps
diff --git a/services/network/public/cpp/content_security_policy/content_security_policy.cc b/services/network/public/cpp/content_security_policy/content_security_policy.cc
index ebeb9860..05fd38f 100644
--- a/services/network/public/cpp/content_security_policy/content_security_policy.cc
+++ b/services/network/public/cpp/content_security_policy/content_security_policy.cc
@@ -145,6 +145,9 @@
     case CSPDirectiveName::NavigateTo:
       return "Refused to navigate to '$1' because it violates the "
              "following Content Security Policy directive: \"$2\".";
+    case CSPDirectiveName::PrefetchSrc:
+      return "Refused to prefetch content from '$1' because it violates the "
+             "following Content Security Policy directive: \"$2\".";
 
     case CSPDirectiveName::BaseURI:
     case CSPDirectiveName::BlockAllMixedContent:
@@ -156,7 +159,6 @@
     case CSPDirectiveName::ManifestSrc:
     case CSPDirectiveName::MediaSrc:
     case CSPDirectiveName::ObjectSrc:
-    case CSPDirectiveName::PrefetchSrc:
     case CSPDirectiveName::ReportTo:
     case CSPDirectiveName::ReportURI:
     case CSPDirectiveName::RequireTrustedTypesFor:
diff --git a/testing/buildbot/chromium.android.fyi.json b/testing/buildbot/chromium.android.fyi.json
index 8c822762..76846a1 100644
--- a/testing/buildbot/chromium.android.fyi.json
+++ b/testing/buildbot/chromium.android.fyi.json
@@ -4534,11 +4534,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_instrumentation_test_versions_apk_Client Library Skew Tests For 89.0.4389.112"
+            "weblayer_instrumentation_test_versions_apk_Client Library Skew Tests For 89.0.4389.113"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_instrumentation_test_versions_apk_Client Library Skew Tests For 89.0.4389.112",
+        "name": "weblayer_instrumentation_test_versions_apk_Client Library Skew Tests For 89.0.4389.113",
         "resultdb": {
           "enable": true
         },
@@ -4548,7 +4548,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M89",
-              "revision": "version:89.0.4389.112"
+              "revision": "version:89.0.4389.113"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -4613,11 +4613,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_instrumentation_test_versions_apk_Client Library Skew Tests For 90.0.4430.45"
+            "weblayer_instrumentation_test_versions_apk_Client Library Skew Tests For 90.0.4430.46"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_instrumentation_test_versions_apk_Client Library Skew Tests For 90.0.4430.45",
+        "name": "weblayer_instrumentation_test_versions_apk_Client Library Skew Tests For 90.0.4430.46",
         "resultdb": {
           "enable": true
         },
@@ -4627,7 +4627,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M90",
-              "revision": "version:90.0.4430.45"
+              "revision": "version:90.0.4430.46"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -4771,11 +4771,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_instrumentation_test_versions_apk_Implementation Library Skew Tests For 89.0.4389.112"
+            "weblayer_instrumentation_test_versions_apk_Implementation Library Skew Tests For 89.0.4389.113"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_instrumentation_test_versions_apk_Implementation Library Skew Tests For 89.0.4389.112",
+        "name": "weblayer_instrumentation_test_versions_apk_Implementation Library Skew Tests For 89.0.4389.113",
         "resultdb": {
           "enable": true
         },
@@ -4785,7 +4785,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M89",
-              "revision": "version:89.0.4389.112"
+              "revision": "version:89.0.4389.113"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -4850,11 +4850,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_instrumentation_test_versions_apk_Implementation Library Skew Tests For 90.0.4430.45"
+            "weblayer_instrumentation_test_versions_apk_Implementation Library Skew Tests For 90.0.4430.46"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_instrumentation_test_versions_apk_Implementation Library Skew Tests For 90.0.4430.45",
+        "name": "weblayer_instrumentation_test_versions_apk_Implementation Library Skew Tests For 90.0.4430.46",
         "resultdb": {
           "enable": true
         },
@@ -4864,7 +4864,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M90",
-              "revision": "version:90.0.4430.45"
+              "revision": "version:90.0.4430.46"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -5076,11 +5076,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_instrumentation_test_versions_apk_Client Library Skew Tests For 89.0.4389.112"
+            "weblayer_instrumentation_test_versions_apk_Client Library Skew Tests For 89.0.4389.113"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_instrumentation_test_versions_apk_Client Library Skew Tests For 89.0.4389.112",
+        "name": "weblayer_instrumentation_test_versions_apk_Client Library Skew Tests For 89.0.4389.113",
         "resultdb": {
           "enable": true
         },
@@ -5090,7 +5090,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M89",
-              "revision": "version:89.0.4389.112"
+              "revision": "version:89.0.4389.113"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -5155,11 +5155,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_instrumentation_test_versions_apk_Client Library Skew Tests For 90.0.4430.45"
+            "weblayer_instrumentation_test_versions_apk_Client Library Skew Tests For 90.0.4430.46"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_instrumentation_test_versions_apk_Client Library Skew Tests For 90.0.4430.45",
+        "name": "weblayer_instrumentation_test_versions_apk_Client Library Skew Tests For 90.0.4430.46",
         "resultdb": {
           "enable": true
         },
@@ -5169,7 +5169,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M90",
-              "revision": "version:90.0.4430.45"
+              "revision": "version:90.0.4430.46"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -5313,11 +5313,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_instrumentation_test_versions_apk_Implementation Library Skew Tests For 89.0.4389.112"
+            "weblayer_instrumentation_test_versions_apk_Implementation Library Skew Tests For 89.0.4389.113"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_instrumentation_test_versions_apk_Implementation Library Skew Tests For 89.0.4389.112",
+        "name": "weblayer_instrumentation_test_versions_apk_Implementation Library Skew Tests For 89.0.4389.113",
         "resultdb": {
           "enable": true
         },
@@ -5327,7 +5327,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M89",
-              "revision": "version:89.0.4389.112"
+              "revision": "version:89.0.4389.113"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -5392,11 +5392,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_instrumentation_test_versions_apk_Implementation Library Skew Tests For 90.0.4430.45"
+            "weblayer_instrumentation_test_versions_apk_Implementation Library Skew Tests For 90.0.4430.46"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_instrumentation_test_versions_apk_Implementation Library Skew Tests For 90.0.4430.45",
+        "name": "weblayer_instrumentation_test_versions_apk_Implementation Library Skew Tests For 90.0.4430.46",
         "resultdb": {
           "enable": true
         },
@@ -5406,7 +5406,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M90",
-              "revision": "version:90.0.4430.45"
+              "revision": "version:90.0.4430.46"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
diff --git a/testing/buildbot/chromium.android.json b/testing/buildbot/chromium.android.json
index 104d0532..f99d06f 100644
--- a/testing/buildbot/chromium.android.json
+++ b/testing/buildbot/chromium.android.json
@@ -46456,11 +46456,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_instrumentation_test_versions_apk_Client Library Skew Tests For 89.0.4389.112"
+            "weblayer_instrumentation_test_versions_apk_Client Library Skew Tests For 89.0.4389.113"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_instrumentation_test_versions_apk_Client Library Skew Tests For 89.0.4389.112",
+        "name": "weblayer_instrumentation_test_versions_apk_Client Library Skew Tests For 89.0.4389.113",
         "resultdb": {
           "enable": true
         },
@@ -46470,7 +46470,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M89",
-              "revision": "version:89.0.4389.112"
+              "revision": "version:89.0.4389.113"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -46535,11 +46535,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_instrumentation_test_versions_apk_Client Library Skew Tests For 90.0.4430.45"
+            "weblayer_instrumentation_test_versions_apk_Client Library Skew Tests For 90.0.4430.46"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_instrumentation_test_versions_apk_Client Library Skew Tests For 90.0.4430.45",
+        "name": "weblayer_instrumentation_test_versions_apk_Client Library Skew Tests For 90.0.4430.46",
         "resultdb": {
           "enable": true
         },
@@ -46549,7 +46549,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M90",
-              "revision": "version:90.0.4430.45"
+              "revision": "version:90.0.4430.46"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -46693,11 +46693,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_instrumentation_test_versions_apk_Implementation Library Skew Tests For 89.0.4389.112"
+            "weblayer_instrumentation_test_versions_apk_Implementation Library Skew Tests For 89.0.4389.113"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_instrumentation_test_versions_apk_Implementation Library Skew Tests For 89.0.4389.112",
+        "name": "weblayer_instrumentation_test_versions_apk_Implementation Library Skew Tests For 89.0.4389.113",
         "resultdb": {
           "enable": true
         },
@@ -46707,7 +46707,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M89",
-              "revision": "version:89.0.4389.112"
+              "revision": "version:89.0.4389.113"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -46772,11 +46772,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_instrumentation_test_versions_apk_Implementation Library Skew Tests For 90.0.4430.45"
+            "weblayer_instrumentation_test_versions_apk_Implementation Library Skew Tests For 90.0.4430.46"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_instrumentation_test_versions_apk_Implementation Library Skew Tests For 90.0.4430.45",
+        "name": "weblayer_instrumentation_test_versions_apk_Implementation Library Skew Tests For 90.0.4430.46",
         "resultdb": {
           "enable": true
         },
@@ -46786,7 +46786,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M90",
-              "revision": "version:90.0.4430.45"
+              "revision": "version:90.0.4430.46"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -46997,11 +46997,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_instrumentation_test_versions_apk_Client Library Skew Tests For 89.0.4389.112"
+            "weblayer_instrumentation_test_versions_apk_Client Library Skew Tests For 89.0.4389.113"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_instrumentation_test_versions_apk_Client Library Skew Tests For 89.0.4389.112",
+        "name": "weblayer_instrumentation_test_versions_apk_Client Library Skew Tests For 89.0.4389.113",
         "resultdb": {
           "enable": true
         },
@@ -47011,7 +47011,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M89",
-              "revision": "version:89.0.4389.112"
+              "revision": "version:89.0.4389.113"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -47076,11 +47076,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_instrumentation_test_versions_apk_Client Library Skew Tests For 90.0.4430.45"
+            "weblayer_instrumentation_test_versions_apk_Client Library Skew Tests For 90.0.4430.46"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_instrumentation_test_versions_apk_Client Library Skew Tests For 90.0.4430.45",
+        "name": "weblayer_instrumentation_test_versions_apk_Client Library Skew Tests For 90.0.4430.46",
         "resultdb": {
           "enable": true
         },
@@ -47090,7 +47090,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M90",
-              "revision": "version:90.0.4430.45"
+              "revision": "version:90.0.4430.46"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -47234,11 +47234,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_instrumentation_test_versions_apk_Implementation Library Skew Tests For 89.0.4389.112"
+            "weblayer_instrumentation_test_versions_apk_Implementation Library Skew Tests For 89.0.4389.113"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_instrumentation_test_versions_apk_Implementation Library Skew Tests For 89.0.4389.112",
+        "name": "weblayer_instrumentation_test_versions_apk_Implementation Library Skew Tests For 89.0.4389.113",
         "resultdb": {
           "enable": true
         },
@@ -47248,7 +47248,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M89",
-              "revision": "version:89.0.4389.112"
+              "revision": "version:89.0.4389.113"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -47313,11 +47313,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_instrumentation_test_versions_apk_Implementation Library Skew Tests For 90.0.4430.45"
+            "weblayer_instrumentation_test_versions_apk_Implementation Library Skew Tests For 90.0.4430.46"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_instrumentation_test_versions_apk_Implementation Library Skew Tests For 90.0.4430.45",
+        "name": "weblayer_instrumentation_test_versions_apk_Implementation Library Skew Tests For 90.0.4430.46",
         "resultdb": {
           "enable": true
         },
@@ -47327,7 +47327,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M90",
-              "revision": "version:90.0.4430.45"
+              "revision": "version:90.0.4430.46"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
diff --git a/testing/buildbot/filters/android.emulator_m.chrome_public_test_apk.filter b/testing/buildbot/filters/android.emulator_m.chrome_public_test_apk.filter
index d1e33b3..c02128ab 100644
--- a/testing/buildbot/filters/android.emulator_m.chrome_public_test_apk.filter
+++ b/testing/buildbot/filters/android.emulator_m.chrome_public_test_apk.filter
@@ -101,3 +101,6 @@
 
 # crbug.com/1179792
 -org.chromium.chrome.browser.customtabs.content.TabObserverRegistrarTest.testObserveActiveTab
+
+# crbug.com/1180466
+-org.chromium.chrome.browser.autofill_assistant.AutofillAssistantOverlayIntegrationTest.testShowCastOnIFrameElement
diff --git a/testing/buildbot/filters/ozone-linux.interactive_ui_tests_wayland.filter b/testing/buildbot/filters/ozone-linux.interactive_ui_tests_wayland.filter
index 6d2dc1f3..fda6acb 100644
--- a/testing/buildbot/filters/ozone-linux.interactive_ui_tests_wayland.filter
+++ b/testing/buildbot/filters/ozone-linux.interactive_ui_tests_wayland.filter
@@ -60,3 +60,8 @@
 -WidgetInputMethodInteractiveTest.Activation
 -WidgetInputMethodInteractiveTest.OneWindow
 -WidgetInputMethodInteractiveTest.TwoWindows
+
+# Extremely flaky.
+-MenuItemViewTestInsert20.InsertItem20
+-MenuItemViewTestInsert00.InsertItem00
+-BookmarkBarViewTest18.BookmarkBarViewTest18_SiblingMenu
diff --git a/testing/buildbot/variants.pyl b/testing/buildbot/variants.pyl
index f4abfb2..ef31572 100644
--- a/testing/buildbot/variants.pyl
+++ b/testing/buildbot/variants.pyl
@@ -311,13 +311,13 @@
       '../../weblayer/browser/android/javatests/skew/expectations.txt',
       '--impl-version=90',
     ],
-    'identifier': 'Implementation Library Skew Tests For 90.0.4430.45',
+    'identifier': 'Implementation Library Skew Tests For 90.0.4430.46',
     'swarming': {
       'cipd_packages': [
         {
           'cipd_package': 'chromium/testing/weblayer-x86',
           'location': 'weblayer_instrumentation_test_M90',
-          'revision': 'version:90.0.4430.45',
+          'revision': 'version:90.0.4430.46',
         }
       ],
     },
@@ -335,13 +335,13 @@
       '../../weblayer/browser/android/javatests/skew/expectations.txt',
       '--impl-version=89',
     ],
-    'identifier': 'Implementation Library Skew Tests For 89.0.4389.112',
+    'identifier': 'Implementation Library Skew Tests For 89.0.4389.113',
     'swarming': {
       'cipd_packages': [
         {
           'cipd_package': 'chromium/testing/weblayer-x86',
           'location': 'weblayer_instrumentation_test_M89',
-          'revision': 'version:89.0.4389.112',
+          'revision': 'version:89.0.4389.113',
         }
       ],
     },
@@ -383,13 +383,13 @@
       '../../weblayer/browser/android/javatests/skew/expectations.txt',
       '--impl-version=90',
     ],
-    'identifier': 'Implementation Library Skew Tests For 90.0.4430.45',
+    'identifier': 'Implementation Library Skew Tests For 90.0.4430.46',
     'swarming': {
       'cipd_packages': [
         {
           'cipd_package': 'chromium/testing/weblayer-x86',
           'location': 'weblayer_instrumentation_test_M90',
-          'revision': 'version:90.0.4430.45',
+          'revision': 'version:90.0.4430.46',
         }
       ],
     },
@@ -407,13 +407,13 @@
       '../../weblayer/browser/android/javatests/skew/expectations.txt',
       '--impl-version=89',
     ],
-    'identifier': 'Implementation Library Skew Tests For 89.0.4389.112',
+    'identifier': 'Implementation Library Skew Tests For 89.0.4389.113',
     'swarming': {
       'cipd_packages': [
         {
           'cipd_package': 'chromium/testing/weblayer-x86',
           'location': 'weblayer_instrumentation_test_M89',
-          'revision': 'version:89.0.4389.112',
+          'revision': 'version:89.0.4389.113',
         }
       ],
     },
@@ -455,13 +455,13 @@
       '../../weblayer/browser/android/javatests/skew/expectations.txt',
       '--client-version=90',
     ],
-    'identifier': 'Client Library Skew Tests For 90.0.4430.45',
+    'identifier': 'Client Library Skew Tests For 90.0.4430.46',
     'swarming': {
       'cipd_packages': [
         {
           'cipd_package': 'chromium/testing/weblayer-x86',
           'location': 'weblayer_instrumentation_test_M90',
-          'revision': 'version:90.0.4430.45',
+          'revision': 'version:90.0.4430.46',
         }
       ],
     },
@@ -479,13 +479,13 @@
       '../../weblayer/browser/android/javatests/skew/expectations.txt',
       '--client-version=89',
     ],
-    'identifier': 'Client Library Skew Tests For 89.0.4389.112',
+    'identifier': 'Client Library Skew Tests For 89.0.4389.113',
     'swarming': {
       'cipd_packages': [
         {
           'cipd_package': 'chromium/testing/weblayer-x86',
           'location': 'weblayer_instrumentation_test_M89',
-          'revision': 'version:89.0.4389.112',
+          'revision': 'version:89.0.4389.113',
         }
       ],
     },
diff --git a/third_party/blink/public/common/navigation/navigation_policy.h b/third_party/blink/public/common/navigation/navigation_policy.h
index 7fd9b4b..923f035 100644
--- a/third_party/blink/public/common/navigation/navigation_policy.h
+++ b/third_party/blink/public/common/navigation/navigation_policy.h
@@ -96,7 +96,7 @@
   // a download, the download should be dropped.
   NavigationDownloadTypes disallowed_types;
 
-  bool blocking_downloads_in_sandbox_enabled;
+  bool blocking_downloads_in_sandbox_enabled = false;
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/bindings/scripts/bind_gen/typedef.py b/third_party/blink/renderer/bindings/scripts/bind_gen/typedef.py
index e182c9b85..73180ad8 100644
--- a/third_party/blink/renderer/bindings/scripts/bind_gen/typedef.py
+++ b/third_party/blink/renderer/bindings/scripts/bind_gen/typedef.py
@@ -22,16 +22,20 @@
 from .task_queue import TaskQueue
 
 
-def _make_typedefs_to_unions(typedefs):
+def _make_typedefs_to_unions(typedefs, component_selector):
     assert isinstance(typedefs, (list, tuple))
     assert all(isinstance(typedef, web_idl.Typedef) for typedef in typedefs)
+    assert callable(component_selector)
 
     new_and_old_names = list(
         map(
             lambda typedef: (blink_class_name(typedef),
                              blink_class_name(typedef.idl_type.
                                               new_union_definition_object)),
-            filter(lambda typedef: typedef.idl_type.is_union, typedefs)))
+            filter(
+                lambda typedef: component_selector(
+                    [typedef, typedef.idl_type.union_definition_object]),
+                filter(lambda typedef: typedef.idl_type.is_union, typedefs))))
     node = ListNode([
         TextNode("using {} = {};".format(new_name, old_name))
         for new_name, old_name in new_and_old_names
@@ -42,21 +46,23 @@
     return node
 
 
-def make_typedefs(typedefs):
+def make_typedefs(typedefs, component_selector):
     assert isinstance(typedefs, (list, tuple))
     assert all(isinstance(typedef, web_idl.Typedef) for typedef in typedefs)
+    assert callable(component_selector)
 
     return ListNode([
         TextNode("// Typedefs to IDL unions"),
-        _make_typedefs_to_unions(typedefs),
+        _make_typedefs_to_unions(typedefs, component_selector),
     ])
 
 
-def _make_unions_of_typedefed_member_types(unions):
+def _make_unions_of_typedefed_member_types(unions, component_selector):
     assert isinstance(unions, (list, tuple))
     assert all(isinstance(union, web_idl.NewUnion) for union in unions)
+    assert callable(component_selector)
 
-    def union_name_of_typedefed_members(idl_type):
+    def union_name_of_typedefed_members(idl_type, union):
         for member_type in idl_type.member_types:
             if member_type.unwrap(nullable=True).is_typedef:
                 break
@@ -64,13 +70,17 @@
             return None
 
         pieces = []
+        def_objs = [union]
         for member_type in idl_type.member_types:
             body_type = member_type.unwrap(nullable=True)
             if body_type.is_typedef:
                 pieces.append(body_type.typedef_object.identifier)
+                def_objs.append(body_type.typedef_object)
             else:
                 pieces.append(
                     body_type.type_name_with_extended_attribute_key_values)
+        if not component_selector(def_objs):
+            return None
         pieces = sorted(pieces)
         if idl_type.does_include_nullable_type:
             pieces.append("Null")
@@ -84,24 +94,29 @@
             continue
         new_names = sorted(
             set(
-                filter(None,
-                       map(union_name_of_typedefed_members, union.idl_types))))
+                filter(
+                    None,
+                    map(
+                        lambda idl_type: union_name_of_typedefed_members(
+                            idl_type, union), union.idl_types))))
         old_name = blink_class_name(union)
         for new_name in new_names:
             node.append(TextNode("using {} = {};".format(new_name, old_name)))
-        fwd_decl_names.append(old_name)
+        if new_names:
+            fwd_decl_names.append(old_name)
     node.accumulate(CodeGenAccumulator.require_class_decls(fwd_decl_names))
 
     return node
 
 
-def make_unions(unions):
+def make_unions(unions, component_selector):
     assert isinstance(unions, (list, tuple))
     assert all(isinstance(union, web_idl.NewUnion) for union in unions)
+    assert callable(component_selector)
 
     return ListNode([
         TextNode("// Unions including typedef'ed member types"),
-        _make_unions_of_typedefed_member_types(unions),
+        _make_unions_of_typedefed_member_types(unions, component_selector),
     ])
 
 
@@ -153,29 +168,25 @@
             EmptyNode(),
         ])
 
-    # Typedefs
+    # Implementation parts
+    component_selectors = {
+        c1: lambda xs: all(c2 not in x.components for x in xs),
+        c2: lambda xs: any(c2 in x.components for x in xs),
+    }
+
     all_typedefs = sorted(web_idl_database.typedefs,
                           key=lambda x: x.identifier)
-    typedefs = {
-        c1: list(filter(lambda x: c2 not in x.components, all_typedefs)),
-        c2: list(filter(lambda x: c2 in x.components, all_typedefs)),
-    }
     for component in components:
         header_blink_ns[component].body.extend([
-            make_typedefs(typedefs[component]),
+            make_typedefs(all_typedefs, component_selectors[component]),
             EmptyNode(),
         ])
 
-    # Unions
     all_unions = sorted(web_idl_database.new_union_types,
                         key=lambda x: x.identifier)
-    unions = {
-        c1: list(filter(lambda x: c2 not in x.components, all_unions)),
-        c2: list(filter(lambda x: c2 in x.components, all_unions)),
-    }
     for component in components:
         header_blink_ns[component].body.extend([
-            make_unions(unions[component]),
+            make_unions(all_unions, component_selectors[component]),
             EmptyNode(),
         ])
 
diff --git a/third_party/blink/renderer/core/dom/context_features.h b/third_party/blink/renderer/core/dom/context_features.h
index a27c27c7..62205e3 100644
--- a/third_party/blink/renderer/core/dom/context_features.h
+++ b/third_party/blink/renderer/core/dom/context_features.h
@@ -55,7 +55,7 @@
   static bool MutationEventsEnabled(Document*);
 
   explicit ContextFeatures(std::unique_ptr<ContextFeaturesClient> client)
-      : client_(std::move(client)) {}
+      : Supplement(nullptr), client_(std::move(client)) {}
 
   bool IsEnabled(Document*, FeatureType, bool) const;
   void UrlDidChange(Document*);
diff --git a/third_party/blink/renderer/core/execution_context/execution_context.cc b/third_party/blink/renderer/core/execution_context/execution_context.cc
index bdbb0b3..8df4eb6 100644
--- a/third_party/blink/renderer/core/execution_context/execution_context.cc
+++ b/third_party/blink/renderer/core/execution_context/execution_context.cc
@@ -506,7 +506,7 @@
   visitor->Trace(timers_);
   visitor->Trace(origin_trial_context_);
   visitor->Trace(content_security_policy_);
-  ContextLifecycleNotifier::Trace(visitor);
+  MojoBindingContext::Trace(visitor);
   ConsoleLogger::Trace(visitor);
   Supplementable<ExecutionContext>::Trace(visitor);
 }
diff --git a/third_party/blink/renderer/core/fetch/global_fetch.cc b/third_party/blink/renderer/core/fetch/global_fetch.cc
index a615953..27cf9c4d 100644
--- a/third_party/blink/renderer/core/fetch/global_fetch.cc
+++ b/third_party/blink/renderer/core/fetch/global_fetch.cc
@@ -52,7 +52,8 @@
   }
 
   explicit GlobalFetchImpl(ExecutionContext* execution_context)
-      : fetch_manager_(MakeGarbageCollected<FetchManager>(execution_context)) {}
+      : Supplement<T>(nullptr),
+        fetch_manager_(MakeGarbageCollected<FetchManager>(execution_context)) {}
 
   ScriptPromise Fetch(ScriptState* script_state,
                       const RequestInfo& input,
diff --git a/third_party/blink/renderer/core/frame/navigator_user_activation.cc b/third_party/blink/renderer/core/frame/navigator_user_activation.cc
index 16ca16fe..b2e07a8 100644
--- a/third_party/blink/renderer/core/frame/navigator_user_activation.cc
+++ b/third_party/blink/renderer/core/frame/navigator_user_activation.cc
@@ -35,7 +35,8 @@
   Supplement<Navigator>::Trace(visitor);
 }
 
-NavigatorUserActivation::NavigatorUserActivation(Navigator& navigator) {
+NavigatorUserActivation::NavigatorUserActivation(Navigator& navigator)
+    : Supplement(navigator) {
   user_activation_ =
       MakeGarbageCollected<UserActivation>(navigator.DomWindow());
 }
diff --git a/third_party/blink/renderer/core/layout/build.gni b/third_party/blink/renderer/core/layout/build.gni
index 3f21a28..c053174 100644
--- a/third_party/blink/renderer/core/layout/build.gni
+++ b/third_party/blink/renderer/core/layout/build.gni
@@ -534,6 +534,8 @@
   "ng/ng_unpositioned_float.h",
   "ng/svg/layout_ng_svg_text.cc",
   "ng/svg/layout_ng_svg_text.h",
+  "ng/svg/ng_svg_text_layout_algorithm.cc",
+  "ng/svg/ng_svg_text_layout_algorithm.h",
   "ng/table/interface_casting.h",
   "ng/table/layout_ng_table.cc",
   "ng/table/layout_ng_table.h",
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_items_builder.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_items_builder.cc
index 38d9dea..7817117c 100644
--- a/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_items_builder.cc
+++ b/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_items_builder.cc
@@ -9,6 +9,7 @@
 #include "third_party/blink/renderer/core/layout/ng/inline/ng_inline_cursor.h"
 #include "third_party/blink/renderer/core/layout/ng/ng_box_fragment_builder.h"
 #include "third_party/blink/renderer/core/layout/ng/ng_physical_box_fragment.h"
+#include "third_party/blink/renderer/core/layout/ng/svg/ng_svg_text_layout_algorithm.h"
 
 namespace blink {
 
@@ -383,6 +384,8 @@
                                              void* data) {
   DCHECK(text_content_);
   ConvertToPhysical(outer_size);
+  if (node_.IsSVGText())
+    NGSVGTextLayoutAlgorithm(node_, GetWritingMode()).Layout(items_);
   new (data) NGFragmentItems(this);
 }
 
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_line_breaker.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_line_breaker.cc
index c570daa..dd8e2ec 100644
--- a/third_party/blink/renderer/core/layout/ng/inline/ng_line_breaker.cc
+++ b/third_party/blink/renderer/core/layout/ng/inline/ng_line_breaker.cc
@@ -140,6 +140,22 @@
   return inline_end_size;
 }
 
+// See NGLineBreaker::SplitTextByGlyphs().
+void CollectCharIndex(void* context,
+                      unsigned char_index,
+                      Glyph,
+                      FloatSize,
+                      float,
+                      bool,
+                      CanvasRotationInVertical,
+                      const SimpleFontData*) {
+  auto* index_list = static_cast<Vector<unsigned>*>(context);
+  wtf_size_t size = index_list->size();
+  if (size > 0 && index_list->at(size - 1) == char_index)
+    return;
+  index_list->push_back(char_index);
+}
+
 }  // namespace
 
 inline void NGLineBreaker::ClearNeedsLayout(const NGInlineItem& item) {
@@ -173,6 +189,7 @@
     : line_opportunity_(line_opportunity),
       node_(node),
       mode_(mode),
+      is_svg_text_(node.IsSVGText()),
       is_first_formatted_line_((!break_token || (!break_token->ItemIndex() &&
                                                  !break_token->TextOffset())) &&
                                node.CanContainFirstFormattedLine()),
@@ -410,7 +427,7 @@
   const NGInlineItemResults& item_results = line_info->Results();
   DCHECK(item_results.IsEmpty());
 
-  if (node_.IsSVGText())
+  if (is_svg_text_)
     line_info->MutableResults()->ReserveCapacity(text_content_.length());
 
   if (item_index_) {
@@ -640,7 +657,7 @@
          (item.Type() == NGInlineItem::kControl &&
           Text()[item.StartOffset()] == kTabulationCharacter));
   DCHECK(&shape_result);
-  DCHECK_EQ(auto_wrap_, item.Style()->AutoWrap());
+  DCHECK_EQ(auto_wrap_, !is_svg_text_ && item.Style()->AutoWrap());
 
   // If we're trailing, only trailing spaces can be included in this line.
   if (UNLIKELY(state_ == LineBreakState::kTrailing)) {
@@ -690,7 +707,7 @@
     position_ -= RemoveHyphen(line_info->MutableResults());
 
   NGInlineItemResult* item_result = nullptr;
-  if (!node_.IsSVGText()) {
+  if (!is_svg_text_) {
     item_result = AddItem(item, line_info);
     item_result->should_create_line_box = true;
   }
@@ -771,7 +788,7 @@
     return;
   }
 
-  if (node_.IsSVGText()) {
+  if (is_svg_text_) {
     SplitTextByGlyphs(item, line_info);
     return;
   }
@@ -811,15 +828,19 @@
 void NGLineBreaker::SplitTextByGlyphs(const NGInlineItem& item,
                                       NGLineInfo* line_info) {
   DCHECK(RuntimeEnabledFeatures::SVGTextNGEnabled());
-  DCHECK(node_.IsSVGText());
+  DCHECK(is_svg_text_);
   DCHECK_EQ(offset_, item.StartOffset());
 
   const ShapeResult& shape = *item.TextShapeResult();
-  shape.EnsurePositionData();
-  do {
-    unsigned glyph_end = (offset_ + 1 == shape.EndIndex())
-                             ? shape.EndIndex()
-                             : shape.CachedNextSafeToBreakOffset(offset_ + 1);
+  Vector<unsigned> index_list;
+  index_list.ReserveCapacity(shape.NumGlyphs());
+  shape.ForEachGlyph(0, CollectCharIndex, &index_list);
+  if (shape.IsRtl())
+    index_list.Reverse();
+  wtf_size_t size = index_list.size();
+  for (wtf_size_t i = 0; i < size; ++i) {
+    DCHECK_EQ(offset_, index_list[i]);
+    unsigned glyph_end = i + 1 < size ? index_list[i + 1] : shape.EndIndex();
     NGInlineItemResult* result = AddItem(item, glyph_end, line_info);
     result->should_create_line_box = true;
     auto shape_result_view =
@@ -829,7 +850,7 @@
     result->shape_result = std::move(shape_result_view);
     offset_ = glyph_end;
     position_ += result->inline_size;
-  } while (offset_ < shape.EndIndex());
+  }
   trailing_whitespace_ = WhitespaceState::kUnknown;
   MoveToNextOf(item);
 }
@@ -2344,7 +2365,7 @@
   if (&style == current_style_.get()) {
 #if DCHECK_IS_ON()
     // Check that cache fields are already setup correctly.
-    DCHECK_EQ(auto_wrap_, style.AutoWrap());
+    DCHECK_EQ(auto_wrap_, !is_svg_text_ && style.AutoWrap());
     if (auto_wrap_) {
       DCHECK_EQ(enable_soft_hyphen_, style.GetHyphens() != Hyphens::kNone);
       DCHECK_EQ(break_iterator_.Locale(), style.LocaleForLineBreakIterator());
@@ -2359,7 +2380,7 @@
   current_style_ = &style;
 
   //  TODO(crbug.com/366553): SVG <text> should not be auto_wrap_ for now.
-  auto_wrap_ = !node_.IsSVGText() && style.AutoWrap();
+  auto_wrap_ = !is_svg_text_ && style.AutoWrap();
 
   if (auto_wrap_) {
     LineBreakType line_break_type;
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_line_breaker.h b/third_party/blink/renderer/core/layout/ng/inline/ng_line_breaker.h
index fcf1e1f..cf59c79 100644
--- a/third_party/blink/renderer/core/layout/ng/inline/ng_line_breaker.h
+++ b/third_party/blink/renderer/core/layout/ng/inline/ng_line_breaker.h
@@ -235,6 +235,9 @@
 
   NGLineBreakerMode mode_;
 
+  // True if node_ is an SVG <text>.
+  const bool is_svg_text_;
+
   // True if this line is the "first formatted line".
   // https://www.w3.org/TR/CSS22/selector.html#first-formatted-line
   bool is_first_formatted_line_ = false;
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_line_breaker_test.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_line_breaker_test.cc
index 4017ed2..fd944fd6 100644
--- a/third_party/blink/renderer/core/layout/ng/inline/ng_line_breaker_test.cc
+++ b/third_party/blink/renderer/core/layout/ng/inline/ng_line_breaker_test.cc
@@ -15,6 +15,7 @@
 #include "third_party/blink/renderer/core/layout/ng/ng_positioned_float.h"
 #include "third_party/blink/renderer/core/layout/ng/ng_unpositioned_float.h"
 #include "third_party/blink/renderer/platform/fonts/shaping/shape_result_view.h"
+#include "third_party/blink/renderer/platform/testing/runtime_enabled_features_test_helpers.h"
 #include "third_party/blink/renderer/platform/wtf/text/string_builder.h"
 
 namespace blink {
@@ -704,6 +705,32 @@
   // This test passes if no CHECK failures.
 }
 
-#undef MAYBE_OverflowAtomicInline
+TEST_F(NGLineBreakerTest, SplitTextByGlyphs) {
+  RuntimeEnabledFeaturesTestHelpers::ScopedSVGTextNG svg_text_ng(true);
+  NGInlineNode node = CreateInlineNode(
+      uR"HTML(
+      <!DOCTYPE html>
+      <svg viewBox="0 0 800 600">
+      <text id="container" style="font-family:Times">AV)HTML"
+      u"\U0001F197\u05E2\u05B4\u05D1\u05E8\u05B4\u05D9\u05EA</text></svg>)");
+  BreakLines(
+      node, LayoutUnit::Max(),
+      [](const NGLineBreaker& line_breaker, const NGLineInfo& line_info) {
+        EXPECT_EQ(8u, line_info.Results().size());
+        // "A" and "V" with Times font are typically overlapped. They should
+        // be split.
+        EXPECT_EQ(1u, line_info.Results()[0].Length());  // A
+        EXPECT_EQ(1u, line_info.Results()[1].Length());  // V
+        // Non-BMP characters should not be split.
+        EXPECT_EQ(2u, line_info.Results()[2].Length());  // U+1F197
+        // Connected characters should not be split.
+        EXPECT_EQ(2u, line_info.Results()[3].Length());  // U+05E2 U+05B4
+        EXPECT_EQ(1u, line_info.Results()[4].Length());  // U+05D1
+        EXPECT_EQ(2u, line_info.Results()[5].Length());  // U+05E8 U+05B4
+        EXPECT_EQ(1u, line_info.Results()[6].Length());  // U+05D9
+        EXPECT_EQ(1u, line_info.Results()[7].Length());  // U+05EA
+      });
+}
+
 }  // namespace
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/layout/ng/ng_column_layout_algorithm.cc b/third_party/blink/renderer/core/layout/ng/ng_column_layout_algorithm.cc
index b310b6a..105e501 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_column_layout_algorithm.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_column_layout_algorithm.cc
@@ -841,6 +841,7 @@
     container_builder_.SetBaseline(block_offset + *baseline);
 }
 
+// Distribute as many implicit breaks into the content runs as we need.
 LayoutUnit NGColumnLayoutAlgorithm::CalculateBalancedColumnBlockSize(
     const LogicalSize& column_size,
     const NGBlockBreakToken* child_break_token) {
@@ -886,28 +887,47 @@
     int implicit_breaks_assumed_count = 0;
   };
 
-  class ContentRuns : public Vector<ContentRun, 1> {
+  class ContentRuns final {
    public:
-    wtf_size_t IndexWithTallestColumns() const {
-      DCHECK_GT(size(), 0u);
-      wtf_size_t index = 0;
-      LayoutUnit largest_block_size = LayoutUnit::Min();
-      for (size_t i = 0; i < size(); i++) {
-        const ContentRun& run = at(i);
-        LayoutUnit block_size = run.ColumnBlockSize();
-        if (largest_block_size < block_size) {
-          largest_block_size = block_size;
-          index = i;
-        }
-      }
-      return index;
-    }
-
     // When we have "inserted" (assumed) enough implicit column breaks, this
     // method returns the block-size of the tallest column.
     LayoutUnit TallestColumnBlockSize() const {
-      return at(IndexWithTallestColumns()).ColumnBlockSize();
+      return TallestRun()->ColumnBlockSize();
     }
+
+    LayoutUnit TallestContentBlockSize() const {
+      return tallest_content_block_size_;
+    }
+
+    void AddRun(LayoutUnit content_block_size) {
+      runs_.emplace_back(content_block_size);
+      tallest_content_block_size_ =
+          std::max(tallest_content_block_size_, content_block_size);
+    }
+
+    void DistributeImplicitBreaks(int used_column_count) {
+      for (int columns_found = runs_.size(); columns_found < used_column_count;
+           ++columns_found) {
+        // The tallest content run (with all assumed implicit breaks added so
+        // far taken into account) is where we assume the next implicit break.
+        ++TallestRun()->implicit_breaks_assumed_count;
+      }
+    }
+
+   private:
+    ContentRun* TallestRun() const {
+      DCHECK(!runs_.IsEmpty());
+      auto* const it = std::max_element(
+          runs_.begin(), runs_.end(),
+          [](const ContentRun& run1, const ContentRun& run2) {
+            return run1.ColumnBlockSize() < run2.ColumnBlockSize();
+          });
+      DCHECK(it != runs_.end());
+      return const_cast<ContentRun*>(it);
+    }
+
+    Vector<ContentRun, 1> runs_;
+    LayoutUnit tallest_content_block_size_;
   };
 
   // First split into content runs at explicit (forced) breaks.
@@ -947,7 +967,7 @@
                                 fragment);
     column_block_size =
         std::max(column_block_size, logical_fragment.BlockSize());
-    content_runs.emplace_back(column_block_size);
+    content_runs.AddRun(column_block_size);
 
     tallest_unbreakable_block_size_ = std::max(
         tallest_unbreakable_block_size_, result->TallestUnbreakableBlockSize());
@@ -959,17 +979,6 @@
     break_token = To<NGBlockBreakToken>(fragment.BreakToken());
   } while (break_token);
 
-  // Then distribute as many implicit breaks into the content runs as we need.
-  int used_column_count =
-      ResolveUsedColumnCount(ChildAvailableSize().inline_size, Style());
-  for (int columns_found = content_runs.size();
-       columns_found < used_column_count; columns_found++) {
-    // The tallest content run (with all assumed implicit breaks added so far
-    // taken into account) is where we assume the next implicit break.
-    wtf_size_t index = content_runs.IndexWithTallestColumns();
-    content_runs[index].implicit_breaks_assumed_count++;
-  }
-
   if (ConstraintSpace().IsInitialColumnBalancingPass()) {
     // Nested column balancing. Our outer fragmentation context is in its
     // initial balancing pass, so it also wants to know the largest unbreakable
@@ -987,6 +996,11 @@
   // stretch and retry if not). Also honor {,min-,max-}block-size properties
   // before returning, and also try to not become shorter than the tallest piece
   // of unbreakable content.
+  if (tallest_unbreakable_block_size_ >= content_runs.TallestContentBlockSize())
+    return ConstrainColumnBlockSize(tallest_unbreakable_block_size_);
+
+  content_runs.DistributeImplicitBreaks(
+      ResolveUsedColumnCount(ChildAvailableSize().inline_size, Style()));
   return ConstrainColumnBlockSize(content_runs.TallestColumnBlockSize());
 }
 
diff --git a/third_party/blink/renderer/core/layout/ng/svg/ng_svg_text_layout_algorithm.cc b/third_party/blink/renderer/core/layout/ng/svg/ng_svg_text_layout_algorithm.cc
new file mode 100644
index 0000000..e63adeae
--- /dev/null
+++ b/third_party/blink/renderer/core/layout/ng/svg/ng_svg_text_layout_algorithm.cc
@@ -0,0 +1,49 @@
+// Copyright 2021 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 "third_party/blink/renderer/core/layout/ng/svg/ng_svg_text_layout_algorithm.h"
+
+namespace blink {
+
+// See https://svgwg.org/svg2-draft/text.html#TextLayoutAlgorithm
+
+NGSVGTextLayoutAlgorithm::NGSVGTextLayoutAlgorithm(NGInlineNode node,
+                                                   WritingMode writing_mode)
+    : inline_node_(node),
+      // 1.5. Let "horizontal" be a flag, true if the writing mode of ‘text’
+      // is horizontal, false otherwise.
+      horizontal_(IsHorizontalWritingMode(writing_mode)) {
+  DCHECK(node.IsSVGText());
+}
+
+void NGSVGTextLayoutAlgorithm::Layout(
+    NGFragmentItemsBuilder::ItemWithOffsetList& items) {
+  // https://svgwg.org/svg2-draft/text.html#TextLayoutAlgorithm
+  // 1. Setup
+  if (!Setup())
+    return;
+
+  // TODO(crbug.com/1179585): Implement the following steps.
+}
+
+bool NGSVGTextLayoutAlgorithm::Setup() {
+  // 1.2. Let count be the number of DOM characters within the ‘text’ element's
+  // subtree.
+  count_ = inline_node_.GetDOMNode()->textContent().length();
+
+  // 1.3. Let result be an array of length count whose entries contain the
+  // per-character information described above.
+  // ... If result is empty, then return result.
+  if (count_ == 0)
+    return false;
+  result_.resize(count_);
+
+  // 1.4. Let CSS_positions be an array of length count whose entries will be
+  // filled with the x and y positions of the corresponding typographic
+  // character in root. The array entries are initialized to (0, 0).
+  css_positions_.resize(count_);
+  return true;
+}
+
+}  // namespace blink
diff --git a/third_party/blink/renderer/core/layout/ng/svg/ng_svg_text_layout_algorithm.h b/third_party/blink/renderer/core/layout/ng/svg/ng_svg_text_layout_algorithm.h
new file mode 100644
index 0000000..37c7ab0
--- /dev/null
+++ b/third_party/blink/renderer/core/layout/ng/svg/ng_svg_text_layout_algorithm.h
@@ -0,0 +1,53 @@
+// Copyright 2021 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 THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_NG_SVG_NG_SVG_TEXT_LAYOUT_ALGORITHM_H_
+#define THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_NG_SVG_NG_SVG_TEXT_LAYOUT_ALGORITHM_H_
+
+#include "third_party/blink/renderer/core/layout/ng/inline/ng_fragment_items_builder.h"
+
+namespace blink {
+
+class NGSVGTextLayoutAlgorithm {
+  STACK_ALLOCATED();
+
+ public:
+  NGSVGTextLayoutAlgorithm(NGInlineNode node, WritingMode writing_mode);
+
+  // Apply SVG specific text layout algorithm to |items|.
+  // Text items in |items| will be converted to kSVGText type.
+  void Layout(NGFragmentItemsBuilder::ItemWithOffsetList& items);
+
+ private:
+  // Returns false if we should skip the following steps.
+  bool Setup();
+
+  NGInlineNode inline_node_;
+
+  // "count" defined in the specification.
+  wtf_size_t count_;
+
+  // "horizontal" flag defined in the specification.
+  bool horizontal_;
+
+  // "result" defined in the specification
+  struct NGSVGPerCharacterInfo {
+    base::Optional<float> x;
+    base::Optional<float> y;
+    base::Optional<float> rotate;
+    bool hidden = false;
+    bool addressable = true;
+    bool middle = false;
+    bool anchor_chunk = false;
+    wtf_size_t item_index = WTF::kNotFound;
+  };
+  Vector<NGSVGPerCharacterInfo> result_;
+
+  // "CSS_positions" defined in the specification.
+  Vector<FloatPoint> css_positions_;
+};
+
+}  // namespace blink
+
+#endif  // THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_NG_SVG_NG_SVG_TEXT_LAYOUT_ALGORITHM_H_
diff --git a/third_party/blink/renderer/core/page/page_popup_controller.cc b/third_party/blink/renderer/core/page/page_popup_controller.cc
index e6bba2c..c336495 100644
--- a/third_party/blink/renderer/core/page/page_popup_controller.cc
+++ b/third_party/blink/renderer/core/page/page_popup_controller.cc
@@ -49,7 +49,7 @@
 PagePopupController::PagePopupController(Page& page,
                                          PagePopup& popup,
                                          PagePopupClient* client)
-    : popup_(popup), popup_client_(client) {
+    : Supplement(page), popup_(popup), popup_client_(client) {
   DCHECK(client);
   ProvideTo(page, this);
 }
diff --git a/third_party/blink/renderer/core/resize_observer/resize_observer_controller.cc b/third_party/blink/renderer/core/resize_observer/resize_observer_controller.cc
index 16683c8..f0b3b3ac 100644
--- a/third_party/blink/renderer/core/resize_observer/resize_observer_controller.cc
+++ b/third_party/blink/renderer/core/resize_observer/resize_observer_controller.cc
@@ -27,7 +27,7 @@
   return Supplement<LocalDOMWindow>::From<ResizeObserverController>(window);
 }
 
-ResizeObserverController::ResizeObserverController() = default;
+ResizeObserverController::ResizeObserverController() : Supplement(nullptr) {}
 
 void ResizeObserverController::AddObserver(ResizeObserver& observer) {
   observers_.insert(&observer);
diff --git a/third_party/blink/renderer/core/workers/shared_worker_client_holder.cc b/third_party/blink/renderer/core/workers/shared_worker_client_holder.cc
index 11103cb..cc48fa5 100644
--- a/third_party/blink/renderer/core/workers/shared_worker_client_holder.cc
+++ b/third_party/blink/renderer/core/workers/shared_worker_client_holder.cc
@@ -73,7 +73,8 @@
 }
 
 SharedWorkerClientHolder::SharedWorkerClientHolder(LocalDOMWindow& window)
-    : connector_(&window),
+    : Supplement(window),
+      connector_(&window),
       client_receivers_(&window),
       task_runner_(window.GetTaskRunner(blink::TaskType::kDOMManipulation)) {
   DCHECK(IsMainThread());
diff --git a/third_party/blink/renderer/modules/animationworklet/animation_worklet_proxy_client.cc b/third_party/blink/renderer/modules/animationworklet/animation_worklet_proxy_client.cc
index e7b4ff74..2968ab0 100644
--- a/third_party/blink/renderer/modules/animationworklet/animation_worklet_proxy_client.cc
+++ b/third_party/blink/renderer/modules/animationworklet/animation_worklet_proxy_client.cc
@@ -41,7 +41,8 @@
     base::WeakPtr<AnimationWorkletMutatorDispatcherImpl>
         main_thread_mutator_dispatcher,
     scoped_refptr<base::SingleThreadTaskRunner> main_thread_mutator_runner)
-    : worklet_id_(worklet_id),
+    : Supplement(nullptr),
+      worklet_id_(worklet_id),
       state_(RunState::kUninitialized),
       next_global_scope_switch_countdown_(0),
       current_global_scope_index_(0) {
diff --git a/third_party/blink/renderer/modules/animationworklet/css_animation_worklet.cc b/third_party/blink/renderer/modules/animationworklet/css_animation_worklet.cc
index e0a7b0c8..067f8d6 100644
--- a/third_party/blink/renderer/modules/animationworklet/css_animation_worklet.cc
+++ b/third_party/blink/renderer/modules/animationworklet/css_animation_worklet.cc
@@ -51,7 +51,8 @@
 }
 
 CSSAnimationWorklet::CSSAnimationWorklet(LocalDOMWindow& window)
-    : ExecutionContextLifecycleObserver(&window),
+    : Supplement(window),
+      ExecutionContextLifecycleObserver(&window),
       animation_worklet_(MakeGarbageCollected<AnimationWorklet>(window)) {
   DCHECK(GetExecutionContext());
 }
diff --git a/third_party/blink/renderer/modules/background_fetch/service_worker_registration_background_fetch.cc b/third_party/blink/renderer/modules/background_fetch/service_worker_registration_background_fetch.cc
index 66c4f62..41b3734 100644
--- a/third_party/blink/renderer/modules/background_fetch/service_worker_registration_background_fetch.cc
+++ b/third_party/blink/renderer/modules/background_fetch/service_worker_registration_background_fetch.cc
@@ -12,7 +12,7 @@
 ServiceWorkerRegistrationBackgroundFetch::
     ServiceWorkerRegistrationBackgroundFetch(
         ServiceWorkerRegistration* registration)
-    : registration_(registration) {}
+    : Supplement(*registration) {}
 
 ServiceWorkerRegistrationBackgroundFetch::
     ~ServiceWorkerRegistrationBackgroundFetch() = default;
@@ -47,14 +47,13 @@
 ServiceWorkerRegistrationBackgroundFetch::backgroundFetch() {
   if (!background_fetch_manager_) {
     background_fetch_manager_ =
-        MakeGarbageCollected<BackgroundFetchManager>(registration_);
+        MakeGarbageCollected<BackgroundFetchManager>(GetSupplementable());
   }
 
   return background_fetch_manager_.Get();
 }
 
 void ServiceWorkerRegistrationBackgroundFetch::Trace(Visitor* visitor) const {
-  visitor->Trace(registration_);
   visitor->Trace(background_fetch_manager_);
   Supplement<ServiceWorkerRegistration>::Trace(visitor);
 }
diff --git a/third_party/blink/renderer/modules/background_fetch/service_worker_registration_background_fetch.h b/third_party/blink/renderer/modules/background_fetch/service_worker_registration_background_fetch.h
index 66ee7fd..371f0cd 100644
--- a/third_party/blink/renderer/modules/background_fetch/service_worker_registration_background_fetch.h
+++ b/third_party/blink/renderer/modules/background_fetch/service_worker_registration_background_fetch.h
@@ -35,7 +35,6 @@
   void Trace(Visitor* visitor) const override;
 
  private:
-  Member<ServiceWorkerRegistration> registration_;
   Member<BackgroundFetchManager> background_fetch_manager_;
 
   DISALLOW_COPY_AND_ASSIGN(ServiceWorkerRegistrationBackgroundFetch);
diff --git a/third_party/blink/renderer/modules/background_sync/service_worker_registration_sync.cc b/third_party/blink/renderer/modules/background_sync/service_worker_registration_sync.cc
index 0e3ead92..dbcd1c8 100644
--- a/third_party/blink/renderer/modules/background_sync/service_worker_registration_sync.cc
+++ b/third_party/blink/renderer/modules/background_sync/service_worker_registration_sync.cc
@@ -13,7 +13,7 @@
 
 ServiceWorkerRegistrationSync::ServiceWorkerRegistrationSync(
     ServiceWorkerRegistration* registration)
-    : registration_(registration) {}
+    : Supplement(*registration) {}
 
 ServiceWorkerRegistrationSync::~ServiceWorkerRegistrationSync() = default;
 
@@ -40,10 +40,11 @@
 
 SyncManager* ServiceWorkerRegistrationSync::sync() {
   if (!sync_manager_) {
-    ExecutionContext* execution_context = registration_->GetExecutionContext();
+    ExecutionContext* execution_context =
+        GetSupplementable()->GetExecutionContext();
     // TODO(falken): Consider defining a task source in the spec for this event.
     sync_manager_ = MakeGarbageCollected<SyncManager>(
-        registration_,
+        GetSupplementable(),
         execution_context->GetTaskRunner(TaskType::kMiscPlatformAPI));
   }
   return sync_manager_.Get();
@@ -56,17 +57,17 @@
 
 PeriodicSyncManager* ServiceWorkerRegistrationSync::periodicSync() {
   if (!periodic_sync_manager_) {
-    ExecutionContext* execution_context = registration_->GetExecutionContext();
+    ExecutionContext* execution_context =
+        GetSupplementable()->GetExecutionContext();
     // TODO(falken): Consider defining a task source in the spec for this event.
     periodic_sync_manager_ = MakeGarbageCollected<PeriodicSyncManager>(
-        registration_,
+        GetSupplementable(),
         execution_context->GetTaskRunner(TaskType::kMiscPlatformAPI));
   }
   return periodic_sync_manager_.Get();
 }
 
 void ServiceWorkerRegistrationSync::Trace(Visitor* visitor) const {
-  visitor->Trace(registration_);
   visitor->Trace(sync_manager_);
   visitor->Trace(periodic_sync_manager_);
   Supplement<ServiceWorkerRegistration>::Trace(visitor);
diff --git a/third_party/blink/renderer/modules/background_sync/service_worker_registration_sync.h b/third_party/blink/renderer/modules/background_sync/service_worker_registration_sync.h
index d360b72..56b652f 100644
--- a/third_party/blink/renderer/modules/background_sync/service_worker_registration_sync.h
+++ b/third_party/blink/renderer/modules/background_sync/service_worker_registration_sync.h
@@ -39,7 +39,6 @@
   void Trace(Visitor*) const override;
 
  private:
-  Member<ServiceWorkerRegistration> registration_;
   Member<SyncManager> sync_manager_;
   Member<PeriodicSyncManager> periodic_sync_manager_;
 
diff --git a/third_party/blink/renderer/modules/badging/navigator_badge.cc b/third_party/blink/renderer/modules/badging/navigator_badge.cc
index 78fdac27..3c2031f 100644
--- a/third_party/blink/renderer/modules/badging/navigator_badge.cc
+++ b/third_party/blink/renderer/modules/badging/navigator_badge.cc
@@ -28,7 +28,8 @@
   return *supplement;
 }
 
-NavigatorBadge::NavigatorBadge(ExecutionContext* context) : context_(context) {}
+NavigatorBadge::NavigatorBadge(ExecutionContext* context)
+    : Supplement(*context) {}
 
 // static
 ScriptPromise NavigatorBadge::setAppBadge(ScriptState* script_state,
@@ -72,8 +73,6 @@
 
 void NavigatorBadge::Trace(Visitor* visitor) const {
   Supplement<ExecutionContext>::Trace(visitor);
-
-  visitor->Trace(context_);
 }
 
 // static
@@ -99,7 +98,7 @@
 
 mojo::Remote<mojom::blink::BadgeService> NavigatorBadge::badge_service() {
   mojo::Remote<mojom::blink::BadgeService> badge_service;
-  context_->GetBrowserInterfaceBroker().GetInterface(
+  GetSupplementable()->GetBrowserInterfaceBroker().GetInterface(
       badge_service.BindNewPipeAndPassReceiver());
   DCHECK(badge_service);
 
diff --git a/third_party/blink/renderer/modules/badging/navigator_badge.h b/third_party/blink/renderer/modules/badging/navigator_badge.h
index c64a339..b35fe018 100644
--- a/third_party/blink/renderer/modules/badging/navigator_badge.h
+++ b/third_party/blink/renderer/modules/badging/navigator_badge.h
@@ -45,8 +45,6 @@
   static ScriptPromise ClearAppBadgeHelper(ScriptState* script_state);
 
   mojo::Remote<mojom::blink::BadgeService> badge_service();
-
-  Member<ExecutionContext> context_;
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/cache_storage/global_cache_storage.cc b/third_party/blink/renderer/modules/cache_storage/global_cache_storage.cc
index 1be24482..8d60f27 100644
--- a/third_party/blink/renderer/modules/cache_storage/global_cache_storage.cc
+++ b/third_party/blink/renderer/modules/cache_storage/global_cache_storage.cc
@@ -35,8 +35,8 @@
     return *supplement;
   }
 
-  GlobalCacheStorageImpl() = default;
-  ~GlobalCacheStorageImpl() {}
+  GlobalCacheStorageImpl() : Supplement<T>(nullptr) {}
+  ~GlobalCacheStorageImpl() = default;
 
   CacheStorage* Caches(T& fetching_scope, ExceptionState& exception_state) {
     ExecutionContext* context = fetching_scope.GetExecutionContext();
diff --git a/third_party/blink/renderer/modules/canvas/imagebitmap/image_bitmap_factories.cc b/third_party/blink/renderer/modules/canvas/imagebitmap/image_bitmap_factories.cc
index d111834..289c1d3 100644
--- a/third_party/blink/renderer/modules/canvas/imagebitmap/image_bitmap_factories.cc
+++ b/third_party/blink/renderer/modules/canvas/imagebitmap/image_bitmap_factories.cc
@@ -224,6 +224,8 @@
   return *supplement;
 }
 
+ImageBitmapFactories::ImageBitmapFactories() : Supplement(nullptr) {}
+
 void ImageBitmapFactories::AddLoader(ImageBitmapLoader* loader) {
   pending_loaders_.insert(loader);
 }
diff --git a/third_party/blink/renderer/modules/canvas/imagebitmap/image_bitmap_factories.h b/third_party/blink/renderer/modules/canvas/imagebitmap/image_bitmap_factories.h
index 69f0ded..1bb5bdb 100644
--- a/third_party/blink/renderer/modules/canvas/imagebitmap/image_bitmap_factories.h
+++ b/third_party/blink/renderer/modules/canvas/imagebitmap/image_bitmap_factories.h
@@ -67,6 +67,8 @@
  public:
   static const char kSupplementName[];
 
+  ImageBitmapFactories();
+
   static ScriptPromise CreateImageBitmap(ScriptState*,
                                          const ImageBitmapSourceUnion&,
                                          const ImageBitmapOptions*,
diff --git a/third_party/blink/renderer/modules/content_index/service_worker_registration_content_index.cc b/third_party/blink/renderer/modules/content_index/service_worker_registration_content_index.cc
index e50bcfe..863d401a 100644
--- a/third_party/blink/renderer/modules/content_index/service_worker_registration_content_index.cc
+++ b/third_party/blink/renderer/modules/content_index/service_worker_registration_content_index.cc
@@ -10,7 +10,7 @@
 
 ServiceWorkerRegistrationContentIndex::ServiceWorkerRegistrationContentIndex(
     ServiceWorkerRegistration* registration)
-    : registration_(registration) {}
+    : Supplement(*registration) {}
 
 const char ServiceWorkerRegistrationContentIndex::kSupplementName[] =
     "ServiceWorkerRegistrationContentIndex";
@@ -38,10 +38,11 @@
 
 ContentIndex* ServiceWorkerRegistrationContentIndex::index() {
   if (!content_index_) {
-    ExecutionContext* execution_context = registration_->GetExecutionContext();
+    ExecutionContext* execution_context =
+        GetSupplementable()->GetExecutionContext();
     // TODO(falken): Consider defining a task source in the spec for this event.
     content_index_ = MakeGarbageCollected<ContentIndex>(
-        registration_,
+        GetSupplementable(),
         execution_context->GetTaskRunner(TaskType::kMiscPlatformAPI));
   }
 
@@ -49,7 +50,6 @@
 }
 
 void ServiceWorkerRegistrationContentIndex::Trace(Visitor* visitor) const {
-  visitor->Trace(registration_);
   visitor->Trace(content_index_);
   Supplement<ServiceWorkerRegistration>::Trace(visitor);
 }
diff --git a/third_party/blink/renderer/modules/content_index/service_worker_registration_content_index.h b/third_party/blink/renderer/modules/content_index/service_worker_registration_content_index.h
index 5e52953..8d56deb 100644
--- a/third_party/blink/renderer/modules/content_index/service_worker_registration_content_index.h
+++ b/third_party/blink/renderer/modules/content_index/service_worker_registration_content_index.h
@@ -33,7 +33,6 @@
   void Trace(Visitor* visitor) const override;
 
  private:
-  Member<ServiceWorkerRegistration> registration_;
   Member<ContentIndex> content_index_;
 
   DISALLOW_COPY_AND_ASSIGN(ServiceWorkerRegistrationContentIndex);
diff --git a/third_party/blink/renderer/modules/crypto/worker_global_scope_crypto.cc b/third_party/blink/renderer/modules/crypto/worker_global_scope_crypto.cc
index ed09931..8fda2ad 100644
--- a/third_party/blink/renderer/modules/crypto/worker_global_scope_crypto.cc
+++ b/third_party/blink/renderer/modules/crypto/worker_global_scope_crypto.cc
@@ -35,7 +35,7 @@
 
 namespace blink {
 
-WorkerGlobalScopeCrypto::WorkerGlobalScopeCrypto() = default;
+WorkerGlobalScopeCrypto::WorkerGlobalScopeCrypto() : Supplement(nullptr) {}
 
 const char WorkerGlobalScopeCrypto::kSupplementName[] =
     "WorkerGlobalScopeCrypto";
diff --git a/third_party/blink/renderer/modules/csspaint/paint_worklet_proxy_client.cc b/third_party/blink/renderer/modules/csspaint/paint_worklet_proxy_client.cc
index 0fba440..b742b961 100644
--- a/third_party/blink/renderer/modules/csspaint/paint_worklet_proxy_client.cc
+++ b/third_party/blink/renderer/modules/csspaint/paint_worklet_proxy_client.cc
@@ -53,7 +53,8 @@
     PaintWorklet* paint_worklet,
     base::WeakPtr<PaintWorkletPaintDispatcher> paint_dispatcher,
     scoped_refptr<base::SingleThreadTaskRunner> compositor_host_queue)
-    : paint_dispatcher_(std::move(paint_dispatcher)),
+    : Supplement(nullptr),
+      paint_dispatcher_(std::move(paint_dispatcher)),
       compositor_host_queue_(std::move(compositor_host_queue)),
       worklet_id_(worklet_id),
       state_(RunState::kUninitialized),
diff --git a/third_party/blink/renderer/modules/direct_sockets/navigator_socket.cc b/third_party/blink/renderer/modules/direct_sockets/navigator_socket.cc
index 81fbb37..f11d602 100644
--- a/third_party/blink/renderer/modules/direct_sockets/navigator_socket.cc
+++ b/third_party/blink/renderer/modules/direct_sockets/navigator_socket.cc
@@ -45,7 +45,7 @@
 const char NavigatorSocket::kSupplementName[] = "NavigatorSocket";
 
 NavigatorSocket::NavigatorSocket(ExecutionContext* context)
-    : ExecutionContextLifecycleStateObserver(context) {}
+    : Supplement(*context), ExecutionContextLifecycleStateObserver(context) {}
 
 // static
 NavigatorSocket& NavigatorSocket::From(ScriptState* script_state) {
diff --git a/third_party/blink/renderer/modules/encryptedmedia/html_media_element_encrypted_media.cc b/third_party/blink/renderer/modules/encryptedmedia/html_media_element_encrypted_media.cc
index a85678f..b6eb80e5 100644
--- a/third_party/blink/renderer/modules/encryptedmedia/html_media_element_encrypted_media.cc
+++ b/third_party/blink/renderer/modules/encryptedmedia/html_media_element_encrypted_media.cc
@@ -333,7 +333,7 @@
 
 HTMLMediaElementEncryptedMedia::HTMLMediaElementEncryptedMedia(
     HTMLMediaElement& element)
-    : media_element_(&element),
+    : Supplement(element),
       is_waiting_for_key_(false),
       is_attaching_media_keys_(false) {}
 
@@ -415,13 +415,13 @@
   DVLOG(EME_LOG_LEVEL) << __func__;
 
   Event* event;
-  if (media_element_->IsMediaDataCorsSameOrigin()) {
+  if (GetSupplementable()->IsMediaDataCorsSameOrigin()) {
     event = CreateEncryptedEvent(init_data_type, init_data, init_data_length);
   } else {
     // Current page is not allowed to see content from the media file,
     // so don't return the initData. However, they still get an event.
     event = CreateEncryptedEvent(media::EmeInitDataType::UNKNOWN, nullptr, 0);
-    media_element_->GetExecutionContext()->AddConsoleMessage(
+    GetSupplementable()->GetExecutionContext()->AddConsoleMessage(
         MakeGarbageCollected<ConsoleMessage>(
             mojom::ConsoleMessageSource::kJavaScript,
             mojom::ConsoleMessageLevel::kWarning,
@@ -432,8 +432,8 @@
             "response are CORS-same-origin."));
   }
 
-  event->SetTarget(media_element_);
-  media_element_->ScheduleEvent(event);
+  event->SetTarget(GetSupplementable());
+  GetSupplementable()->ScheduleEvent(event);
 }
 
 void HTMLMediaElementEncryptedMedia::DidBlockPlaybackWaitingForKey() {
@@ -449,8 +449,8 @@
   //    to fire a simple event named waitingforkey at the media element.
   if (!is_waiting_for_key_) {
     Event* event = Event::Create(event_type_names::kWaitingforkey);
-    event->SetTarget(media_element_);
-    media_element_->ScheduleEvent(event);
+    event->SetTarget(GetSupplementable());
+    GetSupplementable()->ScheduleEvent(event);
   }
 
   // 3. Set the media element's waiting for key value to true.
@@ -475,7 +475,6 @@
 }
 
 void HTMLMediaElementEncryptedMedia::Trace(Visitor* visitor) const {
-  visitor->Trace(media_element_);
   visitor->Trace(media_keys_);
   Supplement<HTMLMediaElement>::Trace(visitor);
 }
diff --git a/third_party/blink/renderer/modules/encryptedmedia/html_media_element_encrypted_media.h b/third_party/blink/renderer/modules/encryptedmedia/html_media_element_encrypted_media.h
index 3a2bb91..91b6a488 100644
--- a/third_party/blink/renderer/modules/encryptedmedia/html_media_element_encrypted_media.h
+++ b/third_party/blink/renderer/modules/encryptedmedia/html_media_element_encrypted_media.h
@@ -65,8 +65,6 @@
                                  EventListener*);
   EventListener* GetAttributeEventListener(const AtomicString& event_type);
 
-  Member<HTMLMediaElement> media_element_;
-
   // Internal values specified by the EME spec:
   // http://w3c.github.io/encrypted-media/#idl-def-HTMLMediaElement
   // The following internal values are added to the HTMLMediaElement:
diff --git a/third_party/blink/renderer/modules/encryptedmedia/media_keys_controller.cc b/third_party/blink/renderer/modules/encryptedmedia/media_keys_controller.cc
index ab0a695..64fdf391 100644
--- a/third_party/blink/renderer/modules/encryptedmedia/media_keys_controller.cc
+++ b/third_party/blink/renderer/modules/encryptedmedia/media_keys_controller.cc
@@ -14,7 +14,7 @@
 // static
 const char MediaKeysController::kSupplementName[] = "MediaKeysController";
 
-MediaKeysController::MediaKeysController() = default;
+MediaKeysController::MediaKeysController() : Supplement(nullptr) {}
 
 WebEncryptedMediaClient* MediaKeysController::EncryptedMediaClient(
     ExecutionContext* context) {
diff --git a/third_party/blink/renderer/modules/filesystem/dragged_isolated_file_system_impl.h b/third_party/blink/renderer/modules/filesystem/dragged_isolated_file_system_impl.h
index f81b067..f56254d 100644
--- a/third_party/blink/renderer/modules/filesystem/dragged_isolated_file_system_impl.h
+++ b/third_party/blink/renderer/modules/filesystem/dragged_isolated_file_system_impl.h
@@ -55,7 +55,7 @@
 
   static DraggedIsolatedFileSystemImpl* From(DataObject*);
 
-  DraggedIsolatedFileSystemImpl() = default;
+  DraggedIsolatedFileSystemImpl() : Supplement(nullptr) {}
 
   void Trace(Visitor*) const override;
 
diff --git a/third_party/blink/renderer/modules/indexeddb/global_indexed_db.cc b/third_party/blink/renderer/modules/indexeddb/global_indexed_db.cc
index 7939cd0..8adb942 100644
--- a/third_party/blink/renderer/modules/indexeddb/global_indexed_db.cc
+++ b/third_party/blink/renderer/modules/indexeddb/global_indexed_db.cc
@@ -25,13 +25,14 @@
     GlobalIndexedDBImpl* supplement =
         Supplement<T>::template From<GlobalIndexedDBImpl>(supplementable);
     if (!supplement) {
-      supplement = MakeGarbageCollected<GlobalIndexedDBImpl>();
+      supplement = MakeGarbageCollected<GlobalIndexedDBImpl>(supplementable);
       Supplement<T>::ProvideTo(supplementable, supplement);
     }
     return *supplement;
   }
 
-  GlobalIndexedDBImpl() = default;
+  explicit GlobalIndexedDBImpl(T& supplementable)
+      : Supplement<T>(supplementable) {}
 
   IDBFactory* IdbFactory(T& fetching_scope) {
     if (!idb_factory_)
diff --git a/third_party/blink/renderer/modules/launch/dom_window_launch_queue.cc b/third_party/blink/renderer/modules/launch/dom_window_launch_queue.cc
index fa6fa4a..1bde440 100644
--- a/third_party/blink/renderer/modules/launch/dom_window_launch_queue.cc
+++ b/third_party/blink/renderer/modules/launch/dom_window_launch_queue.cc
@@ -15,7 +15,7 @@
 const char DOMWindowLaunchQueue::kSupplementName[] = "DOMWindowLaunchQueue";
 
 DOMWindowLaunchQueue::DOMWindowLaunchQueue()
-    : launch_queue_(MakeGarbageCollected<LaunchQueue>()) {}
+    : Supplement(nullptr), launch_queue_(MakeGarbageCollected<LaunchQueue>()) {}
 
 Member<LaunchQueue> DOMWindowLaunchQueue::launchQueue(LocalDOMWindow& window) {
   return FromState(&window)->launch_queue_;
diff --git a/third_party/blink/renderer/modules/mediasource/source_buffer_track_base_supplement.cc b/third_party/blink/renderer/modules/mediasource/source_buffer_track_base_supplement.cc
index 8416de39..1fc8305 100644
--- a/third_party/blink/renderer/modules/mediasource/source_buffer_track_base_supplement.cc
+++ b/third_party/blink/renderer/modules/mediasource/source_buffer_track_base_supplement.cc
@@ -38,6 +38,9 @@
   return nullptr;
 }
 
+SourceBufferTrackBaseSupplement::SourceBufferTrackBaseSupplement()
+    : Supplement(nullptr) {}
+
 void SourceBufferTrackBaseSupplement::SetSourceBuffer(
     TrackBase& track,
     SourceBuffer* source_buffer) {
diff --git a/third_party/blink/renderer/modules/mediasource/source_buffer_track_base_supplement.h b/third_party/blink/renderer/modules/mediasource/source_buffer_track_base_supplement.h
index 9e0ded3..09e0822 100644
--- a/third_party/blink/renderer/modules/mediasource/source_buffer_track_base_supplement.h
+++ b/third_party/blink/renderer/modules/mediasource/source_buffer_track_base_supplement.h
@@ -22,6 +22,7 @@
   static SourceBuffer* sourceBuffer(TrackBase&);
   static void SetSourceBuffer(TrackBase&, SourceBuffer*);
 
+  SourceBufferTrackBaseSupplement();
   void Trace(Visitor*) const override;
 
  private:
diff --git a/third_party/blink/renderer/modules/mediastream/frame_queue_transferring_optimizer.h b/third_party/blink/renderer/modules/mediastream/frame_queue_transferring_optimizer.h
index 682cdedb..beb32dcc 100644
--- a/third_party/blink/renderer/modules/mediastream/frame_queue_transferring_optimizer.h
+++ b/third_party/blink/renderer/modules/mediastream/frame_queue_transferring_optimizer.h
@@ -11,7 +11,7 @@
 #include "third_party/blink/renderer/modules/mediastream/frame_queue_underlying_source.h"
 #include "third_party/blink/renderer/modules/mediastream/transferred_frame_queue_underlying_source.h"
 #include "third_party/blink/renderer/modules/modules_export.h"
-#include "third_party/blink/renderer/platform/heap/impl/persistent.h"
+#include "third_party/blink/renderer/platform/heap/persistent.h"
 #include "third_party/blink/renderer/platform/wtf/functional.h"
 #include "third_party/blink/renderer/platform/wtf/wtf_size_t.h"
 
diff --git a/third_party/blink/renderer/modules/mediastream/media_stream_audio_processor.cc b/third_party/blink/renderer/modules/mediastream/media_stream_audio_processor.cc
index 67ee40f7..6de4c7b 100644
--- a/third_party/blink/renderer/modules/mediastream/media_stream_audio_processor.cc
+++ b/third_party/blink/renderer/modules/mediastream/media_stream_audio_processor.cc
@@ -237,10 +237,10 @@
 
 MediaStreamAudioProcessor::MediaStreamAudioProcessor(
     const blink::AudioProcessingProperties& properties,
-    blink::WebRtcPlayoutDataSource* playout_data_source)
+    scoped_refptr<WebRtcAudioDeviceImpl> playout_data_source)
     : render_delay_ms_(0),
       audio_delay_stats_reporter_(kBuffersPerSecond),
-      playout_data_source_(playout_data_source),
+      playout_data_source_(std::move(playout_data_source)),
       main_thread_runner_(base::ThreadTaskRunnerHandle::Get()),
       audio_mirroring_(false),
       typing_detected_(false),
diff --git a/third_party/blink/renderer/modules/mediastream/media_stream_audio_processor.h b/third_party/blink/renderer/modules/mediastream/media_stream_audio_processor.h
index 5411b4f..379eca9 100644
--- a/third_party/blink/renderer/modules/mediastream/media_stream_audio_processor.h
+++ b/third_party/blink/renderer/modules/mediastream/media_stream_audio_processor.h
@@ -37,6 +37,7 @@
 class AecDumpAgentImpl;
 class MediaStreamAudioBus;
 class MediaStreamAudioFifo;
+class WebRtcAudioDeviceImpl;
 
 using webrtc::AudioProcessorInterface;
 
@@ -55,8 +56,9 @@
   //
   // Threading note: The constructor assumes it is being run on the main render
   // thread.
-  MediaStreamAudioProcessor(const AudioProcessingProperties& properties,
-                            WebRtcPlayoutDataSource* playout_data_source);
+  MediaStreamAudioProcessor(
+      const AudioProcessingProperties& properties,
+      scoped_refptr<WebRtcAudioDeviceImpl> playout_data_source);
 
   // Called when the format of the capture data has changed.
   // Called on the main render thread. The caller is responsible for stopping
@@ -208,11 +210,8 @@
   media::AudioParameters input_format_;
   media::AudioParameters output_format_;
 
-  // Raw pointer to the WebRtcPlayoutDataSource, which is valid for the
-  // lifetime of RenderThread.
-  //
   // TODO(crbug.com/704136): Replace with Member at some point.
-  WebRtcPlayoutDataSource* playout_data_source_;
+  scoped_refptr<WebRtcAudioDeviceImpl> playout_data_source_;
 
   // Task runner for the main render thread.
   const scoped_refptr<base::SingleThreadTaskRunner> main_thread_runner_;
diff --git a/third_party/blink/renderer/modules/mediastream/media_stream_audio_processor_test.cc b/third_party/blink/renderer/modules/mediastream/media_stream_audio_processor_test.cc
index ff82502..79c166f 100644
--- a/third_party/blink/renderer/modules/mediastream/media_stream_audio_processor_test.cc
+++ b/third_party/blink/renderer/modules/mediastream/media_stream_audio_processor_test.cc
@@ -200,7 +200,7 @@
   blink::AudioProcessingProperties properties;
   scoped_refptr<MediaStreamAudioProcessor> audio_processor(
       new rtc::RefCountedObject<MediaStreamAudioProcessor>(
-          properties, webrtc_audio_device.get()));
+          properties, webrtc_audio_device));
   EXPECT_TRUE(audio_processor->has_audio_processing());
   audio_processor->OnCaptureFormatChanged(params_);
   VerifyDefaultComponents(audio_processor.get());
@@ -224,7 +224,7 @@
       new rtc::RefCountedObject<WebRtcAudioDeviceImpl>());
   scoped_refptr<MediaStreamAudioProcessor> audio_processor(
       new rtc::RefCountedObject<MediaStreamAudioProcessor>(
-          properties, webrtc_audio_device.get()));
+          properties, webrtc_audio_device));
   EXPECT_FALSE(audio_processor->has_audio_processing());
   audio_processor->OnCaptureFormatChanged(params_);
 
@@ -252,7 +252,7 @@
   blink::AudioProcessingProperties properties;
   scoped_refptr<MediaStreamAudioProcessor> audio_processor(
       new rtc::RefCountedObject<MediaStreamAudioProcessor>(
-          properties, webrtc_audio_device.get()));
+          properties, webrtc_audio_device));
   EXPECT_TRUE(audio_processor->has_audio_processing());
 
   static const int kSupportedSampleRates[] = {
@@ -306,7 +306,7 @@
   {
     scoped_refptr<MediaStreamAudioProcessor> audio_processor(
         new rtc::RefCountedObject<MediaStreamAudioProcessor>(
-            properties, webrtc_audio_device.get()));
+            properties, webrtc_audio_device));
 
     // Start and stop recording.
     audio_processor->OnStartDump(base::File(
@@ -334,7 +334,6 @@
                                 use_multichannel_processing);
   scoped_refptr<WebRtcAudioDeviceImpl> webrtc_audio_device(
       new rtc::RefCountedObject<WebRtcAudioDeviceImpl>());
-
   const media::AudioParameters source_params(
       media::AudioParameters::AUDIO_PCM_LOW_LATENCY,
       media::CHANNEL_LAYOUT_STEREO, 48000, 480);
@@ -371,7 +370,7 @@
     properties.goog_audio_mirroring = true;
     scoped_refptr<MediaStreamAudioProcessor> audio_processor(
         new rtc::RefCountedObject<MediaStreamAudioProcessor>(
-            properties, webrtc_audio_device.get()));
+            properties, webrtc_audio_device));
     EXPECT_EQ(audio_processor->has_audio_processing(), use_apm);
     audio_processor->OnCaptureFormatChanged(source_params);
     // There's no sense in continuing if this fails.
@@ -431,7 +430,7 @@
   blink::AudioProcessingProperties properties;
   scoped_refptr<MediaStreamAudioProcessor> audio_processor(
       new rtc::RefCountedObject<MediaStreamAudioProcessor>(
-          properties, webrtc_audio_device.get()));
+          properties, webrtc_audio_device));
   EXPECT_TRUE(audio_processor->has_audio_processing());
 
   media::AudioParameters params(media::AudioParameters::AUDIO_PCM_LOW_LATENCY,
@@ -463,7 +462,7 @@
       new rtc::RefCountedObject<WebRtcAudioDeviceImpl>());
   scoped_refptr<MediaStreamAudioProcessor> audio_processor(
       new rtc::RefCountedObject<MediaStreamAudioProcessor>(
-          properties, webrtc_audio_device.get()));
+          properties, webrtc_audio_device));
 
   base::Optional<webrtc::AudioProcessing::Config> apm_config =
       audio_processor->GetAudioProcessingModuleConfig();
@@ -503,7 +502,7 @@
       new rtc::RefCountedObject<WebRtcAudioDeviceImpl>());
   scoped_refptr<MediaStreamAudioProcessor> audio_processor(
       new rtc::RefCountedObject<MediaStreamAudioProcessor>(
-          properties, webrtc_audio_device.get()));
+          properties, webrtc_audio_device));
 
   base::Optional<webrtc::AudioProcessing::Config> apm_config =
       audio_processor->GetAudioProcessingModuleConfig();
@@ -554,7 +553,7 @@
       new rtc::RefCountedObject<WebRtcAudioDeviceImpl>());
   scoped_refptr<MediaStreamAudioProcessor> audio_processor(
       new rtc::RefCountedObject<MediaStreamAudioProcessor>(
-          properties, webrtc_audio_device.get()));
+          properties, webrtc_audio_device));
 
   base::Optional<webrtc::AudioProcessing::Config> apm_config =
       audio_processor->GetAudioProcessingModuleConfig();
@@ -573,7 +572,7 @@
       new rtc::RefCountedObject<WebRtcAudioDeviceImpl>());
   scoped_refptr<MediaStreamAudioProcessor> audio_processor(
       new rtc::RefCountedObject<MediaStreamAudioProcessor>(
-          properties, webrtc_audio_device.get()));
+          properties, webrtc_audio_device));
   EXPECT_TRUE(audio_processor->has_audio_processing());
 
   media::AudioParameters params(media::AudioParameters::AUDIO_PCM_LOW_LATENCY,
diff --git a/third_party/blink/renderer/modules/mediastream/media_stream_constraints_util_audio_test.cc b/third_party/blink/renderer/modules/mediastream/media_stream_constraints_util_audio_test.cc
index 00550c48..218223c 100644
--- a/third_party/blink/renderer/modules/mediastream/media_stream_constraints_util_audio_test.cc
+++ b/third_party/blink/renderer/modules/mediastream/media_stream_constraints_util_audio_test.cc
@@ -19,6 +19,7 @@
 #include "third_party/blink/public/platform/modules/mediastream/web_platform_media_stream_source.h"
 #include "third_party/blink/public/platform/scheduler/test/renderer_scheduler_test_support.h"
 #include "third_party/blink/public/platform/web_string.h"
+#include "third_party/blink/renderer/core/testing/sim/sim_test.h"
 #include "third_party/blink/renderer/modules/mediastream/local_media_stream_audio_source.h"
 #include "third_party/blink/renderer/modules/mediastream/mock_constraint_factory.h"
 #include "third_party/blink/renderer/modules/mediastream/processed_local_audio_source.h"
@@ -77,7 +78,7 @@
 
 }  // namespace
 
-class MediaStreamConstraintsUtilAudioTestBase {
+class MediaStreamConstraintsUtilAudioTestBase : public SimTest {
  protected:
   void MakeSystemEchoCancellerDeviceExperimental() {
     media::AudioParameters experimental_system_echo_canceller_parameters(
@@ -125,7 +126,7 @@
     device.input.set_effects(effects);
 
     return std::make_unique<ProcessedLocalAudioSource>(
-        nullptr /*web_frame*/, device, disable_local_echo, properties,
+        *MainFrame().GetFrame(), device, disable_local_echo, properties,
         base::NullCallback(),
         blink::scheduler::GetSingleThreadTaskRunnerForTesting());
   }
@@ -492,9 +493,10 @@
 
 class MediaStreamConstraintsUtilAudioTest
     : public MediaStreamConstraintsUtilAudioTestBase,
-      public testing::TestWithParam<std::string> {
+      public testing::WithParamInterface<std::string> {
  public:
   void SetUp() override {
+    MediaStreamConstraintsUtilAudioTestBase::SetUp();
     ResetFactory();
     if (IsDeviceCapture()) {
       capabilities_.emplace_back(
diff --git a/third_party/blink/renderer/modules/mediastream/media_stream_renderer_factory.cc b/third_party/blink/renderer/modules/mediastream/media_stream_renderer_factory.cc
index 3c622fd..8d320bd 100644
--- a/third_party/blink/renderer/modules/mediastream/media_stream_renderer_factory.cc
+++ b/third_party/blink/renderer/modules/mediastream/media_stream_renderer_factory.cc
@@ -10,6 +10,8 @@
 #include "third_party/blink/public/platform/modules/webrtc/webrtc_logging.h"
 #include "third_party/blink/public/platform/platform.h"
 #include "third_party/blink/public/web/web_local_frame.h"
+#include "third_party/blink/renderer/core/execution_context/execution_context.h"
+#include "third_party/blink/renderer/core/frame/local_dom_window.h"
 #include "third_party/blink/renderer/core/frame/local_frame.h"
 #include "third_party/blink/renderer/modules/mediastream/media_stream_video_renderer_sink.h"
 #include "third_party/blink/renderer/modules/mediastream/media_stream_video_track.h"
@@ -33,9 +35,10 @@
 // be rendered to a matching output device, should one exist.
 // Note that if there are more than one open capture devices the function
 // will not be able to pick an appropriate device and return 0.
-base::UnguessableToken GetSessionIdForWebRtcAudioRenderer() {
+base::UnguessableToken GetSessionIdForWebRtcAudioRenderer(
+    ExecutionContext& context) {
   WebRtcAudioDeviceImpl* audio_device =
-      PeerConnectionDependencyFactory::GetInstance()->GetWebRtcAudioDevice();
+      PeerConnectionDependencyFactory::From(context).GetWebRtcAudioDevice();
   return audio_device
              ? audio_device->GetAuthorizedDeviceSessionIdForAudioRenderer()
              : base::UnguessableToken();
@@ -118,6 +121,9 @@
     return nullptr;
   }
 
+  auto* frame = To<LocalFrame>(WebLocalFrame::ToCoreFrame(*web_frame));
+  DCHECK(frame);
+
   // If the track has a local source, or is a remote track that does not use the
   // WebRTC audio pipeline, return a new TrackAudioRenderer instance.
   if (!PeerConnectionRemoteAudioTrack::From(audio_track)) {
@@ -127,11 +133,7 @@
         "%s => (creating TrackAudioRenderer for %s audio track)", __func__,
         audio_track->is_local_track() ? "local" : "remote"));
 
-    auto* frame =
-        web_frame
-            ? static_cast<LocalFrame*>(WebLocalFrame::ToCoreFrame(*web_frame))
-            : nullptr;
-    return new TrackAudioRenderer(audio_components[0].Get(), frame,
+    return new TrackAudioRenderer(audio_components[0].Get(), *frame,
                                   /*session_id=*/base::UnguessableToken(),
                                   String(device_id),
                                   std::move(on_render_error_callback));
@@ -139,7 +141,8 @@
 
   // This is a remote WebRTC media stream.
   WebRtcAudioDeviceImpl* audio_device =
-      PeerConnectionDependencyFactory::GetInstance()->GetWebRtcAudioDevice();
+      PeerConnectionDependencyFactory::From(*frame->DomWindow())
+          .GetWebRtcAudioDevice();
   DCHECK(audio_device);
   SendLogMessage(String::Format(
       "%s => (media stream is a remote WebRTC stream)", __func__));
@@ -156,9 +159,11 @@
         __func__));
 
     renderer = new WebRtcAudioRenderer(
-        PeerConnectionDependencyFactory::GetInstance()
-            ->GetWebRtcSignalingTaskRunner(),
-        web_stream, web_frame, GetSessionIdForWebRtcAudioRenderer(),
+        PeerConnectionDependencyFactory::From(*frame->DomWindow())
+            .GetWebRtcSignalingTaskRunner(),
+        web_stream, web_frame,
+
+        GetSessionIdForWebRtcAudioRenderer(*frame->DomWindow()),
         String(device_id), std::move(on_render_error_callback));
 
     if (!audio_device->SetAudioRenderer(renderer.get())) {
diff --git a/third_party/blink/renderer/modules/mediastream/media_stream_video_track_test.cc b/third_party/blink/renderer/modules/mediastream/media_stream_video_track_test.cc
index a7ea3f5..c6d7115 100644
--- a/third_party/blink/renderer/modules/mediastream/media_stream_video_track_test.cc
+++ b/third_party/blink/renderer/modules/mediastream/media_stream_video_track_test.cc
@@ -639,7 +639,8 @@
 
   Persistent<MediaStreamComponent> media_stream_component = *track;
   blink::MediaStreamVideoWebRtcSink webrtc_sink(
-      media_stream_component, new blink::MockPeerConnectionDependencyFactory(),
+      media_stream_component,
+      MakeGarbageCollected<MockPeerConnectionDependencyFactory>(),
       blink::scheduler::GetSingleThreadTaskRunnerForTesting());
   EXPECT_EQ(webrtc_sink.GetRequiredMinFramesPerSec(), 1);
 
@@ -666,7 +667,8 @@
   // Second sink.
   Persistent<MediaStreamComponent> media_stream_component = *track;
   blink::MediaStreamVideoWebRtcSink webrtc_sink(
-      media_stream_component, new blink::MockPeerConnectionDependencyFactory(),
+      media_stream_component,
+      MakeGarbageCollected<MockPeerConnectionDependencyFactory>(),
       blink::scheduler::GetSingleThreadTaskRunnerForTesting());
   EXPECT_EQ(webrtc_sink.GetRequiredMinFramesPerSec(), 1);
 
@@ -696,7 +698,7 @@
     Persistent<MediaStreamComponent> media_stream_component = *track;
     blink::MediaStreamVideoWebRtcSink webrtc_sink(
         media_stream_component,
-        new blink::MockPeerConnectionDependencyFactory(),
+        MakeGarbageCollected<MockPeerConnectionDependencyFactory>(),
         blink::scheduler::GetSingleThreadTaskRunnerForTesting());
     EXPECT_EQ(webrtc_sink.GetRequiredMinFramesPerSec(), 1);
   }
diff --git a/third_party/blink/renderer/modules/mediastream/processed_local_audio_source.cc b/third_party/blink/renderer/modules/mediastream/processed_local_audio_source.cc
index f63d23f..6e01c0a 100644
--- a/third_party/blink/renderer/modules/mediastream/processed_local_audio_source.cc
+++ b/third_party/blink/renderer/modules/mediastream/processed_local_audio_source.cc
@@ -23,6 +23,7 @@
 #include "third_party/blink/public/platform/modules/webrtc/webrtc_logging.h"
 #include "third_party/blink/public/platform/platform.h"
 #include "third_party/blink/public/web/web_local_frame.h"
+#include "third_party/blink/renderer/core/frame/local_dom_window.h"
 #include "third_party/blink/renderer/core/frame/local_frame.h"
 #include "third_party/blink/renderer/modules/mediastream/media_stream_audio_processor.h"
 #include "third_party/blink/renderer/modules/mediastream/media_stream_constraints_util.h"
@@ -100,7 +101,7 @@
 }  // namespace
 
 ProcessedLocalAudioSource::ProcessedLocalAudioSource(
-    LocalFrame* frame,
+    LocalFrame& frame,
     const blink::MediaStreamDevice& device,
     bool disable_local_echo,
     const blink::AudioProcessingProperties& audio_processing_properties,
@@ -109,7 +110,7 @@
     : blink::MediaStreamAudioSource(std::move(task_runner),
                                     true /* is_local_source */,
                                     disable_local_echo),
-      consumer_frame_(frame),
+      consumer_frame_(&frame),
       audio_processing_properties_(audio_processing_properties),
       started_callback_(std::move(started_callback)),
       volume_(0),
@@ -210,7 +211,8 @@
   // Create the MediaStreamAudioProcessor, bound to the WebRTC audio device
   // module.
   WebRtcAudioDeviceImpl* const rtc_audio_device =
-      PeerConnectionDependencyFactory::GetInstance()->GetWebRtcAudioDevice();
+      PeerConnectionDependencyFactory::From(*consumer_frame_->DomWindow())
+          .GetWebRtcAudioDevice();
   if (!rtc_audio_device) {
     SendLogMessageWithSessionId(
         "EnsureSourceIsStarted() => (ERROR: no WebRTC ADM instance)");
@@ -312,8 +314,10 @@
   scoped_refptr<media::AudioCapturerSource> source_to_stop(std::move(source_));
 
   if (WebRtcAudioDeviceImpl* rtc_audio_device =
-          PeerConnectionDependencyFactory::GetInstance()
-              ->GetWebRtcAudioDevice()) {
+          consumer_frame_ ? PeerConnectionDependencyFactory::From(
+                                *consumer_frame_->DomWindow())
+                                .GetWebRtcAudioDevice()
+                          : nullptr) {
     rtc_audio_device->RemoveAudioCapturer(this);
   }
 
diff --git a/third_party/blink/renderer/modules/mediastream/processed_local_audio_source.h b/third_party/blink/renderer/modules/mediastream/processed_local_audio_source.h
index dc037c1..5e8d321 100644
--- a/third_party/blink/renderer/modules/mediastream/processed_local_audio_source.h
+++ b/third_party/blink/renderer/modules/mediastream/processed_local_audio_source.h
@@ -43,7 +43,7 @@
   // audio session ID are derived from |device_info|. |factory| must outlive
   // this instance.
   ProcessedLocalAudioSource(
-      LocalFrame* frame,
+      LocalFrame& frame,
       const MediaStreamDevice& device,
       bool disable_local_echo,
       const AudioProcessingProperties& audio_processing_properties,
diff --git a/third_party/blink/renderer/modules/mediastream/processed_local_audio_source_test.cc b/third_party/blink/renderer/modules/mediastream/processed_local_audio_source_test.cc
index 56caecbe..232b174a 100644
--- a/third_party/blink/renderer/modules/mediastream/processed_local_audio_source_test.cc
+++ b/third_party/blink/renderer/modules/mediastream/processed_local_audio_source_test.cc
@@ -14,6 +14,7 @@
 #include "third_party/blink/public/platform/modules/mediastream/web_media_stream_audio_sink.h"
 #include "third_party/blink/public/platform/scheduler/test/renderer_scheduler_test_support.h"
 #include "third_party/blink/public/web/web_heap.h"
+#include "third_party/blink/renderer/core/testing/sim/sim_test.h"
 #include "third_party/blink/renderer/modules/mediastream/processed_local_audio_source.h"
 #include "third_party/blink/renderer/modules/mediastream/testing_platform_support_with_mock_audio_capture_source.h"
 #include "third_party/blink/renderer/modules/webrtc/webrtc_audio_device_impl.h"
@@ -76,13 +77,14 @@
 
 }  // namespace
 
-class ProcessedLocalAudioSourceTest : public testing::Test {
+class ProcessedLocalAudioSourceTest : public SimTest {
  protected:
-  ProcessedLocalAudioSourceTest() {}
+  ProcessedLocalAudioSourceTest() = default;
 
-  ~ProcessedLocalAudioSourceTest() override {}
+  ~ProcessedLocalAudioSourceTest() override = default;
 
   void SetUp() override {
+    SimTest::SetUp();
     audio_source_ = MakeGarbageCollected<MediaStreamSource>(
         String::FromUTF8("audio_label"), MediaStreamSource::kTypeAudio,
         String::FromUTF8("audio_track"), false /* remote */);
@@ -91,6 +93,7 @@
   }
 
   void TearDown() override {
+    SimTest::TearDown();
     audio_source_ = nullptr;
     audio_component_ = nullptr;
     WebHeap::CollectAllGarbageForTesting();
@@ -100,7 +103,7 @@
       const AudioProcessingProperties& properties) {
     std::unique_ptr<blink::ProcessedLocalAudioSource> source =
         std::make_unique<blink::ProcessedLocalAudioSource>(
-            nullptr /* consumer_web_frame is N/A for non-browser tests */,
+            *MainFrame().GetFrame(),
             MediaStreamDevice(mojom::MediaStreamType::DEVICE_AUDIO_CAPTURE,
                               "mock_audio_device_id", "Mock audio device",
                               kSampleRate, kChannelLayout,
diff --git a/third_party/blink/renderer/modules/mediastream/testing_platform_support_with_mock_audio_capture_source.cc b/third_party/blink/renderer/modules/mediastream/testing_platform_support_with_mock_audio_capture_source.cc
index 1ece4899..ff40353 100644
--- a/third_party/blink/renderer/modules/mediastream/testing_platform_support_with_mock_audio_capture_source.cc
+++ b/third_party/blink/renderer/modules/mediastream/testing_platform_support_with_mock_audio_capture_source.cc
@@ -10,7 +10,6 @@
 AudioCapturerSourceTestingPlatformSupport::NewAudioCapturerSource(
     WebLocalFrame* web_frame,
     const media::AudioSourceParameters& params) {
-  EXPECT_EQ(nullptr, web_frame);
   return mock_audio_capturer_source_;
 }
 
diff --git a/third_party/blink/renderer/modules/mediastream/track_audio_renderer.cc b/third_party/blink/renderer/modules/mediastream/track_audio_renderer.cc
index 08c383b5..ce397556 100644
--- a/third_party/blink/renderer/modules/mediastream/track_audio_renderer.cc
+++ b/third_party/blink/renderer/modules/mediastream/track_audio_renderer.cc
@@ -154,7 +154,7 @@
 
 TrackAudioRenderer::TrackAudioRenderer(
     MediaStreamComponent* audio_component,
-    LocalFrame* playout_frame,
+    LocalFrame& playout_frame,
     const base::UnguessableToken& session_id,
     const String& device_id,
     base::RepeatingCallback<void()> on_render_error_callback)
@@ -162,7 +162,7 @@
       playout_frame_(playout_frame),
       session_id_(session_id),
       task_runner_(
-          playout_frame->GetTaskRunner(blink::TaskType::kInternalMedia)),
+          playout_frame.GetTaskRunner(blink::TaskType::kInternalMedia)),
       num_samples_rendered_(0),
       on_render_error_callback_(std::move(on_render_error_callback)),
       playing_(false),
diff --git a/third_party/blink/renderer/modules/mediastream/track_audio_renderer.h b/third_party/blink/renderer/modules/mediastream/track_audio_renderer.h
index bd4452f..f1d3132 100644
--- a/third_party/blink/renderer/modules/mediastream/track_audio_renderer.h
+++ b/third_party/blink/renderer/modules/mediastream/track_audio_renderer.h
@@ -62,7 +62,7 @@
   //
   // Called on the main thread.
   TrackAudioRenderer(MediaStreamComponent* audio_component,
-                     LocalFrame* playout_web_frame,
+                     LocalFrame& playout_web_frame,
                      const base::UnguessableToken& session_id,
                      const String& device_id,
                      base::RepeatingCallback<void()> on_render_error_callback);
diff --git a/third_party/blink/renderer/modules/mediastream/user_media_processor.cc b/third_party/blink/renderer/modules/mediastream/user_media_processor.cc
index 78acb2b..6e42b3d 100644
--- a/third_party/blink/renderer/modules/mediastream/user_media_processor.cc
+++ b/third_party/blink/renderer/modules/mediastream/user_media_processor.cc
@@ -1413,7 +1413,7 @@
   // The audio device is not associated with screen capture and also requires
   // processing.
   return std::make_unique<blink::ProcessedLocalAudioSource>(
-      frame_, device, stream_controls->disable_local_echo,
+      *frame_, device, stream_controls->disable_local_echo,
       audio_processing_properties, std::move(source_ready), task_runner_);
 }
 
diff --git a/third_party/blink/renderer/modules/notifications/service_worker_registration_notifications.cc b/third_party/blink/renderer/modules/notifications/service_worker_registration_notifications.cc
index 60ce4427..2d5d753 100644
--- a/third_party/blink/renderer/modules/notifications/service_worker_registration_notifications.cc
+++ b/third_party/blink/renderer/modules/notifications/service_worker_registration_notifications.cc
@@ -28,7 +28,7 @@
 ServiceWorkerRegistrationNotifications::ServiceWorkerRegistrationNotifications(
     ExecutionContext* context,
     ServiceWorkerRegistration* registration)
-    : ExecutionContextLifecycleObserver(context), registration_(registration) {}
+    : Supplement(*registration), ExecutionContextLifecycleObserver(context) {}
 
 ScriptPromise ServiceWorkerRegistrationNotifications::showNotification(
     ScriptState* script_state,
@@ -103,7 +103,6 @@
 }
 
 void ServiceWorkerRegistrationNotifications::Trace(Visitor* visitor) const {
-  visitor->Trace(registration_);
   visitor->Trace(loaders_);
   Supplement<ServiceWorkerRegistration>::Trace(visitor);
   ExecutionContextLifecycleObserver::Trace(visitor);
@@ -149,7 +148,7 @@
   DCHECK(loaders_.Contains(loader));
 
   NotificationManager::From(GetExecutionContext())
-      ->DisplayPersistentNotification(registration_->RegistrationId(),
+      ->DisplayPersistentNotification(GetSupplementable()->RegistrationId(),
                                       std::move(data), loader->GetResources(),
                                       WrapPersistent(resolver));
   loaders_.erase(loader);
diff --git a/third_party/blink/renderer/modules/notifications/service_worker_registration_notifications.h b/third_party/blink/renderer/modules/notifications/service_worker_registration_notifications.h
index 21bc998..5371ea1 100644
--- a/third_party/blink/renderer/modules/notifications/service_worker_registration_notifications.h
+++ b/third_party/blink/renderer/modules/notifications/service_worker_registration_notifications.h
@@ -66,7 +66,6 @@
                         ScriptPromiseResolver* resolver,
                         NotificationResourcesLoader* loader);
 
-  Member<ServiceWorkerRegistration> registration_;
   HeapHashSet<Member<NotificationResourcesLoader>> loaders_;
 
   DISALLOW_COPY_AND_ASSIGN(ServiceWorkerRegistrationNotifications);
diff --git a/third_party/blink/renderer/modules/payments/goods/dom_window_digital_goods.cc b/third_party/blink/renderer/modules/payments/goods/dom_window_digital_goods.cc
index 3aa4b9a1..019c2f3 100644
--- a/third_party/blink/renderer/modules/payments/goods/dom_window_digital_goods.cc
+++ b/third_party/blink/renderer/modules/payments/goods/dom_window_digital_goods.cc
@@ -44,6 +44,8 @@
 
 const char DOMWindowDigitalGoods::kSupplementName[] = "DOMWindowDigitalGoods";
 
+DOMWindowDigitalGoods::DOMWindowDigitalGoods() : Supplement(nullptr) {}
+
 ScriptPromise DOMWindowDigitalGoods::getDigitalGoodsService(
     ScriptState* script_state,
     LocalDOMWindow& window,
diff --git a/third_party/blink/renderer/modules/payments/goods/dom_window_digital_goods.h b/third_party/blink/renderer/modules/payments/goods/dom_window_digital_goods.h
index 76b618e..26eecd23 100644
--- a/third_party/blink/renderer/modules/payments/goods/dom_window_digital_goods.h
+++ b/third_party/blink/renderer/modules/payments/goods/dom_window_digital_goods.h
@@ -22,6 +22,8 @@
  public:
   static const char kSupplementName[];
 
+  DOMWindowDigitalGoods();
+
   // IDL Interface:
   static ScriptPromise getDigitalGoodsService(ScriptState*,
                                               LocalDOMWindow&,
diff --git a/third_party/blink/renderer/modules/payments/html_iframe_element_payments.cc b/third_party/blink/renderer/modules/payments/html_iframe_element_payments.cc
index 154381ae..d1e5556 100644
--- a/third_party/blink/renderer/modules/payments/html_iframe_element_payments.cc
+++ b/third_party/blink/renderer/modules/payments/html_iframe_element_payments.cc
@@ -10,7 +10,7 @@
 
 namespace blink {
 
-HTMLIFrameElementPayments::HTMLIFrameElementPayments() = default;
+HTMLIFrameElementPayments::HTMLIFrameElementPayments() : Supplement(nullptr) {}
 
 // static
 const char HTMLIFrameElementPayments::kSupplementName[] =
diff --git a/third_party/blink/renderer/modules/payments/payment_app_service_worker_registration.cc b/third_party/blink/renderer/modules/payments/payment_app_service_worker_registration.cc
index 6282eaf..eeb86fd2 100644
--- a/third_party/blink/renderer/modules/payments/payment_app_service_worker_registration.cc
+++ b/third_party/blink/renderer/modules/payments/payment_app_service_worker_registration.cc
@@ -41,20 +41,20 @@
 PaymentManager* PaymentAppServiceWorkerRegistration::paymentManager(
     ScriptState* script_state) {
   if (!payment_manager_) {
-    payment_manager_ = MakeGarbageCollected<PaymentManager>(registration_);
+    payment_manager_ =
+        MakeGarbageCollected<PaymentManager>(GetSupplementable());
   }
   return payment_manager_.Get();
 }
 
 void PaymentAppServiceWorkerRegistration::Trace(Visitor* visitor) const {
-  visitor->Trace(registration_);
   visitor->Trace(payment_manager_);
   Supplement<ServiceWorkerRegistration>::Trace(visitor);
 }
 
 PaymentAppServiceWorkerRegistration::PaymentAppServiceWorkerRegistration(
     ServiceWorkerRegistration* registration)
-    : registration_(registration) {}
+    : Supplement(*registration) {}
 
 // static
 const char PaymentAppServiceWorkerRegistration::kSupplementName[] =
diff --git a/third_party/blink/renderer/modules/payments/payment_app_service_worker_registration.h b/third_party/blink/renderer/modules/payments/payment_app_service_worker_registration.h
index c7bf8cb..3871acd 100644
--- a/third_party/blink/renderer/modules/payments/payment_app_service_worker_registration.h
+++ b/third_party/blink/renderer/modules/payments/payment_app_service_worker_registration.h
@@ -34,7 +34,6 @@
   void Trace(Visitor*) const override;
 
  private:
-  Member<ServiceWorkerRegistration> registration_;
   Member<PaymentManager> payment_manager_;
 
   DISALLOW_COPY_AND_ASSIGN(PaymentAppServiceWorkerRegistration);
diff --git a/third_party/blink/renderer/modules/peerconnection/media_stream_remote_video_source_test.cc b/third_party/blink/renderer/modules/peerconnection/media_stream_remote_video_source_test.cc
index 70815a0..92e0efe 100644
--- a/third_party/blink/renderer/modules/peerconnection/media_stream_remote_video_source_test.cc
+++ b/third_party/blink/renderer/modules/peerconnection/media_stream_remote_video_source_test.cc
@@ -25,6 +25,7 @@
 #include "third_party/blink/renderer/modules/mediastream/mock_media_stream_video_sink.h"
 #include "third_party/blink/renderer/modules/peerconnection/adapters/web_rtc_cross_thread_copier.h"
 #include "third_party/blink/renderer/modules/peerconnection/mock_peer_connection_dependency_factory.h"
+#include "third_party/blink/renderer/platform/heap/impl/heap.h"
 #include "third_party/blink/renderer/platform/mediastream/media_stream_source.h"
 #include "third_party/blink/renderer/platform/testing/io_task_runner_testing_platform_support.h"
 #include "third_party/blink/renderer/platform/webrtc/track_observer.h"
@@ -66,7 +67,8 @@
 class MediaStreamRemoteVideoSourceTest : public ::testing::Test {
  public:
   MediaStreamRemoteVideoSourceTest()
-      : mock_factory_(new blink::MockPeerConnectionDependencyFactory()),
+      : mock_factory_(
+            MakeGarbageCollected<MockPeerConnectionDependencyFactory>()),
         webrtc_video_source_(blink::MockWebRtcVideoTrackSource::Create(
             /*supports_encoded_output=*/true)),
         webrtc_video_track_(
@@ -166,7 +168,7 @@
   }
 
   ScopedTestingPlatformSupport<IOTaskRunnerTestingPlatformSupport> platform_;
-  std::unique_ptr<blink::MockPeerConnectionDependencyFactory> mock_factory_;
+  Persistent<blink::MockPeerConnectionDependencyFactory> mock_factory_;
   scoped_refptr<webrtc::VideoTrackSourceInterface> webrtc_video_source_;
   scoped_refptr<webrtc::VideoTrackInterface> webrtc_video_track_;
   // |remote_source_| is owned by |source_|.
diff --git a/third_party/blink/renderer/modules/peerconnection/media_stream_video_webrtc_sink_test.cc b/third_party/blink/renderer/modules/peerconnection/media_stream_video_webrtc_sink_test.cc
index 49f8a6d..50c6045 100644
--- a/third_party/blink/renderer/modules/peerconnection/media_stream_video_webrtc_sink_test.cc
+++ b/third_party/blink/renderer/modules/peerconnection/media_stream_video_webrtc_sink_test.cc
@@ -9,6 +9,7 @@
 #include "third_party/blink/renderer/modules/mediastream/mock_media_stream_registry.h"
 #include "third_party/blink/renderer/modules/mediastream/video_track_adapter_settings.h"
 #include "third_party/blink/renderer/modules/peerconnection/mock_peer_connection_dependency_factory.h"
+#include "third_party/blink/renderer/platform/heap/impl/heap.h"
 #include "third_party/blink/renderer/platform/mediastream/media_stream_component.h"
 #include "third_party/blink/renderer/platform/testing/io_task_runner_testing_platform_support.h"
 
@@ -38,7 +39,8 @@
 
  protected:
   Persistent<MediaStreamComponent> component_;
-  blink::MockPeerConnectionDependencyFactory dependency_factory_;
+  Persistent<MockPeerConnectionDependencyFactory> dependency_factory_ =
+      MakeGarbageCollected<MockPeerConnectionDependencyFactory>();
 
  private:
   ScopedTestingPlatformSupport<IOTaskRunnerTestingPlatformSupport> platform_;
@@ -49,7 +51,7 @@
 TEST_F(MediaStreamVideoWebRtcSinkTest, NoiseReductionDefaultsToNotSet) {
   SetVideoTrack();
   blink::MediaStreamVideoWebRtcSink my_sink(
-      component_, &dependency_factory_,
+      component_, dependency_factory_.Get(),
       blink::scheduler::GetSingleThreadTaskRunnerForTesting());
   EXPECT_TRUE(my_sink.webrtc_video_track());
   EXPECT_FALSE(my_sink.SourceNeedsDenoisingForTesting());
diff --git a/third_party/blink/renderer/modules/peerconnection/mock_peer_connection_dependency_factory.cc b/third_party/blink/renderer/modules/peerconnection/mock_peer_connection_dependency_factory.cc
index 51f6076a..187ff76 100644
--- a/third_party/blink/renderer/modules/peerconnection/mock_peer_connection_dependency_factory.cc
+++ b/third_party/blink/renderer/modules/peerconnection/mock_peer_connection_dependency_factory.cc
@@ -335,9 +335,7 @@
 };
 
 MockPeerConnectionDependencyFactory::MockPeerConnectionDependencyFactory()
-    : blink::PeerConnectionDependencyFactory(
-          /*create_p2p_socket_dispatcher =*/false),
-      signaling_thread_("MockPCFactory WebRtc Signaling Thread") {
+    : signaling_thread_("MockPCFactory WebRtc Signaling Thread") {
   EnsureWebRtcAudioDeviceImpl();
   CHECK(signaling_thread_.Start());
 }
diff --git a/third_party/blink/renderer/modules/peerconnection/peer_connection_dependency_factory.cc b/third_party/blink/renderer/modules/peerconnection/peer_connection_dependency_factory.cc
index 82e9493..434df993 100644
--- a/third_party/blink/renderer/modules/peerconnection/peer_connection_dependency_factory.cc
+++ b/third_party/blink/renderer/modules/peerconnection/peer_connection_dependency_factory.cc
@@ -33,11 +33,13 @@
 #include "third_party/blink/public/web/web_document.h"
 #include "third_party/blink/public/web/web_local_frame.h"
 #include "third_party/blink/public/web/web_local_frame_client.h"
+#include "third_party/blink/renderer/core/execution_context/execution_context.h"
 #include "third_party/blink/renderer/modules/peerconnection/rtc_error_util.h"
 #include "third_party/blink/renderer/modules/peerconnection/rtc_peer_connection_handler.h"
 #include "third_party/blink/renderer/modules/webrtc/webrtc_audio_device_impl.h"
 #include "third_party/blink/renderer/platform/mediastream/media_constraints.h"
 #include "third_party/blink/renderer/platform/mediastream/webrtc_uma_histograms.h"
+#include "third_party/blink/renderer/platform/mojo/mojo_binding_context.h"
 #include "third_party/blink/renderer/platform/p2p/empty_network_manager.h"
 #include "third_party/blink/renderer/platform/p2p/filtering_network_manager.h"
 #include "third_party/blink/renderer/platform/p2p/ipc_network_manager.h"
@@ -67,6 +69,8 @@
 
 namespace {
 
+using PassKey = base::PassKey<PeerConnectionDependencyFactory>;
+
 enum WebRTCIPHandlingPolicy {
   DEFAULT,
   DEFAULT_PUBLIC_AND_PRIVATE_INTERFACES,
@@ -108,32 +112,176 @@
   IpcPacketSocketFactory* ipc_psf_;
 };
 
+// Encapsulates process-wide static dependencies used by
+// `PeerConnectionDependencyFactory`, namely the threads used by WebRTC. This
+// avoids allocating multiple threads per factory instance, as they are
+// "heavy-weight" and we don't want to create them per frame.
+class PeerConnectionStaticDeps {
+ public:
+  PeerConnectionStaticDeps()
+      : chrome_signaling_thread_("WebRTC_Signaling"),
+        chrome_network_thread_("WebRTC_Network") {
+    if (base::FeatureList::IsEnabled(features::kWebRtcDistinctWorkerThread)) {
+      chrome_worker_thread_.emplace("WebRTC_Worker");
+    }
+  }
+
+  void EnsureChromeThreadsStarted() {
+    if (!chrome_signaling_thread_.IsRunning())
+      chrome_signaling_thread_.Start();
+    if (!chrome_network_thread_.IsRunning())
+      chrome_network_thread_.Start();
+
+    if (chrome_worker_thread_ && !chrome_worker_thread_->IsRunning())
+      chrome_worker_thread_->Start();
+
+    // To allow sending to the signaling/worker threads.
+    jingle_glue::JingleThreadWrapper::EnsureForCurrentMessageLoop();
+    jingle_glue::JingleThreadWrapper::current()->set_send_allowed(true);
+  }
+
+  base::WaitableEvent& InitializeWorkerThread() {
+    // If there is no worker thread, the event was already created SIGNALED.
+    if (!chrome_worker_thread_)
+      return init_worker_event;
+
+    if (!worker_thread_) {
+      PostCrossThreadTask(
+          *chrome_worker_thread_->task_runner(), FROM_HERE,
+          CrossThreadBindOnce(&PeerConnectionStaticDeps::InitializeOnThread,
+                              CrossThreadUnretained(this),
+                              CrossThreadUnretained(&worker_thread_),
+                              CrossThreadUnretained(&init_worker_event)));
+    }
+    return init_worker_event;
+  }
+
+  base::WaitableEvent& InitializeNetworkThread() {
+    if (!network_thread_) {
+      PostCrossThreadTask(
+          *chrome_network_thread_.task_runner(), FROM_HERE,
+          CrossThreadBindOnce(&PeerConnectionStaticDeps::InitializeOnThread,
+                              CrossThreadUnretained(this),
+                              CrossThreadUnretained(&network_thread_),
+                              CrossThreadUnretained(&init_network_event)));
+    }
+    return init_network_event;
+  }
+
+  base::WaitableEvent& InitializeSignalingThread() {
+    if (!signaling_thread_) {
+      PostCrossThreadTask(
+          *chrome_signaling_thread_.task_runner(), FROM_HERE,
+          CrossThreadBindOnce(&PeerConnectionStaticDeps::InitializeOnThread,
+                              CrossThreadUnretained(this),
+                              CrossThreadUnretained(&signaling_thread_),
+                              CrossThreadUnretained(&init_signaling_event)));
+    }
+    return init_signaling_event;
+  }
+
+  rtc::Thread* GetSignalingThread() { return signaling_thread_; }
+  rtc::Thread* GetWorkerThread() { return worker_thread_; }
+  rtc::Thread* GetNetworkThread() { return network_thread_; }
+  base::Thread& GetChromeSignalingThread() { return chrome_signaling_thread_; }
+  base::Thread* GetChromeWorkerThread() {
+    return chrome_worker_thread_.has_value() ? &*chrome_worker_thread_
+                                             : nullptr;
+  }
+  base::Thread& GetChromeNetworkThread() { return chrome_network_thread_; }
+
+ private:
+  void InitializeOnThread(rtc::Thread** thread, base::WaitableEvent* event) {
+    jingle_glue::JingleThreadWrapper::EnsureForCurrentMessageLoop();
+    jingle_glue::JingleThreadWrapper::current()->set_send_allowed(true);
+    if (!*thread) {
+      *thread = jingle_glue::JingleThreadWrapper::current();
+      event->Signal();
+    }
+  }
+
+  // PeerConnection threads. signaling_thread_ is created from the "current"
+  // (main) chrome thread.
+  rtc::Thread* signaling_thread_ = nullptr;
+  rtc::Thread* worker_thread_ = nullptr;
+  rtc::Thread* network_thread_ = nullptr;
+  base::Thread chrome_signaling_thread_;
+  base::Optional<base::Thread> chrome_worker_thread_;
+  base::Thread chrome_network_thread_;
+
+  // WaitableEvents for observing thread initialization.
+  base::WaitableEvent init_signaling_event{
+      base::WaitableEvent::ResetPolicy::MANUAL,
+      base::WaitableEvent::InitialState::NOT_SIGNALED};
+  base::WaitableEvent init_worker_event{
+      base::WaitableEvent::ResetPolicy::MANUAL,
+      // If we don't create a separate worker thread, start the event as already
+      // signaled so it doesn't block anything.
+      base::FeatureList::IsEnabled(features::kWebRtcDistinctWorkerThread)
+          ? base::WaitableEvent::InitialState::NOT_SIGNALED
+          : base::WaitableEvent::InitialState::SIGNALED};
+  base::WaitableEvent init_network_event{
+      base::WaitableEvent::ResetPolicy::MANUAL,
+      base::WaitableEvent::InitialState::NOT_SIGNALED};
+
+  THREAD_CHECKER(thread_checker_);
+};
+
+PeerConnectionStaticDeps& StaticDeps() {
+  DEFINE_STATIC_LOCAL(PeerConnectionStaticDeps, instance, ());
+  return instance;
+}
+
+rtc::Thread* GetSignalingThread() {
+  return StaticDeps().GetSignalingThread();
+}
+rtc::Thread* GetWorkerThread() {
+  return StaticDeps().GetWorkerThread();
+}
+rtc::Thread* GetNetworkThread() {
+  return StaticDeps().GetNetworkThread();
+}
+base::Thread& GetChromeSignalingThread() {
+  return StaticDeps().GetChromeSignalingThread();
+}
+base::Thread* GetChromeWorkerThread() {
+  return StaticDeps().GetChromeWorkerThread();
+}
+base::Thread& GetChromeNetworkThread() {
+  return StaticDeps().GetChromeNetworkThread();
+}
+
 }  // namespace
 
-PeerConnectionDependencyFactory::PeerConnectionDependencyFactory(
-    bool create_p2p_socket_dispatcher)
-    : network_manager_(nullptr),
-      p2p_socket_dispatcher_(
-          create_p2p_socket_dispatcher ? new P2PSocketDispatcher() : nullptr),
-      chrome_signaling_thread_("WebRTC_Signaling"),
-      chrome_network_thread_("WebRTC_Network") {
-  if (base::FeatureList::IsEnabled(features::kWebRtcDistinctWorkerThread)) {
-    chrome_worker_thread_.emplace("WebRTC_Worker");
+// static
+const char PeerConnectionDependencyFactory::kSupplementName[] =
+    "PeerConnectionDependencyFactory";
+
+PeerConnectionDependencyFactory& PeerConnectionDependencyFactory::From(
+    ExecutionContext& context) {
+  auto* supplement =
+      Supplement<ExecutionContext>::From<PeerConnectionDependencyFactory>(
+          context);
+  if (!supplement) {
+    supplement = MakeGarbageCollected<PeerConnectionDependencyFactory>(
+        context, PassKey());
+    ProvideTo(context, supplement);
   }
+  return *supplement;
 }
 
-PeerConnectionDependencyFactory::~PeerConnectionDependencyFactory() {
-  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
-  DVLOG(1) << "~PeerConnectionDependencyFactory()";
-  DCHECK(!pc_factory_);
-}
+PeerConnectionDependencyFactory::PeerConnectionDependencyFactory(
+    ExecutionContext& context,
+    PassKey)
+    : Supplement(context),
+      ExecutionContextLifecycleObserver(&context),
+      network_manager_(nullptr),
+      p2p_socket_dispatcher_(P2PSocketDispatcher::From(context)) {}
 
-PeerConnectionDependencyFactory*
-PeerConnectionDependencyFactory::GetInstance() {
-  DEFINE_STATIC_LOCAL(PeerConnectionDependencyFactory, instance,
-                      (/*create_p2p_socket_dispatcher= */ true));
-  return &instance;
-}
+PeerConnectionDependencyFactory::PeerConnectionDependencyFactory()
+    : Supplement(nullptr), ExecutionContextLifecycleObserver(nullptr) {}
+
+PeerConnectionDependencyFactory::~PeerConnectionDependencyFactory() = default;
 
 std::unique_ptr<RTCPeerConnectionHandler>
 PeerConnectionDependencyFactory::CreateRTCPeerConnectionHandler(
@@ -159,23 +307,20 @@
   return pc_factory_;
 }
 
-void PeerConnectionDependencyFactory::WillDestroyCurrentMessageLoop() {
-  CleanupPeerConnectionFactory();
-}
-
 void PeerConnectionDependencyFactory::CreatePeerConnectionFactory() {
+  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
   DCHECK(!pc_factory_.get());
-  DCHECK(!signaling_thread_);
-  DCHECK(!worker_thread_);
-  DCHECK(!network_thread_);
   DCHECK(!network_manager_);
   DCHECK(!socket_factory_);
-  DCHECK(!chrome_signaling_thread_.IsRunning());
-  DCHECK(!chrome_worker_thread_ || !chrome_worker_thread_->IsRunning());
-  DCHECK(!chrome_network_thread_.IsRunning());
 
   DVLOG(1) << "PeerConnectionDependencyFactory::CreatePeerConnectionFactory()";
 
+  StaticDeps().EnsureChromeThreadsStarted();
+  base::WaitableEvent& worker_thread_started_event =
+      StaticDeps().InitializeWorkerThread();
+  StaticDeps().InitializeNetworkThread();
+  StaticDeps().InitializeSignalingThread();
+
 #if BUILDFLAG(RTC_USE_H264) && BUILDFLAG(ENABLE_FFMPEG_VIDEO_DECODERS)
   // Building /w |rtc_use_h264|, is the corresponding run-time feature enabled?
   if (!base::FeatureList::IsEnabled(
@@ -187,11 +332,6 @@
   webrtc::DisableRtcUseH264();
 #endif  // BUILDFLAG(RTC_USE_H264) && BUILDFLAG(ENABLE_FFMPEG_VIDEO_DECODERS)
 
-  base::CurrentThread::Get()->AddDestructionObserver(this);
-  // To allow sending to the signaling/worker threads.
-  jingle_glue::JingleThreadWrapper::EnsureForCurrentMessageLoop();
-  jingle_glue::JingleThreadWrapper::current()->set_send_allowed(true);
-
   EnsureWebRtcAudioDeviceImpl();
 
   // Init SSL, which will be needed by PeerConnection.
@@ -201,22 +341,6 @@
     return;
   }
 
-  base::WaitableEvent start_worker_event(
-      base::WaitableEvent::ResetPolicy::MANUAL,
-      base::WaitableEvent::InitialState::NOT_SIGNALED);
-  if (chrome_worker_thread_) {
-    CHECK(chrome_worker_thread_->Start());
-    PostCrossThreadTask(
-        *chrome_worker_thread_->task_runner().get(), FROM_HERE,
-        CrossThreadBindOnce(
-            &PeerConnectionDependencyFactory::InitializeWorkerThread,
-            CrossThreadUnretained(this), CrossThreadUnretained(&worker_thread_),
-            CrossThreadUnretained(&start_worker_event)));
-  }
-
-  CHECK(chrome_signaling_thread_.Start());
-  CHECK(chrome_network_thread_.Start());
-
   base::WaitableEvent create_network_manager_event(
       base::WaitableEvent::ResetPolicy::MANUAL,
       base::WaitableEvent::InitialState::NOT_SIGNALED);
@@ -226,36 +350,34 @@
           blink::features::kWebRtcHideLocalIpsWithMdns)) {
     // Note that MdnsResponderAdapter is created on the main thread to have
     // access to the connector to the service manager.
+    // TODO(crbug.com/1178670): Pass MojoBindingContext and use its BIB to bind.
     mdns_responder = std::make_unique<MdnsResponderAdapter>();
   }
 #endif  // BUILDFLAG(ENABLE_MDNS)
   PostCrossThreadTask(
-      *chrome_network_thread_.task_runner().get(), FROM_HERE,
+      *GetWebRtcNetworkTaskRunner(), FROM_HERE,
       CrossThreadBindOnce(&PeerConnectionDependencyFactory::
                               CreateIpcNetworkManagerOnNetworkThread,
-                          CrossThreadUnretained(this),
+                          WrapCrossThreadPersistent(this),
                           CrossThreadUnretained(&create_network_manager_event),
-                          std::move(mdns_responder),
-                          CrossThreadUnretained(&network_thread_)));
+                          std::move(mdns_responder)));
 
   create_network_manager_event.Wait();
-  CHECK(network_thread_);
+  CHECK(GetNetworkThread());
 
   // Wait for the worker thread, since `InitializeSignalingThread` needs to
   // refer to `worker_thread_`.
-  if (chrome_worker_thread_) {
-    start_worker_event.Wait();
-    CHECK(worker_thread_);
-  }
+  worker_thread_started_event.Wait();
+  CHECK(!GetChromeWorkerThread() || GetWorkerThread());
 
   base::WaitableEvent start_signaling_event(
       base::WaitableEvent::ResetPolicy::MANUAL,
       base::WaitableEvent::InitialState::NOT_SIGNALED);
   PostCrossThreadTask(
-      *chrome_signaling_thread_.task_runner().get(), FROM_HERE,
+      *GetChromeSignalingThread().task_runner(), FROM_HERE,
       CrossThreadBindOnce(
           &PeerConnectionDependencyFactory::InitializeSignalingThread,
-          CrossThreadUnretained(this),
+          WrapCrossThreadPersistent(this),
           Platform::Current()->GetRenderingColorSpace(),
           Platform::Current()->MediaThreadTaskRunner(),
           CrossThreadUnretained(Platform::Current()->GetGpuFactories()),
@@ -263,7 +385,7 @@
           CrossThreadUnretained(&start_signaling_event)));
 
   start_signaling_event.Wait();
-  CHECK(signaling_thread_);
+  CHECK(GetSignalingThread());
 }
 
 void PeerConnectionDependencyFactory::InitializeSignalingThread(
@@ -272,13 +394,12 @@
     media::GpuVideoAcceleratorFactories* gpu_factories,
     media::DecoderFactory* media_decoder_factory,
     base::WaitableEvent* event) {
-  DCHECK(chrome_signaling_thread_.task_runner()->BelongsToCurrentThread());
-  DCHECK(network_thread_);
-  DCHECK(p2p_socket_dispatcher_.get());
-
-  jingle_glue::JingleThreadWrapper::EnsureForCurrentMessageLoop();
-  jingle_glue::JingleThreadWrapper::current()->set_send_allowed(true);
-  signaling_thread_ = jingle_glue::JingleThreadWrapper::current();
+  DCHECK(GetChromeSignalingThread().task_runner()->BelongsToCurrentThread());
+  DCHECK(GetNetworkThread());
+  // The task to initialize `signaling_thread_` was posted to the same thread,
+  // so there is no need to wait on its event.
+  DCHECK(GetSignalingThread());
+  DCHECK(p2p_socket_dispatcher_);
 
   net::NetworkTrafficAnnotationTag traffic_annotation =
       net::DefineNetworkTrafficAnnotation("webrtc_peer_connection", R"(
@@ -316,8 +437,8 @@
             "block it."
         }
     )");
-  socket_factory_.reset(new IpcPacketSocketFactory(p2p_socket_dispatcher_.get(),
-                                                   traffic_annotation));
+  socket_factory_ = std::make_unique<IpcPacketSocketFactory>(
+      p2p_socket_dispatcher_.Get(), traffic_annotation);
 
   gpu_factories_ = gpu_factories;
   std::unique_ptr<webrtc::VideoEncoderFactory> webrtc_encoder_factory =
@@ -343,9 +464,10 @@
   }
 
   webrtc::PeerConnectionFactoryDependencies pcf_deps;
-  pcf_deps.worker_thread = worker_thread_ ? worker_thread_ : signaling_thread_;
-  pcf_deps.signaling_thread = signaling_thread_;
-  pcf_deps.network_thread = network_thread_;
+  pcf_deps.worker_thread =
+      GetWorkerThread() ? GetWorkerThread() : GetSignalingThread();
+  pcf_deps.signaling_thread = GetSignalingThread();
+  pcf_deps.network_thread = GetNetworkThread();
   pcf_deps.task_queue_factory = CreateWebRtcTaskQueueFactory();
   pcf_deps.call_factory = webrtc::CreateCallFactory();
   pcf_deps.event_log_factory = std::make_unique<webrtc::RtcEventLogFactory>(
@@ -503,8 +625,8 @@
         std::make_unique<blink::EmptyNetworkManager>(network_manager_.get());
   }
   auto port_allocator = std::make_unique<P2PPortAllocator>(
-      p2p_socket_dispatcher_, std::move(network_manager), socket_factory_.get(),
-      port_config, requesting_origin);
+      std::move(network_manager), socket_factory_.get(), port_config,
+      requesting_origin);
   if (IsValidPortRange(min_port, max_port))
     port_allocator->SetPortRange(min_port, max_port);
 
@@ -530,8 +652,8 @@
   if (!PeerConnectionFactoryCreated())
     CreatePeerConnectionFactory();
 
-  return webrtc::VideoTrackSourceProxy::Create(signaling_thread_,
-                                               network_thread_, source)
+  return webrtc::VideoTrackSourceProxy::Create(GetSignalingThread(),
+                                               GetNetworkThread(), source)
       .get();
 }
 
@@ -557,56 +679,47 @@
   return audio_device_.get();
 }
 
-void PeerConnectionDependencyFactory::InitializeWorkerThread(
-    rtc::Thread** thread,
-    base::WaitableEvent* event) {
-  jingle_glue::JingleThreadWrapper::EnsureForCurrentMessageLoop();
-  jingle_glue::JingleThreadWrapper::current()->set_send_allowed(true);
-  *thread = jingle_glue::JingleThreadWrapper::current();
-  event->Signal();
-}
-
 void PeerConnectionDependencyFactory::CreateIpcNetworkManagerOnNetworkThread(
     base::WaitableEvent* event,
-    std::unique_ptr<MdnsResponderAdapter> mdns_responder,
-    rtc::Thread** thread) {
-  DCHECK(chrome_network_thread_.task_runner()->BelongsToCurrentThread());
-
-  jingle_glue::JingleThreadWrapper::EnsureForCurrentMessageLoop();
-  jingle_glue::JingleThreadWrapper::current()->set_send_allowed(true);
-  *thread = jingle_glue::JingleThreadWrapper::current();
+    std::unique_ptr<MdnsResponderAdapter> mdns_responder) {
+  DCHECK(GetChromeNetworkThread().task_runner()->BelongsToCurrentThread());
+  // The task to initialize `network_thread_` was posted to the same thread, so
+  // there is no need to wait on its event.
+  DCHECK(GetNetworkThread());
 
   network_manager_ = std::make_unique<blink::IpcNetworkManager>(
-      p2p_socket_dispatcher_.get(), std::move(mdns_responder));
+      p2p_socket_dispatcher_.Get(), std::move(mdns_responder));
 
   event->Signal();
 }
 
-void PeerConnectionDependencyFactory::DeleteIpcNetworkManager() {
-  DCHECK(chrome_network_thread_.task_runner()->BelongsToCurrentThread());
+void PeerConnectionDependencyFactory::DeleteIpcNetworkManager(
+    base::WaitableEvent* event) {
+  DCHECK(GetChromeNetworkThread().task_runner()->BelongsToCurrentThread());
   network_manager_.reset();
+  event->Signal();
+}
+
+void PeerConnectionDependencyFactory::ContextDestroyed() {
+  CleanupPeerConnectionFactory();
 }
 
 void PeerConnectionDependencyFactory::CleanupPeerConnectionFactory() {
   DVLOG(1) << "PeerConnectionDependencyFactory::CleanupPeerConnectionFactory()";
   pc_factory_ = nullptr;
   if (network_manager_) {
+    base::WaitableEvent event(base::WaitableEvent::ResetPolicy::MANUAL,
+                              base::WaitableEvent::InitialState::NOT_SIGNALED);
     // The network manager needs to free its resources on the thread they were
-    // created, which is the worked thread.
-    if (chrome_network_thread_.IsRunning()) {
-      PostCrossThreadTask(
-          *chrome_network_thread_.task_runner().get(), FROM_HERE,
-          CrossThreadBindOnce(
-              &PeerConnectionDependencyFactory::DeleteIpcNetworkManager,
-              CrossThreadUnretained(this)));
-      // Stopping the thread will wait until all tasks have been
-      // processed before returning. We wait for the above task to finish before
-      // letting the the function continue to avoid any potential race issues.
-      chrome_network_thread_.Stop();
-      DCHECK(!network_manager_);
-    } else {
-      NOTREACHED() << "Worker thread not running.";
-    }
+    // created, which is the network thread.
+    PostCrossThreadTask(
+        *GetWebRtcNetworkTaskRunner(), FROM_HERE,
+        CrossThreadBindOnce(
+            &PeerConnectionDependencyFactory::DeleteIpcNetworkManager,
+            WrapCrossThreadPersistent(this), CrossThreadUnretained(&event)));
+
+    event.Wait();
+    DCHECK(!network_manager_);
   }
 }
 
@@ -618,8 +731,8 @@
 scoped_refptr<base::SingleThreadTaskRunner>
 PeerConnectionDependencyFactory::GetWebRtcNetworkTaskRunner() {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
-  return chrome_network_thread_.IsRunning()
-             ? chrome_network_thread_.task_runner()
+  return GetChromeNetworkThread().IsRunning()
+             ? GetChromeNetworkThread().task_runner()
              : nullptr;
 }
 
@@ -627,8 +740,8 @@
 PeerConnectionDependencyFactory::GetWebRtcSignalingTaskRunner() {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
   EnsureInitialized();
-  return chrome_signaling_thread_.IsRunning()
-             ? chrome_signaling_thread_.task_runner()
+  return GetChromeSignalingThread().IsRunning()
+             ? GetChromeSignalingThread().task_runner()
              : nullptr;
 }
 
@@ -668,4 +781,10 @@
 PeerConnectionDependencyFactory::GetGpuFactories() {
   return gpu_factories_;
 }
+
+void PeerConnectionDependencyFactory::Trace(Visitor* visitor) const {
+  Supplement<ExecutionContext>::Trace(visitor);
+  ExecutionContextLifecycleObserver::Trace(visitor);
+  visitor->Trace(p2p_socket_dispatcher_);
+}
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/peerconnection/peer_connection_dependency_factory.h b/third_party/blink/renderer/modules/peerconnection/peer_connection_dependency_factory.h
index a8806c8..1e2e7f4 100644
--- a/third_party/blink/renderer/modules/peerconnection/peer_connection_dependency_factory.h
+++ b/third_party/blink/renderer/modules/peerconnection/peer_connection_dependency_factory.h
@@ -7,11 +7,15 @@
 
 #include "base/macros.h"
 #include "base/single_thread_task_runner.h"
-#include "base/task/current_thread.h"
 #include "base/threading/thread.h"
 #include "base/threading/thread_checker.h"
+#include "base/types/pass_key.h"
+#include "third_party/blink/renderer/core/execution_context/execution_context.h"
+#include "third_party/blink/renderer/core/execution_context/execution_context_lifecycle_observer.h"
 #include "third_party/blink/renderer/modules/modules_export.h"
 #include "third_party/blink/renderer/platform/bindings/exception_state.h"
+#include "third_party/blink/renderer/platform/mojo/mojo_binding_context.h"
+#include "third_party/blink/renderer/platform/supplementable.h"
 #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
 #include "third_party/webrtc/api/peer_connection_interface.h"
 
@@ -49,11 +53,17 @@
 
 // Object factory for RTC PeerConnections.
 class MODULES_EXPORT PeerConnectionDependencyFactory
-    : base::CurrentThread::DestructionObserver {
+    : public GarbageCollected<PeerConnectionDependencyFactory>,
+      public Supplement<ExecutionContext>,
+      public ExecutionContextLifecycleObserver {
  public:
-  ~PeerConnectionDependencyFactory() override;
+  static const char kSupplementName[];
 
-  static PeerConnectionDependencyFactory* GetInstance();
+  static PeerConnectionDependencyFactory& From(ExecutionContext& context);
+  PeerConnectionDependencyFactory(
+      ExecutionContext& context,
+      base::PassKey<PeerConnectionDependencyFactory>);
+  ~PeerConnectionDependencyFactory() override;
 
   // Create a RTCPeerConnectionHandler object.
   std::unique_ptr<RTCPeerConnectionHandler> CreateRTCPeerConnectionHandler(
@@ -120,8 +130,11 @@
 
   media::GpuVideoAcceleratorFactories* GetGpuFactories();
 
+  void Trace(Visitor*) const override;
+
  protected:
-  PeerConnectionDependencyFactory(bool create_p2p_socket_dispatcher);
+  // Ctor for tests.
+  PeerConnectionDependencyFactory();
 
   virtual const scoped_refptr<webrtc::PeerConnectionFactoryInterface>&
   GetPcFactory();
@@ -131,10 +144,8 @@
   void EnsureWebRtcAudioDeviceImpl();
 
  private:
-  // Implement base::CurrentThread::DestructionObserver.
-  // This makes sure the libjingle PeerConnectionFactory is released before
-  // the renderer message loop is destroyed.
-  void WillDestroyCurrentMessageLoop() override;
+  // ExecutionContextLifecycleObserver overrides:
+  void ContextDestroyed() override;
 
   // Functions related to Stun probing trial to determine how fast we could send
   // Stun request without being dropped by NAT.
@@ -151,16 +162,13 @@
       media::DecoderFactory* media_decoder_factory,
       base::WaitableEvent* event);
 
-  void InitializeWorkerThread(rtc::Thread** thread, base::WaitableEvent* event);
-
   void CreateIpcNetworkManagerOnNetworkThread(
       base::WaitableEvent* event,
-      std::unique_ptr<MdnsResponderAdapter> mdns_responder,
-      rtc::Thread** thread);
-  void DeleteIpcNetworkManager();
+      std::unique_ptr<MdnsResponderAdapter> mdns_responder);
+  void DeleteIpcNetworkManager(base::WaitableEvent* event);
   void CleanupPeerConnectionFactory();
 
-  // network_manager_ must be deleted on the worker thread. The network manager
+  // network_manager_ must be deleted on the network thread. The network manager
   // uses |p2p_socket_dispatcher_|.
   std::unique_ptr<blink::IpcNetworkManager> network_manager_;
   std::unique_ptr<IpcPacketSocketFactory> socket_factory_;
@@ -168,21 +176,12 @@
   scoped_refptr<webrtc::PeerConnectionFactoryInterface> pc_factory_;
 
   // Dispatches all P2P sockets.
-  scoped_refptr<P2PSocketDispatcher> p2p_socket_dispatcher_;
+  Member<P2PSocketDispatcher> p2p_socket_dispatcher_;
 
   scoped_refptr<blink::WebRtcAudioDeviceImpl> audio_device_;
 
   media::GpuVideoAcceleratorFactories* gpu_factories_;
 
-  // PeerConnection threads. signaling_thread_ is created from the
-  // "current" chrome thread.
-  rtc::Thread* signaling_thread_ = nullptr;
-  rtc::Thread* worker_thread_ = nullptr;
-  rtc::Thread* network_thread_ = nullptr;
-  base::Thread chrome_signaling_thread_;
-  base::Optional<base::Thread> chrome_worker_thread_;
-  base::Thread chrome_network_thread_;
-
   THREAD_CHECKER(thread_checker_);
 
   DISALLOW_COPY_AND_ASSIGN(PeerConnectionDependencyFactory);
diff --git a/third_party/blink/renderer/modules/peerconnection/peer_connection_dependency_factory_test.cc b/third_party/blink/renderer/modules/peerconnection/peer_connection_dependency_factory_test.cc
index 058ed4f..676ff19 100644
--- a/third_party/blink/renderer/modules/peerconnection/peer_connection_dependency_factory_test.cc
+++ b/third_party/blink/renderer/modules/peerconnection/peer_connection_dependency_factory_test.cc
@@ -13,12 +13,12 @@
 class PeerConnectionDependencyFactoryTest : public ::testing::Test {
  public:
   void SetUp() override {
-    dependency_factory_.reset(new blink::MockPeerConnectionDependencyFactory());
+    dependency_factory_ =
+        MakeGarbageCollected<MockPeerConnectionDependencyFactory>();
   }
 
  protected:
-  std::unique_ptr<blink::MockPeerConnectionDependencyFactory>
-      dependency_factory_;
+  Persistent<MockPeerConnectionDependencyFactory> dependency_factory_;
 };
 
 TEST_F(PeerConnectionDependencyFactoryTest, CreateRTCPeerConnectionHandler) {
diff --git a/third_party/blink/renderer/modules/peerconnection/peer_connection_tracker.cc b/third_party/blink/renderer/modules/peerconnection/peer_connection_tracker.cc
index f30455c..d7af394 100644
--- a/third_party/blink/renderer/modules/peerconnection/peer_connection_tracker.cc
+++ b/third_party/blink/renderer/modules/peerconnection/peer_connection_tracker.cc
@@ -738,7 +738,8 @@
 PeerConnectionTracker::PeerConnectionTracker(
     mojo::Remote<blink::mojom::blink::PeerConnectionTrackerHost> host,
     scoped_refptr<base::SingleThreadTaskRunner> main_thread_task_runner)
-    : peer_connection_tracker_host_(std::move(host)),
+    : Supplement(nullptr),
+      peer_connection_tracker_host_(std::move(host)),
       main_thread_task_runner_(std::move(main_thread_task_runner)) {}
 
 PeerConnectionTracker::~PeerConnectionTracker() {}
diff --git a/third_party/blink/renderer/modules/peerconnection/peer_connection_tracker_test.cc b/third_party/blink/renderer/modules/peerconnection/peer_connection_tracker_test.cc
index 35c34ce..8c54721 100644
--- a/third_party/blink/renderer/modules/peerconnection/peer_connection_tracker_test.cc
+++ b/third_party/blink/renderer/modules/peerconnection/peer_connection_tracker_test.cc
@@ -16,6 +16,7 @@
 #include "third_party/blink/renderer/modules/peerconnection/mock_peer_connection_dependency_factory.h"
 #include "third_party/blink/renderer/modules/peerconnection/mock_rtc_peer_connection_handler_client.h"
 #include "third_party/blink/renderer/modules/peerconnection/rtc_peer_connection_handler.h"
+#include "third_party/blink/renderer/platform/heap/impl/heap.h"
 #include "third_party/blink/renderer/platform/mediastream/media_constraints.h"
 #include "third_party/blink/renderer/platform/peerconnection/rtc_offer_options_platform.h"
 #include "third_party/blink/renderer/platform/peerconnection/rtc_rtp_receiver_platform.h"
@@ -123,17 +124,23 @@
 class MockPeerConnectionHandler : public RTCPeerConnectionHandler {
  public:
   MockPeerConnectionHandler()
-      : RTCPeerConnectionHandler(
-            &client_,
-            &dependency_factory_,
-            blink::scheduler::GetSingleThreadTaskRunnerForTesting(),
-            /*force_encoded_audio_insertable_streams=*/false,
-            /*force_encoded_video_insertable_streams=*/false) {}
+      : MockPeerConnectionHandler(
+            MakeGarbageCollected<MockPeerConnectionDependencyFactory>()) {}
   MOCK_METHOD0(CloseClientPeerConnection, void());
   MOCK_METHOD1(OnThermalStateChange, void(mojom::blink::DeviceThermalState));
 
  private:
-  blink::MockPeerConnectionDependencyFactory dependency_factory_;
+  explicit MockPeerConnectionHandler(
+      MockPeerConnectionDependencyFactory* factory)
+      : RTCPeerConnectionHandler(
+            &client_,
+            factory,
+            blink::scheduler::GetSingleThreadTaskRunnerForTesting(),
+            /*force_encoded_audio_insertable_streams=*/false,
+            /*force_encoded_video_insertable_streams=*/false),
+        factory_(factory) {}
+
+  Persistent<MockPeerConnectionDependencyFactory> factory_;
   MockRTCPeerConnectionHandlerClient client_;
 };
 
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_certificate_generator.cc b/third_party/blink/renderer/modules/peerconnection/rtc_certificate_generator.cc
index 77c2a8c..c44ff7e7 100644
--- a/third_party/blink/renderer/modules/peerconnection/rtc_certificate_generator.cc
+++ b/third_party/blink/renderer/modules/peerconnection/rtc_certificate_generator.cc
@@ -10,6 +10,7 @@
 #include "base/bind.h"
 #include "base/macros.h"
 #include "base/single_thread_task_runner.h"
+#include "third_party/blink/renderer/core/execution_context/execution_context.h"
 #include "third_party/blink/renderer/modules/peerconnection/peer_connection_dependency_factory.h"
 #include "third_party/blink/renderer/platform/wtf/thread_safe_ref_counted.h"
 #include "third_party/webrtc/api/scoped_refptr.h"
@@ -86,15 +87,16 @@
     const rtc::KeyParams& key_params,
     const absl::optional<uint64_t>& expires_ms,
     blink::RTCCertificateCallback completion_callback,
+    ExecutionContext& context,
     scoped_refptr<base::SingleThreadTaskRunner> task_runner) {
   DCHECK(key_params.IsValid());
-  auto* pc_dependency_factory =
-      blink::PeerConnectionDependencyFactory::GetInstance();
-  pc_dependency_factory->EnsureInitialized();
+  auto& pc_dependency_factory =
+      blink::PeerConnectionDependencyFactory::From(context);
+  pc_dependency_factory.EnsureInitialized();
 
   scoped_refptr<RTCCertificateGeneratorRequest> request =
       base::MakeRefCounted<RTCCertificateGeneratorRequest>(
-          task_runner, pc_dependency_factory->GetWebRtcNetworkTaskRunner());
+          task_runner, pc_dependency_factory.GetWebRtcNetworkTaskRunner());
   request->GenerateCertificateAsync(key_params, expires_ms,
                                     std::move(completion_callback));
 }
@@ -104,18 +106,22 @@
 void RTCCertificateGenerator::GenerateCertificate(
     const rtc::KeyParams& key_params,
     blink::RTCCertificateCallback completion_callback,
+    ExecutionContext& context,
     scoped_refptr<base::SingleThreadTaskRunner> task_runner) {
-  GenerateCertificateWithOptionalExpiration(
-      key_params, absl::nullopt, std::move(completion_callback), task_runner);
+  GenerateCertificateWithOptionalExpiration(key_params, absl::nullopt,
+                                            std::move(completion_callback),
+                                            context, task_runner);
 }
 
 void RTCCertificateGenerator::GenerateCertificateWithExpiration(
     const rtc::KeyParams& key_params,
     uint64_t expires_ms,
     blink::RTCCertificateCallback completion_callback,
+    ExecutionContext& context,
     scoped_refptr<base::SingleThreadTaskRunner> task_runner) {
-  GenerateCertificateWithOptionalExpiration(
-      key_params, expires_ms, std::move(completion_callback), task_runner);
+  GenerateCertificateWithOptionalExpiration(key_params, expires_ms,
+                                            std::move(completion_callback),
+                                            context, task_runner);
 }
 
 bool RTCCertificateGenerator::IsSupportedKeyParams(
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_certificate_generator.h b/third_party/blink/renderer/modules/peerconnection/rtc_certificate_generator.h
index db8464f..1c0936c6 100644
--- a/third_party/blink/renderer/modules/peerconnection/rtc_certificate_generator.h
+++ b/third_party/blink/renderer/modules/peerconnection/rtc_certificate_generator.h
@@ -18,6 +18,8 @@
 
 namespace blink {
 
+class ExecutionContext;
+
 using RTCCertificateCallback =
     base::OnceCallback<void(rtc::scoped_refptr<rtc::RTCCertificate>)>;
 
@@ -35,11 +37,13 @@
   void GenerateCertificate(
       const rtc::KeyParams& key_params,
       blink::RTCCertificateCallback completion_callback,
+      ExecutionContext& context,
       scoped_refptr<base::SingleThreadTaskRunner> task_runner);
   void GenerateCertificateWithExpiration(
       const rtc::KeyParams& key_params,
       uint64_t expires_ms,
       blink::RTCCertificateCallback completion_callback,
+      ExecutionContext& context,
       scoped_refptr<base::SingleThreadTaskRunner> task_runner);
 
   // Determines if the parameters are supported by |GenerateCertificate|.
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_dtls_transport.cc b/third_party/blink/renderer/modules/peerconnection/rtc_dtls_transport.cc
index f68ab13..94b752fc 100644
--- a/third_party/blink/renderer/modules/peerconnection/rtc_dtls_transport.cc
+++ b/third_party/blink/renderer/modules/peerconnection/rtc_dtls_transport.cc
@@ -52,9 +52,8 @@
   scoped_refptr<base::SingleThreadTaskRunner> proxy_thread =
       frame->GetTaskRunner(TaskType::kNetworking);
   scoped_refptr<base::SingleThreadTaskRunner> host_thread =
-      PeerConnectionDependencyFactory::GetInstance()
-          ->GetWebRtcNetworkTaskRunner();
-
+      PeerConnectionDependencyFactory::From(*context)
+          .GetWebRtcNetworkTaskRunner();
   return DtlsTransportProxy::Create(*frame, proxy_thread, host_thread,
                                     native_transport, delegate);
 }
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_ice_transport.cc b/third_party/blink/renderer/modules/peerconnection/rtc_ice_transport.cc
index c8a127df..8e8d640b 100644
--- a/third_party/blink/renderer/modules/peerconnection/rtc_ice_transport.cc
+++ b/third_party/blink/renderer/modules/peerconnection/rtc_ice_transport.cc
@@ -86,10 +86,10 @@
   scoped_refptr<base::SingleThreadTaskRunner> proxy_thread =
       context->GetTaskRunner(TaskType::kNetworking);
 
-  PeerConnectionDependencyFactory::GetInstance()->EnsureInitialized();
+  PeerConnectionDependencyFactory::From(*context).EnsureInitialized();
   scoped_refptr<base::SingleThreadTaskRunner> host_thread =
-      PeerConnectionDependencyFactory::GetInstance()
-          ->GetWebRtcNetworkTaskRunner();
+      PeerConnectionDependencyFactory::From(*context)
+          .GetWebRtcNetworkTaskRunner();
   return MakeGarbageCollected<RTCIceTransport>(
       context, std::move(proxy_thread), std::move(host_thread),
       std::make_unique<DtlsIceTransportAdapterCrossThreadFactory>(
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection.cc b/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection.cc
index 0d0337a..08a025bd 100644
--- a/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection.cc
+++ b/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection.cc
@@ -800,8 +800,8 @@
         std::move(g_create_rpc_peer_connection_handler_callback_.Get()).Run();
   } else {
     peer_handler_ =
-        PeerConnectionDependencyFactory::GetInstance()
-            ->CreateRTCPeerConnectionHandler(
+        PeerConnectionDependencyFactory::From(*context)
+            .CreateRTCPeerConnectionHandler(
                 this, window->GetTaskRunner(TaskType::kInternalMedia),
                 force_encoded_audio_insertable_streams_,
                 force_encoded_video_insertable_streams_);
@@ -1890,11 +1890,12 @@
           ->GetTaskRunner(blink::TaskType::kInternalMedia);
   if (!expires) {
     certificate_generator->GenerateCertificate(
-        key_params.value(), std::move(completion_callback), task_runner);
+        key_params.value(), std::move(completion_callback),
+        *ExecutionContext::From(script_state), task_runner);
   } else {
     certificate_generator->GenerateCertificateWithExpiration(
         key_params.value(), expires.value(), std::move(completion_callback),
-        task_runner);
+        *ExecutionContext::From(script_state), task_runner);
   }
 
   return promise;
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection_handler.cc b/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection_handler.cc
index 9265e14..ef34d86f 100644
--- a/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection_handler.cc
+++ b/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection_handler.cc
@@ -1980,6 +1980,7 @@
 
 bool RTCPeerConnectionHandler::RemoveTrackPlanB(
     blink::RTCRtpSenderPlatform* web_sender) {
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   DCHECK_EQ(configuration_.sdp_semantics, webrtc::SdpSemantics::kPlanB);
   auto* track = web_sender->Track();
   auto it = FindSender(web_sender->Id());
@@ -2324,6 +2325,7 @@
 void RTCPeerConnectionHandler::TrackIceConnectionStateChange(
     RTCPeerConnectionHandler::IceConnectionStateVersion version,
     webrtc::PeerConnectionInterface::IceConnectionState state) {
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   if (!peer_connection_tracker_)
     return;
   switch (version) {
@@ -2483,6 +2485,7 @@
     webrtc::PeerConnectionInterface::SignalingState signaling_state,
     std::vector<blink::RtpTransceiverState> transceiver_states,
     bool is_remote_description) {
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   DCHECK_EQ(configuration_.sdp_semantics, webrtc::SdpSemantics::kUnifiedPlan);
   Vector<std::unique_ptr<RTCRtpTransceiverPlatform>> platform_transceivers(
       SafeCast<WTF::wtf_size_t>(transceiver_states.size()));
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection_handler.h b/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection_handler.h
index 0e2e425e..44841dc 100644
--- a/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection_handler.h
+++ b/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection_handler.h
@@ -464,9 +464,7 @@
   webrtc::PeerConnectionInterface::SignalingState previous_signaling_state_ =
       webrtc::PeerConnectionInterface::kStable;
 
-  // |dependency_factory_| is a raw pointer, and is valid for the lifetime of
-  // RenderThreadImpl.
-  blink::PeerConnectionDependencyFactory* const dependency_factory_ = nullptr;
+  const Persistent<PeerConnectionDependencyFactory> dependency_factory_;
 
   blink::WebLocalFrame* frame_ = nullptr;
 
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection_handler_test.cc b/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection_handler_test.cc
index dec4d8ee..6a625467 100644
--- a/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection_handler_test.cc
+++ b/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection_handler_test.cc
@@ -33,6 +33,7 @@
 #include "third_party/blink/public/platform/web_url.h"
 #include "third_party/blink/public/web/web_heap.h"
 #include "third_party/blink/renderer/core/frame/local_frame.h"
+#include "third_party/blink/renderer/core/testing/sim/sim_test.h"
 #include "third_party/blink/renderer/modules/mediastream/media_stream_video_track.h"
 #include "third_party/blink/renderer/modules/mediastream/mock_media_stream_video_source.h"
 #include "third_party/blink/renderer/modules/mediastream/processed_local_audio_source.h"
@@ -282,18 +283,19 @@
     return native_peer_connection()->observer();
   }
 
-  bool HasThermalUmaListner() const { return thermal_uma_listener(); }
+  bool HasThermalUmaListener() const { return thermal_uma_listener(); }
 };
 
-class RTCPeerConnectionHandlerTest : public ::testing::Test {
+class RTCPeerConnectionHandlerTest : public SimTest {
  public:
   RTCPeerConnectionHandlerTest() : mock_peer_connection_(nullptr) {}
 
   void SetUp() override {
+    SimTest::SetUp();
     mock_client_ =
         std::make_unique<NiceMock<MockRTCPeerConnectionHandlerClient>>();
     mock_dependency_factory_ =
-        std::make_unique<blink::MockPeerConnectionDependencyFactory>();
+        MakeGarbageCollected<MockPeerConnectionDependencyFactory>();
 
     pc_handler_ = CreateRTCPeerConnectionHandlerUnderTest();
     mock_tracker_ = MakeGarbageCollected<NiceMock<MockPeerConnectionTracker>>();
@@ -309,6 +311,7 @@
   }
 
   void TearDown() override {
+    SimTest::TearDown();
     pc_handler_ = nullptr;
     mock_tracker_ = nullptr;
     mock_dependency_factory_ = nullptr;
@@ -319,7 +322,7 @@
   std::unique_ptr<RTCPeerConnectionHandlerUnderTest>
   CreateRTCPeerConnectionHandlerUnderTest() {
     return std::make_unique<RTCPeerConnectionHandlerUnderTest>(
-        mock_client_.get(), mock_dependency_factory_.get());
+        mock_client_.get(), mock_dependency_factory_.Get());
   }
 
   // Creates a WebKit local MediaStream.
@@ -330,7 +333,7 @@
         audio_track_label, MediaStreamSource::kTypeAudio,
         String::FromUTF8("audio_track"), false /* remote */);
     auto processed_audio_source = std::make_unique<ProcessedLocalAudioSource>(
-        nullptr /* consumer_web_frame is N/A for non-browser tests */,
+        *LocalFrameRoot().GetFrame(),
         MediaStreamDevice(blink::mojom::MediaStreamType::DEVICE_AUDIO_CAPTURE,
                           "mock_device_id", "Mock device",
                           media::AudioParameters::kAudioCDSampleRate,
@@ -584,8 +587,7 @@
   ScopedTestingPlatformSupport<AudioCapturerSourceTestingPlatformSupport>
       webrtc_audio_device_platform_support_;
   std::unique_ptr<MockRTCPeerConnectionHandlerClient> mock_client_;
-  std::unique_ptr<blink::MockPeerConnectionDependencyFactory>
-      mock_dependency_factory_;
+  Persistent<MockPeerConnectionDependencyFactory> mock_dependency_factory_;
   Persistent<NiceMock<MockPeerConnectionTracker>> mock_tracker_;
   std::unique_ptr<RTCPeerConnectionHandlerUnderTest> pc_handler_;
 
@@ -1281,7 +1283,7 @@
   for (bool force_encoded_audio_insertable_streams : {true, false}) {
     for (bool force_encoded_video_insertable_streams : {true, false}) {
       auto handler = std::make_unique<RTCPeerConnectionHandlerUnderTest>(
-          mock_client_.get(), mock_dependency_factory_.get(),
+          mock_client_.get(), mock_dependency_factory_.Get(),
           force_encoded_audio_insertable_streams,
           force_encoded_video_insertable_streams);
       EXPECT_EQ(handler->force_encoded_audio_insertable_streams(),
@@ -1349,10 +1351,10 @@
 TEST_F(RTCPeerConnectionHandlerTest,
        ThermalStateUmaListenerCreatedWhenVideoStreamAdded) {
   base::HistogramTester histogram;
-  EXPECT_FALSE(pc_handler_->HasThermalUmaListner());
+  EXPECT_FALSE(pc_handler_->HasThermalUmaListener());
   MediaStreamDescriptor* local_stream = CreateLocalMediaStream("local_stream");
   EXPECT_TRUE(AddStream(local_stream));
-  EXPECT_TRUE(pc_handler_->HasThermalUmaListner());
+  EXPECT_TRUE(pc_handler_->HasThermalUmaListener());
 }
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_rtp_receiver.cc b/third_party/blink/renderer/modules/peerconnection/rtc_rtp_receiver.cc
index e654738..cf768997 100644
--- a/third_party/blink/renderer/modules/peerconnection/rtc_rtp_receiver.cc
+++ b/third_party/blink/renderer/modules/peerconnection/rtc_rtp_receiver.cc
@@ -290,8 +290,8 @@
       HeapVector<Member<RTCRtpHeaderExtensionCapability>>());
 
   std::unique_ptr<webrtc::RtpCapabilities> rtc_capabilities =
-      PeerConnectionDependencyFactory::GetInstance()->GetReceiverCapabilities(
-          kind);
+      PeerConnectionDependencyFactory::From(*ExecutionContext::From(state))
+          .GetReceiverCapabilities(kind);
 
   HeapVector<Member<RTCRtpCodecCapability>> codecs;
   codecs.ReserveInitialCapacity(
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_rtp_receiver_impl_test.cc b/third_party/blink/renderer/modules/peerconnection/rtc_rtp_receiver_impl_test.cc
index a29e20e..04dce62 100644
--- a/third_party/blink/renderer/modules/peerconnection/rtc_rtp_receiver_impl_test.cc
+++ b/third_party/blink/renderer/modules/peerconnection/rtc_rtp_receiver_impl_test.cc
@@ -32,12 +32,13 @@
 class RTCRtpReceiverImplTest : public ::testing::Test {
  public:
   void SetUp() override {
-    dependency_factory_.reset(new blink::MockPeerConnectionDependencyFactory());
+    dependency_factory_ =
+        MakeGarbageCollected<MockPeerConnectionDependencyFactory>();
     main_thread_ = blink::scheduler::GetSingleThreadTaskRunnerForTesting();
     track_map_ = base::MakeRefCounted<blink::WebRtcMediaStreamTrackAdapterMap>(
-        dependency_factory_.get(), main_thread_);
+        dependency_factory_.Get(), main_thread_);
     peer_connection_ = new rtc::RefCountedObject<blink::MockPeerConnectionImpl>(
-        dependency_factory_.get(), nullptr);
+        dependency_factory_.Get(), nullptr);
   }
 
   void TearDown() override {
@@ -106,8 +107,7 @@
 
   ScopedTestingPlatformSupport<IOTaskRunnerTestingPlatformSupport> platform_;
 
-  std::unique_ptr<blink::MockPeerConnectionDependencyFactory>
-      dependency_factory_;
+  Persistent<blink::MockPeerConnectionDependencyFactory> dependency_factory_;
   scoped_refptr<base::SingleThreadTaskRunner> main_thread_;
   scoped_refptr<blink::WebRtcMediaStreamTrackAdapterMap> track_map_;
   rtc::scoped_refptr<blink::MockPeerConnectionImpl> peer_connection_;
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_rtp_sender.cc b/third_party/blink/renderer/modules/peerconnection/rtc_rtp_sender.cc
index c9a9b8f..4fac1cd6 100644
--- a/third_party/blink/renderer/modules/peerconnection/rtc_rtp_sender.cc
+++ b/third_party/blink/renderer/modules/peerconnection/rtc_rtp_sender.cc
@@ -736,8 +736,8 @@
       HeapVector<Member<RTCRtpHeaderExtensionCapability>>());
 
   std::unique_ptr<webrtc::RtpCapabilities> rtc_capabilities =
-      PeerConnectionDependencyFactory::GetInstance()->GetSenderCapabilities(
-          kind);
+      PeerConnectionDependencyFactory::From(*ExecutionContext::From(state))
+          .GetSenderCapabilities(kind);
 
   HeapVector<Member<RTCRtpCodecCapability>> codecs;
   codecs.ReserveInitialCapacity(
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_rtp_sender_impl_test.cc b/third_party/blink/renderer/modules/peerconnection/rtc_rtp_sender_impl_test.cc
index 1248caa3..ae47b8b1 100644
--- a/third_party/blink/renderer/modules/peerconnection/rtc_rtp_sender_impl_test.cc
+++ b/third_party/blink/renderer/modules/peerconnection/rtc_rtp_sender_impl_test.cc
@@ -19,6 +19,7 @@
 #include "third_party/blink/renderer/modules/peerconnection/mock_peer_connection_impl.h"
 #include "third_party/blink/renderer/modules/peerconnection/test_webrtc_stats_report_obtainer.h"
 #include "third_party/blink/renderer/modules/peerconnection/webrtc_media_stream_track_adapter_map.h"
+#include "third_party/blink/renderer/platform/heap/impl/heap.h"
 #include "third_party/blink/renderer/platform/mediastream/media_stream_audio_source.h"
 #include "third_party/blink/renderer/platform/mediastream/media_stream_component.h"
 #include "third_party/blink/renderer/platform/mediastream/media_stream_source.h"
@@ -37,12 +38,13 @@
 class RTCRtpSenderImplTest : public ::testing::Test {
  public:
   void SetUp() override {
-    dependency_factory_.reset(new blink::MockPeerConnectionDependencyFactory());
+    dependency_factory_ =
+        MakeGarbageCollected<MockPeerConnectionDependencyFactory>();
     main_thread_ = blink::scheduler::GetSingleThreadTaskRunnerForTesting();
     track_map_ = base::MakeRefCounted<blink::WebRtcMediaStreamTrackAdapterMap>(
-        dependency_factory_.get(), main_thread_);
+        dependency_factory_.Get(), main_thread_);
     peer_connection_ = new rtc::RefCountedObject<blink::MockPeerConnectionImpl>(
-        dependency_factory_.get(), nullptr);
+        dependency_factory_.Get(), nullptr);
     mock_webrtc_sender_ = new rtc::RefCountedObject<webrtc::MockRtpSender>();
   }
 
@@ -142,8 +144,7 @@
 
   ScopedTestingPlatformSupport<IOTaskRunnerTestingPlatformSupport> platform_;
 
-  std::unique_ptr<blink::MockPeerConnectionDependencyFactory>
-      dependency_factory_;
+  Persistent<MockPeerConnectionDependencyFactory> dependency_factory_;
   scoped_refptr<base::SingleThreadTaskRunner> main_thread_;
   scoped_refptr<blink::WebRtcMediaStreamTrackAdapterMap> track_map_;
   rtc::scoped_refptr<blink::MockPeerConnectionImpl> peer_connection_;
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_rtp_transceiver_impl_test.cc b/third_party/blink/renderer/modules/peerconnection/rtc_rtp_transceiver_impl_test.cc
index f9c39fe..5f1a44f 100644
--- a/third_party/blink/renderer/modules/peerconnection/rtc_rtp_transceiver_impl_test.cc
+++ b/third_party/blink/renderer/modules/peerconnection/rtc_rtp_transceiver_impl_test.cc
@@ -33,12 +33,13 @@
 class RTCRtpTransceiverImplTest : public ::testing::Test {
  public:
   void SetUp() override {
-    dependency_factory_.reset(new blink::MockPeerConnectionDependencyFactory());
+    dependency_factory_ =
+        MakeGarbageCollected<MockPeerConnectionDependencyFactory>();
     main_task_runner_ = blink::scheduler::GetSingleThreadTaskRunnerForTesting();
     track_map_ = base::MakeRefCounted<blink::WebRtcMediaStreamTrackAdapterMap>(
-        dependency_factory_.get(), main_task_runner_);
+        dependency_factory_.Get(), main_task_runner_);
     peer_connection_ = new rtc::RefCountedObject<blink::MockPeerConnectionImpl>(
-        dependency_factory_.get(), nullptr);
+        dependency_factory_.Get(), nullptr);
   }
 
   void TearDown() override {
@@ -179,8 +180,7 @@
   ScopedTestingPlatformSupport<IOTaskRunnerTestingPlatformSupport> platform_;
 
  protected:
-  std::unique_ptr<blink::MockPeerConnectionDependencyFactory>
-      dependency_factory_;
+  Persistent<MockPeerConnectionDependencyFactory> dependency_factory_;
   scoped_refptr<base::SingleThreadTaskRunner> main_task_runner_;
   scoped_refptr<blink::WebRtcMediaStreamTrackAdapterMap> track_map_;
   rtc::scoped_refptr<blink::MockPeerConnectionImpl> peer_connection_;
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_sctp_transport.cc b/third_party/blink/renderer/modules/peerconnection/rtc_sctp_transport.cc
index 2fedeb93..9bb3c0f 100644
--- a/third_party/blink/renderer/modules/peerconnection/rtc_sctp_transport.cc
+++ b/third_party/blink/renderer/modules/peerconnection/rtc_sctp_transport.cc
@@ -64,8 +64,8 @@
     : RTCSctpTransport(context,
                        native_transport,
                        context->GetTaskRunner(TaskType::kNetworking),
-                       PeerConnectionDependencyFactory::GetInstance()
-                           ->GetWebRtcNetworkTaskRunner()) {}
+                       PeerConnectionDependencyFactory::From(*context)
+                           .GetWebRtcNetworkTaskRunner()) {}
 
 RTCSctpTransport::RTCSctpTransport(
     ExecutionContext* context,
diff --git a/third_party/blink/renderer/modules/peerconnection/transceiver_state_surfacer_test.cc b/third_party/blink/renderer/modules/peerconnection/transceiver_state_surfacer_test.cc
index 3fa8c41..faa1b1bd 100644
--- a/third_party/blink/renderer/modules/peerconnection/transceiver_state_surfacer_test.cc
+++ b/third_party/blink/renderer/modules/peerconnection/transceiver_state_surfacer_test.cc
@@ -43,13 +43,14 @@
 class TransceiverStateSurfacerTest : public ::testing::Test {
  public:
   void SetUp() override {
-    dependency_factory_.reset(new blink::MockPeerConnectionDependencyFactory());
+    dependency_factory_ =
+        MakeGarbageCollected<MockPeerConnectionDependencyFactory>();
     main_task_runner_ = blink::scheduler::GetSingleThreadTaskRunnerForTesting();
     track_adapter_map_ =
         base::MakeRefCounted<blink::WebRtcMediaStreamTrackAdapterMap>(
-            dependency_factory_.get(), main_task_runner_);
-    surfacer_.reset(new TransceiverStateSurfacer(main_task_runner_,
-                                                 signaling_task_runner()));
+            dependency_factory_.Get(), main_task_runner_);
+    surfacer_ = std::make_unique<TransceiverStateSurfacer>(
+        main_task_runner_, signaling_task_runner());
     DummyExceptionStateForTesting exception_state;
     peer_connection_ = dependency_factory_->CreatePeerConnection(
         webrtc::PeerConnectionInterface::RTCConfiguration(), nullptr, nullptr,
@@ -275,7 +276,7 @@
 
  protected:
   scoped_refptr<webrtc::PeerConnectionInterface> peer_connection_;
-  std::unique_ptr<blink::MockPeerConnectionDependencyFactory>
+  CrossThreadPersistent<MockPeerConnectionDependencyFactory>
       dependency_factory_;
   scoped_refptr<base::SingleThreadTaskRunner> main_task_runner_;
   scoped_refptr<blink::WebRtcMediaStreamTrackAdapterMap> track_adapter_map_;
diff --git a/third_party/blink/renderer/modules/peerconnection/webrtc_media_stream_track_adapter.h b/third_party/blink/renderer/modules/peerconnection/webrtc_media_stream_track_adapter.h
index 405267b0..4d7f039 100644
--- a/third_party/blink/renderer/modules/peerconnection/webrtc_media_stream_track_adapter.h
+++ b/third_party/blink/renderer/modules/peerconnection/webrtc_media_stream_track_adapter.h
@@ -27,6 +27,8 @@
 // There are different sinks/adapters used whether the track is local or remote
 // and whether it is an audio or video track; this adapter hides that fact and
 // lets you use a single class for any type of track.
+// The adapter may be created and used from either the main thread or the
+// webrtc signaling thread.
 class MODULES_EXPORT WebRtcMediaStreamTrackAdapter
     : public WTF::ThreadSafeRefCounted<WebRtcMediaStreamTrackAdapter,
                                        WebRtcMediaStreamTrackAdapterTraits> {
@@ -108,9 +110,10 @@
   void UnregisterRemoteAudioTrackAdapterOnSignalingThread();
   void FinalizeRemoteTrackDisposingOnMainThread();
 
-  // Pointer to a |PeerConnectionDependencyFactory| owned by the |RenderThread|.
-  // It's valid for the lifetime of |RenderThread|.
-  blink::PeerConnectionDependencyFactory* const factory_;
+  // `factory_` is only accessed from the main thread (which owns it), but
+  // `this` may be constructed by the signaling thread (for remote tracks),
+  // making it impossible to construct a `Persistent`.
+  const CrossThreadPersistent<PeerConnectionDependencyFactory> factory_;
   scoped_refptr<base::SingleThreadTaskRunner> main_thread_;
 
   // Part of the initialization of remote tracks occurs on the signaling thread.
diff --git a/third_party/blink/renderer/modules/peerconnection/webrtc_media_stream_track_adapter_map.h b/third_party/blink/renderer/modules/peerconnection/webrtc_media_stream_track_adapter_map.h
index eb3a77b..1b37a20d 100644
--- a/third_party/blink/renderer/modules/peerconnection/webrtc_media_stream_track_adapter_map.h
+++ b/third_party/blink/renderer/modules/peerconnection/webrtc_media_stream_track_adapter_map.h
@@ -23,6 +23,11 @@
 // creating, initializing and disposing track adapters independently of media
 // streams. Adapters are accessed via |AdapterRef|s, when all references to an
 // adapter are destroyed it is disposed and removed from the map.
+// Objects of this class must be constructed on the main thread, after which
+// they may be accessed from any thread. The two exceptions to that are
+// `GetOrCreateLocalTrackAdapter()` that must be called from the main thread and
+// `GetOrCreateRemoteTrackAdapter()` which must not be called from the main
+// thread.
 class MODULES_EXPORT WebRtcMediaStreamTrackAdapterMap
     : public WTF::ThreadSafeRefCounted<WebRtcMediaStreamTrackAdapterMap> {
  public:
@@ -135,9 +140,7 @@
   // Invoke on the main thread.
   virtual ~WebRtcMediaStreamTrackAdapterMap();
 
-  // Pointer to a |PeerConnectionDependencyFactory| owned by the |RenderThread|.
-  // It's valid for the lifetime of |RenderThread|.
-  blink::PeerConnectionDependencyFactory* const factory_;
+  const CrossThreadPersistent<PeerConnectionDependencyFactory> factory_;
   scoped_refptr<base::SingleThreadTaskRunner> main_thread_;
 
   mutable base::Lock lock_;
diff --git a/third_party/blink/renderer/modules/peerconnection/webrtc_media_stream_track_adapter_map_test.cc b/third_party/blink/renderer/modules/peerconnection/webrtc_media_stream_track_adapter_map_test.cc
index 018b214c..ecad32a 100644
--- a/third_party/blink/renderer/modules/peerconnection/webrtc_media_stream_track_adapter_map_test.cc
+++ b/third_party/blink/renderer/modules/peerconnection/webrtc_media_stream_track_adapter_map_test.cc
@@ -26,10 +26,11 @@
 class WebRtcMediaStreamTrackAdapterMapTest : public ::testing::Test {
  public:
   void SetUp() override {
-    dependency_factory_.reset(new blink::MockPeerConnectionDependencyFactory());
+    dependency_factory_ =
+        MakeGarbageCollected<MockPeerConnectionDependencyFactory>();
     main_thread_ = blink::scheduler::GetSingleThreadTaskRunnerForTesting();
     map_ = base::MakeRefCounted<blink::WebRtcMediaStreamTrackAdapterMap>(
-        dependency_factory_.get(), main_thread_);
+        dependency_factory_.Get(), main_thread_);
   }
 
   void TearDown() override { blink::WebHeap::CollectAllGarbageForTesting(); }
@@ -109,7 +110,7 @@
  protected:
   ScopedTestingPlatformSupport<IOTaskRunnerTestingPlatformSupport> platform_;
 
-  std::unique_ptr<blink::MockPeerConnectionDependencyFactory>
+  CrossThreadPersistent<MockPeerConnectionDependencyFactory>
       dependency_factory_;
   scoped_refptr<base::SingleThreadTaskRunner> main_thread_;
   scoped_refptr<blink::WebRtcMediaStreamTrackAdapterMap> map_;
diff --git a/third_party/blink/renderer/modules/peerconnection/webrtc_media_stream_track_adapter_test.cc b/third_party/blink/renderer/modules/peerconnection/webrtc_media_stream_track_adapter_test.cc
index 75ec2c47..966ca78 100644
--- a/third_party/blink/renderer/modules/peerconnection/webrtc_media_stream_track_adapter_test.cc
+++ b/third_party/blink/renderer/modules/peerconnection/webrtc_media_stream_track_adapter_test.cc
@@ -29,7 +29,8 @@
 class WebRtcMediaStreamTrackAdapterTest : public ::testing::Test {
  public:
   void SetUp() override {
-    dependency_factory_.reset(new blink::MockPeerConnectionDependencyFactory());
+    dependency_factory_ =
+        MakeGarbageCollected<MockPeerConnectionDependencyFactory>();
     main_thread_ = blink::scheduler::GetSingleThreadTaskRunnerForTesting();
   }
 
@@ -75,7 +76,7 @@
       webrtc::MediaStreamTrackInterface* webrtc_track) {
     track_adapter_ =
         blink::WebRtcMediaStreamTrackAdapter::CreateRemoteTrackAdapter(
-            dependency_factory_.get(), main_thread_, webrtc_track);
+            dependency_factory_.Get(), main_thread_, webrtc_track);
   }
 
   void HoldOntoAdapterReference(
@@ -110,7 +111,7 @@
  protected:
   ScopedTestingPlatformSupport<IOTaskRunnerTestingPlatformSupport> platform_;
 
-  std::unique_ptr<blink::MockPeerConnectionDependencyFactory>
+  CrossThreadPersistent<MockPeerConnectionDependencyFactory>
       dependency_factory_;
   scoped_refptr<base::SingleThreadTaskRunner> main_thread_;
   scoped_refptr<blink::WebRtcMediaStreamTrackAdapter> track_adapter_;
@@ -119,7 +120,7 @@
 TEST_F(WebRtcMediaStreamTrackAdapterTest, LocalAudioTrack) {
   track_adapter_ =
       blink::WebRtcMediaStreamTrackAdapter::CreateLocalTrackAdapter(
-          dependency_factory_.get(), main_thread_, CreateLocalAudioTrack());
+          dependency_factory_.Get(), main_thread_, CreateLocalAudioTrack());
   EXPECT_TRUE(track_adapter_->is_initialized());
   EXPECT_TRUE(track_adapter_->track());
   EXPECT_EQ(track_adapter_->track()->Source()->GetType(),
@@ -139,7 +140,7 @@
 TEST_F(WebRtcMediaStreamTrackAdapterTest, DISABLED_LocalVideoTrack) {
   track_adapter_ =
       blink::WebRtcMediaStreamTrackAdapter::CreateLocalTrackAdapter(
-          dependency_factory_.get(), main_thread_, CreateLocalVideoTrack());
+          dependency_factory_.Get(), main_thread_, CreateLocalVideoTrack());
   EXPECT_TRUE(track_adapter_->is_initialized());
   EXPECT_TRUE(track_adapter_->track());
   EXPECT_EQ(track_adapter_->track()->Source()->GetType(),
diff --git a/third_party/blink/renderer/modules/peerconnection/webrtc_set_description_observer_test.cc b/third_party/blink/renderer/modules/peerconnection/webrtc_set_description_observer_test.cc
index e2ec9286..12a7ff4 100644
--- a/third_party/blink/renderer/modules/peerconnection/webrtc_set_description_observer_test.cc
+++ b/third_party/blink/renderer/modules/peerconnection/webrtc_set_description_observer_test.cc
@@ -222,11 +222,12 @@
 
   void SetUp() override {
     pc_ = new webrtc::MockPeerConnectionInterface;
-    dependency_factory_.reset(new blink::MockPeerConnectionDependencyFactory());
+    dependency_factory_ =
+        MakeGarbageCollected<MockPeerConnectionDependencyFactory>();
     main_thread_ = blink::scheduler::GetSingleThreadTaskRunnerForTesting();
     track_adapter_map_ =
         base::MakeRefCounted<blink::WebRtcMediaStreamTrackAdapterMap>(
-            dependency_factory_.get(), main_thread_);
+            dependency_factory_.Get(), main_thread_);
     observer_ = base::MakeRefCounted<WebRtcSetDescriptionObserverForTest>();
     observer_handler_ = std::make_unique<ObserverHandlerWrapper>(
         handler_type_, main_thread_,
@@ -361,8 +362,7 @@
 
  protected:
   scoped_refptr<webrtc::MockPeerConnectionInterface> pc_;
-  std::unique_ptr<blink::MockPeerConnectionDependencyFactory>
-      dependency_factory_;
+  Persistent<MockPeerConnectionDependencyFactory> dependency_factory_;
   scoped_refptr<base::SingleThreadTaskRunner> main_thread_;
   scoped_refptr<blink::WebRtcMediaStreamTrackAdapterMap> track_adapter_map_;
   scoped_refptr<WebRtcSetDescriptionObserverForTest> observer_;
diff --git a/third_party/blink/renderer/modules/push_messaging/service_worker_registration_push.cc b/third_party/blink/renderer/modules/push_messaging/service_worker_registration_push.cc
index be8eb6c4..4470062 100644
--- a/third_party/blink/renderer/modules/push_messaging/service_worker_registration_push.cc
+++ b/third_party/blink/renderer/modules/push_messaging/service_worker_registration_push.cc
@@ -12,7 +12,7 @@
 
 ServiceWorkerRegistrationPush::ServiceWorkerRegistrationPush(
     ServiceWorkerRegistration* registration)
-    : registration_(registration) {}
+    : Supplement(*registration) {}
 
 ServiceWorkerRegistrationPush::~ServiceWorkerRegistrationPush() = default;
 
@@ -39,12 +39,11 @@
 
 PushManager* ServiceWorkerRegistrationPush::pushManager() {
   if (!push_manager_)
-    push_manager_ = MakeGarbageCollected<PushManager>(registration_);
+    push_manager_ = MakeGarbageCollected<PushManager>(GetSupplementable());
   return push_manager_.Get();
 }
 
 void ServiceWorkerRegistrationPush::Trace(Visitor* visitor) const {
-  visitor->Trace(registration_);
   visitor->Trace(push_manager_);
   Supplement<ServiceWorkerRegistration>::Trace(visitor);
 }
diff --git a/third_party/blink/renderer/modules/push_messaging/service_worker_registration_push.h b/third_party/blink/renderer/modules/push_messaging/service_worker_registration_push.h
index d16bf97..d577ca9b 100644
--- a/third_party/blink/renderer/modules/push_messaging/service_worker_registration_push.h
+++ b/third_party/blink/renderer/modules/push_messaging/service_worker_registration_push.h
@@ -33,7 +33,6 @@
   void Trace(Visitor* visitor) const override;
 
  private:
-  Member<ServiceWorkerRegistration> registration_;
   Member<PushManager> push_manager_;
 
   DISALLOW_COPY_AND_ASSIGN(ServiceWorkerRegistrationPush);
diff --git a/third_party/blink/renderer/modules/screen_orientation/screen_screen_orientation.cc b/third_party/blink/renderer/modules/screen_orientation/screen_screen_orientation.cc
index a862879..e7b5ddc 100644
--- a/third_party/blink/renderer/modules/screen_orientation/screen_screen_orientation.cc
+++ b/third_party/blink/renderer/modules/screen_orientation/screen_screen_orientation.cc
@@ -38,6 +38,8 @@
 const char ScreenScreenOrientation::kSupplementName[] =
     "ScreenScreenOrientation";
 
+ScreenScreenOrientation::ScreenScreenOrientation() : Supplement(nullptr) {}
+
 void ScreenScreenOrientation::Trace(Visitor* visitor) const {
   visitor->Trace(orientation_);
   Supplement<Screen>::Trace(visitor);
diff --git a/third_party/blink/renderer/modules/screen_orientation/screen_screen_orientation.h b/third_party/blink/renderer/modules/screen_orientation/screen_screen_orientation.h
index 2b83ddf..aff83ca 100644
--- a/third_party/blink/renderer/modules/screen_orientation/screen_screen_orientation.h
+++ b/third_party/blink/renderer/modules/screen_orientation/screen_screen_orientation.h
@@ -24,6 +24,8 @@
 
   static ScreenOrientation* orientation(Screen&);
 
+  ScreenScreenOrientation();
+
   void Trace(Visitor*) const override;
 
  private:
diff --git a/third_party/blink/renderer/modules/storage/storage_namespace.cc b/third_party/blink/renderer/modules/storage/storage_namespace.cc
index 64c2342b..b10a0f2 100644
--- a/third_party/blink/renderer/modules/storage/storage_namespace.cc
+++ b/third_party/blink/renderer/modules/storage/storage_namespace.cc
@@ -46,10 +46,12 @@
 const char StorageNamespace::kSupplementName[] = "SessionStorageNamespace";
 
 StorageNamespace::StorageNamespace(StorageController* controller)
-    : controller_(controller) {}
+    : Supplement(nullptr), controller_(controller) {}
 StorageNamespace::StorageNamespace(StorageController* controller,
                                    const String& namespace_id)
-    : controller_(controller), namespace_id_(namespace_id) {}
+    : Supplement(nullptr),
+      controller_(controller),
+      namespace_id_(namespace_id) {}
 
 // static
 void StorageNamespace::ProvideSessionStorageNamespaceTo(
diff --git a/third_party/blink/renderer/modules/webaudio/audio_graph_tracer.cc b/third_party/blink/renderer/modules/webaudio/audio_graph_tracer.cc
index ef4f4d57..66df7cb 100644
--- a/third_party/blink/renderer/modules/webaudio/audio_graph_tracer.cc
+++ b/third_party/blink/renderer/modules/webaudio/audio_graph_tracer.cc
@@ -22,7 +22,7 @@
 }
 
 AudioGraphTracer::AudioGraphTracer()
-    : inspector_agent_(nullptr) {}
+    : Supplement(nullptr), inspector_agent_(nullptr) {}
 
 void AudioGraphTracer::Trace(Visitor* visitor) const {
   visitor->Trace(inspector_agent_);
diff --git a/third_party/blink/renderer/modules/webdatabase/database_client.cc b/third_party/blink/renderer/modules/webdatabase/database_client.cc
index fc82b0db..22b31c6 100644
--- a/third_party/blink/renderer/modules/webdatabase/database_client.cc
+++ b/third_party/blink/renderer/modules/webdatabase/database_client.cc
@@ -39,7 +39,8 @@
 
 namespace blink {
 
-DatabaseClient::DatabaseClient() : inspector_agent_(nullptr) {}
+DatabaseClient::DatabaseClient()
+    : Supplement(nullptr), inspector_agent_(nullptr) {}
 
 void DatabaseClient::Trace(Visitor* visitor) const {
   visitor->Trace(inspector_agent_);
diff --git a/third_party/blink/renderer/modules/webid/navigator_web_id.cc b/third_party/blink/renderer/modules/webid/navigator_web_id.cc
index 485d25d..747ccdc 100644
--- a/third_party/blink/renderer/modules/webid/navigator_web_id.cc
+++ b/third_party/blink/renderer/modules/webid/navigator_web_id.cc
@@ -36,7 +36,7 @@
   Supplement<Navigator>::Trace(visitor);
 }
 
-NavigatorWebId::NavigatorWebId(Navigator& navigator) {
+NavigatorWebId::NavigatorWebId(Navigator& navigator) : Supplement(navigator) {
   if (navigator.DomWindow()) {
     web_id_ = MakeGarbageCollected<WebId>(*navigator.DomWindow());
   }
diff --git a/third_party/blink/renderer/modules/webshare/navigator_share.h b/third_party/blink/renderer/modules/webshare/navigator_share.h
index be5fe4cc..ba4b042 100644
--- a/third_party/blink/renderer/modules/webshare/navigator_share.h
+++ b/third_party/blink/renderer/modules/webshare/navigator_share.h
@@ -30,7 +30,7 @@
  public:
   static const char kSupplementName[];
 
-  NavigatorShare() = default;
+  NavigatorShare() : Supplement(nullptr) {}
   ~NavigatorShare() = default;
 
   // Gets, or creates, NavigatorShare supplement on Navigator.
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc b/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc
index aa3be98b..f0a3453 100644
--- a/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc
+++ b/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc
@@ -758,7 +758,7 @@
 
   // Aims to count Resource only referenced from MemoryCache (i.e. what would be
   // dead if MemoryCache holds weak references to Resource). Currently we check
-  // references to Resource from ResourceClient and |m_preloads| only, because
+  // references to Resource from ResourceClient and `preloads_` only, because
   // they are major sources of references.
   if (resource && !resource->IsAlive() && !ContainsAsPreload(resource)) {
     DEFINE_RESOURCE_HISTOGRAM("Dead.");
diff --git a/third_party/blink/renderer/platform/loader/fetch/url_loader/sync_load_context.cc b/third_party/blink/renderer/platform/loader/fetch/url_loader/sync_load_context.cc
index 7913b10..be473b8 100644
--- a/third_party/blink/renderer/platform/loader/fetch/url_loader/sync_load_context.cc
+++ b/third_party/blink/renderer/platform/loader/fetch/url_loader/sync_load_context.cc
@@ -107,13 +107,13 @@
     const WebVector<WebString>& cors_exempt_header_list,
     std::unique_ptr<ResourceLoadInfoNotifierWrapper>
         resource_load_info_notifier_wrapper) {
-  auto* context = new SyncLoadContext(
+  scoped_refptr<SyncLoadContext> context(new SyncLoadContext(
       request.get(), std::move(pending_url_loader_factory), response,
       context_for_redirect, redirect_or_response_event, abort_event, timeout,
-      std::move(download_to_blob_registry), loading_task_runner);
+      std::move(download_to_blob_registry), loading_task_runner));
   context->resource_request_sender_->SendAsync(
       std::move(request), std::move(loading_task_runner), traffic_annotation,
-      loader_options, cors_exempt_header_list, base::WrapRefCounted(context),
+      loader_options, cors_exempt_header_list, context,
       context->url_loader_factory_, std::move(throttles),
       std::move(resource_load_info_notifier_wrapper),
       WebBackForwardCacheLoaderHelper());
diff --git a/third_party/blink/renderer/platform/loader/fetch/url_loader/web_resource_request_sender.cc b/third_party/blink/renderer/platform/loader/fetch/url_loader/web_resource_request_sender.cc
index f99b294..15d1384 100644
--- a/third_party/blink/renderer/platform/loader/fetch/url_loader/web_resource_request_sender.cc
+++ b/third_party/blink/renderer/platform/loader/fetch/url_loader/web_resource_request_sender.cc
@@ -255,6 +255,8 @@
     std::unique_ptr<ResourceLoadInfoNotifierWrapper>
         resource_load_info_notifier_wrapper,
     WebBackForwardCacheLoaderHelper back_forward_cache_loader_helper) {
+  auto weak_this = weak_factory_.GetWeakPtr();
+
   CheckSchemeForReferrerPolicy(*request);
 
 #if defined(OS_ANDROID)
@@ -294,6 +296,11 @@
           loader_options, request.get(), client.get(), traffic_annotation,
           std::move(loading_task_runner),
           base::make_optional(std_cors_exempt_header_list));
+  // TODO(https://crbug.com/1175286): Remove this mitigation when we understand
+  // why `this` or `request_info_` is being destroyed.
+  if (!weak_this || !request_info_)
+    return request_id;
+
   request_info_->url_loader = std::move(url_loader);
   request_info_->url_loader_client = std::move(client);
 
diff --git a/third_party/blink/renderer/platform/mojo/DEPS b/third_party/blink/renderer/platform/mojo/DEPS
index 7f097996..112c021 100644
--- a/third_party/blink/renderer/platform/mojo/DEPS
+++ b/third_party/blink/renderer/platform/mojo/DEPS
@@ -23,6 +23,7 @@
     "+third_party/blink/renderer/platform/context_lifecycle_notifier.h",
     "+third_party/blink/renderer/platform/heap_observer_set.h",
     "+third_party/blink/renderer/platform/heap",
+    "+third_party/blink/renderer/platform/supplementable.h",
     "+third_party/blink/renderer/platform/testing/mock_context_lifecycle_notifier.h",
 ]
 
diff --git a/third_party/blink/renderer/platform/mojo/mojo_binding_context.h b/third_party/blink/renderer/platform/mojo/mojo_binding_context.h
index 1649994..fb52881 100644
--- a/third_party/blink/renderer/platform/mojo/mojo_binding_context.h
+++ b/third_party/blink/renderer/platform/mojo/mojo_binding_context.h
@@ -10,6 +10,7 @@
 #include "third_party/blink/public/platform/web_common.h"
 #include "third_party/blink/renderer/platform/context_lifecycle_notifier.h"
 #include "third_party/blink/renderer/platform/platform_export.h"
+#include "third_party/blink/renderer/platform/supplementable.h"
 
 namespace base {
 class SingleThreadTaskRunner;
@@ -22,12 +23,19 @@
 // This class encapsulates the necessary information for binding Mojo
 // interfaces, to enable interfaces provided by the platform to be aware of the
 // context in which they are intended to be used.
-class PLATFORM_EXPORT MojoBindingContext : public ContextLifecycleNotifier {
+class PLATFORM_EXPORT MojoBindingContext
+    : public ContextLifecycleNotifier,
+      public Supplementable<MojoBindingContext> {
  public:
   virtual const BrowserInterfaceBrokerProxy& GetBrowserInterfaceBroker()
       const = 0;
   virtual scoped_refptr<base::SingleThreadTaskRunner> GetTaskRunner(
       TaskType) = 0;
+
+  void Trace(Visitor* visitor) const override {
+    ContextLifecycleNotifier::Trace(visitor);
+    Supplementable::Trace(visitor);
+  }
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/platform/p2p/empty_network_manager.cc b/third_party/blink/renderer/platform/p2p/empty_network_manager.cc
index 0d7be63..17b3c56 100644
--- a/third_party/blink/renderer/platform/p2p/empty_network_manager.cc
+++ b/third_party/blink/renderer/platform/p2p/empty_network_manager.cc
@@ -8,16 +8,25 @@
 #include "base/check_op.h"
 #include "base/location.h"
 #include "base/threading/thread_task_runner_handle.h"
+#include "third_party/blink/renderer/platform/p2p/ipc_network_manager.h"
 #include "third_party/blink/renderer/platform/p2p/network_manager_uma.h"
 
 namespace blink {
 
-EmptyNetworkManager::EmptyNetworkManager(rtc::NetworkManager* network_manager)
-    : network_manager_(network_manager) {
+EmptyNetworkManager::EmptyNetworkManager(IpcNetworkManager* network_manager)
+    : EmptyNetworkManager(network_manager, network_manager->AsWeakPtr()) {}
+
+// DO NOT dereference/check `network_manager_weak` in the ctor! Doing so would
+// bind its WeakFactory to the constructing thread (main thread) instead of
+// the thread `this` lives in (signaling thread).
+EmptyNetworkManager::EmptyNetworkManager(
+    rtc::NetworkManager* network_manager,
+    base::WeakPtr<rtc::NetworkManager> network_manager_weak)
+    : network_manager_(network_manager_weak) {
   DCHECK(network_manager);
   DETACH_FROM_THREAD(thread_checker_);
   set_enumeration_permission(ENUMERATION_BLOCKED);
-  network_manager_->SignalNetworksChanged.connect(
+  network_manager->SignalNetworksChanged.connect(
       this, &EmptyNetworkManager::OnNetworksChanged);
 }
 
@@ -27,13 +36,17 @@
 
 void EmptyNetworkManager::StartUpdating() {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+  DCHECK(network_manager_);
   ++start_count_;
   network_manager_->StartUpdating();
 }
 
 void EmptyNetworkManager::StopUpdating() {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
-  network_manager_->StopUpdating();
+
+  if (network_manager_)
+    network_manager_->StopUpdating();
+
   --start_count_;
   DCHECK_GE(start_count_, 0);
 }
@@ -46,6 +59,8 @@
 bool EmptyNetworkManager::GetDefaultLocalAddress(
     int family,
     rtc::IPAddress* ipaddress) const {
+  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+  DCHECK(network_manager_);
   return network_manager_->GetDefaultLocalAddress(family, ipaddress);
 }
 
diff --git a/third_party/blink/renderer/platform/p2p/empty_network_manager.h b/third_party/blink/renderer/platform/p2p/empty_network_manager.h
index 77d43634..908b0a6 100644
--- a/third_party/blink/renderer/platform/p2p/empty_network_manager.h
+++ b/third_party/blink/renderer/platform/p2p/empty_network_manager.h
@@ -18,16 +18,19 @@
 
 namespace blink {
 
+class FilteringNetworkManagerTest;
+class IpcNetworkManager;
+
 // A NetworkManager implementation which handles the case where local address
 // enumeration is not requested and just returns empty network lists. This class
 // is not thread safe and should only be used by WebRTC's network thread.
 class EmptyNetworkManager : public rtc::NetworkManagerBase,
                             public sigslot::has_slots<> {
  public:
-  // This class is created by WebRTC's signaling thread but used by WebRTC's
-  // worker thread |task_runner|.
+  // This class is created on the main thread but used by WebRTC's worker thread
+  // |task_runner|.
   PLATFORM_EXPORT explicit EmptyNetworkManager(
-      rtc::NetworkManager* network_manager);
+      IpcNetworkManager* network_manager);
   PLATFORM_EXPORT ~EmptyNetworkManager() override;
 
   // rtc::NetworkManager:
@@ -38,6 +41,19 @@
                               rtc::IPAddress* ipaddress) const override;
 
  private:
+  friend class FilteringNetworkManagerTest;
+  // We can't dereference the wrapped network manager from the construction
+  // thread, as that would cause it to bind to the wrong sequence. We also can't
+  // obtain a `WeakPtr` from an arbitrary `rtc::NetworkManager`, so we take 2
+  // pointers pointing to the same instance, one is a raw pointer for use on the
+  // constructing thread and the other is a weak pointer for use on the worker
+  // thread.
+  // TODO(crbug.com/1191914): Simplify this, to avoid the subtleties of having
+  // to pass two pointers to the same object.
+  PLATFORM_EXPORT EmptyNetworkManager(
+      rtc::NetworkManager* network_manager,
+      base::WeakPtr<rtc::NetworkManager> network_manager_weak);
+
   // Receive callback from the wrapped NetworkManager when the underneath
   // network list is changed.
   //
@@ -55,9 +71,9 @@
   // StartUpdating.
   int start_count_ = 0;
 
-  // |network_manager_| is just a reference, owned by
-  // PeerConnectionDependencyFactory.
-  rtc::NetworkManager* network_manager_;
+  // `network_manager_` is owned by the PeerConnectionDependencyFactory, that
+  // may be destroyed when the frame is detached.
+  base::WeakPtr<rtc::NetworkManager> network_manager_;
 
   base::WeakPtrFactory<EmptyNetworkManager> weak_ptr_factory_{this};
 
diff --git a/third_party/blink/renderer/platform/p2p/filtering_network_manager.cc b/third_party/blink/renderer/platform/p2p/filtering_network_manager.cc
index d240762..7a3fd50 100644
--- a/third_party/blink/renderer/platform/p2p/filtering_network_manager.cc
+++ b/third_party/blink/renderer/platform/p2p/filtering_network_manager.cc
@@ -10,15 +10,27 @@
 #include "base/logging.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "media/base/media_permission.h"
+#include "third_party/blink/renderer/platform/p2p/ipc_network_manager.h"
 #include "third_party/blink/renderer/platform/wtf/functional.h"
 
 namespace blink {
 
 FilteringNetworkManager::FilteringNetworkManager(
-    rtc::NetworkManager* network_manager,
+    IpcNetworkManager* network_manager,
     media::MediaPermission* media_permission,
     bool allow_mdns_obfuscation)
-    : network_manager_(network_manager),
+    : FilteringNetworkManager(network_manager->AsWeakPtr(),
+                              media_permission,
+                              allow_mdns_obfuscation) {}
+
+// DO NOT dereference/check `network_manager_weak` in the ctor! Doing so would
+// bind its WeakFactory to the constructing thread (main thread) instead of
+// the thread `this` lives in (signaling thread).
+FilteringNetworkManager::FilteringNetworkManager(
+    base::WeakPtr<rtc::NetworkManager> network_manager_weak,
+    media::MediaPermission* media_permission,
+    bool allow_mdns_obfuscation)
+    : network_manager_(std::move(network_manager_weak)),
       media_permission_(media_permission),
       allow_mdns_obfuscation_(allow_mdns_obfuscation) {
   DETACH_FROM_THREAD(thread_checker_);
@@ -53,6 +65,7 @@
 void FilteringNetworkManager::StartUpdating() {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
   DCHECK(started_permission_check_);
+  DCHECK(network_manager_);
 
   if (start_updating_time_.is_null()) {
     start_updating_time_ = base::TimeTicks::Now();
@@ -76,7 +89,8 @@
 
 void FilteringNetworkManager::StopUpdating() {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
-  network_manager_->StopUpdating();
+  if (network_manager_)
+    network_manager_->StopUpdating();
   DCHECK_GT(start_count_, 0);
   --start_count_;
 }
@@ -95,11 +109,15 @@
     const {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
 
+  if (!network_manager_)
+    return nullptr;
+
   // mDNS responder is set to null if we have the enumeration permission or the
   // mDNS obfuscation of IPs is disallowed.
   if (enumeration_permission() == ENUMERATION_ALLOWED ||
-      !allow_mdns_obfuscation_)
+      !allow_mdns_obfuscation_) {
     return nullptr;
+  }
 
   return network_manager_->GetMdnsResponder();
 }
@@ -141,6 +159,8 @@
 
 void FilteringNetworkManager::OnNetworksChanged() {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+  DCHECK(network_manager_);
+
   pending_network_update_ = false;
 
   // Update the default local addresses.
diff --git a/third_party/blink/renderer/platform/p2p/filtering_network_manager.h b/third_party/blink/renderer/platform/p2p/filtering_network_manager.h
index 8243e2f..094c716 100644
--- a/third_party/blink/renderer/platform/p2p/filtering_network_manager.h
+++ b/third_party/blink/renderer/platform/p2p/filtering_network_manager.h
@@ -20,6 +20,9 @@
 
 namespace blink {
 
+class FilteringNetworkManagerTest;
+class IpcNetworkManager;
+
 // FilteringNetworkManager exposes rtc::NetworkManager to
 // PeerConnectionDependencyFactory and wraps the IpcNetworkManager. It only
 // handles the case where multiple_routes is requested. It checks at least one
@@ -36,10 +39,10 @@
 class FilteringNetworkManager : public rtc::NetworkManagerBase,
                                 public sigslot::has_slots<> {
  public:
-  // This class is created by WebRTC's signaling thread but used by WebRTC's
+  // This class is created by WebRTC's main thread but used by WebRTC's
   // worker thread |task_runner|.
   PLATFORM_EXPORT FilteringNetworkManager(
-      rtc::NetworkManager* network_manager,
+      IpcNetworkManager* network_manager,
       media::MediaPermission* media_permission,
       bool allow_mdns_obfuscation);
 
@@ -54,6 +57,13 @@
   webrtc::MdnsResponderInterface* GetMdnsResponder() const override;
 
  private:
+  friend class FilteringNetworkManagerTest;
+
+  PLATFORM_EXPORT FilteringNetworkManager(
+      base::WeakPtr<rtc::NetworkManager> network_manager_weak,
+      media::MediaPermission* media_permission,
+      bool allow_mdns_obfuscation);
+
   // Check mic/camera permission.
   void CheckPermission();
 
@@ -82,11 +92,13 @@
 
   void SendNetworksChangedSignal();
 
-  // |network_manager_| is just a reference, owned by
-  // PeerConnectionDependencyFactory.
-  rtc::NetworkManager* network_manager_;
+  // `network_manager_` is owned by the PeerConnectionDependencyFactory, that
+  // may be destroyed when the frame is detached.
+  // TODO(crbug.com/1191914): Clarify the lifetime of `network_manager_` and
+  // `this`.
+  base::WeakPtr<rtc::NetworkManager> network_manager_;
 
-  // The class is created by the signaling thread but used by the worker thread.
+  // The class is created by the main thread but used by the worker thread.
   THREAD_CHECKER(thread_checker_);
 
   media::MediaPermission* media_permission_;
diff --git a/third_party/blink/renderer/platform/p2p/filtering_network_manager_test.cc b/third_party/blink/renderer/platform/p2p/filtering_network_manager_test.cc
index 84d7b80..b254b1f 100644
--- a/third_party/blink/renderer/platform/p2p/filtering_network_manager_test.cc
+++ b/third_party/blink/renderer/platform/p2p/filtering_network_manager_test.cc
@@ -12,6 +12,7 @@
 
 #include "base/check.h"
 #include "base/memory/ref_counted.h"
+#include "base/memory/weak_ptr.h"
 #include "base/notreached.h"
 #include "base/stl_util.h"
 #include "base/test/test_simple_task_runner.h"
@@ -97,10 +98,15 @@
     network_->AddIP(network_->GetBestIP());
   }
 
+  base::WeakPtr<MockNetworkManager> AsWeakPtr() {
+    return weak_factory_.GetWeakPtr();
+  }
+
  private:
   bool sent_first_update_ = false;
   std::unique_ptr<rtc::Network> network_;
   std::unique_ptr<EmptyMdnsResponder> mdns_responder_;
+  base::WeakPtrFactory<MockNetworkManager> weak_factory_{this};
 };
 
 class MockMediaPermission : public media::MediaPermission {
@@ -171,13 +177,13 @@
     base_network_manager_ = std::make_unique<MockNetworkManager>();
     SetNewNetworkForBaseNetworkManager();
     if (multiple_routes_requested) {
-      network_manager_ = std::make_unique<FilteringNetworkManager>(
-          base_network_manager_.get(), media_permission_.get(),
-          allow_mdns_obfuscation_);
+      network_manager_.reset(new FilteringNetworkManager(
+          base_network_manager_->AsWeakPtr(), media_permission_.get(),
+          allow_mdns_obfuscation_));
       network_manager_->Initialize();
     } else {
-      network_manager_ = std::make_unique<blink::EmptyNetworkManager>(
-          base_network_manager_.get());
+      network_manager_.reset(new EmptyNetworkManager(
+          base_network_manager_.get(), base_network_manager_->AsWeakPtr()));
     }
     network_manager_->SignalNetworksChanged.connect(
         this, &FilteringNetworkManagerTest::OnNetworksChanged);
diff --git a/third_party/blink/renderer/platform/p2p/host_address_request.h b/third_party/blink/renderer/platform/p2p/host_address_request.h
index 9bb5ccf..ccd9a57 100644
--- a/third_party/blink/renderer/platform/p2p/host_address_request.h
+++ b/third_party/blink/renderer/platform/p2p/host_address_request.h
@@ -12,6 +12,7 @@
 #include "base/memory/ref_counted.h"
 #include "base/threading/thread_checker.h"
 #include "net/base/ip_address.h"
+#include "third_party/blink/renderer/platform/heap/persistent.h"
 #include "third_party/blink/renderer/platform/wtf/vector.h"
 #include "third_party/webrtc/rtc_base/async_resolver_interface.h"
 
@@ -20,7 +21,8 @@
 class P2PSocketDispatcher;
 
 // P2PAsyncAddressResolver performs DNS hostname resolution. It's used
-// to resolve addresses of STUN and relay servers.
+// to resolve addresses of STUN and relay servers. It is created and lives on
+// one of libjingle's threads.
 class P2PAsyncAddressResolver
     : public base::RefCountedThreadSafe<P2PAsyncAddressResolver> {
  public:
@@ -47,7 +49,9 @@
 
   void OnResponse(const Vector<net::IPAddress>& address);
 
-  P2PSocketDispatcher* dispatcher_;
+  // `P2PSocketDispatcher` is owned by the main thread, and must be accessed in
+  // a thread-safe way.
+  CrossThreadPersistent<P2PSocketDispatcher> dispatcher_;
   THREAD_CHECKER(thread_checker_);
 
   // State must be accessed from delegate thread only.
diff --git a/third_party/blink/renderer/platform/p2p/ipc_network_manager.cc b/third_party/blink/renderer/platform/p2p/ipc_network_manager.cc
index bd0c9bc..94802a9 100644
--- a/third_party/blink/renderer/platform/p2p/ipc_network_manager.cc
+++ b/third_party/blink/renderer/platform/p2p/ipc_network_manager.cc
@@ -9,6 +9,7 @@
 #include <vector>
 
 #include "base/location.h"
+#include "base/memory/weak_ptr.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/single_thread_task_runner.h"
 #include "base/sys_byteorder.h"
@@ -51,20 +52,27 @@
     std::unique_ptr<webrtc::MdnsResponderInterface> mdns_responder)
     : network_list_manager_(network_list_manager),
       mdns_responder_(std::move(mdns_responder)) {
+  DETACH_FROM_THREAD(thread_checker_);
+  weak_this_ = weak_factory_.GetWeakPtr();
   network_list_manager_->AddNetworkListObserver(this);
 }
 
 IpcNetworkManager::~IpcNetworkManager() {
-  DCHECK(!start_count_);
+  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
   network_list_manager_->RemoveNetworkListObserver(this);
 }
 
+base::WeakPtr<IpcNetworkManager> IpcNetworkManager::AsWeakPtr() {
+  return weak_factory_.GetWeakPtr();
+}
+
 void IpcNetworkManager::StartUpdating() {
+  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
   if (network_list_received_) {
     // Post a task to avoid reentrancy.
     base::ThreadTaskRunnerHandle::Get()->PostTask(
-        FROM_HERE, WTF::Bind(&IpcNetworkManager::SendNetworksChangedSignal,
-                             weak_factory_.GetWeakPtr()));
+        FROM_HERE,
+        WTF::Bind(&IpcNetworkManager::SendNetworksChangedSignal, weak_this_));
   } else {
     VLOG(1) << "IpcNetworkManager::StartUpdating called; still waiting for "
                "network list from browser process.";
@@ -73,6 +81,7 @@
 }
 
 void IpcNetworkManager::StopUpdating() {
+  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
   DCHECK_GT(start_count_, 0);
   --start_count_;
 }
@@ -81,6 +90,7 @@
     const net::NetworkInterfaceList& list,
     const net::IPAddress& default_ipv4_local_address,
     const net::IPAddress& default_ipv6_local_address) {
+  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
   // Update flag if network list received for the first time.
   if (!network_list_received_) {
     VLOG(1) << "IpcNetworkManager received network list from browser process "
@@ -190,10 +200,12 @@
 }
 
 webrtc::MdnsResponderInterface* IpcNetworkManager::GetMdnsResponder() const {
+  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
   return mdns_responder_.get();
 }
 
 void IpcNetworkManager::SendNetworksChangedSignal() {
+  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
   SignalNetworksChanged();
 }
 
diff --git a/third_party/blink/renderer/platform/p2p/ipc_network_manager.h b/third_party/blink/renderer/platform/p2p/ipc_network_manager.h
index 8db0420..c5cbe92 100644
--- a/third_party/blink/renderer/platform/p2p/ipc_network_manager.h
+++ b/third_party/blink/renderer/platform/p2p/ipc_network_manager.h
@@ -8,6 +8,7 @@
 #include <memory>
 
 #include "base/memory/weak_ptr.h"
+#include "third_party/blink/renderer/platform/heap/persistent.h"
 #include "third_party/blink/renderer/platform/p2p/network_list_manager.h"
 #include "third_party/blink/renderer/platform/p2p/network_list_observer.h"
 #include "third_party/blink/renderer/platform/platform_export.h"
@@ -22,6 +23,12 @@
 
 // IpcNetworkManager is a NetworkManager for libjingle that gets a
 // list of network interfaces from the browser.
+//
+// Threading note:
+// The IpcNetworkManager is constructed on the network thread, and after that
+// may only be accessed from the signaling thread. The one exception to that is
+// access to slots (e.g., `NetworkManager::SignalNetworksChanged`) that are safe
+// to access from any thread.
 class IpcNetworkManager : public rtc::NetworkManagerBase,
                           public blink::NetworkListObserver {
  public:
@@ -31,6 +38,8 @@
       std::unique_ptr<webrtc::MdnsResponderInterface> mdns_responder);
   ~IpcNetworkManager() override;
 
+  base::WeakPtr<IpcNetworkManager> PLATFORM_EXPORT AsWeakPtr();
+
   // rtc:::NetworkManager:
   void StartUpdating() override;
   void StopUpdating() override;
@@ -45,13 +54,19 @@
  private:
   void SendNetworksChangedSignal();
 
-  // TODO(crbug.com/787254): Consider moving NetworkListManager to Oilpan and
-  // avoid using a raw pointer.
-  blink::NetworkListManager* network_list_manager_;
+  // 'this' is created on the network thread, whereas the `NetworkListManager`
+  // is owned by the main thread, so it needs to be accessed in a thread-safe
+  // manner (i.e., `CrossThreadPersistent`).
+  CrossThreadPersistent<NetworkListManager> network_list_manager_;
   std::unique_ptr<webrtc::MdnsResponderInterface> mdns_responder_;
   int start_count_ = 0;
   bool network_list_received_ = false;
 
+  THREAD_CHECKER(thread_checker_);
+
+  // Cache the weak pointer to avoid racy calls to `weak_factory_.GetWeakPtr()`.
+  // TODO(crbug.com/1191907): Figure out whether this is still necessary.
+  base::WeakPtr<IpcNetworkManager> weak_this_;
   base::WeakPtrFactory<IpcNetworkManager> weak_factory_{this};
 };
 
diff --git a/third_party/blink/renderer/platform/p2p/ipc_network_manager_test.cc b/third_party/blink/renderer/platform/p2p/ipc_network_manager_test.cc
index b00dc6f..f98ae10 100644
--- a/third_party/blink/renderer/platform/p2p/ipc_network_manager_test.cc
+++ b/third_party/blink/renderer/platform/p2p/ipc_network_manager_test.cc
@@ -18,7 +18,9 @@
 
 namespace {
 
-class MockP2PSocketDispatcher : public blink::NetworkListManager {
+class MockP2PSocketDispatcher
+    : public GarbageCollected<MockP2PSocketDispatcher>,
+      public NetworkListManager {
  public:
   void AddNetworkListObserver(
       blink::NetworkListObserver* network_list_observer) override {}
@@ -26,7 +28,9 @@
   void RemoveNetworkListObserver(
       blink::NetworkListObserver* network_list_observer) override {}
 
-  ~MockP2PSocketDispatcher() override {}
+  void Trace(Visitor* visitor) const override {
+    NetworkListManager::Trace(visitor);
+  }
 };
 
 class EmptyMdnsResponder : public webrtc::MdnsResponderInterface {
@@ -49,13 +53,13 @@
 class IpcNetworkManagerTest : public testing::Test {
  public:
   IpcNetworkManagerTest()
-      : network_list_manager_(new MockP2PSocketDispatcher()),
+      : network_list_manager_(MakeGarbageCollected<MockP2PSocketDispatcher>()),
         network_manager_(std::make_unique<IpcNetworkManager>(
-            network_list_manager_.get(),
+            network_list_manager_.Get(),
             std::make_unique<EmptyMdnsResponder>())) {}
 
  protected:
-  std::unique_ptr<MockP2PSocketDispatcher> network_list_manager_;
+  Persistent<MockP2PSocketDispatcher> network_list_manager_;
   std::unique_ptr<IpcNetworkManager> network_manager_;
 };
 
diff --git a/third_party/blink/renderer/platform/p2p/ipc_socket_factory.h b/third_party/blink/renderer/platform/p2p/ipc_socket_factory.h
index 21a0a25..e042538 100644
--- a/third_party/blink/renderer/platform/p2p/ipc_socket_factory.h
+++ b/third_party/blink/renderer/platform/p2p/ipc_socket_factory.h
@@ -10,6 +10,7 @@
 #include "base/compiler_specific.h"
 #include "base/macros.h"
 #include "net/traffic_annotation/network_traffic_annotation.h"
+#include "third_party/blink/renderer/platform/heap/persistent.h"
 #include "third_party/blink/renderer/platform/platform_export.h"
 #include "third_party/webrtc/api/packet_socket_factory.h"
 
@@ -19,7 +20,7 @@
 
 // IpcPacketSocketFactory implements rtc::PacketSocketFactory
 // interface for libjingle using IPC-based P2P sockets. The class must
-// be used on a thread that is a libjingle thread (implements
+// be created and used on a thread that is a libjingle thread (implements
 // rtc::Thread) and also has associated base::MessageLoop. Each
 // socket created by the factory must be used on the thread it was
 // created on.
@@ -48,7 +49,9 @@
   rtc::AsyncResolverInterface* CreateAsyncResolver() override;
 
  private:
-  P2PSocketDispatcher* socket_dispatcher_;
+  // `P2PSocketDispatcher` is owned by the main thread, and must be accessed in
+  // a thread-safe way.
+  CrossThreadPersistent<P2PSocketDispatcher> socket_dispatcher_;
   const net::NetworkTrafficAnnotationTag traffic_annotation_;
 
   DISALLOW_COPY_AND_ASSIGN(IpcPacketSocketFactory);
diff --git a/third_party/blink/renderer/platform/p2p/network_list_manager.h b/third_party/blink/renderer/platform/p2p/network_list_manager.h
index 0be11c05..ba9e48e3 100644
--- a/third_party/blink/renderer/platform/p2p/network_list_manager.h
+++ b/third_party/blink/renderer/platform/p2p/network_list_manager.h
@@ -9,6 +9,7 @@
 #ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_P2P_NETWORK_LIST_MANAGER_H_
 #define THIRD_PARTY_BLINK_RENDERER_PLATFORM_P2P_NETWORK_LIST_MANAGER_H_
 
+#include "third_party/blink/renderer/platform/heap/heap.h"
 #include "third_party/blink/renderer/platform/platform_export.h"
 
 namespace blink {
@@ -17,7 +18,7 @@
 
 // TODO(crbug.com/787254): Verify whether this abstract class is still
 // needed now that its Clients have all switched to Blink.
-class PLATFORM_EXPORT NetworkListManager {
+class PLATFORM_EXPORT NetworkListManager : public GarbageCollectedMixin {
  public:
   // Add a new network list observer. Each observer is called
   // immidiately after it is registered and then later whenever
@@ -30,11 +31,6 @@
   // which the observer was added.
   virtual void RemoveNetworkListObserver(
       NetworkListObserver* network_list_observer) = 0;
-
- protected:
-  // Marked as protected to prevent explicit deletion, as
-  // P2PSocketDispatcher is not owned by IpcNetworkManager.
-  virtual ~NetworkListManager() {}
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/platform/p2p/port_allocator.cc b/third_party/blink/renderer/platform/p2p/port_allocator.cc
index f392aac..4b18e54 100644
--- a/third_party/blink/renderer/platform/p2p/port_allocator.cc
+++ b/third_party/blink/renderer/platform/p2p/port_allocator.cc
@@ -11,22 +11,18 @@
 
 #include "base/check.h"
 #include "third_party/blink/public/platform/platform.h"
-#include "third_party/blink/renderer/platform/p2p/socket_dispatcher.h"
 
 namespace blink {
 
 P2PPortAllocator::P2PPortAllocator(
-    const scoped_refptr<P2PSocketDispatcher>& socket_dispatcher,
     std::unique_ptr<rtc::NetworkManager> network_manager,
     rtc::PacketSocketFactory* socket_factory,
     const Config& config,
     const GURL& origin)
     : cricket::BasicPortAllocator(network_manager.get(), socket_factory),
       network_manager_(std::move(network_manager)),
-      socket_dispatcher_(socket_dispatcher),
       config_(config),
       origin_(origin) {
-  DCHECK(socket_dispatcher);
   DCHECK(network_manager_);
   DCHECK(socket_factory);
   uint32_t flags = 0;
diff --git a/third_party/blink/renderer/platform/p2p/port_allocator.h b/third_party/blink/renderer/platform/p2p/port_allocator.h
index 1703c2303..018c05b 100644
--- a/third_party/blink/renderer/platform/p2p/port_allocator.h
+++ b/third_party/blink/renderer/platform/p2p/port_allocator.h
@@ -15,8 +15,6 @@
 
 namespace blink {
 
-class P2PSocketDispatcher;
-
 class PLATFORM_EXPORT P2PPortAllocator : public cricket::BasicPortAllocator {
  public:
   struct Config {
@@ -38,8 +36,7 @@
     bool enable_default_local_candidate = true;
   };
 
-  P2PPortAllocator(const scoped_refptr<P2PSocketDispatcher>& socket_dispatcher,
-                   std::unique_ptr<rtc::NetworkManager> network_manager,
+  P2PPortAllocator(std::unique_ptr<rtc::NetworkManager> network_manager,
                    rtc::PacketSocketFactory* socket_factory,
                    const Config& config,
                    const GURL& origin);
@@ -50,7 +47,6 @@
 
  private:
   std::unique_ptr<rtc::NetworkManager> network_manager_;
-  scoped_refptr<P2PSocketDispatcher> socket_dispatcher_;
   Config config_;
   GURL origin_;
 
diff --git a/third_party/blink/renderer/platform/p2p/socket_client_impl.h b/third_party/blink/renderer/platform/p2p/socket_client_impl.h
index a04db9a..741a19cb 100644
--- a/third_party/blink/renderer/platform/p2p/socket_client_impl.h
+++ b/third_party/blink/renderer/platform/p2p/socket_client_impl.h
@@ -18,6 +18,7 @@
 #include "net/traffic_annotation/network_traffic_annotation.h"
 #include "services/network/public/cpp/p2p_socket_type.h"
 #include "services/network/public/mojom/p2p.mojom-blink.h"
+#include "third_party/blink/renderer/platform/heap/persistent.h"
 #include "third_party/blink/renderer/platform/p2p/socket_client.h"
 #include "third_party/blink/renderer/platform/wtf/vector.h"
 
@@ -31,7 +32,7 @@
 
 // P2P socket that routes all calls over Mojo.
 //
-// The object runs on the WebRTC worker thread.
+// The object is created and runs on the WebRTC worker thread.
 class P2PSocketClientImpl : public blink::P2PSocketClient,
                             public network::mojom::blink::P2PSocketClient {
  public:
@@ -100,7 +101,9 @@
 
   void OnConnectionError();
 
-  P2PSocketDispatcher* dispatcher_;
+  // `P2PSocketDispatcher` is owned by the main thread, and must be accessed in
+  // a thread-safe way.
+  CrossThreadPersistent<P2PSocketDispatcher> dispatcher_;
   THREAD_CHECKER(thread_checker_);
   int socket_id_;
   blink::P2PSocketClientDelegate* delegate_;
diff --git a/third_party/blink/renderer/platform/p2p/socket_dispatcher.cc b/third_party/blink/renderer/platform/p2p/socket_dispatcher.cc
index 72ec477..e28d34e 100644
--- a/third_party/blink/renderer/platform/p2p/socket_dispatcher.cc
+++ b/third_party/blink/renderer/platform/p2p/socket_dispatcher.cc
@@ -5,22 +5,44 @@
 #include "third_party/blink/renderer/platform/p2p/socket_dispatcher.h"
 
 #include "base/memory/scoped_refptr.h"
+#include "base/types/pass_key.h"
 #include "services/network/public/cpp/p2p_param_traits.h"
-#include "third_party/blink/public/common/thread_safe_browser_interface_broker_proxy.h"
+#include "third_party/blink/public/common/browser_interface_broker_proxy.h"
 #include "third_party/blink/public/platform/platform.h"
+#include "third_party/blink/renderer/platform/heap/heap.h"
+#include "third_party/blink/renderer/platform/heap/persistent.h"
+#include "third_party/blink/renderer/platform/mojo/mojo_binding_context.h"
 #include "third_party/blink/renderer/platform/p2p/network_list_observer.h"
 #include "third_party/blink/renderer/platform/p2p/socket_client_impl.h"
 #include "third_party/blink/renderer/platform/scheduler/public/post_cross_thread_task.h"
+#include "third_party/blink/renderer/platform/supplementable.h"
 #include "third_party/blink/renderer/platform/wtf/cross_thread_functional.h"
 
 namespace blink {
 
-P2PSocketDispatcher::P2PSocketDispatcher()
-    : main_task_runner_(base::ThreadTaskRunnerHandle::Get()),
-      network_list_observers_(
-          new base::ObserverListThreadSafe<blink::NetworkListObserver>()) {}
+using PassKey = base::PassKey<P2PSocketDispatcher>;
 
-P2PSocketDispatcher::~P2PSocketDispatcher() {}
+const char P2PSocketDispatcher::kSupplementName[] = "P2PSocketDispatcher";
+
+// static
+P2PSocketDispatcher& P2PSocketDispatcher::From(MojoBindingContext& context) {
+  auto* supplement =
+      Supplement<MojoBindingContext>::From<P2PSocketDispatcher>(context);
+  if (!supplement) {
+    supplement = MakeGarbageCollected<P2PSocketDispatcher>(context, PassKey());
+    ProvideTo(context, supplement);
+  }
+  return *supplement;
+}
+
+P2PSocketDispatcher::P2PSocketDispatcher(MojoBindingContext& context, PassKey)
+    : Supplement(context),
+      main_task_runner_(base::ThreadTaskRunnerHandle::Get()),
+      network_list_observers_(
+          new base::ObserverListThreadSafe<blink::NetworkListObserver>()),
+      network_notification_client_receiver_(this, &context) {}
+
+P2PSocketDispatcher::~P2PSocketDispatcher() = default;
 
 void P2PSocketDispatcher::AddNetworkListObserver(
     blink::NetworkListObserver* network_list_observer) {
@@ -28,7 +50,7 @@
   PostCrossThreadTask(
       *main_task_runner_.get(), FROM_HERE,
       CrossThreadBindOnce(&P2PSocketDispatcher::RequestNetworkEventsIfNecessary,
-                          scoped_refptr<P2PSocketDispatcher>(this)));
+                          WrapCrossThreadPersistent(this)));
 }
 
 void P2PSocketDispatcher::RemoveNetworkListObserver(
@@ -48,14 +70,16 @@
         mojo::SharedRemote<network::mojom::blink::P2PSocketManager>(
             std::move(p2p_socket_manager));
     p2p_socket_manager_.set_disconnect_handler(
-        WTF::Bind(&P2PSocketDispatcher::OnConnectionError,
-                  WTF::Unretained(this)),
+        ConvertToBaseOnceCallback(
+            CrossThreadBindOnce(&P2PSocketDispatcher::OnConnectionError,
+                                WrapCrossThreadPersistent(this))),
         main_task_runner_);
   }
+
   PostCrossThreadTask(
       *main_task_runner_.get(), FROM_HERE,
       CrossThreadBindOnce(&P2PSocketDispatcher::RequestInterfaceIfNecessary,
-                          scoped_refptr<P2PSocketDispatcher>(this)));
+                          WrapCrossThreadPersistent(this)));
   return p2p_socket_manager_;
 }
 
@@ -81,10 +105,11 @@
 }
 
 void P2PSocketDispatcher::RequestInterfaceIfNecessary() {
+  DCHECK(main_task_runner_->BelongsToCurrentThread());
   if (!p2p_socket_manager_receiver_.is_valid())
     return;
 
-  blink::Platform::Current()->GetBrowserInterfaceBroker()->GetInterface(
+  GetSupplementable()->GetBrowserInterfaceBroker().GetInterface(
       std::move(p2p_socket_manager_receiver_));
 }
 
@@ -103,7 +128,8 @@
         default_ipv6_local_address_);
   } else {
     GetP2PSocketManager()->StartNetworkNotifications(
-        network_notification_client_receiver_.BindNewPipeAndPassRemote());
+        network_notification_client_receiver_.BindNewPipeAndPassRemote(
+            GetSupplementable()->GetTaskRunner(TaskType::kNetworking)));
   }
 }
 
@@ -115,13 +141,20 @@
   PostCrossThreadTask(
       *main_task_runner_.get(), FROM_HERE,
       CrossThreadBindOnce(&P2PSocketDispatcher::ReconnectP2PSocketManager,
-                          scoped_refptr<P2PSocketDispatcher>(this)));
+                          WrapCrossThreadPersistent(this)));
 }
 
 void P2PSocketDispatcher::ReconnectP2PSocketManager() {
   network_notification_client_receiver_.reset();
   GetP2PSocketManager()->StartNetworkNotifications(
-      network_notification_client_receiver_.BindNewPipeAndPassRemote());
+      network_notification_client_receiver_.BindNewPipeAndPassRemote(
+          GetSupplementable()->GetTaskRunner(TaskType::kNetworking)));
+}
+
+void P2PSocketDispatcher::Trace(Visitor* visitor) const {
+  Supplement::Trace(visitor);
+  NetworkListManager::Trace(visitor);
+  visitor->Trace(network_notification_client_receiver_);
 }
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/platform/p2p/socket_dispatcher.h b/third_party/blink/renderer/platform/p2p/socket_dispatcher.h
index 7d75ef81..12bc534 100644
--- a/third_party/blink/renderer/platform/p2p/socket_dispatcher.h
+++ b/third_party/blink/renderer/platform/p2p/socket_dispatcher.h
@@ -29,6 +29,7 @@
 #include "base/memory/ref_counted.h"
 #include "base/observer_list_threadsafe.h"
 #include "base/synchronization/lock.h"
+#include "base/types/pass_key.h"
 #include "mojo/public/cpp/bindings/pending_receiver.h"
 #include "mojo/public/cpp/bindings/receiver.h"
 #include "mojo/public/cpp/bindings/shared_remote.h"
@@ -36,8 +37,12 @@
 #include "net/base/network_interfaces.h"
 #include "services/network/public/cpp/p2p_socket_type.h"
 #include "services/network/public/mojom/p2p.mojom-blink.h"
+#include "third_party/blink/renderer/platform/heap/impl/persistent.h"
+#include "third_party/blink/renderer/platform/mojo/heap_mojo_receiver.h"
+#include "third_party/blink/renderer/platform/mojo/mojo_binding_context.h"
 #include "third_party/blink/renderer/platform/p2p/network_list_manager.h"
 #include "third_party/blink/renderer/platform/platform_export.h"
+#include "third_party/blink/renderer/platform/supplementable.h"
 #include "third_party/blink/renderer/platform/wtf/vector.h"
 
 namespace base {
@@ -46,18 +51,22 @@
 
 namespace blink {
 class NetworkListObserver;
-}
-
-namespace blink {
 
 // This class is created on the main thread, but is used primarily on the
 // WebRTC worker threads.
 class PLATFORM_EXPORT P2PSocketDispatcher
-    : public base::RefCountedThreadSafe<P2PSocketDispatcher>,
+    : public GarbageCollected<P2PSocketDispatcher>,
+      public Supplement<MojoBindingContext>,
       public blink::NetworkListManager,
       public network::mojom::blink::P2PNetworkNotificationClient {
  public:
-  P2PSocketDispatcher();
+  static const char kSupplementName[];
+
+  static P2PSocketDispatcher& From(MojoBindingContext& context);
+
+  P2PSocketDispatcher(MojoBindingContext& context,
+                      base::PassKey<P2PSocketDispatcher>);
+  ~P2PSocketDispatcher() override;
 
   // blink::NetworkListManager interface:
   void AddNetworkListObserver(
@@ -68,11 +77,9 @@
   mojo::SharedRemote<network::mojom::blink::P2PSocketManager>
   GetP2PSocketManager();
 
+  void Trace(Visitor*) const override;
+
  private:
-  friend class base::RefCountedThreadSafe<P2PSocketDispatcher>;
-
-  ~P2PSocketDispatcher() override;
-
   // network::mojom::blink::P2PNetworkNotificationClient interface.
   void NetworkListChanged(
       const Vector<net::NetworkInterface>& networks,
@@ -103,8 +110,9 @@
   net::IPAddress default_ipv4_local_address_;
   net::IPAddress default_ipv6_local_address_;
 
-  mojo::Receiver<network::mojom::blink::P2PNetworkNotificationClient>
-      network_notification_client_receiver_{this};
+  HeapMojoReceiver<network::mojom::blink::P2PNetworkNotificationClient,
+                   P2PSocketDispatcher>
+      network_notification_client_receiver_;
 
   DISALLOW_COPY_AND_ASSIGN(P2PSocketDispatcher);
 };
diff --git a/third_party/blink/renderer/platform/supplementable.h b/third_party/blink/renderer/platform/supplementable.h
index 1ff7c996..36d81ed 100644
--- a/third_party/blink/renderer/platform/supplementable.h
+++ b/third_party/blink/renderer/platform/supplementable.h
@@ -26,6 +26,7 @@
 #ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_SUPPLEMENTABLE_H_
 #define THIRD_PARTY_BLINK_RENDERER_PLATFORM_SUPPLEMENTABLE_H_
 
+#include <cstddef>
 #include "base/macros.h"
 #include "third_party/blink/renderer/platform/heap/handle.h"
 #include "third_party/blink/renderer/platform/wtf/assertions.h"
@@ -120,7 +121,7 @@
  public:
   // TODO(haraken): Remove the default constructor.
   // All Supplement objects should be instantiated with |supplementable_|.
-  Supplement() {}
+  explicit Supplement(std::nullptr_t) {}
 
   explicit Supplement(T& supplementable) : supplementable_(&supplementable) {}
 
diff --git a/third_party/blink/renderer/platform/webrtc/webrtc_video_frame_adapter.cc b/third_party/blink/renderer/platform/webrtc/webrtc_video_frame_adapter.cc
index 971c2e07..ec354dc 100644
--- a/third_party/blink/renderer/platform/webrtc/webrtc_video_frame_adapter.cc
+++ b/third_party/blink/renderer/platform/webrtc/webrtc_video_frame_adapter.cc
@@ -306,8 +306,6 @@
 
 scoped_refptr<media::VideoFrame> WebRtcVideoFrameAdapter::GetOrWrapFrameForSize(
     const ScaledBufferSize& size) const {
-  if (size == full_size_)
-    return frame_;
   double requested_scale_factor =
       static_cast<double>(size.natural_size.width()) /
       size.visible_rect.width();
diff --git a/third_party/blink/renderer/platform/webrtc/webrtc_video_frame_adapter_test.cc b/third_party/blink/renderer/platform/webrtc/webrtc_video_frame_adapter_test.cc
index 1130071..d5bec32d 100644
--- a/third_party/blink/renderer/platform/webrtc/webrtc_video_frame_adapter_test.cc
+++ b/third_party/blink/renderer/platform/webrtc/webrtc_video_frame_adapter_test.cc
@@ -253,6 +253,53 @@
   EXPECT_EQ(adapted_frame, frame_360p);
 }
 
+TEST(WebRtcVideoFrameAdapterTest,
+     MapPreScaledFrameEvenIfOriginalFrameHasSoftAppliedScaling) {
+  std::vector<webrtc::VideoFrameBuffer::Type> kNv12 = {
+      webrtc::VideoFrameBuffer::Type::kNV12};
+  const gfx::Size kSize720p(1280, 720);
+  const gfx::Rect kRect720p(0, 0, 1280, 720);
+  const gfx::Size kSize360p(640, 360);
+  const gfx::Rect kRect360p(0, 0, 640, 360);
+
+  // The strictness of the mock ensures no additional scaling.
+  scoped_refptr<MockSharedResources> resources =
+      new testing::StrictMock<MockSharedResources>();
+
+  auto frame_720p = CreateTestFrame(kSize720p, kRect720p, kSize720p,
+                                    media::VideoFrame::STORAGE_OWNED_MEMORY,
+                                    media::VideoPixelFormat::PIXEL_FORMAT_NV12);
+  auto frame_360p = CreateTestFrame(kSize360p, kRect360p, kSize360p,
+                                    media::VideoFrame::STORAGE_OWNED_MEMORY,
+                                    media::VideoPixelFormat::PIXEL_FORMAT_NV12);
+
+  // Soft-apply scaling of |frame_720p| so that its natural size is 360p.
+  // Because the soft-applied frame is still backed by a 720p coded size frame,
+  // we should still prefer to map |frame_360p| when mapping at 360p size.
+  scoped_refptr<media::VideoFrame> soft_scaled_frame =
+      media::VideoFrame::WrapVideoFrame(frame_720p, frame_720p->format(),
+                                        kRect720p, kSize360p);
+
+  rtc::scoped_refptr<WebRtcVideoFrameAdapter> multi_buffer(
+      new rtc::RefCountedObject<WebRtcVideoFrameAdapter>(
+          soft_scaled_frame,
+          std::vector<scoped_refptr<media::VideoFrame>>({frame_360p}),
+          resources));
+
+  // The adapter should reflect the natural size, not the coded size.
+  EXPECT_EQ(multi_buffer->width(), kSize360p.width());
+  EXPECT_EQ(multi_buffer->height(), kSize360p.height());
+
+  // Mapping produces a frame of the correct size.
+  auto mapped_frame = multi_buffer->GetMappedFrameBuffer(kNv12);
+  EXPECT_EQ(mapped_frame->width(), kSize360p.width());
+  EXPECT_EQ(mapped_frame->height(), kSize360p.height());
+  // The mapping above should be backed by |frame_360p|.
+  auto adapted_frame = multi_buffer->GetAdaptedVideoBufferForTesting(
+      WebRtcVideoFrameAdapter::ScaledBufferSize(kRect720p, kSize360p));
+  EXPECT_EQ(adapted_frame, frame_360p);
+}
+
 TEST(WebRtcVideoFrameAdapterTest, MapScaledFrameScalesFromClosestFrame) {
   std::vector<webrtc::VideoFrameBuffer::Type> kNv12 = {
       webrtc::VideoFrameBuffer::Type::kNV12};
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index 20e2b35..89ddd3c 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -737,30 +737,18 @@
 crbug.com/722287 external/wpt/css/css-flexbox/abspos/flex-abspos-staticpos-justify-content-rtl-002.html [ Failure ]
 crbug.com/722287 external/wpt/css/css-flexbox/abspos/flex-abspos-staticpos-justify-content-vertWM-001.html [ Failure ]
 crbug.com/722287 external/wpt/css/css-flexbox/abspos/flex-abspos-staticpos-justify-content-vertWM-002.html [ Failure ]
-crbug.com/885175 external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-001.html [ Failure ]
-crbug.com/885175 external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-002.html [ Failure ]
-crbug.com/885175 external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-img-001.html [ Failure ]
-crbug.com/885175 external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-img-002.html [ Failure ]
-crbug.com/885175 external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-rtl-001.html [ Failure ]
-crbug.com/885175 external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-rtl-002.html [ Failure ]
-crbug.com/885175 external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-rtl-003.html [ Failure ]
-crbug.com/885175 external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-rtl-004.html [ Failure ]
-crbug.com/885175 external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-vertWM-001.html [ Failure ]
-crbug.com/885175 external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-vertWM-002.html [ Failure ]
-crbug.com/885175 external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-vertWM-003.html [ Failure ]
-crbug.com/885175 external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-vertWM-004.html [ Failure ]
-crbug.com/885175 external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-001.html [ Failure ]
-crbug.com/885175 external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-002.html [ Failure ]
-crbug.com/885175 external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-img-001.html [ Failure ]
-crbug.com/885175 external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-img-002.html [ Failure ]
-crbug.com/885175 external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-rtl-001.html [ Failure ]
-crbug.com/885175 external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-rtl-002.html [ Failure ]
-crbug.com/885175 external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-rtl-003.html [ Failure ]
-crbug.com/885175 external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-rtl-004.html [ Failure ]
-crbug.com/885175 external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-vertWM-001.html [ Failure ]
-crbug.com/885175 external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-vertWM-002.html [ Failure ]
-crbug.com/885175 external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-vertWM-003.html [ Failure ]
-crbug.com/885175 external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-vertWM-004.html [ Failure ]
+crbug.com/1192763 external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-002.html [ Failure ]
+crbug.com/1192763 external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-img-002.html [ Failure ]
+crbug.com/1192763 external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-rtl-003.html [ Failure ]
+crbug.com/1192763 external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-rtl-004.html [ Failure ]
+crbug.com/1192763 external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-vertWM-003.html [ Failure ]
+crbug.com/1192763 external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-vertWM-004.html [ Failure ]
+crbug.com/1192763 external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-002.html [ Failure ]
+crbug.com/1192763 external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-img-002.html [ Failure ]
+crbug.com/1192763 external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-rtl-003.html [ Failure ]
+crbug.com/1192763 external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-rtl-004.html [ Failure ]
+crbug.com/1192763 external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-vertWM-003.html [ Failure ]
+crbug.com/1192763 external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-vertWM-004.html [ Failure ]
 
 # [css-ui]
 # Layout team disagrees with the spec for this particular test.
@@ -3503,6 +3491,30 @@
 crbug.com/885175 external/wpt/css/css-grid/alignment/grid-self-alignment-baseline-with-grid-002.html [ Skip ]
 crbug.com/885175 external/wpt/css/css-grid/alignment/grid-self-alignment-baseline-with-grid-004.html [ Skip ]
 crbug.com/885175 external/wpt/css/css-grid/alignment/grid-self-alignment-baseline-with-grid-003.html [ Skip ]
+crbug.com/885175 external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-img-last-baseline-001.html [ Failure ]
+crbug.com/885175 external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-img-last-baseline-002.html [ Failure ]
+crbug.com/885175 external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-last-baseline-001.html [ Failure ]
+crbug.com/885175 external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-last-baseline-002.html [ Failure ]
+crbug.com/885175 external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-rtl-last-baseline-001.html [ Failure ]
+crbug.com/885175 external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-rtl-last-baseline-002.html [ Failure ]
+crbug.com/885175 external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-rtl-last-baseline-003.html [ Failure ]
+crbug.com/885175 external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-rtl-last-baseline-004.html [ Failure ]
+crbug.com/885175 external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-vertWM-last-baseline-001.html [ Failure ]
+crbug.com/885175 external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-vertWM-last-baseline-002.html [ Failure ]
+crbug.com/885175 external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-vertWM-last-baseline-003.html [ Failure ]
+crbug.com/885175 external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-vertWM-last-baseline-004.html [ Failure ]
+crbug.com/885175 external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-img-last-baseline-001.html [ Failure ]
+crbug.com/885175 external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-img-last-baseline-002.html [ Failure ]
+crbug.com/885175 external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-last-baseline-001.html [ Failure ]
+crbug.com/885175 external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-last-baseline-002.html [ Failure ]
+crbug.com/885175 external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-rtl-last-baseline-001.html [ Failure ]
+crbug.com/885175 external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-rtl-last-baseline-002.html [ Failure ]
+crbug.com/885175 external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-rtl-last-baseline-003.html [ Failure ]
+crbug.com/885175 external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-rtl-last-baseline-004.html [ Failure ]
+crbug.com/885175 external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-vertWM-last-baseline-001.html [ Failure ]
+crbug.com/885175 external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-vertWM-last-baseline-002.html [ Failure ]
+crbug.com/885175 external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-vertWM-last-baseline-003.html [ Failure ]
+crbug.com/885175 external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-vertWM-last-baseline-004.html [ Failure ]
 
 # Baseline Content-Alignment is not implemented yet for CSS Grid Layout
 crbug.com/764235 external/wpt/css/css-grid/alignment/grid-item-content-baseline-001.html [ Skip ]
@@ -3555,6 +3567,18 @@
 
 ### Tests failing with LayoutNGGrid enabled:
 crbug.com/1045599 virtual/layout-ng-grid/external/wpt/css/css-grid/abspos/absolute-positioning-grid-container-parent-001.html [ Failure ]
+crbug.com/1192752 virtual/layout-ng-grid/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-001.html [ Failure ]
+crbug.com/1192752 virtual/layout-ng-grid/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-img-001.html [ Failure ]
+crbug.com/1192752 virtual/layout-ng-grid/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-rtl-001.html [ Failure ]
+crbug.com/1192752 virtual/layout-ng-grid/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-rtl-002.html [ Failure ]
+crbug.com/1192752 virtual/layout-ng-grid/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-vertWM-001.html [ Failure ]
+crbug.com/1192752 virtual/layout-ng-grid/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-vertWM-002.html [ Failure ]
+crbug.com/1192752 virtual/layout-ng-grid/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-001.html [ Failure ]
+crbug.com/1192752 virtual/layout-ng-grid/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-img-001.html [ Failure ]
+crbug.com/1192752 virtual/layout-ng-grid/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-rtl-001.html [ Failure ]
+crbug.com/1192752 virtual/layout-ng-grid/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-rtl-002.html [ Failure ]
+crbug.com/1192752 virtual/layout-ng-grid/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-vertWM-001.html [ Failure ]
+crbug.com/1192752 virtual/layout-ng-grid/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-vertWM-002.html [ Failure ]
 crbug.com/1045599 virtual/layout-ng-grid/external/wpt/css/css-grid/abspos/grid-positioned-items-gaps-001.html [ Crash Failure ]
 crbug.com/1045599 virtual/layout-ng-grid/external/wpt/css/css-grid/abspos/grid-positioned-items-gaps-rtl-001.html [ Crash Failure ]
 crbug.com/1045599 virtual/layout-ng-grid/external/wpt/css/css-grid/abspos/grid-positioned-items-implicit-grid-001.html [ Crash ]
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-001-ref.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-001-ref.html
index 36b570f..cb6d12be 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-001-ref.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-001-ref.html
@@ -54,7 +54,6 @@
     <br>
     <!-- <baseline-position> -->
     <div class="container"><div class="alignStart"><!--baseline--></div></div>
-    <div class="container"><div class="alignEnd"><!--last baseline--></div></div>
     <br>
     <!-- <self-position>, part 1: -->
     <div class="container"><div class="alignCenter"><!--center--></div></div>
@@ -78,7 +77,6 @@
     <br>
     <!-- <baseline-position> -->
     <div class="container"><div class="alignStart"><!--baseline--></div></div>
-    <div class="container"><div class="alignEnd"><!--last baseline--></div></div>
     <br>
     <!-- <self-position>, part 1: -->
     <div class="container"><div class="alignCenter"><!--center--></div></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-001.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-001.html
index a3ee9b4..8fd4eca3 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-001.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-001.html
@@ -55,7 +55,6 @@
     <br>
     <!-- <baseline-position> -->
     <div class="container"><div style="align-self: baseline"></div></div>
-    <div class="container"><div style="align-self: last baseline"></div></div>
     <br>
     <!-- <self-position>, part 1 -->
     <div class="container"><div style="align-self: center"></div></div>
@@ -79,7 +78,6 @@
     <br>
     <!-- <baseline-position> -->
     <div class="container"><div style="align-self: baseline"></div></div>
-    <div class="container"><div style="align-self: last baseline"></div></div>
     <br>
     <!-- <self-position>, part 1 -->
     <div class="container"><div style="align-self: center"></div></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-002-ref.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-002-ref.html
index 40dd0f2f..4197dc5 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-002-ref.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-002-ref.html
@@ -53,7 +53,6 @@
     <br>
     <!-- <baseline-position> -->
     <div class="container"><div class="alignStart"><!--baseline--></div></div>
-    <div class="container"><div class="alignEnd"><!--last baseline--></div></div>
     <br>
     <!-- <self-position>, part 1: -->
     <div class="container"><div class="alignCenter"><!--center--></div></div>
@@ -77,7 +76,6 @@
     <br>
     <!-- <baseline-position> -->
     <div class="container"><div class="alignStart"><!--baseline--></div></div>
-    <div class="container"><div class="alignEnd"><!--last baseline--></div></div>
     <br>
     <!-- <self-position>, part 1: -->
     <div class="container"><div class="alignCenter"><!--center--></div></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-002.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-002.html
index 61f84a6d..a78dfc4 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-002.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-002.html
@@ -54,7 +54,6 @@
     <br>
     <!-- <baseline-position> -->
     <div class="container"><div style="align-self: baseline"></div></div>
-    <div class="container"><div style="align-self: last baseline"></div></div>
     <br>
     <!-- <self-position>, part 1 -->
     <div class="container"><div style="align-self: center"></div></div>
@@ -78,7 +77,6 @@
     <br>
     <!-- <baseline-position> -->
     <div class="container"><div style="align-self: baseline"></div></div>
-    <div class="container"><div style="align-self: last baseline"></div></div>
     <br>
     <!-- <self-position>, part 1 -->
     <div class="container"><div style="align-self: center"></div></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-img-001-ref.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-img-001-ref.html
index a14d630..06d9d36 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-img-001-ref.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-img-001-ref.html
@@ -57,8 +57,6 @@
     <!-- <baseline-position> -->
     <div class="container"><img src="support/colors-8x16.png"
                                 class="alignStart"><!--baseline--></div>
-    <div class="container"><img src="support/colors-8x16.png"
-                                class="alignEnd"><!--last baseline--></div>
     <br>
     <!-- <self-position>, part 1: -->
     <div class="container"><img src="support/colors-8x16.png"
@@ -97,8 +95,6 @@
     <!-- <baseline-position> -->
     <div class="container"><img src="support/colors-8x16.png"
                                 class="alignStart"><!--baseline--></div>
-    <div class="container"><img src="support/colors-8x16.png"
-                                class="alignEnd"><!--last baseline--></div>
     <br>
     <!-- <self-position>, part 1: -->
     <div class="container"><img src="support/colors-8x16.png"
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-img-001.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-img-001.html
index f703721..cb590660 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-img-001.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-img-001.html
@@ -56,8 +56,6 @@
     <!-- <baseline-position> -->
     <div class="container"><img src="support/colors-8x16.png"
                                 style="align-self: baseline"></div>
-    <div class="container"><img src="support/colors-8x16.png"
-                                style="align-self: last baseline"></div>
     <br>
     <!-- <self-position>, part 1 -->
     <div class="container"><img src="support/colors-8x16.png"
@@ -96,8 +94,6 @@
     <!-- <baseline-position> -->
     <div class="container"><img src="support/colors-8x16.png"
                                 style="align-self: baseline"></div>
-    <div class="container"><img src="support/colors-8x16.png"
-                                style="align-self: last baseline"></div>
     <br>
     <!-- <self-position>, part 1 -->
     <div class="container"><img src="support/colors-8x16.png"
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-img-002-ref.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-img-002-ref.html
index ea15f8de..a31ac1d6 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-img-002-ref.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-img-002-ref.html
@@ -56,8 +56,6 @@
     <!-- <baseline-position> -->
     <div class="container"><img src="support/colors-8x16.png"
                                 class="alignStart"><!--baseline--></div>
-    <div class="container"><img src="support/colors-8x16.png"
-                                class="alignEnd"><!--last baseline--></div>
     <br>
     <!-- <self-position>, part 1: -->
     <div class="container"><img src="support/colors-8x16.png"
@@ -96,8 +94,6 @@
     <!-- <baseline-position> -->
     <div class="container"><img src="support/colors-8x16.png"
                                 class="alignStart"><!--baseline--></div>
-    <div class="container"><img src="support/colors-8x16.png"
-                                class="alignEnd"><!--last baseline--></div>
     <br>
     <!-- <self-position>, part 1: -->
     <div class="container"><img src="support/colors-8x16.png"
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-img-002.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-img-002.html
index 61cce17..f3cc794a 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-img-002.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-img-002.html
@@ -55,8 +55,6 @@
     <!-- <baseline-position> -->
     <div class="container"><img src="support/colors-8x16.png"
                                 style="align-self: baseline"></div>
-    <div class="container"><img src="support/colors-8x16.png"
-                                style="align-self: last baseline"></div>
     <br>
     <!-- <self-position>, part 1 -->
     <div class="container"><img src="support/colors-8x16.png"
@@ -95,8 +93,6 @@
     <!-- <baseline-position> -->
     <div class="container"><img src="support/colors-8x16.png"
                                 style="align-self: baseline"></div>
-    <div class="container"><img src="support/colors-8x16.png"
-                                style="align-self: last baseline"></div>
     <br>
     <!-- <self-position>, part 1 -->
     <div class="container"><img src="support/colors-8x16.png"
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-img-last-baseline-001-ref.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-img-last-baseline-001-ref.html
new file mode 100644
index 0000000..37655b0
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-img-last-baseline-001-ref.html
@@ -0,0 +1,57 @@
+<!DOCTYPE html>
+<!--
+     Any copyright is dedicated to the Public Domain.
+     http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<html>
+<head>
+  <meta charset="utf-8">
+  <title>CSS Reference</title>
+  <link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
+  <style>
+    .container {
+      display: block;
+      padding: 1px 2px;
+      border: 1px solid black;
+      background: yellow;
+      margin-bottom: 5px;
+      margin-right: 5px;
+      float: left; /* For testing in "rows" of containers */
+    }
+    br { clear: both }
+
+    .big > .container {
+      height: 40px;
+      width: 22px;
+    }
+    .small > .container {
+      height: 2px;
+      width: 4px;
+      margin-bottom: 20px; /* to reduce overlap between overflowing images */
+    }
+
+    .container > * {
+      margin-left: 3px;
+      display: block;
+    }
+    .big   .alignStart  { margin-top:   2px; }
+    .big   .alignCenter { margin-top:   9px; }
+    .big   .alignEnd    { margin-top:  16px; }
+    .small .alignStart  { margin-top:   0px; }
+    .small .alignCenter { margin-top:  -7px; }
+    .small .alignEnd    { margin-top: -14px; }
+  </style>
+</head>
+<body>
+  <!-- The last baseline value, from
+       https://www.w3.org/TR/css-align-3/#propdef-align-self -->
+  <div class="big">
+    <div class="container"><img src="support/colors-8x16.png"
+                                class="alignEnd"><!--last baseline--></div>
+  </div>
+  <div class="small">
+    <div class="container"><img src="support/colors-8x16.png"
+                                class="alignEnd"><!--last baseline--></div>
+  </div>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-img-last-baseline-001.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-img-last-baseline-001.html
new file mode 100644
index 0000000..35fb55c
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-img-last-baseline-001.html
@@ -0,0 +1,56 @@
+<!DOCTYPE html>
+<!--
+     Any copyright is dedicated to the Public Domain.
+     http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<html>
+<head>
+  <meta charset="utf-8">
+  <title>CSS Test: Static position of abspos replaced children in a grid container, with various "align-self" values</title>
+  <link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
+  <link rel="help" href="https://drafts.csswg.org/css-grid/#abspos-items">
+  <link rel="match" href="grid-abspos-staticpos-align-self-img-last-baseline-001-ref.html">
+  <style>
+    .container {
+      display: grid;
+      padding: 1px 2px;
+      border: 1px solid black;
+      background: yellow;
+      margin-bottom: 5px;
+      margin-right: 5px;
+      float: left; /* For testing in "rows" of containers */
+      position: relative;
+    }
+    br { clear: both }
+
+    .big > .container {
+      height: 40px;
+      width: 22px;
+      grid: 2px 30px 2px / 3px 14px 3px;
+    }
+    .small > .container {
+      grid: 0px 2px 0px / 3px 2px 3px;
+      height: 2px;
+      width: 4px;
+      margin-bottom: 20px; /* to reduce overlap between overflowing images */
+    }
+
+    .container > * {
+      position: absolute;
+      grid-area: 2 / 2 / 3 / 3;
+    }
+  </style>
+</head>
+<body>
+  <!-- The last baseline value, from
+       https://www.w3.org/TR/css-align-3/#propdef-align-self -->
+  <div class="big">
+    <div class="container"><img src="support/colors-8x16.png"
+                                style="align-self: last baseline"></div>
+  </div>
+  <div class="small">
+    <div class="container"><img src="support/colors-8x16.png"
+                                style="align-self: last baseline"></div>
+  </div>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-img-last-baseline-002-ref.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-img-last-baseline-002-ref.html
new file mode 100644
index 0000000..76d52fd
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-img-last-baseline-002-ref.html
@@ -0,0 +1,56 @@
+<!DOCTYPE html>
+<!--
+     Any copyright is dedicated to the Public Domain.
+     http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<html>
+<head>
+  <meta charset="utf-8">
+  <title>CSS Reference</title>
+  <link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
+  <style>
+    .container {
+      display: block;
+      padding: 1px 2px;
+      border: 1px solid black;
+      background: yellow;
+      margin-bottom: 5px;
+      margin-right: 5px;
+      float: left; /* For testing in "rows" of containers */
+    }
+    br { clear: both }
+
+    .big > .container {
+      height: 40px;
+      width: 22px;
+    }
+    .small > .container {
+      height: 2px;
+      width: 4px;
+      margin-bottom: 20px; /* to reduce overlap between overflowing images */
+    }
+
+    .container > * {
+      display: block;
+    }
+    .big   .alignStart  { margin-top:   0px; }
+    .big   .alignCenter { margin-top:  13px; }
+    .big   .alignEnd    { margin-top:  26px; }
+    .small .alignStart  { margin-top:   0px; }
+    .small .alignCenter { margin-top:  -6px; }
+    .small .alignEnd    { margin-top: -12px; }
+  </style>
+</head>
+<body>
+  <!-- The last baseline value, from
+       https://www.w3.org/TR/css-align-3/#propdef-align-self -->
+  <div class="big">
+    <div class="container"><img src="support/colors-8x16.png"
+                                class="alignEnd"><!--last baseline--></div>
+  </div>
+  <div class="small">
+    <div class="container"><img src="support/colors-8x16.png"
+                                class="alignEnd"><!--last baseline--></div>
+  </div>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-img-last-baseline-002.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-img-last-baseline-002.html
new file mode 100644
index 0000000..0287815
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-img-last-baseline-002.html
@@ -0,0 +1,55 @@
+<!DOCTYPE html>
+<!--
+     Any copyright is dedicated to the Public Domain.
+     http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<html>
+<head>
+  <meta charset="utf-8">
+  <title>CSS Test: Static position of abspos replaced children in a static-pos grid container, with various "align-self" values</title>
+  <link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
+  <link rel="help" href="https://drafts.csswg.org/css-grid/#abspos-items">
+  <link rel="match" href="grid-abspos-staticpos-align-self-img-last-baseline-002-ref.html">
+  <style>
+    .container {
+      display: grid;
+      padding: 1px 2px;
+      border: 1px solid black;
+      background: yellow;
+      margin-bottom: 5px;
+      margin-right: 5px;
+      float: left; /* For testing in "rows" of containers */
+    }
+    br { clear: both }
+
+    .big > .container {
+      height: 40px;
+      width: 22px;
+      grid: 2px 30px 2px / 3px 14px 3px;
+    }
+    .small > .container {
+      grid: 0px 2px 0px / 3px 2px 3px;
+      height: 2px;
+      width: 4px;
+      margin-bottom: 20px; /* to reduce overlap between overflowing images */
+    }
+
+    .container > * {
+      position: absolute;
+      grid-area: 2 / 2 / 3 / 3;
+    }
+  </style>
+</head>
+<body>
+  <!-- The last baseline value, from
+       https://www.w3.org/TR/css-align-3/#propdef-align-self -->
+  <div class="big">
+    <div class="container"><img src="support/colors-8x16.png"
+                                style="align-self: last baseline"></div>
+  </div>
+  <div class="small">
+    <div class="container"><img src="support/colors-8x16.png"
+                                style="align-self: last baseline"></div>
+  </div>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-last-baseline-001-ref.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-last-baseline-001-ref.html
new file mode 100644
index 0000000..6bc5ba4f
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-last-baseline-001-ref.html
@@ -0,0 +1,56 @@
+<!DOCTYPE html>
+<!--
+     Any copyright is dedicated to the Public Domain.
+     http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<html>
+<head>
+  <meta charset="utf-8">
+  <title>CSS Reference</title>
+  <link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
+  <style>
+    .container {
+      display: block;
+      padding: 1px 2px;
+      border: 1px solid black;
+      background: yellow;
+      margin-bottom: 5px;
+      margin-right: 5px;
+      float: left; /* For testing in "rows" of containers */
+    }
+    br { clear: both }
+
+    .big > .container {
+      height: 30px;
+      width: 22px;
+    }
+    .small > .container {
+      height: 2px;
+      width: 4px;
+    }
+
+    .container > * {
+      background: teal;
+      height: 6px;
+      width: 8px;
+      margin-left: 3px;
+    }
+    .big   .alignStart  { margin-top:  2px; }
+    .big   .alignCenter { margin-top:  9px; }
+    .big   .alignEnd    { margin-top: 16px; }
+    .small .alignStart  { margin-top:  0px; }
+    .small .alignCenter { margin-top: -2px; }
+    .small .alignEnd    { margin-top: -4px; }
+  </style>
+</head>
+<body>
+  <!-- The last baseline value, from
+       https://www.w3.org/TR/css-align-3/#propdef-align-self -->
+  <div class="big">
+    <div class="container"><div class="alignEnd"><!--last baseline--></div></div>
+  </div>
+  <div class="small">
+    <div class="container"><div class="alignEnd"><!--last baseline--></div></div>
+  </div>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-last-baseline-001.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-last-baseline-001.html
new file mode 100644
index 0000000..da6ce34a
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-last-baseline-001.html
@@ -0,0 +1,57 @@
+<!DOCTYPE html>
+<!--
+     Any copyright is dedicated to the Public Domain.
+     http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<html>
+<head>
+  <meta charset="utf-8">
+  <title>CSS Test: Static position of abspos children in a grid container, with various "align-self" values</title>
+  <link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
+  <link rel="help" href="https://drafts.csswg.org/css-grid/#abspos-items">
+  <link rel="match" href="grid-abspos-staticpos-align-self-last-baseline-001-ref.html">
+  <style>
+    .container {
+      display: grid;
+      padding: 1px 2px;
+      border: 1px solid black;
+      background: yellow;
+      margin-bottom: 5px;
+      margin-right: 5px;
+      float: left; /* For testing in "rows" of containers */
+      align-items: center; /* To exercise 'align-self: auto' on children */
+      position: relative;
+    }
+    br { clear: both }
+
+    .big > .container {
+      height: 30px;
+      width: 22px;
+      grid: 2px 20px 2px / 3px 14px 3px;
+    }
+    .small > .container {
+      grid: 0px 2px 0px / 3px 2px 3px;
+      height: 2px;
+      width: 4px;
+    }
+
+    .container > * {
+      position: absolute;
+      grid-area: 2 / 2 / 3 / 3;
+      background: teal;
+      height: 6px;
+      width: 8px;
+    }
+  </style>
+</head>
+<body>
+  <!-- The last baseline value, from
+       https://www.w3.org/TR/css-align-3/#propdef-align-self -->
+  <div class="big">
+    <div class="container"><div style="align-self: last baseline"></div></div>
+  </div>
+  <div class="small">
+    <div class="container"><div style="align-self: last baseline"></div></div>
+  </div>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-last-baseline-002-ref.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-last-baseline-002-ref.html
new file mode 100644
index 0000000..f1ca180
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-last-baseline-002-ref.html
@@ -0,0 +1,51 @@
+<!DOCTYPE html>
+<!--
+     Any copyright is dedicated to the Public Domain.
+     http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<html>
+<head>
+  <meta charset="utf-8">
+  <title>CSS Reference</title>
+  <link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
+  <style>
+    .container {
+      display: block;
+      padding: 1px 2px;
+      border: 1px solid black;
+      background: yellow;
+      margin-bottom: 5px;
+      margin-right: 5px;
+      float: left; /* For testing in "rows" of containers */
+    }
+    br { clear: both }
+
+    .big > .container {
+      height: 30px;
+      width: 22px;
+    }
+    .small > .container {
+      height: 2px;
+      width: 4px;
+    }
+
+    .container > * {
+      background: teal;
+      height: 6px;
+      width: 8px;
+    }
+    .big   .alignEnd    { margin-top: 26px; }
+    .small .alignEnd    { margin-top: -2px; }
+  </style>
+</head>
+<body>
+  <!-- The last baseline value, from
+       https://www.w3.org/TR/css-align-3/#propdef-align-self -->
+  <div class="big">
+    <div class="container"><div class="alignEnd"><!--last baseline--></div></div>
+  </div>
+  <div class="small">
+    <div class="container"><div class="alignEnd"><!--last baseline--></div></div>
+  </div>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-last-baseline-002.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-last-baseline-002.html
new file mode 100644
index 0000000..54fb9ae
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-last-baseline-002.html
@@ -0,0 +1,56 @@
+<!DOCTYPE html>
+<!--
+     Any copyright is dedicated to the Public Domain.
+     http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<html>
+<head>
+  <meta charset="utf-8">
+  <title>CSS Test: Static position of abspos children in a static-pos grid container, with various "align-self" values</title>
+  <link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
+  <link rel="help" href="https://drafts.csswg.org/css-grid/#abspos-items">
+  <link rel="match" href="grid-abspos-staticpos-align-self-last-baseline-002-ref.html">
+  <style>
+    .container {
+      display: grid;
+      padding: 1px 2px;
+      border: 1px solid black;
+      background: yellow;
+      margin-bottom: 5px;
+      margin-right: 5px;
+      float: left; /* For testing in "rows" of containers */
+      align-items: center; /* To exercise 'align-self: auto' on children */
+    }
+    br { clear: both }
+
+    .big > .container {
+      height: 30px;
+      width: 22px;
+      grid: 2px 20px 2px / 3px 14px 3px;
+    }
+    .small > .container {
+      grid: 0px 2px 0px / 3px 2px 3px;
+      height: 2px;
+      width: 4px;
+    }
+
+    .container > * {
+      position: absolute;
+      grid-area: 2 / 2 / 3 / 3;
+      background: teal;
+      height: 6px;
+      width: 8px;
+    }
+  </style>
+</head>
+<body>
+  <!-- The last baseline value, from
+       https://www.w3.org/TR/css-align-3/#propdef-align-self -->
+  <div class="big">
+    <div class="container"><div style="align-self: last baseline"></div></div>
+  </div>
+  <div class="small">
+    <div class="container"><div style="align-self: last baseline"></div></div>
+  </div>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-rtl-001-ref.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-rtl-001-ref.html
index 671b315..a5ad3a3 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-rtl-001-ref.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-rtl-001-ref.html
@@ -56,7 +56,6 @@
     <br>
     <!-- <baseline-position> -->
     <div class="container"><div class="alignStart"><!--baseline--></div></div>
-    <div class="container"><div class="alignEnd"><!--last baseline--></div></div>
     <br>
     <!-- <self-position>, part 1: -->
     <div class="container"><div class="alignCenter"><!--center--></div></div>
@@ -82,7 +81,6 @@
     <br>
     <!-- <baseline-position> -->
     <div class="container"><div class="alignStart"><!--baseline--></div></div>
-    <div class="container"><div class="alignEnd"><!--last baseline--></div></div>
     <br>
     <!-- <self-position>, part 1: -->
     <div class="container"><div class="alignCenter"><!--center--></div></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-rtl-001.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-rtl-001.html
index 1b64da3..31def24 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-rtl-001.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-rtl-001.html
@@ -55,7 +55,6 @@
     <br>
     <!-- <baseline-position> -->
     <div class="container"><div style="align-self: baseline"></div></div>
-    <div class="container"><div style="align-self: last baseline"></div></div>
     <br>
     <!-- <self-position>, part 1 -->
     <div class="container"><div style="align-self: center"></div></div>
@@ -81,7 +80,6 @@
     <br>
     <!-- <baseline-position> -->
     <div class="container"><div style="align-self: baseline"></div></div>
-    <div class="container"><div style="align-self: last baseline"></div></div>
     <br>
     <!-- <self-position>, part 1 -->
     <div class="container"><div style="align-self: center"></div></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-rtl-002-ref.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-rtl-002-ref.html
index 671b315..a5ad3a3 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-rtl-002-ref.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-rtl-002-ref.html
@@ -56,7 +56,6 @@
     <br>
     <!-- <baseline-position> -->
     <div class="container"><div class="alignStart"><!--baseline--></div></div>
-    <div class="container"><div class="alignEnd"><!--last baseline--></div></div>
     <br>
     <!-- <self-position>, part 1: -->
     <div class="container"><div class="alignCenter"><!--center--></div></div>
@@ -82,7 +81,6 @@
     <br>
     <!-- <baseline-position> -->
     <div class="container"><div class="alignStart"><!--baseline--></div></div>
-    <div class="container"><div class="alignEnd"><!--last baseline--></div></div>
     <br>
     <!-- <self-position>, part 1: -->
     <div class="container"><div class="alignCenter"><!--center--></div></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-rtl-002.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-rtl-002.html
index 931f7ec..21936e9 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-rtl-002.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-rtl-002.html
@@ -56,7 +56,6 @@
     <br>
     <!-- <baseline-position> -->
     <div class="container"><div style="align-self: baseline"></div></div>
-    <div class="container"><div style="align-self: last baseline"></div></div>
     <br>
     <!-- <self-position>, part 1 -->
     <div class="container"><div style="align-self: center"></div></div>
@@ -82,7 +81,6 @@
     <br>
     <!-- <baseline-position> -->
     <div class="container"><div style="align-self: baseline"></div></div>
-    <div class="container"><div style="align-self: last baseline"></div></div>
     <br>
     <!-- <self-position>, part 1 -->
     <div class="container"><div style="align-self: center"></div></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-rtl-003-ref.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-rtl-003-ref.html
index cadaadd..50239d5f 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-rtl-003-ref.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-rtl-003-ref.html
@@ -56,7 +56,6 @@
     <br>
     <!-- <baseline-position> -->
     <div class="container"><div class="alignStart"><!--baseline--></div></div>
-    <div class="container"><div class="alignEnd"><!--last baseline--></div></div>
     <br>
     <!-- <self-position>, part 1: -->
     <div class="container"><div class="alignCenter"><!--center--></div></div>
@@ -82,7 +81,6 @@
     <br>
     <!-- <baseline-position> -->
     <div class="container"><div class="alignStart"><!--baseline--></div></div>
-    <div class="container"><div class="alignEnd"><!--last baseline--></div></div>
     <br>
     <!-- <self-position>, part 1: -->
     <div class="container"><div class="alignCenter"><!--center--></div></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-rtl-003.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-rtl-003.html
index b37639c9..e53bd19 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-rtl-003.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-rtl-003.html
@@ -54,7 +54,6 @@
     <br>
     <!-- <baseline-position> -->
     <div class="container"><div style="align-self: baseline"></div></div>
-    <div class="container"><div style="align-self: last baseline"></div></div>
     <br>
     <!-- <self-position>, part 1 -->
     <div class="container"><div style="align-self: center"></div></div>
@@ -80,7 +79,6 @@
     <br>
     <!-- <baseline-position> -->
     <div class="container"><div style="align-self: baseline"></div></div>
-    <div class="container"><div style="align-self: last baseline"></div></div>
     <br>
     <!-- <self-position>, part 1 -->
     <div class="container"><div style="align-self: center"></div></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-rtl-004-ref.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-rtl-004-ref.html
index cadaadd..50239d5f 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-rtl-004-ref.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-rtl-004-ref.html
@@ -56,7 +56,6 @@
     <br>
     <!-- <baseline-position> -->
     <div class="container"><div class="alignStart"><!--baseline--></div></div>
-    <div class="container"><div class="alignEnd"><!--last baseline--></div></div>
     <br>
     <!-- <self-position>, part 1: -->
     <div class="container"><div class="alignCenter"><!--center--></div></div>
@@ -82,7 +81,6 @@
     <br>
     <!-- <baseline-position> -->
     <div class="container"><div class="alignStart"><!--baseline--></div></div>
-    <div class="container"><div class="alignEnd"><!--last baseline--></div></div>
     <br>
     <!-- <self-position>, part 1: -->
     <div class="container"><div class="alignCenter"><!--center--></div></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-rtl-004.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-rtl-004.html
index bb4335f..1280542 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-rtl-004.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-rtl-004.html
@@ -55,7 +55,6 @@
     <br>
     <!-- <baseline-position> -->
     <div class="container"><div style="align-self: baseline"></div></div>
-    <div class="container"><div style="align-self: last baseline"></div></div>
     <br>
     <!-- <self-position>, part 1 -->
     <div class="container"><div style="align-self: center"></div></div>
@@ -81,7 +80,6 @@
     <br>
     <!-- <baseline-position> -->
     <div class="container"><div style="align-self: baseline"></div></div>
-    <div class="container"><div style="align-self: last baseline"></div></div>
     <br>
     <!-- <self-position>, part 1 -->
     <div class="container"><div style="align-self: center"></div></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-rtl-last-baseline-001-ref.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-rtl-last-baseline-001-ref.html
new file mode 100644
index 0000000..9c838e9e
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-rtl-last-baseline-001-ref.html
@@ -0,0 +1,58 @@
+<!DOCTYPE html>
+<!--
+     Any copyright is dedicated to the Public Domain.
+     http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<html>
+<head>
+  <meta charset="utf-8">
+  <title>CSS Reference</title>
+  <link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
+  <style>
+    .container {
+      display: block;
+      padding: 1px 2px;
+      border: 1px solid black;
+      background: yellow;
+      margin-bottom: 5px;
+      margin-right: 5px;
+      float: left; /* For testing in "rows" of containers */
+    }
+    br { clear: both }
+
+    .big > .container {
+      height: 30px;
+      width: 22px;
+    }
+    .small > .container {
+      height: 2px;
+      width: 4px;
+    }
+
+    .container > * {
+      background: teal;
+      height: 6px;
+      width: 8px;
+    }
+    .big   > .container > * { margin-left: 11px; }
+    .small > .container > * { margin-left: -7px; }
+
+    .big   .alignStart  { margin-top:  2px; }
+    .big   .alignCenter { margin-top:  9px; }
+    .big   .alignEnd    { margin-top: 16px; }
+    .small .alignStart  { margin-top:  0px; }
+    .small .alignCenter { margin-top: -2px; }
+    .small .alignEnd    { margin-top: -4px; }
+  </style>
+</head>
+<body>
+  <!-- The last baseline value, from
+       https://www.w3.org/TR/css-align-3/#propdef-align-self -->
+  <div class="big">
+    <div class="container"><div class="alignEnd"><!--last baseline--></div></div>
+  </div>
+  <div class="small">
+    <div class="container"><div class="alignEnd"><!--last baseline--></div></div>
+  </div>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-rtl-last-baseline-001.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-rtl-last-baseline-001.html
new file mode 100644
index 0000000..8804a39
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-rtl-last-baseline-001.html
@@ -0,0 +1,57 @@
+<!DOCTYPE html>
+<!--
+     Any copyright is dedicated to the Public Domain.
+     http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<html>
+<head>
+  <meta charset="utf-8">
+  <title>CSS Test: Static position of abspos children in a RTL grid container, with various "align-self" values</title>
+  <link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
+  <link rel="help" href="https://drafts.csswg.org/css-grid/#abspos-items">
+  <link rel="match" href="grid-abspos-staticpos-align-self-rtl-last-baseline-001-ref.html">
+  <style>
+    .container {
+      display: grid;
+      direction: rtl;
+      padding: 1px 2px;
+      border: 1px solid black;
+      background: yellow;
+      margin-bottom: 5px;
+      margin-right: 5px;
+      float: left; /* For testing in "rows" of containers */
+      position: relative;
+    }
+    br { clear: both }
+
+    .big > .container {
+      height: 30px;
+      width: 22px;
+      grid: 2px 20px 2px / 3px 14px 3px;
+    }
+    .small > .container {
+      grid: 0px 2px 0px / 3px 2px 3px;
+      height: 2px;
+      width: 4px;
+    }
+
+    .container > * {
+      position: absolute;
+      grid-area: 2 / 2 / 3 / 3;
+      background: teal;
+      height: 6px;
+      width: 8px;
+    }
+  </style>
+</head>
+<body>
+  <!-- The last baseline value, from
+       https://www.w3.org/TR/css-align-3/#propdef-align-self -->
+  <div class="big">
+    <div class="container"><div style="align-self: last baseline"></div></div>
+  </div>
+  <div class="small">
+    <div class="container"><div style="align-self: last baseline"></div></div>
+  </div>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-rtl-last-baseline-002-ref.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-rtl-last-baseline-002-ref.html
new file mode 100644
index 0000000..9c838e9e
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-rtl-last-baseline-002-ref.html
@@ -0,0 +1,58 @@
+<!DOCTYPE html>
+<!--
+     Any copyright is dedicated to the Public Domain.
+     http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<html>
+<head>
+  <meta charset="utf-8">
+  <title>CSS Reference</title>
+  <link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
+  <style>
+    .container {
+      display: block;
+      padding: 1px 2px;
+      border: 1px solid black;
+      background: yellow;
+      margin-bottom: 5px;
+      margin-right: 5px;
+      float: left; /* For testing in "rows" of containers */
+    }
+    br { clear: both }
+
+    .big > .container {
+      height: 30px;
+      width: 22px;
+    }
+    .small > .container {
+      height: 2px;
+      width: 4px;
+    }
+
+    .container > * {
+      background: teal;
+      height: 6px;
+      width: 8px;
+    }
+    .big   > .container > * { margin-left: 11px; }
+    .small > .container > * { margin-left: -7px; }
+
+    .big   .alignStart  { margin-top:  2px; }
+    .big   .alignCenter { margin-top:  9px; }
+    .big   .alignEnd    { margin-top: 16px; }
+    .small .alignStart  { margin-top:  0px; }
+    .small .alignCenter { margin-top: -2px; }
+    .small .alignEnd    { margin-top: -4px; }
+  </style>
+</head>
+<body>
+  <!-- The last baseline value, from
+       https://www.w3.org/TR/css-align-3/#propdef-align-self -->
+  <div class="big">
+    <div class="container"><div class="alignEnd"><!--last baseline--></div></div>
+  </div>
+  <div class="small">
+    <div class="container"><div class="alignEnd"><!--last baseline--></div></div>
+  </div>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-rtl-last-baseline-002.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-rtl-last-baseline-002.html
new file mode 100644
index 0000000..e63bfa28
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-rtl-last-baseline-002.html
@@ -0,0 +1,58 @@
+<!DOCTYPE html>
+<!--
+     Any copyright is dedicated to the Public Domain.
+     http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<html>
+<head>
+  <meta charset="utf-8">
+  <title>CSS Test: Static position of abspos LTR children in a RTL grid container, with various "align-self" values</title>
+  <link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
+  <link rel="help" href="https://drafts.csswg.org/css-grid/#abspos-items">
+  <link rel="match" href="grid-abspos-staticpos-align-self-rtl-last-baseline-002-ref.html">
+  <style>
+    .container {
+      display: grid;
+      direction: rtl;
+      padding: 1px 2px;
+      border: 1px solid black;
+      background: yellow;
+      margin-bottom: 5px;
+      margin-right: 5px;
+      float: left; /* For testing in "rows" of containers */
+      position: relative;
+    }
+    br { clear: both }
+
+    .big > .container {
+      height: 30px;
+      width: 22px;
+      grid: 2px 20px 2px / 3px 14px 3px;
+    }
+    .small > .container {
+      grid: 0px 2px 0px / 3px 2px 3px;
+      height: 2px;
+      width: 4px;
+    }
+
+    .container > * {
+      position: absolute;
+      direction: ltr;
+      grid-area: 2 / 2 / 3 / 3;
+      background: teal;
+      height: 6px;
+      width: 8px;
+    }
+  </style>
+</head>
+<body>
+  <!-- The last baseline value, from
+       https://www.w3.org/TR/css-align-3/#propdef-align-self -->
+  <div class="big">
+    <div class="container"><div style="align-self: last baseline"></div></div>
+  </div>
+  <div class="small">
+    <div class="container"><div style="align-self: last baseline"></div></div>
+  </div>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-rtl-last-baseline-003-ref.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-rtl-last-baseline-003-ref.html
new file mode 100644
index 0000000..ff60b13
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-rtl-last-baseline-003-ref.html
@@ -0,0 +1,58 @@
+<!DOCTYPE html>
+<!--
+     Any copyright is dedicated to the Public Domain.
+     http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<html>
+<head>
+  <meta charset="utf-8">
+  <title>CSS Reference</title>
+  <link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
+  <style>
+    .container {
+      display: block;
+      padding: 1px 2px;
+      border: 1px solid black;
+      background: yellow;
+      margin-bottom: 5px;
+      margin-right: 5px;
+      float: left; /* For testing in "rows" of containers */
+    }
+    br { clear: both }
+
+    .big > .container {
+      height: 30px;
+      width: 22px;
+    }
+    .small > .container {
+      height: 2px;
+      width: 4px;
+    }
+
+    .container > * {
+      background: teal;
+      height: 6px;
+      width: 8px;
+    }
+    .big   > .container > * { margin-left: 14px; }
+    .small > .container > * { margin-left: -4px; }
+
+    .big   .alignStart  { margin-top:  0px; }
+    .big   .alignCenter { margin-top: 13px; }
+    .big   .alignEnd    { margin-top: 26px; }
+    .small .alignStart  { margin-top:  0px; }
+    .small .alignCenter { margin-top: -1px; }
+    .small .alignEnd    { margin-top: -2px; }
+  </style>
+</head>
+<body>
+  <!-- The last baseline value, from
+       https://www.w3.org/TR/css-align-3/#propdef-align-self -->
+  <div class="big">
+    <div class="container"><div class="alignEnd"><!--last baseline--></div></div>
+  </div>
+  <div class="small">
+    <div class="container"><div class="alignEnd"><!--last baseline--></div></div>
+  </div>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-rtl-last-baseline-003.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-rtl-last-baseline-003.html
new file mode 100644
index 0000000..7f07b135
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-rtl-last-baseline-003.html
@@ -0,0 +1,56 @@
+<!DOCTYPE html>
+<!--
+     Any copyright is dedicated to the Public Domain.
+     http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<html>
+<head>
+  <meta charset="utf-8">
+  <title>CSS Test: Static position of abspos children in a RTL static-pos grid container, with various "align-self" values</title>
+  <link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
+  <link rel="help" href="https://drafts.csswg.org/css-grid/#abspos-items">
+  <link rel="match" href="grid-abspos-staticpos-align-self-rtl-last-baseline-003-ref.html">
+  <style>
+    .container {
+      display: grid;
+      direction: rtl;
+      padding: 1px 2px;
+      border: 1px solid black;
+      background: yellow;
+      margin-bottom: 5px;
+      margin-right: 5px;
+      float: left; /* For testing in "rows" of containers */
+    }
+    br { clear: both }
+
+    .big > .container {
+      height: 30px;
+      width: 22px;
+      grid: 2px 20px 2px / 3px 14px 3px;
+    }
+    .small > .container {
+      grid: 0px 2px 0px / 3px 2px 3px;
+      height: 2px;
+      width: 4px;
+    }
+
+    .container > * {
+      position: absolute;
+      grid-area: 2 / 2 / 3 / 3;
+      background: teal;
+      height: 6px;
+      width: 8px;
+    }
+  </style>
+</head>
+<body>
+  <!-- The last baseline value, from
+       https://www.w3.org/TR/css-align-3/#propdef-align-self -->
+  <div class="big">
+    <div class="container"><div style="align-self: last baseline"></div></div>
+  </div>
+  <div class="small">
+    <div class="container"><div style="align-self: last baseline"></div></div>
+  </div>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-rtl-last-baseline-004-ref.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-rtl-last-baseline-004-ref.html
new file mode 100644
index 0000000..ff60b13
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-rtl-last-baseline-004-ref.html
@@ -0,0 +1,58 @@
+<!DOCTYPE html>
+<!--
+     Any copyright is dedicated to the Public Domain.
+     http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<html>
+<head>
+  <meta charset="utf-8">
+  <title>CSS Reference</title>
+  <link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
+  <style>
+    .container {
+      display: block;
+      padding: 1px 2px;
+      border: 1px solid black;
+      background: yellow;
+      margin-bottom: 5px;
+      margin-right: 5px;
+      float: left; /* For testing in "rows" of containers */
+    }
+    br { clear: both }
+
+    .big > .container {
+      height: 30px;
+      width: 22px;
+    }
+    .small > .container {
+      height: 2px;
+      width: 4px;
+    }
+
+    .container > * {
+      background: teal;
+      height: 6px;
+      width: 8px;
+    }
+    .big   > .container > * { margin-left: 14px; }
+    .small > .container > * { margin-left: -4px; }
+
+    .big   .alignStart  { margin-top:  0px; }
+    .big   .alignCenter { margin-top: 13px; }
+    .big   .alignEnd    { margin-top: 26px; }
+    .small .alignStart  { margin-top:  0px; }
+    .small .alignCenter { margin-top: -1px; }
+    .small .alignEnd    { margin-top: -2px; }
+  </style>
+</head>
+<body>
+  <!-- The last baseline value, from
+       https://www.w3.org/TR/css-align-3/#propdef-align-self -->
+  <div class="big">
+    <div class="container"><div class="alignEnd"><!--last baseline--></div></div>
+  </div>
+  <div class="small">
+    <div class="container"><div class="alignEnd"><!--last baseline--></div></div>
+  </div>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-rtl-last-baseline-004.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-rtl-last-baseline-004.html
new file mode 100644
index 0000000..b40e604
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-rtl-last-baseline-004.html
@@ -0,0 +1,57 @@
+<!DOCTYPE html>
+<!--
+     Any copyright is dedicated to the Public Domain.
+     http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<html>
+<head>
+  <meta charset="utf-8">
+  <title>CSS Test: Static position of abspos LTR children in a RTL static-pos grid container, with various "align-self" values</title>
+  <link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
+  <link rel="help" href="https://drafts.csswg.org/css-grid/#abspos-items">
+  <link rel="match" href="grid-abspos-staticpos-align-self-rtl-last-baseline-004-ref.html">
+  <style>
+    .container {
+      display: grid;
+      direction: rtl;
+      padding: 1px 2px;
+      border: 1px solid black;
+      background: yellow;
+      margin-bottom: 5px;
+      margin-right: 5px;
+      float: left; /* For testing in "rows" of containers */
+    }
+    br { clear: both }
+
+    .big > .container {
+      height: 30px;
+      width: 22px;
+      grid: 2px 20px 2px / 3px 14px 3px;
+    }
+    .small > .container {
+      grid: 0px 2px 0px / 3px 2px 3px;
+      height: 2px;
+      width: 4px;
+    }
+
+    .container > * {
+      position: absolute;
+      direction: ltr;
+      grid-area: 2 / 2 / 3 / 3;
+      background: teal;
+      height: 6px;
+      width: 8px;
+    }
+  </style>
+</head>
+<body>
+  <!-- The last baseline value, from
+       https://www.w3.org/TR/css-align-3/#propdef-align-self -->
+  <div class="big">
+    <div class="container"><div style="align-self: last baseline"></div></div>
+  </div>
+  <div class="small">
+    <div class="container"><div style="align-self: last baseline"></div></div>
+  </div>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-vertWM-001-ref.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-vertWM-001-ref.html
index 37575f0..dd151d46 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-vertWM-001-ref.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-vertWM-001-ref.html
@@ -55,7 +55,6 @@
     <br>
     <!-- <baseline-position> -->
     <div class="container"><div class="alignStart"><!--baseline--></div></div>
-    <div class="container"><div class="alignEnd"><!--last baseline--></div></div>
     <br>
     <!-- <self-position>, part 1: -->
     <div class="container"><div class="alignCenter"><!--center--></div></div>
@@ -81,7 +80,6 @@
     <br>
     <!-- <baseline-position> -->
     <div class="container"><div class="alignStart"><!--baseline--></div></div>
-    <div class="container"><div class="alignEnd"><!--last baseline--></div></div>
     <br>
     <!-- <self-position>, part 1: -->
     <div class="container"><div class="alignCenter"><!--center--></div></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-vertWM-001.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-vertWM-001.html
index ffac903..2feeb2c3a 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-vertWM-001.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-vertWM-001.html
@@ -56,7 +56,6 @@
     <br>
     <!-- <baseline-position> -->
     <div class="container"><div style="align-self: baseline"></div></div>
-    <div class="container"><div style="align-self: last baseline"></div></div>
     <br>
     <!-- <self-position>, part 1 -->
     <div class="container"><div style="align-self: center"></div></div>
@@ -82,7 +81,6 @@
     <br>
     <!-- <baseline-position> -->
     <div class="container"><div style="align-self: baseline"></div></div>
-    <div class="container"><div style="align-self: last baseline"></div></div>
     <br>
     <!-- <self-position>, part 1 -->
     <div class="container"><div style="align-self: center"></div></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-vertWM-002-ref.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-vertWM-002-ref.html
index ce217e7f..60bd0cec 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-vertWM-002-ref.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-vertWM-002-ref.html
@@ -55,7 +55,6 @@
     <br>
     <!-- <baseline-position> -->
     <div class="container"><div class="alignStart"><!--baseline--></div></div>
-    <div class="container"><div class="alignEnd"><!--last baseline--></div></div>
     <br>
     <!-- <self-position>, part 1: -->
     <div class="container"><div class="alignCenter"><!--center--></div></div>
@@ -81,7 +80,6 @@
     <br>
     <!-- <baseline-position> -->
     <div class="container"><div class="alignStart"><!--baseline--></div></div>
-    <div class="container"><div class="alignEnd"><!--last baseline--></div></div>
     <br>
     <!-- <self-position>, part 1: -->
     <div class="container"><div class="alignCenter"><!--center--></div></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-vertWM-002.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-vertWM-002.html
index c636a4b..659f6b7 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-vertWM-002.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-vertWM-002.html
@@ -57,7 +57,6 @@
     <br>
     <!-- <baseline-position> -->
     <div class="container"><div style="align-self: baseline"></div></div>
-    <div class="container"><div style="align-self: last baseline"></div></div>
     <br>
     <!-- <self-position>, part 1 -->
     <div class="container"><div style="align-self: center"></div></div>
@@ -83,7 +82,6 @@
     <br>
     <!-- <baseline-position> -->
     <div class="container"><div style="align-self: baseline"></div></div>
-    <div class="container"><div style="align-self: last baseline"></div></div>
     <br>
     <!-- <self-position>, part 1 -->
     <div class="container"><div style="align-self: center"></div></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-vertWM-003-ref.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-vertWM-003-ref.html
index 7eca626..b8deb03 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-vertWM-003-ref.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-vertWM-003-ref.html
@@ -54,7 +54,6 @@
     <br>
     <!-- <baseline-position> -->
     <div class="container"><div class="alignStart"><!--baseline--></div></div>
-    <div class="container"><div class="alignEnd"><!--last baseline--></div></div>
     <br>
     <!-- <self-position>, part 1: -->
     <div class="container"><div class="alignCenter"><!--center--></div></div>
@@ -80,7 +79,6 @@
     <br>
     <!-- <baseline-position> -->
     <div class="container"><div class="alignStart"><!--baseline--></div></div>
-    <div class="container"><div class="alignEnd"><!--last baseline--></div></div>
     <br>
     <!-- <self-position>, part 1: -->
     <div class="container"><div class="alignCenter"><!--center--></div></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-vertWM-003.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-vertWM-003.html
index d719b0e3..61bdc04 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-vertWM-003.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-vertWM-003.html
@@ -55,7 +55,6 @@
     <br>
     <!-- <baseline-position> -->
     <div class="container"><div style="align-self: baseline"></div></div>
-    <div class="container"><div style="align-self: last baseline"></div></div>
     <br>
     <!-- <self-position>, part 1 -->
     <div class="container"><div style="align-self: center"></div></div>
@@ -81,7 +80,6 @@
     <br>
     <!-- <baseline-position> -->
     <div class="container"><div style="align-self: baseline"></div></div>
-    <div class="container"><div style="align-self: last baseline"></div></div>
     <br>
     <!-- <self-position>, part 1 -->
     <div class="container"><div style="align-self: center"></div></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-vertWM-004-ref.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-vertWM-004-ref.html
index 66d0d29..95060a7 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-vertWM-004-ref.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-vertWM-004-ref.html
@@ -54,7 +54,6 @@
     <br>
     <!-- <baseline-position> -->
     <div class="container"><div class="alignStart"><!--baseline--></div></div>
-    <div class="container"><div class="alignEnd"><!--last baseline--></div></div>
     <br>
     <!-- <self-position>, part 1: -->
     <div class="container"><div class="alignCenter"><!--center--></div></div>
@@ -80,7 +79,6 @@
     <br>
     <!-- <baseline-position> -->
     <div class="container"><div class="alignStart"><!--baseline--></div></div>
-    <div class="container"><div class="alignEnd"><!--last baseline--></div></div>
     <br>
     <!-- <self-position>, part 1: -->
     <div class="container"><div class="alignCenter"><!--center--></div></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-vertWM-004.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-vertWM-004.html
index 2eba8574..84e9265a 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-vertWM-004.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-vertWM-004.html
@@ -56,7 +56,6 @@
     <br>
     <!-- <baseline-position> -->
     <div class="container"><div style="align-self: baseline"></div></div>
-    <div class="container"><div style="align-self: last baseline"></div></div>
     <br>
     <!-- <self-position>, part 1 -->
     <div class="container"><div style="align-self: center"></div></div>
@@ -82,7 +81,6 @@
     <br>
     <!-- <baseline-position> -->
     <div class="container"><div style="align-self: baseline"></div></div>
-    <div class="container"><div style="align-self: last baseline"></div></div>
     <br>
     <!-- <self-position>, part 1 -->
     <div class="container"><div style="align-self: center"></div></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-vertWM-last-baseline-001-ref.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-vertWM-last-baseline-001-ref.html
new file mode 100644
index 0000000..abd41fc
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-vertWM-last-baseline-001-ref.html
@@ -0,0 +1,57 @@
+<!DOCTYPE html>
+<!--
+     Any copyright is dedicated to the Public Domain.
+     http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<html>
+<head>
+  <meta charset="utf-8">
+  <title>CSS Reference</title>
+  <link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
+  <style>
+    .container {
+      display: block;
+      padding: 2px 1px;
+      border: 1px solid black;
+      background: yellow;
+      margin-bottom: 5px;
+      margin-right: 5px;
+      float: left; /* For testing in "rows" of containers */
+    }
+    br { clear: both }
+
+    .big > .container {
+      width: 30px;
+      height: 22px;
+    }
+    .small > .container {
+      width: 2px;
+      height: 4px;
+      margin-right: 10px; /* To avoid overlap between overflowing kids */
+    }
+
+    .container > * {
+      background: teal;
+      width: 6px;
+      height: 8px;
+      margin-top: 3px;
+    }
+    .big   .alignStart  { margin-left: 22px; }
+    .big   .alignCenter { margin-left: 15px; }
+    .big   .alignEnd    { margin-left:  8px; }
+    .small .alignStart  { margin-left: -4px; }
+    .small .alignCenter { margin-left: -2px; }
+    .small .alignEnd    { margin-left:  0px; }
+  </style>
+</head>
+<body>
+  <!-- The last baseline value, from
+       https://www.w3.org/TR/css-align-3/#propdef-align-self -->
+  <div class="big">
+    <div class="container"><div class="alignEnd"><!--last baseline--></div></div>
+  </div>
+  <div class="small">
+    <div class="container"><div class="alignEnd"><!--last baseline--></div></div>
+  </div>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-vertWM-last-baseline-001.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-vertWM-last-baseline-001.html
new file mode 100644
index 0000000..be1bc8c
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-vertWM-last-baseline-001.html
@@ -0,0 +1,58 @@
+<!DOCTYPE html>
+<!--
+     Any copyright is dedicated to the Public Domain.
+     http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<html>
+<head>
+  <meta charset="utf-8">
+  <title>CSS Test: Static position of abspos children in a vertical-rl grid container, with various "align-self" values</title>
+  <link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
+  <link rel="help" href="https://drafts.csswg.org/css-grid/#abspos-items">
+  <link rel="match" href="grid-abspos-staticpos-align-self-vertWM-last-baseline-001-ref.html">
+  <style>
+    .container {
+      display: grid;
+      writing-mode: vertical-rl;
+      padding: 2px 1px;
+      border: 1px solid black;
+      background: yellow;
+      margin-bottom: 5px;
+      margin-right: 5px;
+      float: left; /* For testing in "rows" of containers */
+      position: relative;
+    }
+    br { clear: both }
+
+    .big > .container {
+      width: 30px;
+      height: 22px;
+      grid: 2px 20px 2px / 3px 14px 3px;
+    }
+    .small > .container {
+      grid: 0px 2px 0px / 3px 2px 3px;
+      width: 2px;
+      height: 4px;
+      margin-right: 10px; /* To avoid overlap between overflowing kids */
+    }
+
+    .container > * {
+      position: absolute;
+      grid-area: 2 / 2 / 3 / 3;
+      background: teal;
+      width: 6px;
+      height: 8px;
+    }
+  </style>
+</head>
+<body>
+  <!-- The last baseline value, from
+       https://www.w3.org/TR/css-align-3/#propdef-align-self -->
+  <div class="big">
+    <div class="container"><div style="align-self: last baseline"></div></div>
+  </div>
+  <div class="small">
+    <div class="container"><div style="align-self: last baseline"></div></div>
+  </div>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-vertWM-last-baseline-002-ref.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-vertWM-last-baseline-002-ref.html
new file mode 100644
index 0000000..abd41fc
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-vertWM-last-baseline-002-ref.html
@@ -0,0 +1,57 @@
+<!DOCTYPE html>
+<!--
+     Any copyright is dedicated to the Public Domain.
+     http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<html>
+<head>
+  <meta charset="utf-8">
+  <title>CSS Reference</title>
+  <link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
+  <style>
+    .container {
+      display: block;
+      padding: 2px 1px;
+      border: 1px solid black;
+      background: yellow;
+      margin-bottom: 5px;
+      margin-right: 5px;
+      float: left; /* For testing in "rows" of containers */
+    }
+    br { clear: both }
+
+    .big > .container {
+      width: 30px;
+      height: 22px;
+    }
+    .small > .container {
+      width: 2px;
+      height: 4px;
+      margin-right: 10px; /* To avoid overlap between overflowing kids */
+    }
+
+    .container > * {
+      background: teal;
+      width: 6px;
+      height: 8px;
+      margin-top: 3px;
+    }
+    .big   .alignStart  { margin-left: 22px; }
+    .big   .alignCenter { margin-left: 15px; }
+    .big   .alignEnd    { margin-left:  8px; }
+    .small .alignStart  { margin-left: -4px; }
+    .small .alignCenter { margin-left: -2px; }
+    .small .alignEnd    { margin-left:  0px; }
+  </style>
+</head>
+<body>
+  <!-- The last baseline value, from
+       https://www.w3.org/TR/css-align-3/#propdef-align-self -->
+  <div class="big">
+    <div class="container"><div class="alignEnd"><!--last baseline--></div></div>
+  </div>
+  <div class="small">
+    <div class="container"><div class="alignEnd"><!--last baseline--></div></div>
+  </div>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-vertWM-last-baseline-002.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-vertWM-last-baseline-002.html
new file mode 100644
index 0000000..26e1b8d
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-vertWM-last-baseline-002.html
@@ -0,0 +1,59 @@
+<!DOCTYPE html>
+<!--
+     Any copyright is dedicated to the Public Domain.
+     http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<html>
+<head>
+  <meta charset="utf-8">
+  <title>CSS Test: Static position of abspos horizontal-tb children in a vertical-rl grid container, with various "align-self" values</title>
+  <link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
+  <link rel="help" href="https://drafts.csswg.org/css-grid/#abspos-items">
+  <link rel="match" href="grid-abspos-staticpos-align-self-vertWM-last-baseline-002-ref.html">
+  <style>
+    .container {
+      display: grid;
+      writing-mode: vertical-rl;
+      padding: 2px 1px;
+      border: 1px solid black;
+      background: yellow;
+      margin-bottom: 5px;
+      margin-right: 5px;
+      float: left; /* For testing in "rows" of containers */
+      position: relative;
+    }
+    br { clear: both }
+
+    .big > .container {
+      width: 30px;
+      height: 22px;
+      grid: 2px 20px 2px / 3px 14px 3px;
+    }
+    .small > .container {
+      grid: 0px 2px 0px / 3px 2px 3px;
+      width: 2px;
+      height: 4px;
+      margin-right: 10px; /* To avoid overlap between overflowing kids */
+    }
+
+    .container > * {
+      position: absolute;
+      writing-mode: horizontal-tb;
+      grid-area: 2 / 2 / 3 / 3;
+      background: teal;
+      width: 6px;
+      height: 8px;
+    }
+  </style>
+</head>
+<body>
+  <!-- The last baseline value, from
+       https://www.w3.org/TR/css-align-3/#propdef-align-self -->
+  <div class="big">
+    <div class="container"><div style="align-self: last baseline"></div></div>
+  </div>
+  <div class="small">
+    <div class="container"><div style="align-self: last baseline"></div></div>
+  </div>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-vertWM-last-baseline-003-ref.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-vertWM-last-baseline-003-ref.html
new file mode 100644
index 0000000..41da802a
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-vertWM-last-baseline-003-ref.html
@@ -0,0 +1,56 @@
+<!DOCTYPE html>
+<!--
+     Any copyright is dedicated to the Public Domain.
+     http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<html>
+<head>
+  <meta charset="utf-8">
+  <title>CSS Reference</title>
+  <link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
+  <style>
+    .container {
+      display: block;
+      padding: 2px 1px;
+      border: 1px solid black;
+      background: yellow;
+      margin-bottom: 5px;
+      margin-right: 5px;
+      float: left; /* For testing in "rows" of containers */
+    }
+    br { clear: both }
+
+    .big > .container {
+      width: 30px;
+      height: 22px;
+    }
+    .small > .container {
+      width: 2px;
+      height: 4px;
+      margin-right: 10px; /* To avoid overlap between overflowing kids */
+    }
+
+    .container > * {
+      background: teal;
+      width: 6px;
+      height: 8px;
+    }
+    .big   .alignStart  { margin-left: 24px; }
+    .big   .alignCenter { margin-left: 11px; }
+    .big   .alignEnd    { margin-left: -2px; }
+    .small .alignStart  { margin-left: -4px; }
+    .small .alignCenter { margin-left: -3px; }
+    .small .alignEnd    { margin-left: -2px; }
+  </style>
+</head>
+<body>
+  <!-- The last baseline value, from
+       https://www.w3.org/TR/css-align-3/#propdef-align-self -->
+  <div class="big">
+    <div class="container"><div class="alignEnd"><!--last baseline--></div></div>
+  </div>
+  <div class="small">
+    <div class="container"><div class="alignEnd"><!--last baseline--></div></div>
+  </div>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-vertWM-last-baseline-003.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-vertWM-last-baseline-003.html
new file mode 100644
index 0000000..7023e2ef
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-vertWM-last-baseline-003.html
@@ -0,0 +1,57 @@
+<!DOCTYPE html>
+<!--
+     Any copyright is dedicated to the Public Domain.
+     http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<html>
+<head>
+  <meta charset="utf-8">
+  <title>CSS Test: Static position of abspos children in a vertical-rl static-pos grid container, with various "align-self" values</title>
+  <link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
+  <link rel="help" href="https://drafts.csswg.org/css-grid/#abspos-items">
+  <link rel="match" href="grid-abspos-staticpos-align-self-vertWM-last-baseline-003-ref.html">
+  <style>
+    .container {
+      display: grid;
+      writing-mode: vertical-rl;
+      padding: 2px 1px;
+      border: 1px solid black;
+      background: yellow;
+      margin-bottom: 5px;
+      margin-right: 5px;
+      float: left; /* For testing in "rows" of containers */
+    }
+    br { clear: both }
+
+    .big > .container {
+      width: 30px;
+      height: 22px;
+      grid: 2px 20px 2px / 3px 14px 3px;
+    }
+    .small > .container {
+      grid: 0px 2px 0px / 3px 2px 3px;
+      width: 2px;
+      height: 4px;
+      margin-right: 10px; /* To avoid overlap between overflowing kids */
+    }
+
+    .container > * {
+      position: absolute;
+      grid-area: 2 / 2 / 3 / 3;
+      background: teal;
+      width: 6px;
+      height: 8px;
+    }
+  </style>
+</head>
+<body>
+  <!-- The last baseline value, from
+       https://www.w3.org/TR/css-align-3/#propdef-align-self -->
+  <div class="big">
+    <div class="container"><div style="align-self: last baseline"></div></div>
+  </div>
+  <div class="small">
+    <div class="container"><div style="align-self: last baseline"></div></div>
+  </div>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-vertWM-last-baseline-004-ref.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-vertWM-last-baseline-004-ref.html
new file mode 100644
index 0000000..41da802a
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-vertWM-last-baseline-004-ref.html
@@ -0,0 +1,56 @@
+<!DOCTYPE html>
+<!--
+     Any copyright is dedicated to the Public Domain.
+     http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<html>
+<head>
+  <meta charset="utf-8">
+  <title>CSS Reference</title>
+  <link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
+  <style>
+    .container {
+      display: block;
+      padding: 2px 1px;
+      border: 1px solid black;
+      background: yellow;
+      margin-bottom: 5px;
+      margin-right: 5px;
+      float: left; /* For testing in "rows" of containers */
+    }
+    br { clear: both }
+
+    .big > .container {
+      width: 30px;
+      height: 22px;
+    }
+    .small > .container {
+      width: 2px;
+      height: 4px;
+      margin-right: 10px; /* To avoid overlap between overflowing kids */
+    }
+
+    .container > * {
+      background: teal;
+      width: 6px;
+      height: 8px;
+    }
+    .big   .alignStart  { margin-left: 24px; }
+    .big   .alignCenter { margin-left: 11px; }
+    .big   .alignEnd    { margin-left: -2px; }
+    .small .alignStart  { margin-left: -4px; }
+    .small .alignCenter { margin-left: -3px; }
+    .small .alignEnd    { margin-left: -2px; }
+  </style>
+</head>
+<body>
+  <!-- The last baseline value, from
+       https://www.w3.org/TR/css-align-3/#propdef-align-self -->
+  <div class="big">
+    <div class="container"><div class="alignEnd"><!--last baseline--></div></div>
+  </div>
+  <div class="small">
+    <div class="container"><div class="alignEnd"><!--last baseline--></div></div>
+  </div>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-vertWM-last-baseline-004.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-vertWM-last-baseline-004.html
new file mode 100644
index 0000000..e39e6b39
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-vertWM-last-baseline-004.html
@@ -0,0 +1,58 @@
+<!DOCTYPE html>
+<!--
+     Any copyright is dedicated to the Public Domain.
+     http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<html>
+<head>
+  <meta charset="utf-8">
+  <title>CSS Test: Static position of abspos horizontal-tb children in a static-pos vertical-rl grid container, with various "align-self" values</title>
+  <link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
+  <link rel="help" href="https://drafts.csswg.org/css-grid/#abspos-items">
+  <link rel="match" href="grid-abspos-staticpos-align-self-vertWM-last-baseline-004-ref.html">
+  <style>
+    .container {
+      display: grid;
+      writing-mode: vertical-rl;
+      padding: 2px 1px;
+      border: 1px solid black;
+      background: yellow;
+      margin-bottom: 5px;
+      margin-right: 5px;
+      float: left; /* For testing in "rows" of containers */
+    }
+    br { clear: both }
+
+    .big > .container {
+      width: 30px;
+      height: 22px;
+      grid: 2px 20px 2px / 3px 14px 3px;
+    }
+    .small > .container {
+      grid: 0px 2px 0px / 3px 2px 3px;
+      width: 2px;
+      height: 4px;
+      margin-right: 10px; /* To avoid overlap between overflowing kids */
+    }
+
+    .container > * {
+      position: absolute;
+      writing-mode: horizontal-tb;
+      grid-area: 2 / 2 / 3 / 3;
+      background: teal;
+      width: 6px;
+      height: 8px;
+    }
+  </style>
+</head>
+<body>
+  <!-- The last baseline value, from
+       https://www.w3.org/TR/css-align-3/#propdef-align-self -->
+  <div class="big">
+    <div class="container"><div style="align-self: last baseline"></div></div>
+  </div>
+  <div class="small">
+    <div class="container"><div style="align-self: last baseline"></div></div>
+  </div>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-001-ref.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-001-ref.html
index 6d197e4..982e0c6 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-001-ref.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-001-ref.html
@@ -55,7 +55,6 @@
     <br>
     <!-- <baseline-position> -->
     <div class="container"><div class="alignStart"><!--baseline--></div></div>
-    <div class="container"><div class="alignEnd"><!--last baseline--></div></div>
     <br>
     <!-- <self-position>, part 1: -->
     <div class="container"><div class="alignCenter"><!--center--></div></div>
@@ -81,7 +80,6 @@
     <br>
     <!-- <baseline-position> -->
     <div class="container"><div class="alignStart"><!--baseline--></div></div>
-    <div class="container"><div class="alignEnd"><!--last baseline--></div></div>
     <br>
     <!-- <self-position>, part 1: -->
     <div class="container"><div class="alignCenter"><!--center--></div></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-001.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-001.html
index cd934bd..3f9a59f 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-001.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-001.html
@@ -56,7 +56,6 @@
     <br>
     <!-- <baseline-position> -->
     <div class="container"><div style="justify-self: baseline"></div></div>
-    <div class="container"><div style="justify-self: last baseline"></div></div>
     <br>
     <!-- <self-position>, part 1 -->
     <div class="container"><div style="justify-self: center"></div></div>
@@ -82,7 +81,6 @@
     <br>
     <!-- <baseline-position> -->
     <div class="container"><div style="justify-self: baseline"></div></div>
-    <div class="container"><div style="justify-self: last baseline"></div></div>
     <br>
     <!-- <self-position>, part 1 -->
     <div class="container"><div style="justify-self: center"></div></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-002-ref.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-002-ref.html
index f7396ed..a5e8aad 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-002-ref.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-002-ref.html
@@ -54,7 +54,6 @@
     <br>
     <!-- <baseline-position> -->
     <div class="container"><div class="alignStart"><!--baseline--></div></div>
-    <div class="container"><div class="alignEnd"><!--last baseline--></div></div>
     <br>
     <!-- <self-position>, part 1: -->
     <div class="container"><div class="alignCenter"><!--center--></div></div>
@@ -80,7 +79,6 @@
     <br>
     <!-- <baseline-position> -->
     <div class="container"><div class="alignStart"><!--baseline--></div></div>
-    <div class="container"><div class="alignEnd"><!--last baseline--></div></div>
     <br>
     <!-- <self-position>, part 1: -->
     <div class="container"><div class="alignCenter"><!--center--></div></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-002.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-002.html
index 1d72ae8e..d0b60756 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-002.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-002.html
@@ -55,7 +55,6 @@
     <br>
     <!-- <baseline-position> -->
     <div class="container"><div style="justify-self: baseline"></div></div>
-    <div class="container"><div style="justify-self: last baseline"></div></div>
     <br>
     <!-- <self-position>, part 1 -->
     <div class="container"><div style="justify-self: center"></div></div>
@@ -81,7 +80,6 @@
     <br>
     <!-- <baseline-position> -->
     <div class="container"><div style="justify-self: baseline"></div></div>
-    <div class="container"><div style="justify-self: last baseline"></div></div>
     <br>
     <!-- <self-position>, part 1 -->
     <div class="container"><div style="justify-self: center"></div></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-img-001-ref.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-img-001-ref.html
index 78d62121..29a2961 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-img-001-ref.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-img-001-ref.html
@@ -57,8 +57,6 @@
     <!-- <baseline-position> -->
     <div class="container"><img src="support/colors-8x16.png"
                                 class="alignStart"><!--baseline--></div>
-    <div class="container"><img src="support/colors-8x16.png"
-                                class="alignEnd"><!--last baseline--></div>
     <br>
     <!-- <self-position>, part 1: -->
     <div class="container"><img src="support/colors-8x16.png"
@@ -97,8 +95,6 @@
     <!-- <baseline-position> -->
     <div class="container"><img src="support/colors-8x16.png"
                                 class="alignStart"><!--baseline--></div>
-    <div class="container"><img src="support/colors-8x16.png"
-                                class="alignEnd"><!--last baseline--></div>
     <br>
     <!-- <self-position>, part 1: -->
     <div class="container"><img src="support/colors-8x16.png"
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-img-001.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-img-001.html
index a860ae6..d402fd8 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-img-001.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-img-001.html
@@ -56,8 +56,6 @@
     <!-- <baseline-position> -->
     <div class="container"><img src="support/colors-8x16.png"
                                 style="justify-self: baseline"></div>
-    <div class="container"><img src="support/colors-8x16.png"
-                                style="justify-self: last baseline"></div>
     <br>
     <!-- <self-position>, part 1 -->
     <div class="container"><img src="support/colors-8x16.png"
@@ -96,8 +94,6 @@
     <!-- <baseline-position> -->
     <div class="container"><img src="support/colors-8x16.png"
                                 style="justify-self: baseline"></div>
-    <div class="container"><img src="support/colors-8x16.png"
-                                style="justify-self: last baseline"></div>
     <br>
     <!-- <self-position>, part 1 -->
     <div class="container"><img src="support/colors-8x16.png"
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-img-002-ref.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-img-002-ref.html
index e71555d4..7a96945 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-img-002-ref.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-img-002-ref.html
@@ -56,8 +56,6 @@
     <!-- <baseline-position> -->
     <div class="container"><img src="support/colors-8x16.png"
                                 class="alignStart"><!--baseline--></div>
-    <div class="container"><img src="support/colors-8x16.png"
-                                class="alignEnd"><!--last baseline--></div>
     <br>
     <!-- <self-position>, part 1: -->
     <div class="container"><img src="support/colors-8x16.png"
@@ -96,8 +94,6 @@
     <!-- <baseline-position> -->
     <div class="container"><img src="support/colors-8x16.png"
                                 class="alignStart"><!--baseline--></div>
-    <div class="container"><img src="support/colors-8x16.png"
-                                class="alignEnd"><!--last baseline--></div>
     <br>
     <!-- <self-position>, part 1: -->
     <div class="container"><img src="support/colors-8x16.png"
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-img-002.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-img-002.html
index 6483421..be0ea35 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-img-002.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-img-002.html
@@ -55,8 +55,6 @@
     <!-- <baseline-position> -->
     <div class="container"><img src="support/colors-8x16.png"
                                 style="justify-self: baseline"></div>
-    <div class="container"><img src="support/colors-8x16.png"
-                                style="justify-self: last baseline"></div>
     <br>
     <!-- <self-position>, part 1 -->
     <div class="container"><img src="support/colors-8x16.png"
@@ -95,8 +93,6 @@
     <!-- <baseline-position> -->
     <div class="container"><img src="support/colors-8x16.png"
                                 style="justify-self: baseline"></div>
-    <div class="container"><img src="support/colors-8x16.png"
-                                style="justify-self: last baseline"></div>
     <br>
     <!-- <self-position>, part 1 -->
     <div class="container"><img src="support/colors-8x16.png"
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-img-last-baseline-001-ref.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-img-last-baseline-001-ref.html
new file mode 100644
index 0000000..401cc7c
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-img-last-baseline-001-ref.html
@@ -0,0 +1,57 @@
+<!DOCTYPE html>
+<!--
+     Any copyright is dedicated to the Public Domain.
+     http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<html>
+<head>
+  <meta charset="utf-8">
+  <title>CSS Reference</title>
+  <link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
+  <style>
+    .container {
+      display: block;
+      padding: 2px 1px;
+      border: 1px solid black;
+      background: yellow;
+      margin-bottom: 5px;
+      margin-right: 5px;
+      float: left; /* For testing in "rows" of containers */
+    }
+    br { clear: both }
+
+    .big > .container {
+      width: 40px;
+      height: 22px;
+    }
+    .small > .container {
+      width: 2px;
+      height: 4px;
+      margin-bottom: 20px; /* to reduce overlap between overflowing images */
+    }
+
+    .container > * {
+      margin-top: 3px;
+      display: block;
+    }
+    .big   .alignStart  { margin-left:  2px; }
+    .big   .alignCenter { margin-left: 13px; }
+    .big   .alignEnd    { margin-left: 24px; }
+    .small .alignStart  { margin-left:  0px; }
+    .small .alignCenter { margin-left: -3px; }
+    .small .alignEnd    { margin-left: -6px; }
+  </style>
+</head>
+<body>
+  <!-- The last baseline value, from
+       https://www.w3.org/TR/css-align-3/#propdef-justify-self -->
+  <div class="big">
+    <div class="container"><img src="support/colors-8x16.png"
+                                class="alignEnd"><!--last baseline--></div>
+  </div>
+  <div class="small">
+    <div class="container"><img src="support/colors-8x16.png"
+                                class="alignEnd"><!--last baseline--></div>
+  </div>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-img-last-baseline-001.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-img-last-baseline-001.html
new file mode 100644
index 0000000..76e8a62c
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-img-last-baseline-001.html
@@ -0,0 +1,56 @@
+<!DOCTYPE html>
+<!--
+     Any copyright is dedicated to the Public Domain.
+     http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<html>
+<head>
+  <meta charset="utf-8">
+  <title>CSS Test: Static position of abspos replaced children in a grid container, with various "justify-self" values</title>
+  <link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
+  <link rel="help" href="https://drafts.csswg.org/css-grid/#abspos-items">
+  <link rel="match" href="grid-abspos-staticpos-justify-self-img-last-baseline-001-ref.html">
+  <style>
+    .container {
+      display: grid;
+      padding: 2px 1px;
+      border: 1px solid black;
+      background: yellow;
+      margin-bottom: 5px;
+      margin-right: 5px;
+      float: left; /* For testing in "rows" of containers */
+      position: relative;
+    }
+    br { clear: both }
+
+    .big > .container {
+      width: 40px;
+      height: 22px;
+      grid: 3px 14px 3px / 2px 30px 2px;
+    }
+    .small > .container {
+      grid: 3px 2px 3px / 0px 2px 0px;
+      width: 2px;
+      height: 4px;
+      margin-bottom: 20px; /* to reduce overlap between overflowing images */
+    }
+
+    .container > * {
+      position: absolute;
+      grid-area: 2 / 2 / 3 / 3;
+    }
+  </style>
+</head>
+<body>
+  <!-- The last baseline value, from
+       https://www.w3.org/TR/css-align-3/#propdef-justify-self -->
+  <div class="big">
+    <div class="container"><img src="support/colors-8x16.png"
+                                style="justify-self: last baseline"></div>
+  </div>
+  <div class="small">
+    <div class="container"><img src="support/colors-8x16.png"
+                                style="justify-self: last baseline"></div>
+  </div>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-img-last-baseline-002-ref.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-img-last-baseline-002-ref.html
new file mode 100644
index 0000000..a466297
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-img-last-baseline-002-ref.html
@@ -0,0 +1,56 @@
+<!DOCTYPE html>
+<!--
+     Any copyright is dedicated to the Public Domain.
+     http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<html>
+<head>
+  <meta charset="utf-8">
+  <title>CSS Reference</title>
+  <link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
+  <style>
+    .container {
+      display: block;
+      padding: 2px 1px;
+      border: 1px solid black;
+      background: yellow;
+      margin-bottom: 5px;
+      margin-right: 5px;
+      float: left; /* For testing in "rows" of containers */
+    }
+    br { clear: both }
+
+    .big > .container {
+      width: 40px;
+      height: 22px;
+    }
+    .small > .container {
+      width: 2px;
+      height: 4px;
+      margin-bottom: 20px; /* to reduce overlap between overflowing images */
+    }
+
+    .container > * {
+      display: block;
+    }
+    .big   .alignStart  { margin-left:  0px; }
+    .big   .alignCenter { margin-left: 17px; }
+    .big   .alignEnd    { margin-left: 34px; }
+    .small .alignStart  { margin-left:  0px; }
+    .small .alignCenter { margin-left: -2px; }
+    .small .alignEnd    { margin-left: -4px; }
+  </style>
+</head>
+<body>
+  <div class="big">
+    <!-- The last baseline value, from
+         https://www.w3.org/TR/css-align-3/#propdef-justify-self -->
+    <div class="container"><img src="support/colors-8x16.png"
+                                class="alignEnd"><!--last baseline--></div>
+  </div>
+  <div class="small">
+    <div class="container"><img src="support/colors-8x16.png"
+                                class="alignEnd"><!--last baseline--></div>
+  </div>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-img-last-baseline-002.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-img-last-baseline-002.html
new file mode 100644
index 0000000..7f7c898
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-img-last-baseline-002.html
@@ -0,0 +1,55 @@
+<!DOCTYPE html>
+<!--
+     Any copyright is dedicated to the Public Domain.
+     http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<html>
+<head>
+  <meta charset="utf-8">
+  <title>CSS Test: Static position of abspos replaced children in a static-pos grid container, with various "justify-self" values</title>
+  <link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
+  <link rel="help" href="https://drafts.csswg.org/css-grid/#abspos-items">
+  <link rel="match" href="grid-abspos-staticpos-justify-self-img-last-baseline-002-ref.html">
+  <style>
+    .container {
+      display: grid;
+      padding: 2px 1px;
+      border: 1px solid black;
+      background: yellow;
+      margin-bottom: 5px;
+      margin-right: 5px;
+      float: left; /* For testing in "rows" of containers */
+    }
+    br { clear: both }
+
+    .big > .container {
+      width: 40px;
+      height: 22px;
+      grid: 3px 14px 3px / 2px 30px 2px;
+    }
+    .small > .container {
+      grid: 3px 2px 3px / 0px 2px 0px;
+      width: 2px;
+      height: 4px;
+      margin-bottom: 20px; /* to reduce overlap between overflowing images */
+    }
+
+    .container > * {
+      position: absolute;
+      grid-area: 2 / 2 / 3 / 3;
+    }
+  </style>
+</head>
+<body>
+  <!-- The last baseline value, from
+       https://www.w3.org/TR/css-align-3/#propdef-justify-self -->
+  <div class="big">
+    <div class="container"><img src="support/colors-8x16.png"
+                                style="justify-self: last baseline"></div>
+  </div>
+  <div class="small">
+    <div class="container"><img src="support/colors-8x16.png"
+                                style="justify-self: last baseline"></div>
+  </div>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-last-baseline-001-ref.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-last-baseline-001-ref.html
new file mode 100644
index 0000000..d19b165
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-last-baseline-001-ref.html
@@ -0,0 +1,57 @@
+<!DOCTYPE html>
+<!--
+     Any copyright is dedicated to the Public Domain.
+     http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<html>
+<head>
+  <meta charset="utf-8">
+  <title>CSS Reference</title>
+  <link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
+  <style>
+    .container {
+      display: block;
+      padding: 2px 1px;
+      border: 1px solid black;
+      background: yellow;
+      margin-bottom: 5px;
+      margin-right: 5px;
+      float: left; /* For testing in "rows" of containers */
+    }
+    br { clear: both }
+
+    .big > .container {
+      width: 30px;
+      height: 22px;
+    }
+    .small > .container {
+      width: 2px;
+      height: 4px;
+      margin-right: 10px; /* To avoid overlap between overflowing kids */
+    }
+
+    .container > * {
+      background: teal;
+      width: 6px;
+      height: 8px;
+      margin-top: 3px;
+    }
+    .big   .alignStart  { margin-left:  2px; }
+    .big   .alignCenter { margin-left:  9px; }
+    .big   .alignEnd    { margin-left: 16px; }
+    .small .alignStart  { margin-left:  0px; }
+    .small .alignCenter { margin-left: -2px; }
+    .small .alignEnd    { margin-left: -4px; }
+  </style>
+</head>
+<body>
+  <!-- The last baseline value, from
+       https://www.w3.org/TR/css-align-3/#propdef-justify-self -->
+  <div class="big">
+    <div class="container"><div class="alignEnd"><!--last baseline--></div></div>
+  </div>
+  <div class="small">
+    <div class="container"><div class="alignEnd"><!--last baseline--></div></div>
+  </div>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-last-baseline-001.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-last-baseline-001.html
new file mode 100644
index 0000000..2328268a
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-last-baseline-001.html
@@ -0,0 +1,58 @@
+<!DOCTYPE html>
+<!--
+     Any copyright is dedicated to the Public Domain.
+     http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<html>
+<head>
+  <meta charset="utf-8">
+  <title>CSS Test: Static position of abspos children in a grid container, with various "justify-self" values</title>
+  <link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
+  <link rel="help" href="https://drafts.csswg.org/css-grid/#abspos-items">
+  <link rel="match" href="grid-abspos-staticpos-justify-self-last-baseline-001-ref.html">
+  <style>
+    .container {
+      display: grid;
+      padding: 2px 1px;
+      border: 1px solid black;
+      background: yellow;
+      margin-bottom: 5px;
+      margin-right: 5px;
+      float: left; /* For testing in "rows" of containers */
+      justify-items: center; /* To exercise 'justify-self: auto' on children */
+      position: relative;
+    }
+    br { clear: both }
+
+    .big > .container {
+      width: 30px;
+      height: 22px;
+      grid: 3px 14px 3px / 2px 20px 2px;
+    }
+    .small > .container {
+      grid: 3px 2px 3px / 0px 2px 0px;
+      width: 2px;
+      height: 4px;
+      margin-right: 10px; /* To avoid overlap between overflowing kids */
+    }
+
+    .container > * {
+      position: absolute;
+      grid-area: 2 / 2 / 3 / 3;
+      background: teal;
+      width: 6px;
+      height: 8px;
+    }
+  </style>
+</head>
+<body>
+  <!-- The last baseline value, from
+       https://www.w3.org/TR/css-align-3/#propdef-justify-self -->
+  <div class="big">
+    <div class="container"><div style="justify-self: last baseline"></div></div>
+  </div>
+  <div class="small">
+    <div class="container"><div style="justify-self: last baseline"></div></div>
+  </div>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-last-baseline-002-ref.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-last-baseline-002-ref.html
new file mode 100644
index 0000000..44cc7886
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-last-baseline-002-ref.html
@@ -0,0 +1,56 @@
+<!DOCTYPE html>
+<!--
+     Any copyright is dedicated to the Public Domain.
+     http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<html>
+<head>
+  <meta charset="utf-8">
+  <title>CSS Reference</title>
+  <link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
+  <style>
+    .container {
+      display: block;
+      padding: 2px 1px;
+      border: 1px solid black;
+      background: yellow;
+      margin-bottom: 5px;
+      margin-right: 5px;
+      float: left; /* For testing in "rows" of containers */
+    }
+    br { clear: both }
+
+    .big > .container {
+      width: 30px;
+      height: 22px;
+    }
+    .small > .container {
+      width: 2px;
+      height: 4px;
+      margin-right: 10px; /* To avoid overlap between overflowing kids */
+    }
+
+    .container > * {
+      background: teal;
+      width: 6px;
+      height: 8px;
+    }
+    .big   .alignStart  { margin-left:  0px; }
+    .big   .alignCenter { margin-left: 13px; }
+    .big   .alignEnd    { margin-left: 26px; }
+    .small .alignStart  { margin-left:  0px; }
+    .small .alignCenter { margin-left: -1px; }
+    .small .alignEnd    { margin-left: -2px; }
+  </style>
+</head>
+<body>
+  <!-- The last baseline value, from
+       https://www.w3.org/TR/css-align-3/#propdef-justify-self -->
+  <div class="big">
+    <div class="container"><div class="alignEnd"><!--last baseline--></div></div>
+  </div>
+  <div class="small">
+    <div class="container"><div class="alignEnd"><!--last baseline--></div></div>
+  </div>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-last-baseline-002.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-last-baseline-002.html
new file mode 100644
index 0000000..4ae8b5d
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-last-baseline-002.html
@@ -0,0 +1,57 @@
+<!DOCTYPE html>
+<!--
+     Any copyright is dedicated to the Public Domain.
+     http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<html>
+<head>
+  <meta charset="utf-8">
+  <title>CSS Test: Static position of abspos children in a static-pos grid container, with various "justify-self" values</title>
+  <link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
+  <link rel="help" href="https://drafts.csswg.org/css-grid/#abspos-items">
+  <link rel="match" href="grid-abspos-staticpos-justify-self-last-baseline-002-ref.html">
+  <style>
+    .container {
+      display: grid;
+      padding: 2px 1px;
+      border: 1px solid black;
+      background: yellow;
+      margin-bottom: 5px;
+      margin-right: 5px;
+      float: left; /* For testing in "rows" of containers */
+      justify-items: center; /* To exercise 'justify-self: auto' on children */
+    }
+    br { clear: both }
+
+    .big > .container {
+      width: 30px;
+      height: 22px;
+      grid: 3px 14px 3px / 2px 20px 2px;
+    }
+    .small > .container {
+      grid: 3px 2px 3px / 0px 2px 0px;
+      width: 2px;
+      height: 4px;
+      margin-right: 10px; /* To avoid overlap between overflowing kids */
+    }
+
+    .container > * {
+      position: absolute;
+      grid-area: 2 / 2 / 3 / 3;
+      background: teal;
+      width: 6px;
+      height: 8px;
+    }
+  </style>
+</head>
+<body>
+  <!-- The last baseline value, from
+       https://www.w3.org/TR/css-align-3/#propdef-justify-self -->
+  <div class="big">
+    <div class="container"><div style="justify-self: last baseline"></div></div>
+  </div>
+  <div class="small">
+    <div class="container"><div style="justify-self: last baseline"></div></div>
+  </div>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-rtl-001-ref.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-rtl-001-ref.html
index 8e5db1e..32c9ed2 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-rtl-001-ref.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-rtl-001-ref.html
@@ -55,7 +55,6 @@
     <br>
     <!-- <baseline-position> -->
     <div class="container"><div class="alignStart"><!--baseline--></div></div>
-    <div class="container"><div class="alignEnd"><!--last baseline--></div></div>
     <br>
     <!-- <self-position>, part 1: -->
     <div class="container"><div class="alignCenter"><!--center--></div></div>
@@ -81,7 +80,6 @@
     <br>
     <!-- <baseline-position> -->
     <div class="container"><div class="alignStart"><!--baseline--></div></div>
-    <div class="container"><div class="alignEnd"><!--last baseline--></div></div>
     <br>
     <!-- <self-position>, part 1: -->
     <div class="container"><div class="alignCenter"><!--center--></div></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-rtl-001.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-rtl-001.html
index f8f3586..3080c49 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-rtl-001.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-rtl-001.html
@@ -56,7 +56,6 @@
     <br>
     <!-- <baseline-position> -->
     <div class="container"><div style="justify-self: baseline"></div></div>
-    <div class="container"><div style="justify-self: last baseline"></div></div>
     <br>
     <!-- <self-position>, part 1 -->
     <div class="container"><div style="justify-self: center"></div></div>
@@ -82,7 +81,6 @@
     <br>
     <!-- <baseline-position> -->
     <div class="container"><div style="justify-self: baseline"></div></div>
-    <div class="container"><div style="justify-self: last baseline"></div></div>
     <br>
     <!-- <self-position>, part 1 -->
     <div class="container"><div style="justify-self: center"></div></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-rtl-002-ref.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-rtl-002-ref.html
index c7176a7..4dea207 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-rtl-002-ref.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-rtl-002-ref.html
@@ -55,7 +55,6 @@
     <br>
     <!-- <baseline-position> -->
     <div class="container"><div class="alignStart"><!--baseline--></div></div>
-    <div class="container"><div class="alignEnd"><!--last baseline--></div></div>
     <br>
     <!-- <self-position>, part 1: -->
     <div class="container"><div class="alignCenter"><!--center--></div></div>
@@ -81,7 +80,6 @@
     <br>
     <!-- <baseline-position> -->
     <div class="container"><div class="alignStart"><!--baseline--></div></div>
-    <div class="container"><div class="alignEnd"><!--last baseline--></div></div>
     <br>
     <!-- <self-position>, part 1: -->
     <div class="container"><div class="alignCenter"><!--center--></div></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-rtl-002.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-rtl-002.html
index 528f294..4c3a4a84 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-rtl-002.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-rtl-002.html
@@ -57,7 +57,6 @@
     <br>
     <!-- <baseline-position> -->
     <div class="container"><div style="justify-self: baseline"></div></div>
-    <div class="container"><div style="justify-self: last baseline"></div></div>
     <br>
     <!-- <self-position>, part 1 -->
     <div class="container"><div style="justify-self: center"></div></div>
@@ -83,7 +82,6 @@
     <br>
     <!-- <baseline-position> -->
     <div class="container"><div style="justify-self: baseline"></div></div>
-    <div class="container"><div style="justify-self: last baseline"></div></div>
     <br>
     <!-- <self-position>, part 1 -->
     <div class="container"><div style="justify-self: center"></div></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-rtl-003-ref.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-rtl-003-ref.html
index 8c88ad97b..22dd4bfb 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-rtl-003-ref.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-rtl-003-ref.html
@@ -54,7 +54,6 @@
     <br>
     <!-- <baseline-position> -->
     <div class="container"><div class="alignStart"><!--baseline--></div></div>
-    <div class="container"><div class="alignEnd"><!--last baseline--></div></div>
     <br>
     <!-- <self-position>, part 1: -->
     <div class="container"><div class="alignCenter"><!--center--></div></div>
@@ -80,7 +79,6 @@
     <br>
     <!-- <baseline-position> -->
     <div class="container"><div class="alignStart"><!--baseline--></div></div>
-    <div class="container"><div class="alignEnd"><!--last baseline--></div></div>
     <br>
     <!-- <self-position>, part 1: -->
     <div class="container"><div class="alignCenter"><!--center--></div></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-rtl-003.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-rtl-003.html
index 8343b14..f27bb62 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-rtl-003.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-rtl-003.html
@@ -55,7 +55,6 @@
     <br>
     <!-- <baseline-position> -->
     <div class="container"><div style="justify-self: baseline"></div></div>
-    <div class="container"><div style="justify-self: last baseline"></div></div>
     <br>
     <!-- <self-position>, part 1 -->
     <div class="container"><div style="justify-self: center"></div></div>
@@ -81,7 +80,6 @@
     <br>
     <!-- <baseline-position> -->
     <div class="container"><div style="justify-self: baseline"></div></div>
-    <div class="container"><div style="justify-self: last baseline"></div></div>
     <br>
     <!-- <self-position>, part 1 -->
     <div class="container"><div style="justify-self: center"></div></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-rtl-004-ref.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-rtl-004-ref.html
index 3e4c100..fde33cf 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-rtl-004-ref.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-rtl-004-ref.html
@@ -54,7 +54,6 @@
     <br>
     <!-- <baseline-position> -->
     <div class="container"><div class="alignStart"><!--baseline--></div></div>
-    <div class="container"><div class="alignEnd"><!--last baseline--></div></div>
     <br>
     <!-- <self-position>, part 1: -->
     <div class="container"><div class="alignCenter"><!--center--></div></div>
@@ -80,7 +79,6 @@
     <br>
     <!-- <baseline-position> -->
     <div class="container"><div class="alignStart"><!--baseline--></div></div>
-    <div class="container"><div class="alignEnd"><!--last baseline--></div></div>
     <br>
     <!-- <self-position>, part 1: -->
     <div class="container"><div class="alignCenter"><!--center--></div></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-rtl-004.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-rtl-004.html
index c098cc0..a8647bb 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-rtl-004.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-rtl-004.html
@@ -56,7 +56,6 @@
     <br>
     <!-- <baseline-position> -->
     <div class="container"><div style="justify-self: baseline"></div></div>
-    <div class="container"><div style="justify-self: last baseline"></div></div>
     <br>
     <!-- <self-position>, part 1 -->
     <div class="container"><div style="justify-self: center"></div></div>
@@ -82,7 +81,6 @@
     <br>
     <!-- <baseline-position> -->
     <div class="container"><div style="justify-self: baseline"></div></div>
-    <div class="container"><div style="justify-self: last baseline"></div></div>
     <br>
     <!-- <self-position>, part 1 -->
     <div class="container"><div style="justify-self: center"></div></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-rtl-last-baseline-001-ref.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-rtl-last-baseline-001-ref.html
new file mode 100644
index 0000000..d051371
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-rtl-last-baseline-001-ref.html
@@ -0,0 +1,57 @@
+<!DOCTYPE html>
+<!--
+     Any copyright is dedicated to the Public Domain.
+     http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<html>
+<head>
+  <meta charset="utf-8">
+  <title>CSS Reference</title>
+  <link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
+  <style>
+    .container {
+      display: block;
+      padding: 2px 1px;
+      border: 1px solid black;
+      background: yellow;
+      margin-bottom: 5px;
+      margin-right: 5px;
+      float: left; /* For testing in "rows" of containers */
+    }
+    br { clear: both }
+
+    .big > .container {
+      width: 30px;
+      height: 22px;
+    }
+    .small > .container {
+      width: 2px;
+      height: 4px;
+      margin-right: 10px; /* To avoid overlap between overflowing kids */
+    }
+
+    .container > * {
+      background: teal;
+      width: 6px;
+      height: 8px;
+      margin-top: 3px;
+    }
+    .big   .alignStart  { margin-left: 22px; }
+    .big   .alignCenter { margin-left: 15px; }
+    .big   .alignEnd    { margin-left:  8px; }
+    .small .alignStart  { margin-left: -4px; }
+    .small .alignCenter { margin-left: -2px; }
+    .small .alignEnd    { margin-left:  0px; }
+  </style>
+</head>
+<body>
+  <!-- The last baseline value, from
+       https://www.w3.org/TR/css-align-3/#propdef-justify-self -->
+  <div class="big">
+    <div class="container"><div class="alignEnd"><!--last baseline--></div></div>
+  </div>
+  <div class="small">
+    <div class="container"><div class="alignEnd"><!--last baseline--></div></div>
+  </div>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-rtl-last-baseline-001.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-rtl-last-baseline-001.html
new file mode 100644
index 0000000..1f2be10
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-rtl-last-baseline-001.html
@@ -0,0 +1,58 @@
+<!DOCTYPE html>
+<!--
+     Any copyright is dedicated to the Public Domain.
+     http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<html>
+<head>
+  <meta charset="utf-8">
+  <title>CSS Test: Static position of abspos children in a RTL grid container, with various "justify-self" values</title>
+  <link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
+  <link rel="help" href="https://drafts.csswg.org/css-grid/#abspos-items">
+  <link rel="match" href="grid-abspos-staticpos-justify-self-rtl-last-baseline-001-ref.html">
+  <style>
+    .container {
+      display: grid;
+      direction: rtl;
+      padding: 2px 1px;
+      border: 1px solid black;
+      background: yellow;
+      margin-bottom: 5px;
+      margin-right: 5px;
+      float: left; /* For testing in "rows" of containers */
+      position: relative;
+    }
+    br { clear: both }
+
+    .big > .container {
+      width: 30px;
+      height: 22px;
+      grid: 3px 14px 3px / 2px 20px 2px;
+    }
+    .small > .container {
+      grid: 3px 2px 3px / 0px 2px 0px;
+      width: 2px;
+      height: 4px;
+      margin-right: 10px; /* To avoid overlap between overflowing kids */
+    }
+
+    .container > * {
+      position: absolute;
+      grid-area: 2 / 2 / 3 / 3;
+      background: teal;
+      width: 6px;
+      height: 8px;
+    }
+  </style>
+</head>
+<body>
+  <!-- The last baseline value, from
+       https://www.w3.org/TR/css-align-3/#propdef-justify-self -->
+  <div class="big">
+    <div class="container"><div style="justify-self: last baseline"></div></div>
+  </div>
+  <div class="small">
+    <div class="container"><div style="justify-self: last baseline"></div></div>
+  </div>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-rtl-last-baseline-002-ref.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-rtl-last-baseline-002-ref.html
new file mode 100644
index 0000000..d051371
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-rtl-last-baseline-002-ref.html
@@ -0,0 +1,57 @@
+<!DOCTYPE html>
+<!--
+     Any copyright is dedicated to the Public Domain.
+     http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<html>
+<head>
+  <meta charset="utf-8">
+  <title>CSS Reference</title>
+  <link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
+  <style>
+    .container {
+      display: block;
+      padding: 2px 1px;
+      border: 1px solid black;
+      background: yellow;
+      margin-bottom: 5px;
+      margin-right: 5px;
+      float: left; /* For testing in "rows" of containers */
+    }
+    br { clear: both }
+
+    .big > .container {
+      width: 30px;
+      height: 22px;
+    }
+    .small > .container {
+      width: 2px;
+      height: 4px;
+      margin-right: 10px; /* To avoid overlap between overflowing kids */
+    }
+
+    .container > * {
+      background: teal;
+      width: 6px;
+      height: 8px;
+      margin-top: 3px;
+    }
+    .big   .alignStart  { margin-left: 22px; }
+    .big   .alignCenter { margin-left: 15px; }
+    .big   .alignEnd    { margin-left:  8px; }
+    .small .alignStart  { margin-left: -4px; }
+    .small .alignCenter { margin-left: -2px; }
+    .small .alignEnd    { margin-left:  0px; }
+  </style>
+</head>
+<body>
+  <!-- The last baseline value, from
+       https://www.w3.org/TR/css-align-3/#propdef-justify-self -->
+  <div class="big">
+    <div class="container"><div class="alignEnd"><!--last baseline--></div></div>
+  </div>
+  <div class="small">
+    <div class="container"><div class="alignEnd"><!--last baseline--></div></div>
+  </div>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-rtl-last-baseline-002.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-rtl-last-baseline-002.html
new file mode 100644
index 0000000..519c96f
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-rtl-last-baseline-002.html
@@ -0,0 +1,59 @@
+<!DOCTYPE html>
+<!--
+     Any copyright is dedicated to the Public Domain.
+     http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<html>
+<head>
+  <meta charset="utf-8">
+  <title>CSS Test: Static position of abspos LTR children in a RTL grid container, with various "justify-self" values</title>
+  <link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
+  <link rel="help" href="https://drafts.csswg.org/css-grid/#abspos-items">
+  <link rel="match" href="grid-abspos-staticpos-justify-self-rtl-last-baseline-002-ref.html">
+  <style>
+    .container {
+      display: grid;
+      direction: rtl;
+      padding: 2px 1px;
+      border: 1px solid black;
+      background: yellow;
+      margin-bottom: 5px;
+      margin-right: 5px;
+      float: left; /* For testing in "rows" of containers */
+      position: relative;
+    }
+    br { clear: both }
+
+    .big > .container {
+      width: 30px;
+      height: 22px;
+      grid: 3px 14px 3px / 2px 20px 2px;
+    }
+    .small > .container {
+      grid: 3px 2px 3px / 0px 2px 0px;
+      width: 2px;
+      height: 4px;
+      margin-right: 10px; /* To avoid overlap between overflowing kids */
+    }
+
+    .container > * {
+      position: absolute;
+      direction: ltr;
+      grid-area: 2 / 2 / 3 / 3;
+      background: teal;
+      width: 6px;
+      height: 8px;
+    }
+  </style>
+</head>
+<body>
+  <!-- The last baseline value, from
+       https://www.w3.org/TR/css-align-3/#propdef-justify-self -->
+  <div class="big">
+    <div class="container"><div style="justify-self: last baseline"></div></div>
+  </div>
+  <div class="small">
+    <div class="container"><div style="justify-self: last baseline"></div></div>
+  </div>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-rtl-last-baseline-003-ref.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-rtl-last-baseline-003-ref.html
new file mode 100644
index 0000000..240803b
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-rtl-last-baseline-003-ref.html
@@ -0,0 +1,56 @@
+<!DOCTYPE html>
+<!--
+     Any copyright is dedicated to the Public Domain.
+     http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<html>
+<head>
+  <meta charset="utf-8">
+  <title>CSS Reference</title>
+  <link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
+  <style>
+    .container {
+      display: block;
+      padding: 2px 1px;
+      border: 1px solid black;
+      background: yellow;
+      margin-bottom: 5px;
+      margin-right: 5px;
+      float: left; /* For testing in "rows" of containers */
+    }
+    br { clear: both }
+
+    .big > .container {
+      width: 30px;
+      height: 22px;
+    }
+    .small > .container {
+      width: 2px;
+      height: 4px;
+      margin-right: 10px; /* To avoid overlap between overflowing kids */
+    }
+
+    .container > * {
+      background: teal;
+      width: 6px;
+      height: 8px;
+    }
+    .big   .alignStart  { margin-left: 24px; }
+    .big   .alignCenter { margin-left: 11px; }
+    .big   .alignEnd    { margin-left: -2px; }
+    .small .alignStart  { margin-left: -4px; }
+    .small .alignCenter { margin-left: -3px; }
+    .small .alignEnd    { margin-left: -2px; }
+  </style>
+</head>
+<body>
+  <!-- The last baseline value, from
+       https://www.w3.org/TR/css-align-3/#propdef-justify-self -->
+  <div class="big">
+    <div class="container"><div class="alignEnd"><!--last baseline--></div></div>
+  </div>
+  <div class="small">
+    <div class="container"><div class="alignEnd"><!--last baseline--></div></div>
+  </div>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-rtl-last-baseline-003.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-rtl-last-baseline-003.html
new file mode 100644
index 0000000..90af5052
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-rtl-last-baseline-003.html
@@ -0,0 +1,57 @@
+<!DOCTYPE html>
+<!--
+     Any copyright is dedicated to the Public Domain.
+     http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<html>
+<head>
+  <meta charset="utf-8">
+  <title>CSS Test: Static position of abspos children in a RTL static-pos grid container, with various "justify-self" values</title>
+  <link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
+  <link rel="help" href="https://drafts.csswg.org/css-grid/#abspos-items">
+  <link rel="match" href="grid-abspos-staticpos-justify-self-rtl-last-baseline-003-ref.html">
+  <style>
+    .container {
+      display: grid;
+      direction: rtl;
+      padding: 2px 1px;
+      border: 1px solid black;
+      background: yellow;
+      margin-bottom: 5px;
+      margin-right: 5px;
+      float: left; /* For testing in "rows" of containers */
+    }
+    br { clear: both }
+
+    .big > .container {
+      width: 30px;
+      height: 22px;
+      grid: 3px 14px 3px / 2px 20px 2px;
+    }
+    .small > .container {
+      grid: 3px 2px 3px / 0px 2px 0px;
+      width: 2px;
+      height: 4px;
+      margin-right: 10px; /* To avoid overlap between overflowing kids */
+    }
+
+    .container > * {
+      position: absolute;
+      grid-area: 2 / 2 / 3 / 3;
+      background: teal;
+      width: 6px;
+      height: 8px;
+    }
+  </style>
+</head>
+<body>
+  <!-- The last baseline value, from
+       https://www.w3.org/TR/css-align-3/#propdef-justify-self -->
+  <div class="big">
+    <div class="container"><div style="justify-self: last baseline"></div></div>
+  </div>
+  <div class="small">
+    <div class="container"><div style="justify-self: last baseline"></div></div>
+  </div>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-rtl-last-baseline-004-ref.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-rtl-last-baseline-004-ref.html
new file mode 100644
index 0000000..240803b
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-rtl-last-baseline-004-ref.html
@@ -0,0 +1,56 @@
+<!DOCTYPE html>
+<!--
+     Any copyright is dedicated to the Public Domain.
+     http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<html>
+<head>
+  <meta charset="utf-8">
+  <title>CSS Reference</title>
+  <link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
+  <style>
+    .container {
+      display: block;
+      padding: 2px 1px;
+      border: 1px solid black;
+      background: yellow;
+      margin-bottom: 5px;
+      margin-right: 5px;
+      float: left; /* For testing in "rows" of containers */
+    }
+    br { clear: both }
+
+    .big > .container {
+      width: 30px;
+      height: 22px;
+    }
+    .small > .container {
+      width: 2px;
+      height: 4px;
+      margin-right: 10px; /* To avoid overlap between overflowing kids */
+    }
+
+    .container > * {
+      background: teal;
+      width: 6px;
+      height: 8px;
+    }
+    .big   .alignStart  { margin-left: 24px; }
+    .big   .alignCenter { margin-left: 11px; }
+    .big   .alignEnd    { margin-left: -2px; }
+    .small .alignStart  { margin-left: -4px; }
+    .small .alignCenter { margin-left: -3px; }
+    .small .alignEnd    { margin-left: -2px; }
+  </style>
+</head>
+<body>
+  <!-- The last baseline value, from
+       https://www.w3.org/TR/css-align-3/#propdef-justify-self -->
+  <div class="big">
+    <div class="container"><div class="alignEnd"><!--last baseline--></div></div>
+  </div>
+  <div class="small">
+    <div class="container"><div class="alignEnd"><!--last baseline--></div></div>
+  </div>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-rtl-last-baseline-004.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-rtl-last-baseline-004.html
new file mode 100644
index 0000000..66df456
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-rtl-last-baseline-004.html
@@ -0,0 +1,58 @@
+<!DOCTYPE html>
+<!--
+     Any copyright is dedicated to the Public Domain.
+     http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<html>
+<head>
+  <meta charset="utf-8">
+  <title>CSS Test: Static position of abspos LTR children in a RTL static-pos grid container, with various "justify-self" values</title>
+  <link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
+  <link rel="help" href="https://drafts.csswg.org/css-grid/#abspos-items">
+  <link rel="match" href="grid-abspos-staticpos-justify-self-rtl-last-baseline-004-ref.html">
+  <style>
+    .container {
+      display: grid;
+      direction: rtl;
+      padding: 2px 1px;
+      border: 1px solid black;
+      background: yellow;
+      margin-bottom: 5px;
+      margin-right: 5px;
+      float: left; /* For testing in "rows" of containers */
+    }
+    br { clear: both }
+
+    .big > .container {
+      width: 30px;
+      height: 22px;
+      grid: 3px 14px 3px / 2px 20px 2px;
+    }
+    .small > .container {
+      grid: 3px 2px 3px / 0px 2px 0px;
+      width: 2px;
+      height: 4px;
+      margin-right: 10px; /* To avoid overlap between overflowing kids */
+    }
+
+    .container > * {
+      position: absolute;
+      direction: ltr;
+      grid-area: 2 / 2 / 3 / 3;
+      background: teal;
+      width: 6px;
+      height: 8px;
+    }
+  </style>
+</head>
+<body>
+  <!-- The last baseline value, from
+       https://www.w3.org/TR/css-align-3/#propdef-justify-self -->
+  <div class="big">
+    <div class="container"><div style="justify-self: last baseline"></div></div>
+  </div>
+  <div class="small">
+    <div class="container"><div style="justify-self: last baseline"></div></div>
+  </div>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-vertWM-001-ref.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-vertWM-001-ref.html
index 9fff3eab..1914d55 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-vertWM-001-ref.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-vertWM-001-ref.html
@@ -57,7 +57,6 @@
     <br>
     <!-- <baseline-position> -->
     <div class="container"><div class="alignStart"><!--baseline--></div></div>
-    <div class="container"><div class="alignEnd"><!--last baseline--></div></div>
     <br>
     <!-- <self-position>, part 1: -->
     <div class="container"><div class="alignCenter"><!--center--></div></div>
@@ -83,7 +82,6 @@
     <br>
     <!-- <baseline-position> -->
     <div class="container"><div class="alignStart"><!--baseline--></div></div>
-    <div class="container"><div class="alignEnd"><!--last baseline--></div></div>
     <br>
     <!-- <self-position>, part 1: -->
     <div class="container"><div class="alignCenter"><!--center--></div></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-vertWM-001.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-vertWM-001.html
index 3d91ad9c..ef5af10 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-vertWM-001.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-vertWM-001.html
@@ -55,7 +55,6 @@
     <br>
     <!-- <baseline-position> -->
     <div class="container"><div style="justify-self: baseline"></div></div>
-    <div class="container"><div style="justify-self: last baseline"></div></div>
     <br>
     <!-- <self-position>, part 1 -->
     <div class="container"><div style="justify-self: center"></div></div>
@@ -81,7 +80,6 @@
     <br>
     <!-- <baseline-position> -->
     <div class="container"><div style="justify-self: baseline"></div></div>
-    <div class="container"><div style="justify-self: last baseline"></div></div>
     <br>
     <!-- <self-position>, part 1 -->
     <div class="container"><div style="justify-self: center"></div></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-vertWM-002-ref.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-vertWM-002-ref.html
index 9fff3eab..1914d55 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-vertWM-002-ref.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-vertWM-002-ref.html
@@ -57,7 +57,6 @@
     <br>
     <!-- <baseline-position> -->
     <div class="container"><div class="alignStart"><!--baseline--></div></div>
-    <div class="container"><div class="alignEnd"><!--last baseline--></div></div>
     <br>
     <!-- <self-position>, part 1: -->
     <div class="container"><div class="alignCenter"><!--center--></div></div>
@@ -83,7 +82,6 @@
     <br>
     <!-- <baseline-position> -->
     <div class="container"><div class="alignStart"><!--baseline--></div></div>
-    <div class="container"><div class="alignEnd"><!--last baseline--></div></div>
     <br>
     <!-- <self-position>, part 1: -->
     <div class="container"><div class="alignCenter"><!--center--></div></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-vertWM-002.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-vertWM-002.html
index b983a75..bed8a0a 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-vertWM-002.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-vertWM-002.html
@@ -56,7 +56,6 @@
     <br>
     <!-- <baseline-position> -->
     <div class="container"><div style="justify-self: baseline"></div></div>
-    <div class="container"><div style="justify-self: last baseline"></div></div>
     <br>
     <!-- <self-position>, part 1 -->
     <div class="container"><div style="justify-self: center"></div></div>
@@ -82,7 +81,6 @@
     <br>
     <!-- <baseline-position> -->
     <div class="container"><div style="justify-self: baseline"></div></div>
-    <div class="container"><div style="justify-self: last baseline"></div></div>
     <br>
     <!-- <self-position>, part 1 -->
     <div class="container"><div style="justify-self: center"></div></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-vertWM-003-ref.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-vertWM-003-ref.html
index c0d0b78..230caa4e 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-vertWM-003-ref.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-vertWM-003-ref.html
@@ -56,7 +56,6 @@
     <br>
     <!-- <baseline-position> -->
     <div class="container"><div class="alignStart"><!--baseline--></div></div>
-    <div class="container"><div class="alignEnd"><!--last baseline--></div></div>
     <br>
     <!-- <self-position>, part 1: -->
     <div class="container"><div class="alignCenter"><!--center--></div></div>
@@ -82,7 +81,6 @@
     <br>
     <!-- <baseline-position> -->
     <div class="container"><div class="alignStart"><!--baseline--></div></div>
-    <div class="container"><div class="alignEnd"><!--last baseline--></div></div>
     <br>
     <!-- <self-position>, part 1: -->
     <div class="container"><div class="alignCenter"><!--center--></div></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-vertWM-003.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-vertWM-003.html
index d938a12..2626c49 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-vertWM-003.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-vertWM-003.html
@@ -54,7 +54,6 @@
     <br>
     <!-- <baseline-position> -->
     <div class="container"><div style="justify-self: baseline"></div></div>
-    <div class="container"><div style="justify-self: last baseline"></div></div>
     <br>
     <!-- <self-position>, part 1 -->
     <div class="container"><div style="justify-self: center"></div></div>
@@ -80,7 +79,6 @@
     <br>
     <!-- <baseline-position> -->
     <div class="container"><div style="justify-self: baseline"></div></div>
-    <div class="container"><div style="justify-self: last baseline"></div></div>
     <br>
     <!-- <self-position>, part 1 -->
     <div class="container"><div style="justify-self: center"></div></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-vertWM-004-ref.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-vertWM-004-ref.html
index c0d0b78..230caa4e 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-vertWM-004-ref.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-vertWM-004-ref.html
@@ -56,7 +56,6 @@
     <br>
     <!-- <baseline-position> -->
     <div class="container"><div class="alignStart"><!--baseline--></div></div>
-    <div class="container"><div class="alignEnd"><!--last baseline--></div></div>
     <br>
     <!-- <self-position>, part 1: -->
     <div class="container"><div class="alignCenter"><!--center--></div></div>
@@ -82,7 +81,6 @@
     <br>
     <!-- <baseline-position> -->
     <div class="container"><div class="alignStart"><!--baseline--></div></div>
-    <div class="container"><div class="alignEnd"><!--last baseline--></div></div>
     <br>
     <!-- <self-position>, part 1: -->
     <div class="container"><div class="alignCenter"><!--center--></div></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-vertWM-004.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-vertWM-004.html
index a4cbea83..4574da3a 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-vertWM-004.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-vertWM-004.html
@@ -55,7 +55,6 @@
     <br>
     <!-- <baseline-position> -->
     <div class="container"><div style="justify-self: baseline"></div></div>
-    <div class="container"><div style="justify-self: last baseline"></div></div>
     <br>
     <!-- <self-position>, part 1 -->
     <div class="container"><div style="justify-self: center"></div></div>
@@ -81,7 +80,6 @@
     <br>
     <!-- <baseline-position> -->
     <div class="container"><div style="justify-self: baseline"></div></div>
-    <div class="container"><div style="justify-self: last baseline"></div></div>
     <br>
     <!-- <self-position>, part 1 -->
     <div class="container"><div style="justify-self: center"></div></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-vertWM-last-baseline-001-ref.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-vertWM-last-baseline-001-ref.html
new file mode 100644
index 0000000..7857835
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-vertWM-last-baseline-001-ref.html
@@ -0,0 +1,59 @@
+<!DOCTYPE html>
+<!--
+     Any copyright is dedicated to the Public Domain.
+     http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<html>
+<head>
+  <meta charset="utf-8">
+  <title>CSS Reference</title>
+  <link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
+  <style>
+    .container {
+      display: block;
+      padding: 1px 2px;
+      border: 1px solid black;
+      background: yellow;
+      margin-bottom: 5px;
+      margin-right: 5px;
+      float: left; /* For testing in "rows" of containers */
+    }
+    br { clear: both }
+
+    .big > .container {
+      height: 30px;
+      width: 22px;
+    }
+    .small > .container {
+      height: 2px;
+      width: 4px;
+    }
+
+    .container > * {
+      background: teal;
+      height: 6px;
+      width: 8px;
+      margin-top: 3px;
+    }
+    .big   > .container > * { margin-left: 11px; }
+    .small > .container > * { margin-left: -7px; }
+
+    .big   .alignStart  { margin-top:  2px; }
+    .big   .alignCenter { margin-top:  9px; }
+    .big   .alignEnd    { margin-top: 16px; }
+    .small .alignStart  { margin-top:  0px; }
+    .small .alignCenter { margin-top: -2px; }
+    .small .alignEnd    { margin-top: -4px; }
+  </style>
+</head>
+<body>
+  <!-- The last baseline value, from
+       https://www.w3.org/TR/css-align-3/#propdef-align-self -->
+  <div class="big">
+    <div class="container"><div class="alignEnd"><!--last baseline--></div></div>
+  </div>
+  <div class="small">
+    <div class="container"><div class="alignEnd"><!--last baseline--></div></div>
+  </div>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-vertWM-last-baseline-001.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-vertWM-last-baseline-001.html
new file mode 100644
index 0000000..f7ada7a
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-vertWM-last-baseline-001.html
@@ -0,0 +1,57 @@
+<!DOCTYPE html>
+<!--
+     Any copyright is dedicated to the Public Domain.
+     http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<html>
+<head>
+  <meta charset="utf-8">
+  <title>CSS Test: Static position of abspos children in a vertical-rl grid container, with various "justify-self" values</title>
+  <link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
+  <link rel="help" href="https://drafts.csswg.org/css-grid/#abspos-items">
+  <link rel="match" href="grid-abspos-staticpos-justify-self-vertWM-last-baseline-001-ref.html">
+  <style>
+    .container {
+      display: grid;
+      writing-mode: vertical-rl;
+      padding: 1px 2px;
+      border: 1px solid black;
+      background: yellow;
+      margin-bottom: 5px;
+      margin-right: 5px;
+      float: left; /* For testing in "rows" of containers */
+      position: relative;
+    }
+    br { clear: both }
+
+    .big > .container {
+      height: 30px;
+      width: 22px;
+      grid: 3px 14px 3px / 2px 20px 2px;
+    }
+    .small > .container {
+      grid: 3px 2px 3px / 0px 2px 0px;
+      height: 2px;
+      width: 4px;
+    }
+
+    .container > * {
+      position: absolute;
+      grid-area: 2 / 2 / 3 / 3;
+      background: teal;
+      height: 6px;
+      width: 8px;
+    }
+  </style>
+</head>
+<body>
+  <!-- The last baseline value, from
+       https://www.w3.org/TR/css-align-3/#propdef-justify-self -->
+  <div class="big">
+    <div class="container"><div style="justify-self: last baseline"></div></div>
+  </div>
+  <div class="small">
+    <div class="container"><div style="justify-self: last baseline"></div></div>
+  </div>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-vertWM-last-baseline-002-ref.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-vertWM-last-baseline-002-ref.html
new file mode 100644
index 0000000..fb1c5fd
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-vertWM-last-baseline-002-ref.html
@@ -0,0 +1,59 @@
+<!DOCTYPE html>
+<!--
+     Any copyright is dedicated to the Public Domain.
+     http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<html>
+<head>
+  <meta charset="utf-8">
+  <title>CSS Reference</title>
+  <link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
+  <style>
+    .container {
+      display: block;
+      padding: 1px 2px;
+      border: 1px solid black;
+      background: yellow;
+      margin-bottom: 5px;
+      margin-right: 5px;
+      float: left; /* For testing in "rows" of containers */
+    }
+    br { clear: both }
+
+    .big > .container {
+      height: 30px;
+      width: 22px;
+    }
+    .small > .container {
+      height: 2px;
+      width: 4px;
+    }
+
+    .container > * {
+      background: teal;
+      height: 6px;
+      width: 8px;
+      margin-top: 3px;
+    }
+    .big   > .container > * { margin-left: 11px; }
+    .small > .container > * { margin-left: -7px; }
+
+    .big   .alignStart  { margin-top:  2px; }
+    .big   .alignCenter { margin-top:  9px; }
+    .big   .alignEnd    { margin-top: 16px; }
+    .small .alignStart  { margin-top:  0px; }
+    .small .alignCenter { margin-top: -2px; }
+    .small .alignEnd    { margin-top: -4px; }
+  </style>
+</head>
+<body>
+  <!-- The last baseline value, from
+       https://www.w3.org/TR/css-align-3/#propdef-justify-self -->
+  <div class="big">
+    <div class="container"><div class="alignEnd"><!--last baseline--></div></div>
+  </div>
+  <div class="small">
+    <div class="container"><div class="alignEnd"><!--last baseline--></div></div>
+  </div>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-vertWM-last-baseline-002.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-vertWM-last-baseline-002.html
new file mode 100644
index 0000000..aa1303d3
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-vertWM-last-baseline-002.html
@@ -0,0 +1,58 @@
+<!DOCTYPE html>
+<!--
+     Any copyright is dedicated to the Public Domain.
+     http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<html>
+<head>
+  <meta charset="utf-8">
+  <title>CSS Test: Static position of abspos horizontal-tb children in a vertical-rl grid container, with various "justify-self" values</title>
+  <link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
+  <link rel="help" href="https://drafts.csswg.org/css-grid/#abspos-items">
+  <link rel="match" href="grid-abspos-staticpos-justify-self-vertWM-last-baseline-002-ref.html">
+  <style>
+    .container {
+      display: grid;
+      writing-mode: vertical-rl;
+      padding: 1px 2px;
+      border: 1px solid black;
+      background: yellow;
+      margin-bottom: 5px;
+      margin-right: 5px;
+      float: left; /* For testing in "rows" of containers */
+      position: relative;
+    }
+    br { clear: both }
+
+    .big > .container {
+      height: 30px;
+      width: 22px;
+      grid: 3px 14px 3px / 2px 20px 2px;
+    }
+    .small > .container {
+      grid: 3px 2px 3px / 0px 2px 0px;
+      height: 2px;
+      width: 4px;
+    }
+
+    .container > * {
+      position: absolute;
+      writing-mode: horizontal-tb;
+      grid-area: 2 / 2 / 3 / 3;
+      background: teal;
+      height: 6px;
+      width: 8px;
+    }
+  </style>
+</head>
+<body>
+  <!-- The last baseline value, from
+       https://www.w3.org/TR/css-align-3/#propdef-justify-self -->
+  <div class="big">
+    <div class="container"><div style="justify-self: last baseline"></div></div>
+  </div>
+  <div class="small">
+    <div class="container"><div style="justify-self: last baseline"></div></div>
+  </div>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-vertWM-last-baseline-003-ref.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-vertWM-last-baseline-003-ref.html
new file mode 100644
index 0000000..41555d5e
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-vertWM-last-baseline-003-ref.html
@@ -0,0 +1,58 @@
+<!DOCTYPE html>
+<!--
+     Any copyright is dedicated to the Public Domain.
+     http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<html>
+<head>
+  <meta charset="utf-8">
+  <title>CSS Reference</title>
+  <link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
+  <style>
+    .container {
+      display: block;
+      padding: 1px 2px;
+      border: 1px solid black;
+      background: yellow;
+      margin-bottom: 5px;
+      margin-right: 5px;
+      float: left; /* For testing in "rows" of containers */
+    }
+    br { clear: both }
+
+    .big > .container {
+      height: 30px;
+      width: 22px;
+    }
+    .small > .container {
+      height: 2px;
+      width: 4px;
+    }
+
+    .container > * {
+      background: teal;
+      height: 6px;
+      width: 8px;
+    }
+    .big   > .container > * { margin-left: 14px; }
+    .small > .container > * { margin-left: -4px; }
+
+    .big   .alignStart  { margin-top:  0px; }
+    .big   .alignCenter { margin-top: 13px; }
+    .big   .alignEnd    { margin-top: 26px; }
+    .small .alignStart  { margin-top:  0px; }
+    .small .alignCenter { margin-top: -1px; }
+    .small .alignEnd    { margin-top: -2px; }
+  </style>
+</head>
+<body>
+  <!-- The last baseline value, from
+       https://www.w3.org/TR/css-align-3/#propdef-justify-self -->
+  <div class="big">
+    <div class="container"><div class="alignEnd"><!--last baseline--></div></div>
+  </div>
+  <div class="small">
+    <div class="container"><div class="alignEnd"><!--last baseline--></div></div>
+  </div>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-vertWM-last-baseline-003.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-vertWM-last-baseline-003.html
new file mode 100644
index 0000000..4ab166e
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-vertWM-last-baseline-003.html
@@ -0,0 +1,56 @@
+<!DOCTYPE html>
+<!--
+     Any copyright is dedicated to the Public Domain.
+     http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<html>
+<head>
+  <meta charset="utf-8">
+  <title>CSS Test: Static position of abspos children in a vertical-rl static-pos grid container, with various "justify-self" values</title>
+  <link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
+  <link rel="help" href="https://drafts.csswg.org/css-grid/#abspos-items">
+  <link rel="match" href="grid-abspos-staticpos-justify-self-vertWM-last-baseline-003-ref.html">
+  <style>
+    .container {
+      display: grid;
+      writing-mode: vertical-rl;
+      padding: 1px 2px;
+      border: 1px solid black;
+      background: yellow;
+      margin-bottom: 5px;
+      margin-right: 5px;
+      float: left; /* For testing in "rows" of containers */
+    }
+    br { clear: both }
+
+    .big > .container {
+      height: 30px;
+      width: 22px;
+      grid: 3px 14px 3px / 2px 20px 2px;
+    }
+    .small > .container {
+      grid: 3px 2px 3px / 0px 2px 0px;
+      height: 2px;
+      width: 4px;
+    }
+
+    .container > * {
+      position: absolute;
+      grid-area: 2 / 2 / 3 / 3;
+      background: teal;
+      height: 6px;
+      width: 8px;
+    }
+  </style>
+</head>
+<body>
+  <!-- The last baseline value, from
+       https://www.w3.org/TR/css-align-3/#propdef-justify-self -->
+  <div class="big">
+    <div class="container"><div style="justify-self: last baseline"></div></div>
+  </div>
+  <div class="small">
+    <div class="container"><div style="justify-self: last baseline"></div></div>
+  </div>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-vertWM-last-baseline-004-ref.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-vertWM-last-baseline-004-ref.html
new file mode 100644
index 0000000..41555d5e
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-vertWM-last-baseline-004-ref.html
@@ -0,0 +1,58 @@
+<!DOCTYPE html>
+<!--
+     Any copyright is dedicated to the Public Domain.
+     http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<html>
+<head>
+  <meta charset="utf-8">
+  <title>CSS Reference</title>
+  <link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
+  <style>
+    .container {
+      display: block;
+      padding: 1px 2px;
+      border: 1px solid black;
+      background: yellow;
+      margin-bottom: 5px;
+      margin-right: 5px;
+      float: left; /* For testing in "rows" of containers */
+    }
+    br { clear: both }
+
+    .big > .container {
+      height: 30px;
+      width: 22px;
+    }
+    .small > .container {
+      height: 2px;
+      width: 4px;
+    }
+
+    .container > * {
+      background: teal;
+      height: 6px;
+      width: 8px;
+    }
+    .big   > .container > * { margin-left: 14px; }
+    .small > .container > * { margin-left: -4px; }
+
+    .big   .alignStart  { margin-top:  0px; }
+    .big   .alignCenter { margin-top: 13px; }
+    .big   .alignEnd    { margin-top: 26px; }
+    .small .alignStart  { margin-top:  0px; }
+    .small .alignCenter { margin-top: -1px; }
+    .small .alignEnd    { margin-top: -2px; }
+  </style>
+</head>
+<body>
+  <!-- The last baseline value, from
+       https://www.w3.org/TR/css-align-3/#propdef-justify-self -->
+  <div class="big">
+    <div class="container"><div class="alignEnd"><!--last baseline--></div></div>
+  </div>
+  <div class="small">
+    <div class="container"><div class="alignEnd"><!--last baseline--></div></div>
+  </div>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-vertWM-last-baseline-004.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-vertWM-last-baseline-004.html
new file mode 100644
index 0000000..26e7e66
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-justify-self-vertWM-last-baseline-004.html
@@ -0,0 +1,57 @@
+<!DOCTYPE html>
+<!--
+     Any copyright is dedicated to the Public Domain.
+     http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<html>
+<head>
+  <meta charset="utf-8">
+  <title>CSS Test: Static position of abspos horizontal-tb children in a vertical-rl static-pos grid container, with various "justify-self" values</title>
+  <link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
+  <link rel="help" href="https://drafts.csswg.org/css-grid/#abspos-items">
+  <link rel="match" href="grid-abspos-staticpos-justify-self-vertWM-last-baseline-004-ref.html">
+  <style>
+    .container {
+      display: grid;
+      writing-mode: vertical-rl;
+      padding: 1px 2px;
+      border: 1px solid black;
+      background: yellow;
+      margin-bottom: 5px;
+      margin-right: 5px;
+      float: left; /* For testing in "rows" of containers */
+    }
+    br { clear: both }
+
+    .big > .container {
+      height: 30px;
+      width: 22px;
+      grid: 3px 14px 3px / 2px 20px 2px;
+    }
+    .small > .container {
+      grid: 3px 2px 3px / 0px 2px 0px;
+      height: 2px;
+      width: 4px;
+    }
+
+    .container > * {
+      position: absolute;
+      writing-mode: horizontal-tb;
+      grid-area: 2 / 2 / 3 / 3;
+      background: teal;
+      height: 6px;
+      width: 8px;
+    }
+  </style>
+</head>
+<body>
+  <!-- The last baseline value, from
+       https://www.w3.org/TR/css-align-3/#propdef-justify-self -->
+  <div class="big">
+    <div class="container"><div style="justify-self: last baseline"></div></div>
+  </div>
+  <div class="small">
+    <div class="container"><div style="justify-self: last baseline"></div></div>
+  </div>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/white-space/reference/trailing-ideographic-space-break-spaces-001-ref.html b/third_party/blink/web_tests/external/wpt/css/css-text/white-space/reference/trailing-ideographic-space-break-spaces-001-ref.html
index ad629e9..293f752 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-text/white-space/reference/trailing-ideographic-space-break-spaces-001-ref.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/white-space/reference/trailing-ideographic-space-break-spaces-001-ref.html
@@ -3,7 +3,10 @@
 <title>CSS test reference</title>
 <link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com"/>
 <style>
-    div { white-space: pre; }
+    div {
+        white-space: pre;
+        line-height: 1;
+    }
 </style>
 
 <p>Test passes if the characters below are arranged in pairs with a empty line in between.</p>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/white-space/trailing-ideographic-space-break-spaces-001.html b/third_party/blink/web_tests/external/wpt/css/css-text/white-space/trailing-ideographic-space-break-spaces-001.html
index 2ab5edff..9ecfdb3 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-text/white-space/trailing-ideographic-space-break-spaces-001.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/white-space/trailing-ideographic-space-break-spaces-001.html
@@ -10,6 +10,7 @@
 div {
     width: 3em;
     white-space: break-spaces;
+    line-height: 1;
 }
 </style>
 
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/white-space/trailing-ideographic-space-break-spaces-002.html b/third_party/blink/web_tests/external/wpt/css/css-text/white-space/trailing-ideographic-space-break-spaces-002.html
index 423dd8e..587f4e0 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-text/white-space/trailing-ideographic-space-break-spaces-002.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/white-space/trailing-ideographic-space-break-spaces-002.html
@@ -10,6 +10,7 @@
 div {
     width: 3em;
     white-space: break-spaces;
+    line-height: 1;
 }
 </style>
 
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/white-space/trailing-ideographic-space-break-spaces-003.html b/third_party/blink/web_tests/external/wpt/css/css-text/white-space/trailing-ideographic-space-break-spaces-003.html
index fe09ba7..08eacdd 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-text/white-space/trailing-ideographic-space-break-spaces-003.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/white-space/trailing-ideographic-space-break-spaces-003.html
@@ -10,6 +10,7 @@
 div {
     width: 3em;
     white-space: break-spaces;
+    line-height: 1;
 }
 </style>
 
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/white-space/trailing-ideographic-space-break-spaces-004.html b/third_party/blink/web_tests/external/wpt/css/css-text/white-space/trailing-ideographic-space-break-spaces-004.html
index bdc042e..e9c32cf 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-text/white-space/trailing-ideographic-space-break-spaces-004.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/white-space/trailing-ideographic-space-break-spaces-004.html
@@ -10,6 +10,7 @@
 div {
     width: 3em;
     white-space: break-spaces;
+    line-height: 1;
 }
 </style>
 
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/white-space/trailing-ideographic-space-break-spaces-005.html b/third_party/blink/web_tests/external/wpt/css/css-text/white-space/trailing-ideographic-space-break-spaces-005.html
index 2d31870..a8c68aa 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-text/white-space/trailing-ideographic-space-break-spaces-005.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/white-space/trailing-ideographic-space-break-spaces-005.html
@@ -10,6 +10,7 @@
 div {
     width: 3em;
     white-space: break-spaces;
+    line-height: 1;
 }
 </style>
 
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/white-space/trailing-ideographic-space-break-spaces-006.html b/third_party/blink/web_tests/external/wpt/css/css-text/white-space/trailing-ideographic-space-break-spaces-006.html
index 5ac80ad..e43d7c8 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-text/white-space/trailing-ideographic-space-break-spaces-006.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/white-space/trailing-ideographic-space-break-spaces-006.html
@@ -10,6 +10,7 @@
 div {
     width: 3em;
     white-space: break-spaces;
+    line-height: 1;
 }
 </style>
 
diff --git a/third_party/blink/web_tests/http/tests/devtools/oopif/oopif-presentation-console-messages.js b/third_party/blink/web_tests/http/tests/devtools/oopif/oopif-presentation-console-messages.js
index 6c62af52..a50d445 100644
--- a/third_party/blink/web_tests/http/tests/devtools/oopif/oopif-presentation-console-messages.js
+++ b/third_party/blink/web_tests/http/tests/devtools/oopif/oopif-presentation-console-messages.js
@@ -9,11 +9,19 @@
   await TestRunner.loadModule('console'); await TestRunner.loadTestModule('console_test_runner');
   await TestRunner.showPanel('console');
 
-  function dumpMessage(prefix, message) {
-    TestRunner.addResult(`Line Message was ${prefix}: ${message.uiSourceCode().url()} ${message.level()} '${message.text()}':${message.lineNumber()}:${message.columnNumber()}`);
+  function dumpMessage(prefix, message, url) {
+    TestRunner.addResult(`Line Message was ${prefix}: ${url} ${
+        message.level()} '${message.text()}':${message.lineNumber()}:${
+        message.columnNumber()}`);
   }
-  TestRunner.addSniffer(Workspace.UISourceCode.prototype, 'addLineMessage', (level, text, lineNumber, columnNumber, message) => dumpMessage('added', message), true);
-  TestRunner.addSniffer(Workspace.UISourceCode.prototype, 'removeMessage', message => dumpMessage('removed', message), true);
+  TestRunner.addSniffer(
+      Workspace.UISourceCode.prototype, 'addMessage', function(message) {
+        dumpMessage('added', message, this.url());
+      }, true);
+  TestRunner.addSniffer(
+      Workspace.UISourceCode.prototype, 'removeMessage', function(message) {
+        dumpMessage('removed', message, this.url());
+      }, true);
 
   TestRunner.addResult('\nNavigating main frame');
   await TestRunner.navigatePromise('resources/error.html');
diff --git a/third_party/node/node.gni b/third_party/node/node.gni
new file mode 100644
index 0000000..fc2bc48
--- /dev/null
+++ b/third_party/node/node.gni
@@ -0,0 +1,30 @@
+# Copyright 2021 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")
+
+template("node") {
+  # TODO(crbug.com/1112471): Get this to run cleanly under Python 3.
+  python2_action(target_name) {
+    forward_variables_from(invoker, "*", TESTONLY_AND_VISIBILITY)
+    forward_variables_from(invoker, TESTONLY_AND_VISIBILITY)
+
+    # Declare dependencies to all involved tools.
+    inputs += [
+      "//third_party/node/node.py",
+      "//third_party/node/node_modules.py",
+      "//third_party/node/node_modules.tar.gz.sha1",
+    ]
+
+    if (is_linux || is_chromeos) {
+      inputs += [ "//third_party/node/linux/node-linux-x64.tar.gz.sha1" ]
+    }
+    if (is_win) {
+      inputs += [ "//third_party/node/win/node.exe.sha1" ]
+    }
+    if (is_mac) {
+      inputs += [ "//third_party/node/mac/node-darwin-x64.tar.gz.sha1" ]
+    }
+  }
+}
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index 69d8126..0738ae1f 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -44430,6 +44430,7 @@
   <int value="-1466990325" label="CrosCompUpdates:enabled"/>
   <int value="-1466862366" label="TouchToFillAndroid:enabled"/>
   <int value="-1466759286" label="TabModalJsDialog:disabled"/>
+  <int value="-1466600231" label="WakeOnWifiAllowed:enabled"/>
   <int value="-1465172796" label="CCTModule:disabled"/>
   <int value="-1464832541" label="EnableFuzzyAppSearch:disabled"/>
   <int value="-1463489219" label="OfflinePagesCTSuppressNotifications:enabled"/>
@@ -48182,6 +48183,7 @@
   <int value="1923496816" label="AssistantIntentTranslateInfo:disabled"/>
   <int value="1923780021" label="PrivacyReorderedAndroid:enabled"/>
   <int value="1924192543" label="ProactiveTabFreezeAndDiscard:enabled"/>
+  <int value="1924773264" label="WakeOnWifiAllowed:disabled"/>
   <int value="1925213304" label="FillingAcrossAffiliatedWebsites:enabled"/>
   <int value="1925627218" label="FullscreenToolbarReveal:disabled"/>
   <int value="1926524951" label="SystemWebApps:disabled"/>
@@ -71222,10 +71224,13 @@
   <int value="0" label="Signin primary account"/>
   <int value="1" label="Add secondary account"/>
   <int value="2" label="Reauthentication"/>
-  <int value="3" label="Unlock profile"/>
+  <int value="3" label="Unlock profile (deprecated 03-2021)"/>
   <int value="4" label="Typed URL with unknown reason"/>
   <int value="5"
       label="Signin primary account with force-sign-in policy enabled"/>
+  <int value="6"
+      label="Login and acquire a login scope token without actually signing
+             into any profiles on Chrome."/>
 </enum>
 
 <enum name="SigninReauthResult">
diff --git a/tools/typescript/ts_library.gni b/tools/typescript/ts_library.gni
index 7938a324..4baa76cb 100644
--- a/tools/typescript/ts_library.gni
+++ b/tools/typescript/ts_library.gni
@@ -2,8 +2,10 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
+import("//third_party/node/node.gni")
+
 template("ts_library") {
-  action(target_name) {
+  node(target_name) {
     script = "//tools/typescript/ts_library.py"
 
     forward_variables_from(invoker,
diff --git a/ui/base/ime/chromeos/input_method_chromeos.cc b/ui/base/ime/chromeos/input_method_chromeos.cc
index bed98b5e..527e2a4 100644
--- a/ui/base/ime/chromeos/input_method_chromeos.cc
+++ b/ui/base/ime/chromeos/input_method_chromeos.cc
@@ -648,18 +648,12 @@
 void InputMethodChromeOS::CommitText(
     const std::u16string& text,
     TextInputClient::InsertTextCursorBehavior cursor_behavior) {
-  if (text.empty())
-    return;
-
   // We need to receive input method result even if the text input type is
   // TEXT_INPUT_TYPE_NONE, to make sure we can always send correct
   // character for each key event to the focused text input client.
   if (!GetTextInputClient())
     return;
 
-  if (text.empty())
-    return;
-
   if (!CanComposeInline()) {
     // Hides the candidate window for preedit text.
     UpdateCompositionText(CompositionText(), 0, false);
diff --git a/ui/base/ime/chromeos/input_method_chromeos_unittest.cc b/ui/base/ime/chromeos/input_method_chromeos_unittest.cc
index 37af964..de0d0cf7 100644
--- a/ui/base/ime/chromeos/input_method_chromeos_unittest.cc
+++ b/ui/base/ime/chromeos/input_method_chromeos_unittest.cc
@@ -1276,4 +1276,16 @@
   EXPECT_EQ(fake_text_input_client.selection(), gfx::Range(3, 3));
 }
 
+TEST_F(InputMethodChromeOSTest, CommitTextReplacesSelection) {
+  FakeTextInputClient fake_text_input_client(TEXT_INPUT_TYPE_TEXT);
+  fake_text_input_client.SetTextAndSelection(u"hello", gfx::Range(0, 5));
+  InputMethodChromeOS ime(this);
+  ime.SetFocusedTextInputClient(&fake_text_input_client);
+
+  ime.CommitText(
+      u"", TextInputClient::InsertTextCursorBehavior::kMoveCursorAfterText);
+
+  EXPECT_EQ(fake_text_input_client.text(), u"");
+}
+
 }  // namespace ui
diff --git a/ui/base/ime/fake_text_input_client.cc b/ui/base/ime/fake_text_input_client.cc
index 3c01928..e5593e9 100644
--- a/ui/base/ime/fake_text_input_client.cc
+++ b/ui/base/ime/fake_text_input_client.cc
@@ -39,7 +39,7 @@
 void FakeTextInputClient::InsertText(
     const std::u16string& text,
     TextInputClient::InsertTextCursorBehavior cursor_behavior) {
-  text_.insert(selection_.start(), text);
+  text_.replace(selection_.start(), selection_.length(), text);
 
   if (cursor_behavior ==
       TextInputClient::InsertTextCursorBehavior::kMoveCursorAfterText) {
diff --git a/weblayer/browser/ads_page_load_metrics_observer_browsertest.cc b/weblayer/browser/ads_page_load_metrics_observer_browsertest.cc
index b6f5cd0..70e90bb 100644
--- a/weblayer/browser/ads_page_load_metrics_observer_browsertest.cc
+++ b/weblayer/browser/ads_page_load_metrics_observer_browsertest.cc
@@ -189,8 +189,9 @@
     scoped_feature_list_.InitWithFeaturesAndParameters(
         {{subresource_filter::kAdsInterventionsEnforced, {}},
          {subresource_filter::kAdTagging, {}},
-         {features::kHeavyAdIntervention, {}},
-         {features::kHeavyAdPrivacyMitigations, {{"host-threshold", "3"}}}},
+         {heavy_ad_intervention::features::kHeavyAdIntervention, {}},
+         {heavy_ad_intervention::features::kHeavyAdPrivacyMitigations,
+          {{"host-threshold", "3"}}}},
         {});
   }
 
diff --git a/weblayer/browser/browsing_data_remover_delegate.cc b/weblayer/browser/browsing_data_remover_delegate.cc
index 93aec16..22d17ad 100644
--- a/weblayer/browser/browsing_data_remover_delegate.cc
+++ b/weblayer/browser/browsing_data_remover_delegate.cc
@@ -81,7 +81,7 @@
   }
 
   if (remove_mask & DATA_TYPE_AD_INTERVENTIONS) {
-    HeavyAdService* heavy_ad_service =
+    heavy_ad_intervention::HeavyAdService* heavy_ad_service =
         HeavyAdServiceFactory::GetForBrowserContext(browser_context_);
     if (heavy_ad_service->heavy_ad_blocklist()) {
       heavy_ad_service->heavy_ad_blocklist()->ClearBlockList(delete_begin,
diff --git a/weblayer/browser/heavy_ad_service_factory.cc b/weblayer/browser/heavy_ad_service_factory.cc
index 1d4f55e3..ea9b501 100644
--- a/weblayer/browser/heavy_ad_service_factory.cc
+++ b/weblayer/browser/heavy_ad_service_factory.cc
@@ -11,9 +11,9 @@
 namespace weblayer {
 
 // static
-HeavyAdService* HeavyAdServiceFactory::GetForBrowserContext(
-    content::BrowserContext* context) {
-  return static_cast<HeavyAdService*>(
+heavy_ad_intervention::HeavyAdService*
+HeavyAdServiceFactory::GetForBrowserContext(content::BrowserContext* context) {
+  return static_cast<heavy_ad_intervention::HeavyAdService*>(
       GetInstance()->GetServiceForBrowserContext(context, true));
 }
 
@@ -32,7 +32,7 @@
 
 KeyedService* HeavyAdServiceFactory::BuildServiceInstanceFor(
     content::BrowserContext* context) const {
-  return new HeavyAdService();
+  return new heavy_ad_intervention::HeavyAdService();
 }
 
 content::BrowserContext* HeavyAdServiceFactory::GetBrowserContextToUse(
diff --git a/weblayer/browser/heavy_ad_service_factory.h b/weblayer/browser/heavy_ad_service_factory.h
index 2d1ab08d..2f016ae 100644
--- a/weblayer/browser/heavy_ad_service_factory.h
+++ b/weblayer/browser/heavy_ad_service_factory.h
@@ -12,7 +12,9 @@
 class BrowserContext;
 }
 
+namespace heavy_ad_intervention {
 class HeavyAdService;
+}
 
 namespace weblayer {
 
@@ -22,7 +24,8 @@
   HeavyAdServiceFactory& operator=(const HeavyAdServiceFactory&) = delete;
 
   // Gets the HeavyAdService instance for |context|.
-  static HeavyAdService* GetForBrowserContext(content::BrowserContext* context);
+  static heavy_ad_intervention::HeavyAdService* GetForBrowserContext(
+      content::BrowserContext* context);
 
   static HeavyAdServiceFactory* GetInstance();