diff --git a/DEPS b/DEPS
index c1da6eb..bb970847 100644
--- a/DEPS
+++ b/DEPS
@@ -195,11 +195,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': '2ae1dd93d8533fd2b9db27b081ef6cd491432b45',
+  'skia_revision': 'aa8c4617869e54cc6015b1b2d7a7bf5f512689b8',
   # 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': '5cbb8488b25c61088c24609d889404bedc800776',
+  'v8_revision': '07b0b1dcde4a99294b8028d83f4ea244885cc091',
   # 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.
@@ -207,11 +207,11 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling ANGLE
   # and whatever else without interference from each other.
-  'angle_revision': 'cd8eb564689a36bafba865985076f664a80f6bd3',
+  'angle_revision': '5291cbadc02e4473701f540e656f29c3ded7b387',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling SwiftShader
   # and whatever else without interference from each other.
-  'swiftshader_revision': '952149303d06de35920f1a3913217f572a3f611c',
+  'swiftshader_revision': '51b03d58fb17b09120c886d5df36fb191d12fa8e',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling PDFium
   # and whatever else without interference from each other.
@@ -258,7 +258,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling catapult
   # and whatever else without interference from each other.
-  'catapult_revision': '56df381f7893b9cbf6edae333325c5ae8eb01903',
+  'catapult_revision': 'e611beb1834069d510f53a5f436b31e9241b9993',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libFuzzer
   # and whatever else without interference from each other.
@@ -266,7 +266,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': '528ecb920d34e20a08049908644eb4bff9d1c513',
+  'devtools_frontend_revision': '58919b4db13b56b5b43b46fd793a5c71ddcb89bd',
   # 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.
@@ -302,7 +302,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
-  'spv_tools_revision': 'fc8264854c5346da631a54831e9f34926987eff6',
+  'spv_tools_revision': 'c2553a315f5c78d73a808526782596d4e3870082',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
@@ -1254,7 +1254,7 @@
   },
 
   'src/third_party/perfetto':
-    Var('android_git') + '/platform/external/perfetto.git' + '@' + '7c2d888fdffc6294563173dc335f2d8d2d680b61',
+    Var('android_git') + '/platform/external/perfetto.git' + '@' + 'c251d370b65ed2b50c02e89c8d8852026c2fda24',
 
   'src/third_party/perl': {
       'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3',
@@ -1332,7 +1332,7 @@
       'packages': [
           {
               'package': 'fuchsia/third_party/aemu/linux-amd64',
-              'version': 'x5HOtqet1Ce5_1ZRs5Ec2541WvnbYib8tYl-TZj0xAIC'
+              'version': 'lqz1nnbJiv6AkXiCEbZ8QbFCNIqL__If5b9sY15RbfUC'
           },
       ],
       'condition': 'host_os == "linux" and checkout_fuchsia',
@@ -1558,7 +1558,7 @@
     Var('chromium_git') + '/v8/v8.git' + '@' +  Var('v8_revision'),
 
   'src-internal': {
-    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@557d8bce351a190d26177d07a80935e1b01e127f',
+    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@09f602317f2b34453f03037d745ed29b0c06b1ff',
     'condition': 'checkout_src_internal',
   },
 
diff --git a/android_webview/browser/DEPS b/android_webview/browser/DEPS
index 3991e84..17c2c20 100644
--- a/android_webview/browser/DEPS
+++ b/android_webview/browser/DEPS
@@ -79,6 +79,7 @@
   "+storage/browser/quota",
   "+storage/common/quota",
 
+  "+third_party/blink/public/common/page_state/page_state.h",
   "+third_party/blink/public/mojom/loader/resource_load_info.mojom-shared.h",
   "+third_party/crashpad/crashpad/client",
   "+third_party/crashpad/crashpad/util",
diff --git a/android_webview/browser/state_serializer.cc b/android_webview/browser/state_serializer.cc
index f08dde66..a2445d42 100644
--- a/android_webview/browser/state_serializer.cc
+++ b/android_webview/browser/state_serializer.cc
@@ -15,8 +15,8 @@
 #include "content/public/browser/render_process_host.h"
 #include "content/public/browser/restore_type.h"
 #include "content/public/browser/web_contents.h"
-#include "content/public/common/page_state.h"
 #include "content/public/common/referrer.h"
+#include "third_party/blink/public/common/page_state/page_state.h"
 
 // Reasons for not re-using TabNavigation under chrome/ as of 20121116:
 // * Android WebView has different requirements for fields to store since
@@ -252,7 +252,7 @@
     if (content_state.empty()) {
       // Ensure that the deserialized/restored content::NavigationEntry (and
       // the content::FrameNavigationEntry underneath) has a valid PageState.
-      entry->SetPageState(content::PageState::CreateFromURL(deserialized_url));
+      entry->SetPageState(blink::PageState::CreateFromURL(deserialized_url));
 
       // The |deserialized_referrer| might be inconsistent with the referrer
       // embedded inside the PageState set above.  Nevertheless, to minimize
@@ -268,7 +268,7 @@
       // Note that PageState covers and will clobber some of the values covered
       // by data within |iterator| (e.g. URL and referrer).
       entry->SetPageState(
-          content::PageState::CreateFromEncodedData(content_state));
+          blink::PageState::CreateFromEncodedData(content_state));
 
       // |deserialized_url| and |deserialized_referrer| are redundant wrt
       // PageState, but they should be consistent / in-sync.
diff --git a/android_webview/browser/state_serializer_unittest.cc b/android_webview/browser/state_serializer_unittest.cc
index 062147a..d4a7d6e 100644
--- a/android_webview/browser/state_serializer_unittest.cc
+++ b/android_webview/browser/state_serializer_unittest.cc
@@ -13,9 +13,9 @@
 #include "content/public/browser/content_browser_client.h"
 #include "content/public/browser/navigation_entry.h"
 #include "content/public/common/content_client.h"
-#include "content/public/common/page_state.h"
 #include "services/network/public/mojom/referrer_policy.mojom-shared.h"
 #include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/blink/public/common/page_state/page_state.h"
 #include "url/gurl.h"
 
 using std::string;
diff --git a/base/BUILD.gn b/base/BUILD.gn
index a5c4285..142c0252 100644
--- a/base/BUILD.gn
+++ b/base/BUILD.gn
@@ -1426,6 +1426,8 @@
       "android/path_service_android.cc",
       "android/path_utils.cc",
       "android/path_utils.h",
+      "android/radio_utils.cc",
+      "android/radio_utils.h",
       "android/reached_addresses_bitset.cc",
       "android/reached_addresses_bitset.h",
       "android/reached_code_profiler.cc",
@@ -1776,6 +1778,8 @@
         "allocator/partition_allocator/partition_tag.h",
         "allocator/partition_allocator/partition_tag_bitmap.h",
         "allocator/partition_allocator/partition_tls.h",
+        "allocator/partition_allocator/pcscan.cc",
+        "allocator/partition_allocator/pcscan.h",
         "allocator/partition_allocator/random.cc",
         "allocator/partition_allocator/random.h",
         "allocator/partition_allocator/thread_cache.cc",
@@ -3244,6 +3248,7 @@
       "allocator/partition_allocator/page_allocator_unittest.cc",
       "allocator/partition_allocator/partition_alloc_unittest.cc",
       "allocator/partition_allocator/partition_lock_unittest.cc",
+      "allocator/partition_allocator/pcscan_unittest.cc",
       "allocator/partition_allocator/thread_cache_unittest.cc",
     ]
   }
@@ -3484,6 +3489,7 @@
       "android/java/src/org/chromium/base/PathService.java",
       "android/java/src/org/chromium/base/PathUtils.java",
       "android/java/src/org/chromium/base/PowerMonitor.java",
+      "android/java/src/org/chromium/base/RadioUtils.java",
       "android/java/src/org/chromium/base/SysUtils.java",
       "android/java/src/org/chromium/base/ThreadUtils.java",
       "android/java/src/org/chromium/base/TimeUtils.java",
@@ -3592,6 +3598,7 @@
       "android/java/src/org/chromium/base/PiiElider.java",
       "android/java/src/org/chromium/base/PowerMonitor.java",
       "android/java/src/org/chromium/base/Promise.java",
+      "android/java/src/org/chromium/base/RadioUtils.java",
       "android/java/src/org/chromium/base/SecureRandomInitializer.java",
       "android/java/src/org/chromium/base/StreamUtil.java",
       "android/java/src/org/chromium/base/StrictModeContext.java",
diff --git a/base/allocator/partition_allocator/object_bitmap.h b/base/allocator/partition_allocator/object_bitmap.h
index 0e0cc20..be1c041 100644
--- a/base/allocator/partition_allocator/object_bitmap.h
+++ b/base/allocator/partition_allocator/object_bitmap.h
@@ -155,7 +155,6 @@
 ObjectBitmap<PageSize, PageAlignment, ObjectAlignment>::ObjectIndexAndBit(
     uintptr_t address) const {
   const uintptr_t offset_in_page = address & kPageOffsetMask;
-  PA_DCHECK(!(offset_in_page % kObjectAlignment));
   const size_t object_number = offset_in_page / kObjectAlignment;
   const size_t cell_index = object_number / kBitsPerCell;
   PA_DCHECK(kBitmapSize > cell_index);
diff --git a/base/allocator/partition_allocator/partition_alloc.cc b/base/allocator/partition_allocator/partition_alloc.cc
index febbef17..12ab036a8 100644
--- a/base/allocator/partition_allocator/partition_alloc.cc
+++ b/base/allocator/partition_allocator/partition_alloc.cc
@@ -278,6 +278,11 @@
   // the beginning of the slot.
   allow_extras = (opts.alignment != PartitionOptions::Alignment::kAlignedAlloc);
 
+  // Concurrent freeing in PCScan can only safely work on thread-safe
+  // partitions.
+  if (thread_safe && opts.pcscan == PartitionOptions::PCScan::kEnabled)
+    pcscan.emplace(this);
+
   // We mark the sentinel bucket/page as free to make sure it is skipped by our
   // logic to find a new active page.
   memset(&sentinel_bucket, 0, sizeof(sentinel_bucket));
@@ -876,6 +881,18 @@
 template struct BASE_EXPORT PartitionRoot<internal::ThreadSafe>;
 template struct BASE_EXPORT PartitionRoot<internal::NotThreadSafe>;
 
+static_assert(sizeof(PartitionRoot<internal::ThreadSafe>) ==
+                  sizeof(PartitionRoot<internal::NotThreadSafe>),
+              "Layouts should match");
+static_assert(offsetof(PartitionRoot<internal::ThreadSafe>, buckets) ==
+                  offsetof(PartitionRoot<internal::NotThreadSafe>, buckets),
+              "Layouts should match");
+static_assert(offsetof(PartitionRoot<internal::ThreadSafe>, sentinel_bucket) ==
+                  offsetof(PartitionRoot<internal::ThreadSafe>, buckets) +
+                      kNumBuckets *
+                          sizeof(PartitionRoot<internal::ThreadSafe>::Bucket),
+              "sentinel_bucket must be just after the regular buckets.");
+
 namespace internal {
 
 template <bool thread_safe>
diff --git a/base/allocator/partition_allocator/partition_alloc.h b/base/allocator/partition_allocator/partition_alloc.h
index 06bd7fa..c47fa566 100644
--- a/base/allocator/partition_allocator/partition_alloc.h
+++ b/base/allocator/partition_allocator/partition_alloc.h
@@ -62,6 +62,7 @@
 #include "base/allocator/partition_allocator/page_allocator.h"
 #include "base/allocator/partition_allocator/partition_alloc_check.h"
 #include "base/allocator/partition_allocator/partition_alloc_constants.h"
+#include "base/allocator/partition_allocator/partition_alloc_features.h"
 #include "base/allocator/partition_allocator/partition_alloc_forward.h"
 #include "base/allocator/partition_allocator/partition_bucket.h"
 #include "base/allocator/partition_allocator/partition_cookie.h"
@@ -71,6 +72,7 @@
 #include "base/allocator/partition_allocator/partition_page.h"
 #include "base/allocator/partition_allocator/partition_ref_count.h"
 #include "base/allocator/partition_allocator/partition_tag.h"
+#include "base/allocator/partition_allocator/pcscan.h"
 #include "base/allocator/partition_allocator/thread_cache.h"
 #include "base/base_export.h"
 #include "base/bits.h"
@@ -78,6 +80,7 @@
 #include "base/compiler_specific.h"
 #include "base/gtest_prod_util.h"
 #include "base/notreached.h"
+#include "base/optional.h"
 #include "base/partition_alloc_buildflags.h"
 #include "base/stl_util.h"
 #include "base/synchronization/lock.h"
@@ -389,8 +392,14 @@
     kEnabled,
   };
 
+  enum class PCScan {
+    kDisabled,
+    kEnabled,
+  };
+
   Alignment alignment = Alignment::kRegular;
   ThreadCache thread_cache = ThreadCache::kDisabled;
+  PCScan pcscan = PCScan::kDisabled;
 };
 
 // Never instantiate a PartitionRoot directly, instead use
@@ -403,6 +412,7 @@
       internal::PartitionSuperPageExtentEntry<thread_safe>;
   using DirectMapExtent = internal::PartitionDirectMapExtent<thread_safe>;
   using ScopedGuard = internal::ScopedGuard<thread_safe>;
+  using PCScan = base::Optional<internal::PCScan<thread_safe>>;
 
   internal::MaybeSpinLock<thread_safe> lock_;
 
@@ -441,6 +451,7 @@
 
   // Integrity check = ~reinterpret_cast<uintptr_t>(this).
   uintptr_t inverted_self = 0;
+  PCScan pcscan;
 
   // The bucket lookup table lets us map a size_t to a bucket quickly.
   // The trailing +1 caters for the overflow case for very large allocation
@@ -521,6 +532,8 @@
   ALWAYS_INLINE static void Free(void* ptr);
   // Same as |Free()|, bypasses the allocator hooks.
   ALWAYS_INLINE static void FreeNoHooks(void* ptr);
+  // Immediately frees the pointer bypassing the quarantine.
+  ALWAYS_INLINE void FreeNoHooksImmediate(void* ptr, Page* page);
 
   ALWAYS_INLINE static size_t GetUsableSize(void* ptr);
   ALWAYS_INLINE size_t GetSize(void* ptr) const;
@@ -585,18 +598,6 @@
   friend class internal::ThreadCache;
 };
 
-static_assert(sizeof(PartitionRoot<internal::ThreadSafe>) ==
-                  sizeof(PartitionRoot<internal::NotThreadSafe>),
-              "Layouts should match");
-static_assert(offsetof(PartitionRoot<internal::ThreadSafe>, buckets) ==
-                  offsetof(PartitionRoot<internal::NotThreadSafe>, buckets),
-              "Layouts should match");
-static_assert(offsetof(PartitionRoot<internal::ThreadSafe>, sentinel_bucket) ==
-                  offsetof(PartitionRoot<internal::ThreadSafe>, buckets) +
-                      kNumBuckets *
-                          sizeof(PartitionRoot<internal::ThreadSafe>::Bucket),
-              "sentinel_bucket must be just after the regular buckets.");
-
 template <bool thread_safe>
 ALWAYS_INLINE void* PartitionRoot<thread_safe>::AllocFromBucket(
     Bucket* bucket,
@@ -669,15 +670,6 @@
 // static
 template <bool thread_safe>
 ALWAYS_INLINE void PartitionRoot<thread_safe>::FreeNoHooks(void* ptr) {
-  // The thread cache is added "in the middle" of the main allocator, that is:
-  // - After all the cookie/tag management
-  // - Before the "raw" allocator.
-  //
-  // On the deallocation side:
-  // 1. Check cookies / tags, adjust the pointer
-  // 2. Deallocation
-  //   a. Return to the thread cache of possible. If it succeeds, return.
-  //   b. Otherwise, call the "raw" allocator <-- Locking
   if (UNLIKELY(!ptr))
     return;
 
@@ -687,7 +679,34 @@
   PA_DCHECK(IsValidPage(page));
   auto* root = PartitionRoot<thread_safe>::FromPage(page);
 
-  if (root->allow_extras) {
+  // TODO(bikineev): Change the first condition to LIKELY once PCScan is enabled
+  // by default.
+  if (UNLIKELY(root->pcscan) && LIKELY(!page->bucket->is_direct_mapped())) {
+    root->pcscan->MoveToQuarantine(ptr, page);
+    return;
+  }
+
+  root->FreeNoHooksImmediate(ptr, page);
+}
+
+template <bool thread_safe>
+ALWAYS_INLINE void PartitionRoot<thread_safe>::FreeNoHooksImmediate(
+    void* ptr,
+    Page* page) {
+  // The thread cache is added "in the middle" of the main allocator, that is:
+  // - After all the cookie/tag/ref-count management
+  // - Before the "raw" allocator.
+  //
+  // On the deallocation side:
+  // 1. Check cookies/tags/ref-count, adjust the pointer
+  // 2. Deallocation
+  //   a. Return to the thread cache if possible. If it succeeds, return.
+  //   b. Otherwise, call the "raw" allocator <-- Locking
+  PA_DCHECK(ptr);
+  PA_DCHECK(page);
+  PA_DCHECK(IsValidPage(page));
+
+  if (allow_extras) {
     size_t allocated_size = page->GetAllocatedSize();
 
     // |ptr| points after the tag and the cookie.
@@ -748,17 +767,16 @@
   //
   // Also the thread-unsafe variant doesn't have a use for a thread cache, so
   // make it statically known to the compiler.
-  if (thread_safe && root->with_thread_cache &&
-      !page->bucket->is_direct_mapped()) {
-    PA_DCHECK(page->bucket >= root->buckets &&
-              page->bucket <= &root->sentinel_bucket);
-    size_t bucket_index = page->bucket - root->buckets;
+  if (thread_safe && with_thread_cache && !page->bucket->is_direct_mapped()) {
+    PA_DCHECK(page->bucket >= this->buckets &&
+              page->bucket <= &this->sentinel_bucket);
+    size_t bucket_index = page->bucket - this->buckets;
     auto* thread_cache = internal::ThreadCache::Get();
     if (thread_cache && thread_cache->MaybePutInCache(ptr, bucket_index))
       return;
   }
 
-  root->RawFree(ptr, page);
+  RawFree(ptr, page);
 }
 
 template <bool thread_safe>
@@ -1189,7 +1207,11 @@
   ~PartitionAllocator();
 
   void init(PartitionOptions = {});
+
   ALWAYS_INLINE PartitionRoot<thread_safe>* root() { return &partition_root_; }
+  ALWAYS_INLINE const PartitionRoot<thread_safe>* root() const {
+    return &partition_root_;
+  }
 
  private:
   PartitionRoot<thread_safe> partition_root_;
diff --git a/base/allocator/partition_allocator/partition_alloc_constants.h b/base/allocator/partition_allocator/partition_alloc_constants.h
index e332140..f71df0f 100644
--- a/base/allocator/partition_allocator/partition_alloc_constants.h
+++ b/base/allocator/partition_allocator/partition_alloc_constants.h
@@ -117,6 +117,8 @@
 //     | Guard page (4 KiB)    |
 //     | Metadata page (4 KiB) |
 //     | Guard pages (8 KiB)   |
+//     | TagBitmap             |
+//     | QuarantineBitmaps     |
 //     | Slot span             |
 //     | Slot span             |
 //     | ...                   |
@@ -124,6 +126,9 @@
 //     | Guard pages (16 KiB)  |
 //     +-----------------------+
 //
+// TagBitmap is only present when ENABLE_TAG_FOR_MTE_CHECKED_PTR is defined.
+// QuarantineBitmaps are inserted for partitions that have PCScan enabled.
+//
 // Each slot span is a contiguous range of one or more `PartitionPage`s. Note
 // that slot spans of different sizes may co-exist with one super page. Even
 // slot spans of the same size may support different slot sizes. However, all
diff --git a/base/allocator/partition_allocator/partition_alloc_features.cc b/base/allocator/partition_allocator/partition_alloc_features.cc
index c6eaf4c2..7176685 100644
--- a/base/allocator/partition_allocator/partition_alloc_features.cc
+++ b/base/allocator/partition_allocator/partition_alloc_features.cc
@@ -20,5 +20,10 @@
                                       FEATURE_DISABLED_BY_DEFAULT};
 #endif
 
+// If enabled, PCScan is turned on by default for all partitions that don't
+// disable it explicitly.
+const Feature kPartitionAllocPCScan{"PartitionAllocPCScan",
+                                    FEATURE_DISABLED_BY_DEFAULT};
+
 }  // namespace features
 }  // namespace base
diff --git a/base/allocator/partition_allocator/partition_alloc_features.h b/base/allocator/partition_allocator/partition_alloc_features.h
index 47bc891..8a847e1 100644
--- a/base/allocator/partition_allocator/partition_alloc_features.h
+++ b/base/allocator/partition_allocator/partition_alloc_features.h
@@ -26,6 +26,7 @@
 namespace features {
 
 extern const BASE_EXPORT Feature kPartitionAllocGigaCage;
+extern const BASE_EXPORT Feature kPartitionAllocPCScan;
 
 ALWAYS_INLINE bool IsPartitionAllocGigaCageEnabled() {
 #if defined(PA_HAS_64_BITS_POINTERS) && defined(OS_WIN)
@@ -59,6 +60,15 @@
 #endif  // BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC)
 }
 
+ALWAYS_INLINE bool IsPartitionAllocPCScanEnabled() {
+#if !defined(PA_HAS_64_BITS_POINTERS)
+  return false;
+#endif
+  // TODO(bikineev): Calling this function can allocate which can cause
+  // reentrancy for the 'PA as malloc' configuration.
+  return FeatureList::IsEnabled(kPartitionAllocPCScan);
+}
+
 }  // namespace features
 }  // namespace base
 
diff --git a/base/allocator/partition_allocator/partition_bucket.cc b/base/allocator/partition_allocator/partition_bucket.cc
index 6b58186..fdc42ecb 100644
--- a/base/allocator/partition_allocator/partition_bucket.cc
+++ b/base/allocator/partition_allocator/partition_bucket.cc
@@ -5,6 +5,7 @@
 #include "base/allocator/partition_allocator/partition_bucket.h"
 
 #include "base/allocator/partition_allocator/address_pool_manager.h"
+#include "base/allocator/partition_allocator/object_bitmap.h"
 #include "base/allocator/partition_allocator/oom.h"
 #include "base/allocator/partition_allocator/page_allocator.h"
 #include "base/allocator/partition_allocator/partition_address_space.h"
@@ -286,7 +287,11 @@
   // TODO(tasak): Consider starting the bitmap right after metadata to save
   // space.
   char* tag_bitmap = super_page + PartitionPageSize();
-  char* ret = tag_bitmap + kReservedTagBitmapSize;
+  char* quarantine_bitmaps = tag_bitmap + kReservedTagBitmapSize;
+  const size_t quarantine_bitmaps_size =
+      root->pcscan ? 2 * sizeof(QuarantineBitmap) : 0;
+  PA_DCHECK(quarantine_bitmaps_size % PartitionPageSize() == 0);
+  char* ret = quarantine_bitmaps + quarantine_bitmaps_size;
   root->next_partition_page = ret + total_size;
   root->next_partition_page_end = root->next_super_page - PartitionPageSize();
 
@@ -335,9 +340,10 @@
   // TODO(ajwong): Refactor Page Allocator API so the SuperPage comes in
   // decommited initially.
   SetSystemPagesAccess(
-      super_page + PartitionPageSize() + kReservedTagBitmapSize + total_size,
+      super_page + PartitionPageSize() + kReservedTagBitmapSize +
+          quarantine_bitmaps_size + total_size,
       (kSuperPageSize - PartitionPageSize() - kReservedTagBitmapSize -
-       total_size),
+       quarantine_bitmaps_size - total_size),
       PageInaccessible);
 
   // If we were after a specific address, but didn't get it, assume that
diff --git a/base/allocator/partition_allocator/partition_page.h b/base/allocator/partition_allocator/partition_page.h
index 370af12f..89c52834 100644
--- a/base/allocator/partition_allocator/partition_page.h
+++ b/base/allocator/partition_allocator/partition_page.h
@@ -7,12 +7,16 @@
 
 #include <string.h>
 
+#include "base/allocator/partition_allocator/address_pool_manager.h"
+#include "base/allocator/partition_allocator/object_bitmap.h"
+#include "base/allocator/partition_allocator/partition_address_space.h"
 #include "base/allocator/partition_allocator/partition_alloc_check.h"
 #include "base/allocator/partition_allocator/partition_alloc_constants.h"
 #include "base/allocator/partition_allocator/partition_alloc_forward.h"
 #include "base/allocator/partition_allocator/partition_bucket.h"
 #include "base/allocator/partition_allocator/partition_freelist_entry.h"
 #include "base/allocator/partition_allocator/partition_tag.h"
+#include "base/allocator/partition_allocator/partition_tag_bitmap.h"
 #include "base/allocator/partition_allocator/random.h"
 #include "base/check_op.h"
 #include "base/thread_annotations.h"
@@ -48,6 +52,9 @@
   BASE_EXPORT NOINLINE void Unmap();
 };
 
+using QuarantineBitmap =
+    ObjectBitmap<kSuperPageSize, kSuperPageAlignment, kAlignment>;
+
 // Some notes on page states. A page can be in one of four major states:
 // 1) Active.
 // 2) Full.
@@ -180,6 +187,18 @@
   return reinterpret_cast<char*>(pointer_as_uint + SystemPageSize());
 }
 
+ALWAYS_INLINE bool IsWithinSuperPagePayload(bool with_pcscan, void* ptr) {
+  PA_DCHECK(!IsManagedByPartitionAllocDirectMap(ptr));
+  const auto ptr_as_uint = reinterpret_cast<uintptr_t>(ptr);
+  const auto super_page_base = ptr_as_uint & kSuperPageBaseMask;
+  const uintptr_t payload_start =
+      super_page_base + PartitionPageSize() + kReservedTagBitmapSize +
+      (with_pcscan ? 2 * sizeof(QuarantineBitmap) : 0);
+  const uintptr_t payload_end =
+      super_page_base + kSuperPageSize - PartitionPageSize();
+  return ptr_as_uint >= payload_start && ptr_as_uint < payload_end;
+}
+
 // See the comment for |FromPointer|.
 template <bool thread_safe>
 ALWAYS_INLINE PartitionPage<thread_safe>*
@@ -365,6 +384,25 @@
   }
 }
 
+enum class QuarantineBitmapType { kMutator, kScanner };
+
+ALWAYS_INLINE QuarantineBitmap* QuarantineBitmapFromPointer(
+    QuarantineBitmapType type,
+    size_t pcscan_epoch,
+    void* ptr) {
+  PA_DCHECK(!IsManagedByPartitionAllocDirectMap(ptr));
+  auto* super_page = reinterpret_cast<char*>(reinterpret_cast<uintptr_t>(ptr) &
+                                             kSuperPageBaseMask);
+  auto* first_bitmap = reinterpret_cast<QuarantineBitmap*>(
+      super_page + PartitionPageSize() + kReservedTagBitmapSize);
+  auto* second_bitmap = first_bitmap + 1;
+
+  if (type == QuarantineBitmapType::kScanner)
+    std::swap(first_bitmap, second_bitmap);
+
+  return (pcscan_epoch & 1) ? second_bitmap : first_bitmap;
+}
+
 }  // namespace internal
 }  // namespace base
 
diff --git a/base/allocator/partition_allocator/pcscan.cc b/base/allocator/partition_allocator/pcscan.cc
new file mode 100644
index 0000000..70e3a15
--- /dev/null
+++ b/base/allocator/partition_allocator/pcscan.cc
@@ -0,0 +1,382 @@
+// Copyright (c) 2020 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 "base/allocator/partition_allocator/pcscan.h"
+
+#include <map>
+#include <set>
+// TODO(bikineev): Change to base's thread.
+#include <thread>
+#include <vector>
+
+#include "base/allocator/partition_allocator/object_bitmap.h"
+#include "base/allocator/partition_allocator/partition_address_space.h"
+#include "base/allocator/partition_allocator/partition_alloc.h"
+#include "base/allocator/partition_allocator/partition_alloc_constants.h"
+#include "base/allocator/partition_allocator/partition_alloc_features.h"
+#include "base/allocator/partition_allocator/partition_page.h"
+#include "base/compiler_specific.h"
+#include "base/logging.h"
+#include "base/no_destructor.h"
+#include "base/task/task_traits.h"
+#include "base/task/thread_pool.h"
+#include "base/task/thread_pool/thread_pool_instance.h"
+#include "base/trace_event/base_tracing.h"
+
+namespace base {
+namespace internal {
+
+namespace {
+
+ThreadSafePartitionRoot& PCScanMetadataAllocator() {
+  static base::NoDestructor<ThreadSafePartitionRoot> allocator{
+      PartitionOptions{PartitionOptions::Alignment::kRegular,
+                       PartitionOptions::ThreadCache::kDisabled,
+                       PartitionOptions::PCScan::kDisabled}};
+  return *allocator;
+}
+
+// STL allocator which is needed to keep internal data structures required by
+// PCScan.
+template <typename T>
+class MetadataAllocator final {
+ public:
+  using value_type = T;
+
+  MetadataAllocator() = default;
+
+  template <typename U>
+  MetadataAllocator(const MetadataAllocator<U>&) {}  // NOLINT
+
+  template <typename U>
+  MetadataAllocator& operator=(const MetadataAllocator<U>&) {}
+
+  template <typename U>
+  bool operator==(const MetadataAllocator<U>&) {
+    return true;
+  }
+
+  value_type* allocate(size_t size) {
+    return static_cast<value_type*>(PCScanMetadataAllocator().AllocFlagsNoHooks(
+        0, size * sizeof(value_type)));
+  }
+
+  void deallocate(value_type* ptr, size_t size) {
+    PCScanMetadataAllocator().FreeNoHooks(ptr);
+  }
+};
+
+void ReportStats(size_t swept_bytes, size_t last_size, size_t new_size) {
+  VLOG(2) << "swept bytes: " << swept_bytes;
+  VLOG(2) << "quarantine size: " << last_size << " -> " << new_size;
+  VLOG(2) << "quarantine survival rate: "
+          << static_cast<double>(new_size) / last_size;
+}
+
+}  // namespace
+
+// This class is responsible for performing the entire PCScan task.
+template <bool thread_safe>
+class PCScan<thread_safe>::PCScanTask final {
+ public:
+  // Creates and initializes a PCScan state from PartitionRoot.
+  PCScanTask(PCScan& pcscan, Root& root);
+
+  // Only allow moving to make sure that the state is not redundantly copied.
+  PCScanTask(PCScanTask&&) noexcept = default;
+  PCScanTask& operator=(PCScanTask&&) noexcept = default;
+
+  // Execute PCScan. Must be executed only once.
+  void RunOnce() &&;
+
+ private:
+  using Page = PartitionPage<thread_safe>;
+
+  struct ScanArea {
+    uintptr_t* begin = nullptr;
+    uintptr_t* end = nullptr;
+  };
+  using ScanAreas = std::vector<ScanArea, MetadataAllocator<ScanArea>>;
+
+  // Super pages only correspond to normal buckets.
+  // TODO(bikineev): Consider flat containers since the number of elements is
+  // relatively small. This requires making base containers allocator-aware.
+  using SuperPages =
+      std::set<uintptr_t, std::less<>, MetadataAllocator<uintptr_t>>;
+
+  QuarantineBitmap* FindScannerBitmapForPointer(uintptr_t maybe_ptr) const;
+
+  // Lookup and marking functions. Return size of the object if marked or zero
+  // otherwise.
+  size_t TryMarkObjectInNormalBucketPool(uintptr_t maybe_ptr);
+
+  // Clear quarantined objects inside the PCScan task.
+  void ClearQuarantinedObjects() const;
+
+  // Scans the partition and marks reachable quarantined objects. Returns the
+  // size of marked objects. The function race-fully reads the heap and
+  // therefore tsan is disabled for it.
+  size_t ScanPartition() NO_SANITIZE("thread");
+
+  // Sweeps (frees) unreachable quarantined entries. Returns the size of swept
+  // objects.
+  size_t SweepQuarantine();
+
+  PCScan<thread_safe>& pcscan_;
+  PartitionRoot<thread_safe>& root_;
+
+  ScanAreas scan_areas_;
+  SuperPages super_pages_;
+};
+
+template <bool thread_safe>
+QuarantineBitmap* PCScan<thread_safe>::PCScanTask::FindScannerBitmapForPointer(
+    uintptr_t maybe_ptr) const {
+  // TODO(bikineev): Consider using the bitset in AddressPoolManager::Pool to
+  // quickly find a super-page.
+  const auto super_page_base = maybe_ptr & kSuperPageBaseMask;
+
+  auto it = super_pages_.lower_bound(super_page_base);
+  if (it == super_pages_.end() || *it != super_page_base)
+    return nullptr;
+
+  if (!IsWithinSuperPagePayload(true /*with pcscan*/,
+                                reinterpret_cast<void*>(maybe_ptr)))
+    return nullptr;
+
+  // We are certain here that |maybe_ptr| points to the superpage payload.
+  return QuarantineBitmapFromPointer(QuarantineBitmapType::kScanner,
+                                     pcscan_.quarantine_data_.epoch(),
+                                     reinterpret_cast<char*>(maybe_ptr));
+}
+
+// Looks up and marks a potential dangling pointer. Returns the size of the slot
+// (which is then accounted as quarantined) or zero if no object is found.
+// For normal bucket super pages, PCScan uses two quarantine bitmaps, the
+// mutator and the scanner one. The former is used by mutators when objects are
+// freed, while the latter is used concurrently by the PCScan thread. The
+// bitmaps are swapped as soon as PCScan is triggered. Once a dangling pointer
+// (which points to an object in the scanner bitmap) is found,
+// TryMarkObjectInNormalBucketPool() marks it again in the bitmap and clears
+// from the scanner bitmap. This way, when scanning is done, all uncleared
+// entries in the scanner bitmap correspond to unreachable objects.
+template <bool thread_safe>
+size_t PCScan<thread_safe>::PCScanTask::TryMarkObjectInNormalBucketPool(
+    uintptr_t maybe_ptr) {
+  // Check if maybe_ptr points somewhere to the heap.
+  auto* bitmap = FindScannerBitmapForPointer(maybe_ptr);
+  if (!bitmap)
+    return 0;
+
+  // Check if pointer was in the quarantine bitmap.
+  const uintptr_t base = bitmap->FindPotentialObjectBeginning(maybe_ptr);
+  if (!base)
+    return 0;
+
+  PA_DCHECK((maybe_ptr & kSuperPageBaseMask) == (base & kSuperPageBaseMask));
+
+  auto target_page =
+      Page::FromPointerNoAlignmentCheck(reinterpret_cast<void*>(base));
+  PA_DCHECK(&root_ == PartitionRoot<thread_safe>::FromPage(target_page));
+
+  const size_t object_size = PartitionSizeAdjustSubtract(
+      root_.allow_extras, target_page->GetAllocatedSize());
+  // Range check for inner pointers.
+  if (maybe_ptr >= base + object_size)
+    return 0;
+
+  // Now we are certain that |maybe_ptr| is a dangling pointer. Mark it again in
+  // the mutator bitmap and clear from the scanner bitmap.
+  bitmap->ClearBit(base);
+  QuarantineBitmapFromPointer(QuarantineBitmapType::kMutator,
+                              pcscan_.quarantine_data_.epoch(),
+                              reinterpret_cast<char*>(base))
+      ->SetBit(base);
+  return target_page->bucket->slot_size;
+}
+
+template <bool thread_safe>
+void PCScan<thread_safe>::PCScanTask::ClearQuarantinedObjects() const {
+  const bool allow_extras = root_.allow_extras;
+  for (auto super_page : super_pages_) {
+    auto* bitmap = QuarantineBitmapFromPointer(
+        QuarantineBitmapType::kScanner, pcscan_.quarantine_data_.epoch(),
+        reinterpret_cast<char*>(super_page));
+    bitmap->Iterate([allow_extras](uintptr_t ptr) {
+      auto* object = reinterpret_cast<void*>(ptr);
+      auto* page = Page::FromPointerNoAlignmentCheck(object);
+      // Use zero as a zapping value to speed up the fast bailout check in
+      // ScanPartition.
+      memset(
+          object, 0,
+          PartitionSizeAdjustSubtract(allow_extras, page->GetAllocatedSize()));
+    });
+  }
+}
+
+template <bool thread_safe>
+size_t PCScan<thread_safe>::PCScanTask::ScanPartition() NO_SANITIZE("thread") {
+  static_assert(alignof(uintptr_t) % alignof(void*) == 0,
+                "Alignment of uintptr_t must be at least as strict as "
+                "alignment of a pointer type.");
+  size_t new_quarantine_size = 0;
+
+  for (auto scan_area : scan_areas_) {
+    for (uintptr_t* payload = scan_area.begin; payload < scan_area.end;
+         ++payload) {
+      PA_DCHECK(reinterpret_cast<uintptr_t>(payload) % alignof(void*) == 0);
+      auto maybe_ptr = *payload;
+      if (!maybe_ptr)
+        continue;
+      size_t slot_size = 0;
+// TODO(bikineev): Remove the preprocessor condition after 32bit GigaCage is
+// implemented.
+#if defined(PA_HAS_64_BITS_POINTERS)
+      // On partitions without extras (partitions with aligned allocations),
+      // pages are not allocated from the GigaCage.
+      if (features::IsPartitionAllocGigaCageEnabled() && root_.allow_extras) {
+        // With GigaCage, we first do a fast bitmask check to see if the pointer
+        // points to the normal bucket pool.
+        if (!PartitionAddressSpace::IsInNormalBucketPool(
+                reinterpret_cast<void*>(maybe_ptr)))
+          continue;
+        // Otherwise, search in the list of super pages.
+        slot_size = TryMarkObjectInNormalBucketPool(maybe_ptr);
+        // TODO(bikineev): Check IsInDirectBucketPool.
+      } else
+#endif
+      {
+        slot_size = TryMarkObjectInNormalBucketPool(maybe_ptr);
+      }
+
+      new_quarantine_size += slot_size;
+    }
+  }
+
+  return new_quarantine_size;
+}
+
+template <bool thread_safe>
+size_t PCScan<thread_safe>::PCScanTask::SweepQuarantine() {
+  size_t swept_bytes = 0;
+
+  for (auto super_page : super_pages_) {
+    auto* bitmap = QuarantineBitmapFromPointer(
+        QuarantineBitmapType::kScanner, pcscan_.quarantine_data_.epoch(),
+        reinterpret_cast<char*>(super_page));
+    bitmap->Iterate([this, &swept_bytes](uintptr_t ptr) {
+      auto* object = reinterpret_cast<void*>(ptr);
+      auto* page = Page::FromPointerNoAlignmentCheck(object);
+      swept_bytes += page->bucket->slot_size;
+      root_.FreeNoHooksImmediate(object, page);
+    });
+    bitmap->Clear();
+  }
+
+  return swept_bytes;
+}
+
+template <bool thread_safe>
+PCScan<thread_safe>::PCScanTask::PCScanTask(PCScan& pcscan, Root& root)
+    : pcscan_(pcscan), root_(root) {
+  typename Root::ScopedGuard guard(root.lock_);
+  // Take a snapshot of all super pages.
+  // TODO(bikineev): Consider making current_extent lock-free and moving it to
+  // the concurrent thread.
+  for (auto* super_page_extent = root_.first_extent; super_page_extent;
+       super_page_extent = super_page_extent->next) {
+    for (char* super_page = super_page_extent->super_page_base;
+         super_page != super_page_extent->super_pages_end;
+         super_page += kSuperPageSize) {
+      super_pages_.insert(reinterpret_cast<uintptr_t>(super_page));
+    }
+  }
+
+  // Take a snapshot of all active pages.
+  static constexpr size_t kScanAreasReservationSlack = 10;
+  const size_t kScanAreasReservationSize = root_.total_size_of_committed_pages /
+                                           PartitionPageSize() /
+                                           kScanAreasReservationSlack;
+  scan_areas_.reserve(kScanAreasReservationSize);
+  {
+    // TODO(bikineev): Scan full pages.
+    for (const auto& bucket : root_.buckets) {
+      for (auto* page = bucket.active_pages_head;
+           page && page != page->get_sentinel_page(); page = page->next_page) {
+        // The active list may contain false positives, skip them.
+        if (page->is_empty() || page->is_decommitted())
+          continue;
+
+        auto* payload_begin = static_cast<uintptr_t*>(Page::ToPointer(page));
+        auto* payload_end =
+            payload_begin +
+            (page->bucket->get_bytes_per_span() / sizeof(uintptr_t));
+        scan_areas_.push_back({payload_begin, payload_end});
+      }
+    }
+  }
+}
+
+// TODO(bikineev): Synchronize task execution with destruction of
+// PartitionRoot/PCScan.
+template <bool thread_safe>
+PCScan<thread_safe>::~PCScan() = default;
+
+template <bool thread_safe>
+void PCScan<thread_safe>::PCScanTask::RunOnce() && {
+  TRACE_EVENT0("partition_alloc", "PCScan");
+
+  // Clear all quarantined objects.
+  ClearQuarantinedObjects();
+
+  // Mark and sweep the quarantine list.
+  const auto new_quarantine_size = ScanPartition();
+  const auto swept_bytes = SweepQuarantine();
+
+  ReportStats(swept_bytes, pcscan_.quarantine_data_.last_size(),
+              new_quarantine_size);
+
+  pcscan_.quarantine_data_.Account(new_quarantine_size);
+  pcscan_.quarantine_data_.GrowLimitIfNeeded();
+
+  // Check that concurrent task can't be scheduled twice.
+  PA_CHECK(pcscan_.in_progress_.exchange(false));
+}
+
+template <bool thread_safe>
+void PCScan<thread_safe>::ScheduleTask(TaskType task_type) {
+  PA_DCHECK(root_);
+  PA_DCHECK(root_->pcscan);
+
+  if (in_progress_.exchange(true)) {
+    // Bail out if PCScan is already in progress.
+    return;
+  }
+
+  quarantine_data_.ResetAndAdvanceEpoch();
+
+  // Initialize PCScan task.
+  PCScanTask task(*this, *root_);
+
+  // Post PCScan task.
+  const auto callback = [](PCScanTask task) { std::move(task).RunOnce(); };
+  if (UNLIKELY(task_type == TaskType::kBlockingForTesting)) {
+    // Blocking is only used for testing.
+    callback(std::move(task));
+  } else if (LIKELY(base::ThreadPoolInstance::Get())) {
+    // If available, try to use base::ThreadPool.
+    base::ThreadPool::PostTask(FROM_HERE,
+                               base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN,
+                               base::BindOnce(callback, std::move(task)));
+  } else {
+    // Otherwise, retreat to kernel threads. TODO(bikineev): Use base's threads.
+    std::thread{callback, std::move(task)}.detach();
+  }
+}
+
+template class PCScan<ThreadSafe>;
+template class PCScan<NotThreadSafe>;
+
+}  // namespace internal
+}  // namespace base
diff --git a/base/allocator/partition_allocator/pcscan.h b/base/allocator/partition_allocator/pcscan.h
new file mode 100644
index 0000000..4b7d7d3
--- /dev/null
+++ b/base/allocator/partition_allocator/pcscan.h
@@ -0,0 +1,134 @@
+// Copyright (c) 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef BASE_ALLOCATOR_PARTITION_ALLOCATOR_PCSCAN_H_
+#define BASE_ALLOCATOR_PARTITION_ALLOCATOR_PCSCAN_H_
+
+#include <atomic>
+
+#include "base/allocator/partition_allocator/object_bitmap.h"
+#include "base/allocator/partition_allocator/partition_alloc_forward.h"
+#include "base/allocator/partition_allocator/partition_direct_map_extent.h"
+#include "base/allocator/partition_allocator/partition_page.h"
+#include "base/base_export.h"
+
+namespace base {
+namespace internal {
+
+// PCScan (Probabilistic Conservative Scanning) is the algorithm that eliminates
+// use-after-free bugs by verifying that there are no pointers in memory which
+// point to explicitly freed objects before actually releasing their memory. If
+// PCScan is enabled for a partition, freed objects are not immediately returned
+// to the allocator, but are stored in a quarantine. When the quarantine reaches
+// a certain threshold, a concurrent PCScan task gets posted. The task scans the
+// entire heap, looking for dangling pointers (those that point to the
+// quarantine entries). After scanning, the unvisited quarantine entries are
+// unreachable and therefore can be safely reclaimed.
+//
+// The driver class encapsulates the entire PCScan infrastructure. It provides
+// a single function MoveToQuarantine() that posts a concurrent task if the
+// limit is reached.
+//
+// TODO: PCScan should work for all partitions in the PartitionAlloc heap, not
+// on a per-PartitionRoot basis.
+template <bool thread_safe>
+class BASE_EXPORT PCScan final {
+ public:
+  using Root = PartitionRoot<thread_safe>;
+  using Page = PartitionPage<thread_safe>;
+
+  explicit PCScan(Root* root) : root_(root) {}
+
+  PCScan(const PCScan&) = delete;
+  PCScan& operator=(const PCScan&) = delete;
+
+  ~PCScan();
+
+  ALWAYS_INLINE void MoveToQuarantine(void* ptr, Page* page);
+
+ private:
+  class PCScanTask;
+  friend class PCScanTest;
+
+  class QuarantineData final {
+   public:
+    // Account freed bytes. Returns true if limit was reached.
+    ALWAYS_INLINE bool Account(size_t bytes);
+
+    void GrowLimitIfNeeded();
+    void ResetAndAdvanceEpoch();
+
+    size_t epoch() const { return epoch_.load(std::memory_order_relaxed); }
+    size_t size() const {
+      return current_size_.load(std::memory_order_relaxed);
+    }
+    size_t last_size() const { return last_size_; }
+
+   private:
+    static constexpr size_t kQuarantineSizeMinLimit = 16 * 1024 * 1024;
+    static constexpr double kQuarantineSizeGrowingFactor = 1.1;
+
+    std::atomic<size_t> current_size_{0u};
+    std::atomic<size_t> size_limit_{kQuarantineSizeMinLimit};
+    std::atomic<size_t> epoch_{0u};
+    size_t last_size_ = 0;
+  };
+
+  enum class TaskType { kNonBlocking, kBlockingForTesting };
+  void ScheduleTask(TaskType);
+
+  Root* root_;
+  QuarantineData quarantine_data_;
+  std::atomic<bool> in_progress_{false};
+};
+
+template <bool thread_safe>
+constexpr size_t PCScan<thread_safe>::QuarantineData::kQuarantineSizeMinLimit;
+template <bool thread_safe>
+constexpr double
+    PCScan<thread_safe>::QuarantineData::kQuarantineSizeGrowingFactor;
+
+template <bool thread_safe>
+bool PCScan<thread_safe>::QuarantineData::Account(size_t size) {
+  size_t size_before = current_size_.fetch_add(size, std::memory_order_relaxed);
+  return size_before + size > size_limit_.load(std::memory_order_relaxed);
+}
+
+template <bool thread_safe>
+void PCScan<thread_safe>::QuarantineData::ResetAndAdvanceEpoch() {
+  last_size_ = current_size_.exchange(0, std::memory_order_relaxed);
+  epoch_.fetch_add(1, std::memory_order_relaxed);
+}
+
+template <bool thread_safe>
+void PCScan<thread_safe>::QuarantineData::GrowLimitIfNeeded() {
+  size_limit_.store(
+      std::max(
+          kQuarantineSizeMinLimit,
+          static_cast<size_t>(kQuarantineSizeGrowingFactor *
+                              current_size_.load(std::memory_order_relaxed))),
+      std::memory_order_relaxed);
+}
+
+template <bool thread_safe>
+ALWAYS_INLINE void PCScan<thread_safe>::MoveToQuarantine(void* ptr,
+                                                         Page* page) {
+  PA_DCHECK(!page->bucket->is_direct_mapped());
+
+  QuarantineBitmapFromPointer(QuarantineBitmapType::kMutator,
+                              quarantine_data_.epoch(), ptr)
+      ->SetBit(reinterpret_cast<uintptr_t>(ptr));
+
+  const bool is_limit_reached =
+      quarantine_data_.Account(page->bucket->slot_size);
+  if (is_limit_reached) {
+    // Post a background task to not block the current thread.
+    ScheduleTask(TaskType::kNonBlocking);
+  }
+}
+
+}  // namespace internal
+}  // namespace base
+
+#endif  // BASE_ALLOCATOR_PARTITION_ALLOCATOR_PCSCAN_H_
diff --git a/base/allocator/partition_allocator/pcscan_unittest.cc b/base/allocator/partition_allocator/pcscan_unittest.cc
new file mode 100644
index 0000000..f76ca22
--- /dev/null
+++ b/base/allocator/partition_allocator/pcscan_unittest.cc
@@ -0,0 +1,245 @@
+// Copyright 2020 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.
+
+#if !defined(MEMORY_TOOL_REPLACES_ALLOCATOR)
+
+#include "base/allocator/partition_allocator/pcscan.h"
+
+#include "base/allocator/partition_allocator/partition_alloc.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace base {
+namespace internal {
+
+class PCScanTest : public testing::Test {
+ public:
+  PCScanTest() {
+    PartitionAllocGlobalInit([](size_t) { LOG(FATAL) << "Out of memory"; });
+    allocator_.init({PartitionOptions::Alignment::kRegular,
+                     PartitionOptions::ThreadCache::kDisabled,
+                     PartitionOptions::PCScan::kEnabled});
+  }
+  ~PCScanTest() override {
+    allocator_.root()->PurgeMemory(PartitionPurgeDecommitEmptyPages |
+                                   PartitionPurgeDiscardUnusedSystemPages);
+    PartitionAllocGlobalUninitForTesting();
+  }
+
+  void RunPCScan() {
+    root().pcscan->ScheduleTask(
+        PCScan<ThreadSafe>::TaskType::kBlockingForTesting);
+  }
+
+  bool IsInQuarantine(void* ptr) const {
+    return QuarantineBitmapFromPointer(QuarantineBitmapType::kMutator,
+                                       root().pcscan->quarantine_data_.epoch(),
+                                       ptr)
+        ->CheckBit(reinterpret_cast<uintptr_t>(ptr));
+  }
+
+  ThreadSafePartitionRoot& root() { return *allocator_.root(); }
+  const ThreadSafePartitionRoot& root() const { return *allocator_.root(); }
+
+ private:
+  PartitionAllocator<ThreadSafe> allocator_;
+};
+
+namespace {
+
+using Page = ThreadSafePartitionRoot::Page;
+
+struct FullPageAllocation {
+  Page* page;
+  void* first;
+  void* last;
+};
+
+// Assumes heap is purged.
+FullPageAllocation GetFullPage(ThreadSafePartitionRoot& root,
+                               size_t object_size) {
+  CHECK_EQ(0u, root.total_size_of_committed_pages_for_testing());
+
+  const size_t size_with_extra = PartitionSizeAdjustAdd(true, object_size);
+  const size_t bucket_index = root.SizeToBucketIndex(size_with_extra);
+  ThreadSafePartitionRoot::Bucket& bucket = root.buckets[bucket_index];
+  const size_t num_slots = (bucket.get_bytes_per_span()) / bucket.slot_size;
+
+  void* first = nullptr;
+  void* last = nullptr;
+  for (size_t i = 0; i < num_slots; ++i) {
+    void* ptr = root.AllocFlagsNoHooks(0, object_size);
+    EXPECT_TRUE(ptr);
+    if (i == 0)
+      first = PartitionPointerAdjustSubtract(true, ptr);
+    else if (i == num_slots - 1)
+      last = PartitionPointerAdjustSubtract(true, ptr);
+  }
+
+  EXPECT_EQ(ThreadSafePartitionRoot::Page::FromPointer(first),
+            ThreadSafePartitionRoot::Page::FromPointer(last));
+  if (bucket.num_system_pages_per_slot_span == NumSystemPagesPerPartitionPage())
+    EXPECT_EQ(reinterpret_cast<size_t>(first) & PartitionPageBaseMask(),
+              reinterpret_cast<size_t>(last) & PartitionPageBaseMask());
+  EXPECT_EQ(num_slots,
+            static_cast<size_t>(bucket.active_pages_head->num_allocated_slots));
+  EXPECT_EQ(nullptr, bucket.active_pages_head->freelist_head);
+  EXPECT_TRUE(bucket.active_pages_head);
+  EXPECT_TRUE(bucket.active_pages_head != Page::get_sentinel_page());
+
+  return {bucket.active_pages_head, PartitionPointerAdjustAdd(true, first),
+          PartitionPointerAdjustAdd(true, last)};
+}
+
+bool IsInFreeList(void* object) {
+  auto* page = Page::FromPointerNoAlignmentCheck(object);
+  for (auto* entry = page->freelist_head; entry;
+       entry = EncodedPartitionFreelistEntry::Decode(entry->next)) {
+    if (entry == object)
+      return true;
+  }
+  return false;
+}
+
+struct ListBase {
+  ListBase* next = nullptr;
+};
+
+template <size_t Size>
+struct List final : ListBase {
+  char buffer[Size];
+
+  static List* Create(ThreadSafePartitionRoot& root, ListBase* next = nullptr) {
+    auto* list = static_cast<List*>(root.Alloc(sizeof(List), nullptr));
+    list->next = next;
+    return list;
+  }
+
+  static void Destroy(ThreadSafePartitionRoot& root, List* list) {
+    root.Free(list);
+  }
+};
+
+}  // namespace
+
+TEST_F(PCScanTest, ArbitraryObjectInQuarantine) {
+  using ListType = List<8>;
+
+  auto* obj1 = ListType::Create(root());
+  auto* obj2 = ListType::Create(root());
+  EXPECT_FALSE(IsInQuarantine(obj1));
+  EXPECT_FALSE(IsInQuarantine(obj2));
+
+  ListType::Destroy(root(), obj2);
+  EXPECT_FALSE(IsInQuarantine(obj1));
+  EXPECT_TRUE(IsInQuarantine(obj2));
+}
+
+TEST_F(PCScanTest, FirstObjectInQuarantine) {
+  static constexpr size_t kAllocationSize = 16;
+
+  FullPageAllocation full_page = GetFullPage(root(), kAllocationSize);
+  EXPECT_FALSE(IsInQuarantine(full_page.first));
+
+  root().FreeNoHooks(full_page.first);
+  EXPECT_TRUE(IsInQuarantine(full_page.first));
+}
+
+TEST_F(PCScanTest, LastObjectInQuarantine) {
+  static constexpr size_t kAllocationSize = 16;
+
+  FullPageAllocation full_page = GetFullPage(root(), kAllocationSize);
+  EXPECT_FALSE(IsInQuarantine(full_page.last));
+
+  root().FreeNoHooks(full_page.last);
+  EXPECT_TRUE(IsInQuarantine(full_page.last));
+}
+
+namespace {
+
+template <typename SourceList, typename ValueList>
+void TestDanglingReference(PCScanTest& test,
+                           SourceList* source,
+                           ValueList* value) {
+  CHECK_EQ(value, source->next);
+  auto& root = test.root();
+  {
+    // Free |value| and leave the dangling reference in |source|.
+    ValueList::Destroy(root, value);
+    // Check that |value| is in the quarantine now.
+    EXPECT_TRUE(test.IsInQuarantine(value));
+    // Run PCScan.
+    test.RunPCScan();
+    // Check that the object is still quarantined since it's referenced by
+    // |from|.
+    EXPECT_TRUE(test.IsInQuarantine(value));
+  }
+  {
+    // Get rid of the dangling reference.
+    source->next = nullptr;
+    // Run PCScan again.
+    test.RunPCScan();
+    // Check that the object is no longer in the quarantine.
+    EXPECT_FALSE(test.IsInQuarantine(value));
+    // Check that the object is in the freelist now.
+    EXPECT_TRUE(IsInFreeList(PartitionPointerAdjustSubtract(true, value)));
+  }
+}
+
+}  // namespace
+
+TEST_F(PCScanTest, DanglingReferenceSameBucket) {
+  using SourceList = List<8>;
+  using ValueList = SourceList;
+
+  // Create two objects, where |source| references |value|.
+  auto* value = ValueList::Create(root(), nullptr);
+  auto* source = SourceList::Create(root(), value);
+
+  TestDanglingReference(*this, source, value);
+}
+
+TEST_F(PCScanTest, DanglingReferenceDifferentBuckets) {
+  using SourceList = List<8>;
+  using ValueList = List<128>;
+
+  // Create two objects, where |source| references |value|.
+  auto* value = ValueList::Create(root(), nullptr);
+  auto* source = SourceList::Create(root(), value);
+
+  TestDanglingReference(*this, source, value);
+}
+
+TEST_F(PCScanTest, DanglingReferenceSameSlotSpanButDifferentPages) {
+  using SourceList = List<8>;
+  using ValueList = SourceList;
+
+  static const size_t kObjectSizeForSlotSpanConsistingOfMultiplePartitionPages =
+      static_cast<size_t>(PartitionPageSize() * 0.75);
+
+  FullPageAllocation full_page = GetFullPage(
+      root(),
+      PartitionSizeAdjustSubtract(
+          true, kObjectSizeForSlotSpanConsistingOfMultiplePartitionPages));
+
+  // Assert that the first and the last objects are in the same slot span but on
+  // different partition pages.
+  ASSERT_EQ(ThreadSafePartitionRoot::Page::FromPointerNoAlignmentCheck(
+                full_page.first),
+            ThreadSafePartitionRoot::Page::FromPointerNoAlignmentCheck(
+                full_page.last));
+  ASSERT_NE(reinterpret_cast<size_t>(full_page.first) & PartitionPageBaseMask(),
+            reinterpret_cast<size_t>(full_page.last) & PartitionPageBaseMask());
+
+  // Create two objects, on different partition pages.
+  auto* value = new (full_page.first) ValueList;
+  auto* source = new (full_page.last) SourceList;
+  source->next = value;
+
+  TestDanglingReference(*this, source, value);
+}
+
+}  // namespace internal
+}  // namespace base
+
+#endif  // defined(MEMORY_TOOL_REPLACES_ALLOCATOR)
diff --git a/base/android/java/src/org/chromium/base/RadioUtils.java b/base/android/java/src/org/chromium/base/RadioUtils.java
new file mode 100644
index 0000000..723fa954
--- /dev/null
+++ b/base/android/java/src/org/chromium/base/RadioUtils.java
@@ -0,0 +1,69 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.base;
+
+import android.annotation.TargetApi;
+import android.content.Context;
+import android.net.ConnectivityManager;
+import android.net.Network;
+import android.net.NetworkCapabilities;
+import android.os.Build;
+import android.telephony.SignalStrength;
+import android.telephony.TelephonyManager;
+
+import org.chromium.base.annotations.CalledByNative;
+import org.chromium.base.annotations.JNINamespace;
+
+/**
+ * Exposes radio related information about the current device.
+ */
+@JNINamespace("base::android")
+public class RadioUtils {
+    private RadioUtils() {}
+
+    /**
+     * Return whether the current SDK supports necessary functions.
+     * @return True or false.
+     */
+    @CalledByNative
+    private static boolean isSupported() {
+        return Build.VERSION.SDK_INT >= Build.VERSION_CODES.P;
+    }
+
+    /**
+     * Return whether the device is currently connected to a wifi network.
+     * @return True or false.
+     */
+    @CalledByNative
+    @TargetApi(Build.VERSION_CODES.P)
+    private static boolean isWifiConnected() {
+        assert isSupported();
+        ConnectivityManager connectivityManager =
+                (ConnectivityManager) ContextUtils.getApplicationContext().getSystemService(
+                        Context.CONNECTIVITY_SERVICE);
+        Network network = connectivityManager.getActiveNetwork();
+        if (network == null) return false;
+        NetworkCapabilities networkCapabilities =
+                connectivityManager.getNetworkCapabilities(network);
+        if (networkCapabilities == null) return false;
+        return networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI);
+    }
+
+    /**
+     * Return current cell signal level.
+     * @return Signal level from 0 (no signal) to 4 (good signal).
+     */
+    @CalledByNative
+    @TargetApi(Build.VERSION_CODES.P)
+    private static int getCellSignalLevel() {
+        assert isSupported();
+        TelephonyManager telephonyManager =
+                (TelephonyManager) ContextUtils.getApplicationContext().getSystemService(
+                        Context.TELEPHONY_SERVICE);
+        SignalStrength signalStrength = telephonyManager.getSignalStrength();
+        if (signalStrength == null) return -1;
+        return signalStrength.getLevel();
+    }
+}
diff --git a/base/android/radio_utils.cc b/base/android/radio_utils.cc
new file mode 100644
index 0000000..22d177d
--- /dev/null
+++ b/base/android/radio_utils.cc
@@ -0,0 +1,33 @@
+// Copyright 2020 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 "base/android/radio_utils.h"
+
+#include "base/base_jni_headers/RadioUtils_jni.h"
+
+namespace base {
+namespace android {
+
+bool RadioUtils::IsSupported() {
+  JNIEnv* env = AttachCurrentThread();
+  return Java_RadioUtils_isSupported(env);
+}
+
+bool RadioUtils::IsWifiConnected() {
+  JNIEnv* env = AttachCurrentThread();
+  return Java_RadioUtils_isWifiConnected(env);
+}
+
+Optional<RadioSignalLevel> RadioUtils::GetCellSignalLevel() {
+  JNIEnv* env = AttachCurrentThread();
+  int signal_level = Java_RadioUtils_getCellSignalLevel(env);
+  if (signal_level < 0) {
+    return nullopt;
+  } else {
+    return static_cast<RadioSignalLevel>(signal_level);
+  }
+}
+
+}  // namespace android
+}  // namespace base
diff --git a/base/android/radio_utils.h b/base/android/radio_utils.h
new file mode 100644
index 0000000..9980d00
--- /dev/null
+++ b/base/android/radio_utils.h
@@ -0,0 +1,36 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef BASE_ANDROID_RADIO_UTILS_H_
+#define BASE_ANDROID_RADIO_UTILS_H_
+
+#include "base/android/jni_android.h"
+#include "base/optional.h"
+
+namespace base {
+namespace android {
+
+// These values are persisted to logs. Entries should not be renumbered and
+// numeric values should never be reused. Keep in sync with RadioSignalLevel
+// in //tools/metrics/histograms/enums.xml.
+enum class RadioSignalLevel {
+  kNoneOrUnknown = 0,
+  kPoor = 1,
+  kModerate = 2,
+  kGood = 3,
+  kGreat = 4,
+  kMaxValue = kGreat,
+};
+
+class BASE_EXPORT RadioUtils {
+ public:
+  static bool IsSupported();
+  static bool IsWifiConnected();
+  static Optional<RadioSignalLevel> GetCellSignalLevel();
+};
+
+}  // namespace android
+}  // namespace base
+
+#endif  // BASE_ANDROID_RADIO_UTILS_H_
diff --git a/base/trace_event/builtin_categories.h b/base/trace_event/builtin_categories.h
index 97830615..7fe136d 100644
--- a/base/trace_event/builtin_categories.h
+++ b/base/trace_event/builtin_categories.h
@@ -115,6 +115,7 @@
   X("omnibox")                                                           \
   X("oobe")                                                              \
   X("ozone")                                                             \
+  X("partition_alloc")                                                   \
   X("passwords")                                                         \
   X("p2p")                                                               \
   X("page-serialization")                                                \
diff --git a/base/tracing/protos/chrome_track_event.proto b/base/tracing/protos/chrome_track_event.proto
index 31cd53a..ad5187f 100644
--- a/base/tracing/protos/chrome_track_event.proto
+++ b/base/tracing/protos/chrome_track_event.proto
@@ -4,7 +4,7 @@
 
 syntax = "proto2";
 
-import "third_party/perfetto/protos/perfetto/trace/track_event/track_event.proto";
+import "protos/perfetto/trace/track_event/track_event.proto";
 
 package perfetto.protos;
 
diff --git a/build/fuchsia/linux.sdk.sha1 b/build/fuchsia/linux.sdk.sha1
index 872853c..7831db06 100644
--- a/build/fuchsia/linux.sdk.sha1
+++ b/build/fuchsia/linux.sdk.sha1
@@ -1 +1 @@
-0.20201008.4.1
+0.20201009.1.1
diff --git a/build/fuchsia/mac.sdk.sha1 b/build/fuchsia/mac.sdk.sha1
index 872853c..7831db06 100644
--- a/build/fuchsia/mac.sdk.sha1
+++ b/build/fuchsia/mac.sdk.sha1
@@ -1 +1 @@
-0.20201008.4.1
+0.20201009.1.1
diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn
index 1f36f3f..238060d0 100644
--- a/chrome/android/BUILD.gn
+++ b/chrome/android/BUILD.gn
@@ -830,7 +830,9 @@
     "//chrome/browser/user_education:java",
     "//chrome/browser/util:java",
     "//chrome/browser/version:java",
+    "//chrome/browser/video_tutorials:factory_java",
     "//chrome/browser/video_tutorials:java",
+    "//chrome/browser/video_tutorials:test_support_java",
     "//chrome/browser/video_tutorials/internal:junit",
     "//chrome/browser/xsurface:java",
     "//chrome/test/android:chrome_java_test_support",
diff --git a/chrome/android/chrome_junit_test_java_sources.gni b/chrome/android/chrome_junit_test_java_sources.gni
index b5c5b81..fe8d441 100644
--- a/chrome/android/chrome_junit_test_java_sources.gni
+++ b/chrome/android/chrome_junit_test_java_sources.gni
@@ -8,6 +8,7 @@
   "junit/src/org/chromium/chrome/browser/ShortcutHelperTest.java",
   "junit/src/org/chromium/chrome/browser/about_settings/AboutSettingsBridgeTest.java",
   "junit/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateUnitTest.java",
+  "junit/src/org/chromium/chrome/browser/app/video_tutorials/NewTabPageVideoIPHManagerTest.java",
   "junit/src/org/chromium/chrome/browser/autofill/AutofillUiUtilsTest.java",
   "junit/src/org/chromium/chrome/browser/background_sync/BackgroundSyncBackgroundTaskSchedulerTest.java",
   "junit/src/org/chromium/chrome/browser/background_sync/BackgroundSyncBackgroundTaskTest.java",
diff --git a/chrome/android/feed/core/javatests/src/org/chromium/chrome/browser/feed/v1/FeedNewTabPageCardRenderTest.java b/chrome/android/feed/core/javatests/src/org/chromium/chrome/browser/feed/v1/FeedNewTabPageCardRenderTest.java
index a2ff4a80..d476a7a2 100644
--- a/chrome/android/feed/core/javatests/src/org/chromium/chrome/browser/feed/v1/FeedNewTabPageCardRenderTest.java
+++ b/chrome/android/feed/core/javatests/src/org/chromium/chrome/browser/feed/v1/FeedNewTabPageCardRenderTest.java
@@ -58,7 +58,8 @@
 @Features.EnableFeatures({ChromeFeatureList.INTEREST_FEED_CONTENT_SUGGESTIONS,
     ChromeFeatureList.OMNIBOX_SEARCH_ENGINE_LOGO})
 @Features.DisableFeatures({ChromeFeatureList.REPORT_FEED_USER_ACTIONS,
-    ChromeFeatureList.QUERY_TILES, ChromeFeatureList.INTEREST_FEED_V2})
+    ChromeFeatureList.QUERY_TILES, ChromeFeatureList.VIDEO_TUTORIALS,
+    ChromeFeatureList.INTEREST_FEED_V2})
 public class FeedNewTabPageCardRenderTest {
     // clang-format on
     private static final String TEST_FEED_DATA_BASE_PATH = "/chrome/test/data/android/feed/";
diff --git a/chrome/android/java/res/drawable/ic_sync_off_48dp.xml b/chrome/android/java/res/drawable/ic_sync_off_48dp.xml
index 36b6318b..3aebe05 100644
--- a/chrome/android/java/res/drawable/ic_sync_off_48dp.xml
+++ b/chrome/android/java/res/drawable/ic_sync_off_48dp.xml
@@ -13,7 +13,7 @@
 
     <path
         android:pathData="M20,30.5C25.799,30.5 30.5,25.799 30.5,20C30.5,14.201 25.799,9.5 20,9.5C14.201,9.5 9.5,14.201 9.5,20C9.5,25.799 14.201,30.5 20,30.5Z"
-        android:fillColor="@color/default_icon_color_secondary"/>
+        android:fillColor="@color/modern_grey_500"/>
     <path
         android:pathData="M18.7501,16.4687V15.1625C18.2501,15.2938 17.7813,15.5 17.3563,15.7625L18.2688,16.675C18.4251,16.6 18.5813,16.525 18.7501,16.4687ZM14.2876,15.8812L15.7626,17.3562C15.2813,18.1188 15.0001,19.025 15.0001,20C15.0001,21.3813 15.5688,22.625 16.4751,23.525L15.0001,25H18.7501V21.25L17.3501,22.65C16.6751,21.9687 16.2501,21.0375 16.2501,20C16.2501,19.375 16.4063,18.7875 16.6751,18.2687L21.7251,23.3187C21.5688,23.4 21.4126,23.475 21.2438,23.5312V24.8375C21.7438,24.7062 22.2126,24.5 22.6376,24.2375L24.1126,25.7125L24.9063,24.9188L15.0876,15.0875L14.2876,15.8812ZM25.0001,15H21.2501V18.75L22.6501,17.35C23.3251,18.0313 23.7501,18.9625 23.7501,20C23.7501,20.625 23.5938,21.2125 23.3251,21.7313L24.2376,22.6437C24.7188,21.8812 25.0001,20.975 25.0001,20C25.0001,18.6187 24.4313,17.375 23.5251,16.475L25.0001,15Z"
         android:fillColor="@color/default_bg_color"/>
diff --git a/chrome/android/java/res/values/ids.xml b/chrome/android/java/res/values/ids.xml
index b426dd2..e6f7ade3 100644
--- a/chrome/android/java/res/values/ids.xml
+++ b/chrome/android/java/res/values/ids.xml
@@ -24,11 +24,6 @@
     <item type="id" name="edit_group_name" />
 
     <!-- InfoBar constants -->
-    <item type="id" name="infobar_extra_check" />
-    <item type="id" name="permission_infobar_persist_toggle" />
-    <item type="id" name="translate_infobar_always_toggle" />
-    <item type="id" name="translate_infobar_source_spinner" />
-    <item type="id" name="translate_infobar_target_spinner" />
     <item type="id" name="subresource_filter_infobar_toggle" />
 
     <!-- Media playback notification -->
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/video_tutorials/NewTabPageVideoIPHManager.java b/chrome/android/java/src/org/chromium/chrome/browser/app/video_tutorials/NewTabPageVideoIPHManager.java
index d71bea6..b58f12bb 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/app/video_tutorials/NewTabPageVideoIPHManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/app/video_tutorials/NewTabPageVideoIPHManager.java
@@ -9,6 +9,8 @@
 import android.os.Handler;
 import android.view.ViewStub;
 
+import androidx.annotation.VisibleForTesting;
+
 import org.chromium.base.Callback;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.feature_engagement.TrackerFactory;
@@ -58,14 +60,10 @@
 
         mContext = viewStub.getContext();
         mTracker = TrackerFactory.getTrackerForProfile(profile);
-        ImageFetcher imageFetcher =
-                ImageFetcherFactory.createImageFetcher(ImageFetcherConfig.IN_MEMORY_WITH_DISK_CACHE,
-                        profile, GlobalDiscardableReferencePool.getReferencePool());
         Callback<Tutorial> clickListener = this::onClickIPH;
         Callback<Tutorial> dismissListener = this::onDismissIPH;
-        mVideoIPHCoordinator = VideoTutorialServiceFactory.createVideoIPHCoordinator(
-                viewStub, imageFetcher, clickListener, dismissListener);
-
+        mVideoIPHCoordinator = createVideoIPHCoordinator(
+                viewStub, createImageFetcher(profile), clickListener, dismissListener);
         mVideoTutorialService = VideoTutorialServiceFactory.getForProfile(profile);
         mVideoTutorialService.getTutorials(this::onFetchTutorials);
     }
@@ -101,7 +99,7 @@
         if (tutorial.featureType == FeatureType.SUMMARY) {
             launchTutorialListActivity();
         } else {
-            VideoPlayerActivity.playVideoTutorial(mContext, tutorial);
+            launchVideoPlayer(tutorial);
         }
 
         mHandler.postDelayed(mVideoIPHCoordinator::hideVideoIPH, CARD_HIDE_ANIMATION_DURATION_MS);
@@ -115,15 +113,35 @@
     }
 
     private void addSyntheticSummaryTutorial(List<Tutorial> tutorials) {
-        Tutorial summary = new Tutorial(FeatureType.INVALID,
+        Tutorial summary = new Tutorial(FeatureType.SUMMARY,
                 mContext.getString(R.string.video_tutorials_card_all_videos), null, null, null,
                 null, 0);
         tutorials.add(summary);
     }
 
-    private void launchTutorialListActivity() {
+    @VisibleForTesting
+    protected void launchVideoPlayer(Tutorial tutorial) {
+        VideoPlayerActivity.playVideoTutorial(mContext, tutorial);
+    }
+
+    @VisibleForTesting
+    protected void launchTutorialListActivity() {
         Intent intent = new Intent();
         intent.setClass(mContext, VideoTutorialListActivity.class);
         mContext.startActivity(intent);
     }
+
+    @VisibleForTesting
+    protected ImageFetcher createImageFetcher(Profile profile) {
+        return ImageFetcherFactory.createImageFetcher(ImageFetcherConfig.IN_MEMORY_WITH_DISK_CACHE,
+                profile, GlobalDiscardableReferencePool.getReferencePool());
+    }
+
+    @VisibleForTesting
+    protected VideoIPHCoordinator createVideoIPHCoordinator(ViewStub viewStub,
+            ImageFetcher imageFetcher, Callback<Tutorial> clickListener,
+            Callback<Tutorial> dismissListener) {
+        return VideoTutorialServiceFactory.createVideoIPHCoordinator(
+                viewStub, imageFetcher, clickListener, dismissListener);
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/base/OWNERS b/chrome/android/java/src/org/chromium/chrome/browser/base/OWNERS
new file mode 100644
index 0000000..1f03c70
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/base/OWNERS
@@ -0,0 +1 @@
+per-file SplitCompatCustomTabsService.java=file://chrome/browser/android/customtabs/OWNERS
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkPersonalizedPromoRenderTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkPersonalizedPromoRenderTest.java
index 543fa40..8b6cd35a 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkPersonalizedPromoRenderTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkPersonalizedPromoRenderTest.java
@@ -88,8 +88,9 @@
         TestThreadUtils.runOnUiThreadBlocking(
                 ()
                         -> mFakeProfileDataSource.setProfileData(account.name,
-                                new ProfileDataSource.ProfileData(
-                                        account.name, null, "Full Name", "Given Name")));
+                                new ProfileDataSource.ProfileData(account.name,
+                                        mAccountManagerTestRule.createProfileImage(), "Full Name",
+                                        "Given Name")));
     }
 
     @After
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/NewTabPageTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/NewTabPageTest.java
index 25686fa..621504e 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/NewTabPageTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/NewTabPageTest.java
@@ -92,8 +92,9 @@
 @RunWith(ChromeJUnit4ClassRunner.class)
 @CommandLineFlags.
 Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE, "disable-features=IPH_FeedHeaderMenu"})
-@Features.DisableFeatures({ChromeFeatureList.EXPLORE_SITES,
-        ChromeFeatureList.REPORT_FEED_USER_ACTIONS, ChromeFeatureList.QUERY_TILES})
+@Features.
+DisableFeatures({ChromeFeatureList.EXPLORE_SITES, ChromeFeatureList.REPORT_FEED_USER_ACTIONS,
+        ChromeFeatureList.QUERY_TILES, ChromeFeatureList.VIDEO_TUTORIALS})
 public class NewTabPageTest {
     private static final int ARTICLE_SECTION_HEADER_POSITION = 1;
     private static final int SIGNIN_PROMO_POSITION = 2;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/RecentTabsPageTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/RecentTabsPageTest.java
index a500b6b82..9a5fda7d 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/RecentTabsPageTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/RecentTabsPageTest.java
@@ -5,10 +5,6 @@
 package org.chromium.chrome.browser.ntp;
 
 import android.accounts.Account;
-import android.graphics.Bitmap;
-import android.graphics.Canvas;
-import android.graphics.Color;
-import android.graphics.Paint;
 import android.support.test.InstrumentationRegistry;
 import android.view.View;
 
@@ -113,8 +109,9 @@
         TestThreadUtils.runOnUiThreadBlocking(
                 ()
                         -> mFakeProfileDataSource.setProfileData(account.name,
-                                new ProfileDataSource.ProfileData(
-                                        account.name, createAvatar(), "Full Name", "Given Name")));
+                                new ProfileDataSource.ProfileData(account.name,
+                                        mAccountManagerTestRule.createProfileImage(), "Full Name",
+                                        "Given Name")));
         RecentTabsManager.forcePromoStateForTests(
                 RecentTabsManager.PromoState.PROMO_SIGNIN_PERSONALIZED);
         mPage = loadRecentTabsPage();
@@ -129,8 +126,9 @@
         TestThreadUtils.runOnUiThreadBlocking(
                 ()
                         -> mFakeProfileDataSource.setProfileData(account.name,
-                                new ProfileDataSource.ProfileData(
-                                        account.name, createAvatar(), "Full Name", "Given Name")));
+                                new ProfileDataSource.ProfileData(account.name,
+                                        mAccountManagerTestRule.createProfileImage(), "Full Name",
+                                        "Given Name")));
         RecentTabsManager.forcePromoStateForTests(
                 RecentTabsManager.PromoState.PROMO_SYNC_PERSONALIZED);
         mPage = loadRecentTabsPage();
@@ -201,23 +199,4 @@
         Assert.assertTrue(InstrumentationRegistry.getInstrumentation().invokeContextMenuAction(
                 mActivityTestRule.getActivity(), contextMenuItemId, 0));
     }
-
-    /**
-     * TODO(https://crbug.com/1125452): Remove this method and use test only resource.
-     */
-    private Bitmap createAvatar() {
-        final int avatarSize = 40;
-
-        Bitmap result = Bitmap.createBitmap(avatarSize, avatarSize, Bitmap.Config.ARGB_8888);
-        Canvas canvas = new Canvas(result);
-        canvas.drawColor(Color.RED);
-
-        Paint paint = new Paint();
-        paint.setAntiAlias(true);
-
-        paint.setColor(Color.BLUE);
-        canvas.drawCircle(0, 0, avatarSize, paint);
-
-        return result;
-    }
 }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/sync/SyncErrorCardPreferenceTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/sync/SyncErrorCardPreferenceTest.java
index df2db806..5101b38 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/sync/SyncErrorCardPreferenceTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/sync/SyncErrorCardPreferenceTest.java
@@ -101,11 +101,10 @@
         TestThreadUtils.runOnUiThreadBlocking(() -> {
             mFakeProfileSyncService = new FakeProfileSyncService();
             ProfileSyncService.overrideForTests(mFakeProfileSyncService);
-            // TODO(https://crbug.com/1125452): Use test resource for profile avatar instead of
-            // null.
             mFakeProfileDataSource.setProfileData(account.name,
-                    new ProfileDataSource.ProfileData(
-                            account.name, null, "Full Name", "Given Name"));
+                    new ProfileDataSource.ProfileData(account.name,
+                            mAccountManagerTestRule.createProfileImage(), "Full Name",
+                            "Given Name"));
             AndroidSyncSettings.overrideForTests(mAndroidSyncSettingsMock);
             when(mAndroidSyncSettingsMock.isChromeSyncEnabled()).thenReturn(true);
         });
diff --git a/chrome/android/junit/DEPS b/chrome/android/junit/DEPS
index 891bc67..08cbf0e 100644
--- a/chrome/android/junit/DEPS
+++ b/chrome/android/junit/DEPS
@@ -13,6 +13,7 @@
   "+chrome/browser/thumbnail/generator/android/java",
   "+chrome/browser/ui/android/appmenu/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuPropertiesDelegate.java",
   "+chrome/browser/ui/messages/android/java",
+  "+chrome/browser/video_tutorials",
   "+chrome/browser/xsurface/android",
   "+components/autofill/android/java/src/org/chromium/components/autofill",
   "+components/background_task_scheduler/android",
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/app/video_tutorials/NewTabPageVideoIPHManagerTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/app/video_tutorials/NewTabPageVideoIPHManagerTest.java
new file mode 100644
index 0000000..3879798
--- /dev/null
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/app/video_tutorials/NewTabPageVideoIPHManagerTest.java
@@ -0,0 +1,146 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser.app.video_tutorials;
+
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+import android.content.Context;
+import android.view.ViewStub;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.AdditionalAnswers;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+
+import org.chromium.base.Callback;
+import org.chromium.base.metrics.test.ShadowRecordHistogram;
+import org.chromium.base.test.BaseRobolectricTestRunner;
+import org.chromium.chrome.browser.feature_engagement.TrackerFactory;
+import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.image_fetcher.ImageFetcher;
+import org.chromium.chrome.browser.profiles.Profile;
+import org.chromium.chrome.browser.video_tutorials.FeatureType;
+import org.chromium.chrome.browser.video_tutorials.Tutorial;
+import org.chromium.chrome.browser.video_tutorials.VideoTutorialServiceFactory;
+import org.chromium.chrome.browser.video_tutorials.iph.VideoIPHCoordinator;
+import org.chromium.chrome.browser.video_tutorials.test.TestVideoTutorialService;
+import org.chromium.chrome.test.util.browser.Features;
+import org.chromium.components.feature_engagement.Tracker;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Unit tests for {@link NewTabPageVideoIPHManager}.
+ */
+@RunWith(BaseRobolectricTestRunner.class)
+@Features.EnableFeatures(ChromeFeatureList.VIDEO_TUTORIALS)
+public class NewTabPageVideoIPHManagerTest {
+    @Mock
+    private Context mContext;
+    @Mock
+    private ViewStub mViewStub;
+    @Mock
+    private Profile mProfile;
+    @Mock
+    private ImageFetcher mImageFetcher;
+    @Mock
+    private Tracker mTracker;
+    @Mock
+    private VideoIPHCoordinator mVideoIPHCoordinator;
+
+    private TestVideoTutorialService mTestVideoTutorialService;
+    private TestNewTabPageVideoIPHManager mVideoIPHManager;
+    private Callback<Tutorial> mIPHClickListener;
+    private Callback<Tutorial> mIPHDismissListener;
+
+    private class TestNewTabPageVideoIPHManager extends NewTabPageVideoIPHManager {
+        public boolean videoPlayerLaunched;
+        public boolean videoListLaunched;
+
+        public TestNewTabPageVideoIPHManager(ViewStub viewStub, Profile profile) {
+            super(viewStub, profile);
+        }
+
+        @Override
+        protected VideoIPHCoordinator createVideoIPHCoordinator(ViewStub viewStub,
+                ImageFetcher imageFetcher, Callback<Tutorial> clickListener,
+                Callback<Tutorial> dismissListener) {
+            mIPHClickListener = clickListener;
+            mIPHDismissListener = dismissListener;
+            return mVideoIPHCoordinator;
+        }
+
+        @Override
+        protected void launchVideoPlayer(Tutorial tutorial) {
+            videoPlayerLaunched = true;
+        }
+
+        @Override
+        protected void launchTutorialListActivity() {
+            videoListLaunched = true;
+        }
+
+        @Override
+        protected ImageFetcher createImageFetcher(Profile profile) {
+            return mImageFetcher;
+        }
+    }
+
+    @Before
+    public void setUp() {
+        ShadowRecordHistogram.reset();
+        MockitoAnnotations.initMocks(this);
+        Mockito.when(mViewStub.getContext()).thenReturn(mContext);
+
+        Map<String, Boolean> features = new HashMap<>();
+        features.put(ChromeFeatureList.VIDEO_TUTORIALS, true);
+        ChromeFeatureList.setTestFeatures(features);
+
+        mTestVideoTutorialService = new TestVideoTutorialService();
+        VideoTutorialServiceFactory.setVideoTutorialServiceForTesting(mTestVideoTutorialService);
+        Mockito.doAnswer(AdditionalAnswers.answerVoid(
+                                 (Callback<Boolean> callback) -> callback.onResult(true)))
+                .when(mTracker)
+                .addOnInitializedCallback(Mockito.any());
+        TrackerFactory.setTrackerForTests(mTracker);
+    }
+
+    @Test
+    public void testShowFirstEnabledIPH() {
+        // We have already watched the first tutorial, the second one should show up as IPH card.
+        Mockito.when(mTracker.shouldTriggerHelpUI(Mockito.anyString())).thenReturn(false, true);
+        mVideoIPHManager = new TestNewTabPageVideoIPHManager(mViewStub, mProfile);
+        Mockito.verify(mVideoIPHCoordinator)
+                .showVideoIPH(mTestVideoTutorialService.getTestTutorials().get(1));
+
+        // Click on the IPH. video player should be launched.
+        mIPHClickListener.onResult(mTestVideoTutorialService.getTestTutorials().get(1));
+        assertThat(mVideoIPHManager.videoPlayerLaunched, equalTo(true));
+        assertThat(mVideoIPHManager.videoListLaunched, equalTo(false));
+    }
+
+    @Test
+    public void testShowSummaryIPH() {
+        // We have already seen all the tutorials. Now summary card should show up.
+        Mockito.when(mTracker.shouldTriggerHelpUI(Mockito.anyString()))
+                .thenReturn(false, false, false, true);
+        mVideoIPHManager = new TestNewTabPageVideoIPHManager(mViewStub, mProfile);
+
+        ArgumentCaptor<Tutorial> tutorialArgument = ArgumentCaptor.forClass(Tutorial.class);
+        Mockito.verify(mVideoIPHCoordinator).showVideoIPH(tutorialArgument.capture());
+        assertThat(tutorialArgument.getValue().featureType, equalTo(FeatureType.SUMMARY));
+
+        // Click on the IPH. Video list activity should be launched.
+        mIPHClickListener.onResult(tutorialArgument.getValue());
+        assertThat(mVideoIPHManager.videoPlayerLaunched, equalTo(false));
+        assertThat(mVideoIPHManager.videoListLaunched, equalTo(true));
+    }
+}
diff --git a/chrome/android/monochrome/scripts/monochrome_apk_checker_test.py b/chrome/android/monochrome/scripts/monochrome_apk_checker_test.py
index dc37cbd..e284345 100755
--- a/chrome/android/monochrome/scripts/monochrome_apk_checker_test.py
+++ b/chrome/android/monochrome/scripts/monochrome_apk_checker_test.py
@@ -38,8 +38,10 @@
     r'lib/.*/crazy\.libchrome\.so',
     r'lib/.*/crazy\.libchrome\.align',
     r'lib/.*/gdbserver',
-     # Monochrome doesn't have any res directories whose api number is less
-     # than v24.
+    # R.font.accent_font is an alias in internal Chrome.
+    r'res/.*/accent_font.xml',
+    # Monochrome doesn't have any res directories whose api number is less
+    # than v24.
     r'res/.*-v1\d/.*\.xml',
     r'res/.*-v2[0-3]/.*\.xml',
     r'META-INF/.*',
diff --git a/chrome/app/chrome_main.cc b/chrome/app/chrome_main.cc
index 134aeb5..50c08fa7 100644
--- a/chrome/app/chrome_main.cc
+++ b/chrome/app/chrome_main.cc
@@ -23,6 +23,9 @@
 #endif
 
 #if defined(OS_WIN)
+#include <timeapi.h>
+
+#include "base/base_switches.h"
 #include "base/debug/dump_without_crashing.h"
 #include "base/files/file_util.h"
 #include "base/metrics/histogram_functions.h"
@@ -97,6 +100,14 @@
   const base::CommandLine* command_line(base::CommandLine::ForCurrentProcess());
   ALLOW_UNUSED_LOCAL(command_line);
 
+#if defined(OS_WIN)
+  if (base::CommandLine::ForCurrentProcess()->HasSwitch(
+          ::switches::kRaiseTimerFrequency)) {
+    // Raise the timer interrupt frequency and leave it raised.
+    timeBeginPeriod(1);
+  }
+#endif
+
 #if defined(OS_MAC)
   SetUpBundleOverrides();
 #endif
diff --git a/chrome/app/resources/generated_resources_af.xtb b/chrome/app/resources/generated_resources_af.xtb
index d51176f..f23ac2c8 100644
--- a/chrome/app/resources/generated_resources_af.xtb
+++ b/chrome/app/resources/generated_resources_af.xtb
@@ -394,7 +394,6 @@
 <translation id="1442851588227551435">Stel aktiewe Kerberos-kaartjie</translation>
 <translation id="1444628761356461360">Hierdie instelling word deur die toesteleienaar, <ph name="OWNER_EMAIL" />, bestuur.</translation>
 <translation id="144518587530125858">Kon nie "<ph name="IMAGE_PATH" />" vir tema laai nie.</translation>
-<translation id="1445693676523799095">Dit kan 'n rukkie neem</translation>
 <translation id="1451375123200651445">Webbladsy, enkellêer</translation>
 <translation id="1451917004835509682">Voeg persoon onder toesig by</translation>
 <translation id="1454223536435069390">Neem skermkiekie</translation>
@@ -4898,7 +4897,6 @@
 <translation id="6828182567531805778">Voer jou wagfrase in om jou data te sinkroniseer</translation>
 <translation id="682871081149631693">QuickFix</translation>
 <translation id="6828860976882136098">Kon nie outomatiese opdaterings vir alle gebruikers opstel nie (kontroleringuitvoeringfout: <ph name="ERROR_NUMBER" />)</translation>
-<translation id="6829250331733125857">Kry hulp met jou <ph name="DEVICE_TYPE" />.</translation>
 <translation id="682971198310367122">Google se privaatheidbeleid</translation>
 <translation id="6831043979455480757">Vertaal</translation>
 <translation id="683373380308365518">Wissel na 'n slim en veilige blaaier</translation>
diff --git a/chrome/app/resources/generated_resources_am.xtb b/chrome/app/resources/generated_resources_am.xtb
index e4d092d..c9f9093 100644
--- a/chrome/app/resources/generated_resources_am.xtb
+++ b/chrome/app/resources/generated_resources_am.xtb
@@ -394,7 +394,6 @@
 <translation id="1442851588227551435">ገቢር የKerberos ቲኬት ያቀናብሩ</translation>
 <translation id="1444628761356461360">ይህ ቅንብር በመሣሪያው ባለቤት በ <ph name="OWNER_EMAIL" /> ነው የሚቀናበረው።</translation>
 <translation id="144518587530125858">«<ph name="IMAGE_PATH" />»ን ለገጽታ መጫን አልተቻለም።</translation>
-<translation id="1445693676523799095">ይህ ትንሽ ጊዜ ሊወስድ ይችላል</translation>
 <translation id="1451375123200651445">ድረ-ገጽ፣ ነጠላ ፋይል</translation>
 <translation id="1451917004835509682">ቁጥጥር የሚደረግበት ግለሰብን ያክሉ</translation>
 <translation id="1454223536435069390">ቅጽበታዊ ገጽ እይታ አ&amp;ንሳ</translation>
@@ -4894,7 +4893,6 @@
 <translation id="6828182567531805778">ውሂብዎን ለማሳመር የይለፍ ሐረግዎን ያስገቡ</translation>
 <translation id="682871081149631693">QuickFix</translation>
 <translation id="6828860976882136098">ለሁሉም ተጠቃሚዎች የራስ-ሰር ዝማኔዎችን ማዋቀር አልተሳካም (የቅድመ በረራ አፈጻጸም ስህተት፦ <ph name="ERROR_NUMBER" />)</translation>
-<translation id="6829250331733125857">በእርስዎ <ph name="DEVICE_TYPE" /> እገዛ ያግኙ።</translation>
 <translation id="682971198310367122">የGoogle ግላዊነት መመሪያ</translation>
 <translation id="6831043979455480757">መተርጎም</translation>
 <translation id="683373380308365518">ወደ ዘመናዊ እና ደህንነቱ የተጠበቀ አሳሽ ይቀይሩ</translation>
diff --git a/chrome/app/resources/generated_resources_ar.xtb b/chrome/app/resources/generated_resources_ar.xtb
index ab07cc8d..3930d20 100644
--- a/chrome/app/resources/generated_resources_ar.xtb
+++ b/chrome/app/resources/generated_resources_ar.xtb
@@ -394,7 +394,6 @@
 <translation id="1442851588227551435">‏ضبط تذكرة Kerberos النشِطة</translation>
 <translation id="1444628761356461360">يتولى إدارة هذا الإعداد مالك الجهاز، <ph name="OWNER_EMAIL" />.</translation>
 <translation id="144518587530125858">تعذر تحميل '<ph name="IMAGE_PATH" />' للمظهر.</translation>
-<translation id="1445693676523799095">قد يستغرق هذا بعض الوقت.</translation>
 <translation id="1451375123200651445">صفحة ويب، ملف واحد</translation>
 <translation id="1451917004835509682">إضافة شخص خاضع للإشراف</translation>
 <translation id="1454223536435069390">الت&amp;قاط لقطة شاشة</translation>
@@ -4896,7 +4895,6 @@
 <translation id="6828182567531805778">أدخِل عبارة المرور لمزامنة بياناتك.</translation>
 <translation id="682871081149631693">QuickFix</translation>
 <translation id="6828860976882136098">فشل في إعداد التحديثات التلقائية لجميع المستخدمين (خطأ تنفيذ الاختبار المبدئي: <ph name="ERROR_NUMBER" />)</translation>
-<translation id="6829250331733125857">الحصول على مساعدة بشأن <ph name="DEVICE_TYPE" />.</translation>
 <translation id="682971198310367122">‏سياسة خصوصية Google</translation>
 <translation id="6831043979455480757">ترجمة</translation>
 <translation id="683373380308365518">التبديل إلى متصفح ذكي وآمن</translation>
diff --git a/chrome/app/resources/generated_resources_as.xtb b/chrome/app/resources/generated_resources_as.xtb
index 64496d12..9a902ba 100644
--- a/chrome/app/resources/generated_resources_as.xtb
+++ b/chrome/app/resources/generated_resources_as.xtb
@@ -394,7 +394,6 @@
 <translation id="1442851588227551435">সক্ৰিয় Kerberosৰ টিকেট ছেট কৰক</translation>
 <translation id="1444628761356461360">ডিভাইচৰ গৰাকী <ph name="OWNER_EMAIL" />এ এই ছেটিংটো পৰিচালনা কৰে।</translation>
 <translation id="144518587530125858">থীমটোৰ ’<ph name="IMAGE_PATH" />’ ল‘ড কৰিব পৰা নগ‘ল</translation>
-<translation id="1445693676523799095">এইটোৰ বাবে কিছু সময় লাগিব পাৰে</translation>
 <translation id="1451375123200651445">ৱেবপৃষ্ঠা, একক ফাইল</translation>
 <translation id="1451917004835509682">নিৰীক্ষণত থকা ব্যৱহাৰকাৰী যোগ কৰক</translation>
 <translation id="1454223536435069390">স্ক্ৰীণশ্বট ল&amp;ওক</translation>
@@ -4884,7 +4883,6 @@
 <translation id="6828182567531805778">আপোনাৰ ডেটা ছিংক কৰিবলৈ আপোনাৰ পাছফ্ৰেজ দিয়ক</translation>
 <translation id="682871081149631693">QuickFix</translation>
 <translation id="6828860976882136098">সকলো ব্যৱহাৰকাৰীৰ কাৰণে স্বয়ংক্ৰিয় আপডে’ট ছেট আপ কৰিব পৰা নগ’ল (প্ৰিফ্লাইট কার্যকৰী কৰোঁতে হোৱা আসোঁৱাহ: <ph name="ERROR_NUMBER" />)</translation>
-<translation id="6829250331733125857">আপোনাৰ <ph name="DEVICE_TYPE" />ৰ জৰিয়তে সহায় পাওক।</translation>
 <translation id="682971198310367122">Googleৰ গোপনীয়তা নীতি</translation>
 <translation id="6831043979455480757">অনুবাদ কৰক</translation>
 <translation id="683373380308365518">স্মার্ট আৰু সুৰক্ষিত ব্ৰাউজাৰ ব্যৱহাৰ কৰক</translation>
diff --git a/chrome/app/resources/generated_resources_az.xtb b/chrome/app/resources/generated_resources_az.xtb
index ae3f6f67..36ddd54f1 100644
--- a/chrome/app/resources/generated_resources_az.xtb
+++ b/chrome/app/resources/generated_resources_az.xtb
@@ -392,7 +392,6 @@
 <translation id="1442851588227551435">Aktiv Kerberos biletini ayarlayın</translation>
 <translation id="1444628761356461360">Bu ayar cihaz sahibi tərəfindən idarə olunur, <ph name="OWNER_EMAIL" />.</translation>
 <translation id="144518587530125858">Tema üçün '<ph name="IMAGE_PATH" />' yüklənə bilmədi.</translation>
-<translation id="1445693676523799095">Bu bir az vaxt çəkə bilər</translation>
 <translation id="1451375123200651445">Veb səhifə, Tək Fayl</translation>
 <translation id="1451917004835509682">Nəzarət olunan şəxs əlavə edin</translation>
 <translation id="1454223536435069390">Skrinşot çəkin</translation>
@@ -4888,7 +4887,6 @@
 <translation id="6828182567531805778">Datanızı sinxronizasiya etmək üçün parol ifadəsini daxil edin</translation>
 <translation id="682871081149631693">QuickFix</translation>
 <translation id="6828860976882136098">Bütün İstifadəçilər üçün avtomatik güncəlləmələri quraşdırmaq uğursuz oldu (ön yoxlamanın icrası xətası: <ph name="ERROR_NUMBER" />)</translation>
-<translation id="6829250331733125857">Yardım almaq Sizin <ph name="DEVICE_TYPE" /> .</translation>
 <translation id="682971198310367122">Google məxfilik siyasəti</translation>
 <translation id="6831043979455480757">Tərcümə et</translation>
 <translation id="683373380308365518">Ağıllı və təhlükəsiz brauzerə keçin</translation>
diff --git a/chrome/app/resources/generated_resources_be.xtb b/chrome/app/resources/generated_resources_be.xtb
index 3c49096..5dc1d67 100644
--- a/chrome/app/resources/generated_resources_be.xtb
+++ b/chrome/app/resources/generated_resources_be.xtb
@@ -394,7 +394,6 @@
 <translation id="1442851588227551435">Задаць актыўны білет Kerberos</translation>
 <translation id="1444628761356461360">Гэта налада кіруецца ўладальнікам прылады – <ph name="OWNER_EMAIL" />.</translation>
 <translation id="144518587530125858">Не ўдалося загрузіць відарыс "<ph name="IMAGE_PATH" />" для тэмы.</translation>
-<translation id="1445693676523799095">Гэта можа заняць некаторы час</translation>
 <translation id="1451375123200651445">Вэб-старонка адным файлам</translation>
 <translation id="1451917004835509682">Дадаць падкантрольнага карыстальніка</translation>
 <translation id="1454223536435069390">З&amp;рабіць здымак экрана</translation>
@@ -4896,7 +4895,6 @@
 <translation id="6828182567531805778">Для сінхранізацыі даных увядзіце фразу-пароль</translation>
 <translation id="682871081149631693">QuickFix</translation>
 <translation id="6828860976882136098">Не ўдалося задаць аўтаматычныя абнаўленні для ўсіх карыстальнікаў (памылка падрыхтоўкі выканання: <ph name="ERROR_NUMBER" />)</translation>
-<translation id="6829250331733125857">Дапамога па <ph name="DEVICE_TYPE" />.</translation>
 <translation id="682971198310367122">Палітыка прыватнасці Google</translation>
 <translation id="6831043979455480757">Перакласці</translation>
 <translation id="683373380308365518">Пераходзьце на разумны і бяспечны браўзер</translation>
diff --git a/chrome/app/resources/generated_resources_bg.xtb b/chrome/app/resources/generated_resources_bg.xtb
index 6daaac49..fd91fc47 100644
--- a/chrome/app/resources/generated_resources_bg.xtb
+++ b/chrome/app/resources/generated_resources_bg.xtb
@@ -394,7 +394,6 @@
 <translation id="1442851588227551435">Задаване на активен пропуск за Kerberos</translation>
 <translation id="1444628761356461360">Тази настройка се управлява от собственика на устройството – <ph name="OWNER_EMAIL" />.</translation>
 <translation id="144518587530125858">Не можа да се зареди „<ph name="IMAGE_PATH" />“ за темата.</translation>
-<translation id="1445693676523799095">Това може да отнеме известно време</translation>
 <translation id="1451375123200651445">Уеб страница, един файл</translation>
 <translation id="1451917004835509682">Добавяне на контролиран човек</translation>
 <translation id="1454223536435069390">Създаване на &amp;екранна снимка</translation>
@@ -4897,7 +4896,6 @@
 <translation id="6828182567531805778">Въведете своя пропуск, за да синхронизирате данните си</translation>
 <translation id="682871081149631693">QuickFix</translation>
 <translation id="6828860976882136098">Настройването на автоматични актуализации за всички потребители не бе успешно (грешка при изпълнението на предстартовия процес: <ph name="ERROR_NUMBER" />)</translation>
-<translation id="6829250331733125857">Получете помощ за устройството си <ph name="DEVICE_TYPE" />.</translation>
 <translation id="682971198310367122">Декларация за поверителност на Google</translation>
 <translation id="6831043979455480757">Превод</translation>
 <translation id="683373380308365518">Преминете към интелигентен и сигурен браузър</translation>
diff --git a/chrome/app/resources/generated_resources_bn.xtb b/chrome/app/resources/generated_resources_bn.xtb
index 03f8e2a..950e58e6 100644
--- a/chrome/app/resources/generated_resources_bn.xtb
+++ b/chrome/app/resources/generated_resources_bn.xtb
@@ -394,7 +394,6 @@
 <translation id="1442851588227551435">অ্যাক্টিভ Kerberos টিকিট সেট করুন</translation>
 <translation id="1444628761356461360">এই সেটিংটি ডিভাইসের মালিকের দ্বারা <ph name="OWNER_EMAIL" /> পরিচালিত হয়৷</translation>
 <translation id="144518587530125858">থিমের জন্য '<ph name="IMAGE_PATH" />' লোড করা যায়নি৷</translation>
-<translation id="1445693676523799095">এর জন্য কিছু সময় লাগতে পারে</translation>
 <translation id="1451375123200651445">Webpage, Single File</translation>
 <translation id="1451917004835509682">তত্ত্বাবধানে থাকা ব্যক্তিকে যোগ করুন</translation>
 <translation id="1454223536435069390">স্ক্রিনশট নিন</translation>
@@ -4897,7 +4896,6 @@
 <translation id="6828182567531805778">আপনার ডেটা সিঙ্ক করতে পাসফ্রেজ লিখুন</translation>
 <translation id="682871081149631693">QuickFix</translation>
 <translation id="6828860976882136098">সকল ব্যবহারকারীর জন্য স্বয়ংক্রিয় আপডেট সেট-আপ করতে ব্যর্থ হয়েছে (ফ্লাইটপূর্ব সম্পাদন ত্রুটি: <ph name="ERROR_NUMBER" />)</translation>
-<translation id="6829250331733125857">আপনার <ph name="DEVICE_TYPE" />-এর মাধ্যমে সাহায্য পান।</translation>
 <translation id="682971198310367122">Google এর গোপনীয়তা নীতি</translation>
 <translation id="6831043979455480757">অনুবাদ</translation>
 <translation id="683373380308365518">একটি স্মার্ট এবং সুরক্ষিত ব্রাউজারে স্যুইচ করুন</translation>
diff --git a/chrome/app/resources/generated_resources_bs.xtb b/chrome/app/resources/generated_resources_bs.xtb
index 368e616..cd9e97f 100644
--- a/chrome/app/resources/generated_resources_bs.xtb
+++ b/chrome/app/resources/generated_resources_bs.xtb
@@ -394,7 +394,6 @@
 <translation id="1442851588227551435">Postavi aktivni tiket za Kerberos</translation>
 <translation id="1444628761356461360">Ovom postavkom upravlja vlasnik uređaja, <ph name="OWNER_EMAIL" />.</translation>
 <translation id="144518587530125858">Slika "<ph name="IMAGE_PATH" />" nije učitana kao tema.</translation>
-<translation id="1445693676523799095">Ovo može potrajati</translation>
 <translation id="1451375123200651445">Web stranica, jedan fajl</translation>
 <translation id="1451917004835509682">Dodaj osobu pod nadzorom</translation>
 <translation id="1454223536435069390">Nap&amp;ravi snimak ekrana</translation>
@@ -4897,7 +4896,6 @@
 <translation id="6828182567531805778">Unesite pristupni izraz za sinhroniziranje svojih podataka</translation>
 <translation id="682871081149631693">QuickFix</translation>
 <translation id="6828860976882136098">Postavljanje automatskog ažuriranja za sve korisnike nije uspjelo (greška prilikom izvršenja pripremnih radnji: <ph name="ERROR_NUMBER" />)</translation>
-<translation id="6829250331733125857">Dobijte pomoć za <ph name="DEVICE_TYPE" />.</translation>
 <translation id="682971198310367122">Googleova Pravila privatnosti</translation>
 <translation id="6831043979455480757">Prevedi</translation>
 <translation id="683373380308365518">Prijeđite na pametan i siguran preglednik</translation>
diff --git a/chrome/app/resources/generated_resources_ca.xtb b/chrome/app/resources/generated_resources_ca.xtb
index e449766..e5d90f46 100644
--- a/chrome/app/resources/generated_resources_ca.xtb
+++ b/chrome/app/resources/generated_resources_ca.xtb
@@ -394,7 +394,6 @@
 <translation id="1442851588227551435">Estableix el tiquet de Kerberos actiu</translation>
 <translation id="1444628761356461360">Aquesta configuració està gestionada pel propietari del dispositiu, <ph name="OWNER_EMAIL" />.</translation>
 <translation id="144518587530125858">No s'ha pogut carregar "<ph name="IMAGE_PATH" />" per al tema.</translation>
-<translation id="1445693676523799095">La configuració pot tardar una estona</translation>
 <translation id="1451375123200651445">Pàgina web, un únic fitxer</translation>
 <translation id="1451917004835509682">Afegeix una persona supervisada</translation>
 <translation id="1454223536435069390">Fes una c&amp;aptura de pantalla</translation>
@@ -4897,7 +4896,6 @@
 <translation id="6828182567531805778">Introdueix la teva frase de contrasenya per sincronitzar les dades</translation>
 <translation id="682871081149631693">QuickFix</translation>
 <translation id="6828860976882136098">No s'han pogut configurar actualitzacions automàtiques per a tots els usuaris (error d'execució preliminar: <ph name="ERROR_NUMBER" />)</translation>
-<translation id="6829250331733125857">Obteniu ajuda per al dispositiu <ph name="DEVICE_TYPE" />.</translation>
 <translation id="682971198310367122">Política de privadesa de Google</translation>
 <translation id="6831043979455480757">Tradueix</translation>
 <translation id="683373380308365518">Canvia a un navegador intel·ligent i segur</translation>
diff --git a/chrome/app/resources/generated_resources_cs.xtb b/chrome/app/resources/generated_resources_cs.xtb
index 31445264..604e3fc 100644
--- a/chrome/app/resources/generated_resources_cs.xtb
+++ b/chrome/app/resources/generated_resources_cs.xtb
@@ -394,7 +394,6 @@
 <translation id="1442851588227551435">Nastavit aktivní lístek Kerberos</translation>
 <translation id="1444628761356461360">Toto nastavení spravuje vlastník zařízení, <ph name="OWNER_EMAIL" />.</translation>
 <translation id="144518587530125858">Pro motiv nelze načíst bitovou kopii „<ph name="IMAGE_PATH" />“.</translation>
-<translation id="1445693676523799095">Může to chvíli trvat</translation>
 <translation id="1451375123200651445">Webová stránka, jeden soubor</translation>
 <translation id="1451917004835509682">Přidat dozorovanou osobu</translation>
 <translation id="1454223536435069390">&amp;Pořídit snímek obrazovky</translation>
@@ -4895,7 +4894,6 @@
 <translation id="6828182567531805778">Chcete-li synchronizovat data, zadejte heslovou frázi</translation>
 <translation id="682871081149631693">QuickFix</translation>
 <translation id="6828860976882136098">Nastavení automatických aktualizací pro všechny uživatele se nezdařilo (chyba při předběžném spuštění: <ph name="ERROR_NUMBER" />)</translation>
-<translation id="6829250331733125857">Získejte nápovědu k zařízení <ph name="DEVICE_TYPE" />.</translation>
 <translation id="682971198310367122">Zásady ochrany soukromí Google</translation>
 <translation id="6831043979455480757">Přeložit</translation>
 <translation id="683373380308365518">Přejděte na chytrý a zabezpečený prohlížeč</translation>
diff --git a/chrome/app/resources/generated_resources_da.xtb b/chrome/app/resources/generated_resources_da.xtb
index 555a532..fc00db8 100644
--- a/chrome/app/resources/generated_resources_da.xtb
+++ b/chrome/app/resources/generated_resources_da.xtb
@@ -394,7 +394,6 @@
 <translation id="1442851588227551435">Angiv aktiv Kerberos-billet</translation>
 <translation id="1444628761356461360">Denne indstilling administreres af enhedsejeren <ph name="OWNER_EMAIL" />.</translation>
 <translation id="144518587530125858">'<ph name="IMAGE_PATH" />' for temaet kunne ikke indlæses.</translation>
-<translation id="1445693676523799095">Dette kan tage lidt tid</translation>
 <translation id="1451375123200651445">Webside, enkelt fil</translation>
 <translation id="1451917004835509682">Tilføj administreret person</translation>
 <translation id="1454223536435069390">T&amp;ag screenshot</translation>
@@ -4898,7 +4897,6 @@
 <translation id="6828182567531805778">Angiv din adgangssætning for at synkronisere dine data</translation>
 <translation id="682871081149631693">QuickFix</translation>
 <translation id="6828860976882136098">Automatiske opdateringer kunne ikke konfigureres for alle brugere (fejl ved forhåndsudførelse: <ph name="ERROR_NUMBER" />)</translation>
-<translation id="6829250331733125857">Få hjælp til din <ph name="DEVICE_TYPE" />.</translation>
 <translation id="682971198310367122">Googles privatlivspolitik</translation>
 <translation id="6831043979455480757">Oversæt</translation>
 <translation id="683373380308365518">Skift til en smart og sikker browser</translation>
diff --git a/chrome/app/resources/generated_resources_de.xtb b/chrome/app/resources/generated_resources_de.xtb
index 064b2f709..c4273d7a 100644
--- a/chrome/app/resources/generated_resources_de.xtb
+++ b/chrome/app/resources/generated_resources_de.xtb
@@ -394,7 +394,6 @@
 <translation id="1442851588227551435">Aktives Kerberos-Ticket festlegen</translation>
 <translation id="1444628761356461360">Diese Einstellung wird vom Geräteinhaber, <ph name="OWNER_EMAIL" />, verwaltet.</translation>
 <translation id="144518587530125858">"<ph name="IMAGE_PATH" />" konnte nicht für das Design geladen werden.</translation>
-<translation id="1445693676523799095">Das kann etwas dauern</translation>
 <translation id="1451375123200651445">Webseite, Einzeldatei</translation>
 <translation id="1451917004835509682">Betreuten Nutzer hinzufügen</translation>
 <translation id="1454223536435069390">Screenshot &amp;erstellen</translation>
@@ -4893,7 +4892,6 @@
 <translation id="6828182567531805778">Geben Sie die Passphrase ein, um Ihre Daten zu synchronisieren</translation>
 <translation id="682871081149631693">QuickFix-Build</translation>
 <translation id="6828860976882136098">Automatische Updates für alle Nutzer konnten nicht eingerichtet werden (Preflight-Ausführungsfehler: <ph name="ERROR_NUMBER" />)</translation>
-<translation id="6829250331733125857">Hilfe zu Ihrem Gerät (<ph name="DEVICE_TYPE" />)</translation>
 <translation id="682971198310367122">Google-Datenschutzerklärung</translation>
 <translation id="6831043979455480757">Übersetzen</translation>
 <translation id="683373380308365518">Steigen Sie auf einen intelligenten und sicheren Browser um</translation>
diff --git a/chrome/app/resources/generated_resources_el.xtb b/chrome/app/resources/generated_resources_el.xtb
index 4187284..d2ddbd2 100644
--- a/chrome/app/resources/generated_resources_el.xtb
+++ b/chrome/app/resources/generated_resources_el.xtb
@@ -394,7 +394,6 @@
 <translation id="1442851588227551435">Ορισμός ενεργού εισιτηρίου Kerberos</translation>
 <translation id="1444628761356461360">Η διαχείριση αυτής της ρύθμισης πραγματοποιείται από τον ιδιοκτήτη της συσκευής, <ph name="OWNER_EMAIL" />.</translation>
 <translation id="144518587530125858">Δεν ήταν δυνατή η φόρτωση του "<ph name="IMAGE_PATH" />" για το θέμα.</translation>
-<translation id="1445693676523799095">Μπορεί να χρειαστεί λίγη ώρα</translation>
 <translation id="1451375123200651445">Ιστοσελίδα, μεμονωμένο αρχείο</translation>
 <translation id="1451917004835509682">Προσθήκη εποπτευόμενου ατόμου</translation>
 <translation id="1454223536435069390">Λήψη στιγμιότυπου οθόνης</translation>
@@ -4898,7 +4897,6 @@
 <translation id="6828182567531805778">Εισαγάγετε τη φράση πρόσβασης για να συγχρονίσετε τα δεδομένα σας</translation>
 <translation id="682871081149631693">QuickFix</translation>
 <translation id="6828860976882136098">Αποτυχία ρύθμισης αυτόματων ενημερώσεων για όλους τους χρήστες (σφάλμα προληπτικής εκτέλεσης: <ph name="ERROR_NUMBER" />)</translation>
-<translation id="6829250331733125857">Λάβετε βοήθεια για τη συσκευή σας <ph name="DEVICE_TYPE" />.</translation>
 <translation id="682971198310367122">Πολιτική απορρήτου Google</translation>
 <translation id="6831043979455480757">Μετάφραση</translation>
 <translation id="683373380308365518">Κάντε εναλλαγή σε ένα έξυπνο και ασφαλές πρόγραμμα περιήγησης</translation>
diff --git a/chrome/app/resources/generated_resources_en-GB.xtb b/chrome/app/resources/generated_resources_en-GB.xtb
index be17f36..b77e7c4 100644
--- a/chrome/app/resources/generated_resources_en-GB.xtb
+++ b/chrome/app/resources/generated_resources_en-GB.xtb
@@ -394,7 +394,6 @@
 <translation id="1442851588227551435">Set active Kerberos ticket</translation>
 <translation id="1444628761356461360">This setting is managed by the device owner, <ph name="OWNER_EMAIL" />.</translation>
 <translation id="144518587530125858">Could not load '<ph name="IMAGE_PATH" />' for theme.</translation>
-<translation id="1445693676523799095">This may take a while</translation>
 <translation id="1451375123200651445">Web page, Single File</translation>
 <translation id="1451917004835509682">Add Supervised Person</translation>
 <translation id="1454223536435069390">T&amp;ake screenshot</translation>
@@ -4897,7 +4896,6 @@
 <translation id="6828182567531805778">Enter your passphrase to sync your data</translation>
 <translation id="682871081149631693">QuickFix</translation>
 <translation id="6828860976882136098">Failed to set up automatic updates for all users (preflight execution error: <ph name="ERROR_NUMBER" />)</translation>
-<translation id="6829250331733125857">Get help with your <ph name="DEVICE_TYPE" />.</translation>
 <translation id="682971198310367122">Google Privacy Policy</translation>
 <translation id="6831043979455480757">Translate</translation>
 <translation id="683373380308365518">Switch to a smart and secure browser</translation>
diff --git a/chrome/app/resources/generated_resources_es-419.xtb b/chrome/app/resources/generated_resources_es-419.xtb
index a43e4c24..4cbb2b4d 100644
--- a/chrome/app/resources/generated_resources_es-419.xtb
+++ b/chrome/app/resources/generated_resources_es-419.xtb
@@ -394,7 +394,6 @@
 <translation id="1442851588227551435">Activar un ticket de Kerberos</translation>
 <translation id="1444628761356461360">Esta configuración es administrada por el propietario del dispositivo: <ph name="OWNER_EMAIL" />.</translation>
 <translation id="144518587530125858">No se pudo cargar '<ph name="IMAGE_PATH" />' para el tema.</translation>
-<translation id="1445693676523799095">Esta acción puede demorar unos minutos</translation>
 <translation id="1451375123200651445">Página web (un único archivo)</translation>
 <translation id="1451917004835509682">Agregar persona supervisada</translation>
 <translation id="1454223536435069390">Tomar captura de pantalla</translation>
@@ -4894,7 +4893,6 @@
 <translation id="6828182567531805778">Ingresa la frase de contraseña para sincronizar tus datos</translation>
 <translation id="682871081149631693">QuickFix</translation>
 <translation id="6828860976882136098">No se pudieron configurar actualizaciones automáticas para todos los usuarios (error de ejecución preliminar: <ph name="ERROR_NUMBER" />)</translation>
-<translation id="6829250331733125857">Obtén ayuda con tu <ph name="DEVICE_TYPE" />.</translation>
 <translation id="682971198310367122">Política de Privacidad de Google</translation>
 <translation id="6831043979455480757">Traducir</translation>
 <translation id="683373380308365518">Cambia a un navegador inteligente y seguro</translation>
diff --git a/chrome/app/resources/generated_resources_es.xtb b/chrome/app/resources/generated_resources_es.xtb
index fbec8bff..55b2099 100644
--- a/chrome/app/resources/generated_resources_es.xtb
+++ b/chrome/app/resources/generated_resources_es.xtb
@@ -394,7 +394,6 @@
 <translation id="1442851588227551435">Establecer ticket de Kerberos activo</translation>
 <translation id="1444628761356461360">Esta opción está administrada por el propietario del dispositivo, <ph name="OWNER_EMAIL" />.</translation>
 <translation id="144518587530125858">No se ha podido cargar la ruta "<ph name="IMAGE_PATH" />" del tema.</translation>
-<translation id="1445693676523799095">Este proceso puede tardar un poco</translation>
 <translation id="1451375123200651445">Página web (un único archivo)</translation>
 <translation id="1451917004835509682">Añadir persona supervisada</translation>
 <translation id="1454223536435069390">H&amp;acer captura de pantalla</translation>
@@ -4896,7 +4895,6 @@
 <translation id="6828182567531805778">Introduce la frase de contraseña para sincronizar tus datos</translation>
 <translation id="682871081149631693">Quick Fix</translation>
 <translation id="6828860976882136098">Se ha producido un error al configurar las actualizaciones automáticas para todos los usuarios (error de ejecución preliminar: <ph name="ERROR_NUMBER" />)</translation>
-<translation id="6829250331733125857">Recibe ayuda para tu <ph name="DEVICE_TYPE" />.</translation>
 <translation id="682971198310367122">Política de Privacidad de Google</translation>
 <translation id="6831043979455480757">Traducir</translation>
 <translation id="683373380308365518">Cambia a un navegador seguro e inteligente</translation>
diff --git a/chrome/app/resources/generated_resources_et.xtb b/chrome/app/resources/generated_resources_et.xtb
index 915ea60..813ebc9 100644
--- a/chrome/app/resources/generated_resources_et.xtb
+++ b/chrome/app/resources/generated_resources_et.xtb
@@ -394,7 +394,6 @@
 <translation id="1442851588227551435">Kerberose pileti aktiveerimine</translation>
 <translation id="1444628761356461360">Seadet haldab seadme omanik <ph name="OWNER_EMAIL" />.</translation>
 <translation id="144518587530125858">Teemale ei õnnestunud laadida üksust <ph name="IMAGE_PATH" />.</translation>
-<translation id="1445693676523799095">See võib pisut aega võtta</translation>
 <translation id="1451375123200651445">Veebileht, üks fail</translation>
 <translation id="1451917004835509682">Jälgitava isiku lisamine</translation>
 <translation id="1454223536435069390">J&amp;äädvusta ekraanipilt</translation>
@@ -4897,7 +4896,6 @@
 <translation id="6828182567531805778">Andmete sünkroonimiseks sisestage parool</translation>
 <translation id="682871081149631693">QuickFix</translation>
 <translation id="6828860976882136098">Automaatvärskenduste seadistamine kõikidele kasutajatele ebaõnnestus (esituseelne käivitamisviga: <ph name="ERROR_NUMBER" />)</translation>
-<translation id="6829250331733125857">Abi hankimine seadme <ph name="DEVICE_TYPE" /> puhul.</translation>
 <translation id="682971198310367122">Google'i privaatsuseeskirjad</translation>
 <translation id="6831043979455480757">Tõlgi</translation>
 <translation id="683373380308365518">Minge üle nutikale ja turvalisele brauserile</translation>
diff --git a/chrome/app/resources/generated_resources_eu.xtb b/chrome/app/resources/generated_resources_eu.xtb
index 994e56a..554657c 100644
--- a/chrome/app/resources/generated_resources_eu.xtb
+++ b/chrome/app/resources/generated_resources_eu.xtb
@@ -394,7 +394,6 @@
 <translation id="1442851588227551435">Ezarri Kerberos-eko zerbitzu-eskaera aktibo bat</translation>
 <translation id="1444628761356461360">Ezarpen hau gailuaren jabeak (<ph name="OWNER_EMAIL" />) kudeatzen du.</translation>
 <translation id="144518587530125858">Ezin izan da "<ph name="IMAGE_PATH" />" kargatu itxura gisa.</translation>
-<translation id="1445693676523799095">Zenbait minutu beharko dira</translation>
 <translation id="1451375123200651445">Webgunea, fitxategi bakarra</translation>
 <translation id="1451917004835509682">Gehitu gainbegiratutako pertsona</translation>
 <translation id="1454223536435069390">&amp;Atera pantaila-argazkia</translation>
@@ -4897,7 +4896,6 @@
 <translation id="6828182567531805778">Datuak sinkronizatzeko, idatzi pasaesaldia</translation>
 <translation id="682871081149631693">QuickFix</translation>
 <translation id="6828860976882136098">Ezin izan dira konfiguratu eguneratze automatikoak erabiltzaile guztientzat (prozesua exekutatu bitarteko errorea: <ph name="ERROR_NUMBER" />)</translation>
-<translation id="6829250331733125857">Lortu laguntza <ph name="DEVICE_TYPE" /> erabiltzeko.</translation>
 <translation id="682971198310367122">Google-ren Pribatutasun-gidalerroak</translation>
 <translation id="6831043979455480757">Itzuli</translation>
 <translation id="683373380308365518">Aldatu arakatzaile adimendun eta seguru batera</translation>
diff --git a/chrome/app/resources/generated_resources_fa.xtb b/chrome/app/resources/generated_resources_fa.xtb
index 52ce53c..700a510c 100644
--- a/chrome/app/resources/generated_resources_fa.xtb
+++ b/chrome/app/resources/generated_resources_fa.xtb
@@ -394,7 +394,6 @@
 <translation id="1442851588227551435">‏تنظیم کردن بلیت فعال Kerberos</translation>
 <translation id="1444628761356461360">این تنظیم توسط مالک دستگاه مدیریت می‌شود، <ph name="OWNER_EMAIL" />.</translation>
 <translation id="144518587530125858">بارگیری "<ph name="IMAGE_PATH" />" برای طرح زمینه ممکن نیست.</translation>
-<translation id="1445693676523799095">این کار ممکن است مدتی طول بکشد</translation>
 <translation id="1451375123200651445">صفحه وب، فایل واحد</translation>
 <translation id="1451917004835509682">افزون فرد تحت نظارت</translation>
 <translation id="1454223536435069390">گرفتن نماگرفت</translation>
@@ -4894,7 +4893,6 @@
 <translation id="6828182567531805778">برای همگام‌سازی داده‌ها، عبارت عبورتان را وارد کنید</translation>
 <translation id="682871081149631693">QuickFix</translation>
 <translation id="6828860976882136098">راه‌اندازی به‌روزرسانی‌های خودکار برای همه کاربران انجام نشد (خطای اجرای پیش از تولید:‏ <ph name="ERROR_NUMBER" />)</translation>
-<translation id="6829250331733125857">برای <ph name="DEVICE_TYPE" /> راهنمایی دریافت کنید.</translation>
 <translation id="682971198310367122">‏خط‌مشی رازداری Google</translation>
 <translation id="6831043979455480757">ترجمه</translation>
 <translation id="683373380308365518">به مرورگری هوشمند و ایمن جابه‌جا شوید</translation>
diff --git a/chrome/app/resources/generated_resources_fi.xtb b/chrome/app/resources/generated_resources_fi.xtb
index ab715c9..19b8a26 100644
--- a/chrome/app/resources/generated_resources_fi.xtb
+++ b/chrome/app/resources/generated_resources_fi.xtb
@@ -394,7 +394,6 @@
 <translation id="1442851588227551435">Aseta aktiivinen Kerberos-tukipyyntö</translation>
 <translation id="1444628761356461360">Tätä asetusta hallinnoi laitteen omistaja <ph name="OWNER_EMAIL" />.</translation>
 <translation id="144518587530125858">Polun <ph name="IMAGE_PATH" /> lataaminen teemalle ei onnistunut.</translation>
-<translation id="1445693676523799095">Tämä voi kestää hetken</translation>
 <translation id="1451375123200651445">Verkkosivu, yksi tiedosto</translation>
 <translation id="1451917004835509682">Lisää valvottu käyttäjä</translation>
 <translation id="1454223536435069390">Ot&amp;a kuvakaappaus</translation>
@@ -4896,7 +4895,6 @@
 <translation id="6828182567531805778">Synkronoi datasi lisäämällä tunnuslauseesi</translation>
 <translation id="682871081149631693">QuickFix</translation>
 <translation id="6828860976882136098">Automaattisten päivitysten käyttöönotto kaikille käyttäjille epäonnistui (suoritusvirhe valmistelun aikana: <ph name="ERROR_NUMBER" />).</translation>
-<translation id="6829250331733125857">Lue ohjeita laitteen <ph name="DEVICE_TYPE" /> käyttöön.</translation>
 <translation id="682971198310367122">Googlen tietosuojakäytäntö</translation>
 <translation id="6831043979455480757">Käännä</translation>
 <translation id="683373380308365518">Siirry käyttämään älykästä ja turvallista selainta.</translation>
diff --git a/chrome/app/resources/generated_resources_fil.xtb b/chrome/app/resources/generated_resources_fil.xtb
index c57bc6e5..9a30850 100644
--- a/chrome/app/resources/generated_resources_fil.xtb
+++ b/chrome/app/resources/generated_resources_fil.xtb
@@ -394,7 +394,6 @@
 <translation id="1442851588227551435">Itakda ang aktibong ticket ng Kerberos</translation>
 <translation id="1444628761356461360">Ang setting na ito ay pinamamahalaan ng may-ari ng device, <ph name="OWNER_EMAIL" />.</translation>
 <translation id="144518587530125858">Maaaring hindi mai-load ang '<ph name="IMAGE_PATH" />' para sa tema.</translation>
-<translation id="1445693676523799095">Puwede itong magtagal nang ilang sandali</translation>
 <translation id="1451375123200651445">Webpage, Iisang File</translation>
 <translation id="1451917004835509682">Magdagdag ng Pinapangasiwaang Tao</translation>
 <translation id="1454223536435069390">Kumuha ng screenshot</translation>
@@ -4897,7 +4896,6 @@
 <translation id="6828182567531805778">Ilagay ang iyong passphrase para i-sync ang data mo</translation>
 <translation id="682871081149631693">QuickFix</translation>
 <translation id="6828860976882136098">Hindi na-set up ang mga awtomatikong pag-update para sa lahat ng user (error sa pagpapatupad sa preflight: <ph name="ERROR_NUMBER" />)</translation>
-<translation id="6829250331733125857">Makakuha ng tulong sa iyong <ph name="DEVICE_TYPE" />.</translation>
 <translation id="682971198310367122">Patakaran sa privacy ng Google</translation>
 <translation id="6831043979455480757">Isalin</translation>
 <translation id="683373380308365518">Lumipat sa isang mahusay at ligtas na browser</translation>
diff --git a/chrome/app/resources/generated_resources_fr-CA.xtb b/chrome/app/resources/generated_resources_fr-CA.xtb
index 88f95ff..67ab808 100644
--- a/chrome/app/resources/generated_resources_fr-CA.xtb
+++ b/chrome/app/resources/generated_resources_fr-CA.xtb
@@ -394,7 +394,6 @@
 <translation id="1442851588227551435">Définir le ticket Kerberos actif</translation>
 <translation id="1444628761356461360">Ce paramètre est géré par le propriétaire de l'appareil : <ph name="OWNER_EMAIL" />.</translation>
 <translation id="144518587530125858">Impossible de charger « <ph name="IMAGE_PATH" /> » pour le thème.</translation>
-<translation id="1445693676523799095">Cela peut prendre un certain temps</translation>
 <translation id="1451375123200651445">Page Web, fichier unique</translation>
 <translation id="1451917004835509682">Ajouter une personne supervisée</translation>
 <translation id="1454223536435069390">Faire une s&amp;aisie d'écran</translation>
@@ -4898,7 +4897,6 @@
 <translation id="6828182567531805778">Entrez votre phrase de passe pour synchroniser vos données</translation>
 <translation id="682871081149631693">QuickFix</translation>
 <translation id="6828860976882136098">Impossible de configurer les mises à jour automatiques pour tous les utilisateurs (erreur d'exécution des vérifications : <ph name="ERROR_NUMBER" />)</translation>
-<translation id="6829250331733125857">Obtenez de l'aide pour votre <ph name="DEVICE_TYPE" />.</translation>
 <translation id="682971198310367122">Politique de confidentialité de Google</translation>
 <translation id="6831043979455480757">Traduire</translation>
 <translation id="683373380308365518">Passer à un navigateur intelligent et sécurisé</translation>
diff --git a/chrome/app/resources/generated_resources_fr.xtb b/chrome/app/resources/generated_resources_fr.xtb
index 35d6922..aa8c5af9 100644
--- a/chrome/app/resources/generated_resources_fr.xtb
+++ b/chrome/app/resources/generated_resources_fr.xtb
@@ -394,7 +394,6 @@
 <translation id="1442851588227551435">Définir un ticket Kerberos actif</translation>
 <translation id="1444628761356461360">Ce paramètre est géré par le propriétaire de l'appareil : <ph name="OWNER_EMAIL" />.</translation>
 <translation id="144518587530125858">Impossible de charger "<ph name="IMAGE_PATH" />" pour le thème.</translation>
-<translation id="1445693676523799095">Cette opération peut prendre quelques instants</translation>
 <translation id="1451375123200651445">Page Web, un seul fichier</translation>
 <translation id="1451917004835509682">Ajouter une personne supervisée</translation>
 <translation id="1454223536435069390">F&amp;aire une capture d'écran</translation>
@@ -4898,7 +4897,6 @@
 <translation id="6828182567531805778">Saisissez votre phrase secrète pour synchroniser vos données.</translation>
 <translation id="682871081149631693">QuickFix</translation>
 <translation id="6828860976882136098">Échec de la configuration des mises à jour automatiques pour tous les utilisateurs (erreur d'exécution avant la période de diffusion : <ph name="ERROR_NUMBER" />)</translation>
-<translation id="6829250331733125857">Obtenir de l'aide pour votre <ph name="DEVICE_TYPE" /></translation>
 <translation id="682971198310367122">Règles de confidentialité de Google</translation>
 <translation id="6831043979455480757">Traduire</translation>
 <translation id="683373380308365518">Passez à un navigateur intelligent et sécurisé</translation>
diff --git a/chrome/app/resources/generated_resources_gl.xtb b/chrome/app/resources/generated_resources_gl.xtb
index 6a5d96d..677aa2a 100644
--- a/chrome/app/resources/generated_resources_gl.xtb
+++ b/chrome/app/resources/generated_resources_gl.xtb
@@ -394,7 +394,6 @@
 <translation id="1442851588227551435">Definir como activo un tícket de Kerberos</translation>
 <translation id="1444628761356461360">Esta configuración está xestionada polo propietario do dispositivo, <ph name="OWNER_EMAIL" />.</translation>
 <translation id="144518587530125858">Non se puido cargar "<ph name="IMAGE_PATH" />" para o tema.</translation>
-<translation id="1445693676523799095">Este proceso pode tardar uns intres</translation>
 <translation id="1451375123200651445">Páxina web (nun só ficheiro)</translation>
 <translation id="1451917004835509682">Engadir persoa supervisada</translation>
 <translation id="1454223536435069390">F&amp;acer captura de pantalla</translation>
@@ -4896,7 +4895,6 @@
 <translation id="6828182567531805778">Introduce a túa frase de acceso para sincronizar os teus datos</translation>
 <translation id="682871081149631693">QuickFix</translation>
 <translation id="6828860976882136098">Non se puideron configurar as actualizacións automáticas para todos os usuarios (erro de execución da comprobación preliminar: <ph name="ERROR_NUMBER" />)</translation>
-<translation id="6829250331733125857">Recibe axuda co teu dispositivo <ph name="DEVICE_TYPE" />.</translation>
 <translation id="682971198310367122">Política de privacidade de Google</translation>
 <translation id="6831043979455480757">Traducir</translation>
 <translation id="683373380308365518">Cambiar a un navegador intelixente e seguro</translation>
diff --git a/chrome/app/resources/generated_resources_gu.xtb b/chrome/app/resources/generated_resources_gu.xtb
index 2d9d433e..e07225ef 100644
--- a/chrome/app/resources/generated_resources_gu.xtb
+++ b/chrome/app/resources/generated_resources_gu.xtb
@@ -394,7 +394,6 @@
 <translation id="1442851588227551435">સક્રિય Kerberos ટિકિટ સેટ કરો</translation>
 <translation id="1444628761356461360">આ સેટિંગ ઉપકરણ માલિક, <ph name="OWNER_EMAIL" /> દ્વારા સંચાલિત થાય છે.</translation>
 <translation id="144518587530125858">થીમ માટે '<ph name="IMAGE_PATH" />' લોડ કરી શકાયું નથી.</translation>
-<translation id="1445693676523799095">આમાં થોડો સમય લાગી શકે છે</translation>
 <translation id="1451375123200651445">વેબપેજ, એકલ ફાઇલ</translation>
 <translation id="1451917004835509682">નિરીક્ષિત વ્યક્તિ ઉમેરો</translation>
 <translation id="1454223536435069390">સ્ક્રીનશોટ &amp;લો</translation>
@@ -4895,7 +4894,6 @@
 <translation id="6828182567531805778">તમારો ડેટા સિંક કરવા માટે તમારો પાસફ્રેઝ દાખલ કરો</translation>
 <translation id="682871081149631693">QuickFix</translation>
 <translation id="6828860976882136098">તમામ વપરાશકર્તાઓ માટે સ્વચલિત અપડેટ્સને સેટ કરવામાં નિષ્ફળ થયાં (પ્રીફ્લાઇટ અમલીકરણની ભૂલ: <ph name="ERROR_NUMBER" />)</translation>
-<translation id="6829250331733125857">તમારા <ph name="DEVICE_TYPE" /> સાથે સહાય મેળવો.</translation>
 <translation id="682971198310367122">Google ગોપનીયતા નીતિ</translation>
 <translation id="6831043979455480757">અનુવાદ કરો</translation>
 <translation id="683373380308365518">એક સ્માર્ટ અને સુરક્ષિત બ્રાઉઝર પર સ્વિચ કરો</translation>
diff --git a/chrome/app/resources/generated_resources_hi.xtb b/chrome/app/resources/generated_resources_hi.xtb
index 84887e8..b60849b 100644
--- a/chrome/app/resources/generated_resources_hi.xtb
+++ b/chrome/app/resources/generated_resources_hi.xtb
@@ -394,7 +394,6 @@
 <translation id="1442851588227551435">चालू Kerberos टिकट सेट करें</translation>
 <translation id="1444628761356461360">यह सेटिंग डिवाइस मालिक, <ph name="OWNER_EMAIL" /> द्वारा प्रबंधित है.</translation>
 <translation id="144518587530125858">थीम के लिए '<ph name="IMAGE_PATH" />' को लोड नहीं कर सका.</translation>
-<translation id="1445693676523799095">इसमें कुछ समय लग सकता है</translation>
 <translation id="1451375123200651445">वेबपेज, एकल फ़ाइल</translation>
 <translation id="1451917004835509682">पर्यवेक्षित व्‍यक्‍ति जोड़ें</translation>
 <translation id="1454223536435069390">स्क्रीन&amp;शॉट लें</translation>
@@ -4896,7 +4895,6 @@
 <translation id="6828182567531805778">डेटा सिंक करने के लिए लंबा पासवर्ड डालें</translation>
 <translation id="682871081149631693">QuickFix</translation>
 <translation id="6828860976882136098">सभी उपयोगकर्ताओं के लिए स्वचालित अपडेट सेट करने में विफल (प्रीफ़्लाइट निष्पादन गड़बड़ी: <ph name="ERROR_NUMBER" />)</translation>
-<translation id="6829250331733125857">अपने <ph name="DEVICE_TYPE" /> के साथ सहायता पाएं.</translation>
 <translation id="682971198310367122">Google निजता नीति</translation>
 <translation id="6831043979455480757">अनुवाद करें</translation>
 <translation id="683373380308365518">किसी स्मार्ट और सुरक्षित ब्राउज़र पर जाएं</translation>
diff --git a/chrome/app/resources/generated_resources_hr.xtb b/chrome/app/resources/generated_resources_hr.xtb
index 0250a003..b3245f6a 100644
--- a/chrome/app/resources/generated_resources_hr.xtb
+++ b/chrome/app/resources/generated_resources_hr.xtb
@@ -394,7 +394,6 @@
 <translation id="1442851588227551435">Postavljanje aktivnog Kerberosovog tiketa</translation>
 <translation id="1444628761356461360">Ovom postavkom upravlja vlasnik uređaja, <ph name="OWNER_EMAIL" />.</translation>
 <translation id="144518587530125858">Nije uspjelo učitavanje putanje "<ph name="IMAGE_PATH" />" za temu.</translation>
-<translation id="1445693676523799095">To može potrajati neko vrijeme</translation>
 <translation id="1451375123200651445">Web-stranica, jedna datoteka</translation>
 <translation id="1451917004835509682">Dodaj nadziranog korisnika</translation>
 <translation id="1454223536435069390">I&amp;zradi snimku zaslona</translation>
@@ -4897,7 +4896,6 @@
 <translation id="6828182567531805778">Unesite šifru da biste sinkronizirali podatke</translation>
 <translation id="682871081149631693">Brzi popravak</translation>
 <translation id="6828860976882136098">Postavljanje automatskih ažuriranja za sve korisnike nije uspjelo (pogreška prilikom izvršavanja pripremne provjere: <ph name="ERROR_NUMBER" />)</translation>
-<translation id="6829250331733125857">Pomoć za uređaj <ph name="DEVICE_TYPE" />.</translation>
 <translation id="682971198310367122">Googleova Pravila o privatnosti</translation>
 <translation id="6831043979455480757">Prevedi</translation>
 <translation id="683373380308365518">Prijeđite na pametan i siguran preglednik</translation>
diff --git a/chrome/app/resources/generated_resources_hu.xtb b/chrome/app/resources/generated_resources_hu.xtb
index 2279167..5f278df 100644
--- a/chrome/app/resources/generated_resources_hu.xtb
+++ b/chrome/app/resources/generated_resources_hu.xtb
@@ -394,7 +394,6 @@
 <translation id="1442851588227551435">Aktív Kerberos-jegy beállítása</translation>
 <translation id="1444628761356461360">Ezt a beállítást az eszköz tulajdonosa (<ph name="OWNER_EMAIL" />) kezeli.</translation>
 <translation id="144518587530125858">A(z) '<ph name="IMAGE_PATH" />' kép nem tölthető be a témához.</translation>
-<translation id="1445693676523799095">Ez eltarthat egy ideig</translation>
 <translation id="1451375123200651445">Weboldal, egyetlen fájl</translation>
 <translation id="1451917004835509682">Felügyelt személy hozzáadása</translation>
 <translation id="1454223536435069390">&amp;Képernyőkép készítése</translation>
@@ -4898,7 +4897,6 @@
 <translation id="6828182567531805778">Az adatok szinkronizálásához adja meg az összetett jelszavát</translation>
 <translation id="682871081149631693">QuickFix</translation>
 <translation id="6828860976882136098">Nem sikerült beállítani az automatikus frissítéseket az összes felhasználó számára (előzetes lekérdezés végrehajtási hibája: <ph name="ERROR_NUMBER" />)</translation>
-<translation id="6829250331733125857">Kérjen segítséget <ph name="DEVICE_TYPE" /> eszközéhez.</translation>
 <translation id="682971198310367122">A Google adatvédelmi irányelvei</translation>
 <translation id="6831043979455480757">Fordítás</translation>
 <translation id="683373380308365518">Váltás intelligens és biztonságos böngészőre</translation>
diff --git a/chrome/app/resources/generated_resources_hy.xtb b/chrome/app/resources/generated_resources_hy.xtb
index 0988c2fa..6dfca86c2 100644
--- a/chrome/app/resources/generated_resources_hy.xtb
+++ b/chrome/app/resources/generated_resources_hy.xtb
@@ -394,7 +394,6 @@
 <translation id="1442851588227551435">Կարգավորել ակտիվ Kerberos տոմս</translation>
 <translation id="1444628761356461360">Այս կարգավորումը կառավարվում է սարքի սեփականատիրոջ կողմից՝ <ph name="OWNER_EMAIL" />:</translation>
 <translation id="144518587530125858">Չհաջողվեց բեռնել «<ph name="IMAGE_PATH" />»-ը թեմայի համար:</translation>
-<translation id="1445693676523799095">Կարող է որոշ ժամանակ պահանջվել</translation>
 <translation id="1451375123200651445">Վեբէջ, մեկ ֆայլ</translation>
 <translation id="1451917004835509682">Ավելացնել վերահսկվող օգտատեր</translation>
 <translation id="1454223536435069390">Ստեղ&amp;ծել սքրինշոթ</translation>
@@ -4900,7 +4899,6 @@
 <translation id="6828182567531805778">Տվյալները համաժամացնելու համար մուտքագրեք ձեր անցաբառը</translation>
 <translation id="682871081149631693">QuickFix</translation>
 <translation id="6828860976882136098">Չհաջողվեց կարգավորել ավտոմատ թարմացումները բոլոր օգտատերերի համար (սխալ՝ <ph name="ERROR_NUMBER" />)</translation>
-<translation id="6829250331733125857">Ստացեք օգնություն <ph name="DEVICE_TYPE" /> սարքի օգտագործման վերաբերյալ:</translation>
 <translation id="682971198310367122">Google-ի գաղտնիության քաղաքականություն</translation>
 <translation id="6831043979455480757">Թարգմանել</translation>
 <translation id="683373380308365518">Ընտրեք խելացի ու անվտանգ դիտարկիչ</translation>
diff --git a/chrome/app/resources/generated_resources_id.xtb b/chrome/app/resources/generated_resources_id.xtb
index 5afc04c..2a60a12 100644
--- a/chrome/app/resources/generated_resources_id.xtb
+++ b/chrome/app/resources/generated_resources_id.xtb
@@ -394,7 +394,6 @@
 <translation id="1442851588227551435">Setel tiket Kerberos aktif</translation>
 <translation id="1444628761356461360">Setelan ini dikelola oleh pemilik perangkat, <ph name="OWNER_EMAIL" />.</translation>
 <translation id="144518587530125858">Tidak dapat memuat '<ph name="IMAGE_PATH" />' untuk tema.</translation>
-<translation id="1445693676523799095">Proses ini mungkin butuh waktu beberapa saat</translation>
 <translation id="1451375123200651445">Halaman web, File Tunggal</translation>
 <translation id="1451917004835509682">Tambahkan Pengguna yang Dilindungi</translation>
 <translation id="1454223536435069390">Ambil screenshot</translation>
@@ -4897,7 +4896,6 @@
 <translation id="6828182567531805778">Masukkan frasa sandi Anda untuk menyinkronkan data</translation>
 <translation id="682871081149631693">QuickFix</translation>
 <translation id="6828860976882136098">Gagal menyiapkan pembaruan otomatis bagi semua pengguna (terjadi kesalahan saat mengeksekusi preflight: <ph name="ERROR_NUMBER" />)</translation>
-<translation id="6829250331733125857">Dapatkan bantuan terkait <ph name="DEVICE_TYPE" /> Anda.</translation>
 <translation id="682971198310367122">Kebijakan privasi Google</translation>
 <translation id="6831043979455480757">Terjemahkan</translation>
 <translation id="683373380308365518">Beralih ke browser cerdas dan aman</translation>
diff --git a/chrome/app/resources/generated_resources_is.xtb b/chrome/app/resources/generated_resources_is.xtb
index d663435..8b619e6 100644
--- a/chrome/app/resources/generated_resources_is.xtb
+++ b/chrome/app/resources/generated_resources_is.xtb
@@ -394,7 +394,6 @@
 <translation id="1442851588227551435">Stilla virkan Kerberos miða</translation>
 <translation id="1444628761356461360">Eigandi tækisins, <ph name="OWNER_EMAIL" />, stjórnar þessari stillingu.</translation>
 <translation id="144518587530125858">Ekki var hægt að hlaða „<ph name="IMAGE_PATH" />“ fyrir þema.</translation>
-<translation id="1445693676523799095">Þetta gæti tekið dálitla stund</translation>
 <translation id="1451375123200651445">Vefsíða, stök skrá</translation>
 <translation id="1451917004835509682">Bæta stýrðum notanda við</translation>
 <translation id="1454223536435069390">T&amp;aka skjámynd</translation>
@@ -4897,7 +4896,6 @@
 <translation id="6828182567531805778">Sláðu inn aðgangsorðið til að samstilla gögnin þín</translation>
 <translation id="682871081149631693">Flýtilagfæring</translation>
 <translation id="6828860976882136098">Mistókst að setja upp sjálfvirkar uppfærslur fyrir alla notendur (villa við undirbúningskeyrslu: <ph name="ERROR_NUMBER" />)</translation>
-<translation id="6829250331733125857">Fáðu hjálp fyrir <ph name="DEVICE_TYPE" />.</translation>
 <translation id="682971198310367122">Persónuverndarstefna Google</translation>
 <translation id="6831043979455480757">Þýða</translation>
 <translation id="683373380308365518">Skipta yfir í öruggan og snjallan vafra</translation>
diff --git a/chrome/app/resources/generated_resources_it.xtb b/chrome/app/resources/generated_resources_it.xtb
index 3bf06e05..4874d37 100644
--- a/chrome/app/resources/generated_resources_it.xtb
+++ b/chrome/app/resources/generated_resources_it.xtb
@@ -394,7 +394,6 @@
 <translation id="1442851588227551435">Impostare richiesta di Kerberos attiva</translation>
 <translation id="1444628761356461360">Questa impostazione è controllata dal proprietario del dispositivo, <ph name="OWNER_EMAIL" />.</translation>
 <translation id="144518587530125858">Impossibile caricare "<ph name="IMAGE_PATH" />" per il tema.</translation>
-<translation id="1445693676523799095">L'operazione potrebbe richiedere un po' di tempo</translation>
 <translation id="1451375123200651445">Pagina web, singolo file</translation>
 <translation id="1451917004835509682">Aggiungi persona supervisionata</translation>
 <translation id="1454223536435069390">&amp;Acquisisci screenshot</translation>
@@ -4896,7 +4895,6 @@
 <translation id="6828182567531805778">Inserisci la tua passphrase per sincronizzare i dati</translation>
 <translation id="682871081149631693">Correzione rapida</translation>
 <translation id="6828860976882136098">Impostazione degli aggiornamenti automatici per tutti gli utenti non riuscita (errore di esecuzione preliminare: <ph name="ERROR_NUMBER" />)</translation>
-<translation id="6829250331733125857">Ricevi assistenza per il tuo <ph name="DEVICE_TYPE" />.</translation>
 <translation id="682971198310367122">Norme sulla privacy di Google</translation>
 <translation id="6831043979455480757">Traduci</translation>
 <translation id="683373380308365518">Passa a un browser intelligente e sicuro</translation>
diff --git a/chrome/app/resources/generated_resources_iw.xtb b/chrome/app/resources/generated_resources_iw.xtb
index 0651e258..9659aef 100644
--- a/chrome/app/resources/generated_resources_iw.xtb
+++ b/chrome/app/resources/generated_resources_iw.xtb
@@ -394,7 +394,6 @@
 <translation id="1442851588227551435">‏הגדרה של כרטיס Kerberos פעיל</translation>
 <translation id="1444628761356461360">ההגדרה הזו מנוהלת על ידי בעל המכשיר, <ph name="OWNER_EMAIL" />.</translation>
 <translation id="144518587530125858">לא ניתן להעלות את '<ph name="IMAGE_PATH" />' עבור עיצוב.</translation>
-<translation id="1445693676523799095">הפעולה עשויה להימשך זמן מה</translation>
 <translation id="1451375123200651445">דף אינטרנט, קובץ אחד</translation>
 <translation id="1451917004835509682">הוספת משתמש בפיקוח</translation>
 <translation id="1454223536435069390">צלם מסך</translation>
@@ -4895,7 +4894,6 @@
 <translation id="6828182567531805778">כדי לסנכרן את הנתונים יש להזין את הסיסמה</translation>
 <translation id="682871081149631693">QuickFix</translation>
 <translation id="6828860976882136098">הגדרת עדכונים אוטומטיים לכל המשתמשים נכשלה (שגיאת קדם-הפעלה: <ph name="ERROR_NUMBER" />)</translation>
-<translation id="6829250331733125857">קבל עזרה בשביל ה-<ph name="DEVICE_TYPE" />.</translation>
 <translation id="682971198310367122">‏מדיניות הפרטיות של Google</translation>
 <translation id="6831043979455480757">תרגום</translation>
 <translation id="683373380308365518">החלף לדפדפן חכם ובטוח</translation>
diff --git a/chrome/app/resources/generated_resources_ja.xtb b/chrome/app/resources/generated_resources_ja.xtb
index 9f31bb5..762973f 100644
--- a/chrome/app/resources/generated_resources_ja.xtb
+++ b/chrome/app/resources/generated_resources_ja.xtb
@@ -394,7 +394,6 @@
 <translation id="1442851588227551435">有効な Kerberos チケットの設定</translation>
 <translation id="1444628761356461360">この設定はデバイスの所有者 <ph name="OWNER_EMAIL" /> が管理しています。</translation>
 <translation id="144518587530125858">テーマの「<ph name="IMAGE_PATH" />」を読み込むことができませんでした。</translation>
-<translation id="1445693676523799095">しばらくお待ちください</translation>
 <translation id="1451375123200651445">ウェブページ、1 つのファイル</translation>
 <translation id="1451917004835509682">監視対象ユーザーを追加</translation>
 <translation id="1454223536435069390">スクリーンショットを撮る(&amp;A)</translation>
@@ -4897,7 +4896,6 @@
 <translation id="6828182567531805778">データを同期するにはパスフレーズを入力してください</translation>
 <translation id="682871081149631693">QuickFix</translation>
 <translation id="6828860976882136098">すべてのユーザーで自動更新を行うよう設定できませんでした(プリフライト実行エラー: <ph name="ERROR_NUMBER" />)</translation>
-<translation id="6829250331733125857"><ph name="DEVICE_TYPE" /> に関するヘルプを表示します。</translation>
 <translation id="682971198310367122">Google プライバシー ポリシー</translation>
 <translation id="6831043979455480757">翻訳</translation>
 <translation id="683373380308365518">スマートで安全なブラウザをぜひご利用ください</translation>
diff --git a/chrome/app/resources/generated_resources_ka.xtb b/chrome/app/resources/generated_resources_ka.xtb
index e2a22ab..7043370 100644
--- a/chrome/app/resources/generated_resources_ka.xtb
+++ b/chrome/app/resources/generated_resources_ka.xtb
@@ -394,7 +394,6 @@
 <translation id="1442851588227551435">აქტიური Kerberos ბილეთის დაყენება</translation>
 <translation id="1444628761356461360">ამ პარამეტრს მართავს აპარატის მფლობელი. <ph name="OWNER_EMAIL" />.</translation>
 <translation id="144518587530125858">ვერ მოხერხდა „<ph name="IMAGE_PATH" />“ ის დეკორაციისთვის ჩამოტვირთვა.</translation>
-<translation id="1445693676523799095">ამას შეიძლება გარკვეული დრო დასჭირდეს</translation>
 <translation id="1451375123200651445">ვებგვერდი, ერთი ფაილი</translation>
 <translation id="1451917004835509682">კონტროლის ქვეშ მყოფი პიროვნების დამატება</translation>
 <translation id="1454223536435069390">ე&amp;კრანის ანაბეჭდის გადაღება</translation>
@@ -4896,7 +4895,6 @@
 <translation id="6828182567531805778">თქვენი მონაცემების სინქრონიზაციისთვის შეიყვანეთ თქვენი საიდუმლო ფრაზა</translation>
 <translation id="682871081149631693">QuickFix</translation>
 <translation id="6828860976882136098">ავტომატური განახლებების ყველა მომხმარებლისთვის დაყენება ვერ მოხერხდა (წინასწარი შესრულებისას წარმოიქმნა შეცდომა: <ph name="ERROR_NUMBER" />)</translation>
-<translation id="6829250331733125857">მიიღეთ დახმარება <ph name="DEVICE_TYPE" />-სთან დაკავშირებით.</translation>
 <translation id="682971198310367122">Google-ის კონფიდენციალურობის დებულება</translation>
 <translation id="6831043979455480757">თარგმნა</translation>
 <translation id="683373380308365518">გადადით გონიერ და უსაფრთხო ბრაუზერზე</translation>
diff --git a/chrome/app/resources/generated_resources_kk.xtb b/chrome/app/resources/generated_resources_kk.xtb
index a23d2433..61e5501 100644
--- a/chrome/app/resources/generated_resources_kk.xtb
+++ b/chrome/app/resources/generated_resources_kk.xtb
@@ -394,7 +394,6 @@
 <translation id="1442851588227551435">Қосулы Kerberos билетін орнату</translation>
 <translation id="1444628761356461360">Бұл параметрді құрылғы иесі, <ph name="OWNER_EMAIL" />, басқарады.</translation>
 <translation id="144518587530125858">Тақырыпқа арналған "<ph name="IMAGE_PATH" />" жүктеу мүмкін емес.</translation>
-<translation id="1445693676523799095">Бұған біраз уақыт қажет болуы мүмкін</translation>
 <translation id="1451375123200651445">Веб-бет, бір файл</translation>
 <translation id="1451917004835509682">Бақылаудағы адамды қосу</translation>
 <translation id="1454223536435069390">Скриншотқа т&amp;үсіру</translation>
@@ -4894,7 +4893,6 @@
 <translation id="6828182567531805778">Деректерді синхрондау үшін құпия фразаны енгізіңіз.</translation>
 <translation id="682871081149631693">QuickFix</translation>
 <translation id="6828860976882136098">Барлық пайдаланушылар үшін автоматты жаңартулар орнатылмады (алдын ала орындау қатесі: <ph name="ERROR_NUMBER" />)</translation>
-<translation id="6829250331733125857"><ph name="DEVICE_TYPE" /> құрылғысымен көмек алу.</translation>
 <translation id="682971198310367122">Google құпиялылық саясаты</translation>
 <translation id="6831043979455480757">Аудару</translation>
 <translation id="683373380308365518">Зерделі және қауіпсіз браузерге ауысыңыз</translation>
diff --git a/chrome/app/resources/generated_resources_km.xtb b/chrome/app/resources/generated_resources_km.xtb
index 0eb077f..3e27fccf 100644
--- a/chrome/app/resources/generated_resources_km.xtb
+++ b/chrome/app/resources/generated_resources_km.xtb
@@ -394,7 +394,6 @@
 <translation id="1442851588227551435">កំណត់​សំបុត្រ Kerberos សកម្ម</translation>
 <translation id="1444628761356461360">ការកំណត់នេះត្រូវបានគ្រប់គ្រងដោយម្ចាស់ឧបករណ៍ <ph name="OWNER_EMAIL" />។</translation>
 <translation id="144518587530125858">មិនអាចដំណើរការ '<ph name="IMAGE_PATH" />' សម្រាប់ធីមទេ។</translation>
-<translation id="1445693676523799095">អាច​ចំណាយ​ពេល​បន្តិច</translation>
 <translation id="1451375123200651445">គេហទំព័រ ឯកសារទោល</translation>
 <translation id="1451917004835509682">បន្ថែមអ្នកប្រើដែលបានចាត់</translation>
 <translation id="1454223536435069390">ថតអេក្រង់</translation>
@@ -4898,7 +4897,6 @@
 <translation id="6828182567531805778">បញ្ចូល​ឃ្លាសម្ងាត់​របស់អ្នក ដើម្បី​ធ្វើសមកាលកម្ម​ទិន្នន័យ​របស់អ្នក</translation>
 <translation id="682871081149631693">QuickFix</translation>
 <translation id="6828860976882136098">បានបរាជ័យក្នុងការកំណត់ការអាប់ដេតដោយស្វ័យប្រវត្តិសម្រាប់អ្នកប្រើទាំងអស់ (មានកំហុសក្នុងការប្រតិបត្តិការ preflight៖ <ph name="ERROR_NUMBER" />)</translation>
-<translation id="6829250331733125857">ទទួលជំនួយដោយប្រើ <ph name="DEVICE_TYPE" /> របស់អ្នក។</translation>
 <translation id="682971198310367122">គោលការណ៍ឯកជនភាព Google</translation>
 <translation id="6831043979455480757">បកប្រែ</translation>
 <translation id="683373380308365518">ប្តូរទៅ​កម្មវិធីរុករកតាមអ៊ីនធឺណិត​ដែល​ឆ្លាតវៃ និងមានសុវត្ថិភាព</translation>
diff --git a/chrome/app/resources/generated_resources_kn.xtb b/chrome/app/resources/generated_resources_kn.xtb
index 5ea02b0c..cefdef8a 100644
--- a/chrome/app/resources/generated_resources_kn.xtb
+++ b/chrome/app/resources/generated_resources_kn.xtb
@@ -394,7 +394,6 @@
 <translation id="1442851588227551435">ಸಕ್ರಿಯ Kerberos ಟಿಕೆಟ್ ಅನ್ನು ಹೊಂದಿಸಿ</translation>
 <translation id="1444628761356461360">ಈ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ಸಾಧನದ ಮಾಲೀಕರಿಂದ ನಿರ್ವಹಿಸಿಲಾಗುತ್ತದೆ, <ph name="OWNER_EMAIL" />.</translation>
 <translation id="144518587530125858">'<ph name="IMAGE_PATH" />' ಅನ್ನು ಥೀಮ್‌ಗಾಗಿ ಲೋಡ್ ಮಾಡಲಾಗುವುದಿಲ್ಲ.</translation>
-<translation id="1445693676523799095">ಇದು ಸ್ವಲ್ಪ ಸಮಯ ತೆಗೆದುಕೊಳ್ಳಬಹುದು</translation>
 <translation id="1451375123200651445">ವೆಬ್‌ಪುಟ, ಒಂದೇ ಫೈಲ್</translation>
 <translation id="1451917004835509682">ಮೇಲ್ವಿಚಾರಣೆ ವ್ಯಕ್ತಿಯನ್ನು ಸೇರಿಸಿ</translation>
 <translation id="1454223536435069390">ಸ್ಕ್ರೀ&amp;ನ್‌ಶಾಟ್‌ ತೆಗೆದುಕೊಳ್ಳಿ</translation>
@@ -4899,7 +4898,6 @@
 <translation id="6828182567531805778">ನಿಮ್ಮ ಡೇಟಾವನ್ನು ಸಿಂಕ್ ಮಾಡಲು ನಿಮ್ಮ ಪಾಸ್‌ಫ್ರೇಸ್ ಅನ್ನು ನಮೂದಿಸಿ</translation>
 <translation id="682871081149631693">QuickFix</translation>
 <translation id="6828860976882136098">ಎಲ್ಲ ಬಳಕೆದಾರರಿಗೆ ಸ್ವಯಂಚಾಲಿತ ಅಪ್‌ಡೇಟ್‌ಗಳನ್ನು ಹೊಂದಿಸುವುದು ವಿಫಲವಾಗಿದೆ (ಪ್ರೀಫ್ಲೈಟ್ ಅನುಷ್ಠಾನ ದೋಷ: <ph name="ERROR_NUMBER" />)</translation>
-<translation id="6829250331733125857">ನಿಮ್ಮ <ph name="DEVICE_TYPE" /> ಮೂಲಕ ಸಹಾಯವನ್ನು ಪಡೆದುಕೊಳ್ಳಿ.</translation>
 <translation id="682971198310367122">Google ಗೌಪ್ಯತೆ ನೀತಿ</translation>
 <translation id="6831043979455480757">ಅನುವಾದಿಸು</translation>
 <translation id="683373380308365518">ಸ್ಮಾರ್ಟ್ ಮತ್ತು ಸುರಕ್ಷಿತ ಬ್ರೌಸರ್‌ಗೆ ಬದಲಿಸಿ</translation>
diff --git a/chrome/app/resources/generated_resources_ko.xtb b/chrome/app/resources/generated_resources_ko.xtb
index dc1e3f45..5025abb 100644
--- a/chrome/app/resources/generated_resources_ko.xtb
+++ b/chrome/app/resources/generated_resources_ko.xtb
@@ -394,7 +394,6 @@
 <translation id="1442851588227551435">활성 Kerberos 티켓 설정</translation>
 <translation id="1444628761356461360">기기 소유자인 <ph name="OWNER_EMAIL" />이(가) 관리하는 설정입니다.</translation>
 <translation id="144518587530125858">테마('<ph name="IMAGE_PATH" />')를 로드하지 못했습니다.</translation>
-<translation id="1445693676523799095">잠시만 기다려 주세요.</translation>
 <translation id="1451375123200651445">웹페이지, 단일 파일</translation>
 <translation id="1451917004835509682">관리 대상 사용자 추가</translation>
 <translation id="1454223536435069390">스크린샷 캡쳐하기(&amp;A)</translation>
@@ -4895,7 +4894,6 @@
 <translation id="6828182567531805778">데이터를 동기화하려면 암호를 입력합니다.</translation>
 <translation id="682871081149631693">QuickFix</translation>
 <translation id="6828860976882136098">모든 사용자에 대해 자동 업데이트를 설정하지 못했습니다(프리플라이트 실행 오류: <ph name="ERROR_NUMBER" />).</translation>
-<translation id="6829250331733125857"><ph name="DEVICE_TYPE" /> 사용과 관련하여 도움을 받으세요.</translation>
 <translation id="682971198310367122">Google 개인정보처리방침</translation>
 <translation id="6831043979455480757">번역</translation>
 <translation id="683373380308365518">편리하고 안전한 브라우저로 전환</translation>
diff --git a/chrome/app/resources/generated_resources_ky.xtb b/chrome/app/resources/generated_resources_ky.xtb
index cdbf187..d9f250b6 100644
--- a/chrome/app/resources/generated_resources_ky.xtb
+++ b/chrome/app/resources/generated_resources_ky.xtb
@@ -394,7 +394,6 @@
 <translation id="1442851588227551435">Активдүү Kerberos билетин жөндөө</translation>
 <translation id="1444628761356461360">Бул жөндөөнү түзмөк ээси башкарууда, <ph name="OWNER_EMAIL" />.</translation>
 <translation id="144518587530125858">Теманын '<ph name="IMAGE_PATH" />' жүктөлбөй калды.</translation>
-<translation id="1445693676523799095">Бул бир аз убакыт талап кылышы мүмкүн</translation>
 <translation id="1451375123200651445">Веб бет, Жалгыз файл</translation>
 <translation id="1451917004835509682">Көзөмөлдөнгөн адам кошуу</translation>
 <translation id="1454223536435069390">Скриншотту тарт&amp;ып алуу</translation>
@@ -4897,7 +4896,6 @@
 <translation id="6828182567531805778">Дайындарды шайкештирүү үчүн өткөрүүчү сүйлөмдү киргизиңиз</translation>
 <translation id="682871081149631693">QuickFix</translation>
 <translation id="6828860976882136098">Бардык колдонуучулар үчүн автоматтык жаңыртуулар орнотулбай калды (аткаруу катасы: <ph name="ERROR_NUMBER" />)</translation>
-<translation id="6829250331733125857"><ph name="DEVICE_TYPE" /> түзмөгүңүз менен жардам алыңыз.</translation>
 <translation id="682971198310367122">Google купуялык саясаты</translation>
 <translation id="6831043979455480757">Которуу</translation>
 <translation id="683373380308365518">Шамдагай жана коопсуз серепчиге которулуу</translation>
diff --git a/chrome/app/resources/generated_resources_lo.xtb b/chrome/app/resources/generated_resources_lo.xtb
index b210f96..6dc8aeab 100644
--- a/chrome/app/resources/generated_resources_lo.xtb
+++ b/chrome/app/resources/generated_resources_lo.xtb
@@ -394,7 +394,6 @@
 <translation id="1442851588227551435">ຕັ້ງຄ່າປີ້ Kerberos ທີ່ນຳໃຊ້ຢູ່</translation>
 <translation id="1444628761356461360">ການຕັ້ງຄ່ານີ້ຖືກຈັດການໂດຍ​ເຈົ້າ​ຂອງ​ອຸ​ປະ​ກອນ​, <ph name="OWNER_EMAIL" />.</translation>
 <translation id="144518587530125858">ບໍ່ສາມາດໂຫຼດ '<ph name="IMAGE_PATH" />' ສໍາລັບເທມໄດ້.</translation>
-<translation id="1445693676523799095">ຂັ້ນຕອນນີ້ຈະໃຊ້ເວລາຄາວໜຶ່ງ</translation>
 <translation id="1451375123200651445">ໜ້າເວັບ, ໄຟລ​໌​ດ່ຽວ</translation>
 <translation id="1451917004835509682">ເພີ່ມ​ບຸກ​ຄົນ​​ທີ່​ມີ​ການ​ຄວບ​ຄຸມ​ດູ​ແລ</translation>
 <translation id="1454223536435069390">ຖ່າຍຮູບໜ້າຈໍ</translation>
@@ -4895,7 +4894,6 @@
 <translation id="6828182567531805778">ປ້ອນລະຫັດຜ່ານຂອງທ່ານເພື່ອຊິ້ງຂໍ້ມູນຂອງທ່ານ</translation>
 <translation id="682871081149631693">QuickFix</translation>
 <translation id="6828860976882136098">ຕັ້ງການອັບເດດອັດຕະໂນມັດສຳລັບຜູ້ໃຊ້ທຸກຄົນບໍ່ສຳເລັດ (ຄວາມຜິດພາດການດຳເນີນ preflight: <ph name="ERROR_NUMBER" />)</translation>
-<translation id="6829250331733125857">ຂໍການ​ຊ່ວຍ​ເຫຼືອ​ເລື່ອງ <ph name="DEVICE_TYPE" /> ຂອງ​ທ່ານ.</translation>
 <translation id="682971198310367122">ນະໂຍບາຍຄວາມເປັນສ່ວນຕົວຂອງ Google</translation>
 <translation id="6831043979455480757">ແປພາສາ</translation>
 <translation id="683373380308365518">ປ່ຽນເປັນໂປຣແກຣມທ່ອງເວັບທີ່ສະຫຼາດ ແລະ ປອດໄພ</translation>
diff --git a/chrome/app/resources/generated_resources_lt.xtb b/chrome/app/resources/generated_resources_lt.xtb
index f4cc91b..a82f41f 100644
--- a/chrome/app/resources/generated_resources_lt.xtb
+++ b/chrome/app/resources/generated_resources_lt.xtb
@@ -394,7 +394,6 @@
 <translation id="1442851588227551435">Aktyvaus „Kerberos“ bilieto nustatymas</translation>
 <translation id="1444628761356461360">Šį nustatymą tvarko įrenginio savininkas (<ph name="OWNER_EMAIL" />).</translation>
 <translation id="144518587530125858">Temai nepavyko įkelti „<ph name="IMAGE_PATH" />“.</translation>
-<translation id="1445693676523799095">Tai gali šiek tiek užtrukti</translation>
 <translation id="1451375123200651445">Tinklalapis, vienas failas</translation>
 <translation id="1451917004835509682">Pridėti prižiūrimą asmenį</translation>
 <translation id="1454223536435069390">S&amp;ukurti ekrano kopiją</translation>
@@ -4898,7 +4897,6 @@
 <translation id="6828182567531805778">Įveskite slaptafrazę, kad sinchronizuotumėte duomenis</translation>
 <translation id="682871081149631693">QuickFix</translation>
 <translation id="6828860976882136098">Nepavyko nustatyti automatinių naujinių visiems naudotojams (išankstinio vykdymo klaida: <ph name="ERROR_NUMBER" />)</translation>
-<translation id="6829250331733125857">Gaukite pagalbos dėl „<ph name="DEVICE_TYPE" />“.</translation>
 <translation id="682971198310367122">„Google“ privatumo politika</translation>
 <translation id="6831043979455480757">Vertėjas</translation>
 <translation id="683373380308365518">Perjunkite į išmanią ir saugią naršyklę</translation>
diff --git a/chrome/app/resources/generated_resources_lv.xtb b/chrome/app/resources/generated_resources_lv.xtb
index 6d08966..2512c00 100644
--- a/chrome/app/resources/generated_resources_lv.xtb
+++ b/chrome/app/resources/generated_resources_lv.xtb
@@ -394,7 +394,6 @@
 <translation id="1442851588227551435">Iestatīt aktīvu Kerberos biļeti</translation>
 <translation id="1444628761356461360">Šo iestatījumu pārvalda ierīces īpašnieks <ph name="OWNER_EMAIL" />.</translation>
 <translation id="144518587530125858">Nevarēja ielādēt motīva ceļu “<ph name="IMAGE_PATH" />”.</translation>
-<translation id="1445693676523799095">Tas var ilgt kādu brīdi.</translation>
 <translation id="1451375123200651445">Tīmekļa lapa, viens fails</translation>
 <translation id="1451917004835509682">Pievienot uzraudzītu personu</translation>
 <translation id="1454223536435069390">I&amp;egūt ekrānuzņēmumu</translation>
@@ -4897,7 +4896,6 @@
 <translation id="6828182567531805778">Lai sinhronizētu datus, ievadiet ieejas frāzi</translation>
 <translation id="682871081149631693">QuickFix</translation>
 <translation id="6828860976882136098">Neizdevās iestatīt automātiskos atjauninājumus visiem lietotājiem (pirmslidojuma izpildes kļūda: <ph name="ERROR_NUMBER" />).</translation>
-<translation id="6829250331733125857">Saņemiet palīdzību savai <ph name="DEVICE_TYPE" /> ierīcei.</translation>
 <translation id="682971198310367122">Google konfidencialitātes politika</translation>
 <translation id="6831043979455480757">Tulkot</translation>
 <translation id="683373380308365518">Pāreja uz viedu un drošu pārlūku</translation>
diff --git a/chrome/app/resources/generated_resources_mk.xtb b/chrome/app/resources/generated_resources_mk.xtb
index d8e5330..b533dee 100644
--- a/chrome/app/resources/generated_resources_mk.xtb
+++ b/chrome/app/resources/generated_resources_mk.xtb
@@ -394,7 +394,6 @@
 <translation id="1442851588227551435">Поставете активен билет на Kerberos</translation>
 <translation id="1444628761356461360">Со поставката управува сопственикот на уредот, <ph name="OWNER_EMAIL" />.</translation>
 <translation id="144518587530125858">Не може да вчита „<ph name="IMAGE_PATH" />“ за тема.</translation>
-<translation id="1445693676523799095">Ова може да потрае</translation>
 <translation id="1451375123200651445">Веб-страница, единечна датотека</translation>
 <translation id="1451917004835509682">Додај надгледувано лице</translation>
 <translation id="1454223536435069390">&amp;Сними слика од екранот</translation>
@@ -4897,7 +4896,6 @@
 <translation id="6828182567531805778">Внесете ја лозинката за да ги синхронизирате податоците</translation>
 <translation id="682871081149631693">QuickFix</translation>
 <translation id="6828860976882136098">Не успеа поставувањето автоматски ажурирања за сите корисници (грешка при извршување preflight: <ph name="ERROR_NUMBER" />)</translation>
-<translation id="6829250331733125857">Добијте помош за <ph name="DEVICE_TYPE" />.</translation>
 <translation id="682971198310367122">Политика за приватност на Google</translation>
 <translation id="6831043979455480757">Преведи</translation>
 <translation id="683373380308365518">Префрлете се на паметен и безбеден прелистувач</translation>
diff --git a/chrome/app/resources/generated_resources_ml.xtb b/chrome/app/resources/generated_resources_ml.xtb
index 1eb4896..0d87833 100644
--- a/chrome/app/resources/generated_resources_ml.xtb
+++ b/chrome/app/resources/generated_resources_ml.xtb
@@ -394,7 +394,6 @@
 <translation id="1442851588227551435">സജീവ Kerberos ടിക്കറ്റ് സജ്ജീകരിക്കുക</translation>
 <translation id="1444628761356461360">ഈ ക്രമീകരണം നിയന്ത്രിക്കുന്നത് ഉപകരണത്തിന്റെ ഉടമയായ <ph name="OWNER_EMAIL" /> ആണ്.</translation>
 <translation id="144518587530125858">തീമിനായി '<ph name="IMAGE_PATH" />' ലോഡ് ചെയ്യാനായില്ല.</translation>
-<translation id="1445693676523799095">ഇതിന് കുറച്ച് സമയമെടുത്തേക്കാം</translation>
 <translation id="1451375123200651445">വെബ്‌പേജ്, ഒരൊറ്റ ഫയൽ</translation>
 <translation id="1451917004835509682">സൂപ്പർവൈസ് ചെയ്‌ത വ്യക്തിയെ ചേർക്കുക</translation>
 <translation id="1454223536435069390">സ്ക്രീൻഷോട്ടെടുക്കുക</translation>
@@ -4895,7 +4894,6 @@
 <translation id="6828182567531805778">നിങ്ങളുടെ ഡാറ്റ സമന്വയിപ്പിക്കാൻ പാസ്‌ഫ്രെയ്‌സ് നൽകുക</translation>
 <translation id="682871081149631693">QuickFix</translation>
 <translation id="6828860976882136098">എല്ലാ ഉപയോക്താക്കൾക്കുമായി സ്വയമേയുള്ള അപ്‌ഡേറ്റുകൾ സജ്ജമാക്കാനായില്ല (പ്രീഫ്ലൈറ്റ് എക്‌സിക്യൂഷൻ പിശക്: <ph name="ERROR_NUMBER" />)</translation>
-<translation id="6829250331733125857"><ph name="DEVICE_TYPE" /> ഉപയോഗിച്ച് സഹായം സ്വന്തമാക്കുക.</translation>
 <translation id="682971198310367122">Google സ്വകാര്യതാ നയം</translation>
 <translation id="6831043979455480757">വിവർത്തനം ചെയ്യുക</translation>
 <translation id="683373380308365518">സ്‌മാർട്ടും സുരക്ഷിതവുമായൊരു ബ്രൗസറിലേക്ക് മാറുക</translation>
diff --git a/chrome/app/resources/generated_resources_mn.xtb b/chrome/app/resources/generated_resources_mn.xtb
index 375150b..6912fc4c 100644
--- a/chrome/app/resources/generated_resources_mn.xtb
+++ b/chrome/app/resources/generated_resources_mn.xtb
@@ -394,7 +394,6 @@
 <translation id="1442851588227551435">Идэвхтэй Kerberos тасалбарыг тохируулах</translation>
 <translation id="1444628761356461360">Энэ тохиргоог төхөөрөмжийн эзэмшигч удирддаг, <ph name="OWNER_EMAIL" />.</translation>
 <translation id="144518587530125858">Энэ загварт зориулан <ph name="IMAGE_PATH" />-г татах үйлдэл амжилтгүй болсон байна.</translation>
-<translation id="1445693676523799095">Үүнд хэдэн хором шаардлагатай байж болзошгүй</translation>
 <translation id="1451375123200651445">Вэб хуудас, Нэг файл</translation>
 <translation id="1451917004835509682">Хяналттай хэрэглэгч нэмэх</translation>
 <translation id="1454223536435069390">Дэлгэцийн зураг авах</translation>
@@ -4891,7 +4890,6 @@
 <translation id="6828182567531805778">Өгөгдлөө синк хийхийн тулд нэвтрэх үгээ оруулна уу</translation>
 <translation id="682871081149631693">QuickFix</translation>
 <translation id="6828860976882136098">Бүх хэрэглэгчид зориулсан автоматаар шинэчлэх тохируулга амжилтгүй боллоо (шалгалт гүйцэтгэлийн алдаа: <ph name="ERROR_NUMBER" />)</translation>
-<translation id="6829250331733125857"><ph name="DEVICE_TYPE" /> ашиглан тусламж аваарай.</translation>
 <translation id="682971198310367122">Google-н нууцлалын бодлого</translation>
 <translation id="6831043979455480757">Хөрвүүлэх</translation>
 <translation id="683373380308365518">Ухаалаг, аюулгүй хөтөч рүү сэлгэх</translation>
diff --git a/chrome/app/resources/generated_resources_mr.xtb b/chrome/app/resources/generated_resources_mr.xtb
index bf9cca2..2c8de9f 100644
--- a/chrome/app/resources/generated_resources_mr.xtb
+++ b/chrome/app/resources/generated_resources_mr.xtb
@@ -394,7 +394,6 @@
 <translation id="1442851588227551435">अ‍ॅक्टिव्ह Kerberos तिकीट सेट करा</translation>
 <translation id="1444628761356461360">ही सेटिंग डिव्हाइस मालक, <ph name="OWNER_EMAIL" /> द्वारे व्यवस्थापित केली आहे.</translation>
 <translation id="144518587530125858">थीमसाठी '<ph name="IMAGE_PATH" />' लोड करणे शक्य नाही.</translation>
-<translation id="1445693676523799095">यासाठी थोडा वेळ लागू शकतो</translation>
 <translation id="1451375123200651445">वेबपेज, एकल फाइल</translation>
 <translation id="1451917004835509682">पर्यवेक्षी व्यक्ती जोडा</translation>
 <translation id="1454223536435069390">स्क्रीनशॉट घ्या</translation>
@@ -4895,7 +4894,6 @@
 <translation id="6828182567531805778">तुमचा डेटा सिंक करण्यासाठी तुमची पासफ्रेझ एंटर करा</translation>
 <translation id="682871081149631693">QuickFix</translation>
 <translation id="6828860976882136098">सर्व वापरकर्त्यांसाठी ऑटोमॅटिक अपडेट सेट करणे अयशस्वी झाले (पूर्वफ्लाइट अंमलबजावणी एरर: <ph name="ERROR_NUMBER" />)</translation>
-<translation id="6829250331733125857">आपल्‍या <ph name="DEVICE_TYPE" /> सह मदत मिळवा.</translation>
 <translation id="682971198310367122">Google गोपनीयता धोरण</translation>
 <translation id="6831043979455480757">भाषांतर करा</translation>
 <translation id="683373380308365518">स्मार्ट आणि सुरक्षित ब्राउझरवर बदला</translation>
diff --git a/chrome/app/resources/generated_resources_ms.xtb b/chrome/app/resources/generated_resources_ms.xtb
index 10f65ad..6ba2653 100644
--- a/chrome/app/resources/generated_resources_ms.xtb
+++ b/chrome/app/resources/generated_resources_ms.xtb
@@ -394,7 +394,6 @@
 <translation id="1442851588227551435">Tetapkan tiket Kerberos yang aktif</translation>
 <translation id="1444628761356461360">Tetapan ini diuruskan oleh pemilik peranti, <ph name="OWNER_EMAIL" />.</translation>
 <translation id="144518587530125858">Tidak dapat memuatkan '<ph name="IMAGE_PATH" />' untuk tema.</translation>
-<translation id="1445693676523799095">Persediaan ini mungkin mengambil masa yang agak lama</translation>
 <translation id="1451375123200651445">Laman Web, Fail Tunggal</translation>
 <translation id="1451917004835509682">Tambahkan Orang di Bawah Seliaan</translation>
 <translation id="1454223536435069390">A&amp;mbil tangkapan skrin</translation>
@@ -4897,7 +4896,6 @@
 <translation id="6828182567531805778">Masukkan ungkapan laluan anda untuk menyegerakkan data anda</translation>
 <translation id="682871081149631693">QuickFix</translation>
 <translation id="6828860976882136098">Gagal menyediakan kemas kini automatik untuk semua pengguna (ralat sebelum pelaksanaan: <ph name="ERROR_NUMBER" />)</translation>
-<translation id="6829250331733125857">Dapatkan bantuan berhubung <ph name="DEVICE_TYPE" /> anda.</translation>
 <translation id="682971198310367122">Dasar privasi Google</translation>
 <translation id="6831043979455480757">Terjemah</translation>
 <translation id="683373380308365518">Tukar kepada penyemak imbas yang pintar dan selamat</translation>
diff --git a/chrome/app/resources/generated_resources_my.xtb b/chrome/app/resources/generated_resources_my.xtb
index df1d178..1df9786 100644
--- a/chrome/app/resources/generated_resources_my.xtb
+++ b/chrome/app/resources/generated_resources_my.xtb
@@ -394,7 +394,6 @@
 <translation id="1442851588227551435">အသုံးပြုနေသော Kerberos လက်မှတ် သတ်မှတ်ရန်</translation>
 <translation id="1444628761356461360">ဤကြိုတင်ချိန်ညှိချက်များအား စက်ပစ္စည်း၏ ပိုင်ရှင် <ph name="OWNER_EMAIL" /> မှ စီမံသည်။</translation>
 <translation id="144518587530125858">အရောင်အဖွဲ့အတွက် '<ph name="IMAGE_PATH" />' အားဖွင့်၍မရပါ။</translation>
-<translation id="1445693676523799095">အချိန်အနည်းငယ် ကြာနိုင်သည်</translation>
 <translation id="1451375123200651445">ဝဘ်စာမျက်နှာ၊ ဖိုင် တစ်ခုတည်း</translation>
 <translation id="1451917004835509682">ကြီးကြပ်မှုခံ အသုံးပြုသူ ထည့်ရန်</translation>
 <translation id="1454223536435069390">လျှပ်&amp;တပြက် ပုံရိုက်ရန်</translation>
@@ -4895,7 +4894,6 @@
 <translation id="6828182567531805778">သင့်ဒေတာများ စင့်ခ်လုပ်ရန် သင်၏စကားဝှက်စာ ထည့်ပါ</translation>
 <translation id="682871081149631693">QuickFix</translation>
 <translation id="6828860976882136098">အသုံးပြုသူများ အားလုံးအတွက် အလိုအလျောက်အပ်ဒိတ်များ စနစထည့်သွင်းမှု ပြုလုပ်ခြင်း မအောင်မြင်ပါ (လေယာဉ်မထွက်မီ စတင်ခြင်း ချွတ်ယွင်းချက် − <ph name="ERROR_NUMBER" />)</translation>
-<translation id="6829250331733125857">သင့် <ph name="DEVICE_TYPE" /> ဖြင့်အကူအညီရယူမည်။</translation>
 <translation id="682971198310367122">Google ပုဂ္ဂိုလ်ရေးဆိုင်ရာမူဝါဒ</translation>
 <translation id="6831043979455480757">ဘာသာပြန်ရန်</translation>
 <translation id="683373380308365518">ပါးနပ်ပြီး လုံခြုံမှုရှိသော ဘရောင်ဇာသို့ ပြောင်းလိုက်ပါ</translation>
diff --git a/chrome/app/resources/generated_resources_ne.xtb b/chrome/app/resources/generated_resources_ne.xtb
index 0f52ace5..28064e38 100644
--- a/chrome/app/resources/generated_resources_ne.xtb
+++ b/chrome/app/resources/generated_resources_ne.xtb
@@ -392,7 +392,6 @@
 <translation id="1442851588227551435">Kerberos को सक्रिय टिकट सेट गर्नुहोस्</translation>
 <translation id="1444628761356461360">यो सेटिङ यन्त्रको मालिक, <ph name="OWNER_EMAIL" /> द्वारा व्यवस्थत छ।</translation>
 <translation id="144518587530125858">विषयवस्तुको लागि '<ph name="IMAGE_PATH" />' लोड गर्न सकिएन।</translation>
-<translation id="1445693676523799095">यो कार्य गर्न केही बेर लाग्न सक्छ</translation>
 <translation id="1451375123200651445">वेबपेज, एकल फाइल</translation>
 <translation id="1451917004835509682">निर्देशित व्यक्ति थप्नुहोस्</translation>
 <translation id="1454223536435069390">स्क्रिसट लि&amp;नुहोस्</translation>
@@ -4892,7 +4891,6 @@
 <translation id="6828182567531805778">आफ्नो डेटा सिंक गर्न आफ्नो पासफ्रेज प्रविष्टि गर्नुहोस्</translation>
 <translation id="682871081149631693">QuickFix</translation>
 <translation id="6828860976882136098">सबै प्रयोगकर्ताहरूका लागि स्वचालित अद्यावधिकहरूलाई सेटअप गर्न सकिएन (प्रिफ्लाइट कार्यान्वयन सम्बन्धी त्रुटि: <ph name="ERROR_NUMBER" />)</translation>
-<translation id="6829250331733125857">तपाईँको <ph name="DEVICE_TYPE" /> मार्फत मद्दत प्राप्त गर्नुहोस्।</translation>
 <translation id="682971198310367122">Google को गोपनीयता नीति</translation>
 <translation id="6831043979455480757">अनुवाद गर्नुहोस्</translation>
 <translation id="683373380308365518">कुनै स्मार्ट तथा सुरक्षित ब्राउजरमा बदल्नुहोस्</translation>
diff --git a/chrome/app/resources/generated_resources_nl.xtb b/chrome/app/resources/generated_resources_nl.xtb
index bad547f..8a49581f 100644
--- a/chrome/app/resources/generated_resources_nl.xtb
+++ b/chrome/app/resources/generated_resources_nl.xtb
@@ -394,7 +394,6 @@
 <translation id="1442851588227551435">Actief Kerberos-ticket instellen</translation>
 <translation id="1444628761356461360">Deze instelling wordt beheerd door de eigenaar van het apparaat, <ph name="OWNER_EMAIL" />.</translation>
 <translation id="144518587530125858">Kan '<ph name="IMAGE_PATH" />' niet laden voor thema.</translation>
-<translation id="1445693676523799095">Dit kan even duren</translation>
 <translation id="1451375123200651445">Webpagina, één bestand</translation>
 <translation id="1451917004835509682">Persoon met beperkte rechten toevoegen</translation>
 <translation id="1454223536435069390">&amp;Screenshot maken</translation>
@@ -4897,7 +4896,6 @@
 <translation id="6828182567531805778">Voer je wachtwoordzin in om je gegevens te synchroniseren</translation>
 <translation id="682871081149631693">QuickFix</translation>
 <translation id="6828860976882136098">Kan automatische updates niet instellen voor alle gebruikers (uitvoeringsfout bij pre-flight-procedure: <ph name="ERROR_NUMBER" />)</translation>
-<translation id="6829250331733125857">Ontvang hulp bij je <ph name="DEVICE_TYPE" />.</translation>
 <translation id="682971198310367122">Privacybeleid van Google</translation>
 <translation id="6831043979455480757">Vertalen</translation>
 <translation id="683373380308365518">Overschakelen naar een slimme, beveiligde browser</translation>
diff --git a/chrome/app/resources/generated_resources_no.xtb b/chrome/app/resources/generated_resources_no.xtb
index fc2cd29..ccac10c 100644
--- a/chrome/app/resources/generated_resources_no.xtb
+++ b/chrome/app/resources/generated_resources_no.xtb
@@ -394,7 +394,6 @@
 <translation id="1442851588227551435">Angi aktiv Kerberos-sak</translation>
 <translation id="1444628761356461360">Denne innstillingen administreres av enhetseieren, <ph name="OWNER_EMAIL" /> .</translation>
 <translation id="144518587530125858">Kan ikke laste inn <ph name="IMAGE_PATH" /> for tema.</translation>
-<translation id="1445693676523799095">Dette kan ta en stund</translation>
 <translation id="1451375123200651445">Nettside – enkeltfil</translation>
 <translation id="1451917004835509682">Legg til en administrert person</translation>
 <translation id="1454223536435069390">Ta en skjermdump</translation>
@@ -4892,7 +4891,6 @@
 <translation id="6828182567531805778">Skriv inn passordfrasen for å synkronisere dataene dine</translation>
 <translation id="682871081149631693">QuickFix</translation>
 <translation id="6828860976882136098">Kunne ikke konfigurere automatiske oppdateringer for alle brukerne (feil ved kjøring av forhåndskontroll: <ph name="ERROR_NUMBER" />)</translation>
-<translation id="6829250331733125857">Få hjelp med <ph name="DEVICE_TYPE" />.</translation>
 <translation id="682971198310367122">Googles personvernregler</translation>
 <translation id="6831043979455480757">Oversett</translation>
 <translation id="683373380308365518">Bytt til en smart og sikker nettleser</translation>
diff --git a/chrome/app/resources/generated_resources_or.xtb b/chrome/app/resources/generated_resources_or.xtb
index 5ac07cb..859dd548 100644
--- a/chrome/app/resources/generated_resources_or.xtb
+++ b/chrome/app/resources/generated_resources_or.xtb
@@ -393,7 +393,6 @@
 <translation id="1442851588227551435">ସକ୍ରିୟ Kerberos ଟିକେଟ୍ ସେଟ୍ କରନ୍ତୁ</translation>
 <translation id="1444628761356461360">ଡିଭାଇସ୍ ମାଲିକ, <ph name="OWNER_EMAIL" />ଙ୍କ ଦ୍ୱାରା.ଏହି ସେଟିଂ ପରିଚାଳନା କରାଯାଉଛି।</translation>
 <translation id="144518587530125858">ଥିମ୍ ପାଇଁ '<ph name="IMAGE_PATH" />'କୁ ଲୋଡ୍ କରାଯାଇପାରିଲା ନାହିଁ।</translation>
-<translation id="1445693676523799095">ଏଥିପାଇଁ ହୁଏତ କିଛି ସମୟ ଲାଗିପାରେ</translation>
 <translation id="1451375123200651445">ୱେବ୍‍ପୃଷ୍ଠା, ଗୋଟିଏ ଫାଇଲ୍</translation>
 <translation id="1451917004835509682">ପର୍ଯ୍ୟବେକ୍ଷିତ ବ୍ୟକ୍ତିଙ୍କୁ ଯୋଗ କରନ୍ତୁ</translation>
 <translation id="1454223536435069390">ସ୍କ୍ରିନ୍‌ସଟ୍ ନି&amp;ଅନ୍ତୁ</translation>
@@ -4890,7 +4889,6 @@
 <translation id="6828182567531805778">ଆପଣଙ୍କର ଡାଟା ସିଙ୍କ୍ କରିବାକୁ ଆପଣଙ୍କର ପାସ୍‌ଫ୍ରେଜ୍ ଲେଖନ୍ତୁ</translation>
 <translation id="682871081149631693">QuickFix</translation>
 <translation id="6828860976882136098">ସମସ୍ତ ଉପଯୋଗକର୍ତ୍ତାଙ୍କ ପାଇଁ ସ୍ୱଚାଳିତ ଅପ୍‌ଡେଟ୍ ସେଟ୍‍ ଅପ୍ ବିଫଳ ହୋଇଛି (preflight ନିର୍ବାହରେ ତ୍ରୁଟି: <ph name="ERROR_NUMBER" />)</translation>
-<translation id="6829250331733125857">ଆପଣଙ୍କର <ph name="DEVICE_TYPE" />.ମାଧ୍ୟମରେ ସାହାଯ୍ୟ ପାଆନ୍ତୁ।</translation>
 <translation id="682971198310367122">Google ଗୋପନୀୟତା ନୀତି</translation>
 <translation id="6831043979455480757">ଅନୁବାଦ କରନ୍ତୁ</translation>
 <translation id="683373380308365518">ଏକ ସ୍ମାର୍ଟ ଏବଂ ସୁରକ୍ଷିତ ବ୍ରାଉଜର୍‌କୁ ସ୍ୱିଚ୍ କରନ୍ତୁ</translation>
diff --git a/chrome/app/resources/generated_resources_pa.xtb b/chrome/app/resources/generated_resources_pa.xtb
index a590cc8d..4e0e448a6 100644
--- a/chrome/app/resources/generated_resources_pa.xtb
+++ b/chrome/app/resources/generated_resources_pa.xtb
@@ -394,7 +394,6 @@
 <translation id="1442851588227551435">Kerberos ਟਿਕਟ ਨੂੰ ਕਿਰਿਆਸ਼ੀਲ 'ਤੇ ਸੈੱਟ ਕਰੋ</translation>
 <translation id="1444628761356461360">ਇਹ ਸੈਟਿੰਗ ਡੀਵਾਈਸ ਮਾਲਕ <ph name="OWNER_EMAIL" /> ਵੱਲੋਂ ਪ੍ਰਬੰਧਿਤ ਕੀਤੀ ਜਾਂਦੀ ਹੈ।</translation>
 <translation id="144518587530125858">ਥੀਮ ਲਈ '<ph name="IMAGE_PATH" />' ਨੂੰ ਲੋਡ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ।</translation>
-<translation id="1445693676523799095">ਇਸ ਵਿੱਚ ਕੁਝ ਸਮਾਂ ਲੱਗ ਸਕਦਾ ਹੈ</translation>
 <translation id="1451375123200651445">ਵੈਬਪੇਜ, ਸਿੰਗਲ ਫਾਈਲ</translation>
 <translation id="1451917004835509682">ਨਿਰੀਖਣ ਕੀਤਾ ਵਿਅਕਤੀ ਜੋੜੋ</translation>
 <translation id="1454223536435069390">ਸਕ੍ਰੀਨਸ਼ਾਟ ਲ&amp;ਵੋ</translation>
@@ -4895,7 +4894,6 @@
 <translation id="6828182567531805778">ਆਪਣੇ ਡਾਟੇ ਦਾ ਸਮਕਾਲੀਕਰਨ ਕਰਨ ਲਈ ਆਪਣਾ ਪਾਸਫਰੇਜ਼ ਦਾਖਲ ਕਰੋ</translation>
 <translation id="682871081149631693">ਝੱਟ ਹੱਲ ਵਾਲਾ ਬਿਲਡ</translation>
 <translation id="6828860976882136098">ਸਾਰੇ ਵਰਤੋਂਕਾਰਾਂ ਲਈ ਸਵੈਚਾਲਿਤ ਅੱਪਡੇਟਾਂ ਨੂੰ ਸਥਾਪਤ ਕਰਨਾ ਅਸਫਲ ਰਿਹਾ (ਪ੍ਰੀਫਲਾਈਟ ਤਾਮੀਲ ਗੜਬੜ: <ph name="ERROR_NUMBER" />)</translation>
-<translation id="6829250331733125857">ਆਪਣੇ <ph name="DEVICE_TYPE" /> ਨਾਲ ਸਹਾਇਤਾ ਪ੍ਰਾਪਤ ਕਰੋ।</translation>
 <translation id="682971198310367122">Google ਪਰਦੇਦਾਰੀ ਨੀਤੀ</translation>
 <translation id="6831043979455480757">ਅਨੁਵਾਦ ਕਰੋ</translation>
 <translation id="683373380308365518">ਸਮਾਰਟ ਅਤੇ ਸੁਰੱਖਿਅਤ ਬ੍ਰਾਊਜ਼ਰ 'ਤੇ ਸਵਿੱਚ ਕਰੋ</translation>
diff --git a/chrome/app/resources/generated_resources_pl.xtb b/chrome/app/resources/generated_resources_pl.xtb
index 8ba7102..7a499ce7 100644
--- a/chrome/app/resources/generated_resources_pl.xtb
+++ b/chrome/app/resources/generated_resources_pl.xtb
@@ -394,7 +394,6 @@
 <translation id="1442851588227551435">Ustawianie aktywnego biletu Kerberos</translation>
 <translation id="1444628761356461360">Tym urządzeniem zarządza właściciel urządzenia: <ph name="OWNER_EMAIL" />.</translation>
 <translation id="144518587530125858">Nie można wczytać ścieżki „<ph name="IMAGE_PATH" />” dla motywu.</translation>
-<translation id="1445693676523799095">To może chwilę potrwać</translation>
 <translation id="1451375123200651445">Strona internetowa, pojedynczy plik</translation>
 <translation id="1451917004835509682">Dodaj nadzorowaną osobę</translation>
 <translation id="1454223536435069390">Wykon&amp;aj zrzut ekranu</translation>
@@ -4893,7 +4892,6 @@
 <translation id="6828182567531805778">Aby synchronizować dane, wpisz hasło</translation>
 <translation id="682871081149631693">QuickFix</translation>
 <translation id="6828860976882136098">Nie można skonfigurować automatycznych aktualizacji dla wszystkich użytkowników (błąd wykonania procesu wstępnego: <ph name="ERROR_NUMBER" />)</translation>
-<translation id="6829250331733125857">Uzyskaj pomoc związaną z urządzeniem <ph name="DEVICE_TYPE" />.</translation>
 <translation id="682971198310367122">Polityka prywatności Google</translation>
 <translation id="6831043979455480757">Tłumacz</translation>
 <translation id="683373380308365518">Przejdź na inteligentną i bezpieczną przeglądarkę</translation>
diff --git a/chrome/app/resources/generated_resources_pt-BR.xtb b/chrome/app/resources/generated_resources_pt-BR.xtb
index 5880e3b..e76a8cb8 100644
--- a/chrome/app/resources/generated_resources_pt-BR.xtb
+++ b/chrome/app/resources/generated_resources_pt-BR.xtb
@@ -394,7 +394,6 @@
 <translation id="1442851588227551435">Definir um tíquete ativo do Kerberos</translation>
 <translation id="1444628761356461360">Esta configuração é gerenciada pelo proprietário do dispositivo, <ph name="OWNER_EMAIL" />.</translation>
 <translation id="144518587530125858">Não foi possível carregar "<ph name="IMAGE_PATH" />" para o tema.</translation>
-<translation id="1445693676523799095">Isso pode demorar um pouco</translation>
 <translation id="1451375123200651445">Página da Web, arquivo único</translation>
 <translation id="1451917004835509682">Adicionar pessoa supervisionada</translation>
 <translation id="1454223536435069390">T&amp;irar captura de tela</translation>
@@ -4900,7 +4899,6 @@
 <translation id="6828182567531805778">Insira a senha longa para sincronizar seus dados</translation>
 <translation id="682871081149631693">QuickFix</translation>
 <translation id="6828860976882136098">Falha ao configurar atualizações automáticas para todos os usuários (erro de execução de simulação: <ph name="ERROR_NUMBER" />)</translation>
-<translation id="6829250331733125857">Receber ajuda para o <ph name="DEVICE_TYPE" />.</translation>
 <translation id="682971198310367122">Política de privacidade do Google</translation>
 <translation id="6831043979455480757">Traduzir</translation>
 <translation id="683373380308365518">Mudar para um navegador inteligente e seguro</translation>
diff --git a/chrome/app/resources/generated_resources_pt-PT.xtb b/chrome/app/resources/generated_resources_pt-PT.xtb
index ef3a27b..084631b 100644
--- a/chrome/app/resources/generated_resources_pt-PT.xtb
+++ b/chrome/app/resources/generated_resources_pt-PT.xtb
@@ -394,7 +394,6 @@
 <translation id="1442851588227551435">Definir permissão Kerberos ativa</translation>
 <translation id="1444628761356461360">Esta definição é gerida pelo proprietário do dispositivo, <ph name="OWNER_EMAIL" />.</translation>
 <translation id="144518587530125858">Não foi possível carregar "<ph name="IMAGE_PATH" />" para o tema.</translation>
-<translation id="1445693676523799095">Isto poderá demorar algum tempo.</translation>
 <translation id="1451375123200651445">Página Web, Ficheiro único</translation>
 <translation id="1451917004835509682">Adicionar pessoa supervisionada</translation>
 <translation id="1454223536435069390">C&amp;riar captura de ecrã</translation>
@@ -4898,7 +4897,6 @@
 <translation id="6828182567531805778">Introduzir a frase de acesso para sincronizar os dados</translation>
 <translation id="682871081149631693">QuickFix</translation>
 <translation id="6828860976882136098">Falha ao configurar atualizações automáticas para todos os utilizadores (erro de execução da verificação prévia: <ph name="ERROR_NUMBER" />)</translation>
-<translation id="6829250331733125857">Obtenha ajuda com o <ph name="DEVICE_TYPE" />.</translation>
 <translation id="682971198310367122">Política de privacidade da Google</translation>
 <translation id="6831043979455480757">Traduzir</translation>
 <translation id="683373380308365518">Mude para um navegador inteligente e seguro</translation>
diff --git a/chrome/app/resources/generated_resources_ro.xtb b/chrome/app/resources/generated_resources_ro.xtb
index 6d529eda..4c4990f 100644
--- a/chrome/app/resources/generated_resources_ro.xtb
+++ b/chrome/app/resources/generated_resources_ro.xtb
@@ -394,7 +394,6 @@
 <translation id="1442851588227551435">Setează tichetul Kerberos activ</translation>
 <translation id="1444628761356461360">Această setare este gestionată de proprietarul dispozitivului, <ph name="OWNER_EMAIL" />.</translation>
 <translation id="144518587530125858">Nu se poate încărca „<ph name="IMAGE_PATH" />” pentru temă.</translation>
-<translation id="1445693676523799095">Poate dura un timp</translation>
 <translation id="1451375123200651445">Pagină web, un singur fișier</translation>
 <translation id="1451917004835509682">Adaugă o persoană monitorizată</translation>
 <translation id="1454223536435069390">F&amp;aceți o captură de ecran</translation>
@@ -4897,7 +4896,6 @@
 <translation id="6828182567531805778">Introdu expresia de acces pentru a sincroniza datele</translation>
 <translation id="682871081149631693">QuickFix</translation>
 <translation id="6828860976882136098">Actualizările automate nu au putut fi configurate pentru toți utilizatorii (eroare la executarea testării pe dispozitiv: <ph name="ERROR_NUMBER" />)</translation>
-<translation id="6829250331733125857">Primește ajutor în privința <ph name="DEVICE_TYPE" />.</translation>
 <translation id="682971198310367122">Politica de confidențialitate Google</translation>
 <translation id="6831043979455480757">Tradu</translation>
 <translation id="683373380308365518">Comută la un browser inteligent și securizat</translation>
diff --git a/chrome/app/resources/generated_resources_ru.xtb b/chrome/app/resources/generated_resources_ru.xtb
index 498649f..0399477 100644
--- a/chrome/app/resources/generated_resources_ru.xtb
+++ b/chrome/app/resources/generated_resources_ru.xtb
@@ -394,7 +394,6 @@
 <translation id="1442851588227551435">Задать активный билет Kerberos</translation>
 <translation id="1444628761356461360">Этот аккаунт контролируется владельцем устройства (<ph name="OWNER_EMAIL" />)</translation>
 <translation id="144518587530125858">Не удалось загрузить "<ph name="IMAGE_PATH" />" для темы.</translation>
-<translation id="1445693676523799095">Это может занять несколько минут</translation>
 <translation id="1451375123200651445">Веб-страница, один файл</translation>
 <translation id="1451917004835509682">Добавить управляемый профиль</translation>
 <translation id="1454223536435069390">С&amp;делать снимок экрана</translation>
@@ -4895,7 +4894,6 @@
 <translation id="6828182567531805778">Чтобы синхронизировать данные, введите кодовую фразу</translation>
 <translation id="682871081149631693">QuickFix</translation>
 <translation id="6828860976882136098">Не удалось настроить автоматические обновления для всех пользователей (ошибка <ph name="ERROR_NUMBER" />)</translation>
-<translation id="6829250331733125857">Помощь в работе с устройством <ph name="DEVICE_TYPE" /></translation>
 <translation id="682971198310367122">Политика конфиденциальности Google</translation>
 <translation id="6831043979455480757">Перевести</translation>
 <translation id="683373380308365518">Перейдите на умный и безопасный браузер</translation>
diff --git a/chrome/app/resources/generated_resources_si.xtb b/chrome/app/resources/generated_resources_si.xtb
index 7d19970f..7722750 100644
--- a/chrome/app/resources/generated_resources_si.xtb
+++ b/chrome/app/resources/generated_resources_si.xtb
@@ -394,7 +394,6 @@
 <translation id="1442851588227551435">ක්‍රියාකාරී Kerberos ප්‍රවේශපත්‍රය සකසන්න</translation>
 <translation id="1444628761356461360">උපාංග හිමිකරු විසින් සැකසුම් කළමනාකරණය කර ඇත, <ph name="OWNER_EMAIL" />.</translation>
 <translation id="144518587530125858">තේමාව සඳහා '<ph name="IMAGE_PATH" />' ප්‍රවේශනය කළ නොහැකි විය.</translation>
-<translation id="1445693676523799095">මෙයට යම් කාලයක් ගත විය හැක</translation>
 <translation id="1451375123200651445">වෙබ් පිටුව, තනි ගොනුව</translation>
 <translation id="1451917004835509682">අධීක්ෂණය කළ පුද්ගලයා එක් කරන්න</translation>
 <translation id="1454223536435069390">තිරපිටපතක් ලබාගන්න (&amp;a)</translation>
@@ -4894,7 +4893,6 @@
 <translation id="6828182567531805778">ඔබේ දත්ත සමමුහූර්ත කිරීමට ඔබේ මුර වැකිකඩ ඇතුළත් කරන්න</translation>
 <translation id="682871081149631693">QuickFix</translation>
 <translation id="6828860976882136098">සියළු පරිශීලකයන් සඳහා ස්වයංක්‍රීය යාවත්කාලීන කිරීම අසාර්ථක වුණි (ක්‍රියාත්මක කිරීමට පෙර දෝෂය: <ph name="ERROR_NUMBER" />)</translation>
-<translation id="6829250331733125857">ඔබගේ <ph name="DEVICE_TYPE" /> සමගින් උදවු ලබා ගන්න.</translation>
 <translation id="682971198310367122">Google රහස්‍යතා ප්‍රතිපත්තිය</translation>
 <translation id="6831043979455480757">පරිවර්තනය කරන්න</translation>
 <translation id="683373380308365518">බුද්ධිමත් සහ සුරක්ෂිත බ්‍රව්සරයකට මාරු වන්න</translation>
diff --git a/chrome/app/resources/generated_resources_sk.xtb b/chrome/app/resources/generated_resources_sk.xtb
index 6c099fc..b51ba4cc 100644
--- a/chrome/app/resources/generated_resources_sk.xtb
+++ b/chrome/app/resources/generated_resources_sk.xtb
@@ -394,7 +394,6 @@
 <translation id="1442851588227551435">Nastaviť aktívny tiket Kerberos</translation>
 <translation id="1444628761356461360">Toto nastavenie spravuje vlastník zariadenia <ph name="OWNER_EMAIL" />.</translation>
 <translation id="144518587530125858">Súbor „<ph name="IMAGE_PATH" />“ sa pre motív nepodarilo načítať.</translation>
-<translation id="1445693676523799095">Môže to chvíľu trvať</translation>
 <translation id="1451375123200651445">Webová stránka, jeden súbor</translation>
 <translation id="1451917004835509682">Pridať kontrolovanú osobu</translation>
 <translation id="1454223536435069390">&amp;Vytvoriť snímku obrazovky</translation>
@@ -4896,7 +4895,6 @@
 <translation id="6828182567531805778">Ak chcete synchronizovať svoje údaje, zadajte prístupovú frázu</translation>
 <translation id="682871081149631693">QuickFix</translation>
 <translation id="6828860976882136098">Nepodarilo sa nastaviť automatické aktualizácie pre všetkých používateľov (chyba pri vykonávaní predbežnej kontroly: <ph name="ERROR_NUMBER" />)</translation>
-<translation id="6829250331733125857">Získajte pomoc so zariadením <ph name="DEVICE_TYPE" />.</translation>
 <translation id="682971198310367122">Pravidlá ochrany súkromia Google</translation>
 <translation id="6831043979455480757">Preložiť</translation>
 <translation id="683373380308365518">Prepnite na inteligentný a bezpečný prehliadač</translation>
diff --git a/chrome/app/resources/generated_resources_sl.xtb b/chrome/app/resources/generated_resources_sl.xtb
index ebbf04e..a85df998 100644
--- a/chrome/app/resources/generated_resources_sl.xtb
+++ b/chrome/app/resources/generated_resources_sl.xtb
@@ -394,7 +394,6 @@
 <translation id="1442851588227551435">Nastavitev aktivnega kartončka za Kerberos</translation>
 <translation id="1444628761356461360">To nastavitev upravlja lastnik naprave <ph name="OWNER_EMAIL" />.</translation>
 <translation id="144518587530125858">Ni bilo mogoče naložiti slike »<ph name="IMAGE_PATH" />« za temo.</translation>
-<translation id="1445693676523799095">To lahko traja nekaj časa</translation>
 <translation id="1451375123200651445">Spletna stran, ena datoteka</translation>
 <translation id="1451917004835509682">Dodajanje zaščitene osebe</translation>
 <translation id="1454223536435069390">N&amp;aredi posnetek zaslona</translation>
@@ -4899,7 +4898,6 @@
 <translation id="6828182567531805778">Če želite sinhronizirati podatke, vnesite geslo</translation>
 <translation id="682871081149631693">QuickFix</translation>
 <translation id="6828860976882136098">Nastavitev samodejnih posodobitev za vse uporabnike ni uspela (napaka preverjanj pred izvajanjem: <ph name="ERROR_NUMBER" />)</translation>
-<translation id="6829250331733125857">Poiščite pomoč za napravo <ph name="DEVICE_TYPE" />.</translation>
 <translation id="682971198310367122">Googlov pravilnik o zasebnosti</translation>
 <translation id="6831043979455480757">Prevedi</translation>
 <translation id="683373380308365518">Preklop na pametni in varni brskalnik</translation>
diff --git a/chrome/app/resources/generated_resources_sq.xtb b/chrome/app/resources/generated_resources_sq.xtb
index 38d3f0e..9a10212 100644
--- a/chrome/app/resources/generated_resources_sq.xtb
+++ b/chrome/app/resources/generated_resources_sq.xtb
@@ -394,7 +394,6 @@
 <translation id="1442851588227551435">Cakto biletë aktive Kerberos</translation>
 <translation id="1444628761356461360">Ky cilësim menaxhohet nga zotëruesi i pajisjes, <ph name="OWNER_EMAIL" /></translation>
 <translation id="144518587530125858">Nuk mundi të ngarkonte "<ph name="IMAGE_PATH" />" për temën.</translation>
-<translation id="1445693676523799095">Kjo mund të zgjasë pak</translation>
 <translation id="1451375123200651445">Faqja e uebit, një skedar i vetëm</translation>
 <translation id="1451917004835509682">Shto një person të kontrolluar</translation>
 <translation id="1454223536435069390">&amp;Nxirr një pamje të ekranit</translation>
@@ -4894,7 +4893,6 @@
 <translation id="6828182567531805778">Fut frazën e kalimit për të sinkronizuar të dhënat</translation>
 <translation id="682871081149631693">QuickFix</translation>
 <translation id="6828860976882136098">Dështoi në konfigurimin e përditësimeve automatike për të gjithë përdoruesit (gabimi i ekzekutimit të kontrollit përfundimtar: <ph name="ERROR_NUMBER" />)</translation>
-<translation id="6829250331733125857">Merr ndihmë për pajisjen <ph name="DEVICE_TYPE" />.</translation>
 <translation id="682971198310367122">Politika e privatësisë së Google</translation>
 <translation id="6831043979455480757">Përkthe</translation>
 <translation id="683373380308365518">Kalo te një shfletues inteligjent dhe i sigurt</translation>
diff --git a/chrome/app/resources/generated_resources_sr-Latn.xtb b/chrome/app/resources/generated_resources_sr-Latn.xtb
index 09a8c73..ad4490d 100644
--- a/chrome/app/resources/generated_resources_sr-Latn.xtb
+++ b/chrome/app/resources/generated_resources_sr-Latn.xtb
@@ -394,7 +394,6 @@
 <translation id="1442851588227551435">Podesite aktivan Kerberos tiket</translation>
 <translation id="1444628761356461360">Ovim podešavanjem upravlja vlasnik uređaja, <ph name="OWNER_EMAIL" />.</translation>
 <translation id="144518587530125858">Nije moguće učitati „<ph name="IMAGE_PATH" />“ za temu.</translation>
-<translation id="1445693676523799095">Ovo može da potraje</translation>
 <translation id="1451375123200651445">Veb-stranica, jedna datoteka</translation>
 <translation id="1451917004835509682">Dodaj osobu pod nadzorom</translation>
 <translation id="1454223536435069390">S&amp;nimi ekran</translation>
@@ -4895,7 +4894,6 @@
 <translation id="6828182567531805778">Unesite pristupnu frazu da biste sinhronizovali podatke</translation>
 <translation id="682871081149631693">Brzo rešavanje problema</translation>
 <translation id="6828860976882136098">Podešavanje automatskih ažuriranja za sve korisnike nije uspelo (greška izvršavanja pri proveri: <ph name="ERROR_NUMBER" />)</translation>
-<translation id="6829250331733125857">Potražite pomoć za <ph name="DEVICE_TYPE" />.</translation>
 <translation id="682971198310367122">Google politika privatnosti</translation>
 <translation id="6831043979455480757">Prevedi</translation>
 <translation id="683373380308365518">Pređite na pametan i bezbedan pregledač</translation>
diff --git a/chrome/app/resources/generated_resources_sr.xtb b/chrome/app/resources/generated_resources_sr.xtb
index 2de91363..11e3906 100644
--- a/chrome/app/resources/generated_resources_sr.xtb
+++ b/chrome/app/resources/generated_resources_sr.xtb
@@ -394,7 +394,6 @@
 <translation id="1442851588227551435">Подесите активан Kerberos тикет</translation>
 <translation id="1444628761356461360">Овим подешавањем управља власник уређаја, <ph name="OWNER_EMAIL" />.</translation>
 <translation id="144518587530125858">Није могуће учитати „<ph name="IMAGE_PATH" />“ за тему.</translation>
-<translation id="1445693676523799095">Ово може да потраје</translation>
 <translation id="1451375123200651445">Веб-страница, једна датотека</translation>
 <translation id="1451917004835509682">Додај особу под надзором</translation>
 <translation id="1454223536435069390">С&amp;ними екран</translation>
@@ -4895,7 +4894,6 @@
 <translation id="6828182567531805778">Унесите приступну фразу да бисте синхронизовали податке</translation>
 <translation id="682871081149631693">Брзо решавање проблема</translation>
 <translation id="6828860976882136098">Подешавање аутоматских ажурирања за све кориснике није успело (грешка извршавања при провери: <ph name="ERROR_NUMBER" />)</translation>
-<translation id="6829250331733125857">Потражите помоћ за <ph name="DEVICE_TYPE" />.</translation>
 <translation id="682971198310367122">Google политика приватности</translation>
 <translation id="6831043979455480757">Преведи</translation>
 <translation id="683373380308365518">Пређите на паметан и безбедан прегледач</translation>
diff --git a/chrome/app/resources/generated_resources_sv.xtb b/chrome/app/resources/generated_resources_sv.xtb
index f60eeaf..57fc921 100644
--- a/chrome/app/resources/generated_resources_sv.xtb
+++ b/chrome/app/resources/generated_resources_sv.xtb
@@ -394,7 +394,6 @@
 <translation id="1442851588227551435">Konfigurera aktiv Kerberos-biljett</translation>
 <translation id="1444628761356461360">Den här inställningen hanteras av enhetens ägare, <ph name="OWNER_EMAIL" />.</translation>
 <translation id="144518587530125858">Det gick inte att läsa in <ph name="IMAGE_PATH" /> för temat.</translation>
-<translation id="1445693676523799095">Det här kan ta en stund</translation>
 <translation id="1451375123200651445">Webbsida, en enda fil</translation>
 <translation id="1451917004835509682">Lägg till kontrollerad person</translation>
 <translation id="1454223536435069390">T&amp;a en skärmdump</translation>
@@ -4897,7 +4896,6 @@
 <translation id="6828182567531805778">Ange lösenfrasen för att synkronisera data</translation>
 <translation id="682871081149631693">QuickFix</translation>
 <translation id="6828860976882136098">Det gick inte att konfigurera automatiska uppdateringar för alla användare (preliminärt körningsfel: <ph name="ERROR_NUMBER" />)</translation>
-<translation id="6829250331733125857">Få hjälp med din <ph name="DEVICE_TYPE" />.</translation>
 <translation id="682971198310367122">Googles sekretesspolicy</translation>
 <translation id="6831043979455480757">Översätt</translation>
 <translation id="683373380308365518">Byt till en smart och säker webbläsare</translation>
diff --git a/chrome/app/resources/generated_resources_sw.xtb b/chrome/app/resources/generated_resources_sw.xtb
index e42e71f..ee0048b1 100644
--- a/chrome/app/resources/generated_resources_sw.xtb
+++ b/chrome/app/resources/generated_resources_sw.xtb
@@ -394,7 +394,6 @@
 <translation id="1442851588227551435">Weka mipangilio ya tiketi ya Kerberos inayotumika</translation>
 <translation id="1444628761356461360">Mpangilio huu unasimamiwa na mmiliki wa kifaa, <ph name="OWNER_EMAIL" />.</translation>
 <translation id="144518587530125858">'<ph name="IMAGE_PATH" />' haikuweza kupakiwa kwa mandhari.</translation>
-<translation id="1445693676523799095">Shughuli hii inaweza kuchukua muda</translation>
 <translation id="1451375123200651445">Ukurasa wa wavuti, Faili Moja</translation>
 <translation id="1451917004835509682">Ongeza Mtu Anayesimamiwa</translation>
 <translation id="1454223536435069390">Piga picha ya skrini</translation>
@@ -4892,7 +4891,6 @@
 <translation id="6828182567531805778">Andika kauli yako ya siri ili usawazishe data yako</translation>
 <translation id="682871081149631693">Kurekebisha kwa Haraka</translation>
 <translation id="6828860976882136098">Imeshindwa kuweka mipangilio ya masasisho ya kiotomatiki kwa watumiaji wote (hitilafu ya kutoweka vipengele vya kabla vinayohitajika: <ph name="ERROR_NUMBER" />)</translation>
-<translation id="6829250331733125857">Pata usaidizi wa <ph name="DEVICE_TYPE" /> yako.</translation>
 <translation id="682971198310367122">Sera ya faragha ya Google</translation>
 <translation id="6831043979455480757">Tafsiri</translation>
 <translation id="683373380308365518">Badilisha ili utumie kivinjari mahiri na salama</translation>
diff --git a/chrome/app/resources/generated_resources_ta.xtb b/chrome/app/resources/generated_resources_ta.xtb
index 002c630..e94094e 100644
--- a/chrome/app/resources/generated_resources_ta.xtb
+++ b/chrome/app/resources/generated_resources_ta.xtb
@@ -394,7 +394,6 @@
 <translation id="1442851588227551435">செயலில் உள்ள Kerberos டிக்கெட்டை அமைத்தல்</translation>
 <translation id="1444628761356461360">இந்த அமைப்பானது சாதனத்தின் உரிமையாளரால் <ph name="OWNER_EMAIL" /> நிர்வகிக்கப்படுகிறது.</translation>
 <translation id="144518587530125858">தீமிற்காக '<ph name="IMAGE_PATH" />' ஐ ஏற்ற முடியவில்லை.</translation>
-<translation id="1445693676523799095">இதற்குச் சிறிது நேரம் ஆகலாம்</translation>
 <translation id="1451375123200651445">இணையப்பக்கம், ஒற்றைக் கோப்பு</translation>
 <translation id="1451917004835509682">மேற்பார்வையிடப்படும் பயனரைச் சேர்</translation>
 <translation id="1454223536435069390">ஸ்கிரீன் ஷாட்டை எடு</translation>
@@ -4898,7 +4897,6 @@
 <translation id="6828182567531805778">உங்கள் தரவை ஒத்திசைக்க கடவுச்சொற்றொடரை உள்ளிடவும்</translation>
 <translation id="682871081149631693">QuickFix</translation>
 <translation id="6828860976882136098">அனைத்து பயனர்களுக்கும் தானியங்கு புதுப்பிப்புகளை அமைக்க முடியவில்லை (ப்ரீஃபிளைட் செயலாக்கப் பிழை: <ph name="ERROR_NUMBER" />)</translation>
-<translation id="6829250331733125857">உங்கள் <ph name="DEVICE_TYPE" /> இல் உதவி பெறவும்.</translation>
 <translation id="682971198310367122">Google தனியுரிமைக் கொள்கை</translation>
 <translation id="6831043979455480757">மொழிபெயர்</translation>
 <translation id="683373380308365518">ஸ்மார்ட்டான, பாதுகாப்பான உலாவிக்கு மாறவும்</translation>
diff --git a/chrome/app/resources/generated_resources_te.xtb b/chrome/app/resources/generated_resources_te.xtb
index 55d61d6..118c67d4 100644
--- a/chrome/app/resources/generated_resources_te.xtb
+++ b/chrome/app/resources/generated_resources_te.xtb
@@ -394,7 +394,6 @@
 <translation id="1442851588227551435">యాక్టివ్ Kerberos టిక్కెట్‌ను సెట్ చేయండి</translation>
 <translation id="1444628761356461360">ఈ సెట్టింగ్‌ను పరికరం యజమాని అయిన <ph name="OWNER_EMAIL" /> నిర్వహిస్తున్నారు.</translation>
 <translation id="144518587530125858">థీమ్ కోసం '<ph name="IMAGE_PATH" />'ను లోడ్ చేయడం సాధ్యపడలేదు.</translation>
-<translation id="1445693676523799095">దీనికి కొంత సమయం పట్టవచ్చు</translation>
 <translation id="1451375123200651445">వెబ్ పేజీ, ఒకే ఫైల్</translation>
 <translation id="1451917004835509682">పర్యవేక్షించబడే వ్యక్తిని జోడించు</translation>
 <translation id="1454223536435069390">స్క్రీన్‌షాట్ తీ&amp;యి</translation>
@@ -4897,7 +4896,6 @@
 <translation id="6828182567531805778">మీ డేటాను సింక్ చేయడానికి మీ రహస్య పదబంధాన్ని నమోదు చేయండి</translation>
 <translation id="682871081149631693">QuickFix</translation>
 <translation id="6828860976882136098">వినియోగదారులందరి కోసం ఆటోమేటిక్ అప్‌డేట్‌లను సెటప్ చేయడం విఫలమైంది (ప్రీఫ్లయిట్ అమలు ఎర్రర్: <ph name="ERROR_NUMBER" />)</translation>
-<translation id="6829250331733125857">మీ <ph name="DEVICE_TYPE" /> గురించి సహాయం పొందండి.</translation>
 <translation id="682971198310367122">Google గోప్యతా విధానం</translation>
 <translation id="6831043979455480757">అనువదించు</translation>
 <translation id="683373380308365518">స్మార్ట్ మరియు సురక్షిత బ్రౌజర్‌కు మారండి</translation>
diff --git a/chrome/app/resources/generated_resources_th.xtb b/chrome/app/resources/generated_resources_th.xtb
index 94aef327..aed0e256 100644
--- a/chrome/app/resources/generated_resources_th.xtb
+++ b/chrome/app/resources/generated_resources_th.xtb
@@ -394,7 +394,6 @@
 <translation id="1442851588227551435">ตั้งค่าตั๋ว Kerberos ที่ใช้งานอยู่</translation>
 <translation id="1444628761356461360"><ph name="OWNER_EMAIL" /> ซึ่งเป็นเจ้าของอุปกรณ์เป็นผู้จัดการการตั้งค่านี้</translation>
 <translation id="144518587530125858">ไม่สามารถโหลดธีมจาก "<ph name="IMAGE_PATH" />"</translation>
-<translation id="1445693676523799095">อาจใช้เวลาสักครู่</translation>
 <translation id="1451375123200651445">หน้าเว็บ ไฟล์เดียว</translation>
 <translation id="1451917004835509682">เพิ่มบุคคลภายใต้การดูแล</translation>
 <translation id="1454223536435069390">จับ&amp;ภาพหน้าจอ</translation>
@@ -4897,7 +4896,6 @@
 <translation id="6828182567531805778">ป้อนรหัสผ่านเพื่อซิงค์ข้อมูล</translation>
 <translation id="682871081149631693">QuickFix</translation>
 <translation id="6828860976882136098">ไม่สามารถตั้งค่าการอัปเดตอัตโนมัติสำหรับผู้ใช้ทุกคน (ข้อผิดพลาดในการดำเนินการตรวจสอบล่วงหน้า: <ph name="ERROR_NUMBER" />)</translation>
-<translation id="6829250331733125857">iy[ความช่วยเหลือเกี่ยวกับ <ph name="DEVICE_TYPE" /></translation>
 <translation id="682971198310367122">นโยบายความเป็นส่วนตัวของ Google</translation>
 <translation id="6831043979455480757">แปลภาษา</translation>
 <translation id="683373380308365518">เปลี่ยนเป็นเบราว์เซอร์ที่มีประสิทธิภาพและปลอดภัย</translation>
diff --git a/chrome/app/resources/generated_resources_tr.xtb b/chrome/app/resources/generated_resources_tr.xtb
index bb1ac47..ef349005 100644
--- a/chrome/app/resources/generated_resources_tr.xtb
+++ b/chrome/app/resources/generated_resources_tr.xtb
@@ -394,7 +394,6 @@
 <translation id="1442851588227551435">Etkin Kerberos bileti ayarla</translation>
 <translation id="1444628761356461360">Bu ayar, cihaz sahibi <ph name="OWNER_EMAIL" /> tarafından yönetiliyor.</translation>
 <translation id="144518587530125858">Temaya ilişkin '<ph name="IMAGE_PATH" />' yolu yüklenemedi.</translation>
-<translation id="1445693676523799095">Bu işlem biraz zaman alabilir</translation>
 <translation id="1451375123200651445">Web Sayfası, Tek Dosya</translation>
 <translation id="1451917004835509682">Denetlenen Kişi Ekle</translation>
 <translation id="1454223536435069390">Ekr&amp;an görüntüsü al</translation>
@@ -4898,7 +4897,6 @@
 <translation id="6828182567531805778">Verilerinizi senkronize etmek için parolanızı girin</translation>
 <translation id="682871081149631693">QuickFix</translation>
 <translation id="6828860976882136098">Otomatik güncellemeler tüm kullanıcılar için ayarlanamadı (yayın öncesi yürütme hatası: <ph name="ERROR_NUMBER" />)</translation>
-<translation id="6829250331733125857"><ph name="DEVICE_TYPE" /> cihazınızla ilgili yardım alın.</translation>
 <translation id="682971198310367122">Google gizlilik politikası</translation>
 <translation id="6831043979455480757">Çevir</translation>
 <translation id="683373380308365518">Akıllı ve güvenli bir tarayıcıya geç</translation>
diff --git a/chrome/app/resources/generated_resources_uk.xtb b/chrome/app/resources/generated_resources_uk.xtb
index 58ffba6..22035f7 100644
--- a/chrome/app/resources/generated_resources_uk.xtb
+++ b/chrome/app/resources/generated_resources_uk.xtb
@@ -394,7 +394,6 @@
 <translation id="1442851588227551435">Налаштувати активний квиток Kerberos</translation>
 <translation id="1444628761356461360">Цим налаштуванням керує власник пристрою (<ph name="OWNER_EMAIL" />).</translation>
 <translation id="144518587530125858">Не вдалося завантажити "<ph name="IMAGE_PATH" />" для теми.</translation>
-<translation id="1445693676523799095">Це може зайняти якийсь час</translation>
 <translation id="1451375123200651445">Веб-сторінка в одному файлі</translation>
 <translation id="1451917004835509682">Додати контрольованого користувача</translation>
 <translation id="1454223536435069390">З&amp;робити знімок екрана</translation>
@@ -4897,7 +4896,6 @@
 <translation id="6828182567531805778">Щоб синхронізувати дані, введіть парольну фразу</translation>
 <translation id="682871081149631693">QuickFix</translation>
 <translation id="6828860976882136098">Не вдалося налаштувати автоматичні оновлення для всіх користувачів (помилка виконання: <ph name="ERROR_NUMBER" />)</translation>
-<translation id="6829250331733125857">Довідка для <ph name="DEVICE_TYPE" />.</translation>
 <translation id="682971198310367122">Політика конфіденційності Google</translation>
 <translation id="6831043979455480757">Перекласти</translation>
 <translation id="683373380308365518">Виберіть розумний і безпечний веб-переглядач</translation>
diff --git a/chrome/app/resources/generated_resources_ur.xtb b/chrome/app/resources/generated_resources_ur.xtb
index 3375ae5..f6ea255 100644
--- a/chrome/app/resources/generated_resources_ur.xtb
+++ b/chrome/app/resources/generated_resources_ur.xtb
@@ -395,7 +395,6 @@
 <translation id="1442851588227551435">‏Kerberos کا فعال ٹکٹ سیٹ کریں</translation>
 <translation id="1444628761356461360">یہ ترتیب آلہ کے مالک، <ph name="OWNER_EMAIL" /> کے زیر انتظام ہے۔</translation>
 <translation id="144518587530125858">تھیم کیلئے '<ph name="IMAGE_PATH" />' کو لوڈ نہیں کیا جا سکا۔</translation>
-<translation id="1445693676523799095">اس میں کچھ وقت لگ سکتا ہے</translation>
 <translation id="1451375123200651445">ویب صفحہ، واحد فائل</translation>
 <translation id="1451917004835509682">تحفظ یافتہ شخص کو شامل کریں</translation>
 <translation id="1454223536435069390">اسکرین شاٹ &amp;لیں</translation>
@@ -4898,7 +4897,6 @@
 <translation id="6828182567531805778">اپنے ڈیٹا کو مطابقت پذیر بنانے کے لیے اپنا پاس فریز درج کریں</translation>
 <translation id="682871081149631693">QuickFix</translation>
 <translation id="6828860976882136098">سبھی صارفین کیلئے خودکار اپ ڈیٹس کو ترتیب دینا ناکام ہوگیا (پرواز سے پہلے کی کارروائی میں خرابی: <ph name="ERROR_NUMBER" />)</translation>
-<translation id="6829250331733125857">اپنے <ph name="DEVICE_TYPE" /> آلے کے ساتھ مدد حاصل کریں۔</translation>
 <translation id="682971198310367122">‏Google کی رازداری کی پالیسی</translation>
 <translation id="6831043979455480757">ترجمہ کریں</translation>
 <translation id="683373380308365518">اسمارٹ اور محفوظ براؤزر پر سوئچ کریں</translation>
diff --git a/chrome/app/resources/generated_resources_uz.xtb b/chrome/app/resources/generated_resources_uz.xtb
index d28de03..e24e528 100644
--- a/chrome/app/resources/generated_resources_uz.xtb
+++ b/chrome/app/resources/generated_resources_uz.xtb
@@ -395,7 +395,6 @@
 <translation id="1442851588227551435">Faol Kerberos chiptasini belgilash</translation>
 <translation id="1444628761356461360">Bu sozlama qurilma egasi (<ph name="OWNER_EMAIL" />) tomonidan boshqariladi.</translation>
 <translation id="144518587530125858">Mavzu uchun “<ph name="IMAGE_PATH" />” yuklab bo‘lmadi.</translation>
-<translation id="1445693676523799095">Iltimos, kutib turing</translation>
 <translation id="1451375123200651445">Veb-sahifa, bitta fayl</translation>
 <translation id="1451917004835509682">Boshqariladigan profil qo‘shish</translation>
 <translation id="1454223536435069390">E&amp;kranni suratga olish</translation>
@@ -4895,7 +4894,6 @@
 <translation id="6828182567531805778">Sinxronlash uchun kodli iborani kiriting</translation>
 <translation id="682871081149631693">QuickFix</translation>
 <translation id="6828860976882136098">Barcha foydalanuvchilar uchun avtomatik yangilanishlar sozlanmadi (xato: <ph name="ERROR_NUMBER" />)</translation>
-<translation id="6829250331733125857"><ph name="DEVICE_TYPE" /> yuzasidan yordam oling.</translation>
 <translation id="682971198310367122">Google maxfiylik siyosati</translation>
 <translation id="6831043979455480757">Tarjima</translation>
 <translation id="683373380308365518">Qulay va xavfsiz brauzerdan foydalaning</translation>
diff --git a/chrome/app/resources/generated_resources_vi.xtb b/chrome/app/resources/generated_resources_vi.xtb
index cd147c5..4cd2a1c 100644
--- a/chrome/app/resources/generated_resources_vi.xtb
+++ b/chrome/app/resources/generated_resources_vi.xtb
@@ -394,7 +394,6 @@
 <translation id="1442851588227551435">Đặt phiếu Kerberos đang hoạt động</translation>
 <translation id="1444628761356461360">Cài đặt này do chủ sở hữu thiết bị, <ph name="OWNER_EMAIL" /> quản lý.</translation>
 <translation id="144518587530125858">Không thể tải '<ph name="IMAGE_PATH" />' cho chủ đề.</translation>
-<translation id="1445693676523799095">Quá trình này có thể mất chút thời gian</translation>
 <translation id="1451375123200651445">Trang web, Tệp đơn</translation>
 <translation id="1451917004835509682">Thêm người được giám sát</translation>
 <translation id="1454223536435069390">&amp;Chụp ảnh màn hình</translation>
@@ -4897,7 +4896,6 @@
 <translation id="6828182567531805778">Nhập cụm mật khẩu để đồng bộ hóa dữ liệu</translation>
 <translation id="682871081149631693">QuickFix</translation>
 <translation id="6828860976882136098">Không thiết lập được cập nhật tự động cho tất cả người dùng (lỗi thực thi kiểm tra <ph name="ERROR_NUMBER" />)</translation>
-<translation id="6829250331733125857">Nhận trợ giúp với <ph name="DEVICE_TYPE" /> của bạn.</translation>
 <translation id="682971198310367122">Chính sách quyền riêng tư của Google</translation>
 <translation id="6831043979455480757">Dịch</translation>
 <translation id="683373380308365518">Chuyển sang trình duyệt an toàn và thông minh</translation>
diff --git a/chrome/app/resources/generated_resources_zh-CN.xtb b/chrome/app/resources/generated_resources_zh-CN.xtb
index 3cc83d6..307e976 100644
--- a/chrome/app/resources/generated_resources_zh-CN.xtb
+++ b/chrome/app/resources/generated_resources_zh-CN.xtb
@@ -394,7 +394,6 @@
 <translation id="1442851588227551435">设置有效的 Kerberos 票据</translation>
 <translation id="1444628761356461360">此设置由设备所有者<ph name="OWNER_EMAIL" />管理。</translation>
 <translation id="144518587530125858">无法加载主题背景的路径“<ph name="IMAGE_PATH" />”。</translation>
-<translation id="1445693676523799095">该过程可能需要一点时间</translation>
 <translation id="1451375123200651445">网页(单个文件)</translation>
 <translation id="1451917004835509682">添加受监管用户</translation>
 <translation id="1454223536435069390">屏幕截图(&amp;A)</translation>
@@ -4892,7 +4891,6 @@
 <translation id="6828182567531805778">输入密码以同步您的数据</translation>
 <translation id="682871081149631693">Quick Fix</translation>
 <translation id="6828860976882136098">未能按您的要求为所有用户设置自动更新(执行预定流程时出错:<ph name="ERROR_NUMBER" />)</translation>
-<translation id="6829250331733125857">获取与<ph name="DEVICE_TYPE" />相关的帮助。</translation>
 <translation id="682971198310367122">Google 隐私权政策</translation>
 <translation id="6831043979455480757">翻译</translation>
 <translation id="683373380308365518">改用智能且安全的浏览器</translation>
diff --git a/chrome/app/resources/generated_resources_zh-HK.xtb b/chrome/app/resources/generated_resources_zh-HK.xtb
index 52fd8cf1..916101c 100644
--- a/chrome/app/resources/generated_resources_zh-HK.xtb
+++ b/chrome/app/resources/generated_resources_zh-HK.xtb
@@ -394,7 +394,6 @@
 <translation id="1442851588227551435">設定使用中的 Kerberos 票證</translation>
 <translation id="1444628761356461360">這項設定是由裝置擁有者「<ph name="OWNER_EMAIL" />」管理。</translation>
 <translation id="144518587530125858">無法為主題背景載入「<ph name="IMAGE_PATH" />」。</translation>
-<translation id="1445693676523799095">請稍候片刻</translation>
 <translation id="1451375123200651445">另存為單一檔案網頁</translation>
 <translation id="1451917004835509682">新增受監管人</translation>
 <translation id="1454223536435069390">擷取螢幕畫面(&amp;A)</translation>
@@ -4896,7 +4895,6 @@
 <translation id="6828182567531805778">如要同步處理資料,請輸入您的密碼短語</translation>
 <translation id="682871081149631693">快速修正</translation>
 <translation id="6828860976882136098">無法為所有使用者設定自動更新 (預先執行錯誤:<ph name="ERROR_NUMBER" />)</translation>
-<translation id="6829250331733125857">取得 <ph name="DEVICE_TYPE" /> 相關說明。</translation>
 <translation id="682971198310367122">Google 私隱權政策</translation>
 <translation id="6831043979455480757">翻譯</translation>
 <translation id="683373380308365518">改用智能且安全的瀏覽器</translation>
diff --git a/chrome/app/resources/generated_resources_zh-TW.xtb b/chrome/app/resources/generated_resources_zh-TW.xtb
index 9f68168..c86f06ab3 100644
--- a/chrome/app/resources/generated_resources_zh-TW.xtb
+++ b/chrome/app/resources/generated_resources_zh-TW.xtb
@@ -394,7 +394,6 @@
 <translation id="1442851588227551435">設定使用中的 Kerberos 票證</translation>
 <translation id="1444628761356461360">這項設定是由裝置擁有者「<ph name="OWNER_EMAIL" />」管理。</translation>
 <translation id="144518587530125858"> 無法載入主題的「<ph name="IMAGE_PATH" />」。</translation>
-<translation id="1445693676523799095">請稍待片刻</translation>
 <translation id="1451375123200651445">另存為單一檔案網頁</translation>
 <translation id="1451917004835509682">新增受監管的使用者</translation>
 <translation id="1454223536435069390">擷取螢幕畫面(&amp;A)</translation>
@@ -4895,7 +4894,6 @@
 <translation id="6828182567531805778">如果要同步處理資料,請輸入你的通關密語</translation>
 <translation id="682871081149631693">QuickFix</translation>
 <translation id="6828860976882136098">無法為所有使用者設定自動更新作業 (預先執行錯誤:<ph name="ERROR_NUMBER" />)</translation>
-<translation id="6829250331733125857">取得 <ph name="DEVICE_TYPE" /> 相關說明。</translation>
 <translation id="682971198310367122">Google 隱私權政策</translation>
 <translation id="6831043979455480757">翻譯</translation>
 <translation id="683373380308365518">改用智慧又安全的瀏覽器</translation>
diff --git a/chrome/app/resources/generated_resources_zu.xtb b/chrome/app/resources/generated_resources_zu.xtb
index 1b83635..29c10d5 100644
--- a/chrome/app/resources/generated_resources_zu.xtb
+++ b/chrome/app/resources/generated_resources_zu.xtb
@@ -394,7 +394,6 @@
 <translation id="1442851588227551435">Setha ithikithi le-Kerberos elisebenzayo</translation>
 <translation id="1444628761356461360">Lokhu kulungiselelwa kuphethwe umnikazi wedivayisi, <ph name="OWNER_EMAIL" />.</translation>
 <translation id="144518587530125858">Ayikwazanga ukulayisha i-'<ph name="IMAGE_PATH" />' yetimu.</translation>
-<translation id="1445693676523799095">Lokhu kungathatha isikhathi</translation>
 <translation id="1451375123200651445">Ikhasi lewebhu, ifayela eyodwa</translation>
 <translation id="1451917004835509682">Engeza umuntu ogadiwe</translation>
 <translation id="1454223536435069390">Thatha isithombe-skrini</translation>
@@ -4897,7 +4896,6 @@
 <translation id="6828182567531805778">Faka umushwana wakho wokungena ukuze uvumelanise idatha yakho</translation>
 <translation id="682871081149631693">I-QuickFix</translation>
 <translation id="6828860976882136098">Yehlulekile ukusetha izibuyekezo ezizenzakalelayo zabo bonke abasebenzisi (iphutha lokwenziwa langaphambilini: <ph name="ERROR_NUMBER" />)</translation>
-<translation id="6829250331733125857">Thola usizo nge-<ph name="DEVICE_TYPE" /> yakho.</translation>
 <translation id="682971198310367122">Inqubomgomo yobumfihlo ye-Google</translation>
 <translation id="6831043979455480757">Humusha</translation>
 <translation id="683373380308365518">Shintshela kusiphequluli esihlakaniphile nesiphephile</translation>
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index e891510..3694307 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -1750,10 +1750,6 @@
     "sync/sync_startup_tracker.h",
     "sync/user_event_service_factory.cc",
     "sync/user_event_service_factory.h",
-    "tab/state/tab_state_db.cc",
-    "tab/state/tab_state_db.h",
-    "tab/state/tab_state_db_factory.cc",
-    "tab/state/tab_state_db_factory.h",
     "tab_contents/navigation_metrics_recorder.cc",
     "tab_contents/navigation_metrics_recorder.h",
     "tab_contents/tab_util.cc",
@@ -1872,7 +1868,6 @@
     ":permissions_proto",
     ":resource_prefetch_predictor_proto",
     ":status_proto",
-    ":tab_state_db_content_proto",
     ":unexpire_flags",
     "//base:i18n",
     "//base/allocator:buildflags",
@@ -1904,6 +1899,7 @@
     "//chrome/browser/notifications",
     "//chrome/browser/notifications/scheduler:factory",
     "//chrome/browser/notifications/scheduler/public",
+    "//chrome/browser/persisted_state_db:persisted_state_db",
     "//chrome/browser/policy:path_parser",
     "//chrome/browser/privacy_budget",
     "//chrome/browser/profiling_host",
@@ -1946,6 +1942,7 @@
     "//components/assist_ranker",
     "//components/autofill/content/browser",
     "//components/autofill/core/browser",
+    "//components/autofill_assistant/browser/public:public",
     "//components/background_sync",
     "//components/background_task_scheduler",
     "//components/blocked_content",
@@ -3569,6 +3566,8 @@
       "notifications/notification_system_observer.h",
       "notifications/profile_notification.cc",
       "notifications/profile_notification.h",
+      "notifications/screen_capture_notification_blocker.cc",
+      "notifications/screen_capture_notification_blocker.h",
       "obsolete_system/obsolete_system.h",
       "page_load_metrics/observers/session_restore_page_load_metrics_observer.cc",
       "page_load_metrics/observers/session_restore_page_load_metrics_observer.h",
@@ -6194,10 +6193,6 @@
   sources = [ "availability/proto/availability_prober_cache_entry.proto" ]
 }
 
-proto_library("tab_state_db_content_proto") {
-  sources = [ "tab/state/tab_state_db_content.proto" ]
-}
-
 proto_library("resource_prefetch_predictor_proto") {
   sources = [ "predictors/resource_prefetch_predictor.proto" ]
 }
diff --git a/chrome/browser/android/autofill_assistant/client_android.cc b/chrome/browser/android/autofill_assistant/client_android.cc
index 07adafe..f65fb646 100644
--- a/chrome/browser/android/autofill_assistant/client_android.cc
+++ b/chrome/browser/android/autofill_assistant/client_android.cc
@@ -104,12 +104,6 @@
     Metrics::RecordDropOut(Metrics::DropOutReason::CONTENT_DESTROYED);
   }
 
-  auto* password_manager_client = GetPasswordManagerClient();
-  if (password_manager_client) {
-    password_manager_client->GetPasswordManager()->SetAutofillAssistantMode(
-        password_manager::AutofillAssistantMode::kUINotShown);
-  }
-
   Java_AutofillAssistantClient_clearNativePtr(AttachCurrentThread(),
                                               java_object_);
 }
@@ -190,12 +184,6 @@
   // From this point on, the UIController, in ui_ptr, is either transferred or
   // deleted.
 
-  auto* password_manager_client = GetPasswordManagerClient();
-  if (password_manager_client) {
-    password_manager_client->GetPasswordManager()->SetAutofillAssistantMode(
-        password_manager::AutofillAssistantMode::kUINotShown);
-  }
-
   if (!jother_web_contents)
     return;
 
@@ -429,13 +417,6 @@
     if (!controller_)
       CreateController(nullptr);
     ui_controller_android_->Attach(web_contents_, this, controller_.get());
-
-    // Suppress password manager's prompts.
-    auto* password_manager_client = GetPasswordManagerClient();
-    if (password_manager_client) {
-      password_manager_client->GetPasswordManager()->SetAutofillAssistantMode(
-          password_manager::AutofillAssistantMode::kUIShown);
-    }
   }
 }
 
@@ -471,20 +452,11 @@
       ProfileManager::GetLastUsedProfile());
 }
 
-password_manager::PasswordManagerClient*
-ClientAndroid::GetPasswordManagerClient() const {
-  if (!password_manager_client_) {
-    password_manager_client_ =
-        ChromePasswordManagerClient::FromWebContents(web_contents_);
-  }
-  return password_manager_client_;
-}
-
 WebsiteLoginManager* ClientAndroid::GetWebsiteLoginManager() const {
   if (!website_login_manager_) {
-    auto* client = GetPasswordManagerClient();
-    website_login_manager_ =
-        std::make_unique<WebsiteLoginManagerImpl>(client, web_contents_);
+    website_login_manager_ = std::make_unique<WebsiteLoginManagerImpl>(
+        ChromePasswordManagerClient::FromWebContents(web_contents_),
+        web_contents_);
   }
   return website_login_manager_.get();
 }
@@ -542,12 +514,6 @@
   if (!controller_)
     return;
 
-  auto* password_manager_client = GetPasswordManagerClient();
-  if (password_manager_client) {
-    password_manager_client->GetPasswordManager()->SetAutofillAssistantMode(
-        password_manager::AutofillAssistantMode::kUINotShown);
-  }
-
   if (ui_controller_android_ && ui_controller_android_->IsAttached())
     DestroyUI();
 
diff --git a/chrome/browser/android/autofill_assistant/client_android.h b/chrome/browser/android/autofill_assistant/client_android.h
index cc7c653..f2d2e01d 100644
--- a/chrome/browser/android/autofill_assistant/client_android.h
+++ b/chrome/browser/android/autofill_assistant/client_android.h
@@ -102,8 +102,6 @@
   std::string GetChromeSignedInEmailAddress() const override;
   AccessTokenFetcher* GetAccessTokenFetcher() override;
   autofill::PersonalDataManager* GetPersonalDataManager() const override;
-  password_manager::PasswordManagerClient* GetPasswordManagerClient()
-      const override;
   WebsiteLoginManager* GetWebsiteLoginManager() const override;
   std::string GetLocale() const override;
   std::string GetCountryCode() const override;
@@ -144,10 +142,6 @@
   WEB_CONTENTS_USER_DATA_KEY_DECL();
 
   content::WebContents* web_contents_;
-  // Once initialized, the |password_manager_client_| is available while
-  // |web_contents_| is available.
-  mutable password_manager::PasswordManagerClient* password_manager_client_ =
-      nullptr;
 
   base::android::ScopedJavaGlobalRef<jobject> java_object_;
   std::unique_ptr<Controller> controller_;
diff --git a/chrome/browser/android/battery/android_battery_metrics.cc b/chrome/browser/android/battery/android_battery_metrics.cc
index 5106040..8ccc81c8 100644
--- a/chrome/browser/android/battery/android_battery_metrics.cc
+++ b/chrome/browser/android/battery/android_battery_metrics.cc
@@ -4,13 +4,62 @@
 
 #include "chrome/browser/android/battery/android_battery_metrics.h"
 
+#include "base/android/radio_utils.h"
 #include "base/bind.h"
+#include "base/logging.h"
 #include "base/metrics/histogram.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/power_monitor/power_monitor.h"
+#include "net/android/network_library.h"
+#include "net/android/traffic_stats.h"
 
 namespace {
 
+void Report30SecondRadioUsage(int64_t tx_bytes, int64_t rx_bytes) {
+  if (!base::android::RadioUtils::IsSupported())
+    return;
+
+  if (base::android::RadioUtils::IsWifiConnected()) {
+    base::Optional<int32_t> maybe_level = net::android::GetWifiSignalLevel();
+    if (!maybe_level.has_value())
+      return;
+
+    base::android::RadioSignalLevel wifi_level =
+        static_cast<base::android::RadioSignalLevel>(*maybe_level);
+    UMA_HISTOGRAM_ENUMERATION("Power.ForegroundRadio.SignalLevel.Wifi",
+                              wifi_level);
+
+    // Traffic sent over network during the last 30 seconds in kibibytes.
+    UMA_HISTOGRAM_SCALED_ENUMERATION(
+        "Power.ForegroundRadio.SentKiB.Wifi.30Seconds", wifi_level, tx_bytes,
+        1024);
+
+    // Traffic received over network during the last 30 seconds in kibibytes.
+    UMA_HISTOGRAM_SCALED_ENUMERATION(
+        "Power.ForegroundRadio.ReceivedKiB.Wifi.30Seconds", wifi_level,
+        rx_bytes, 1024);
+  } else {
+    base::Optional<base::android::RadioSignalLevel> maybe_level =
+        base::android::RadioUtils::GetCellSignalLevel();
+    if (!maybe_level.has_value())
+      return;
+
+    base::android::RadioSignalLevel cell_level = *maybe_level;
+    UMA_HISTOGRAM_ENUMERATION("Power.ForegroundRadio.SignalLevel.Cell",
+                              cell_level);
+
+    // Traffic sent over network during the last 30 seconds in kibibytes.
+    UMA_HISTOGRAM_SCALED_ENUMERATION(
+        "Power.ForegroundRadio.SentKiB.Cell.30Seconds", cell_level, tx_bytes,
+        1024);
+
+    // Traffic received over network during the last 30 seconds in kibibytes.
+    UMA_HISTOGRAM_SCALED_ENUMERATION(
+        "Power.ForegroundRadio.ReceivedKiB.Cell.30Seconds", cell_level,
+        rx_bytes, 1024);
+  }
+}
+
 void Report30SecondDrain(int capacity_consumed, bool is_exclusive_measurement) {
   // Drain over the last 30 seconds in uAh. We assume a max current of 10A which
   // translates to a little under 100mAh capacity drain over 30 seconds.
@@ -63,7 +112,7 @@
 }  // namespace
 
 // static
-constexpr base::TimeDelta AndroidBatteryMetrics::kDrainMetricsInterval;
+constexpr base::TimeDelta AndroidBatteryMetrics::kMetricsInterval;
 
 AndroidBatteryMetrics::AndroidBatteryMetrics()
     : app_state_listener_(base::android::ApplicationStatusListener::New(
@@ -72,7 +121,7 @@
       app_state_(base::android::ApplicationStatusListener::GetState()),
       on_battery_power_(base::PowerMonitor::IsOnBatteryPower()) {
   base::PowerMonitor::AddObserver(this);
-  UpdateDrainMetricsEnabled();
+  UpdateMetricsEnabled();
 }
 
 AndroidBatteryMetrics::~AndroidBatteryMetrics() {
@@ -83,16 +132,16 @@
     base::android::ApplicationState state) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   app_state_ = state;
-  UpdateDrainMetricsEnabled();
+  UpdateMetricsEnabled();
 }
 
 void AndroidBatteryMetrics::OnPowerStateChange(bool on_battery_power) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   on_battery_power_ = on_battery_power;
-  UpdateDrainMetricsEnabled();
+  UpdateMetricsEnabled();
 }
 
-void AndroidBatteryMetrics::UpdateDrainMetricsEnabled() {
+void AndroidBatteryMetrics::UpdateMetricsEnabled() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   // We want to attribute battery drain to Chrome while it is in the foreground.
@@ -102,23 +151,44 @@
       app_state_ == base::android::APPLICATION_STATE_HAS_RUNNING_ACTIVITIES &&
       on_battery_power_;
 
-  if (should_be_enabled && !drain_metrics_timer_.IsRunning()) {
+  if (should_be_enabled && !metrics_timer_.IsRunning()) {
     // Capture first capacity measurement and enable the repeating timer.
     last_remaining_capacity_uah_ =
         base::PowerMonitor::GetRemainingBatteryCapacity();
+    if (!net::android::traffic_stats::GetTotalTxBytes(&last_tx_bytes_))
+      last_tx_bytes_ = -1;
+    if (!net::android::traffic_stats::GetTotalRxBytes(&last_rx_bytes_))
+      last_rx_bytes_ = -1;
     skipped_timers_ = 0;
     observed_capacity_drops_ = 0;
 
-    drain_metrics_timer_.Start(FROM_HERE, kDrainMetricsInterval, this,
-                               &AndroidBatteryMetrics::CaptureAndReportDrain);
-  } else if (!should_be_enabled && drain_metrics_timer_.IsRunning()) {
+    metrics_timer_.Start(FROM_HERE, kMetricsInterval, this,
+                         &AndroidBatteryMetrics::CaptureAndReportMetrics);
+  } else if (!should_be_enabled && metrics_timer_.IsRunning()) {
     // Capture one last measurement before disabling the timer.
-    CaptureAndReportDrain();
-    drain_metrics_timer_.Stop();
+    CaptureAndReportMetrics();
+    metrics_timer_.Stop();
   }
 }
 
-void AndroidBatteryMetrics::CaptureAndReportDrain() {
+void AndroidBatteryMetrics::UpdateAndReportRadio() {
+  int64_t tx_bytes;
+  int64_t rx_bytes;
+  if (!net::android::traffic_stats::GetTotalTxBytes(&tx_bytes))
+    tx_bytes = -1;
+  if (!net::android::traffic_stats::GetTotalRxBytes(&rx_bytes))
+    rx_bytes = -1;
+
+  if (last_tx_bytes_ > 0 && tx_bytes > 0 && last_rx_bytes_ > 0 &&
+      rx_bytes > 0) {
+    Report30SecondRadioUsage(tx_bytes - last_tx_bytes_,
+                             rx_bytes - last_rx_bytes_);
+  }
+  last_tx_bytes_ = tx_bytes;
+  last_rx_bytes_ = rx_bytes;
+}
+
+void AndroidBatteryMetrics::CaptureAndReportMetrics() {
   int remaining_capacity_uah =
       base::PowerMonitor::GetRemainingBatteryCapacity();
 
@@ -129,6 +199,8 @@
     // here to avoid overreporting in case of fluctuating values.
     skipped_timers_++;
     Report30SecondDrain(0, IsMeasuringDrainExclusively());
+    UpdateAndReportRadio();
+
     return;
   }
   observed_capacity_drops_++;
@@ -136,6 +208,7 @@
   // Report the consumed capacity delta over the last 30 seconds.
   int capacity_consumed = last_remaining_capacity_uah_ - remaining_capacity_uah;
   Report30SecondDrain(capacity_consumed, IsMeasuringDrainExclusively());
+  UpdateAndReportRadio();
 
   // Also record drain over 30 second intervals, but averaged since the last
   // time we recorded an increase (or started recording samples). Because the
diff --git a/chrome/browser/android/battery/android_battery_metrics.h b/chrome/browser/android/battery/android_battery_metrics.h
index a7027a2..cc7040d3 100644
--- a/chrome/browser/android/battery/android_battery_metrics.h
+++ b/chrome/browser/android/battery/android_battery_metrics.h
@@ -24,8 +24,9 @@
   // Called by base::android::ApplicationStatusListener.
   void OnAppStateChanged(base::android::ApplicationState);
 
-  void UpdateDrainMetricsEnabled();
-  void CaptureAndReportDrain();
+  void UpdateMetricsEnabled();
+  void CaptureAndReportMetrics();
+  void UpdateAndReportRadio();
 
   // Whether or not we've seen at least two consecutive capacity drops while
   // Chrome was the foreground app. Battery drain reported prior to this could
@@ -34,14 +35,16 @@
 
   // Battery drain is captured and reported periodically in this interval while
   // the device is on battery power and Chrome is the foreground activity.
-  static constexpr base::TimeDelta kDrainMetricsInterval =
+  static constexpr base::TimeDelta kMetricsInterval =
       base::TimeDelta::FromSeconds(30);
 
   std::unique_ptr<base::android::ApplicationStatusListener> app_state_listener_;
   base::android::ApplicationState app_state_;
   bool on_battery_power_;
   int last_remaining_capacity_uah_ = 0;
-  base::RepeatingTimer drain_metrics_timer_;
+  int64_t last_tx_bytes_ = -1;
+  int64_t last_rx_bytes_ = -1;
+  base::RepeatingTimer metrics_timer_;
   int skipped_timers_ = 0;
 
   // Number of consecutive charge drops seen while the app has been in the
diff --git a/chrome/browser/chromeos/arc/auth/arc_robot_auth_code_fetcher.cc b/chrome/browser/chromeos/arc/auth/arc_robot_auth_code_fetcher.cc
index c7e20ca..402baf4 100644
--- a/chrome/browser/chromeos/arc/auth/arc_robot_auth_code_fetcher.cc
+++ b/chrome/browser/chromeos/arc/auth/arc_robot_auth_code_fetcher.cc
@@ -73,8 +73,7 @@
                     ->GetSharedURLLoaderFactory(),
           base::BindOnce(
               &ArcRobotAuthCodeFetcher::OnFetchRobotAuthCodeCompleted,
-              weak_ptr_factory_.GetWeakPtr(),
-              base::AdaptCallbackForRepeating(std::move(callback))));
+              weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
 
   enterprise_management::DeviceServiceApiAccessRequest* request =
       config->request()->mutable_service_api_access_request();
diff --git a/chrome/browser/chromeos/arc/policy/arc_policy_bridge.cc b/chrome/browser/chromeos/arc/policy/arc_policy_bridge.cc
index 3eb1f323..4b0aee42 100644
--- a/chrome/browser/chromeos/arc/policy/arc_policy_bridge.cc
+++ b/chrome/browser/chromeos/arc/policy/arc_policy_bridge.cc
@@ -463,14 +463,10 @@
 void ArcPolicyBridge::ReportCompliance(const std::string& request,
                                        ReportComplianceCallback callback) {
   VLOG(1) << "ArcPolicyBridge::ReportCompliance";
-  // TODO(crbug.com/730593): Remove AdaptCallbackForRepeating() by updating
-  // the callee interface.
-  auto repeating_callback =
-      base::AdaptCallbackForRepeating(std::move(callback));
   data_decoder::DataDecoder::ParseJsonIsolated(
       request,
       base::BindOnce(&ArcPolicyBridge::OnReportComplianceParse,
-                     weak_ptr_factory_.GetWeakPtr(), repeating_callback));
+                     weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
 }
 
 void ArcPolicyBridge::ReportCloudDpsRequested(
diff --git a/chrome/browser/chromeos/file_manager/devtools_listener.cc b/chrome/browser/chromeos/file_manager/devtools_listener.cc
index 2821432..82d4e442 100644
--- a/chrome/browser/chromeos/file_manager/devtools_listener.cc
+++ b/chrome/browser/chromeos/file_manager/devtools_listener.cc
@@ -35,7 +35,7 @@
   return std::string(canonical_url.data(), canonical_url.length());
 }
 
-} // namespace
+}  // namespace
 
 DevToolsListener::DevToolsListener(content::DevToolsAgentHost* host,
                                    uint32_t uuid)
@@ -98,7 +98,7 @@
 
   std::string start_precise_coverage =
       "{\"id\":21,\"method\":\"Profiler.startPreciseCoverage\",\"params\":{"
-      "\"callCount\":false,\"detailed\":true}}";
+      "\"callCount\":true,\"detailed\":true}}";
   host->DispatchProtocolMessage(this, StringToSpan(start_precise_coverage));
 
   std::string enable_debugger = "{\"id\":22,\"method\":\"Debugger.enable\"}";
diff --git a/chrome/browser/chromeos/file_manager/file_manager_browsertest_base.cc b/chrome/browser/chromeos/file_manager/file_manager_browsertest_base.cc
index bf7d5683..b51c802 100644
--- a/chrome/browser/chromeos/file_manager/file_manager_browsertest_base.cc
+++ b/chrome/browser/chromeos/file_manager/file_manager_browsertest_base.cc
@@ -1486,7 +1486,6 @@
 
 FileManagerBrowserTestBase::~FileManagerBrowserTestBase() = default;
 
-
 static bool ShouldInspect(content::DevToolsAgentHost* host) {
   // TODO(crbug.com/v8/10820): Add background_page back in once
   // coverage can be collected when a background_page and app
diff --git a/chrome/browser/chromeos/login/auth/chrome_login_performer.cc b/chrome/browser/chromeos/login/auth/chrome_login_performer.cc
index d25118a3..61fd3f8 100644
--- a/chrome/browser/chromeos/login/auth/chrome_login_performer.cc
+++ b/chrome/browser/chromeos/login/auth/chrome_login_performer.cc
@@ -82,10 +82,12 @@
   }
 }
 
-bool ChromeLoginPerformer::IsUserAllowlisted(const AccountId& account_id,
-                                             bool* wildcard_match) {
+bool ChromeLoginPerformer::IsUserAllowlisted(
+    const AccountId& account_id,
+    bool* wildcard_match,
+    const base::Optional<user_manager::UserType>& user_type) {
   return CrosSettings::Get()->IsUserAllowlisted(account_id.GetUserEmail(),
-                                                wildcard_match);
+                                                wildcard_match, user_type);
 }
 
 void ChromeLoginPerformer::RunOnlineAllowlistCheck(
diff --git a/chrome/browser/chromeos/login/auth/chrome_login_performer.h b/chrome/browser/chromeos/login/auth/chrome_login_performer.h
index 5ae87d6..d1c31e7 100644
--- a/chrome/browser/chromeos/login/auth/chrome_login_performer.h
+++ b/chrome/browser/chromeos/login/auth/chrome_login_performer.h
@@ -10,12 +10,14 @@
 
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
+#include "base/optional.h"
 #include "chrome/browser/chromeos/policy/wildcard_login_checker.h"
 #include "chromeos/login/auth/auth_status_consumer.h"
 #include "chromeos/login/auth/authenticator.h"
 #include "chromeos/login/auth/extended_authenticator.h"
 #include "chromeos/login/auth/login_performer.h"
 #include "chromeos/login/auth/user_context.h"
+#include "components/user_manager/user_type.h"
 #include "content/public/browser/notification_observer.h"
 #include "content/public/browser/notification_registrar.h"
 #include "google_apis/gaia/google_service_auth_error.h"
@@ -35,8 +37,11 @@
   explicit ChromeLoginPerformer(Delegate* delegate);
   ~ChromeLoginPerformer() override;
 
-  bool IsUserAllowlisted(const AccountId& account_id,
-                         bool* wildcard_match) override;
+  // LoginPerformer:
+  bool IsUserAllowlisted(
+      const AccountId& account_id,
+      bool* wildcard_match,
+      const base::Optional<user_manager::UserType>& user_type) override;
 
  protected:
   bool RunTrustedCheck(base::OnceClosure callback) override;
diff --git a/chrome/browser/chromeos/login/existing_user_controller.cc b/chrome/browser/chromeos/login/existing_user_controller.cc
index de5f086f8..2d0d48c7 100644
--- a/chrome/browser/chromeos/login/existing_user_controller.cc
+++ b/chrome/browser/chromeos/login/existing_user_controller.cc
@@ -848,13 +848,17 @@
   given_name_ = base::UTF8ToUTF16(given_name);
 }
 
-bool ExistingUserController::IsUserAllowlisted(const AccountId& account_id) {
+bool ExistingUserController::IsUserAllowlisted(
+    const AccountId& account_id,
+    const base::Optional<user_manager::UserType>& user_type) {
   bool wildcard_match = false;
-  if (login_performer_.get())
-    return login_performer_->IsUserAllowlisted(account_id, &wildcard_match);
+  if (login_performer_.get()) {
+    return login_performer_->IsUserAllowlisted(account_id, &wildcard_match,
+                                               user_type);
+  }
 
   return cros_settings_->IsUserAllowlisted(account_id.GetUserEmail(),
-                                           &wildcard_match);
+                                           &wildcard_match, user_type);
 }
 
 void ExistingUserController::LocalStateChanged(
diff --git a/chrome/browser/chromeos/login/existing_user_controller.h b/chrome/browser/chromeos/login/existing_user_controller.h
index 1f65c480..19bbfba 100644
--- a/chrome/browser/chromeos/login/existing_user_controller.h
+++ b/chrome/browser/chromeos/login/existing_user_controller.h
@@ -16,6 +16,7 @@
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
 #include "base/observer_list.h"
+#include "base/optional.h"
 #include "base/scoped_observer.h"
 #include "base/strings/string16.h"
 #include "base/time/time.h"
@@ -34,6 +35,7 @@
 #include "components/prefs/pref_registry_simple.h"
 #include "components/user_manager/user.h"
 #include "components/user_manager/user_manager.h"
+#include "components/user_manager/user_type.h"
 #include "content/public/browser/notification_observer.h"
 #include "content/public/browser/notification_registrar.h"
 #include "third_party/cros_system_api/dbus/cryptohome/dbus-constants.h"
@@ -117,7 +119,9 @@
   void SetDisplayEmail(const std::string& email);
   void SetDisplayAndGivenName(const std::string& display_name,
                               const std::string& given_name);
-  bool IsUserAllowlisted(const AccountId& account_id);
+  bool IsUserAllowlisted(
+      const AccountId& account_id,
+      const base::Optional<user_manager::UserType>& user_type);
 
   // user_manager::UserManager::Observer:
   void LocalStateChanged(user_manager::UserManager* user_manager) override;
diff --git a/chrome/browser/chromeos/login/ui/fake_login_display_host.cc b/chrome/browser/chromeos/login/ui/fake_login_display_host.cc
index 3b1fcee..602ad27 100644
--- a/chrome/browser/chromeos/login/ui/fake_login_display_host.cc
+++ b/chrome/browser/chromeos/login/ui/fake_login_display_host.cc
@@ -106,7 +106,9 @@
 
 void FakeLoginDisplayHost::LoadSigninWallpaper() {}
 
-bool FakeLoginDisplayHost::IsUserAllowlisted(const AccountId& account_id) {
+bool FakeLoginDisplayHost::IsUserAllowlisted(
+    const AccountId& account_id,
+    const base::Optional<user_manager::UserType>& user_type) {
   return false;
 }
 
diff --git a/chrome/browser/chromeos/login/ui/fake_login_display_host.h b/chrome/browser/chromeos/login/ui/fake_login_display_host.h
index 295e782..43f217e 100644
--- a/chrome/browser/chromeos/login/ui/fake_login_display_host.h
+++ b/chrome/browser/chromeos/login/ui/fake_login_display_host.h
@@ -9,7 +9,9 @@
 #include <string>
 
 #include "base/macros.h"
+#include "base/optional.h"
 #include "chrome/browser/chromeos/login/ui/login_display_host.h"
+#include "components/user_manager/user_type.h"
 
 namespace session_manager {
 class SessionManager;
@@ -50,7 +52,9 @@
                               const std::string& given_name) override;
   void LoadWallpaper(const AccountId& account_id) override;
   void LoadSigninWallpaper() override;
-  bool IsUserAllowlisted(const AccountId& account_id) override;
+  bool IsUserAllowlisted(
+      const AccountId& account_id,
+      const base::Optional<user_manager::UserType>& user_type) override;
   void ShowGaiaDialog(const AccountId& prefilled_account) override;
   void HideOobeDialog() override;
   void UpdateOobeDialogState(ash::OobeDialogState state) override;
diff --git a/chrome/browser/chromeos/login/ui/login_display_host.h b/chrome/browser/chromeos/login/ui/login_display_host.h
index a31aff0..479f7e5 100644
--- a/chrome/browser/chromeos/login/ui/login_display_host.h
+++ b/chrome/browser/chromeos/login/ui/login_display_host.h
@@ -16,6 +16,8 @@
 #include "chrome/browser/chromeos/login/auth/auth_prewarmer.h"
 #include "chrome/browser/chromeos/login/oobe_screen.h"
 #include "chrome/browser/chromeos/login/ui/login_display.h"
+#include "components/user_manager/user_type.h"
+
 #include "ui/gfx/native_widget_types.h"
 
 class AccountId;
@@ -166,7 +168,9 @@
   virtual void LoadSigninWallpaper() = 0;
 
   // Returns true if user is allowed to log in by domain policy.
-  virtual bool IsUserAllowlisted(const AccountId& account_id) = 0;
+  virtual bool IsUserAllowlisted(
+      const AccountId& account_id,
+      const base::Optional<user_manager::UserType>& user_type) = 0;
 
   // ----- Password change flow methods -----
   // Cancels current password changed flow.
diff --git a/chrome/browser/chromeos/login/ui/login_display_host_common.cc b/chrome/browser/chromeos/login/ui/login_display_host_common.cc
index b279227..902ffbc 100644
--- a/chrome/browser/chromeos/login/ui/login_display_host_common.cc
+++ b/chrome/browser/chromeos/login/ui/login_display_host_common.cc
@@ -233,10 +233,12 @@
   WallpaperControllerClient::Get()->ShowSigninWallpaper();
 }
 
-bool LoginDisplayHostCommon::IsUserAllowlisted(const AccountId& account_id) {
+bool LoginDisplayHostCommon::IsUserAllowlisted(
+    const AccountId& account_id,
+    const base::Optional<user_manager::UserType>& user_type) {
   if (!GetExistingUserController())
     return true;
-  return GetExistingUserController()->IsUserAllowlisted(account_id);
+  return GetExistingUserController()->IsUserAllowlisted(account_id, user_type);
 }
 
 void LoginDisplayHostCommon::CancelPasswordChangedFlow() {
diff --git a/chrome/browser/chromeos/login/ui/login_display_host_common.h b/chrome/browser/chromeos/login/ui/login_display_host_common.h
index c99e0b5..93c5485a 100644
--- a/chrome/browser/chromeos/login/ui/login_display_host_common.h
+++ b/chrome/browser/chromeos/login/ui/login_display_host_common.h
@@ -10,10 +10,12 @@
 #include <vector>
 
 #include "ash/public/cpp/login_accelerators.h"
+#include "base/optional.h"
 #include "chrome/browser/chromeos/login/ui/kiosk_app_menu_controller.h"
 #include "chrome/browser/chromeos/login/ui/login_display_host.h"
 #include "chrome/browser/ui/browser_list_observer.h"
 #include "components/keep_alive_registry/scoped_keep_alive.h"
+#include "components/user_manager/user_type.h"
 #include "content/public/browser/notification_observer.h"
 #include "content/public/browser/notification_registrar.h"
 
@@ -50,7 +52,9 @@
                               const std::string& given_name) final;
   void LoadWallpaper(const AccountId& account_id) final;
   void LoadSigninWallpaper() final;
-  bool IsUserAllowlisted(const AccountId& account_id) final;
+  bool IsUserAllowlisted(
+      const AccountId& account_id,
+      const base::Optional<user_manager::UserType>& user_type) final;
   void CancelPasswordChangedFlow() final;
   void MigrateUserData(const std::string& old_password) final;
   void ResyncUserData() final;
diff --git a/chrome/browser/chromeos/login/ui/login_display_mojo.cc b/chrome/browser/chromeos/login/ui/login_display_mojo.cc
index 544d4a9..5042d3a 100644
--- a/chrome/browser/chromeos/login/ui/login_display_mojo.cc
+++ b/chrome/browser/chromeos/login/ui/login_display_mojo.cc
@@ -173,6 +173,7 @@
   // related.
   if (error_msg_id != IDS_LOGIN_ERROR_ALLOWLIST &&
       error_msg_id != IDS_ENTERPRISE_LOGIN_ERROR_ALLOWLIST &&
+      error_msg_id != IDS_ENTERPRISE_AND_FAMILY_LINK_LOGIN_ERROR_ALLOWLIST &&
       error_msg_id != IDS_LOGIN_ERROR_OWNER_KEY_LOST &&
       error_msg_id != IDS_LOGIN_ERROR_OWNER_REQUIRED &&
       error_msg_id != IDS_LOGIN_ERROR_GOOGLE_ACCOUNT_NOT_ALLOWED &&
diff --git a/chrome/browser/chromeos/login/ui/login_display_webui.cc b/chrome/browser/chromeos/login/ui/login_display_webui.cc
index a7c57e84..e91b50ac 100644
--- a/chrome/browser/chromeos/login/ui/login_display_webui.cc
+++ b/chrome/browser/chromeos/login/ui/login_display_webui.cc
@@ -144,6 +144,7 @@
   // related.
   if (error_msg_id != IDS_LOGIN_ERROR_ALLOWLIST &&
       error_msg_id != IDS_ENTERPRISE_LOGIN_ERROR_ALLOWLIST &&
+      error_msg_id != IDS_ENTERPRISE_AND_FAMILY_LINK_LOGIN_ERROR_ALLOWLIST &&
       error_msg_id != IDS_LOGIN_ERROR_OWNER_KEY_LOST &&
       error_msg_id != IDS_LOGIN_ERROR_OWNER_REQUIRED &&
       error_msg_id != IDS_LOGIN_ERROR_GOOGLE_ACCOUNT_NOT_ALLOWED &&
diff --git a/chrome/browser/chromeos/login/ui/mock_login_display_host.h b/chrome/browser/chromeos/login/ui/mock_login_display_host.h
index 3d923a6..55b61c5 100644
--- a/chrome/browser/chromeos/login/ui/mock_login_display_host.h
+++ b/chrome/browser/chromeos/login/ui/mock_login_display_host.h
@@ -9,9 +9,11 @@
 
 #include "ash/public/cpp/login_accelerators.h"
 #include "base/macros.h"
+#include "base/optional.h"
 #include "chrome/browser/chromeos/app_mode/kiosk_app_types.h"
 #include "chrome/browser/chromeos/login/ui/login_display_host.h"
 #include "chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h"
+#include "components/user_manager/user_type.h"
 #include "testing/gmock/include/gmock/gmock.h"
 
 namespace chromeos {
@@ -72,7 +74,10 @@
               (override));
   MOCK_METHOD(void, LoadWallpaper, (const AccountId&), (override));
   MOCK_METHOD(void, LoadSigninWallpaper, (), (override));
-  MOCK_METHOD(bool, IsUserAllowlisted, (const AccountId&), (override));
+  MOCK_METHOD(bool,
+              IsUserAllowlisted,
+              (const AccountId&, const base::Optional<user_manager::UserType>&),
+              (override));
   MOCK_METHOD(void, CancelPasswordChangedFlow, (), (override));
   MOCK_METHOD(void, MigrateUserData, (const std::string&), (override));
   MOCK_METHOD(void, ResyncUserData, (), (override));
diff --git a/chrome/browser/chromeos/login/users/chrome_user_manager_impl.cc b/chrome/browser/chromeos/login/users/chrome_user_manager_impl.cc
index 3023d66f..ee91f6c0 100644
--- a/chrome/browser/chromeos/login/users/chrome_user_manager_impl.cc
+++ b/chrome/browser/chromeos/login/users/chrome_user_manager_impl.cc
@@ -1227,7 +1227,7 @@
     const user_manager::User& user) const {
   DCHECK(user.HasGaiaAccount());
   return cros_settings_->IsUserAllowlisted(user.GetAccountId().GetUserEmail(),
-                                           nullptr);
+                                           nullptr, user.GetType());
 }
 
 void ChromeUserManagerImpl::OnMinimumVersionStateChanged() {
diff --git a/chrome/browser/chromeos/login/users/fake_chrome_user_manager.cc b/chrome/browser/chromeos/login/users/fake_chrome_user_manager.cc
index f8b4f2100..c6f36405 100644
--- a/chrome/browser/chromeos/login/users/fake_chrome_user_manager.cc
+++ b/chrome/browser/chromeos/login/users/fake_chrome_user_manager.cc
@@ -623,7 +623,7 @@
     const user_manager::User& user) const {
   DCHECK(user.HasGaiaAccount());
   return CrosSettings::Get()->IsUserAllowlisted(
-      user.GetAccountId().GetUserEmail(), nullptr);
+      user.GetAccountId().GetUserEmail(), nullptr, user.GetType());
 }
 
 bool FakeChromeUserManager::IsUserAllowed(
diff --git a/chrome/browser/chromeos/note_taking_helper.cc b/chrome/browser/chromeos/note_taking_helper.cc
index 0cadebf61..ebb4d239 100644
--- a/chrome/browser/chromeos/note_taking_helper.cc
+++ b/chrome/browser/chromeos/note_taking_helper.cc
@@ -52,7 +52,7 @@
 // Pointer to singleton instance.
 NoteTakingHelper* g_helper = nullptr;
 
-// Whitelisted Chrome note-taking apps.
+// Allowed Chrome note-taking apps.
 const char* const kExtensionIds[] = {
     // TODO(jdufault): Remove dev version? See crbug.com/640828.
     NoteTakingHelper::kDevKeepExtensionId,
@@ -90,10 +90,10 @@
       app, app_runtime::ACTION_TYPE_NEW_NOTE);
 }
 
-// Gets the set of apps (more specifically, their app IDs) that are allowed to
-// be launched on the lock screen, if the feature is whitelisted using
+// Gets the set of app IDs that are allowed to be launched on the lock screen,
+// if the feature is restricted using the
 // |prefs::kNoteTakingAppsLockScreenAllowlist| preference. If the pref is not
-// set, this method will return null (in which case the white-list should not be
+// set, this method will return null (in which case the set should not be
 // checked).
 // Note that |prefs::kNoteTakingrAppsAllowedOnLockScreen| is currently only
 // expected to be set by policy (if it's set at all).
@@ -217,7 +217,7 @@
   if (!preferred_app)
     return nullptr;
 
-  if (!IsWhitelistedChromeApp(preferred_app) &&
+  if (!IsAllowedChromeApp(preferred_app) &&
       !extensions::ActionHandlersInfo::HasActionHandler(
           preferred_app, app_runtime::ACTION_TYPE_NEW_NOTE)) {
     return nullptr;
@@ -372,12 +372,11 @@
       base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
           switches::kNoteTakingAppIds);
   if (!switch_value.empty()) {
-    whitelisted_chrome_app_ids_ = base::SplitString(
+    allowed_chrome_app_ids_ = base::SplitString(
         switch_value, ",", base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY);
   }
-  whitelisted_chrome_app_ids_.insert(whitelisted_chrome_app_ids_.end(),
-                                     kExtensionIds,
-                                     kExtensionIds + base::size(kExtensionIds));
+  allowed_chrome_app_ids_.insert(allowed_chrome_app_ids_.end(), kExtensionIds,
+                                 kExtensionIds + base::size(kExtensionIds));
 
   // Track profiles so we can observe their extension registries.
   g_browser_process->profile_manager()->AddObserver(this);
@@ -431,10 +430,10 @@
   }
 }
 
-bool NoteTakingHelper::IsWhitelistedChromeApp(
+bool NoteTakingHelper::IsAllowedChromeApp(
     const extensions::Extension* extension) const {
   DCHECK(extension);
-  return base::Contains(whitelisted_chrome_app_ids_, extension->id());
+  return base::Contains(allowed_chrome_app_ids_, extension->id());
 }
 
 std::vector<const extensions::Extension*> NoteTakingHelper::GetChromeApps(
@@ -446,7 +445,7 @@
       extension_registry->enabled_extensions();
 
   std::vector<const extensions::Extension*> extensions;
-  for (const auto& id : whitelisted_chrome_app_ids_) {
+  for (const auto& id : allowed_chrome_app_ids_) {
     if (enabled_extensions.Contains(id)) {
       extensions.push_back(extension_registry->GetExtensionById(
           id, extensions::ExtensionRegistry::ENABLED));
@@ -599,7 +598,7 @@
 void NoteTakingHelper::OnExtensionLoaded(
     content::BrowserContext* browser_context,
     const extensions::Extension* extension) {
-  if (IsWhitelistedChromeApp(extension) ||
+  if (IsAllowedChromeApp(extension) ||
       extensions::ActionHandlersInfo::HasActionHandler(
           extension, app_runtime::ACTION_TYPE_NEW_NOTE)) {
     for (Observer& observer : observers_)
@@ -611,7 +610,7 @@
     content::BrowserContext* browser_context,
     const extensions::Extension* extension,
     extensions::UnloadedExtensionReason reason) {
-  if (IsWhitelistedChromeApp(extension) ||
+  if (IsAllowedChromeApp(extension) ||
       extensions::ActionHandlersInfo::HasActionHandler(
           extension, app_runtime::ACTION_TYPE_NEW_NOTE)) {
     for (Observer& observer : observers_)
@@ -632,11 +631,12 @@
   if (!IsLockScreenEnabled(app))
     return NoteTakingLockScreenSupport::kNotSupported;
 
-  if (lock_screen_whitelist_state_ == AppWhitelistState::kUndetermined)
-    UpdateLockScreenAppsWhitelistState();
+  if (allowed_lock_screen_apps_state_ == AllowedAppListState::kUndetermined)
+    UpdateAllowedLockScreenAppsList();
 
-  if (lock_screen_whitelist_state_ == AppWhitelistState::kAppsWhitelisted &&
-      !lock_screen_apps_allowed_by_policy_.count(app->id())) {
+  if (allowed_lock_screen_apps_state_ ==
+          AllowedAppListState::kAllowedAppsListed &&
+      !allowed_lock_screen_apps_by_policy_.count(app->id())) {
     return NoteTakingLockScreenSupport::kNotAllowedByPolicy;
   }
 
@@ -647,7 +647,7 @@
 }
 
 void NoteTakingHelper::OnAllowedNoteTakingAppsChanged() {
-  if (lock_screen_whitelist_state_ == AppWhitelistState::kUndetermined)
+  if (allowed_lock_screen_apps_state_ == AllowedAppListState::kUndetermined)
     return;
 
   std::unique_ptr<NoteTakingAppInfo> preferred_app =
@@ -656,7 +656,7 @@
       preferred_app ? preferred_app->lock_screen_support
                     : NoteTakingLockScreenSupport::kNotSupported;
 
-  UpdateLockScreenAppsWhitelistState();
+  UpdateAllowedLockScreenAppsList();
 
   preferred_app =
       GetPreferredChromeAppInfo(profile_with_enabled_lock_screen_apps_);
@@ -674,16 +674,17 @@
   }
 }
 
-void NoteTakingHelper::UpdateLockScreenAppsWhitelistState() {
-  std::unique_ptr<std::set<std::string>> whitelist = GetAllowedLockScreenApps(
-      profile_with_enabled_lock_screen_apps_->GetPrefs());
+void NoteTakingHelper::UpdateAllowedLockScreenAppsList() {
+  std::unique_ptr<std::set<std::string>> allowed_apps =
+      GetAllowedLockScreenApps(
+          profile_with_enabled_lock_screen_apps_->GetPrefs());
 
-  if (whitelist) {
-    lock_screen_whitelist_state_ = AppWhitelistState::kAppsWhitelisted;
-    lock_screen_apps_allowed_by_policy_.swap(*whitelist);
+  if (allowed_apps) {
+    allowed_lock_screen_apps_state_ = AllowedAppListState::kAllowedAppsListed;
+    allowed_lock_screen_apps_by_policy_.swap(*allowed_apps);
   } else {
-    lock_screen_whitelist_state_ = AppWhitelistState::kNoAppWhitelist;
-    lock_screen_apps_allowed_by_policy_.clear();
+    allowed_lock_screen_apps_state_ = AllowedAppListState::kAllAppsAllowed;
+    allowed_lock_screen_apps_by_policy_.clear();
   }
 }
 
diff --git a/chrome/browser/chromeos/note_taking_helper.h b/chrome/browser/chromeos/note_taking_helper.h
index ff70f3cd..788b811 100644
--- a/chrome/browser/chromeos/note_taking_helper.h
+++ b/chrome/browser/chromeos/note_taking_helper.h
@@ -80,8 +80,8 @@
   bool preferred;
 
   // Whether the app supports taking notes on Chrome OS lock screen. Note that
-  // this ability is guarded by enable-lock-screen-apps feature flag, and
-  // whitelisted to Keep apps.
+  // this ability is guarded by enable-lock-screen-apps feature flag, and is
+  // currently restricted to Keep apps.
   NoteTakingLockScreenSupport lock_screen_support;
 };
 
@@ -212,26 +212,25 @@
   }
 
  private:
-  // The state of app ID whitelist cache (used for determining the state of
-  // note-taking apps whtielisted for the lock screen).
-  enum class AppWhitelistState {
-    // The whitelist value has not yet been determined.
+  // The state of the allowed app ID cache (used for determining the state of
+  // note-taking apps allowed on the lock screen).
+  enum class AllowedAppListState {
+    // The allowed apps have not yet been determined.
     kUndetermined,
-    // The app ID whitelist does not exist in the profile.
-    kNoAppWhitelist,
-    // The app ID whitelist exists in the profile.
-    kAppsWhitelisted
+    // No app ID restriction exists in the profile.
+    kAllAppsAllowed,
+    // A list of allowed app IDs exists in the profile.
+    kAllowedAppsListed
   };
 
   NoteTakingHelper();
   ~NoteTakingHelper() override;
 
-  // Returns true if |extension| is a whitelisted note-taking app and false
-  // otherwise.
-  bool IsWhitelistedChromeApp(const extensions::Extension* extension) const;
+  // Returns whether |extension| is an allowed note-taking app.
+  bool IsAllowedChromeApp(const extensions::Extension* extension) const;
 
-  // Queries and returns all installed and enabled whitelisted Chrome
-  // note-taking apps for |profile|.
+  // Queries and returns the note-taking Chrome apps that are installed,
+  // enabled, and allowed for |profile|.
   std::vector<const extensions::Extension*> GetChromeApps(
       Profile* profile) const;
 
@@ -266,11 +265,11 @@
   // |profile_with_enabled_lock_screen_apps_|.
   void OnAllowedNoteTakingAppsChanged();
 
-  // Updates the cached whitelist of note-taking apps allowed on the lock
-  // screen - it sets |lock_screen_whitelist_state_|  and
-  // |lock_screen_apps_allowed_by_policy_| to values appropriate for the current
+  // Updates the cached list of note-taking apps allowed on the lock screen - it
+  // sets |allowed_lock_screen_apps_state_|  and
+  // |allowed_lock_screen_apps_by_policy_| to values appropriate for the current
   // |profile_with_enabled_lock_screen_apps_| state.
-  void UpdateLockScreenAppsWhitelistState();
+  void UpdateAllowedLockScreenAppsList();
 
   // True iff Play Store is enabled (i.e. per the checkbox on the settings
   // page). Note that ARC may not be fully started yet when this is true, but it
@@ -284,10 +283,10 @@
   // Callback used to launch Chrome apps. Can be overridden for tests.
   LaunchChromeAppCallback launch_chrome_app_callback_;
 
-  // Extension IDs of whitelisted (but not necessarily installed) Chrome
+  // Extension IDs of allowed (but not necessarily installed) Chrome
   // note-taking apps in the order in which they're chosen if the user hasn't
   // expressed a preference.
-  std::vector<extensions::ExtensionId> whitelisted_chrome_app_ids_;
+  std::vector<extensions::ExtensionId> allowed_chrome_app_ids_;
 
   // Cached information about available Android note-taking apps.
   NoteTakingAppInfos android_apps_;
@@ -300,18 +299,19 @@
   // The profile for which lock screen apps are enabled,
   Profile* profile_with_enabled_lock_screen_apps_ = nullptr;
 
-  // The current AppWhitelistState for lock screen note taking in
-  // |profile_with_enabled_lock_screen_apps_|. If kAppsWhitelisted,
-  // |lock_screen_apps_allowed_by_policy_| should contain the set of whitelisted
+  // The current AllowedAppListState for lock screen note taking in
+  // |profile_with_enabled_lock_screen_apps_|. If kAllowedAppsListed,
+  // |lock_screen_apps_allowed_by_policy_| should contain the set of allowed
   // app IDs.
-  AppWhitelistState lock_screen_whitelist_state_ =
-      AppWhitelistState::kUndetermined;
+  AllowedAppListState allowed_lock_screen_apps_state_ =
+      AllowedAppListState::kUndetermined;
 
-  // If |lock_screen_whitelist_state_| is kAppsWhitelisted, contains all app
-  // IDs that are allowed to handle new-note action on the lock screen. The set
-  // should only be used for apps from |profile_with_enabled_lock_screen_apps_|
-  // and when |lock_screen_whitelist_state_| equals kAppsWhitelisted.
-  std::set<std::string> lock_screen_apps_allowed_by_policy_;
+  // If |allowed_lock_screen_apps_state_| is kAllowedAppsListed, contains all
+  // app IDs that are allowed to handle new-note action on the lock screen. The
+  // set should only be used for apps from
+  // |profile_with_enabled_lock_screen_apps_| and when
+  // |allowed_lock_screen_apps_state_| equals kAllowedAppsListed.
+  std::set<std::string> allowed_lock_screen_apps_by_policy_;
 
   // Tracks kNoteTakingAppsLockScreenAllowlist pref for the profile for which
   // lock screen apps are enabled.
diff --git a/chrome/browser/chromeos/platform_keys/platform_keys_service.h b/chrome/browser/chromeos/platform_keys/platform_keys_service.h
index 0541555..3bcc33a 100644
--- a/chrome/browser/chromeos/platform_keys/platform_keys_service.h
+++ b/chrome/browser/chromeos/platform_keys/platform_keys_service.h
@@ -192,10 +192,11 @@
   virtual void GetCertificates(TokenId token_id,
                                const GetCertificatesCallback callback) = 0;
 
-  // Returns the list of all keys available from the given |token_id| as a list
-  // of der-encoded SubjectPublicKeyInfo strings. |callback| will be invoked on
-  // the UI thread with the list of available public keys, possibly with an
-  // error status.
+  // Returns the list of all public keys available from the given |token_id|
+  // that have corresponding private keys on the same token as a list of
+  // DER-encoded SubjectPublicKeyInfo strings. |callback| will be invoked on the
+  // UI thread with the list of available public keys, possibly with an error
+  // status.
   virtual void GetAllKeys(TokenId token_id, GetAllKeysCallback callback) = 0;
 
   // Imports |certificate| to the given token if the certified key is already
diff --git a/chrome/browser/chromeos/platform_keys/platform_keys_service_nss.cc b/chrome/browser/chromeos/platform_keys/platform_keys_service_nss.cc
index 33ae260..4395843 100644
--- a/chrome/browser/chromeos/platform_keys/platform_keys_service_nss.cc
+++ b/chrome/browser/chromeos/platform_keys/platform_keys_service_nss.cc
@@ -1112,6 +1112,33 @@
       base::BindOnce(&DidGetCertificates, std::move(state)), slot);
 }
 
+// Returns true if |public_key| is relevant as a "platform key" that should be
+// visible to chrome extensions / subsystems.
+bool ShouldIncludePublicKey(SECKEYPublicKey* public_key) {
+  crypto::ScopedSECItem cka_id(SECITEM_AllocItem(/*arena=*/nullptr,
+                                                 /*item=*/nullptr,
+                                                 /*len=*/0));
+  if (PK11_ReadRawAttribute(
+          /*objType=*/PK11_TypePubKey, public_key, CKA_ID, cka_id.get()) !=
+      SECSuccess) {
+    return false;
+  }
+
+  base::StringPiece cka_id_str(reinterpret_cast<char*>(cka_id->data),
+                               cka_id->len);
+
+  // Only keys generated/stored by extensions/Chrome should be visible to
+  // extensions. Oemcrypto stores its key in the TPM, but that should not
+  // be exposed. Look at exposing additional attributes or changing the slot
+  // that Oemcrypto stores keys, so that it can be done based on properties
+  // of the key. See https://crbug/com/1136396
+  if (cka_id_str == "arc-oemcrypto") {
+    VLOG(0) << "Filtered out arc-oemcrypto public key.";
+    return false;
+  }
+  return true;
+}
+
 // Does the actual retrieval of the SubjectPublicKeyInfo string on a worker
 // thread. Used by GetAllKeysWithDb().
 void GetAllKeysOnWorkerThread(std::unique_ptr<GetAllKeysState> state) {
@@ -1123,8 +1150,8 @@
   // private + public keys, so it's sufficient to get the public keys (and also
   // not necessary to check that a private key for that public key really
   // exists).
-  SECKEYPublicKeyList* public_keys =
-      PK11_ListPublicKeysInSlot(state->slot_.get(), /*nickname=*/nullptr);
+  crypto::ScopedSECKEYPublicKeyList public_keys(
+      PK11_ListPublicKeysInSlot(state->slot_.get(), /*nickname=*/nullptr));
 
   if (!public_keys) {
     state->OnSuccess(FROM_HERE, std::move(public_key_spki_der_list));
@@ -1133,6 +1160,10 @@
 
   for (SECKEYPublicKeyListNode* node = PUBKEY_LIST_HEAD(public_keys);
        !PUBKEY_LIST_END(node, public_keys); node = PUBKEY_LIST_NEXT(node)) {
+    if (!ShouldIncludePublicKey(node->key)) {
+      continue;
+    }
+
     crypto::ScopedSECItem subject_public_key_info(
         SECKEY_EncodeDERSubjectPublicKeyInfo(node->key));
     if (!subject_public_key_info) {
@@ -1147,7 +1178,6 @@
     }
   }
 
-  SECKEY_DestroyPublicKeyList(public_keys);
   state->OnSuccess(FROM_HERE, std::move(public_key_spki_der_list));
 }
 
diff --git a/chrome/browser/chromeos/policy/arc_app_install_event_log_uploader.cc b/chrome/browser/chromeos/policy/arc_app_install_event_log_uploader.cc
index 4fbbe8e..d503372 100644
--- a/chrome/browser/chromeos/policy/arc_app_install_event_log_uploader.cc
+++ b/chrome/browser/chromeos/policy/arc_app_install_event_log_uploader.cc
@@ -75,9 +75,9 @@
   // base::Unretained() is safe here as the destructor cancels any pending
   // upload, after which the |client_| is guaranteed to not call the callback.
   client_->UploadAppInstallReport(
-      std::move(value_report), base::AdaptCallbackForRepeating(base::BindOnce(
-                                   &ArcAppInstallEventLogUploader::OnUploadDone,
-                                   base::Unretained(this))));
+      std::move(value_report),
+      base::BindOnce(&ArcAppInstallEventLogUploader::OnUploadDone,
+                     base::Unretained(this)));
 }
 
 }  // namespace policy
diff --git a/chrome/browser/chromeos/policy/configuration_policy_handler_chromeos.cc b/chrome/browser/chromeos/policy/configuration_policy_handler_chromeos.cc
index ca33ea0..c94e188 100644
--- a/chrome/browser/chromeos/policy/configuration_policy_handler_chromeos.cc
+++ b/chrome/browser/chromeos/policy/configuration_policy_handler_chromeos.cc
@@ -192,9 +192,9 @@
   if (!value)
     return true;
 
-  std::unique_ptr<base::Value> root_dict =
+  base::Value root_dict =
       chromeos::onc::ReadDictionaryFromJson(value->GetString());
-  if (!root_dict) {
+  if (!root_dict.is_dict()) {
     errors->AddError(policy_name(), IDS_POLICY_NETWORK_CONFIG_PARSE_FAILED);
     errors->SetDebugInfo(policy_name(), "ERROR: JSON parse error");
     return false;
@@ -212,8 +212,8 @@
 
   // ONC policies are always unencrypted.
   chromeos::onc::Validator::Result validation_result;
-  root_dict = validator.ValidateAndRepairObject(
-      &chromeos::onc::kToplevelConfigurationSignature, *root_dict,
+  validator.ValidateAndRepairObject(
+      &chromeos::onc::kToplevelConfigurationSignature, root_dict,
       &validation_result);
 
   // Pass error/warning message and non-localized debug_info to PolicyErrorMap.
@@ -291,23 +291,21 @@
   if (!config->is_string())
     return base::nullopt;
 
-  std::unique_ptr<base::DictionaryValue> toplevel_dict =
-      base::DictionaryValue::From(
-          chromeos::onc::ReadDictionaryFromJson(config->GetString()));
-  if (!toplevel_dict)
+  base::Value toplevel_dict =
+      chromeos::onc::ReadDictionaryFromJson(config->GetString());
+  if (!toplevel_dict.is_dict())
     return base::nullopt;
 
   // Placeholder to insert in place of the filtered setting.
   const char kPlaceholder[] = "********";
 
   toplevel_dict = chromeos::onc::MaskCredentialsInOncObject(
-      chromeos::onc::kToplevelConfigurationSignature,
-      *toplevel_dict,
+      chromeos::onc::kToplevelConfigurationSignature, toplevel_dict,
       kPlaceholder);
 
   std::string json_string;
   base::JSONWriter::WriteWithOptions(
-      *toplevel_dict, base::JSONWriter::OPTIONS_PRETTY_PRINT, &json_string);
+      toplevel_dict, base::JSONWriter::OPTIONS_PRETTY_PRINT, &json_string);
   return base::Value(json_string);
 }
 
diff --git a/chrome/browser/chromeos/policy/network_configuration_updater_unittest.cc b/chrome/browser/chromeos/policy/network_configuration_updater_unittest.cc
index ba09e09..66201c0 100644
--- a/chrome/browser/chromeos/policy/network_configuration_updater_unittest.cc
+++ b/chrome/browser/chromeos/policy/network_configuration_updater_unittest.cc
@@ -349,17 +349,17 @@
     providers.push_back(&provider_);
     policy_service_ = std::make_unique<PolicyServiceImpl>(std::move(providers));
 
-    std::unique_ptr<base::Value> fake_toplevel_onc =
+    base::Value fake_toplevel_onc =
         chromeos::onc::ReadDictionaryFromJson(kFakeONC);
 
     base::DictionaryValue* global_config = nullptr;
     fake_toplevel_onc
-        ->FindKey(onc::toplevel_config::kGlobalNetworkConfiguration)
+        .FindKey(onc::toplevel_config::kGlobalNetworkConfiguration)
         ->GetAsDictionary(&global_config);
     fake_global_network_config_.MergeDictionary(global_config);
 
     base::ListValue* certs = nullptr;
-    fake_toplevel_onc->FindKey(onc::toplevel_config::kCertificates)
+    fake_toplevel_onc.FindKey(onc::toplevel_config::kCertificates)
         ->GetAsList(&certs);
     fake_certificates_ =
         std::make_unique<chromeos::onc::OncParsedCertificates>(*certs);
@@ -369,10 +369,10 @@
   }
 
   base::Value* GetExpectedFakeNetworkConfigs(::onc::ONCSource source) {
-    std::unique_ptr<base::Value> fake_toplevel_onc =
+    base::Value fake_toplevel_onc =
         chromeos::onc::ReadDictionaryFromJson(kFakeONC);
     fake_network_configs_ =
-        fake_toplevel_onc->FindKey(onc::toplevel_config::kNetworkConfigurations)
+        fake_toplevel_onc.FindKey(onc::toplevel_config::kNetworkConfigurations)
             ->Clone();
     if (source == ::onc::ONC_SOURCE_DEVICE_POLICY) {
       std::string expected_identity =
diff --git a/chrome/browser/chromeos/policy/user_policy_manager_builder_chromeos.cc b/chrome/browser/chromeos/policy/user_policy_manager_builder_chromeos.cc
index 6d75afe..44ab761 100644
--- a/chrome/browser/chromeos/policy/user_policy_manager_builder_chromeos.cc
+++ b/chrome/browser/chromeos/policy/user_policy_manager_builder_chromeos.cc
@@ -308,7 +308,7 @@
     bool wildcard_match = false;
     if (connector->IsEnterpriseManaged() &&
         chromeos::CrosSettings::Get()->IsUserAllowlisted(
-            account_id.GetUserEmail(), &wildcard_match) &&
+            account_id.GetUserEmail(), &wildcard_match, user->GetType()) &&
         wildcard_match &&
         !connector->IsNonEnterpriseUser(account_id.GetUserEmail())) {
       manager->EnableWildcardLoginCheck(account_id.GetUserEmail());
diff --git a/chrome/browser/chromeos/policy/value_validation/onc_policy_value_validator_base.h b/chrome/browser/chromeos/policy/value_validation/onc_policy_value_validator_base.h
index e2f84b1..b905697 100644
--- a/chrome/browser/chromeos/policy/value_validation/onc_policy_value_validator_base.h
+++ b/chrome/browser/chromeos/policy/value_validation/onc_policy_value_validator_base.h
@@ -35,9 +35,9 @@
     if (!onc_string.has_value())
       return true;
 
-    std::unique_ptr<base::Value> root_dict =
+    base::Value root_dict =
         chromeos::onc::ReadDictionaryFromJson(onc_string.value());
-    if (!root_dict.get()) {
+    if (!root_dict.is_dict()) {
       out_validation_issues->push_back({policy_name_,
                                         ValueValidationIssue::Severity::kError,
                                         "JSON parse error."});
@@ -52,8 +52,8 @@
         true);  // Log warnings.
     validator.SetOncSource(source_);
     chromeos::onc::Validator::Result validation_result;
-    root_dict = validator.ValidateAndRepairObject(
-        &chromeos::onc::kToplevelConfigurationSignature, *root_dict,
+    validator.ValidateAndRepairObject(
+        &chromeos::onc::kToplevelConfigurationSignature, root_dict,
         &validation_result);
 
     bool error_found = false;
diff --git a/chrome/browser/chromeos/proxy_config_service_impl_unittest.cc b/chrome/browser/chromeos/proxy_config_service_impl_unittest.cc
index bf80cea..0d9f4078 100644
--- a/chrome/browser/chromeos/proxy_config_service_impl_unittest.cc
+++ b/chrome/browser/chromeos/proxy_config_service_impl_unittest.cc
@@ -525,7 +525,7 @@
   SetUpSharedEthernet();
   SetUpProxyConfigService(&profile_prefs_);
 
-  std::unique_ptr<base::Value> ethernet_policy =
+  base::Value ethernet_policy =
       chromeos::onc::ReadDictionaryFromJson(kEthernetPolicy);
 
   std::unique_ptr<base::ListValue> network_configs(new base::ListValue);
diff --git a/chrome/browser/chromeos/settings/cros_settings.cc b/chrome/browser/chromeos/settings/cros_settings.cc
index f4f2c0c0..4f6e84f9 100644
--- a/chrome/browser/chromeos/settings/cros_settings.cc
+++ b/chrome/browser/chromeos/settings/cros_settings.cc
@@ -76,20 +76,6 @@
   g_using_cros_settings_for_testing = false;
 }
 
-bool CrosSettings::IsUserAllowlisted(const std::string& username,
-                                     bool* wildcard_match) const {
-  // Skip allowlist check for tests.
-  if (chromeos::switches::ShouldSkipOobePostLogin()) {
-    return true;
-  }
-
-  bool allow_new_user = false;
-  GetBoolean(kAccountsPrefAllowNewUser, &allow_new_user);
-  if (allow_new_user)
-    return true;
-  return FindEmailInList(kAccountsPrefUsers, username, wildcard_match);
-}
-
 CrosSettings::CrosSettings() = default;
 
 CrosSettings::CrosSettings(DeviceSettingsService* device_settings_service,
@@ -194,6 +180,28 @@
   return false;
 }
 
+bool CrosSettings::IsUserAllowlisted(
+    const std::string& username,
+    bool* wildcard_match,
+    const base::Optional<user_manager::UserType>& user_type) const {
+  // Skip allowlist check for tests.
+  if (chromeos::switches::ShouldSkipOobePostLogin()) {
+    return true;
+  }
+
+  bool allow_new_user = false;
+  GetBoolean(kAccountsPrefAllowNewUser, &allow_new_user);
+  if (allow_new_user)
+    return true;
+
+  if (FindEmailInList(kAccountsPrefUsers, username, wildcard_match))
+    return true;
+
+  bool family_link_allowed = false;
+  GetBoolean(kAccountsPrefFamilyLinkAccountsAllowed, &family_link_allowed);
+  return family_link_allowed && user_type == user_manager::USER_TYPE_CHILD;
+}
+
 bool CrosSettings::FindEmailInList(const std::string& path,
                                    const std::string& email,
                                    bool* wildcard_match) const {
diff --git a/chrome/browser/chromeos/settings/cros_settings.h b/chrome/browser/chromeos/settings/cros_settings.h
index 0219252..b6c07ad 100644
--- a/chrome/browser/chromeos/settings/cros_settings.h
+++ b/chrome/browser/chromeos/settings/cros_settings.h
@@ -13,9 +13,11 @@
 #include "base/callback_forward.h"
 #include "base/callback_list.h"
 #include "base/macros.h"
+#include "base/optional.h"
 #include "base/sequence_checker.h"
 #include "chromeos/settings/cros_settings_names.h"
 #include "chromeos/settings/cros_settings_provider.h"
+#include "components/user_manager/user_type.h"
 
 class PrefService;
 
@@ -45,12 +47,6 @@
   static void SetForTesting(CrosSettings* test_instance);
   static void ShutdownForTesting();
 
-  // Checks if the given username is on the list of users allowed to sign-in to
-  // this device. |wildcard_match| may be NULL. If it's present, it'll be set to
-  // true if the list check was satisfied via a wildcard.
-  bool IsUserAllowlisted(const std::string& username,
-                         bool* wildcard_match) const;
-
   // Creates an instance with no providers as yet. This is meant for unit tests,
   // production code uses the singleton returned by Get() above.
   CrosSettings();
@@ -95,6 +91,16 @@
   bool GetDictionary(const std::string& path,
                      const base::DictionaryValue** out_value) const;
 
+  // Checks if the given username is on the list of users allowed to sign-in to
+  // this device. |wildcard_match| may be nullptr. If it's present, it'll be set
+  // to true if the list check was satisfied via a wildcard. In some
+  // configurations user can be allowed based on the |user_type|. See
+  // |DeviceFamilyLinkAccountsAllowed| policy.
+  bool IsUserAllowlisted(
+      const std::string& username,
+      bool* wildcard_match,
+      const base::Optional<user_manager::UserType>& user_type) const;
+
   // Helper function for the allowlist op. Implemented here because we will need
   // this in a few places. The functions searches for |email| in the pref |path|
   // It respects allowlists so foo@bar.baz will match *@bar.baz too. If the
diff --git a/chrome/browser/chromeos/settings/cros_settings_unittest.cc b/chrome/browser/chromeos/settings/cros_settings_unittest.cc
index 77326026..681409b9 100644
--- a/chrome/browser/chromeos/settings/cros_settings_unittest.cc
+++ b/chrome/browser/chromeos/settings/cros_settings_unittest.cc
@@ -10,6 +10,8 @@
 
 #include "base/bind.h"
 #include "base/memory/weak_ptr.h"
+#include "base/optional.h"
+#include "base/test/scoped_feature_list.h"
 #include "base/values.h"
 #include "chrome/browser/chromeos/login/users/fake_chrome_user_manager.h"
 #include "chrome/browser/chromeos/ownership/owner_settings_service_chromeos.h"
@@ -20,12 +22,14 @@
 #include "chrome/test/base/scoped_testing_local_state.h"
 #include "chrome/test/base/testing_browser_process.h"
 #include "chrome/test/base/testing_profile.h"
+#include "chromeos/constants/chromeos_features.h"
 #include "chromeos/settings/cros_settings_names.h"
 #include "chromeos/tpm/stub_install_attributes.h"
 #include "components/ownership/mock_owner_key_util.h"
 #include "components/policy/core/common/cloud/cloud_policy_constants.h"
 #include "components/policy/proto/chrome_device_policy.pb.h"
 #include "components/policy/proto/device_management_backend.pb.h"
+#include "components/user_manager/user_type.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/test/browser_task_environment.h"
 #include "content/public/test/test_utils.h"
@@ -131,6 +135,11 @@
                                                 NULL);
   }
 
+  bool IsUserAllowed(const std::string& username,
+                     const base::Optional<user_manager::UserType>& user_type) {
+    return CrosSettings::Get()->IsUserAllowlisted(username, nullptr, user_type);
+  }
+
   content::BrowserTaskEnvironment task_environment_{
       content::BrowserTaskEnvironment::IO_MAINLOOP};
 
@@ -348,4 +357,83 @@
   EXPECT_TRUE(wildcard_match);
 }
 
+// DeviceFamilyLinkAccountsAllowed should not have any effect if allowlist is
+// not set.
+TEST_F(CrosSettingsTest, AllowFamilyLinkAccountsWithEmptyAllowlist) {
+  base::test::ScopedFeatureList scoped_feature_list;
+  scoped_feature_list.InitAndEnableFeature(
+      chromeos::features::kFamilyLinkOnSchoolDevice);
+
+  device_policy_.payload().mutable_allow_new_users()->set_allow_new_users(
+      false);
+  device_policy_.payload().mutable_user_allowlist()->clear_user_allowlist();
+  device_policy_.payload()
+      .mutable_family_link_accounts_allowed()
+      ->set_family_link_accounts_allowed(true);
+
+  StoreDevicePolicy();
+
+  ExpectPref(kAccountsPrefAllowNewUser, base::Value(false));
+  ExpectPref(kAccountsPrefUsers, base::ListValue());
+  ExpectPref(kAccountsPrefFamilyLinkAccountsAllowed, base::Value(false));
+
+  EXPECT_FALSE(IsUserAllowed(kUser1, base::nullopt));
+  EXPECT_FALSE(IsUserAllowed(kUser1, user_manager::USER_TYPE_CHILD));
+  EXPECT_FALSE(IsUserAllowed(kUser1, user_manager::USER_TYPE_REGULAR));
+}
+
+// DeviceFamilyLinkAccountsAllowed should not have any effect if the feature is
+// disabled.
+TEST_F(CrosSettingsTest, AllowFamilyLinkAccountsWithFeatureDisabled) {
+  base::test::ScopedFeatureList scoped_feature_list;
+  scoped_feature_list.InitAndDisableFeature(
+      chromeos::features::kFamilyLinkOnSchoolDevice);
+
+  device_policy_.payload().mutable_allow_new_users()->set_allow_new_users(
+      false);
+  device_policy_.payload().mutable_user_allowlist()->add_user_allowlist(kOwner);
+  device_policy_.payload()
+      .mutable_family_link_accounts_allowed()
+      ->set_family_link_accounts_allowed(true);
+
+  StoreDevicePolicy();
+
+  base::ListValue allowlist;
+  allowlist.AppendString(kOwner);
+  ExpectPref(kAccountsPrefAllowNewUser, base::Value(false));
+  ExpectPref(kAccountsPrefUsers, allowlist);
+  ExpectPref(kAccountsPrefFamilyLinkAccountsAllowed, base::Value(false));
+
+  EXPECT_TRUE(IsUserAllowed(kOwner, base::nullopt));
+  EXPECT_FALSE(IsUserAllowed(kUser1, base::nullopt));
+  EXPECT_FALSE(IsUserAllowed(kUser1, user_manager::USER_TYPE_CHILD));
+  EXPECT_FALSE(IsUserAllowed(kUser1, user_manager::USER_TYPE_REGULAR));
+}
+
+TEST_F(CrosSettingsTest, AllowFamilyLinkAccountsWithAllowlist) {
+  base::test::ScopedFeatureList scoped_feature_list;
+  scoped_feature_list.InitAndEnableFeature(
+      chromeos::features::kFamilyLinkOnSchoolDevice);
+
+  device_policy_.payload().mutable_allow_new_users()->set_allow_new_users(
+      false);
+  device_policy_.payload().mutable_user_allowlist()->add_user_allowlist(kOwner);
+  device_policy_.payload()
+      .mutable_family_link_accounts_allowed()
+      ->set_family_link_accounts_allowed(true);
+
+  StoreDevicePolicy();
+
+  base::ListValue allowlist;
+  allowlist.AppendString(kOwner);
+  ExpectPref(kAccountsPrefAllowNewUser, base::Value(false));
+  ExpectPref(kAccountsPrefUsers, allowlist);
+  ExpectPref(kAccountsPrefFamilyLinkAccountsAllowed, base::Value(true));
+
+  EXPECT_TRUE(IsUserAllowed(kOwner, base::nullopt));
+  EXPECT_FALSE(IsUserAllowed(kUser1, base::nullopt));
+  EXPECT_TRUE(IsUserAllowed(kUser1, user_manager::USER_TYPE_CHILD));
+  EXPECT_FALSE(IsUserAllowed(kUser1, user_manager::USER_TYPE_REGULAR));
+}
+
 }  // namespace chromeos
diff --git a/chrome/browser/chromeos/settings/device_settings_provider.cc b/chrome/browser/chromeos/settings/device_settings_provider.cc
index 278fa30..ccbe3b4 100644
--- a/chrome/browser/chromeos/settings/device_settings_provider.cc
+++ b/chrome/browser/chromeos/settings/device_settings_provider.cc
@@ -30,6 +30,7 @@
 #include "chrome/browser/chromeos/settings/device_settings_cache.h"
 #include "chrome/browser/chromeos/settings/stats_reporting_controller.h"
 #include "chrome/browser/chromeos/tpm_firmware_update.h"
+#include "chromeos/constants/chromeos_features.h"
 #include "chromeos/constants/chromeos_switches.h"
 #include "chromeos/dbus/cryptohome/cryptohome_client.h"
 #include "chromeos/dbus/dbus_thread_manager.h"
@@ -216,12 +217,18 @@
   }
 
   // Value of DeviceFamilyLinkAccountsAllowed policy does not affect
-  // |kAccountsPrefAllowNewUser| setting. Family Link accounts will be only
-  // allowed if both |kAccountsPrefAllowNewUser| and
-  // |kAccountsPrefFamilyLinkAccountsAllowed| are true.
+  // |kAccountsPrefAllowNewUser| setting. Family Link accounts are only
+  // allowed if user allowlist is enforced.
+  bool user_allowlist_enforced =
+      ((policy.has_user_whitelist() &&
+        policy.user_whitelist().user_whitelist_size() > 0) ||
+       (policy.has_user_allowlist() &&
+        policy.user_allowlist().user_allowlist_size() > 0));
   new_values_cache->SetBoolean(
       kAccountsPrefFamilyLinkAccountsAllowed,
-      policy.has_family_link_accounts_allowed() &&
+      chromeos::features::IsFamilyLinkOnSchoolDeviceEnabled() &&
+          user_allowlist_enforced &&
+          policy.has_family_link_accounts_allowed() &&
           policy.family_link_accounts_allowed()
               .has_family_link_accounts_allowed() &&
           policy.family_link_accounts_allowed().family_link_accounts_allowed());
diff --git a/chrome/browser/chromeos/settings/device_settings_provider_unittest.cc b/chrome/browser/chromeos/settings/device_settings_provider_unittest.cc
index 8f4ea60..70cc07db 100644
--- a/chrome/browser/chromeos/settings/device_settings_provider_unittest.cc
+++ b/chrome/browser/chromeos/settings/device_settings_provider_unittest.cc
@@ -16,6 +16,7 @@
 #include "base/macros.h"
 #include "base/path_service.h"
 #include "base/test/metrics/histogram_tester.h"
+#include "base/test/scoped_feature_list.h"
 #include "base/test/scoped_path_override.h"
 #include "base/values.h"
 #include "chrome/browser/chromeos/policy/device_local_account.h"
@@ -25,6 +26,7 @@
 #include "chrome/test/base/scoped_testing_local_state.h"
 #include "chrome/test/base/testing_browser_process.h"
 #include "chrome/test/base/testing_profile.h"
+#include "chromeos/constants/chromeos_features.h"
 #include "chromeos/settings/cros_settings_names.h"
 #include "chromeos/tpm/stub_install_attributes.h"
 #include "components/policy/proto/chrome_device_policy.pb.h"
@@ -421,6 +423,13 @@
     BuildAndInstallDevicePolicy();
   }
 
+  void AddUserToAllowlist(const std::string& user_id) {
+    em::UserAllowlistProto* proto =
+        device_policy_->payload().mutable_user_allowlist();
+    proto->add_user_allowlist(user_id);
+    BuildAndInstallDevicePolicy();
+  }
+
   void VerifyDeviceShowLowDiskSpaceNotification(bool expected) {
     const base::Value expected_value(expected);
     EXPECT_EQ(expected_value,
@@ -1177,14 +1186,43 @@
   VerifyDeviceShowLowDiskSpaceNotification(false);
 }
 
-TEST_F(DeviceSettingsProviderTest, DeviceFamilyLinkAccountsAllowed) {
+// Tests DeviceFamilyLinkAccountsAllowed policy with the feature disabled.
+// The policy should have no effect.
+TEST_F(DeviceSettingsProviderTest, DeviceFamilyLinkAccountsAllowedDisabled) {
+  base::test::ScopedFeatureList scoped_feature_list;
+  scoped_feature_list.InitAndDisableFeature(
+      chromeos::features::kFamilyLinkOnSchoolDevice);
+
   base::Value default_value(false);
   VerifyPolicyValue(kAccountsPrefFamilyLinkAccountsAllowed, &default_value);
 
+  // Family Link allowed with allowlist set, but the feature is disabled.
   SetDeviceFamilyLinkAccountsAllowed(true);
+  AddUserToAllowlist("*@managedchrome.com");
+  EXPECT_EQ(base::Value(false),
+            *provider_->Get(kAccountsPrefFamilyLinkAccountsAllowed));
+}
+
+// Tests DeviceFamilyLinkAccountsAllowed policy with the feature enabled.
+TEST_F(DeviceSettingsProviderTest, DeviceFamilyLinkAccountsAllowedEnabled) {
+  base::test::ScopedFeatureList scoped_feature_list;
+  scoped_feature_list.InitAndEnableFeature(
+      chromeos::features::kFamilyLinkOnSchoolDevice);
+
+  base::Value default_value(false);
+  VerifyPolicyValue(kAccountsPrefFamilyLinkAccountsAllowed, &default_value);
+
+  // Family Link allowed, but no allowlist set.
+  SetDeviceFamilyLinkAccountsAllowed(true);
+  EXPECT_EQ(base::Value(false),
+            *provider_->Get(kAccountsPrefFamilyLinkAccountsAllowed));
+
+  // Family Link allowed with allowlist set.
+  AddUserToAllowlist("*@managedchrome.com");
   EXPECT_EQ(base::Value(true),
             *provider_->Get(kAccountsPrefFamilyLinkAccountsAllowed));
 
+  // Family Link disallowed with allowlist set.
   SetDeviceFamilyLinkAccountsAllowed(false);
   EXPECT_EQ(base::Value(false),
             *provider_->Get(kAccountsPrefFamilyLinkAccountsAllowed));
diff --git a/chrome/browser/chromeos/system_logs/shill_log_source.cc b/chrome/browser/chromeos/system_logs/shill_log_source.cc
index 1e09956..3e8b6ef 100644
--- a/chrome/browser/chromeos/system_logs/shill_log_source.cc
+++ b/chrome/browser/chromeos/system_logs/shill_log_source.cc
@@ -226,10 +226,9 @@
   // Convert UIData from a string to a dictionary.
   std::string* ui_data = dict.FindStringKey(shill::kUIDataProperty);
   if (ui_data) {
-    std::unique_ptr<base::Value> ui_data_dict(
-        chromeos::onc::ReadDictionaryFromJson(*ui_data));
-    if (ui_data_dict)
-      dict.SetKey(shill::kUIDataProperty, std::move(*ui_data_dict));
+    base::Value ui_data_dict(chromeos::onc::ReadDictionaryFromJson(*ui_data));
+    if (ui_data_dict.is_dict())
+      dict.SetKey(shill::kUIDataProperty, std::move(ui_data_dict));
   }
 
   if (!scrub_)
diff --git a/chrome/browser/lacros/account_manager_facade_lacros.cc b/chrome/browser/lacros/account_manager_facade_lacros.cc
index 9b6c169..5cdc5d3 100644
--- a/chrome/browser/lacros/account_manager_facade_lacros.cc
+++ b/chrome/browser/lacros/account_manager_facade_lacros.cc
@@ -4,11 +4,66 @@
 
 #include "chrome/browser/lacros/account_manager_facade_lacros.h"
 
-AccountManagerFacadeLacros::AccountManagerFacadeLacros() = default;
+#include <memory>
+#include <utility>
+
+#include "base/bind.h"
+#include "chromeos/lacros/lacros_chrome_service_impl.h"
+
+namespace {
+
+// Interface versions in //chromeos/crosapi/mojom/account_manager.mojom:
+// MinVersion of crosapi::mojom::AccountManager::AddObserver
+constexpr uint32_t kMinVersionWithObserver = 1;
+
+}  // namespace
+
+AccountManagerFacadeLacros::AccountManagerFacadeLacros()
+    : lacros_chrome_service_impl_(chromeos::LacrosChromeServiceImpl::Get()) {
+  if (!lacros_chrome_service_impl_->IsAccountManagerAvailable())
+    return;
+
+  lacros_chrome_service_impl_->account_manager_remote().QueryVersion(
+      base::BindOnce(&AccountManagerFacadeLacros::OnVersionCheck,
+                     weak_factory_.GetWeakPtr()));
+}
 
 AccountManagerFacadeLacros::~AccountManagerFacadeLacros() = default;
 
 bool AccountManagerFacadeLacros::IsInitialized() {
-  // TODO(sinhak): Implement stub.
-  return false;
+  return is_initialized_;
 }
+
+void AccountManagerFacadeLacros::OnVersionCheck(uint32_t version) {
+  if (version < kMinVersionWithObserver)
+    return;
+
+  lacros_chrome_service_impl_->account_manager_remote()->AddObserver(
+      base::BindOnce(&AccountManagerFacadeLacros::OnReceiverReceived,
+                     weak_factory_.GetWeakPtr()));
+}
+
+void AccountManagerFacadeLacros::OnReceiverReceived(
+    mojo::PendingReceiver<AccountManagerObserver> receiver) {
+  receiver_ =
+      std::make_unique<mojo::Receiver<crosapi::mojom::AccountManagerObserver>>(
+          this, std::move(receiver));
+  // At this point (|receiver_| exists), we are subscribed to Account Manager.
+
+  lacros_chrome_service_impl_->account_manager_remote()->IsInitialized(
+      base::BindOnce(&AccountManagerFacadeLacros::OnInitialized,
+                     weak_factory_.GetWeakPtr()));
+}
+void AccountManagerFacadeLacros::OnInitialized(bool is_initialized) {
+  if (is_initialized)
+    is_initialized_ = true;
+  // else: We will receive a notification in |OnTokenUpserted|.
+}
+
+void AccountManagerFacadeLacros::OnTokenUpserted(
+    crosapi::mojom::AccountPtr account) {
+  is_initialized_ = true;
+}
+
+void AccountManagerFacadeLacros::OnAccountRemoved(
+    crosapi::mojom::AccountPtr account) {}
diff --git a/chrome/browser/lacros/account_manager_facade_lacros.h b/chrome/browser/lacros/account_manager_facade_lacros.h
index 5d4b66e..d43df7c21 100644
--- a/chrome/browser/lacros/account_manager_facade_lacros.h
+++ b/chrome/browser/lacros/account_manager_facade_lacros.h
@@ -5,11 +5,22 @@
 #ifndef CHROME_BROWSER_LACROS_ACCOUNT_MANAGER_FACADE_LACROS_H_
 #define CHROME_BROWSER_LACROS_ACCOUNT_MANAGER_FACADE_LACROS_H_
 
+#include <memory>
+
+#include "base/memory/weak_ptr.h"
 #include "chromeos/components/account_manager/account_manager_facade.h"
+#include "chromeos/crosapi/mojom/account_manager.mojom.h"
+#include "mojo/public/cpp/bindings/receiver.h"
+
+namespace chromeos {
+class LacrosChromeServiceImpl;
+}  // namespace chromeos
 
 // Lacros specific implementation of |AccountManagerFacade| that talks to
 // |chromeos::AccountManager|, residing in ash-chrome, over Mojo.
-class AccountManagerFacadeLacros : public AccountManagerFacade {
+class AccountManagerFacadeLacros
+    : public AccountManagerFacade,
+      public crosapi::mojom::AccountManagerObserver {
  public:
   AccountManagerFacadeLacros();
   AccountManagerFacadeLacros(const AccountManagerFacadeLacros&) = delete;
@@ -19,6 +30,23 @@
 
   // AccountManagerFacade overrides:
   bool IsInitialized() override;
+
+  // crosapi::mojom::AccountManagerObserver overrides:
+  void OnTokenUpserted(crosapi::mojom::AccountPtr account) override;
+  void OnAccountRemoved(crosapi::mojom::AccountPtr account) override;
+
+ private:
+  void OnVersionCheck(uint32_t version);
+  void OnReceiverReceived(
+      mojo::PendingReceiver<AccountManagerObserver> receiver);
+  void OnInitialized(bool is_initialized);
+
+  bool is_initialized_ = false;
+  chromeos::LacrosChromeServiceImpl* const lacros_chrome_service_impl_;
+  std::unique_ptr<mojo::Receiver<crosapi::mojom::AccountManagerObserver>>
+      receiver_;
+
+  base::WeakPtrFactory<AccountManagerFacadeLacros> weak_factory_{this};
 };
 
 #endif  // CHROME_BROWSER_LACROS_ACCOUNT_MANAGER_FACADE_LACROS_H_
diff --git a/chrome/browser/media/kaleidoscope/kaleidoscope_internal_resources.grd b/chrome/browser/media/kaleidoscope/kaleidoscope_internal_resources.grd
index 2460561..aaa1761 100644
--- a/chrome/browser/media/kaleidoscope/kaleidoscope_internal_resources.grd
+++ b/chrome/browser/media/kaleidoscope/kaleidoscope_internal_resources.grd
@@ -21,6 +21,7 @@
       <include name="IDR_KALEIDOSCOPE_CONTENT_JS" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/ks-content.js" use_base_dir="false" type="BINDATA" />
       <include name="IDR_KALEIDOSCOPE_CONTENT_WORKER_JS" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/ks-content-worker.js" use_base_dir="false" type="BINDATA" />
       <include name="IDR_KALEIDOSCOPE_HTML" file="internal/resources/kaleidoscope.html" type="BINDATA" />
+      <include name="IDR_KALEIDOSCOPE_ICONS_JS" file="${root_gen_dir}/chrome/browser/media/kaleidoscope/internal/resources/icons.js" use_base_dir="false" type="BINDATA" />
       <include name="IDR_KALEIDOSCOPE_JS" file="internal/resources/kaleidoscope.js" type="BINDATA" />
       <include name="IDR_KALEIDOSCOPE_MESSAGES_JS" file="internal/resources/messages.js" type="BINDATA" />
       <include name="IDR_KALEIDOSCOPE_UTILS_JS" file="internal/resources/utils.js" type="BINDATA" />
diff --git a/chrome/browser/media/kaleidoscope/kaleidoscope_ui.cc b/chrome/browser/media/kaleidoscope/kaleidoscope_ui.cc
index b6053c7..59ceeeef 100644
--- a/chrome/browser/media/kaleidoscope/kaleidoscope_ui.cc
+++ b/chrome/browser/media/kaleidoscope/kaleidoscope_ui.cc
@@ -324,6 +324,7 @@
   untrusted_source->AddResourcePath("content.js", IDR_KALEIDOSCOPE_CONTENT_JS);
   untrusted_source->AddResourcePath("content-worker.js",
                                     IDR_KALEIDOSCOPE_CONTENT_WORKER_JS);
+  untrusted_source->AddResourcePath("icons.js", IDR_KALEIDOSCOPE_ICONS_JS);
   untrusted_source->AddResourcePath("messages.js",
                                     IDR_KALEIDOSCOPE_MESSAGES_JS);
   untrusted_source->AddResourcePath("toolbar.js", IDR_KALEIDOSCOPE_TOOLBAR_JS);
diff --git a/chrome/browser/notifications/notification_display_queue.cc b/chrome/browser/notifications/notification_display_queue.cc
index 6abd57e..22c88c3 100644
--- a/chrome/browser/notifications/notification_display_queue.cc
+++ b/chrome/browser/notifications/notification_display_queue.cc
@@ -7,59 +7,10 @@
 #include <algorithm>
 #include <utility>
 
-#include "base/bind.h"
-#include "base/containers/flat_set.h"
-#include "base/feature_list.h"
-#include "build/build_config.h"
-#include "chrome/browser/browser_features.h"
-#include "chrome/browser/media/webrtc/media_capture_devices_dispatcher.h"
-#include "chrome/browser/media/webrtc/media_stream_capture_indicator.h"
 #include "chrome/browser/notifications/notification_display_service.h"
 
 namespace {
 
-#if !defined(OS_ANDROID)
-// This notification blocker listens to the events when the user starts
-// capturing a display. It will block notifications while such a capture is
-// ongoing. Note that this does not include casting the whole display and only
-// covers capturing via WebContents.
-class ScreenCaptureNotificationBlocker
-    : public NotificationBlocker,
-      public MediaStreamCaptureIndicator::Observer {
- public:
-  ScreenCaptureNotificationBlocker() {
-    observer_.Add(MediaCaptureDevicesDispatcher::GetInstance()
-                      ->GetMediaStreamCaptureIndicator()
-                      .get());
-  }
-
-  // NotificationBlocker:
-  bool ShouldBlockNotifications() override {
-    return !capturing_web_contents_.empty();
-  }
-
-  // MediaStreamCaptureIndicator::Observer:
-  void OnIsCapturingDisplayChanged(content::WebContents* web_contents,
-                                   bool is_capturing_display) override {
-    if (is_capturing_display)
-      capturing_web_contents_.insert(web_contents);
-    else
-      capturing_web_contents_.erase(web_contents);
-
-    NotifyBlockingStateChanged();
-  }
-
- private:
-  ScopedObserver<MediaStreamCaptureIndicator,
-                 MediaStreamCaptureIndicator::Observer>
-      observer_{this};
-
-  // Storing raw pointers here is fine because we never access them. We're only
-  // interested in the current set of WebContents that captures a display.
-  base::flat_set<content::WebContents*> capturing_web_contents_;
-};
-#endif  // !defined(OS_ANDROID)
-
 bool IsWebNotification(NotificationHandler::Type notification_type) {
   return notification_type == NotificationHandler::Type::WEB_PERSISTENT ||
          notification_type == NotificationHandler::Type::WEB_NON_PERSISTENT ||
@@ -70,19 +21,7 @@
 
 NotificationDisplayQueue::NotificationDisplayQueue(
     NotificationDisplayService* notification_display_service)
-    : notification_display_service_(notification_display_service) {
-  NotificationBlockers blockers;
-
-#if !defined(OS_ANDROID)
-  // TODO(knollr): Also block notifications while casting a screen.
-  if (base::FeatureList::IsEnabled(
-          features::kMuteNotificationsDuringScreenShare)) {
-    blockers.push_back(std::make_unique<ScreenCaptureNotificationBlocker>());
-  }
-#endif  // !defined(OS_ANDROID)
-
-  SetNotificationBlockers(std::move(blockers));
-}
+    : notification_display_service_(notification_display_service) {}
 
 NotificationDisplayQueue::~NotificationDisplayQueue() = default;
 
@@ -141,6 +80,12 @@
   MaybeDisplayQueuedNotifications();
 }
 
+void NotificationDisplayQueue::AddNotificationBlocker(
+    std::unique_ptr<NotificationBlocker> blocker) {
+  notification_blocker_observer_.Add(blocker.get());
+  blockers_.push_back(std::move(blocker));
+}
+
 void NotificationDisplayQueue::MaybeDisplayQueuedNotifications() {
   if (IsAnyNotificationBlockerActive())
     return;
diff --git a/chrome/browser/notifications/notification_display_queue.h b/chrome/browser/notifications/notification_display_queue.h
index 8730fe2f..95019e0 100644
--- a/chrome/browser/notifications/notification_display_queue.h
+++ b/chrome/browser/notifications/notification_display_queue.h
@@ -58,9 +58,12 @@
   // Returns a set of the currently queued notification ids.
   std::set<std::string> GetQueuedNotificationIds() const;
 
-  // Sets the list of |blockers| to be used and observers their state.
+  // Sets the list of |blockers| to be used and observes their state.
   void SetNotificationBlockers(NotificationBlockers blockers);
 
+  // Adds |blocker| to the list of blockers to be used and observes its state.
+  void AddNotificationBlocker(std::unique_ptr<NotificationBlocker> blocker);
+
  private:
   // Called when the state of a notification blocker changes. Will display and
   // free all queued notifications if no blocker is active anymore.
diff --git a/chrome/browser/notifications/notification_display_service_impl.cc b/chrome/browser/notifications/notification_display_service_impl.cc
index 7c3a74f..ed59f98d 100644
--- a/chrome/browser/notifications/notification_display_service_impl.cc
+++ b/chrome/browser/notifications/notification_display_service_impl.cc
@@ -39,6 +39,10 @@
 #include "chrome/browser/nearby_sharing/nearby_notification_handler.h"
 #endif
 
+#if !defined(OS_ANDROID)
+#include "chrome/browser/notifications/screen_capture_notification_blocker.h"
+#endif
+
 namespace {
 
 void OperationCompleted() {
@@ -92,6 +96,12 @@
     AddNotificationHandler(NotificationHandler::Type::ANNOUNCEMENT,
                            std::make_unique<AnnouncementNotificationHandler>());
 
+    if (base::FeatureList::IsEnabled(
+            features::kMuteNotificationsDuringScreenShare)) {
+      notification_queue_.AddNotificationBlocker(
+          std::make_unique<ScreenCaptureNotificationBlocker>());
+    }
+
 #endif
 
 #if defined(OS_CHROMEOS)
diff --git a/chrome/browser/notifications/notification_platform_bridge_mac_unnotification.h b/chrome/browser/notifications/notification_platform_bridge_mac_unnotification.h
index 0247f45..7ef7cb35 100644
--- a/chrome/browser/notifications/notification_platform_bridge_mac_unnotification.h
+++ b/chrome/browser/notifications/notification_platform_bridge_mac_unnotification.h
@@ -50,6 +50,8 @@
 
   // Request permission to send notifications
   void RequestPermission();
+  // Create default categories for banners and alerts
+  void CreateDefaultCategories();
 
  private:
   // Cocoa class that receives callbacks from the UNUserNotificationCenter.
diff --git a/chrome/browser/notifications/notification_platform_bridge_mac_unnotification.mm b/chrome/browser/notifications/notification_platform_bridge_mac_unnotification.mm
index ff3c5fa..e83e7d3 100644
--- a/chrome/browser/notifications/notification_platform_bridge_mac_unnotification.mm
+++ b/chrome/browser/notifications/notification_platform_bridge_mac_unnotification.mm
@@ -16,12 +16,21 @@
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/cocoa/notifications/unnotification_builder_mac.h"
 #import "chrome/browser/ui/cocoa/notifications/unnotification_response_builder_mac.h"
+#include "chrome/grit/generated_resources.h"
 #include "content/public/browser/browser_task_traits.h"
+#include "ui/base/l10n/l10n_util_mac.h"
 #include "ui/message_center/public/cpp/notification.h"
 
 @class UNMutableNotificationContent;
 @class UNUserNotificationCenter;
 
+namespace {
+
+NSString* const kCloseAndSettingsCategory = @"CLOSE_AND_SETTINGS";
+NSString* const kCloseCategory = @"CLOSE";
+
+}  // namespace
+
 // A Cocoa class that represents the delegate of UNUserNotificationCenter and
 // can forward commands to C++.
 API_AVAILABLE(macosx(10.14))
@@ -44,6 +53,7 @@
 
   // TODO(crbug/1129366): Determine when to request permission
   NotificationPlatformBridgeMacUNNotification::RequestPermission();
+  NotificationPlatformBridgeMacUNNotification::CreateDefaultCategories();
 }
 
 NotificationPlatformBridgeMacUNNotification::
@@ -90,7 +100,13 @@
 
   UNMutableNotificationContent* content = [builder buildUserNotification];
 
-  // TODO(crbug/1129398): Add close button to banners
+  // TODO(crbug/1136061): Add support for complex categories and move setting
+  // the categories to the place that will be building the complex categories
+  if (notification.should_show_settings_button())
+    [content setCategoryIdentifier:kCloseAndSettingsCategory];
+  else
+    [content setCategoryIdentifier:kCloseCategory];
+
   UNNotificationRequest* request = [UNNotificationRequest
       requestWithIdentifier:base::SysUTF8ToNSString(notification.id())
                     content:content
@@ -191,6 +207,38 @@
                     }];
 }
 
+void NotificationPlatformBridgeMacUNNotification::CreateDefaultCategories() {
+  UNNotificationAction* closeButton = [UNNotificationAction
+      actionWithIdentifier:notification_constants::kNotificationCloseButtonTag
+                     title:l10n_util::GetNSString(IDS_NOTIFICATION_BUTTON_CLOSE)
+                   options:UNNotificationActionOptionNone];
+
+  UNNotificationAction* settingsButton = [UNNotificationAction
+      actionWithIdentifier:notification_constants::
+                               kNotificationSettingsButtonTag
+                     title:l10n_util::GetNSString(
+                               IDS_NOTIFICATION_BUTTON_SETTINGS)
+                   options:UNNotificationActionOptionForeground];
+
+  // The actions in categories are ordered by LIFO. So having closeButton at the
+  // end ensures that it is always the button on top.
+  UNNotificationCategory* closeAndSettingsCategory = [UNNotificationCategory
+      categoryWithIdentifier:kCloseAndSettingsCategory
+                     actions:@[ settingsButton, closeButton ]
+           intentIdentifiers:@[]
+                     options:UNNotificationCategoryOptionCustomDismissAction];
+
+  UNNotificationCategory* closeCategory = [UNNotificationCategory
+      categoryWithIdentifier:kCloseCategory
+                     actions:@[ closeButton ]
+           intentIdentifiers:@[]
+                     options:UNNotificationCategoryOptionCustomDismissAction];
+
+  [notification_center_
+      setNotificationCategories:[NSSet setWithObjects:closeAndSettingsCategory,
+                                                      closeCategory, nil]];
+}
+
 // /////////////////////////////////////////////////////////////////////////////
 @implementation UNNotificationCenterDelegate
 
diff --git a/chrome/browser/notifications/notification_platform_bridge_win_interactive_uitest.cc b/chrome/browser/notifications/notification_platform_bridge_win_interactive_uitest.cc
index 67ecde34..375be74 100644
--- a/chrome/browser/notifications/notification_platform_bridge_win_interactive_uitest.cc
+++ b/chrome/browser/notifications/notification_platform_bridge_win_interactive_uitest.cc
@@ -89,6 +89,43 @@
       profile_id.c_str(), incognito, notification_id.c_str());
 }
 
+// Observes the passed |histogram_name| and calls |callback| when a new sample
+// is recorded. Stops observing after the first sample or when this object is
+// destructed. Note that this may not call |callback| if it has been destructed
+// before a sample has been recorded.
+class ScopedHistogramObserver {
+ public:
+  ScopedHistogramObserver(const std::string& histogram_name,
+                          base::OnceClosure callback)
+      : histogram_name_(histogram_name), callback_(std::move(callback)) {
+    DCHECK(callback_);
+    // base::Unretained is safe as we remove the callback before destruction.
+    EXPECT_TRUE(base::StatisticsRecorder::SetCallback(
+        histogram_name_,
+        base::BindRepeating(&ScopedHistogramObserver::OnHistogramRecorded,
+                            base::Unretained(this))));
+  }
+  ScopedHistogramObserver(const ScopedHistogramObserver&) = delete;
+  ScopedHistogramObserver& operator=(const ScopedHistogramObserver&) = delete;
+  ~ScopedHistogramObserver() {
+    // Only clear the callback once (either here or in OnHistogramRecorded()) so
+    // we don't clear any callbacks from other observers.
+    if (callback_)
+      base::StatisticsRecorder::ClearCallback(histogram_name_);
+  }
+
+ private:
+  void OnHistogramRecorded(const char* histogram_name,
+                           uint64_t name_hash,
+                           base::HistogramBase::Sample sample) {
+    base::StatisticsRecorder::ClearCallback(histogram_name_);
+    std::move(callback_).Run();
+  }
+
+  std::string histogram_name_;
+  base::OnceClosure callback_;
+};
+
 }  // namespace
 
 class NotificationPlatformBridgeWinUITest : public InProcessBrowserTest {
@@ -514,16 +551,8 @@
   bridge->SetExpectedDisplayedNotificationsForTesting(nullptr);
 }
 
-// Flaky on Windows, tracked at crbug.com/1135576
-#if defined(OS_WIN)
-#define MAYBE_SynchronizeNotificationsAfterClose \
-  DISABLED_SynchronizeNotificationsAfterClose
-#else
-#define MAYBE_SynchronizeNotificationsAfterClose \
-  SynchronizeNotificationsAfterClose
-#endif
 IN_PROC_BROWSER_TEST_F(NotificationPlatformBridgeWinUITest,
-                       MAYBE_SynchronizeNotificationsAfterClose) {
+                       SynchronizeNotificationsAfterClose) {
   if (base::win::GetVersion() < kMinimumWindowsVersion)
     return;
 
@@ -539,10 +568,8 @@
       message_center::NotifierId(), message_center::RichNotificationData(),
       nullptr);
   base::RunLoop display_run_loop;
-  notifier.SetNotificationShownCallback(base::BindLambdaForTesting(
-      [&display_run_loop](const NotificationLaunchId& launch_id) {
-        display_run_loop.Quit();
-      }));
+  ScopedHistogramObserver display_observer(
+      "Notifications.Windows.DisplayStatus", display_run_loop.QuitClosure());
   bridge->Display(NotificationHandler::Type::WEB_PERSISTENT,
                   browser()->profile(), notification, /*metadata=*/nullptr);
   display_run_loop.Run();
@@ -552,20 +579,14 @@
 
   // Close the notification
   base::RunLoop close_run_loop;
-  EXPECT_TRUE(base::StatisticsRecorder::SetCallback(
-      "Notifications.Windows.CloseStatus",
-      base::BindLambdaForTesting(
-          [&close_run_loop](const char* histogram_name, uint64_t name_hash,
-                            base::HistogramBase::Sample sample) {
-            close_run_loop.Quit();
-          })));
+  ScopedHistogramObserver close_observer("Notifications.Windows.CloseStatus",
+                                         close_run_loop.QuitClosure());
   bridge->Close(browser()->profile(), notification.id());
   close_run_loop.Run();
 
   // Closing a notification should remove it from the expected map.
   EXPECT_EQ(0u, bridge->GetExpectedDisplayedNotificationForTesting().size());
 
-  base::StatisticsRecorder::ClearCallback("Notifications.Windows.CloseStatus");
   bridge->SetNotifierForTesting(nullptr);
 }
 
diff --git a/chrome/browser/notifications/screen_capture_notification_blocker.cc b/chrome/browser/notifications/screen_capture_notification_blocker.cc
new file mode 100644
index 0000000..dd05bdb
--- /dev/null
+++ b/chrome/browser/notifications/screen_capture_notification_blocker.cc
@@ -0,0 +1,30 @@
+// Copyright 2020 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/notifications/screen_capture_notification_blocker.h"
+
+#include "chrome/browser/media/webrtc/media_capture_devices_dispatcher.h"
+
+ScreenCaptureNotificationBlocker::ScreenCaptureNotificationBlocker() {
+  observer_.Add(MediaCaptureDevicesDispatcher::GetInstance()
+                    ->GetMediaStreamCaptureIndicator()
+                    .get());
+}
+
+ScreenCaptureNotificationBlocker::~ScreenCaptureNotificationBlocker() = default;
+
+bool ScreenCaptureNotificationBlocker::ShouldBlockNotifications() {
+  return !capturing_web_contents_.empty();
+}
+
+void ScreenCaptureNotificationBlocker::OnIsCapturingDisplayChanged(
+    content::WebContents* web_contents,
+    bool is_capturing_display) {
+  if (is_capturing_display)
+    capturing_web_contents_.insert(web_contents);
+  else
+    capturing_web_contents_.erase(web_contents);
+
+  NotifyBlockingStateChanged();
+}
diff --git a/chrome/browser/notifications/screen_capture_notification_blocker.h b/chrome/browser/notifications/screen_capture_notification_blocker.h
new file mode 100644
index 0000000..aa2bc4f
--- /dev/null
+++ b/chrome/browser/notifications/screen_capture_notification_blocker.h
@@ -0,0 +1,54 @@
+// Copyright 2020 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_NOTIFICATIONS_SCREEN_CAPTURE_NOTIFICATION_BLOCKER_H_
+#define CHROME_BROWSER_NOTIFICATIONS_SCREEN_CAPTURE_NOTIFICATION_BLOCKER_H_
+
+#include "base/containers/flat_set.h"
+#include "base/gtest_prod_util.h"
+#include "base/scoped_observer.h"
+#include "chrome/browser/media/webrtc/media_stream_capture_indicator.h"
+#include "chrome/browser/notifications/notification_blocker.h"
+
+namespace content {
+class WebContents;
+}  // namespace content
+
+// This notification blocker listens to the events when the user starts
+// capturing a display. It will block notifications while such a capture is
+// ongoing. Note that this does not include casting the whole display and only
+// covers capturing via WebContents.
+// TODO(crbug.com/1131375): Also block notifications while casting a screen.
+class ScreenCaptureNotificationBlocker
+    : public NotificationBlocker,
+      public MediaStreamCaptureIndicator::Observer {
+ public:
+  ScreenCaptureNotificationBlocker();
+  ScreenCaptureNotificationBlocker(const ScreenCaptureNotificationBlocker&) =
+      delete;
+  ScreenCaptureNotificationBlocker& operator=(
+      const ScreenCaptureNotificationBlocker&) = delete;
+  ~ScreenCaptureNotificationBlocker() override;
+
+  // NotificationBlocker:
+  bool ShouldBlockNotifications() override;
+
+  // MediaStreamCaptureIndicator::Observer:
+  void OnIsCapturingDisplayChanged(content::WebContents* web_contents,
+                                   bool is_capturing_display) override;
+
+ private:
+  FRIEND_TEST_ALL_PREFIXES(ScreenCaptureNotificationBlockerTest,
+                           ObservesMediaStreamCaptureIndicator);
+
+  ScopedObserver<MediaStreamCaptureIndicator,
+                 MediaStreamCaptureIndicator::Observer>
+      observer_{this};
+
+  // Storing raw pointers here is fine because we never access them. We're only
+  // interested in the current set of WebContents that captures a display.
+  base::flat_set<content::WebContents*> capturing_web_contents_;
+};
+
+#endif  // CHROME_BROWSER_NOTIFICATIONS_SCREEN_CAPTURE_NOTIFICATION_BLOCKER_H_
diff --git a/chrome/browser/notifications/screen_capture_notification_blocker_unittest.cc b/chrome/browser/notifications/screen_capture_notification_blocker_unittest.cc
new file mode 100644
index 0000000..60e1959f
--- /dev/null
+++ b/chrome/browser/notifications/screen_capture_notification_blocker_unittest.cc
@@ -0,0 +1,81 @@
+// Copyright 2020 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/notifications/screen_capture_notification_blocker.h"
+
+#include "chrome/browser/media/webrtc/media_capture_devices_dispatcher.h"
+#include "chrome/browser/media/webrtc/media_stream_capture_indicator.h"
+#include "chrome/test/base/testing_profile.h"
+#include "content/public/test/browser_task_environment.h"
+#include "content/public/test/test_web_contents_factory.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+class ScreenCaptureNotificationBlockerTest : public testing::Test {
+ public:
+  ScreenCaptureNotificationBlockerTest() = default;
+  ~ScreenCaptureNotificationBlockerTest() override = default;
+
+  ScreenCaptureNotificationBlocker& blocker() { return blocker_; }
+
+  content::WebContents* CreateWebContents() {
+    return web_contents_factory_.CreateWebContents(&profile_);
+  }
+
+ private:
+  content::BrowserTaskEnvironment task_environment_;
+  TestingProfile profile_;
+  content::TestWebContentsFactory web_contents_factory_;
+  ScreenCaptureNotificationBlocker blocker_;
+};
+
+TEST_F(ScreenCaptureNotificationBlockerTest, ShouldNotBlockWhenNotCapturing) {
+  EXPECT_FALSE(blocker().ShouldBlockNotifications());
+}
+
+TEST_F(ScreenCaptureNotificationBlockerTest, ShouldBlockWhenCapturing) {
+  blocker().OnIsCapturingDisplayChanged(CreateWebContents(), true);
+  EXPECT_TRUE(blocker().ShouldBlockNotifications());
+}
+
+TEST_F(ScreenCaptureNotificationBlockerTest, ShouldBlockWhenCapturingMutliple) {
+  content::WebContents* contents_1 = CreateWebContents();
+  content::WebContents* contents_2 = CreateWebContents();
+
+  blocker().OnIsCapturingDisplayChanged(contents_1, true);
+  blocker().OnIsCapturingDisplayChanged(contents_2, true);
+  EXPECT_TRUE(blocker().ShouldBlockNotifications());
+
+  blocker().OnIsCapturingDisplayChanged(contents_1, false);
+  EXPECT_TRUE(blocker().ShouldBlockNotifications());
+
+  blocker().OnIsCapturingDisplayChanged(contents_2, false);
+  EXPECT_FALSE(blocker().ShouldBlockNotifications());
+}
+
+TEST_F(ScreenCaptureNotificationBlockerTest, CapturingTwice) {
+  content::WebContents* contents = CreateWebContents();
+
+  // Calling changed twice with the same contents should ignore the second call.
+  blocker().OnIsCapturingDisplayChanged(contents, true);
+  blocker().OnIsCapturingDisplayChanged(contents, true);
+  EXPECT_TRUE(blocker().ShouldBlockNotifications());
+
+  blocker().OnIsCapturingDisplayChanged(contents, false);
+  EXPECT_FALSE(blocker().ShouldBlockNotifications());
+}
+
+TEST_F(ScreenCaptureNotificationBlockerTest, StopUnknownContents) {
+  content::WebContents* contents = CreateWebContents();
+  blocker().OnIsCapturingDisplayChanged(contents, false);
+  EXPECT_FALSE(blocker().ShouldBlockNotifications());
+}
+
+TEST_F(ScreenCaptureNotificationBlockerTest,
+       ObservesMediaStreamCaptureIndicator) {
+  MediaStreamCaptureIndicator* indicator =
+      MediaCaptureDevicesDispatcher::GetInstance()
+          ->GetMediaStreamCaptureIndicator()
+          .get();
+  EXPECT_TRUE(blocker().observer_.IsObserving(indicator));
+}
diff --git a/chrome/browser/notifications/win/fake_itoastnotifier.cc b/chrome/browser/notifications/win/fake_itoastnotifier.cc
index 28d94234..b01b5c7 100644
--- a/chrome/browser/notifications/win/fake_itoastnotifier.cc
+++ b/chrome/browser/notifications/win/fake_itoastnotifier.cc
@@ -20,6 +20,9 @@
 
 HRESULT FakeIToastNotifier::Show(
     winui::Notifications::IToastNotification* notification) {
+  if (!notification_shown_callback_)
+    return S_OK;
+
   NotificationLaunchId launch_id = GetNotificationLaunchId(notification);
   notification_shown_callback_.Run(launch_id);
   return S_OK;
diff --git a/chrome/browser/password_manager/chrome_password_manager_client.cc b/chrome/browser/password_manager/chrome_password_manager_client.cc
index 187bfa98..c5217b6e 100644
--- a/chrome/browser/password_manager/chrome_password_manager_client.cc
+++ b/chrome/browser/password_manager/chrome_password_manager_client.cc
@@ -47,6 +47,7 @@
 #include "components/autofill/core/browser/logging/log_manager.h"
 #include "components/autofill/core/browser/logging/log_receiver.h"
 #include "components/autofill/core/common/password_generation_util.h"
+#include "components/autofill_assistant/browser/public/runtime_manager.h"
 #include "components/browsing_data/content/browsing_data_helper.h"
 #include "components/password_manager/content/browser/bad_message.h"
 #include "components/password_manager/content/browser/content_password_manager_driver.h"
@@ -445,6 +446,13 @@
 #endif
 }
 
+bool ChromePasswordManagerClient::IsAutofillAssistantUIVisible() const {
+  auto* autofill_assistant_manager =
+      autofill_assistant::RuntimeManager::GetForWebContents(web_contents());
+  return autofill_assistant_manager && autofill_assistant_manager->GetState() ==
+                                           autofill_assistant::UIState::kShown;
+}
+
 password_manager::BiometricAuthenticator*
 ChromePasswordManagerClient::GetBiometricAuthenticator() {
 #if defined(OS_ANDROID)
@@ -1172,6 +1180,11 @@
       this, GetSyncService(profile_), GetIdentityManager(), GetPrefs());
   driver_factory_->RequestSendLoggingAvailability();
 
+  auto* autofill_assistant_manager =
+      autofill_assistant::RuntimeManager::GetOrCreateForWebContents(
+          web_contents);
+  autofill_assistant_manager->AddObserver(this);
+
 #if !BUILDFLAG(GOOGLE_CHROME_BRANDING)
   // TODO(https://crbug.com/1104919): Remove this logging.
   VLOG(1) << __FUNCTION__ << ": this: " << this;
@@ -1247,6 +1260,12 @@
 #endif
   RemoveFromWidgetInputEventObservers(
       web_contents()->GetRenderViewHost()->GetWidget(), this);
+
+  auto* autofill_assistant_manager =
+      autofill_assistant::RuntimeManager::GetForWebContents(web_contents());
+  if (autofill_assistant_manager) {
+    autofill_assistant_manager->RemoveObserver(this);
+  }
 }
 
 #if !defined(OS_ANDROID)
@@ -1459,4 +1478,10 @@
                     bounds_in_frame_coordinates.size());
 }
 
+void ChromePasswordManagerClient::OnStateChanged(
+    autofill_assistant::UIState state) {
+  if (state == autofill_assistant::UIState::kNotShown)
+    password_manager_.ResetPendingCredentials();
+}
+
 WEB_CONTENTS_USER_DATA_KEY_IMPL(ChromePasswordManagerClient)
diff --git a/chrome/browser/password_manager/chrome_password_manager_client.h b/chrome/browser/password_manager/chrome_password_manager_client.h
index 38c4b86..22496580 100644
--- a/chrome/browser/password_manager/chrome_password_manager_client.h
+++ b/chrome/browser/password_manager/chrome_password_manager_client.h
@@ -16,6 +16,7 @@
 #include "build/build_config.h"
 #include "components/autofill/content/common/mojom/autofill_driver.mojom-forward.h"
 #include "components/autofill/core/common/renderer_id.h"
+#include "components/autofill_assistant/browser/public/runtime_observer.h"
 #include "components/password_manager/content/browser/content_credential_manager.h"
 #include "components/password_manager/content/browser/content_password_manager_driver_factory.h"
 #include "components/password_manager/core/browser/http_auth_manager.h"
@@ -70,7 +71,8 @@
       public content::WebContentsObserver,
       public content::WebContentsUserData<ChromePasswordManagerClient>,
       public autofill::mojom::PasswordGenerationDriver,
-      public content::RenderWidgetHost::InputEventObserver {
+      public content::RenderWidgetHost::InputEventObserver,
+      public autofill_assistant::RuntimeObserver {
  public:
   static void CreateForWebContentsWithAutofillClient(
       content::WebContents* contents,
@@ -102,6 +104,7 @@
       CredentialsCallback callback) override;
   void ShowTouchToFill(
       password_manager::PasswordManagerDriver* driver) override;
+  bool IsAutofillAssistantUIVisible() const override;
   // Returns a pointer to the BiometricAuthenticator which is created on demand.
   // This is currently only implemented for Android, on all other platforms this
   // will always be null.
@@ -263,6 +266,9 @@
   }
 #endif
 
+  // AutofillAssistantRuntimeObserver:
+  void OnStateChanged(autofill_assistant::UIState state) override;
+
  protected:
   // Callable for tests.
   ChromePasswordManagerClient(content::WebContents* web_contents,
diff --git a/chrome/browser/persisted_state_db/BUILD.gn b/chrome/browser/persisted_state_db/BUILD.gn
new file mode 100644
index 0000000..4630f34
--- /dev/null
+++ b/chrome/browser/persisted_state_db/BUILD.gn
@@ -0,0 +1,28 @@
+# Copyright 2020 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("//testing/test.gni")
+import("//third_party/protobuf/proto_library.gni")
+
+source_set("persisted_state_db") {
+  sources = [
+    "persisted_state_db.cc",
+    "persisted_state_db.h",
+    "persisted_state_db_factory.cc",
+    "persisted_state_db_factory.h",
+  ]
+
+  deps = [
+    ":persisted_state_db_content_proto",
+    "//base:base",
+    "//components/keyed_service/content",
+    "//components/leveldb_proto",
+    "//content/public/browser:browser",
+    "//third_party/leveldatabase",
+  ]
+}
+
+proto_library("persisted_state_db_content_proto") {
+  sources = [ "persisted_state_db_content.proto" ]
+}
diff --git a/chrome/browser/tab/state/DEPS b/chrome/browser/persisted_state_db/DEPS
similarity index 100%
rename from chrome/browser/tab/state/DEPS
rename to chrome/browser/persisted_state_db/DEPS
diff --git a/chrome/browser/tab/state/tab_state_db.cc b/chrome/browser/persisted_state_db/persisted_state_db.cc
similarity index 61%
rename from chrome/browser/tab/state/tab_state_db.cc
rename to chrome/browser/persisted_state_db/persisted_state_db.cc
index 88ccb56..6e8db03 100644
--- a/chrome/browser/tab/state/tab_state_db.cc
+++ b/chrome/browser/persisted_state_db/persisted_state_db.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/tab/state/tab_state_db.h"
+#include "chrome/browser/persisted_state_db/persisted_state_db.h"
 
 #include "base/bind.h"
 #include "base/bind_helpers.h"
@@ -12,10 +12,11 @@
 #include "base/task/thread_pool.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "components/leveldb_proto/public/proto_database_provider.h"
+#include "third_party/leveldatabase/src/include/leveldb/options.h"
 
 namespace {
 
-const char kTabStateDBFolder[] = "tab_state_db";
+const char kPersistedStateDBFolder[] = "persisted_state_db";
 leveldb::ReadOptions CreateReadOptions() {
   leveldb::ReadOptions opts;
   opts.fill_cache = false;
@@ -29,13 +30,14 @@
 
 }  // namespace
 
-TabStateDB::~TabStateDB() = default;
+PersistedStateDB::~PersistedStateDB() = default;
 
-void TabStateDB::LoadContent(const std::string& key, LoadCallback callback) {
+void PersistedStateDB::LoadContent(const std::string& key,
+                                   LoadCallback callback) {
   if (InitStatusUnknown()) {
-    deferred_operations_.push_back(
-        base::BindOnce(&TabStateDB::LoadContent, weak_ptr_factory_.GetWeakPtr(),
-                       std::move(key), std::move(callback)));
+    deferred_operations_.push_back(base::BindOnce(
+        &PersistedStateDB::LoadContent, weak_ptr_factory_.GetWeakPtr(),
+        std::move(key), std::move(callback)));
   } else if (FailedToInit()) {
     base::ThreadPool::PostTask(
         FROM_HERE,
@@ -44,40 +46,40 @@
     storage_database_->LoadEntriesWithFilter(
         base::BindRepeating(&DatabasePrefixFilter, key), CreateReadOptions(),
         /* target_prefix */ "",
-        base::BindOnce(&TabStateDB::OnLoadContent,
+        base::BindOnce(&PersistedStateDB::OnLoadContent,
                        weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
   }
 }
 
-void TabStateDB::InsertContent(const std::string& key,
-                               const std::vector<uint8_t>& value,
-                               OperationCallback callback) {
+void PersistedStateDB::InsertContent(const std::string& key,
+                                     const std::vector<uint8_t>& value,
+                                     OperationCallback callback) {
   if (InitStatusUnknown()) {
     deferred_operations_.push_back(base::BindOnce(
-        &TabStateDB::InsertContent, weak_ptr_factory_.GetWeakPtr(),
+        &PersistedStateDB::InsertContent, weak_ptr_factory_.GetWeakPtr(),
         std::move(key), std::move(value), std::move(callback)));
   } else if (FailedToInit()) {
     base::ThreadPool::PostTask(FROM_HERE,
                                base::BindOnce(std::move(callback), false));
   } else {
     auto contents_to_save = std::make_unique<ContentEntry>();
-    tab_state_db::TabStateContentProto proto;
+    persisted_state_db::PersistedStateContentProto proto;
     proto.set_key(key);
     proto.set_content_data(value.data(), value.size());
     contents_to_save->emplace_back(proto.key(), std::move(proto));
     storage_database_->UpdateEntries(
         std::move(contents_to_save),
         std::make_unique<std::vector<std::string>>(),
-        base::BindOnce(&TabStateDB::OnOperationCommitted,
+        base::BindOnce(&PersistedStateDB::OnOperationCommitted,
                        weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
   }
 }
 
-void TabStateDB::DeleteContent(const std::string& key,
-                               OperationCallback callback) {
+void PersistedStateDB::DeleteContent(const std::string& key,
+                                     OperationCallback callback) {
   if (InitStatusUnknown()) {
     deferred_operations_.push_back(base::BindOnce(
-        &TabStateDB::DeleteContent, weak_ptr_factory_.GetWeakPtr(),
+        &PersistedStateDB::DeleteContent, weak_ptr_factory_.GetWeakPtr(),
         std::move(key), std::move(callback)));
   } else if (FailedToInit()) {
     base::ThreadPool::PostTask(FROM_HERE,
@@ -86,15 +88,15 @@
     storage_database_->UpdateEntriesWithRemoveFilter(
         std::make_unique<ContentEntry>(),
         std::move(base::BindRepeating(&DatabasePrefixFilter, std::move(key))),
-        base::BindOnce(&TabStateDB::OnOperationCommitted,
+        base::BindOnce(&PersistedStateDB::OnOperationCommitted,
                        weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
   }
 }
 
-void TabStateDB::DeleteAllContent(OperationCallback callback) {
+void PersistedStateDB::DeleteAllContent(OperationCallback callback) {
   if (InitStatusUnknown()) {
     deferred_operations_.push_back(
-        base::BindOnce(&TabStateDB::DeleteAllContent,
+        base::BindOnce(&PersistedStateDB::DeleteAllContent,
                        weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
   } else if (FailedToInit()) {
     base::ThreadPool::PostTask(FROM_HERE,
@@ -104,31 +106,34 @@
   }
 }
 
-TabStateDB::TabStateDB(
+PersistedStateDB::PersistedStateDB(
     leveldb_proto::ProtoDatabaseProvider* proto_database_provider,
     const base::FilePath& profile_directory)
     : database_status_(base::nullopt),
       storage_database_(
-          proto_database_provider->GetDB<tab_state_db::TabStateContentProto>(
-              leveldb_proto::ProtoDbType::TAB_STATE_DATABASE,
-              profile_directory.AppendASCII(kTabStateDBFolder),
-              base::ThreadPool::CreateSequencedTaskRunner(
-                  {base::MayBlock(), base::TaskPriority::USER_VISIBLE}))) {
-  storage_database_->Init(base::BindOnce(&TabStateDB::OnDatabaseInitialized,
-                                         weak_ptr_factory_.GetWeakPtr()));
+          proto_database_provider
+              ->GetDB<persisted_state_db::PersistedStateContentProto>(
+                  leveldb_proto::ProtoDbType::PERSISTED_STATE_DATABASE,
+                  profile_directory.AppendASCII(kPersistedStateDBFolder),
+                  base::ThreadPool::CreateSequencedTaskRunner(
+                      {base::MayBlock(), base::TaskPriority::USER_VISIBLE}))) {
+  storage_database_->Init(
+      base::BindOnce(&PersistedStateDB::OnDatabaseInitialized,
+                     weak_ptr_factory_.GetWeakPtr()));
 }
 
-TabStateDB::TabStateDB(
+PersistedStateDB::PersistedStateDB(
     std::unique_ptr<leveldb_proto::ProtoDatabase<
-        tab_state_db::TabStateContentProto>> storage_database,
+        persisted_state_db::PersistedStateContentProto>> storage_database,
     scoped_refptr<base::SequencedTaskRunner> task_runner)
     : database_status_(base::nullopt),
       storage_database_(std::move(storage_database)) {
-  storage_database_->Init(base::BindOnce(&TabStateDB::OnDatabaseInitialized,
-                                         weak_ptr_factory_.GetWeakPtr()));
+  storage_database_->Init(
+      base::BindOnce(&PersistedStateDB::OnDatabaseInitialized,
+                     weak_ptr_factory_.GetWeakPtr()));
 }
 
-void TabStateDB::OnDatabaseInitialized(
+void PersistedStateDB::OnDatabaseInitialized(
     leveldb_proto::Enums::InitStatus status) {
   database_status_ =
       base::make_optional<leveldb_proto::Enums::InitStatus>(status);
@@ -138,10 +143,11 @@
   deferred_operations_.clear();
 }
 
-void TabStateDB::OnLoadContent(
+void PersistedStateDB::OnLoadContent(
     LoadCallback callback,
     bool success,
-    std::unique_ptr<std::vector<tab_state_db::TabStateContentProto>> content) {
+    std::unique_ptr<std::vector<persisted_state_db::PersistedStateContentProto>>
+        content) {
   std::vector<KeyAndValue> results;
   if (success) {
     for (const auto& proto : *content) {
@@ -155,16 +161,16 @@
   std::move(callback).Run(success, std::move(results));
 }
 
-void TabStateDB::OnOperationCommitted(OperationCallback callback,
-                                      bool success) {
+void PersistedStateDB::OnOperationCommitted(OperationCallback callback,
+                                            bool success) {
   std::move(callback).Run(success);
 }
 
-bool TabStateDB::InitStatusUnknown() const {
+bool PersistedStateDB::InitStatusUnknown() const {
   return database_status_ == base::nullopt;
 }
 
-bool TabStateDB::FailedToInit() const {
+bool PersistedStateDB::FailedToInit() const {
   return database_status_.has_value() &&
          database_status_.value() != leveldb_proto::Enums::InitStatus::kOK;
 }
diff --git a/chrome/browser/tab/state/tab_state_db.h b/chrome/browser/persisted_state_db/persisted_state_db.h
similarity index 69%
rename from chrome/browser/tab/state/tab_state_db.h
rename to chrome/browser/persisted_state_db/persisted_state_db.h
index a6126e5..4173c4e 100644
--- a/chrome/browser/tab/state/tab_state_db.h
+++ b/chrome/browser/persisted_state_db/persisted_state_db.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_TAB_STATE_TAB_STATE_DB_H_
-#define CHROME_BROWSER_TAB_STATE_TAB_STATE_DB_H_
+#ifndef CHROME_BROWSER_PERSISTED_STATE_DB_PERSISTED_STATE_DB_H_
+#define CHROME_BROWSER_PERSISTED_STATE_DB_PERSISTED_STATE_DB_H_
 
 #include <queue>
 #include <string>
@@ -12,7 +12,7 @@
 #include "base/memory/weak_ptr.h"
 #include "base/optional.h"
 #include "base/sequenced_task_runner.h"
-#include "chrome/browser/tab/state/tab_state_db_content.pb.h"
+#include "chrome/browser/persisted_state_db/persisted_state_db_content.pb.h"
 #include "components/keyed_service/core/keyed_service.h"
 #include "components/leveldb_proto/public/proto_database.h"
 
@@ -20,18 +20,18 @@
 class ProtoDatabaseProvider;
 }  // namespace leveldb_proto
 
-class TabStateDBFactory;
-class TabStateDBFactoryTest;
-class TabStateDBTest;
+class PersistedStateDBFactory;
+class PersistedStateDBFactoryTest;
+class PersistedStateDBTest;
 
-// TabStateDatabase is leveldb backend store for NonCriticalPersistedTabData.
+// PersistedStateDB is leveldb backend store for NonCriticalPersistedTabData.
 // NonCriticalPersistedTabData is an extension of TabState where data for
 // new features which are not critical to the core functionality of the app
 // are acquired and persisted across restarts. The intended key format is
 // <NonCriticalPersistedTabData id>_<Tab id>
 
 // NonCriticalPersistedTabData is stored in key/value pairs.
-class TabStateDB : public KeyedService {
+class PersistedStateDB : public KeyedService {
  public:
   using KeyAndValue = std::pair<std::string, std::vector<uint8_t>>;
 
@@ -45,9 +45,9 @@
 
   // Entry in the database
   using ContentEntry = leveldb_proto::ProtoDatabase<
-      tab_state_db::TabStateContentProto>::KeyEntryVector;
+      persisted_state_db::PersistedStateContentProto>::KeyEntryVector;
 
-  ~TabStateDB() override;
+  ~PersistedStateDB() override;
 
   // Loads the content data for the key and passes them to the callback
   void LoadContent(const std::string& key, LoadCallback callback);
@@ -66,18 +66,20 @@
   void DeleteAllContent(OperationCallback callback);
 
  private:
-  friend class ::TabStateDBTest;
-  friend class ::TabStateDBFactory;
-  friend class ::TabStateDBFactoryTest;
+  friend class ::PersistedStateDBTest;
+  friend class ::PersistedStateDBFactory;
+  friend class ::PersistedStateDBFactoryTest;
 
   // Initializes the database
-  TabStateDB(leveldb_proto::ProtoDatabaseProvider* proto_database_provider,
-             const base::FilePath& profile_directory);
+  PersistedStateDB(
+      leveldb_proto::ProtoDatabaseProvider* proto_database_provider,
+      const base::FilePath& profile_directory);
 
   // Used for tests
-  explicit TabStateDB(std::unique_ptr<leveldb_proto::ProtoDatabase<
-                          tab_state_db::TabStateContentProto>> storage_database,
-                      scoped_refptr<base::SequencedTaskRunner> task_runner);
+  explicit PersistedStateDB(
+      std::unique_ptr<leveldb_proto::ProtoDatabase<
+          persisted_state_db::PersistedStateContentProto>> storage_database,
+      scoped_refptr<base::SequencedTaskRunner> task_runner);
 
   // Passes back database status following database initialization
   void OnDatabaseInitialized(leveldb_proto::Enums::InitStatus status);
@@ -86,7 +88,8 @@
   void OnLoadContent(
       LoadCallback callback,
       bool success,
-      std::unique_ptr<std::vector<tab_state_db::TabStateContentProto>> content);
+      std::unique_ptr<
+          std::vector<persisted_state_db::PersistedStateContentProto>> content);
 
   // Callback when an operation (e.g. insert or delete) is called
   void OnOperationCommitted(OperationCallback callback, bool success);
@@ -101,17 +104,17 @@
   base::Optional<leveldb_proto::Enums::InitStatus> database_status_;
 
   // The database for storing content storage information.
-  std::unique_ptr<
-      leveldb_proto::ProtoDatabase<tab_state_db::TabStateContentProto>>
+  std::unique_ptr<leveldb_proto::ProtoDatabase<
+      persisted_state_db::PersistedStateContentProto>>
       storage_database_;
 
   // Store operations until the database is initialized at which point
   // deferred_operations_ is flushed and all operations are executed.
   std::vector<base::OnceClosure> deferred_operations_;
 
-  base::WeakPtrFactory<TabStateDB> weak_ptr_factory_{this};
+  base::WeakPtrFactory<PersistedStateDB> weak_ptr_factory_{this};
 
-  DISALLOW_COPY_AND_ASSIGN(TabStateDB);
+  DISALLOW_COPY_AND_ASSIGN(PersistedStateDB);
 };
 
-#endif  // CHROME_BROWSER_TAB_STATE_TAB_STATE_DB_H_
+#endif  // CHROME_BROWSER_PERSISTED_STATE_DB_PERSISTED_STATE_DB_H_
diff --git a/chrome/browser/tab/state/tab_state_db_content.proto b/chrome/browser/persisted_state_db/persisted_state_db_content.proto
similarity index 75%
rename from chrome/browser/tab/state/tab_state_db_content.proto
rename to chrome/browser/persisted_state_db/persisted_state_db_content.proto
index 4cacfa3..199b720 100644
--- a/chrome/browser/tab/state/tab_state_db_content.proto
+++ b/chrome/browser/persisted_state_db/persisted_state_db_content.proto
@@ -6,10 +6,10 @@
 
 option optimize_for = LITE_RUNTIME;
 
-package tab_state_db;
+package persisted_state_db;
 
-// Used for storing TabState Content.
-message TabStateContentProto {
+// Used for storing PersistedState Content.
+message PersistedStateContentProto {
   // Original key for data.
   optional string key = 1;
 
diff --git a/chrome/browser/persisted_state_db/persisted_state_db_factory.cc b/chrome/browser/persisted_state_db/persisted_state_db_factory.cc
new file mode 100644
index 0000000..838e06a
--- /dev/null
+++ b/chrome/browser/persisted_state_db/persisted_state_db_factory.cc
@@ -0,0 +1,49 @@
+// Copyright 2020 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/persisted_state_db/persisted_state_db_factory.h"
+
+#include "chrome/browser/persisted_state_db/persisted_state_db.h"
+#include "components/keyed_service/content/browser_context_dependency_manager.h"
+#include "content/public/browser/browser_context.h"
+#include "content/public/browser/storage_partition.h"
+
+namespace {
+const char kPersistedStateDBFolder[] = "persisted_state_db";
+}  // namespace
+
+// static
+PersistedStateDBFactory* PersistedStateDBFactory::GetInstance() {
+  return base::Singleton<PersistedStateDBFactory>::get();
+}
+
+// static
+PersistedStateDB* PersistedStateDBFactory::GetForProfile(
+    content::BrowserContext* context) {
+  // Incognito is currently not supported
+  if (context->IsOffTheRecord())
+    return nullptr;
+
+  return static_cast<PersistedStateDB*>(
+      GetInstance()->GetServiceForBrowserContext(context, true));
+}
+
+PersistedStateDBFactory::PersistedStateDBFactory()
+    : BrowserContextKeyedServiceFactory(
+          "PersistedStateDBKeyedService",
+          BrowserContextDependencyManager::GetInstance()) {}
+
+PersistedStateDBFactory::~PersistedStateDBFactory() = default;
+
+KeyedService* PersistedStateDBFactory::BuildServiceInstanceFor(
+    content::BrowserContext* context) const {
+  DCHECK(!context->IsOffTheRecord());
+
+  leveldb_proto::ProtoDatabaseProvider* proto_database_provider =
+      content::BrowserContext::GetDefaultStoragePartition(context)
+          ->GetProtoDatabaseProvider();
+  base::FilePath tab_state_db_dir(
+      context->GetPath().AppendASCII(kPersistedStateDBFolder));
+  return new PersistedStateDB(proto_database_provider, tab_state_db_dir);
+}
diff --git a/chrome/browser/persisted_state_db/persisted_state_db_factory.h b/chrome/browser/persisted_state_db/persisted_state_db_factory.h
new file mode 100644
index 0000000..72fcc32
--- /dev/null
+++ b/chrome/browser/persisted_state_db/persisted_state_db_factory.h
@@ -0,0 +1,34 @@
+// Copyright 2020 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_PERSISTED_STATE_DB_PERSISTED_STATE_DB_FACTORY_H_
+#define CHROME_BROWSER_PERSISTED_STATE_DB_PERSISTED_STATE_DB_FACTORY_H_
+
+#include "base/memory/singleton.h"
+#include "components/keyed_service/content/browser_context_keyed_service_factory.h"
+
+class KeyedService;
+class PersistedStateDB;
+
+// Factory to create on PersistedStateDB per profile. Incognito is currently
+// not supported and the factory will return nullptr for an incognito profile.
+class PersistedStateDBFactory : public BrowserContextKeyedServiceFactory {
+ public:
+  // Acquire instance of PersistedStateDBFactory
+  static PersistedStateDBFactory* GetInstance();
+
+  // Acquire PersistedStateDB - there is one per profile.
+  static PersistedStateDB* GetForProfile(content::BrowserContext* context);
+
+ private:
+  friend struct base::DefaultSingletonTraits<PersistedStateDBFactory>;
+
+  PersistedStateDBFactory();
+  ~PersistedStateDBFactory() override;
+
+  KeyedService* BuildServiceInstanceFor(
+      content::BrowserContext* context) const override;
+};
+
+#endif  // CHROME_BROWSER_PERSISTED_STATE_DB_PERSISTED_STATE_DB_FACTORY_H_
diff --git a/chrome/browser/tab/state/tab_state_db_factory_unittest.cc b/chrome/browser/persisted_state_db/persisted_state_db_factory_unittest.cc
similarity index 61%
rename from chrome/browser/tab/state/tab_state_db_factory_unittest.cc
rename to chrome/browser/persisted_state_db/persisted_state_db_factory_unittest.cc
index 9d9c5cc..e1fcfc7 100644
--- a/chrome/browser/tab/state/tab_state_db_factory_unittest.cc
+++ b/chrome/browser/persisted_state_db/persisted_state_db_factory_unittest.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/tab/state/tab_state_db_factory.h"
+#include "chrome/browser/persisted_state_db/persisted_state_db_factory.h"
 
 #include <memory>
 
@@ -11,9 +11,9 @@
 #include "content/public/test/browser_task_environment.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-class TabStateDBFactoryTest : public testing::Test {
+class PersistedStateDBFactoryTest : public testing::Test {
  public:
-  TabStateDBFactoryTest() = default;
+  PersistedStateDBFactoryTest() = default;
 
   void SetUp() override {
     ASSERT_TRUE(profile_dir_.CreateUniqueTempDir());
@@ -38,21 +38,21 @@
   std::unique_ptr<TestingProfile> profile_;
   std::unique_ptr<TestingProfile> different_profile_;
 
-  DISALLOW_COPY_AND_ASSIGN(TabStateDBFactoryTest);
+  DISALLOW_COPY_AND_ASSIGN(PersistedStateDBFactoryTest);
 };
 
-TEST_F(TabStateDBFactoryTest, TestIncognitoProfile) {
-  EXPECT_EQ(nullptr, TabStateDBFactory::GetInstance()->GetForProfile(
+TEST_F(PersistedStateDBFactoryTest, TestIncognitoProfile) {
+  EXPECT_EQ(nullptr, PersistedStateDBFactory::GetInstance()->GetForProfile(
                          profile()->GetPrimaryOTRProfile()));
 }
 
-TEST_F(TabStateDBFactoryTest, TestSameProfile) {
-  EXPECT_EQ(TabStateDBFactory::GetInstance()->GetForProfile(profile()),
-            TabStateDBFactory::GetInstance()->GetForProfile(profile()));
+TEST_F(PersistedStateDBFactoryTest, TestSameProfile) {
+  EXPECT_EQ(PersistedStateDBFactory::GetInstance()->GetForProfile(profile()),
+            PersistedStateDBFactory::GetInstance()->GetForProfile(profile()));
 }
 
-TEST_F(TabStateDBFactoryTest, TestDifferentProfile) {
-  EXPECT_NE(
-      TabStateDBFactory::GetInstance()->GetForProfile(different_profile()),
-      TabStateDBFactory::GetInstance()->GetForProfile(profile()));
+TEST_F(PersistedStateDBFactoryTest, TestDifferentProfile) {
+  EXPECT_NE(PersistedStateDBFactory::GetInstance()->GetForProfile(
+                different_profile()),
+            PersistedStateDBFactory::GetInstance()->GetForProfile(profile()));
 }
diff --git a/chrome/browser/persisted_state_db/persisted_state_db_unittest.cc b/chrome/browser/persisted_state_db/persisted_state_db_unittest.cc
new file mode 100644
index 0000000..67fb405f
--- /dev/null
+++ b/chrome/browser/persisted_state_db/persisted_state_db_unittest.cc
@@ -0,0 +1,310 @@
+// Copyright 2020 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/persisted_state_db/persisted_state_db.h"
+
+#include <map>
+
+#include "base/bind.h"
+#include "base/memory/ptr_util.h"
+#include "base/task/thread_pool.h"
+#include "base/test/task_environment.h"
+#include "components/leveldb_proto/testing/fake_db.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+using testing::_;
+
+namespace {
+const char kMockKey[] = "key";
+const char kMockKeyPrefix[] = "k";
+const std::vector<uint8_t> kMockValue = {0xfa, 0x5b, 0x4c, 0x12};
+const std::vector<PersistedStateDB::KeyAndValue> kExpected = {
+    {kMockKey, kMockValue}};
+const std::vector<PersistedStateDB::KeyAndValue> kEmptyExpected = {};
+}  // namespace
+
+class PersistedStateDBTest : public testing::Test {
+ public:
+  PersistedStateDBTest() = default;
+
+  // Initialize the test database
+  void InitDatabase() {
+    InitDatabaseWithoutCallback();
+    MockInitCallback(content_db_, leveldb_proto::Enums::InitStatus::kOK);
+  }
+
+  void InitDatabaseWithoutCallback() {
+    auto storage_db = std::make_unique<leveldb_proto::test::FakeDB<
+        persisted_state_db::PersistedStateContentProto>>(&content_db_storage_);
+    content_db_ = storage_db.get();
+    persisted_state_db_ = base::WrapUnique(new PersistedStateDB(
+        std::move(storage_db),
+        base::ThreadPool::CreateSequencedTaskRunner(
+            {base::MayBlock(), base::TaskPriority::USER_VISIBLE})));
+  }
+
+  // Wait for all tasks to be cleared off the queue
+  void RunUntilIdle() { task_environment_.RunUntilIdle(); }
+
+  void MockInitCallback(
+      leveldb_proto::test::FakeDB<
+          persisted_state_db::PersistedStateContentProto>* storage_db,
+      leveldb_proto::Enums::InitStatus status) {
+    storage_db->InitStatusCallback(status);
+    RunUntilIdle();
+  }
+
+  void MockInsertCallback(
+      leveldb_proto::test::FakeDB<
+          persisted_state_db::PersistedStateContentProto>* storage_db,
+      bool result) {
+    storage_db->UpdateCallback(result);
+    RunUntilIdle();
+  }
+
+  void MockLoadCallback(
+      leveldb_proto::test::FakeDB<
+          persisted_state_db::PersistedStateContentProto>* storage_db,
+      bool res) {
+    storage_db->LoadCallback(res);
+    RunUntilIdle();
+  }
+
+  void MockDeleteCallback(
+      leveldb_proto::test::FakeDB<
+          persisted_state_db::PersistedStateContentProto>* storage_db,
+      bool res) {
+    storage_db->UpdateCallback(res);
+    RunUntilIdle();
+  }
+
+  void OperationEvaluation(base::OnceClosure closure,
+                           bool expected_success,
+                           bool actual_success) {
+    EXPECT_EQ(expected_success, actual_success);
+    std::move(closure).Run();
+  }
+
+  void GetEvaluation(base::OnceClosure closure,
+                     std::vector<PersistedStateDB::KeyAndValue> expected,
+                     bool result,
+                     std::vector<PersistedStateDB::KeyAndValue> found) {
+    for (size_t i = 0; i < expected.size(); i++) {
+      EXPECT_EQ(found[i].first, expected[i].first);
+      EXPECT_EQ(found[i].second, expected[i].second);
+    }
+    std::move(closure).Run();
+  }
+
+  PersistedStateDB* persisted_state_db() { return persisted_state_db_.get(); }
+  leveldb_proto::test::FakeDB<persisted_state_db::PersistedStateContentProto>*
+  content_db() {
+    return content_db_;
+  }
+  std::vector<base::OnceClosure>& deferred_operations() {
+    return persisted_state_db()->deferred_operations_;
+  }
+  bool InitStatusUnknown() { return persisted_state_db()->InitStatusUnknown(); }
+  bool FailedToInit() { return persisted_state_db()->FailedToInit(); }
+
+ private:
+  base::test::TaskEnvironment task_environment_;
+  std::map<std::string, persisted_state_db::PersistedStateContentProto>
+      content_db_storage_;
+  leveldb_proto::test::FakeDB<persisted_state_db::PersistedStateContentProto>*
+      content_db_;
+  std::unique_ptr<PersistedStateDB> persisted_state_db_;
+
+  DISALLOW_COPY_AND_ASSIGN(PersistedStateDBTest);
+};
+
+TEST_F(PersistedStateDBTest, TestInit) {
+  InitDatabase();
+  EXPECT_EQ(false, FailedToInit());
+}
+
+TEST_F(PersistedStateDBTest, TestKeyInsertionSucceeded) {
+  InitDatabase();
+  base::RunLoop run_loop[2];
+  persisted_state_db()->InsertContent(
+      kMockKey, kMockValue,
+      base::BindOnce(&PersistedStateDBTest::OperationEvaluation,
+                     base::Unretained(this), run_loop[0].QuitClosure(), true));
+  MockInsertCallback(content_db(), true);
+  run_loop[0].Run();
+  persisted_state_db()->LoadContent(
+      kMockKey, base::BindOnce(&PersistedStateDBTest::GetEvaluation,
+                               base::Unretained(this),
+                               run_loop[1].QuitClosure(), kExpected));
+  MockLoadCallback(content_db(), true);
+  run_loop[1].Run();
+}
+
+TEST_F(PersistedStateDBTest, TestKeyInsertionFailed) {
+  InitDatabase();
+  base::RunLoop run_loop[2];
+  persisted_state_db()->InsertContent(
+      kMockKey, kMockValue,
+      base::BindOnce(&PersistedStateDBTest::OperationEvaluation,
+                     base::Unretained(this), run_loop[0].QuitClosure(), false));
+  MockInsertCallback(content_db(), false);
+  run_loop[0].Run();
+  std::vector<PersistedStateDB::KeyAndValue> expected;
+  persisted_state_db()->LoadContent(
+      kMockKey, base::BindOnce(&PersistedStateDBTest::GetEvaluation,
+                               base::Unretained(this),
+                               run_loop[1].QuitClosure(), expected));
+  MockLoadCallback(content_db(), true);
+  run_loop[1].Run();
+}
+
+TEST_F(PersistedStateDBTest, TestKeyInsertionPrefix) {
+  InitDatabase();
+  base::RunLoop run_loop[2];
+  persisted_state_db()->InsertContent(
+      kMockKey, kMockValue,
+      base::BindOnce(&PersistedStateDBTest::OperationEvaluation,
+                     base::Unretained(this), run_loop[0].QuitClosure(), true));
+  MockInsertCallback(content_db(), true);
+  run_loop[0].Run();
+  std::vector<PersistedStateDB::KeyAndValue> expected;
+  expected.emplace_back(kMockKey, kMockValue);
+  persisted_state_db()->LoadContent(
+      kMockKeyPrefix, base::BindOnce(&PersistedStateDBTest::GetEvaluation,
+                                     base::Unretained(this),
+                                     run_loop[1].QuitClosure(), expected));
+  MockLoadCallback(content_db(), true);
+  run_loop[1].Run();
+}
+
+TEST_F(PersistedStateDBTest, TestDelete) {
+  InitDatabase();
+  base::RunLoop run_loop[4];
+  persisted_state_db()->InsertContent(
+      kMockKey, kMockValue,
+      base::BindOnce(&PersistedStateDBTest::OperationEvaluation,
+                     base::Unretained(this), run_loop[0].QuitClosure(), true));
+  MockInsertCallback(content_db(), true);
+  run_loop[0].Run();
+  std::vector<PersistedStateDB::KeyAndValue> expected;
+  expected.emplace_back(kMockKey, kMockValue);
+  persisted_state_db()->LoadContent(
+      kMockKey, base::BindOnce(&PersistedStateDBTest::GetEvaluation,
+                               base::Unretained(this),
+                               run_loop[1].QuitClosure(), expected));
+  MockLoadCallback(content_db(), true);
+  run_loop[1].Run();
+
+  persisted_state_db()->DeleteContent(
+      kMockKey,
+      base::BindOnce(&PersistedStateDBTest::OperationEvaluation,
+                     base::Unretained(this), run_loop[2].QuitClosure(), true));
+  MockDeleteCallback(content_db(), true);
+  run_loop[2].Run();
+
+  std::vector<PersistedStateDB::KeyAndValue> expected_after_delete;
+  persisted_state_db()->LoadContent(
+      kMockKey,
+      base::BindOnce(&PersistedStateDBTest::GetEvaluation,
+                     base::Unretained(this), run_loop[3].QuitClosure(),
+                     expected_after_delete));
+  MockLoadCallback(content_db(), true);
+  run_loop[3].Run();
+}
+
+TEST_F(PersistedStateDBTest, TestDeferredOperations) {
+  InitDatabaseWithoutCallback();
+  RunUntilIdle();
+  EXPECT_EQ(true, InitStatusUnknown());
+  base::RunLoop run_loop[4];
+
+  persisted_state_db()->InsertContent(
+      kMockKey, kMockValue,
+      base::BindOnce(&PersistedStateDBTest::OperationEvaluation,
+                     base::Unretained(this), run_loop[0].QuitClosure(), true));
+  persisted_state_db()->LoadContent(
+      kMockKey, base::BindOnce(&PersistedStateDBTest::GetEvaluation,
+                               base::Unretained(this),
+                               run_loop[1].QuitClosure(), kExpected));
+  EXPECT_EQ(2u, deferred_operations().size());
+
+  content_db()->InitStatusCallback(leveldb_proto::Enums::InitStatus::kOK);
+  EXPECT_EQ(false, FailedToInit());
+
+  MockInsertCallback(content_db(), true);
+  MockLoadCallback(content_db(), true);
+  run_loop[0].Run();
+  run_loop[1].Run();
+  EXPECT_EQ(0u, deferred_operations().size());
+
+  persisted_state_db()->DeleteContent(
+      kMockKey,
+      base::BindOnce(&PersistedStateDBTest::OperationEvaluation,
+                     base::Unretained(this), run_loop[2].QuitClosure(), true));
+  EXPECT_EQ(0u, deferred_operations().size());
+  MockDeleteCallback(content_db(), true);
+
+  persisted_state_db()->LoadContent(
+      kMockKey, base::BindOnce(&PersistedStateDBTest::GetEvaluation,
+                               base::Unretained(this),
+                               run_loop[3].QuitClosure(), kEmptyExpected));
+  EXPECT_EQ(0u, deferred_operations().size());
+  MockLoadCallback(content_db(), true);
+  run_loop[3].Run();
+}
+
+TEST_F(PersistedStateDBTest, TestInitializationFailure) {
+  InitDatabaseWithoutCallback();
+  RunUntilIdle();
+  EXPECT_EQ(true, InitStatusUnknown());
+  base::RunLoop run_loop[6];
+
+  // Do some operations before database status is known
+  persisted_state_db()->InsertContent(
+      kMockKey, kMockValue,
+      base::BindOnce(&PersistedStateDBTest::OperationEvaluation,
+                     base::Unretained(this), run_loop[0].QuitClosure(), false));
+  persisted_state_db()->LoadContent(
+      kMockKey, base::BindOnce(&PersistedStateDBTest::GetEvaluation,
+                               base::Unretained(this),
+                               run_loop[1].QuitClosure(), kEmptyExpected));
+  persisted_state_db()->DeleteContent(
+      kMockKey,
+      base::BindOnce(&PersistedStateDBTest::OperationEvaluation,
+                     base::Unretained(this), run_loop[2].QuitClosure(), false));
+  EXPECT_EQ(3u, deferred_operations().size());
+
+  // Error initializing database
+  content_db()->InitStatusCallback(leveldb_proto::Enums::InitStatus::kError);
+  EXPECT_EQ(true, FailedToInit());
+  for (int i = 0; i < 3; i++) {
+    run_loop[i].Run();
+  }
+
+  // Check deferred_operations is flushed
+  EXPECT_EQ(0u, deferred_operations().size());
+
+  // More operations should just return false/null as the database
+  // failed to initialize
+  persisted_state_db()->InsertContent(
+      kMockKey, kMockValue,
+      base::BindOnce(&PersistedStateDBTest::OperationEvaluation,
+                     base::Unretained(this), run_loop[3].QuitClosure(), false));
+  persisted_state_db()->LoadContent(
+      kMockKey, base::BindOnce(&PersistedStateDBTest::GetEvaluation,
+                               base::Unretained(this),
+                               run_loop[4].QuitClosure(), kEmptyExpected));
+  persisted_state_db()->DeleteContent(
+      kMockKey,
+      base::BindOnce(&PersistedStateDBTest::OperationEvaluation,
+                     base::Unretained(this), run_loop[5].QuitClosure(), false));
+
+  // Operations should have returned immediately as database was initialization
+  // resulted in an error
+  EXPECT_EQ(0u, deferred_operations().size());
+  for (int i = 3; i < 6; i++) {
+    run_loop[i].Run();
+  }
+}
diff --git a/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc b/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc
index 59377e7..4e5c42e 100644
--- a/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc
+++ b/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc
@@ -50,6 +50,7 @@
 #include "chrome/browser/page_load_metrics/observers/https_engagement_metrics/https_engagement_service_factory.h"
 #include "chrome/browser/password_manager/password_store_factory.h"
 #include "chrome/browser/permissions/adaptive_quiet_notification_permission_ui_enabler.h"
+#include "chrome/browser/persisted_state_db/persisted_state_db_factory.h"
 #include "chrome/browser/plugins/plugin_prefs_factory.h"
 #include "chrome/browser/policy/cloud/user_cloud_policy_invalidator_factory.h"
 #include "chrome/browser/predictors/autocomplete_action_predictor_factory.h"
@@ -78,7 +79,6 @@
 #include "chrome/browser/sync/model_type_store_service_factory.h"
 #include "chrome/browser/sync/profile_sync_service_factory.h"
 #include "chrome/browser/sync/user_event_service_factory.h"
-#include "chrome/browser/tab/state/tab_state_db_factory.h"
 #include "chrome/browser/themes/theme_service_factory.h"
 #include "chrome/browser/translate/translate_ranker_factory.h"
 #include "chrome/browser/ui/app_list/app_list_syncable_service_factory.h"
@@ -321,6 +321,7 @@
   NTPResourceCacheFactory::GetInstance();
 #endif
   PasswordStoreFactory::GetInstance();
+  PersistedStateDBFactory::GetInstance();
 #if !defined(OS_ANDROID)
   PinnedTabServiceFactory::GetInstance();
 #endif
@@ -385,7 +386,6 @@
   SupervisedUserServiceFactory::GetInstance();
 #endif
   TabRestoreServiceFactory::GetInstance();
-  TabStateDBFactory::GetInstance();
   TemplateURLFetcherFactory::GetInstance();
   TemplateURLServiceFactory::GetInstance();
 #if !defined(OS_ANDROID)
diff --git a/chrome/browser/profiles/gaia_info_update_service_unittest.cc b/chrome/browser/profiles/gaia_info_update_service_unittest.cc
index d824cf1b..870e612 100644
--- a/chrome/browser/profiles/gaia_info_update_service_unittest.cc
+++ b/chrome/browser/profiles/gaia_info_update_service_unittest.cc
@@ -269,12 +269,12 @@
   entry->RecordAccountMetrics();
   tester.ExpectBucketCount(
       "Profile.AllAccounts.Names",
-      /*bucket=*/profile_metrics::AllAccountsNames::kLikelySingleName,
-      /*count=*/1);
+      /*sample=*/profile_metrics::AllAccountsNames::kLikelySingleName,
+      /*expected_count=*/1);
   tester.ExpectBucketCount(
       "Profile.AllAccounts.Categories",
-      /*bucket=*/profile_metrics::AllAccountsCategories::kSingleCategory,
-      /*count=*/1);
+      /*sample=*/profile_metrics::AllAccountsCategories::kSingleCategory,
+      /*expected_count=*/1);
 
   // Log out and record the metric again, sign-out wipes previous info in the
   // entry so again the default values get reported.
@@ -282,12 +282,12 @@
   entry->RecordAccountMetrics();
   tester.ExpectBucketCount(
       "Profile.AllAccounts.Names",
-      /*bucket=*/profile_metrics::AllAccountsNames::kLikelySingleName,
-      /*count=*/2);
+      /*sample=*/profile_metrics::AllAccountsNames::kLikelySingleName,
+      /*expected_count=*/2);
   tester.ExpectBucketCount(
       "Profile.AllAccounts.Categories",
-      /*bucket=*/profile_metrics::AllAccountsCategories::kSingleCategory,
-      /*count=*/2);
+      /*sample=*/profile_metrics::AllAccountsCategories::kSingleCategory,
+      /*expected_count=*/2);
 
   std::string email2 = "pat2@example.com";
   AccountInfo info2 = identity_test_env()->MakeAccountAvailableWithCookies(
@@ -307,14 +307,15 @@
   entry->RecordAccountMetrics();
   tester.ExpectBucketCount(
       "Profile.AllAccounts.Names",
-      /*bucket=*/profile_metrics::AllAccountsNames::kLikelySingleName,
-      /*count=*/3);
+      /*sample=*/profile_metrics::AllAccountsNames::kLikelySingleName,
+      /*expected_count=*/3);
   tester.ExpectBucketCount(
       "Profile.AllAccounts.Categories",
-      /*bucket=*/profile_metrics::AllAccountsCategories::kSingleCategory,
-      /*count=*/3);
-  tester.ExpectTotalCount("Profile.AllAccounts.Names", /*count=*/3);
-  tester.ExpectTotalCount("Profile.AllAccounts.Categories", /*count=*/3);
+      /*sample=*/profile_metrics::AllAccountsCategories::kSingleCategory,
+      /*expected_count=*/3);
+  tester.ExpectTotalCount("Profile.AllAccounts.Names", /*expected_count=*/3);
+  tester.ExpectTotalCount("Profile.AllAccounts.Categories",
+                          /*expected_count=*/3);
 }
 
 TEST_F(GAIAInfoUpdateServiceTest, MultiLoginAndLogOut) {
@@ -345,13 +346,13 @@
   entry->RecordAccountMetrics();
   tester.ExpectBucketCount(
       "Profile.AllAccounts.Names",
-      /*bucket=*/profile_metrics::AllAccountsNames::kMultipleNamesWithoutSync,
-      /*count=*/1);
+      /*sample=*/profile_metrics::AllAccountsNames::kMultipleNamesWithoutSync,
+      /*expected_count=*/1);
   tester.ExpectBucketCount(
       "Profile.AllAccounts.Categories",
-      /*bucket=*/
+      /*sample=*/
       profile_metrics::AllAccountsCategories::kBothConsumerAndEnterpriseNoSync,
-      /*count=*/1);
+      /*expected_count=*/1);
 
   // Log out and record the metric again, sign-out wipes previous info in the
   // entry so the default values get reported.
@@ -359,14 +360,15 @@
   entry->RecordAccountMetrics();
   tester.ExpectBucketCount(
       "Profile.AllAccounts.Names",
-      /*bucket=*/profile_metrics::AllAccountsNames::kLikelySingleName,
-      /*count=*/1);
+      /*sample=*/profile_metrics::AllAccountsNames::kLikelySingleName,
+      /*expected_count=*/1);
   tester.ExpectBucketCount(
       "Profile.AllAccounts.Categories",
-      /*bucket=*/profile_metrics::AllAccountsCategories::kSingleCategory,
-      /*count=*/1);
-  tester.ExpectTotalCount("Profile.AllAccounts.Names", /*count=*/2);
-  tester.ExpectTotalCount("Profile.AllAccounts.Categories", /*count=*/2);
+      /*sample=*/profile_metrics::AllAccountsCategories::kSingleCategory,
+      /*expected_count=*/1);
+  tester.ExpectTotalCount("Profile.AllAccounts.Names", /*expected_count=*/2);
+  tester.ExpectTotalCount("Profile.AllAccounts.Categories",
+                          /*expected_count=*/2);
 }
 #endif  // !defined(ANDROID)
 
diff --git a/chrome/browser/profiles/off_the_record_profile_impl.cc b/chrome/browser/profiles/off_the_record_profile_impl.cc
index 6e64b12..a600071 100644
--- a/chrome/browser/profiles/off_the_record_profile_impl.cc
+++ b/chrome/browser/profiles/off_the_record_profile_impl.cc
@@ -144,10 +144,7 @@
 
   // Must be done before CreateBrowserContextServices(), since some of them
   // change behavior based on whether the provided context is a guest session.
-  // TODO(https://crbug.com/1125474): Remove |IsEphemeralGuestProfile| when
-  // Incognito is disabled for ephemeral Guest profiles.
-  set_is_guest_profile(profile_->IsGuestSession() ||
-                       profile_->IsEphemeralGuestProfile());
+  set_is_guest_profile(profile_->IsGuestSession());
 
   BrowserContextDependencyManager::GetInstance()->CreateBrowserContextServices(
       this);
diff --git a/chrome/browser/profiles/profile.cc b/chrome/browser/profiles/profile.cc
index 6e8e8efc..f17e7b1a 100644
--- a/chrome/browser/profiles/profile.cc
+++ b/chrome/browser/profiles/profile.cc
@@ -372,10 +372,7 @@
 }
 
 bool Profile::IsIncognitoProfile() const {
-  // TODO(https://crbug.com/1125474): Remove |IsEphemeralGuestProfile| when
-  // Incognito is disabled for ephemeral Guest profiles.
-  return IsPrimaryOTRProfile() && !IsGuestSession() &&
-         !IsEphemeralGuestProfile();
+  return IsPrimaryOTRProfile() && !IsGuestSession();
 }
 
 // static
diff --git a/chrome/browser/profiles/profile_attributes_storage.cc b/chrome/browser/profiles/profile_attributes_storage.cc
index feeee6c..e260fa61 100644
--- a/chrome/browser/profiles/profile_attributes_storage.cc
+++ b/chrome/browser/profiles/profile_attributes_storage.cc
@@ -216,6 +216,10 @@
   profile_metrics::LogProfileName(GetNameState(entry), suffix);
   profile_metrics::LogProfileAccountType(
       GetUnconsentedPrimaryAccountType(entry), suffix);
+  profile_metrics::LogProfileSyncEnabled(
+      entry->GetSigninState() ==
+          SigninState::kSignedInWithConsentedPrimaryAccount,
+      suffix);
   profile_metrics::LogProfileDaysSinceLastUse(
       (base::Time::Now() - entry->GetActiveTime()).InDays(), suffix);
 }
diff --git a/chrome/browser/resources/BUILD.gn b/chrome/browser/resources/BUILD.gn
index 9e2d994f..40aa0dd 100644
--- a/chrome/browser/resources/BUILD.gn
+++ b/chrome/browser/resources/BUILD.gn
@@ -276,16 +276,20 @@
       "root_gen_dir=" + rebase_path(root_gen_dir, root_build_dir),
     ]
 
+    defines = chrome_grit_defines
     if (optimize_webui) {
       source = "settings/settings_resources_vulcanized.grd"
-
       deps = [ "//chrome/browser/resources/settings:build_polymer3" ]
     } else {
-      source = "settings/settings_resources.grd"
-      deps = [ "//chrome/browser/resources/settings:polymer3_elements" ]
+      # These arguments are needed since the grd is generated at build time.
+      enable_input_discovery_for_gn_analyze = false
+      defines += [ "SHARED_INTERMEDIATE_DIR=" +
+                   rebase_path(root_gen_dir, root_build_dir) ]
+      gen_dir = "$root_gen_dir/chrome/browser/resources/settings"
+      source = "$gen_dir/settings_resources.grd"
+      deps = [ "//chrome/browser/resources/settings:build_grd" ]
     }
 
-    defines = chrome_grit_defines
     outputs = [
       "grit/settings_resources.h",
       "grit/settings_resources_map.cc",
diff --git a/chrome/browser/resources/chromeos/login/screen_gaia_signin.js b/chrome/browser/resources/chromeos/login/screen_gaia_signin.js
index 79dca84d..cb525b1 100644
--- a/chrome/browser/resources/chromeos/login/screen_gaia_signin.js
+++ b/chrome/browser/resources/chromeos/login/screen_gaia_signin.js
@@ -1370,8 +1370,18 @@
   showAllowlistCheckFailedError(show, opt_data) {
     if (show) {
       const isManaged = opt_data && opt_data.enterpriseManaged;
-      this.$['gaia-allowlist-error'].textContent = loadTimeData.getValue(
-          isManaged ? 'allowlistErrorEnterprise' : 'allowlistErrorConsumer');
+      const isFamilyLinkAllowed = opt_data && opt_data.familyLinkAllowed;
+      errorMessage = '';
+      if (isManaged && isFamilyLinkAllowed) {
+        errorMessage = 'allowlistErrorEnterpriseAndFamilyLink';
+      } else if (isManaged) {
+        errorMessage = 'allowlistErrorEnterprise';
+      } else {
+        errorMessage = 'allowlistErrorConsumer';
+      }
+
+      this.$['gaia-allowlist-error'].textContent =
+          loadTimeData.getValue(errorMessage);
       // To make animations correct, we need to make sure Gaia is completely
       // reloaded. Otherwise ChromeOS overlays hide and Gaia page is shown
       // somewhere in the middle of animations.
diff --git a/chrome/browser/resources/settings/BUILD.gn b/chrome/browser/resources/settings/BUILD.gn
index 77e8782..92942e2 100644
--- a/chrome/browser/resources/settings/BUILD.gn
+++ b/chrome/browser/resources/settings/BUILD.gn
@@ -7,14 +7,17 @@
 import("//tools/grit/preprocess_grit.gni")
 import("//tools/polymer/html_to_js.gni")
 import("//tools/polymer/polymer.gni")
+import("//ui/webui/resources/tools/generate_grd.gni")
 import("//ui/webui/resources/tools/js_modulizer.gni")
 import("//ui/webui/webui_features.gni")
 import("../optimize_webui.gni")
 import("settings.gni")
 
-if (optimize_webui) {
-  preprocess_folder = "preprocessed"
+preprocess_folder = "preprocessed"
+preprocess_manifest = "preprocessed_manifest.json"
+preprocess_gen_manifest = "preprocessed_gen_manifest.json"
 
+if (optimize_webui) {
   optimize_webui("build_polymer3") {
     host = "settings"
     input = rebase_path("$target_gen_dir/$preprocess_folder", root_build_dir)
@@ -39,244 +42,275 @@
       "chrome://resources/mojo/skia/public/mojom/skcolor.mojom-lite.js",
     ]
   }
-
-  preprocess_grit("preprocess") {
-    in_folder = "./"
-    out_folder = "$target_gen_dir/$preprocess_folder"
-    in_files = [
-      "a11y_page/captions_browser_proxy.js",
-      "appearance_page/appearance_browser_proxy.js",
-      "autofill_page/merge_exceptions_store_copies_behavior.js",
-      "autofill_page/merge_passwords_store_copies_behavior.js",
-      "autofill_page/multi_store_exception_entry.js",
-      "autofill_page/multi_store_id_handler.js",
-      "autofill_page/multi_store_password_ui_entry.js",
-      "autofill_page/password_check_behavior.js",
-      "autofill_page/password_manager_proxy.js",
-      "autofill_page/show_password_behavior.js",
-      "chrome_cleanup_page/chrome_cleanup_proxy.js",
-      "clear_browsing_data_dialog/clear_browsing_data_browser_proxy.js",
-      "controls/settings_idle_load.js",
-      "downloads_page/downloads_browser_proxy.js",
-      "ensure_lazy_loaded.js",
-      "hats_browser_proxy.js",
-      "i18n_setup.js",
-      "incompatible_applications_page/incompatible_applications_browser_proxy.js",
-      "lazy_load.js",
-      "metrics_browser_proxy.js",
-      "on_startup_page/on_startup_browser_proxy.js",
-      "on_startup_page/startup_urls_page_browser_proxy.js",
-      "open_window_proxy.js",
-      "page_visibility.js",
-      "privacy_page/security_keys_browser_proxy.js",
-      "reset_page/reset_browser_proxy.js",
-      "route.js",
-      "safety_check_page/safety_check_browser_proxy.js",
-      "settings_page/main_page_behavior.js",
-      "settings_routes.js",
-      "settings.js",
-      "site_settings/constants.js",
-      "site_settings/cookie_info.js",
-      "site_settings/local_data_browser_proxy.js",
-      "site_settings/site_settings_behavior.js",
-      "site_settings/site_settings_prefs_browser_proxy.js",
-      "site_settings/website_usage_browser_proxy.js",
+} else {
+  generate_grd("build_grd") {
+    deps = [
+      ":preprocess",
+      ":preprocess_generated",
     ]
+    manifest_files = [
+      "$target_gen_dir/$preprocess_manifest",
+      "$target_gen_dir/$preprocess_gen_manifest",
+    ]
+    grd_prefix = "settings"
+    out_grd = "$target_gen_dir/${grd_prefix}_resources.grd"
+  }
+}
 
-    if (is_chromeos) {
-      in_files += [
-        "autofill_page/blocking_request_manager.js",
-        "languages_page/languages_metrics_proxy.js",
-        "site_settings/android_info_browser_proxy.js",
-      ]
-    } else {
-      in_files += [
-        "default_browser_page/default_browser_browser_proxy.js",
-        "people_page/import_data_browser_proxy.js",
-        "people_page/manage_profile_browser_proxy.js",
-        "printing_page/printing_browser_proxy.js",
-        "system_page/system_page_browser_proxy.js",
-      ]
-    }
+preprocess_grit("preprocess") {
+  in_folder = "./"
+  out_folder = "$target_gen_dir/$preprocess_folder"
+  out_manifest = "$target_gen_dir/$preprocess_manifest"
+  in_files = [
+    "a11y_page/captions_browser_proxy.js",
+    "appearance_page/appearance_browser_proxy.js",
+    "autofill_page/merge_exceptions_store_copies_behavior.js",
+    "autofill_page/merge_passwords_store_copies_behavior.js",
+    "autofill_page/multi_store_exception_entry.js",
+    "autofill_page/multi_store_id_handler.js",
+    "autofill_page/multi_store_password_ui_entry.js",
+    "autofill_page/password_check_behavior.js",
+    "autofill_page/password_manager_proxy.js",
+    "autofill_page/show_password_behavior.js",
+    "chrome_cleanup_page/chrome_cleanup_proxy.js",
+    "clear_browsing_data_dialog/clear_browsing_data_browser_proxy.js",
+    "controls/settings_idle_load.js",
+    "downloads_page/downloads_browser_proxy.js",
+    "ensure_lazy_loaded.js",
+    "hats_browser_proxy.js",
+    "i18n_setup.js",
+    "incompatible_applications_page/incompatible_applications_browser_proxy.js",
+    "lazy_load.js",
+    "metrics_browser_proxy.js",
+    "on_startup_page/on_startup_browser_proxy.js",
+    "on_startup_page/startup_urls_page_browser_proxy.js",
+    "open_window_proxy.js",
+    "page_visibility.js",
+    "privacy_page/security_keys_browser_proxy.js",
+    "reset_page/reset_browser_proxy.js",
+    "route.js",
+    "safety_check_page/safety_check_browser_proxy.js",
+    "settings.js",
+    "settings_page/main_page_behavior.js",
+    "settings_routes.js",
+    "site_settings/constants.js",
+    "site_settings/cookie_info.js",
+    "site_settings/local_data_browser_proxy.js",
+    "site_settings/site_settings_behavior.js",
+    "site_settings/site_settings_prefs_browser_proxy.js",
+    "site_settings/website_usage_browser_proxy.js",
+
+    # TODO(dpapad): Pass these directly to the generate_grd() target above, once
+    # support for that is added, as part of crbug.com/1132403.
+    "images/cookies_banner.svg",
+    "images/cookies_banner_dark.svg",
+    "images/password_check_neutral.svg",
+    "images/password_check_neutral_dark.svg",
+    "images/password_check_positive.svg",
+    "images/password_check_positive_dark.svg",
+    "images/permissions_banner.svg",
+    "images/permissions_banner_dark.svg",
+    "images/safe_browsing_banner.svg",
+    "images/safe_browsing_banner_dark.svg",
+    "images/sync_banner.svg",
+    "images/sync_banner_dark.svg",
+    "settings_v3.html",
+  ]
+
+  if (is_chromeos) {
+    in_files += [
+      "autofill_page/blocking_request_manager.js",
+      "languages_page/languages_metrics_proxy.js",
+      "site_settings/android_info_browser_proxy.js",
+    ]
+  } else {
+    in_files += [
+      "default_browser_page/default_browser_browser_proxy.js",
+      "people_page/import_data_browser_proxy.js",
+      "people_page/manage_profile_browser_proxy.js",
+      "printing_page/printing_browser_proxy.js",
+      "system_page/system_page_browser_proxy.js",
+    ]
+  }
+}
+
+preprocess_grit("preprocess_generated") {
+  deps = [ ":polymer3_elements" ]
+  in_folder = target_gen_dir
+  out_folder = "$target_gen_dir/$preprocess_folder"
+  out_manifest = "$target_gen_dir/$preprocess_gen_manifest"
+  in_files = [
+    "a11y_page/a11y_page.js",
+    "a11y_page/captions_subpage.m.js",
+    "about_page/about_page_browser_proxy.m.js",
+    "about_page/about_page.js",
+    "appearance_page/appearance_fonts_page.js",
+    "appearance_page/appearance_page.js",
+    "appearance_page/fonts_browser_proxy.m.js",
+    "appearance_page/home_url_input.js",
+    "autofill_page/autofill_page.js",
+    "autofill_page/avatar_icon.js",
+    "autofill_page/payments_list.js",
+    "autofill_page/credit_card_list_entry.js",
+    "autofill_page/upi_id_list_entry.js",
+    "autofill_page/passwords_shared_css.js",
+    "autofill_page/credit_card_edit_dialog.js",
+    "autofill_page/autofill_section.js",
+    "autofill_page/address_edit_dialog.js",
+    "autofill_page/password_check.js",
+    "autofill_page/password_check_edit_dialog.js",
+    "autofill_page/password_check_edit_disclaimer_dialog.js",
+    "autofill_page/password_check_list_item.js",
+    "autofill_page/password_list_item.js",
+    "autofill_page/passwords_list_handler.js",
+    "autofill_page/password_remove_confirmation_dialog.js",
+    "autofill_page/passwords_section.js",
+    "autofill_page/passwords_device_section.js",
+    "autofill_page/password_edit_dialog.js",
+    "autofill_page/password_move_to_account_dialog.js",
+    "autofill_page/password_remove_dialog.js",
+    "autofill_page/passwords_export_dialog.js",
+    "autofill_page/payments_section.js",
+    "basic_page/basic_page.js",
+    "clear_browsing_data_dialog/clear_browsing_data_dialog.js",
+    "clear_browsing_data_dialog/history_deletion_dialog.js",
+    "clear_browsing_data_dialog/installed_app_checkbox.js",
+    "clear_browsing_data_dialog/passwords_deletion_dialog.js",
+    "controls/controlled_button.m.js",
+    "controls/controlled_radio_button.m.js",
+    "controls/extension_controlled_indicator.m.js",
+    "controls/password_prompt_dialog.m.js",
+    "controls/settings_boolean_control_behavior.m.js",
+    "controls/settings_checkbox.js",
+    "controls/settings_dropdown_menu.m.js",
+    "controls/pref_control_behavior.m.js",
+    "controls/settings_radio_group.m.js",
+    "controls/settings_slider.m.js",
+    "controls/settings_textarea.m.js",
+    "controls/settings_toggle_button.m.js",
+    "downloads_page/downloads_page.js",
+    "extension_control_browser_proxy.m.js",
+    "global_scroll_target_behavior.m.js",
+    "icons.m.js",
+    "languages_page/languages.m.js",
+    "languages_page/languages_browser_proxy.m.js",
+    "languages_page/add_languages_dialog.js",
+    "languages_page/languages_page.js",
+    "lifetime_browser_proxy.m.js",
+    "settings_menu/settings_menu.js",
+    "on_startup_page/on_startup_page.js",
+    "on_startup_page/startup_url_dialog.js",
+    "on_startup_page/startup_url_entry.js",
+    "on_startup_page/startup_urls_page.js",
+    "people_page/sync_account_control.m.js",
+    "people_page/sync_browser_proxy.m.js",
+    "people_page/sync_encryption_options.m.js",
+    "people_page/people_page.js",
+    "people_page/profile_info_browser_proxy.m.js",
+    "people_page/signout_dialog.m.js",
+    "people_page/sync_controls.m.js",
+    "people_page/sync_page.m.js",
+    "prefs/prefs.m.js",
+    "prefs/prefs_behavior.m.js",
+    "prefs/prefs_types.m.js",
+    "prefs/pref_util.m.js",
+    "printing_page/cloud_printers.js",
+    "printing_page/printing_page.js",
+    "privacy_page/collapse_radio_button.js",
+    "privacy_page/cookies_page.js",
+    "privacy_page/do_not_track_toggle.js",
+    "privacy_page/privacy_page.js",
+    "privacy_page/personalization_options.m.js",
+    "privacy_page/privacy_page_browser_proxy.m.js",
+    "privacy_page/secure_dns.js",
+    "privacy_page/secure_dns_input.js",
+    "privacy_page/security_page.js",
+    "privacy_page/disable_safebrowsing_dialog.js",
+    "privacy_page/security_keys_bio_enroll_dialog.js",
+    "privacy_page/security_keys_credential_management_dialog.js",
+    "privacy_page/security_keys_pin_field.js",
+    "privacy_page/security_keys_reset_dialog.js",
+    "privacy_page/security_keys_set_pin_dialog.js",
+    "privacy_page/security_keys_subpage.js",
+    "reset_page/reset_page.js",
+    "reset_page/reset_profile_dialog.js",
+    "reset_page/reset_profile_banner.js",
+    "router.m.js",
+    "safety_check_page/safety_check_child.js",
+    "safety_check_page/safety_check_extensions_child.js",
+    "safety_check_page/safety_check_page.js",
+    "safety_check_page/safety_check_passwords_child.js",
+    "safety_check_page/safety_check_safe_browsing_child.js",
+    "safety_check_page/safety_check_updates_child.js",
+    "search_engines_page/search_engines_browser_proxy.m.js",
+    "search_engines_page/omnibox_extension_entry.js",
+    "search_engines_page/search_engine_dialog.js",
+    "search_engines_page/search_engine_entry_css.js",
+    "search_engines_page/search_engine_entry.js",
+    "search_engines_page/search_engines_list.js",
+    "search_engines_page/search_engines_page.js",
+    "search_page/search_page.js",
+    "search_settings.m.js",
+    "settings_main/settings_main.js",
+    "settings_page/settings_animated_pages.m.js",
+    "settings_page/settings_section.m.js",
+    "settings_page/settings_subpage.m.js",
+    "settings_ui/settings_ui.js",
+    "setting_id_param_util.m.js",
+    "settings_page_css.m.js",
+    "settings_shared_css.m.js",
+    "settings_vars_css.m.js",
+    "site_favicon.js",
+    "site_settings/add_site_dialog.js",
+    "site_settings/all_sites.js",
+    "site_settings/all_sites_icons.js",
+    "site_settings/category_default_setting.js",
+    "site_settings/category_setting_exceptions.js",
+    "site_settings/chooser_exception_list.js",
+    "site_settings/chooser_exception_list_entry.js",
+    "site_settings/clear_storage_dialog_css.js",
+    "site_settings/edit_exception_dialog.js",
+    "site_settings/media_picker.js",
+    "site_settings/pdf_documents.js",
+    "site_settings/protocol_handlers.js",
+    "site_settings/settings_category_default_radio_group.js",
+    "site_settings/site_data.js",
+    "site_settings/site_data_details_subpage.js",
+    "site_settings/site_data_entry.js",
+    "site_settings/site_details.js",
+    "site_settings/site_details_permission.js",
+    "site_settings/site_entry.js",
+    "site_settings/site_list.js",
+    "site_settings/site_list_entry.js",
+    "site_settings/zoom_levels.js",
+    "site_settings_page/recent_site_permissions.js",
+    "site_settings_page/site_settings_list.js",
+    "site_settings_page/site_settings_page.js",
+  ]
+
+  if (is_win) {
+    in_files += [
+      "chrome_cleanup_page/chrome_cleanup_page.js",
+      "chrome_cleanup_page/items_to_remove_list.js",
+      "incompatible_applications_page/incompatible_applications_page.js",
+      "incompatible_applications_page/incompatible_application_item.js",
+      "safety_check_page/safety_check_chrome_cleaner_child.js",
+    ]
   }
 
-  preprocess_grit("preprocess_generated") {
-    deps = [ ":polymer3_elements" ]
-    in_folder = target_gen_dir
-    out_folder = "$target_gen_dir/$preprocess_folder"
-    in_files = [
-      "a11y_page/a11y_page.js",
-      "a11y_page/captions_subpage.m.js",
-      "about_page/about_page_browser_proxy.m.js",
-      "about_page/about_page.js",
-      "appearance_page/appearance_fonts_page.js",
-      "appearance_page/appearance_page.js",
-      "appearance_page/fonts_browser_proxy.m.js",
-      "appearance_page/home_url_input.js",
-      "autofill_page/autofill_page.js",
-      "autofill_page/avatar_icon.js",
-      "autofill_page/payments_list.js",
-      "autofill_page/credit_card_list_entry.js",
-      "autofill_page/upi_id_list_entry.js",
-      "autofill_page/passwords_shared_css.js",
-      "autofill_page/credit_card_edit_dialog.js",
-      "autofill_page/autofill_section.js",
-      "autofill_page/address_edit_dialog.js",
-      "autofill_page/password_check.js",
-      "autofill_page/password_check_edit_dialog.js",
-      "autofill_page/password_check_edit_disclaimer_dialog.js",
-      "autofill_page/password_check_list_item.js",
-      "autofill_page/password_list_item.js",
-      "autofill_page/passwords_list_handler.js",
-      "autofill_page/password_remove_confirmation_dialog.js",
-      "autofill_page/passwords_section.js",
-      "autofill_page/passwords_device_section.js",
-      "autofill_page/password_edit_dialog.js",
-      "autofill_page/password_move_to_account_dialog.js",
-      "autofill_page/password_remove_dialog.js",
-      "autofill_page/passwords_export_dialog.js",
-      "autofill_page/payments_section.js",
-      "basic_page/basic_page.js",
-      "clear_browsing_data_dialog/clear_browsing_data_dialog.js",
-      "clear_browsing_data_dialog/history_deletion_dialog.js",
-      "clear_browsing_data_dialog/installed_app_checkbox.js",
-      "clear_browsing_data_dialog/passwords_deletion_dialog.js",
-      "controls/controlled_button.m.js",
-      "controls/controlled_radio_button.m.js",
-      "controls/extension_controlled_indicator.m.js",
-      "controls/password_prompt_dialog.m.js",
-      "controls/settings_boolean_control_behavior.m.js",
-      "controls/settings_checkbox.js",
-      "controls/settings_dropdown_menu.m.js",
-      "controls/pref_control_behavior.m.js",
-      "controls/settings_radio_group.m.js",
-      "controls/settings_slider.m.js",
-      "controls/settings_textarea.m.js",
-      "controls/settings_toggle_button.m.js",
-      "downloads_page/downloads_page.js",
-      "extension_control_browser_proxy.m.js",
-      "global_scroll_target_behavior.m.js",
-      "icons.m.js",
-      "languages_page/languages.m.js",
-      "languages_page/languages_browser_proxy.m.js",
-      "languages_page/add_languages_dialog.js",
-      "languages_page/languages_page.js",
-      "lifetime_browser_proxy.m.js",
-      "settings_menu/settings_menu.js",
-      "on_startup_page/on_startup_page.js",
-      "on_startup_page/startup_url_dialog.js",
-      "on_startup_page/startup_url_entry.js",
-      "on_startup_page/startup_urls_page.js",
-      "people_page/sync_account_control.m.js",
-      "people_page/sync_browser_proxy.m.js",
-      "people_page/sync_encryption_options.m.js",
-      "people_page/people_page.js",
-      "people_page/profile_info_browser_proxy.m.js",
-      "people_page/signout_dialog.m.js",
-      "people_page/sync_controls.m.js",
-      "people_page/sync_page.m.js",
-      "prefs/prefs.m.js",
-      "prefs/prefs_behavior.m.js",
-      "prefs/prefs_types.m.js",
-      "prefs/pref_util.m.js",
-      "printing_page/cloud_printers.js",
-      "printing_page/printing_page.js",
-      "privacy_page/collapse_radio_button.js",
-      "privacy_page/cookies_page.js",
-      "privacy_page/do_not_track_toggle.js",
-      "privacy_page/privacy_page.js",
-      "privacy_page/personalization_options.m.js",
-      "privacy_page/privacy_page_browser_proxy.m.js",
-      "privacy_page/secure_dns.js",
-      "privacy_page/secure_dns_input.js",
-      "privacy_page/security_page.js",
-      "privacy_page/disable_safebrowsing_dialog.js",
-      "privacy_page/security_keys_bio_enroll_dialog.js",
-      "privacy_page/security_keys_credential_management_dialog.js",
-      "privacy_page/security_keys_pin_field.js",
-      "privacy_page/security_keys_reset_dialog.js",
-      "privacy_page/security_keys_set_pin_dialog.js",
-      "privacy_page/security_keys_subpage.js",
-      "reset_page/reset_page.js",
-      "reset_page/reset_profile_dialog.js",
-      "reset_page/reset_profile_banner.js",
-      "router.m.js",
-      "safety_check_page/safety_check_child.js",
-      "safety_check_page/safety_check_extensions_child.js",
-      "safety_check_page/safety_check_page.js",
-      "safety_check_page/safety_check_passwords_child.js",
-      "safety_check_page/safety_check_safe_browsing_child.js",
-      "safety_check_page/safety_check_updates_child.js",
-      "search_engines_page/search_engines_browser_proxy.m.js",
-      "search_engines_page/omnibox_extension_entry.js",
-      "search_engines_page/search_engine_dialog.js",
-      "search_engines_page/search_engine_entry_css.js",
-      "search_engines_page/search_engine_entry.js",
-      "search_engines_page/search_engines_list.js",
-      "search_engines_page/search_engines_page.js",
-      "search_page/search_page.js",
-      "search_settings.m.js",
-      "settings_main/settings_main.js",
-      "settings_page/settings_animated_pages.m.js",
-      "settings_page/settings_section.m.js",
-      "settings_page/settings_subpage.m.js",
-      "settings_ui/settings_ui.js",
-      "setting_id_param_util.m.js",
-      "settings_page_css.m.js",
-      "settings_shared_css.m.js",
-      "settings_vars_css.m.js",
-      "site_favicon.js",
-      "site_settings/add_site_dialog.js",
-      "site_settings/all_sites.js",
-      "site_settings/all_sites_icons.js",
-      "site_settings/category_default_setting.js",
-      "site_settings/category_setting_exceptions.js",
-      "site_settings/chooser_exception_list.js",
-      "site_settings/chooser_exception_list_entry.js",
-      "site_settings/clear_storage_dialog_css.js",
-      "site_settings/edit_exception_dialog.js",
-      "site_settings/media_picker.js",
-      "site_settings/pdf_documents.js",
-      "site_settings/protocol_handlers.js",
-      "site_settings/settings_category_default_radio_group.js",
-      "site_settings/site_data.js",
-      "site_settings/site_data_details_subpage.js",
-      "site_settings/site_data_entry.js",
-      "site_settings/site_details.js",
-      "site_settings/site_details_permission.js",
-      "site_settings/site_entry.js",
-      "site_settings/site_list.js",
-      "site_settings/site_list_entry.js",
-      "site_settings/zoom_levels.js",
-      "site_settings_page/recent_site_permissions.js",
-      "site_settings_page/site_settings_list.js",
-      "site_settings_page/site_settings_page.js",
+  if (!is_mac) {
+    in_files += [ "languages_page/edit_dictionary_page.js" ]
+  }
+
+  if (is_chromeos) {
+    in_files += [ "people_page/account_manager_browser_proxy.m.js" ]
+  } else {
+    in_files += [
+      "default_browser_page/default_browser_page.js",
+      "people_page/import_data_dialog.js",
+      "people_page/manage_profile.js",
+      "system_page/system_page.js",
     ]
-
-    if (is_win) {
-      in_files += [
-        "chrome_cleanup_page/chrome_cleanup_page.js",
-        "chrome_cleanup_page/items_to_remove_list.js",
-        "incompatible_applications_page/incompatible_applications_page.js",
-        "incompatible_applications_page/incompatible_application_item.js",
-        "safety_check_page/safety_check_chrome_cleaner_child.js",
-      ]
-    }
-
-    if (!is_mac) {
-      in_files += [ "languages_page/edit_dictionary_page.js" ]
-    }
-
-    if (is_chromeos) {
-      in_files += [ "people_page/account_manager_browser_proxy.m.js" ]
-    } else {
-      in_files += [
-        "default_browser_page/default_browser_page.js",
-        "people_page/import_data_dialog.js",
-        "people_page/manage_profile.js",
-        "system_page/system_page.js",
-      ]
-    }
   }
 }
 
diff --git a/chrome/browser/resources/settings/settings_resources.grd b/chrome/browser/resources/settings/settings_resources.grd
deleted file mode 100644
index fcb48163..0000000
--- a/chrome/browser/resources/settings/settings_resources.grd
+++ /dev/null
@@ -1,68 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<grit latest_public_release="0" current_release="1" output_all_resource_defines="false">
-  <outputs>
-    <output filename="grit/settings_resources.h" type="rc_header">
-      <emit emit_type='prepend'></emit>
-    </output>
-    <output filename="grit/settings_resources_map.cc"
-            type="resource_file_map_source" />
-    <output filename="grit/settings_resources_map.h"
-            type="resource_map_header" />
-    <output filename="settings_resources.pak" type="data_package" />
-  </outputs>
-  <release seq="1">
-    <includes>
-      <part file="settings_resources_v3.grdp" />
-    </includes>
-    <structures>
-      <structure name="IDR_SETTINGS_IMAGES_COOKIES_BANNER_SVG"
-                 file="images/cookies_banner.svg"
-                 compress="false"
-                 type="chrome_html" />
-      <structure name="IDR_SETTINGS_IMAGES_COOKIES_BANNER_DARK_SVG"
-                 file="images/cookies_banner_dark.svg"
-                 compress="false"
-                 type="chrome_html" />
-      <structure name="IDR_SETTINGS_IMAGES_PASSWORD_CHECK_NEUTRAL_SVG"
-                 file="images/password_check_neutral.svg"
-                 compress="false"
-                 type="chrome_html" />
-      <structure name="IDR_SETTINGS_IMAGES_PASSWORD_CHECK_NEUTRAL_DARK_SVG"
-                 file="images/password_check_neutral_dark.svg"
-                 compress="false"
-                 type="chrome_html" />
-      <structure name="IDR_SETTINGS_IMAGES_PASSWORD_CHECK_POSITIVE_SVG"
-                 file="images/password_check_positive.svg"
-                 compress="false"
-                 type="chrome_html" />
-      <structure name="IDR_SETTINGS_IMAGES_PASSWORD_CHECK_POSITIVE_DARK_SVG"
-                 file="images/password_check_positive_dark.svg"
-                 compress="false"
-                 type="chrome_html" />
-      <structure name="IDR_SETTINGS_IMAGES_PERMISSIONS_BANNER_SVG"
-                 file="images/permissions_banner.svg"
-                 compress="false"
-                 type="chrome_html" />
-      <structure name="IDR_SETTINGS_IMAGES_PERMISSIONS_BANNER_DARK_SVG"
-                 file="images/permissions_banner_dark.svg"
-                 compress="false"
-                 type="chrome_html" />
-      <structure name="IDR_SETTINGS_IMAGES_SAFE_BROWSING_BANNER_SVG"
-                 file="images/safe_browsing_banner.svg"
-                 compress="false"
-                 type="chrome_html" />
-      <structure name="IDR_SETTINGS_IMAGES_SAFE_BROWSING_BANNER_DARK_SVG"
-                 file="images/safe_browsing_banner_dark.svg"
-                 compress="false"
-                 type="chrome_html" />
-      <structure name="IDR_SETTINGS_IMAGES_SYNC_BANNER_SVG"
-                 file="images/sync_banner.svg"
-                 compress="false"
-                 type="chrome_html" />
-      <structure name="IDR_SETTINGS_IMAGES_SYNC_BANNER_DARK_SVG"
-                 file="images/sync_banner_dark.svg"
-                 compress="false"
-                 type="chrome_html" />
-    </structures>
-  </release>
-</grit>
diff --git a/chrome/browser/resources/settings/settings_resources_v3.grdp b/chrome/browser/resources/settings/settings_resources_v3.grdp
deleted file mode 100644
index ab5f774..0000000
--- a/chrome/browser/resources/settings/settings_resources_v3.grdp
+++ /dev/null
@@ -1,861 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<grit-part>
-  <!-- Polymer 3.0 Elements -->
-  <include name="IDR_SETTINGS_A11Y_PAGE_A11Y_PAGE_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/a11y_page/a11y_page.js"
-           use_base_dir="false"
-           type="BINDATA"
-           preprocess="true" />
-  <if expr="not is_macosx and not chromeos">
-    <include name="IDR_SETTINGS_A11Y_PAGE_CAPTIONS_SUBPAGE_M_JS"
-             file="${root_gen_dir}/chrome/browser/resources/settings/a11y_page/captions_subpage.m.js"
-             use_base_dir="false"
-             type="BINDATA" />
-  </if>
-  <if expr="is_win or is_macosx">
-    <include name="IDR_SETTINGS_A11Y_PAGE_CAPTIONS_BROWSER_PROXY_JS"
-             file="a11y_page/captions_browser_proxy.js"
-             type="BINDATA" />
-  </if>
-  <include name="IDR_SETTINGS_ABOUT_PAGE_ABOUT_PAGE_BROWSER_PROXY_M_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/about_page/about_page_browser_proxy.m.js"
-           use_base_dir="false"
-           type="BINDATA"
-           preprocess="true" />
-  <include name="IDR_SETTINGS_ABOUT_PAGE_ABOUT_PAGE_M_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/about_page/about_page.js"
-           use_base_dir="false"
-           type="BINDATA"
-           preprocess="true" />
-  <include name="IDR_SETTINGS_APPEARANCE_PAGE_APPEARANCE_BROWSER_PROXY_JS"
-           file="appearance_page/appearance_browser_proxy.js"
-           preprocess="true"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_APPEARANCE_PAGE_APPEARANCE_FONTS_PAGE_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/appearance_page/appearance_fonts_page.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_APPEARANCE_PAGE_APPEARANCE_PAGE_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/appearance_page/appearance_page.js"
-           use_base_dir="false"
-           preprocess="true"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_APPEARANCE_PAGE_FONTS_BROWSER_PROXY_M_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/appearance_page/fonts_browser_proxy.m.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_APPEARANCE_PAGE_HOME_URL_INPUT_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/appearance_page/home_url_input.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_AUTOFILL_PAGE_AUTOFILL_PAGE_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/autofill_page/autofill_page.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_AUTOFILL_PAGE_AVATAR_ICON_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/autofill_page/avatar_icon.js"
-           use_base_dir="false"
-           type="BINDATA"
-           preprocess="true" />
-  <include name="IDR_SETTINGS_AUTOFILL_PAGE_PAYMENTS_LIST_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/autofill_page/payments_list.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_AUTOFILL_PAGE_CREDIT_CARD_LIST_ENTRY_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/autofill_page/credit_card_list_entry.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_AUTOFILL_PAGE_UPI_ID_LIST_ENTRY_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/autofill_page/upi_id_list_entry.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_AUTOFILL_PAGE_PASSWORDS_SHARED_CSS_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/autofill_page/passwords_shared_css.js"
-           use_base_dir="false"
-           type="BINDATA"
-           preprocess="true" />
-  <include name="IDR_SETTINGS_AUTOFILL_PAGE_CREDIT_CARD_EDIT_DIALOG_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/autofill_page/credit_card_edit_dialog.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_AUTOFILL_PAGE_AUTOFILL_SECTION_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/autofill_page/autofill_section.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_AUTOFILL_PAGE_ADDRESS_EDIT_DIALOG_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/autofill_page/address_edit_dialog.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <if expr="chromeos">
-    <include name="IDR_SETTINGS_AUTOFILL_PAGE_BLOCKING_REQUEST_MANAGER_JS"
-             file="autofill_page/blocking_request_manager.js"
-             type="BINDATA" />
-  </if>
-  <include name="IDR_SETTINGS_AUTOFILL_PAGE_MERGE_EXCEPTIONS_STORE_COPIES_BEHAVIOR_JS"
-           file="autofill_page/merge_exceptions_store_copies_behavior.js"
-           type="BINDATA"
-           preprocess="true" />
-  <include name="IDR_SETTINGS_AUTOFILL_PAGE_MERGE_PASSWORDS_STORE_COPIES_BEHAVIOR_JS"
-           file="autofill_page/merge_passwords_store_copies_behavior.js"
-           type="BINDATA"
-           preprocess="true" />
-  <include name="IDR_SETTINGS_AUTOFILL_PAGE_MULTI_STORE_EXCEPTION_ENTRY_JS"
-           file="autofill_page/multi_store_exception_entry.js"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_AUTOFILL_PAGE_MULTI_STORE_ID_HANDLER_JS"
-           file="autofill_page/multi_store_id_handler.js"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_AUTOFILL_PAGE_MULTI_STORE_PASSWORD_UI_ENTRY_JS"
-           file="autofill_page/multi_store_password_ui_entry.js"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_AUTOFILL_PAGE_PASSWORD_CHECK_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/autofill_page/password_check.js"
-           use_base_dir="false"
-           preprocess="true"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_AUTOFILL_PAGE_PASSWORD_CHECK_BEHAVIOR_JS"
-           file="autofill_page/password_check_behavior.js"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_AUTOFILL_PAGE_PASSWORD_CHECK_EDIT_DIALOG_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/autofill_page/password_check_edit_dialog.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_AUTOFILL_PAGE_PASSWORD_CHECK_EDIT_DISCLAIMER_DIALOG_M_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/autofill_page/password_check_edit_disclaimer_dialog.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_AUTOFILL_PAGE_PASSWORD_CHECK_LIST_ITEM_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/autofill_page/password_check_list_item.js"
-           use_base_dir="false"
-           type="BINDATA"
-           preprocess="true"/>
-  <include name="IDR_SETTINGS_AUTOFILL_PAGE_PASSWORD_LIST_ITEM_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/autofill_page/password_list_item.js"
-           use_base_dir="false"
-           type="BINDATA"
-           preprocess="true"/>
-  <include name="IDR_SETTINGS_AUTOFILL_PAGE_PASSWORDS_LIST_HANDLER_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/autofill_page/passwords_list_handler.js"
-           use_base_dir="false"
-           type="BINDATA"
-           preprocess="true"/>
-  <include name="IDR_SETTINGS_AUTOFILL_PAGE_PASSWORD_MANAGER_PROXY_JS"
-           file="autofill_page/password_manager_proxy.js"
-           type="BINDATA" />
- <include name="IDR_SETTINGS_AUTOFILL_PAGE_PASSWORD_REMOVE_CONFIRMATION_DIALOG_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/autofill_page/password_remove_confirmation_dialog.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_AUTOFILL_PAGE_PASSWORDS_SECTION_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/autofill_page/passwords_section.js"
-           use_base_dir="false"
-           type="BINDATA"
-           preprocess="true" />
-  <include name="IDR_SETTINGS_AUTOFILL_PAGE_PASSWORDS_DEVICE_SECTION_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/autofill_page/passwords_device_section.js"
-           use_base_dir="false"
-           type="BINDATA"
-           preprocess="true" />
-  <include name="IDR_SETTINGS_AUTOFILL_PAGE_PASSWORD_EDIT_DIALOG_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/autofill_page/password_edit_dialog.js"
-           use_base_dir="false"
-           type="BINDATA"
-           preprocess="true" />
-  <include name="IDR_SETTINGS_AUTOFILL_PAGE_PASSWORD_MOVE_TO_ACCOUNT_DIALOG_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/autofill_page/password_move_to_account_dialog.js"
-           use_base_dir="false"
-           type="BINDATA"
-           preprocess="true" />
-  <include name="IDR_SETTINGS_AUTOFILL_PAGE_PASSWORD_REMOVE_DIALOG_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/autofill_page/password_remove_dialog.js"
-           use_base_dir="false"
-           type="BINDATA"
-           preprocess="true" />
-  <include name="IDR_SETTINGS_AUTOFILL_PAGE_PASSWORDS_EXPORT_DIALOG_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/autofill_page/passwords_export_dialog.js"
-           use_base_dir="false"
-           type="BINDATA"
-           preprocess="true" />
-  <include name="IDR_SETTINGS_AUTOFILL_PAGE_PAYMENTS_SECTION_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/autofill_page/payments_section.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_AUTOFILL_PAGE_SHOW_PASSWORD_BEHAVIOR_JS"
-           file="autofill_page/show_password_behavior.js"
-           type="BINDATA"
-           preprocess="true" />
-  <include name="IDR_SETTINGS_BASIC_PAGE_BASIC_PAGE_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/basic_page/basic_page.js"
-           use_base_dir="false"
-           type="BINDATA"
-           preprocess="true" />
-  <if expr="is_win">
-    <include name="IDR_SETTINGS_CHROME_CLEANUP_PROXY_JS"
-             file="chrome_cleanup_page/chrome_cleanup_proxy.js"
-             type="BINDATA" />
-    <include name="IDR_SETTINGS_CHROME_CLEANUP_PAGE_JS"
-             file="${root_gen_dir}/chrome/browser/resources/settings/chrome_cleanup_page/chrome_cleanup_page.js"
-             use_base_dir="false"
-             type="BINDATA"
-             preprocess="true" />
-    <include name="IDR_SETTINGS_CHROME_CLEANUP_ITEMS_TO_REMOVE_LIST_JS"
-             file="${root_gen_dir}/chrome/browser/resources/settings/chrome_cleanup_page/items_to_remove_list.js"
-             use_base_dir="false"
-             type="BINDATA" />
-  </if>
-  <include name="IDR_SETTINGS_CLEAR_BROWSING_DATA_DIALOG_CLEAR_BROWSING_DATA_BROWSER_PROXY_M_JS"
-           file="clear_browsing_data_dialog/clear_browsing_data_browser_proxy.js"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_CLEAR_BROWSING_DATA_DIALOG_CLEAR_BROWSING_DATA_DIALOG_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_dialog.js"
-           use_base_dir="false"
-           type="BINDATA"
-           preprocess="true" />
-  <include name="IDR_SETTINGS_CLEAR_BROWSING_DATA_DIALOG_HISTORY_DELETION_DIALOG_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/clear_browsing_data_dialog/history_deletion_dialog.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_CLEAR_BROWSING_DATA_DIALOG_INSTALLED_APP_CHECKBOX_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/clear_browsing_data_dialog/installed_app_checkbox.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_CLEAR_BROWSING_DATA_DIALOG_PASSWORDS_DELETION_DIALOG_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/clear_browsing_data_dialog/passwords_deletion_dialog.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_CONTROLS_CONTROLLED_BUTTON_M_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/controls/controlled_button.m.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_CONTROLS_CONTROLLED_RADIO_BUTTON_M_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/controls/controlled_radio_button.m.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_CONTROLS_EXTENSION_CONTROLLED_INDICATOR_M_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/controls/extension_controlled_indicator.m.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_CONTROLS_PASSWORD_PROMPT_DIALOG_M_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/controls/password_prompt_dialog.m.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_CONTROLS_SETTINGS_BOOLEAN_CONTROL_BEHAVIOR_M_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/controls/settings_boolean_control_behavior.m.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_CONTROLS_SETTINGS_CHECKBOX_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/controls/settings_checkbox.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_CONTROLS_SETTINGS_DROPDOWN_MENU_M_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/controls/settings_dropdown_menu.m.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_CONTROLS_SETTINGS_IDLE_LOAD_JS"
-           file="controls/settings_idle_load.js"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_CONTROLS_PREF_CONTROL_BEHAVIOR_M_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/controls/pref_control_behavior.m.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_CONTROLS_SETTINGS_RADIO_GROUP_M_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/controls/settings_radio_group.m.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_CONTROLS_SETTINGS_SLIDER_M_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/controls/settings_slider.m.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_CONTROLS_SETTINGS_TEXTAREA_M_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/controls/settings_textarea.m.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_CONTROLS_SETTINGS_TOGGLE_BUTTON_M_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/controls/settings_toggle_button.m.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <if expr="not chromeos">
-    <include name="IDR_SETTINGS_DEFAULT_BROWSER_BROWSER_PROXY_JS"
-             file="default_browser_page/default_browser_browser_proxy.js"
-             type="BINDATA" />
-    <include name="IDR_SETTINGS_DEFAULT_BROWSER_PAGE_JS"
-             file="${root_gen_dir}/chrome/browser/resources/settings/default_browser_page/default_browser_page.js"
-             use_base_dir="false"
-             type="BINDATA" />
-  </if>
-  <include name="IDR_SETTINGS_DOWNLOADS_PAGE_DOWNLOADS_BROWSER_PROXY_JS"
-           file="downloads_page/downloads_browser_proxy.js"
-           type="BINDATA"
-           preprocess="true" />
-  <include name="IDR_SETTINGS_DOWNLOADS_PAGE_DOWNLOADS_PAGE_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/downloads_page/downloads_page.js"
-           use_base_dir="false"
-           type="BINDATA"
-           preprocess="true" />
-  <include name="IDR_SETTINGS_ENSURE_LAZY_LOADED_JS"
-           file="ensure_lazy_loaded.js"
-           preprocess="true"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_EXTENSION_CONTROL_BROWSER_PROXY_M_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/extension_control_browser_proxy.m.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_GLOBAL_SCROLL_TARGET_BEHAVIOR_M_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/global_scroll_target_behavior.m.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_HATS_BROWSER_PROXY_JS"
-           file="hats_browser_proxy.js"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_I18N_SETUP_JS"
-           file="i18n_setup.js"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_ICONS_M_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/icons.m.js"
-           use_base_dir="false"
-           type="BINDATA"
-           preprocess="true" />
-  <if expr="is_win and _google_chrome">
-    <include name="IDR_SETTINGS_INCOMPATIBLE_APPLICATIONS_PAGE_JS"
-             file="${root_gen_dir}/chrome/browser/resources/settings/incompatible_applications_page/incompatible_applications_page.js"
-             use_base_dir="false"
-             type="BINDATA" />
-    <include name="IDR_SETTINGS_INCOMPATIBLE_APPLICATIONS_BROWSER_PROXY_JS"
-             file="incompatible_applications_page/incompatible_applications_browser_proxy.js"
-             type="BINDATA" />
-    <include name="IDR_SETTINGS_INCOMPATIBLE_APPLICATIONS_INCOMPATIBLE_APPLICATION_ITEM_JS"
-             file="${root_gen_dir}/chrome/browser/resources/settings/incompatible_applications_page/incompatible_application_item.js"
-             use_base_dir="false"
-             type="BINDATA" />
-  </if>
-  <include name="IDR_SETTINGS_LANGUAGES_PAGE_LANGUAGES_M_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/languages_page/languages.m.js"
-           use_base_dir="false"
-           type="BINDATA"
-           preprocess="true" />
-  <include name="IDR_SETTINGS_LANGUAGES_PAGE_LANGUAGES_BROWSER_PROXY_M_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/languages_page/languages_browser_proxy.m.js"
-           use_base_dir="false"
-           type="BINDATA"
-           preprocess="true" />
-  <include name="IDR_SETTINGS_LANGUAGES_PAGE_ADD_LANGUAGES_DIALOG_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/languages_page/add_languages_dialog.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <if expr="chromeos">
-    <include name="IDR_SETTINGS_LANGUAGES_PAGE_LANGUAGES_METRICS_PROXY_JS"
-            file="languages_page/languages_metrics_proxy.js"
-            type="BINDATA" />
-  </if>
-  <include name="IDR_SETTINGS_LANGUAGES_PAGE_LANGUAGES_PAGE_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/languages_page/languages_page.js"
-           use_base_dir="false"
-           type="BINDATA"
-           preprocess="true" />
-  <if expr="not is_macosx">
-    <include name="IDR_SETTINGS_LANGUAGES_PAGE_EDIT_DICTIONARY_PAGE_JS"
-             file="${root_gen_dir}/chrome/browser/resources/settings/languages_page/edit_dictionary_page.js"
-             use_base_dir="false"
-             type="BINDATA" />
-  </if>
-  <include name="IDR_SETTINGS_LAZY_LOAD_V3_JS"
-           file="lazy_load.js"
-           type="BINDATA"
-           preprocess="true" />
-  <include name="IDR_SETTINGS_LIFETIME_BROWSER_PROXY_M_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/lifetime_browser_proxy.m.js"
-           use_base_dir="false"
-           type="BINDATA"
-           preprocess="true" />
-  <include name="IDR_SETTINGS_MENU_SETTINGS_MENU_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/settings_menu/settings_menu.js"
-           use_base_dir="false"
-           type="BINDATA"
-           preprocess="true" />
-  <include name="IDR_SETTINGS_METRICS_BROWSER_PROXY_JS"
-           file="metrics_browser_proxy.js"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_ON_STARTUP_PAGE_ON_STARTUP_BROWSER_PROXY_JS"
-           file="on_startup_page/on_startup_browser_proxy.js"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_ON_STARTUP_PAGE_ON_STARTUP_PAGE_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/on_startup_page/on_startup_page.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_ON_STARTUP_PAGE_STARTUP_URL_DIALOG_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/on_startup_page/startup_url_dialog.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_ON_STARTUP_PAGE_STARTUP_URL_ENTRY_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/on_startup_page/startup_url_entry.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_ON_STARTUP_PAGE_STARTUP_URLS_PAGE_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/on_startup_page/startup_urls_page.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_ON_STARTUP_PAGE_STARTUP_URLS_PAGE_BROWSER_PROXY_JS"
-           file="on_startup_page/startup_urls_page_browser_proxy.js"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_OPEN_WINDOW_PROXY_JS"
-           file="open_window_proxy.js"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_PAGE_VISIBILITY_JS"
-           file="page_visibility.js"
-           preprocess="true"
-           type="BINDATA" />
-  <if expr="not chromeos">
-    <include name="IDR_SETTINGS_PEOPLE_PAGE_IMPORT_DATA_DIALOG_JS"
-             file="${root_gen_dir}/chrome/browser/resources/settings/people_page/import_data_dialog.js"
-             use_base_dir="false"
-             type="BINDATA" />
-    <include name="IDR_SETTINGS_PEOPLE_PAGE_IMPORT_DATA_BROWSER_PROXY_JS"
-             file="people_page/import_data_browser_proxy.js"
-             type="BINDATA" />
-    <include name="IDR_SETTINGS_PEOPLE_PAGE_MANAGE_PROFILE_JS"
-             file="${root_gen_dir}/chrome/browser/resources/settings/people_page/manage_profile.js"
-             use_base_dir="false"
-             type="BINDATA" />
-    <include name="IDR_SETTINGS_PEOPLE_PAGE_MANAGE_PROFILE_BROWSER_PROXY_JS"
-             file="people_page/manage_profile_browser_proxy.js"
-             type="BINDATA" />
-  </if>
-  <if expr="chromeos">
-    <include name="IDR_SETTINGS_PEOPLE_PAGE_ACCOUNT_MANAGER_BROWSER_PROXY_M_JS"
-             file="${root_gen_dir}/chrome/browser/resources/settings/people_page/account_manager_browser_proxy.m.js"
-             use_base_dir="false"
-             type="BINDATA" />
-  </if>
-  <include name="IDR_SETTINGS_PEOPLE_PAGE_SYNC_ACCOUNT_CONTROL_M_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/people_page/sync_account_control.m.js"
-           use_base_dir="false"
-           preprocess="true"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_PEOPLE_PAGE_SYNC_BROWSER_PROXY_M_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/people_page/sync_browser_proxy.m.js"
-           use_base_dir="false"
-           type="BINDATA"
-           preprocess="true" />
-  <include name="IDR_SETTINGS_PEOPLE_PAGE_SYNC_ENCRYPTION_OPTIONS_M_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/people_page/sync_encryption_options.m.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_PEOPLE_PAGE_PEOPLE_PAGE_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/people_page/people_page.js"
-           use_base_dir="false"
-           preprocess="true"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_PEOPLE_PAGE_PROFILE_INFO_BROWSER_PROXY_M_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/people_page/profile_info_browser_proxy.m.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_PEOPLE_PAGE_SIGNOUT_DIALOG_M_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/people_page/signout_dialog.m.js"
-           use_base_dir="false"
-           preprocess="true"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_PEOPLE_PAGE_SYNC_CONTROLS_M_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/people_page/sync_controls.m.js"
-           use_base_dir="false"
-           preprocess="true"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_PEOPLE_PAGE_SYNC_PAGE_M_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/people_page/sync_page.m.js"
-           use_base_dir="false"
-           preprocess="true"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_PREFS_PREFS_M_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/prefs/prefs.m.js"
-           use_base_dir="false"
-           preprocess="true"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_PREFS_PREFS_BEHAVIOR_M_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/prefs/prefs_behavior.m.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_PREFS_PREFS_TYPES_M_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/prefs/prefs_types.m.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_PREFS_PREF_UTIL_M_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/prefs/pref_util.m.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_PRINTING_PAGE_CLOUD_PRINTERS_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/printing_page/cloud_printers.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_PRINTING_PAGE_PRINTING_PAGE_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/printing_page/printing_page.js"
-           use_base_dir="false"
-           preprocess="true"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_PRIVACY_PAGE_COLLAPSE_RADIO_BUTTON_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/privacy_page/collapse_radio_button.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_PRIVACY_PAGE_COOKIES_PAGE_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/privacy_page/cookies_page.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_PRIVACY_PAGE_DO_NOT_TRACK_TOGGLE_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/privacy_page/do_not_track_toggle.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_PRIVACY_PAGE_PRIVACY_PAGE_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/privacy_page/privacy_page.js"
-           use_base_dir="false"
-           preprocess="true"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_PRIVACY_PAGE_PERSONALIZATION_OPTIONS_M_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/privacy_page/personalization_options.m.js"
-           use_base_dir="false"
-           preprocess="true"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_PRIVACY_PAGE_BROWSER_PROXY_M_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/privacy_page/privacy_page_browser_proxy.m.js"
-           use_base_dir="false"
-           preprocess="true"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_PRIVACY_PAGE_SECURE_DNS_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/privacy_page/secure_dns.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_PRIVACY_PAGE_SECURE_DNS_INPUT_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/privacy_page/secure_dns_input.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_PRIVACY_PAGE_SECURITY_PAGE_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/privacy_page/security_page.js"
-           use_base_dir="false"
-           preprocess="true"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_PRIVACY_PAGE_DISABLE_SAFEBROWSING_DIALOG_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/privacy_page/disable_safebrowsing_dialog.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_PRIVACY_PAGE_SECURITY_KEYS_BIO_ENROLL_DIALOG_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/privacy_page/security_keys_bio_enroll_dialog.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_PRIVACY_PAGE_SECURITY_KEYS_BROWSER_PROXY_JS"
-           file="privacy_page/security_keys_browser_proxy.js"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_PRIVACY_PAGE_SECURITY_KEYS_CREDENTIAL_MANAGEMENT_DIALOG_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/privacy_page/security_keys_credential_management_dialog.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_PRIVACY_PAGE_SECURITY_KEYS_PIN_FIELD_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/privacy_page/security_keys_pin_field.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_PRIVACY_PAGE_SECURITY_KEYS_RESET_DIALOG_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/privacy_page/security_keys_reset_dialog.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_PRIVACY_PAGE_SECURITY_KEYS_SET_PIN_DIALOG_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/privacy_page/security_keys_set_pin_dialog.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_PRIVACY_PAGE_SECURITY_KEYS_SUBPAGE_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/privacy_page/security_keys_subpage.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_RESET_PAGE_RESET_PAGE_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/reset_page/reset_page.js"
-           use_base_dir="false"
-           preprocess="true"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_RESET_PAGE_RESET_PROFILE_DIALOG_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/reset_page/reset_profile_dialog.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_RESET_PAGE_RESET_PROFILE_BANNER_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/reset_page/reset_profile_banner.js"
-           use_base_dir="false"
-           type="BINDATA"/>
-  <include name="IDR_SETTINGS_RESET_PAGE_RESET_BROWSER_PROXY_JS"
-           file="reset_page/reset_browser_proxy.js"
-           preprocess="true"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_ROUTE_JS"
-           file="route.js"
-           preprocess="true"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_ROUTER_M_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/router.m.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_SAFETY_CHECK_PAGE_SAFETY_CHECK_BROWSER_PROXY_JS"
-           file="safety_check_page/safety_check_browser_proxy.js"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_SAFETY_CHECK_PAGE_SAFETY_CHECK_CHILD_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/safety_check_page/safety_check_child.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <if expr="is_win">
-    <include name="IDR_SETTINGS_SAFETY_CHECK_PAGE_SAFETY_CHECK_CHROME_CLEANER_CHILD_JS"
-             file="${root_gen_dir}/chrome/browser/resources/settings/safety_check_page/safety_check_chrome_cleaner_child.js"
-             use_base_dir="false"
-             type="BINDATA" />
-  </if>
-  <include name="IDR_SETTINGS_SAFETY_CHECK_PAGE_SAFETY_CHECK_EXTENSIONS_CHILD_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/safety_check_page/safety_check_extensions_child.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_SAFETY_CHECK_PAGE_SAFETY_CHECK_PAGE_JS"
-           preprocess="true"
-           file="${root_gen_dir}/chrome/browser/resources/settings/safety_check_page/safety_check_page.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_SAFETY_CHECK_PAGE_SAFETY_CHECK_PASSWORDS_CHILD_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/safety_check_page/safety_check_passwords_child.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_SAFETY_CHECK_PAGE_SAFETY_CHECK_SAFE_BROWSING_CHILD_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/safety_check_page/safety_check_safe_browsing_child.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_SAFETY_CHECK_PAGE_SAFETY_CHECK_UPDATES_CHILD_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/safety_check_page/safety_check_updates_child.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_SEARCH_ENGINES_BROWSER_PROXY_M_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/search_engines_page/search_engines_browser_proxy.m.js"
-           use_base_dir="false"
-           type="BINDATA"
-           preprocess="true" />
-  <include name="IDR_SETTINGS_SEARCH_ENGINES_PAGE_OMNIBOX_EXTENSION_ENTRY_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/search_engines_page/omnibox_extension_entry.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_SEARCH_ENGINES_PAGE_SEARCH_ENGINE_DIALOG_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/search_engines_page/search_engine_dialog.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_SEARCH_ENGINES_PAGE_SEARCH_ENGINE_ENTRY_CSS_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/search_engines_page/search_engine_entry_css.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_SEARCH_ENGINES_PAGE_SEARCH_ENGINE_ENTRY_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/search_engines_page/search_engine_entry.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_SEARCH_ENGINES_PAGE_SEARCH_ENGINES_LIST_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/search_engines_page/search_engines_list.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_SEARCH_ENGINES_PAGE_SEARCH_ENGINES_PAGE_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/search_engines_page/search_engines_page.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_SEARCH_PAGE_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/search_page/search_page.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_SEARCH_SETTINGS_M_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/search_settings.m.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_SETTINGS_MAIN_SETTINGS_MAIN_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/settings_main/settings_main.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_SETTINGS_PAGE_MAIN_PAGE_BEHAVIOR_JS"
-           file="settings_page/main_page_behavior.js"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_SETTINGS_PAGE_SETTINGS_ANIMATED_PAGES_M_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/settings_page/settings_animated_pages.m.js"
-           use_base_dir="false"
-           preprocess="true"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_SETTINGS_PAGE_SETTINGS_SECTION_M_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/settings_page/settings_section.m.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_SETTINGS_PAGE_SETTINGS_SUBPAGE_M_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/settings_page/settings_subpage.m.js"
-           use_base_dir="false"
-           type="BINDATA"
-           preprocess="true" />
-  <include name="IDR_SETTINGS_SETTINGS_UI_SETTINGS_UI_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/settings_ui/settings_ui.js"
-           use_base_dir="false"
-           type="BINDATA"
-           preprocess="true" />
-  <include name="IDR_SETTINGS_SETTING_ID_PARAM_UTIL_M_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/setting_id_param_util.m.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_SETTINGS_ROUTES_JS"
-           file="settings_routes.js"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_SETTINGS_PAGE_CSS_M_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/settings_page_css.m.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_SETTINGS_SHARED_CSS_M_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/settings_shared_css.m.js"
-           use_base_dir="false"
-           type="BINDATA"
-           preprocess="true" />
-  <include name="IDR_SETTINGS_SETTINGS_VARS_CSS_M_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/settings_vars_css.m.js"
-           use_base_dir="false"
-           type="BINDATA"
-           preprocess="true" />
-  <include name="IDR_SETTINGS_SETTINGS_V3_HTML"
-           file="settings_v3.html"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_SETTINGS_V3_JS"
-           file="settings.js"
-           type="BINDATA"
-           preprocess="true" />
-  <include name="IDR_SETTINGS_SITE_FAVICON_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/site_favicon.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_SITE_SETTINGS_ADD_SITE_DIALOG_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/site_settings/add_site_dialog.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_SITE_SETTINGS_ALL_SITES_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/site_settings/all_sites.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_SITE_SETTINGS_ALL_SITES_ICONS_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/site_settings/all_sites_icons.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <if expr="chromeos">
-    <include name="IDR_SETTINGS_SITE_SETTINGS_ANDROID_INFO_BROWSER_PROXY_JS"
-             file="site_settings/android_info_browser_proxy.js"
-             type="BINDATA" />
-  </if>
-  <include name="IDR_SETTINGS_SITE_SETTINGS_CATEGORY_DEFAULT_SETTING_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/site_settings/category_default_setting.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_SITE_SETTINGS_CATEGORY_SETTING_EXCEPTIONS_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/site_settings/category_setting_exceptions.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_SITE_SETTINGS_CHOOSER_EXCEPTION_LIST_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/site_settings/chooser_exception_list.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_SITE_SETTINGS_CHOOSER_EXCEPTION_LIST_ENTRY_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/site_settings/chooser_exception_list_entry.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_SITE_SETTINGS_CLEAR_STORAGE_DIALOG_CSS_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/site_settings/clear_storage_dialog_css.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_SITE_SETTINGS_CONSTANTS_JS"
-           file="site_settings/constants.js"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_SITE_SETTINGS_COOKIE_INFO_JS"
-           file="site_settings/cookie_info.js"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_SITE_SETTINGS_EDIT_EXCEPTION_DIALOG_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/site_settings/edit_exception_dialog.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_SITE_SETTINGS_LOCAL_DATA_BROWSER_PROXY_JS"
-           file="site_settings/local_data_browser_proxy.js"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_SITE_SETTINGS_MEDIA_PICKER_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/site_settings/media_picker.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_SITE_SETTINGS_PDF_DOCUMENTS_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/site_settings/pdf_documents.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_SITE_SETTINGS_PROTOCOL_HANDLERS_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/site_settings/protocol_handlers.js"
-           use_base_dir="false"
-           type="BINDATA"
-           preprocess="true" />
-  <include name="IDR_SETTINGS_SITE_SETTINGS_SETTINGS_CATEGORY_DEFAULT_RADIO_GROUP_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/site_settings/settings_category_default_radio_group.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_SITE_SETTINGS_SITE_DATA_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/site_settings/site_data.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_SITE_SETTINGS_SITE_DATA_DETAILS_SUBPAGE_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/site_settings/site_data_details_subpage.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_SITE_SETTINGS_SITE_DATA_ENTRY_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/site_settings/site_data_entry.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_SITE_SETTINGS_SITE_DETAILS_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/site_settings/site_details.js"
-           use_base_dir="false"
-           type="BINDATA"
-           preprocess="true" />
-  <include name="IDR_SETTINGS_SITE_SETTINGS_SITE_DETAILS_PERMISSION_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/site_settings/site_details_permission.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_SITE_SETTINGS_SITE_ENTRY_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/site_settings/site_entry.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_SITE_SETTINGS_SITE_LIST_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/site_settings/site_list.js"
-           use_base_dir="false"
-           type="BINDATA"
-           preprocess="true" />
-  <include name="IDR_SETTINGS_SITE_SETTINGS_SITE_LIST_ENTRY_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/site_settings/site_list_entry.js"
-           use_base_dir="false"
-           type="BINDATA"
-           preprocess="true" />
-  <include name="IDR_SETTINGS_SITE_SETTINGS_SITE_SETTINGS_BEHAVIOR_JS"
-           file="site_settings/site_settings_behavior.js"
-           type="BINDATA"
-           preprocess="true" />
-  <include name="IDR_SETTINGS_SITE_SETTINGS_SITE_SETTINGS_PREFS_BROWSER_PROXY_JS"
-           file="site_settings/site_settings_prefs_browser_proxy.js"
-           type="BINDATA"
-           preprocess="true" />
-  <include name="IDR_SETTINGS_SITE_SETTINGS_WEBSITE_USAGE_BROWSER_PROXY_JS"
-           file="site_settings/website_usage_browser_proxy.js"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_SITE_SETTINGS_ZOOM_LEVELS_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/site_settings/zoom_levels.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_SITE_SETTINGS_PAGE_RECENT_SITE_PERMISSIONS_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/site_settings_page/recent_site_permissions.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_SITE_SETTINGS_PAGE_SITE_SETTINGS_LIST_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/site_settings_page/site_settings_list.js"
-           use_base_dir="false"
-           type="BINDATA" />
-  <include name="IDR_SETTINGS_SITE_SETTINGS_PAGE_SITE_SETTINGS_PAGE_JS"
-           file="${root_gen_dir}/chrome/browser/resources/settings/site_settings_page/site_settings_page.js"
-           use_base_dir="false"
-           type="BINDATA"
-           preprocess="true" />
-  <if expr="not chromeos">
-    <include name="IDR_SETTINGS_PRINTING_PAGE_PRINTING_BROWSER_PROXY_JS"
-             file="printing_page/printing_browser_proxy.js"
-             type="BINDATA" />
-    <include name="IDR_SETTINGS_SYSTEM_PAGE_BROWSER_PROXY_JS"
-             file="system_page/system_page_browser_proxy.js"
-             type="BINDATA" />
-    <include name="IDR_SETTINGS_SYSTEM_PAGE_JS"
-             file="${root_gen_dir}/chrome/browser/resources/settings/system_page/system_page.js"
-             use_base_dir="false"
-             type="BINDATA"
-             preprocess="true" />
-  </if>
-</grit-part>
diff --git a/chrome/browser/sessions/chrome_serialized_navigation_driver.cc b/chrome/browser/sessions/chrome_serialized_navigation_driver.cc
index 32da45ba..5bf2c79 100644
--- a/chrome/browser/sessions/chrome_serialized_navigation_driver.cc
+++ b/chrome/browser/sessions/chrome_serialized_navigation_driver.cc
@@ -12,7 +12,7 @@
 
 #if defined(OS_ANDROID)
 #include "content/public/common/content_features.h"
-#include "content/public/common/page_state.h"
+#include "third_party/blink/public/common/page_state/page_state.h"
 #endif
 
 namespace {
@@ -25,7 +25,7 @@
   navigation->set_virtual_url(new_destination_url);
   navigation->set_original_request_url(new_destination_url);
   navigation->set_encoded_page_state(
-      content::PageState::CreateFromURL(new_destination_url).ToEncodedData());
+      blink::PageState::CreateFromURL(new_destination_url).ToEncodedData());
 
   // Make sure the referrer stored in the PageState (above) and in the
   // SerializedNavigationEntry (below) are in-sync.
diff --git a/chrome/browser/sessions/chrome_serialized_navigation_driver_unittest.cc b/chrome/browser/sessions/chrome_serialized_navigation_driver_unittest.cc
index cf814b5..66344ed9 100644
--- a/chrome/browser/sessions/chrome_serialized_navigation_driver_unittest.cc
+++ b/chrome/browser/sessions/chrome_serialized_navigation_driver_unittest.cc
@@ -5,9 +5,9 @@
 #include "chrome/browser/sessions/chrome_serialized_navigation_driver.h"
 
 #include "components/sessions/core/serialized_navigation_entry_test_helper.h"
-#include "content/public/common/page_state.h"
 #include "services/network/public/mojom/referrer_policy.mojom.h"
 #include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/blink/public/common/page_state/page_state.h"
 #include "ui/base/page_transition_types.h"
 
 class ChromeSerializedNavigationDriverTest : public ::testing::Test {
@@ -38,8 +38,8 @@
   sessions::SerializedNavigationEntryTestHelper::SetReferrerPolicy(
       static_cast<int>(network::mojom::ReferrerPolicy::kAlways), &navigation);
 
-  content::PageState page_state =
-      content::PageState::CreateFromURL(sessions::test_data::VirtualUrl());
+  blink::PageState page_state =
+      blink::PageState::CreateFromURL(sessions::test_data::VirtualUrl());
   sessions::SerializedNavigationEntryTestHelper::SetEncodedPageState(
       page_state.ToEncodedData(), &navigation);
 
@@ -76,8 +76,8 @@
   sessions::SerializedNavigationEntryTestHelper::SetReferrerPolicy(
       static_cast<int>(network::mojom::ReferrerPolicy::kNever), &navigation);
 
-  content::PageState page_state =
-      content::PageState::CreateFromURL(sessions::test_data::VirtualUrl());
+  blink::PageState page_state =
+      blink::PageState::CreateFromURL(sessions::test_data::VirtualUrl());
   sessions::SerializedNavigationEntryTestHelper::SetEncodedPageState(
       page_state.ToEncodedData(), &navigation);
 
diff --git a/chrome/browser/sessions/session_restore.cc b/chrome/browser/sessions/session_restore.cc
index 24b84d2..8c926ec 100644
--- a/chrome/browser/sessions/session_restore.cc
+++ b/chrome/browser/sessions/session_restore.cc
@@ -67,7 +67,6 @@
 #include "content/public/browser/session_storage_namespace.h"
 #include "content/public/browser/storage_partition.h"
 #include "content/public/browser/web_contents.h"
-#include "content/public/common/page_state.h"
 #include "extensions/browser/extension_registry.h"
 #include "extensions/common/extension_set.h"
 
diff --git a/chrome/browser/sessions/session_service_unittest.cc b/chrome/browser/sessions/session_service_unittest.cc
index a17630a..ca21500 100644
--- a/chrome/browser/sessions/session_service_unittest.cc
+++ b/chrome/browser/sessions/session_service_unittest.cc
@@ -44,9 +44,9 @@
 #include "components/tab_groups/tab_group_visual_data.h"
 #include "content/public/browser/navigation_entry.h"
 #include "content/public/browser/web_contents.h"
-#include "content/public/common/page_state.h"
 #include "content/public/test/web_contents_tester.h"
 #include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/blink/public/common/page_state/page_state.h"
 #include "third_party/blink/public/common/user_agent/user_agent_metadata.h"
 #include "third_party/skia/include/core/SkColor.h"
 
@@ -975,8 +975,8 @@
   ASSERT_NE(window_id, tab_id);
 
   // Create a page state representing a HTTP body with posted passwords.
-  content::PageState page_state =
-      content::PageState::CreateForTesting(GURL(), true, "data", nullptr);
+  blink::PageState page_state =
+      blink::PageState::CreateForTesting(GURL(), true, "data", nullptr);
 
   // Create a TabNavigation containing page_state and representing a POST
   // request with passwords.
diff --git a/chrome/browser/ssl/ssl_browsertest.cc b/chrome/browser/ssl/ssl_browsertest.cc
index 1e4953b..4d3e151 100644
--- a/chrome/browser/ssl/ssl_browsertest.cc
+++ b/chrome/browser/ssl/ssl_browsertest.cc
@@ -140,7 +140,6 @@
 #include "content/public/common/content_client.h"
 #include "content/public/common/content_switches.h"
 #include "content/public/common/network_service_util.h"
-#include "content/public/common/page_state.h"
 #include "content/public/common/url_constants.h"
 #include "content/public/test/browser_test.h"
 #include "content/public/test/browser_test_utils.h"
@@ -189,6 +188,7 @@
 #include "services/network/public/mojom/network_service.mojom.h"
 #include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h"
 #include "third_party/blink/public/common/features.h"
+#include "third_party/blink/public/common/page_state/page_state.h"
 #include "third_party/blink/public/common/web_preferences/web_preferences.h"
 #include "ui/base/l10n/l10n_util.h"
 
diff --git a/chrome/browser/subresource_filter/chrome_subresource_filter_client.cc b/chrome/browser/subresource_filter/chrome_subresource_filter_client.cc
index 3a2a507..ede8ac8 100644
--- a/chrome/browser/subresource_filter/chrome_subresource_filter_client.cc
+++ b/chrome/browser/subresource_filter/chrome_subresource_filter_client.cc
@@ -86,6 +86,10 @@
 }
 
 void ChromeSubresourceFilterClient::OnReloadRequested() {
+  // TODO(crbug.com/1116095): Once ContentSubresourceFilterThrottleManager knows
+  // about content settings, this method can move entirely into
+  // ContentSubresourceFilterThrottleManager::OnReloadRequested() and
+  // SubresourceFilterClient::OnReloadRequested() can be eliminated.
   subresource_filter::ContentSubresourceFilterThrottleManager::LogAction(
       subresource_filter::SubresourceFilterAction::kAllowlistedSite);
   AllowlistByContentSettings(web_contents()->GetLastCommittedURL());
diff --git a/chrome/browser/subresource_filter/chrome_subresource_filter_client.h b/chrome/browser/subresource_filter/chrome_subresource_filter_client.h
index 36b6833c..47a5ba9 100644
--- a/chrome/browser/subresource_filter/chrome_subresource_filter_client.h
+++ b/chrome/browser/subresource_filter/chrome_subresource_filter_client.h
@@ -46,8 +46,6 @@
   static ChromeSubresourceFilterClient* FromWebContents(
       content::WebContents* web_contents);
 
-  void OnReloadRequested();
-
   // content::WebContentsObserver:
   void DidStartNavigation(
       content::NavigationHandle* navigation_handle) override;
@@ -63,6 +61,7 @@
       subresource_filter::mojom::AdsViolation triggered_violation) override;
   const scoped_refptr<safe_browsing::SafeBrowsingDatabaseManager>
   GetSafeBrowsingDatabaseManager() override;
+  void OnReloadRequested() override;
 
   // Should be called by devtools in response to a protocol command to enable ad
   // blocking in this WebContents. Should only persist while devtools is
diff --git a/chrome/browser/sync/sync_encryption_keys_tab_helper.cc b/chrome/browser/sync/sync_encryption_keys_tab_helper.cc
index 3f674ee..1eb47ef 100644
--- a/chrome/browser/sync/sync_encryption_keys_tab_helper.cc
+++ b/chrome/browser/sync/sync_encryption_keys_tab_helper.cc
@@ -8,11 +8,13 @@
 #include <utility>
 #include <vector>
 
+#include "base/feature_list.h"
 #include "base/memory/ptr_util.h"
 #include "base/no_destructor.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/sync/profile_sync_service_factory.h"
 #include "chrome/common/sync_encryption_keys_extension.mojom.h"
+#include "components/sync/driver/sync_driver_switches.h"
 #include "components/sync/driver/sync_service.h"
 #include "content/public/browser/navigation_handle.h"
 #include "content/public/browser/web_contents.h"
@@ -58,14 +60,40 @@
       const std::vector<std::vector<uint8_t>>& encryption_keys,
       int last_key_version,
       SetEncryptionKeysCallback callback) override {
-    CHECK_EQ(receivers_.GetCurrentTargetFrame()->GetLastCommittedOrigin(),
-             GetAllowedOrigin());
+    // This could instead be a CHECK because it's guaranteed by the logic in
+    // DidFinishNavigation(), but let's avoid browser crashes at all cost and
+    // simply ignore the call.
+    if (receivers_.GetCurrentTargetFrame()->GetLastCommittedOrigin() !=
+        GetAllowedOrigin()) {
+      return;
+    }
 
     sync_service_->AddTrustedVaultDecryptionKeysFromWeb(
         gaia_id, encryption_keys, last_key_version);
     std::move(callback).Run();
   }
 
+  void AddTrustedRecoveryMethod(
+      const std::string& gaia_id,
+      const std::vector<uint8_t>& public_key,
+      AddTrustedRecoveryMethodCallback callback) override {
+    if (!base::FeatureList::IsEnabled(
+            switches::kSyncSupportTrustedVaultPassphraseRecovery)) {
+      return;
+    }
+
+    // This could instead be a CHECK because it's guaranteed by the logic in
+    // DidFinishNavigation(), but let's avoid browser crashes at all cost and
+    // simply ignore the call.
+    if (receivers_.GetCurrentTargetFrame()->GetLastCommittedOrigin() !=
+        GetAllowedOrigin()) {
+      return;
+    }
+
+    sync_service_->AddTrustedVaultRecoveryMethodFromWeb(gaia_id, public_key,
+                                                        std::move(callback));
+  }
+
  private:
   syncer::SyncService* const sync_service_;
 
diff --git a/chrome/browser/sync/test/integration/single_client_nigori_sync_test.cc b/chrome/browser/sync/test/integration/single_client_nigori_sync_test.cc
index 87c5e970..006b548 100644
--- a/chrome/browser/sync/test/integration/single_client_nigori_sync_test.cc
+++ b/chrome/browser/sync/test/integration/single_client_nigori_sync_test.cc
@@ -101,6 +101,12 @@
                          base64_encoded_key.c_str()));
 }
 
+GURL GetTrustedVaultRecoverabilityURL(
+    const net::test_server::EmbeddedTestServer& test_server) {
+  return test_server.GetURL(base::StringPrintf(
+      "/sync/encryption_keys_recoverability.html?%s", kGaiaId));
+}
+
 std::string ComputeKeyName(const KeyParamsForTesting& key_params) {
   std::string key_name;
   syncer::Nigori::CreateByDerivation(key_params.derivation_params,
@@ -929,9 +935,10 @@
                   ->IsTrustedVaultKeyRequiredForPreferredDataTypes());
 }
 
-class SingleClientNigoriWithRecoverySyncTest : public SyncTest {
+class SingleClientNigoriWithRecoverySyncTest
+    : public SingleClientNigoriWithWebApiTest {
  public:
-  SingleClientNigoriWithRecoverySyncTest() : SyncTest(SINGLE_CLIENT) {
+  SingleClientNigoriWithRecoverySyncTest() {
     override_features_.InitAndEnableFeature(
         switches::kSyncSupportTrustedVaultPassphraseRecovery);
   }
@@ -948,6 +955,9 @@
                        ShouldReportDegradedTrustedVaultRecoverability) {
   const std::vector<uint8_t> kTestEncryptionKey = {1, 2, 3, 4};
 
+  const GURL recoverability_url =
+      GetTrustedVaultRecoverabilityURL(*embedded_test_server());
+
   // Mimic the account being already using a trusted vault passphrase.
   SetNigoriInFakeServer(BuildTrustedVaultNigoriSpecifics({kTestEncryptionKey}),
                         GetFakeServer());
@@ -979,10 +989,16 @@
                         IDS_SETTINGS_EMPTY_STRING, sync_ui_util::NO_ACTION));
 
   // Mimic opening a web page where the user can interact with the degraded
-  // recoverability flow.
-  static_cast<syncer::StandaloneTrustedVaultClient*>(
-      GetSyncService(0)->GetSyncClientForTest()->GetTrustedVaultClient())
-      ->ResolveRecoverabilityDegradedForTesting();
+  // recoverability flow. Before that, there needs to be an existing tab for the
+  // second tab to be closeable via javascript.
+  chrome::AddTabAt(GetBrowser(0), GURL(url::kAboutBlankURL), /*index=*/0,
+                   /*foreground=*/true);
+  // TODO(crbug.com/1081649): This should use a dedicated page, instead of the
+  // retrieval page.
+  sync_ui_util::OpenTabForSyncKeyRetrievalWithURLForTesting(GetBrowser(0),
+                                                            recoverability_url);
+  ASSERT_THAT(GetBrowser(0)->tab_strip_model()->GetActiveWebContents(),
+              NotNull());
 
   EXPECT_TRUE(
       TrustedVaultRecoverabilityNotDegradedChecker(GetSyncService(0)).Wait());
diff --git a/chrome/browser/sync/test/integration/single_client_sync_invalidations_test.cc b/chrome/browser/sync/test/integration/single_client_sync_invalidations_test.cc
new file mode 100644
index 0000000..3aab7e9
--- /dev/null
+++ b/chrome/browser/sync/test/integration/single_client_sync_invalidations_test.cc
@@ -0,0 +1,196 @@
+// Copyright 2020 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 "base/test/scoped_feature_list.h"
+#include "chrome/browser/sync/sync_invalidations_service_factory.h"
+#include "chrome/browser/sync/test/integration/device_info_helper.h"
+#include "chrome/browser/sync/test/integration/sync_test.h"
+#include "components/sync/base/model_type.h"
+#include "components/sync/invalidations/switches.h"
+#include "components/sync/invalidations/sync_invalidations_service.h"
+#include "components/sync/protocol/sync.pb.h"
+#include "content/public/test/browser_test.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace {
+
+using testing::AllOf;
+using testing::ElementsAre;
+using testing::Not;
+using testing::NotNull;
+
+MATCHER_P(HasInterestedDataTypes, expected_data_types, "") {
+  syncer::ModelTypeSet data_types;
+  for (const int field_number : arg.specifics()
+                                    .device_info()
+                                    .invalidation_fields()
+                                    .interested_data_type_ids()) {
+    syncer::ModelType data_type =
+        syncer::GetModelTypeFromSpecificsFieldNumber(field_number);
+    if (!syncer::IsRealDataType(data_type)) {
+      return false;
+    }
+    data_types.Put(data_type);
+  }
+  return data_types == expected_data_types;
+}
+
+MATCHER(HasInstanceIdToken, "") {
+  return arg.specifics()
+      .device_info()
+      .invalidation_fields()
+      .has_instance_id_token();
+}
+
+MATCHER_P(HasInstanceIdToken, expected_token, "") {
+  return arg.specifics()
+             .device_info()
+             .invalidation_fields()
+             .instance_id_token() == expected_token;
+}
+
+class SingleClientWithSyncSendInterestedDataTypesTest : public SyncTest {
+ public:
+  SingleClientWithSyncSendInterestedDataTypesTest() : SyncTest(SINGLE_CLIENT) {
+    override_features_.InitWithFeatures(
+        /*enabled_features=*/{switches::kSyncSendInterestedDataTypes},
+        /*disabled_features=*/{
+            switches::kUseSyncInvalidations,
+            switches::kUseSyncInvalidationsForWalletAndOffer});
+  }
+  ~SingleClientWithSyncSendInterestedDataTypesTest() override = default;
+
+ private:
+  base::test::ScopedFeatureList override_features_;
+
+  DISALLOW_COPY_AND_ASSIGN(SingleClientWithSyncSendInterestedDataTypesTest);
+};
+
+IN_PROC_BROWSER_TEST_F(SingleClientWithSyncSendInterestedDataTypesTest,
+                       SendInterestedDataTypesAsPartOfDeviceInfo) {
+  ASSERT_TRUE(SetupSync());
+
+  syncer::SyncInvalidationsService* sync_invalidations_service =
+      SyncInvalidationsServiceFactory::GetForProfile(GetProfile(0));
+  ASSERT_THAT(sync_invalidations_service, NotNull());
+  syncer::ModelTypeSet interested_data_types =
+      sync_invalidations_service->GetInterestedDataTypes();
+
+  // Check that some "standard" data types are included.
+  EXPECT_TRUE(
+      interested_data_types.HasAll({syncer::NIGORI, syncer::BOOKMARKS}));
+  // Wallet and Offer data types are excluded unless
+  // kUseSyncInvalidationsForWalletAndOffer is also enabled.
+  EXPECT_FALSE(interested_data_types.Has(syncer::AUTOFILL_WALLET_DATA));
+  EXPECT_FALSE(interested_data_types.Has(syncer::AUTOFILL_WALLET_OFFER));
+
+  // The local device should eventually be committed to the server.
+  // The InstanceID token should only be uploaded if kUseSyncInvalidations is
+  // also enabled.
+  EXPECT_TRUE(
+      ServerDeviceInfoMatchChecker(
+          GetFakeServer(),
+          ElementsAre(AllOf(HasInterestedDataTypes(interested_data_types),
+                            Not(HasInstanceIdToken()))))
+          .Wait());
+}
+
+class SingleClientWithUseSyncInvalidationsTest : public SyncTest {
+ public:
+  SingleClientWithUseSyncInvalidationsTest() : SyncTest(SINGLE_CLIENT) {
+    override_features_.InitWithFeatures(
+        /*enabled_features=*/{switches::kSyncSendInterestedDataTypes,
+                              switches::kUseSyncInvalidations},
+        /*disabled_features=*/{
+            switches::kUseSyncInvalidationsForWalletAndOffer});
+  }
+  ~SingleClientWithUseSyncInvalidationsTest() override = default;
+
+ private:
+  base::test::ScopedFeatureList override_features_;
+
+  DISALLOW_COPY_AND_ASSIGN(SingleClientWithUseSyncInvalidationsTest);
+};
+
+IN_PROC_BROWSER_TEST_F(SingleClientWithUseSyncInvalidationsTest,
+                       SendInterestedDataTypesAndFCMTokenAsPartOfDeviceInfo) {
+  ASSERT_TRUE(SetupSync());
+
+  syncer::SyncInvalidationsService* sync_invalidations_service =
+      SyncInvalidationsServiceFactory::GetForProfile(GetProfile(0));
+  ASSERT_THAT(sync_invalidations_service, NotNull());
+  syncer::ModelTypeSet interested_data_types =
+      sync_invalidations_service->GetInterestedDataTypes();
+  std::string fcm_token = sync_invalidations_service->GetFCMRegistrationToken();
+
+  // Check that some "standard" data types are included.
+  EXPECT_TRUE(
+      interested_data_types.HasAll({syncer::NIGORI, syncer::BOOKMARKS}));
+  // Wallet and Offer data types are excluded unless
+  // kUseSyncInvalidationsForWalletAndOffer is also enabled.
+  EXPECT_FALSE(interested_data_types.Has(syncer::AUTOFILL_WALLET_DATA));
+  EXPECT_FALSE(interested_data_types.Has(syncer::AUTOFILL_WALLET_OFFER));
+  EXPECT_FALSE(fcm_token.empty());
+
+  // The local device should eventually be committed to the server.
+  EXPECT_TRUE(
+      ServerDeviceInfoMatchChecker(
+          GetFakeServer(),
+          ElementsAre(AllOf(HasInterestedDataTypes(interested_data_types),
+                            HasInstanceIdToken(fcm_token))))
+          .Wait());
+}
+
+class SingleClientWithUseSyncInvalidationsForWalletAndOfferTest
+    : public SyncTest {
+ public:
+  SingleClientWithUseSyncInvalidationsForWalletAndOfferTest()
+      : SyncTest(SINGLE_CLIENT) {
+    override_features_.InitWithFeatures(
+        /*enabled_features=*/{switches::kSyncSendInterestedDataTypes,
+                              switches::kUseSyncInvalidations,
+                              switches::kUseSyncInvalidationsForWalletAndOffer},
+        /*disabled_features=*/{});
+  }
+  ~SingleClientWithUseSyncInvalidationsForWalletAndOfferTest() override =
+      default;
+
+ private:
+  base::test::ScopedFeatureList override_features_;
+
+  DISALLOW_COPY_AND_ASSIGN(
+      SingleClientWithUseSyncInvalidationsForWalletAndOfferTest);
+};
+
+IN_PROC_BROWSER_TEST_F(
+    SingleClientWithUseSyncInvalidationsForWalletAndOfferTest,
+    SendInterestedDataTypesAndFCMTokenAsPartOfDeviceInfo) {
+  ASSERT_TRUE(SetupSync());
+
+  syncer::SyncInvalidationsService* sync_invalidations_service =
+      SyncInvalidationsServiceFactory::GetForProfile(GetProfile(0));
+  ASSERT_THAT(sync_invalidations_service, NotNull());
+  syncer::ModelTypeSet interested_data_types =
+      sync_invalidations_service->GetInterestedDataTypes();
+  std::string fcm_token = sync_invalidations_service->GetFCMRegistrationToken();
+
+  // Check that some "standard" data types are included.
+  EXPECT_TRUE(
+      interested_data_types.HasAll({syncer::NIGORI, syncer::BOOKMARKS}));
+  // Wallet data type should be included by default if
+  // kUseSyncInvalidationsForWalletAndOffer is enabled.
+  EXPECT_TRUE(interested_data_types.Has(syncer::AUTOFILL_WALLET_DATA));
+  EXPECT_FALSE(fcm_token.empty());
+
+  // The local device should eventually be committed to the server.
+  EXPECT_TRUE(
+      ServerDeviceInfoMatchChecker(
+          GetFakeServer(),
+          ElementsAre(AllOf(HasInterestedDataTypes(interested_data_types),
+                            HasInstanceIdToken(fcm_token))))
+          .Wait());
+}
+
+}  // namespace
diff --git a/chrome/browser/sync/test/integration/single_client_web_apps_bmo_sync_test.cc b/chrome/browser/sync/test/integration/single_client_web_apps_sync_test.cc
similarity index 82%
rename from chrome/browser/sync/test/integration/single_client_web_apps_bmo_sync_test.cc
rename to chrome/browser/sync/test/integration/single_client_web_apps_sync_test.cc
index 4885b67..c4ba770 100644
--- a/chrome/browser/sync/test/integration/single_client_web_apps_bmo_sync_test.cc
+++ b/chrome/browser/sync/test/integration/single_client_web_apps_sync_test.cc
@@ -25,14 +25,13 @@
 // These tests test the new Web Apps system with next generation sync.
 //
 // Chrome OS syncs apps as an OS type.
-class SingleClientWebAppsBmoOsSyncTest : public OsSyncTest {
+class SingleClientWebAppsOsSyncTest : public OsSyncTest {
  public:
-  SingleClientWebAppsBmoOsSyncTest() : OsSyncTest(SINGLE_CLIENT) {
-  }
-  ~SingleClientWebAppsBmoOsSyncTest() override = default;
+  SingleClientWebAppsOsSyncTest() : OsSyncTest(SINGLE_CLIENT) {}
+  ~SingleClientWebAppsOsSyncTest() override = default;
 };
 
-IN_PROC_BROWSER_TEST_F(SingleClientWebAppsBmoOsSyncTest,
+IN_PROC_BROWSER_TEST_F(SingleClientWebAppsOsSyncTest,
                        DisablingOsSyncFeatureDisablesDataType) {
   ASSERT_TRUE(chromeos::features::IsSplitSettingsSyncEnabled());
   ASSERT_TRUE(SetupSync());
@@ -50,14 +49,13 @@
 #else   // !defined(OS_CHROMEOS)
 
 // These tests test the new Web Apps system with next generation sync.
-class SingleClientWebAppsBmoSyncTest : public SyncTest {
+class SingleClientWebAppsSyncTest : public SyncTest {
  public:
-  SingleClientWebAppsBmoSyncTest() : SyncTest(SINGLE_CLIENT) {
-  }
-  ~SingleClientWebAppsBmoSyncTest() override = default;
+  SingleClientWebAppsSyncTest() : SyncTest(SINGLE_CLIENT) {}
+  ~SingleClientWebAppsSyncTest() override = default;
 };
 
-IN_PROC_BROWSER_TEST_F(SingleClientWebAppsBmoSyncTest,
+IN_PROC_BROWSER_TEST_F(SingleClientWebAppsSyncTest,
                        DisablingSelectedTypeDisablesModelType) {
   ASSERT_TRUE(SetupSync());
   syncer::ProfileSyncService* service = GetSyncService(0);
diff --git a/chrome/browser/sync/test/integration/sync_test.cc b/chrome/browser/sync/test/integration/sync_test.cc
index b87152d..281fc9e 100644
--- a/chrome/browser/sync/test/integration/sync_test.cc
+++ b/chrome/browser/sync/test/integration/sync_test.cc
@@ -216,6 +216,16 @@
 
 }  // namespace
 
+void SyncTest::FakeInstanceID::GetToken(
+    const std::string& authorized_entity,
+    const std::string& scope,
+    base::TimeDelta time_to_live,
+    const std::map<std::string, std::string>& options,
+    std::set<Flags> flags,
+    GetTokenCallback callback) {
+  std::move(callback).Run("token", instance_id::InstanceID::Result::SUCCESS);
+}
+
 instance_id::InstanceID* SyncTest::FakeInstanceIDDriver::GetInstanceID(
     const std::string& app_id) {
   return &fake_instance_id_;
diff --git a/chrome/browser/sync/test/integration/sync_test.h b/chrome/browser/sync/test/integration/sync_test.h
index 3e1a0ff..4d59f59 100644
--- a/chrome/browser/sync/test/integration/sync_test.h
+++ b/chrome/browser/sync/test/integration/sync_test.h
@@ -117,7 +117,7 @@
                   base::TimeDelta time_to_live,
                   const std::map<std::string, std::string>& options,
                   std::set<Flags> flags,
-                  GetTokenCallback callback) override {}
+                  GetTokenCallback callback) override;
 
     void ValidateToken(const std::string& authorized_entity,
                        const std::string& scope,
diff --git a/chrome/browser/sync/test/integration/two_client_extensions_sync_test.cc b/chrome/browser/sync/test/integration/two_client_extensions_sync_test.cc
index 46182239..7a3a7c4 100644
--- a/chrome/browser/sync/test/integration/two_client_extensions_sync_test.cc
+++ b/chrome/browser/sync/test/integration/two_client_extensions_sync_test.cc
@@ -39,13 +39,6 @@
   ASSERT_TRUE(ExtensionsMatchChecker().Wait());
 }
 
-// E2E tests flaky on Mac and Windows: https://crbug.com/597319
-#if defined(OS_MAC) || defined(OS_WIN)
-#define MAYBE_E2E(test_name) test_name
-#else
-#define MAYBE_E2E(test_name) E2E_ENABLED(test_name)
-#endif
-
 // Flaky on Mac: http://crbug.com/535996
 #if defined(OS_MAC)
 #define MAYBE_StartWithSameExtensions DISABLED_StartWithSameExtensions
@@ -76,7 +69,7 @@
 #define MAYBE_StartWithDifferentExtensions StartWithDifferentExtensions
 #endif
 IN_PROC_BROWSER_TEST_F(TwoClientExtensionsSyncTest,
-                       MAYBE_E2E(MAYBE_StartWithDifferentExtensions)) {
+                       E2E_ENABLED(MAYBE_StartWithDifferentExtensions)) {
   ResetSyncForPrimaryAccount();
   ASSERT_TRUE(SetupClients());
 
@@ -137,7 +130,7 @@
       static_cast<int>(GetInstalledExtensions(GetProfile(0)).size()));
 }
 
-IN_PROC_BROWSER_TEST_F(TwoClientExtensionsSyncTest, MAYBE_E2E(Add)) {
+IN_PROC_BROWSER_TEST_F(TwoClientExtensionsSyncTest, E2E_ENABLED(Add)) {
   ASSERT_TRUE(SetupSync());
   ASSERT_TRUE(AllProfilesHaveSameExtensions());
 
@@ -147,7 +140,7 @@
   EXPECT_EQ(1u, GetInstalledExtensions(GetProfile(0)).size());
 }
 
-IN_PROC_BROWSER_TEST_F(TwoClientExtensionsSyncTest, MAYBE_E2E(Uninstall)) {
+IN_PROC_BROWSER_TEST_F(TwoClientExtensionsSyncTest, E2E_ENABLED(Uninstall)) {
   ResetSyncForPrimaryAccount();
   ASSERT_TRUE(SetupSync());
   ASSERT_TRUE(AllProfilesHaveSameExtensions());
@@ -161,7 +154,7 @@
 }
 
 IN_PROC_BROWSER_TEST_F(TwoClientExtensionsSyncTest,
-                       MAYBE_E2E(UpdateEnableDisableExtension)) {
+                       E2E_ENABLED(UpdateEnableDisableExtension)) {
   ResetSyncForPrimaryAccount();
   ASSERT_TRUE(SetupSync());
   ASSERT_TRUE(AllProfilesHaveSameExtensions());
diff --git a/chrome/browser/tab/state/tab_state_db_factory.cc b/chrome/browser/tab/state/tab_state_db_factory.cc
deleted file mode 100644
index 2dff3c63..0000000
--- a/chrome/browser/tab/state/tab_state_db_factory.cc
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright 2020 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/tab/state/tab_state_db_factory.h"
-
-#include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/tab/state/tab_state_db.h"
-#include "components/keyed_service/content/browser_context_dependency_manager.h"
-#include "content/public/browser/browser_context.h"
-#include "content/public/browser/storage_partition.h"
-
-namespace {
-const char kTabStateDBFolder[] = "tab_state_db";
-}  // namespace
-
-// static
-TabStateDBFactory* TabStateDBFactory::GetInstance() {
-  return base::Singleton<TabStateDBFactory>::get();
-}
-
-// static
-TabStateDB* TabStateDBFactory::GetForProfile(Profile* profile) {
-  // Incognito is currently not supported
-  if (profile->IsOffTheRecord())
-    return nullptr;
-
-  return static_cast<TabStateDB*>(
-      GetInstance()->GetServiceForBrowserContext(profile, true));
-}
-
-TabStateDBFactory::TabStateDBFactory()
-    : BrowserContextKeyedServiceFactory(
-          "TabStateDBKeyedService",
-          BrowserContextDependencyManager::GetInstance()) {}
-
-TabStateDBFactory::~TabStateDBFactory() = default;
-
-KeyedService* TabStateDBFactory::BuildServiceInstanceFor(
-    content::BrowserContext* context) const {
-  Profile* profile = Profile::FromBrowserContext(context);
-  DCHECK(!profile->IsOffTheRecord());
-
-  leveldb_proto::ProtoDatabaseProvider* proto_database_provider =
-      content::BrowserContext::GetDefaultStoragePartition(profile)
-          ->GetProtoDatabaseProvider();
-  base::FilePath tab_state_db_dir(
-      profile->GetPath().AppendASCII(kTabStateDBFolder));
-  return new TabStateDB(proto_database_provider, tab_state_db_dir);
-}
diff --git a/chrome/browser/tab/state/tab_state_db_factory.h b/chrome/browser/tab/state/tab_state_db_factory.h
deleted file mode 100644
index a744c22..0000000
--- a/chrome/browser/tab/state/tab_state_db_factory.h
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2020 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_TAB_STATE_TAB_STATE_DB_FACTORY_H_
-#define CHROME_BROWSER_TAB_STATE_TAB_STATE_DB_FACTORY_H_
-
-#include "base/memory/singleton.h"
-#include "components/keyed_service/content/browser_context_keyed_service_factory.h"
-
-class KeyedService;
-class Profile;
-class TabStateDB;
-
-// Factory to create on TabStateDB per profile. Incognito is currently
-// not supported and the factory will return nullptr for an incognito profile.
-class TabStateDBFactory : public BrowserContextKeyedServiceFactory {
- public:
-  // Acquire instance of TabStateDBFactory
-  static TabStateDBFactory* GetInstance();
-
-  // Acquire TabStateDB - there is one per profile.
-  static TabStateDB* GetForProfile(Profile* profile);
-
- private:
-  friend struct base::DefaultSingletonTraits<TabStateDBFactory>;
-
-  TabStateDBFactory();
-  ~TabStateDBFactory() override;
-
-  KeyedService* BuildServiceInstanceFor(
-      content::BrowserContext* context) const override;
-};
-
-#endif  // CHROME_BROWSER_TAB_STATE_TAB_STATE_DB_FACTORY_H_
diff --git a/chrome/browser/tab/state/tab_state_db_unittest.cc b/chrome/browser/tab/state/tab_state_db_unittest.cc
deleted file mode 100644
index a47b0a6..0000000
--- a/chrome/browser/tab/state/tab_state_db_unittest.cc
+++ /dev/null
@@ -1,303 +0,0 @@
-// Copyright 2020 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/tab/state/tab_state_db.h"
-
-#include <map>
-
-#include "base/bind.h"
-#include "base/memory/ptr_util.h"
-#include "base/task/thread_pool.h"
-#include "base/test/task_environment.h"
-#include "components/leveldb_proto/testing/fake_db.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-using testing::_;
-
-namespace {
-const char kMockKey[] = "key";
-const char kMockKeyPrefix[] = "k";
-const std::vector<uint8_t> kMockValue = {0xfa, 0x5b, 0x4c, 0x12};
-const std::vector<TabStateDB::KeyAndValue> kExpected = {{kMockKey, kMockValue}};
-const std::vector<TabStateDB::KeyAndValue> kEmptyExpected = {};
-}  // namespace
-
-class TabStateDBTest : public testing::Test {
- public:
-  TabStateDBTest() : content_db_(nullptr) {}
-
-  // Initialize the test database
-  void InitDatabase() {
-    InitDatabaseWithoutCallback();
-    MockInitCallback(content_db_, leveldb_proto::Enums::InitStatus::kOK);
-  }
-
-  void InitDatabaseWithoutCallback() {
-    auto storage_db = std::make_unique<
-        leveldb_proto::test::FakeDB<tab_state_db::TabStateContentProto>>(
-        &content_db_storage_);
-    content_db_ = storage_db.get();
-    tab_state_db_ = base::WrapUnique(new TabStateDB(
-        std::move(storage_db),
-        base::ThreadPool::CreateSequencedTaskRunner(
-            {base::MayBlock(), base::TaskPriority::USER_VISIBLE})));
-  }
-
-  // Wait for all tasks to be cleared off the queue
-  void RunUntilIdle() { task_environment_.RunUntilIdle(); }
-
-  void MockInitCallback(leveldb_proto::test::FakeDB<
-                            tab_state_db::TabStateContentProto>* storage_db,
-                        leveldb_proto::Enums::InitStatus status) {
-    storage_db->InitStatusCallback(status);
-    RunUntilIdle();
-  }
-
-  void MockInsertCallback(leveldb_proto::test::FakeDB<
-                              tab_state_db::TabStateContentProto>* storage_db,
-                          bool result) {
-    storage_db->UpdateCallback(result);
-    RunUntilIdle();
-  }
-
-  void MockLoadCallback(leveldb_proto::test::FakeDB<
-                            tab_state_db::TabStateContentProto>* storage_db,
-                        bool res) {
-    storage_db->LoadCallback(res);
-    RunUntilIdle();
-  }
-
-  void MockDeleteCallback(leveldb_proto::test::FakeDB<
-                              tab_state_db::TabStateContentProto>* storage_db,
-                          bool res) {
-    storage_db->UpdateCallback(res);
-    RunUntilIdle();
-  }
-
-  void OperationEvaluation(base::OnceClosure closure,
-                           bool expected_success,
-                           bool actual_success) {
-    EXPECT_EQ(expected_success, actual_success);
-    std::move(closure).Run();
-  }
-
-  void GetEvaluation(base::OnceClosure closure,
-                     std::vector<TabStateDB::KeyAndValue> expected,
-                     bool result,
-                     std::vector<TabStateDB::KeyAndValue> found) {
-    for (size_t i = 0; i < expected.size(); i++) {
-      EXPECT_EQ(found[i].first, expected[i].first);
-      EXPECT_EQ(found[i].second, expected[i].second);
-    }
-    std::move(closure).Run();
-  }
-
-  TabStateDB* tab_state_db() { return tab_state_db_.get(); }
-  leveldb_proto::test::FakeDB<tab_state_db::TabStateContentProto>*
-  content_db() {
-    return content_db_;
-  }
-  std::vector<base::OnceClosure>& deferred_operations() {
-    return tab_state_db()->deferred_operations_;
-  }
-  bool InitStatusUnknown() { return tab_state_db()->InitStatusUnknown(); }
-  bool FailedToInit() { return tab_state_db()->FailedToInit(); }
-
- private:
-  base::test::TaskEnvironment task_environment_;
-  std::map<std::string, tab_state_db::TabStateContentProto> content_db_storage_;
-  leveldb_proto::test::FakeDB<tab_state_db::TabStateContentProto>* content_db_;
-  std::unique_ptr<TabStateDB> tab_state_db_;
-
-  DISALLOW_COPY_AND_ASSIGN(TabStateDBTest);
-};
-
-TEST_F(TabStateDBTest, TestInit) {
-  InitDatabase();
-  EXPECT_EQ(false, FailedToInit());
-}
-
-TEST_F(TabStateDBTest, TestKeyInsertionSucceeded) {
-  InitDatabase();
-  base::RunLoop run_loop[2];
-  tab_state_db()->InsertContent(
-      kMockKey, kMockValue,
-      base::BindOnce(&TabStateDBTest::OperationEvaluation,
-                     base::Unretained(this), run_loop[0].QuitClosure(), true));
-  MockInsertCallback(content_db(), true);
-  run_loop[0].Run();
-  tab_state_db()->LoadContent(
-      kMockKey,
-      base::BindOnce(&TabStateDBTest::GetEvaluation, base::Unretained(this),
-                     run_loop[1].QuitClosure(), kExpected));
-  MockLoadCallback(content_db(), true);
-  run_loop[1].Run();
-}
-
-TEST_F(TabStateDBTest, TestKeyInsertionFailed) {
-  InitDatabase();
-  base::RunLoop run_loop[2];
-  tab_state_db()->InsertContent(
-      kMockKey, kMockValue,
-      base::BindOnce(&TabStateDBTest::OperationEvaluation,
-                     base::Unretained(this), run_loop[0].QuitClosure(), false));
-  MockInsertCallback(content_db(), false);
-  run_loop[0].Run();
-  std::vector<TabStateDB::KeyAndValue> expected;
-  tab_state_db()->LoadContent(
-      kMockKey,
-      base::BindOnce(&TabStateDBTest::GetEvaluation, base::Unretained(this),
-                     run_loop[1].QuitClosure(), expected));
-  MockLoadCallback(content_db(), true);
-  run_loop[1].Run();
-}
-
-TEST_F(TabStateDBTest, TestKeyInsertionPrefix) {
-  InitDatabase();
-  base::RunLoop run_loop[2];
-  tab_state_db()->InsertContent(
-      kMockKey, kMockValue,
-      base::BindOnce(&TabStateDBTest::OperationEvaluation,
-                     base::Unretained(this), run_loop[0].QuitClosure(), true));
-  MockInsertCallback(content_db(), true);
-  run_loop[0].Run();
-  std::vector<TabStateDB::KeyAndValue> expected;
-  expected.emplace_back(kMockKey, kMockValue);
-  tab_state_db()->LoadContent(
-      kMockKeyPrefix,
-      base::BindOnce(&TabStateDBTest::GetEvaluation, base::Unretained(this),
-                     run_loop[1].QuitClosure(), expected));
-  MockLoadCallback(content_db(), true);
-  run_loop[1].Run();
-}
-
-TEST_F(TabStateDBTest, TestDelete) {
-  InitDatabase();
-  base::RunLoop run_loop[4];
-  tab_state_db()->InsertContent(
-      kMockKey, kMockValue,
-      base::BindOnce(&TabStateDBTest::OperationEvaluation,
-                     base::Unretained(this), run_loop[0].QuitClosure(), true));
-  MockInsertCallback(content_db(), true);
-  run_loop[0].Run();
-  std::vector<TabStateDB::KeyAndValue> expected;
-  expected.emplace_back(kMockKey, kMockValue);
-  tab_state_db()->LoadContent(
-      kMockKey,
-      base::BindOnce(&TabStateDBTest::GetEvaluation, base::Unretained(this),
-                     run_loop[1].QuitClosure(), expected));
-  MockLoadCallback(content_db(), true);
-  run_loop[1].Run();
-
-  tab_state_db()->DeleteContent(
-      kMockKey,
-      base::BindOnce(&TabStateDBTest::OperationEvaluation,
-                     base::Unretained(this), run_loop[2].QuitClosure(), true));
-  MockDeleteCallback(content_db(), true);
-  run_loop[2].Run();
-
-  std::vector<TabStateDB::KeyAndValue> expected_after_delete;
-  tab_state_db()->LoadContent(
-      kMockKey,
-      base::BindOnce(&TabStateDBTest::GetEvaluation, base::Unretained(this),
-                     run_loop[3].QuitClosure(), expected_after_delete));
-  MockLoadCallback(content_db(), true);
-  run_loop[3].Run();
-}
-
-TEST_F(TabStateDBTest, TestDeferredOperations) {
-  InitDatabaseWithoutCallback();
-  RunUntilIdle();
-  EXPECT_EQ(true, InitStatusUnknown());
-  base::RunLoop run_loop[4];
-
-  tab_state_db()->InsertContent(
-      kMockKey, kMockValue,
-      base::BindOnce(&TabStateDBTest::OperationEvaluation,
-                     base::Unretained(this), run_loop[0].QuitClosure(), true));
-  tab_state_db()->LoadContent(
-      kMockKey,
-      base::BindOnce(&TabStateDBTest::GetEvaluation, base::Unretained(this),
-                     run_loop[1].QuitClosure(), kExpected));
-  EXPECT_EQ(2u, deferred_operations().size());
-
-  content_db()->InitStatusCallback(leveldb_proto::Enums::InitStatus::kOK);
-  EXPECT_EQ(false, FailedToInit());
-
-  MockInsertCallback(content_db(), true);
-  MockLoadCallback(content_db(), true);
-  run_loop[0].Run();
-  run_loop[1].Run();
-  EXPECT_EQ(0u, deferred_operations().size());
-
-  tab_state_db()->DeleteContent(
-      kMockKey,
-      base::BindOnce(&TabStateDBTest::OperationEvaluation,
-                     base::Unretained(this), run_loop[2].QuitClosure(), true));
-  EXPECT_EQ(0u, deferred_operations().size());
-  MockDeleteCallback(content_db(), true);
-
-  tab_state_db()->LoadContent(
-      kMockKey,
-      base::BindOnce(&TabStateDBTest::GetEvaluation, base::Unretained(this),
-                     run_loop[3].QuitClosure(), kEmptyExpected));
-  EXPECT_EQ(0u, deferred_operations().size());
-  MockLoadCallback(content_db(), true);
-  run_loop[3].Run();
-}
-
-TEST_F(TabStateDBTest, TestInitializationFailure) {
-  InitDatabaseWithoutCallback();
-  RunUntilIdle();
-  EXPECT_EQ(true, InitStatusUnknown());
-  base::RunLoop run_loop[6];
-
-  // Do some operations before database status is known
-  tab_state_db()->InsertContent(
-      kMockKey, kMockValue,
-      base::BindOnce(&TabStateDBTest::OperationEvaluation,
-                     base::Unretained(this), run_loop[0].QuitClosure(), false));
-  tab_state_db()->LoadContent(
-      kMockKey,
-      base::BindOnce(&TabStateDBTest::GetEvaluation, base::Unretained(this),
-                     run_loop[1].QuitClosure(), kEmptyExpected));
-  tab_state_db()->DeleteContent(
-      kMockKey,
-      base::BindOnce(&TabStateDBTest::OperationEvaluation,
-                     base::Unretained(this), run_loop[2].QuitClosure(), false));
-  EXPECT_EQ(3u, deferred_operations().size());
-
-  // Error initializing database
-  content_db()->InitStatusCallback(leveldb_proto::Enums::InitStatus::kError);
-  EXPECT_EQ(true, FailedToInit());
-  for (int i = 0; i < 3; i++) {
-    run_loop[i].Run();
-  }
-
-  // Check deferred_operations is flushed
-  EXPECT_EQ(0u, deferred_operations().size());
-
-  // More operations should just return false/null as the database
-  // failed to initialize
-  tab_state_db()->InsertContent(
-      kMockKey, kMockValue,
-      base::BindOnce(&TabStateDBTest::OperationEvaluation,
-                     base::Unretained(this), run_loop[3].QuitClosure(), false));
-  tab_state_db()->LoadContent(
-      kMockKey,
-      base::BindOnce(&TabStateDBTest::GetEvaluation, base::Unretained(this),
-                     run_loop[4].QuitClosure(), kEmptyExpected));
-  tab_state_db()->DeleteContent(
-      kMockKey,
-      base::BindOnce(&TabStateDBTest::OperationEvaluation,
-                     base::Unretained(this), run_loop[5].QuitClosure(), false));
-
-  // Operations should have returned immediately as database was initialization
-  // resulted in an error
-  EXPECT_EQ(0u, deferred_operations().size());
-  for (int i = 3; i < 6; i++) {
-    run_loop[i].Run();
-  }
-}
diff --git a/chrome/browser/ui/android/content_settings/ads_blocked_infobar_delegate.cc b/chrome/browser/ui/android/content_settings/ads_blocked_infobar_delegate.cc
index 0400ef2..9de88ccc 100644
--- a/chrome/browser/ui/android/content_settings/ads_blocked_infobar_delegate.cc
+++ b/chrome/browser/ui/android/content_settings/ads_blocked_infobar_delegate.cc
@@ -8,7 +8,6 @@
 
 #include "base/memory/ptr_util.h"
 #include "base/strings/utf_string_conversions.h"
-#include "chrome/browser/subresource_filter/chrome_subresource_filter_client.h"
 #include "chrome/browser/ui/android/infobars/ads_blocked_infobar.h"
 #include "components/infobars/content/content_infobar_manager.h"
 #include "components/infobars/core/infobar.h"
@@ -78,9 +77,9 @@
 }
 
 bool AdsBlockedInfobarDelegate::Cancel() {
-  auto* filter_client = ChromeSubresourceFilterClient::FromWebContents(
-      infobars::ContentInfoBarManager::WebContentsFromInfoBar(infobar()));
-  filter_client->OnReloadRequested();
+  subresource_filter::ContentSubresourceFilterThrottleManager::FromWebContents(
+      infobars::ContentInfoBarManager::WebContentsFromInfoBar(infobar()))
+      ->OnReloadRequested();
   return true;
 }
 
diff --git a/chrome/browser/ui/bookmarks/bookmark_tab_helper.cc b/chrome/browser/ui/bookmarks/bookmark_tab_helper.cc
index c0b5a805..e8240497 100644
--- a/chrome/browser/ui/bookmarks/bookmark_tab_helper.cc
+++ b/chrome/browser/ui/bookmarks/bookmark_tab_helper.cc
@@ -59,7 +59,7 @@
       Profile::FromBrowserContext(web_contents()->GetBrowserContext());
 
 #if !defined(OS_CHROMEOS)
-  if (profile->IsGuestSession())
+  if (profile->IsGuestSession() || profile->IsEphemeralGuestProfile())
     return false;
 #endif
 
diff --git a/chrome/browser/ui/browser.cc b/chrome/browser/ui/browser.cc
index fed6c71..1678df7 100644
--- a/chrome/browser/ui/browser.cc
+++ b/chrome/browser/ui/browser.cc
@@ -973,19 +973,20 @@
     return DownloadCloseType::kBrowserShutdown;
   }
 
-  // If there aren't any other windows on our profile, and we're an incognito
-  // profile, and there are downloads associated with that profile,
+  // If there aren't any other windows on our profile, and we're an Incognito
+  // or Guest profile, and there are downloads associated with that profile,
   // those downloads would be cancelled by our window (-> profile) close.
   DownloadCoreService* download_core_service =
       DownloadCoreServiceFactory::GetForBrowserContext(profile());
+  bool is_guest =
+      (profile()->IsGuestSession() || profile()->IsEphemeralGuestProfile());
   if ((profile_window_count == 0) &&
       (download_core_service->NonMaliciousDownloadCount() > 0) &&
-      profile()->IsOffTheRecord()) {
+      (profile()->IsIncognitoProfile() || is_guest)) {
     *num_downloads_blocking =
         download_core_service->NonMaliciousDownloadCount();
-    return profile()->IsGuestSession()
-               ? DownloadCloseType::kLastWindowInGuestSession
-               : DownloadCloseType::kLastWindowInIncognitoProfile;
+    return is_guest ? DownloadCloseType::kLastWindowInGuestSession
+                    : DownloadCloseType::kLastWindowInIncognitoProfile;
   }
 
   // Those are the only conditions under which we will block shutdown.
@@ -2133,7 +2134,9 @@
   Profile* profile =
       Profile::FromBrowserContext(web_contents->GetBrowserContext());
   // TODO(wad): Add ephemeral device ID support for broker in guest mode.
-  if (profile->IsGuestSession()) {
+  // TODO(https://crbug.com/1125474): Update if PPAPI is supported in ephemeral
+  // Guest profiles.
+  if (profile->IsGuestSession() || profile->IsEphemeralGuestProfile()) {
     std::move(callback).Run(false);
     return;
   }
@@ -2996,7 +2999,7 @@
 }
 
 bool Browser::ShouldShowBookmarkBar() const {
-  if (profile_->IsGuestSession())
+  if (profile_->IsGuestSession() || profile()->IsEphemeralGuestProfile())
     return false;
 
   if (browser_defaults::bookmarks_enabled &&
diff --git a/chrome/browser/ui/browser_command_controller.cc b/chrome/browser/ui/browser_command_controller.cc
index 6897d6b..35d361a 100644
--- a/chrome/browser/ui/browser_command_controller.cc
+++ b/chrome/browser/ui/browser_command_controller.cc
@@ -962,26 +962,32 @@
   command_updater_.UpdateCommandEnabled(IDC_ZOOM_MINUS, true);
 
   // Show various bits of UI
-  const bool guest_session =
-      profile()->IsGuestSession() || profile()->IsSystemProfile();
   DCHECK(!profile()->IsSystemProfile())
       << "Ought to never have browser for the system profile.";
   const bool normal_window = browser_->is_type_normal();
   UpdateOpenFileState(&command_updater_);
   UpdateCommandsForDevTools();
   command_updater_.UpdateCommandEnabled(IDC_TASK_MANAGER, CanOpenTaskManager());
-  command_updater_.UpdateCommandEnabled(IDC_SHOW_HISTORY, !guest_session);
+  command_updater_.UpdateCommandEnabled(
+      IDC_SHOW_HISTORY,
+      (!profile()->IsGuestSession() && !profile()->IsSystemProfile()));
   command_updater_.UpdateCommandEnabled(IDC_SHOW_DOWNLOADS, true);
   command_updater_.UpdateCommandEnabled(IDC_HELP_MENU, true);
   command_updater_.UpdateCommandEnabled(IDC_HELP_PAGE_VIA_KEYBOARD, true);
   command_updater_.UpdateCommandEnabled(IDC_HELP_PAGE_VIA_MENU, true);
   command_updater_.UpdateCommandEnabled(IDC_SHOW_BETA_FORUM, true);
-  command_updater_.UpdateCommandEnabled(IDC_BOOKMARKS_MENU, !guest_session);
   command_updater_.UpdateCommandEnabled(
-      IDC_RECENT_TABS_MENU, !guest_session && !profile()->IsOffTheRecord());
+      IDC_BOOKMARKS_MENU,
+      (!profile()->IsGuestSession() && !profile()->IsSystemProfile() &&
+       !profile()->IsEphemeralGuestProfile()));
+  command_updater_.UpdateCommandEnabled(
+      IDC_RECENT_TABS_MENU,
+      (!profile()->IsGuestSession() && !profile()->IsSystemProfile() &&
+       !profile()->IsIncognitoProfile()));
   command_updater_.UpdateCommandEnabled(
       IDC_CLEAR_BROWSING_DATA,
-      !guest_session && !profile()->IsIncognitoProfile());
+      (!profile()->IsGuestSession() && !profile()->IsSystemProfile() &&
+       !profile()->IsIncognitoProfile()));
 #if defined(OS_CHROMEOS)
   command_updater_.UpdateCommandEnabled(IDC_TAKE_SCREENSHOT, true);
   // Chrome OS uses the system tray menu to handle multi-profiles. Avatar menu
@@ -1066,19 +1072,18 @@
 void BrowserCommandController::UpdateSharedCommandsForIncognitoAvailability(
     CommandUpdater* command_updater,
     Profile* profile) {
-  const bool guest_session = profile->IsGuestSession();
-  // TODO(mlerman): Make GetAvailability account for profile->IsGuestSession().
   IncognitoModePrefs::Availability incognito_availability =
       IncognitoModePrefs::GetAvailability(profile->GetPrefs());
   command_updater->UpdateCommandEnabled(
       IDC_NEW_WINDOW, incognito_availability != IncognitoModePrefs::FORCED);
   command_updater->UpdateCommandEnabled(
       IDC_NEW_INCOGNITO_WINDOW,
-      incognito_availability != IncognitoModePrefs::DISABLED && !guest_session);
+      incognito_availability != IncognitoModePrefs::DISABLED &&
+          !profile->IsGuestSession() && !profile->IsEphemeralGuestProfile());
 
   const bool forced_incognito =
       incognito_availability == IncognitoModePrefs::FORCED ||
-      guest_session;  // Guest always runs in Incognito mode.
+      profile->IsGuestSession();  // Guest always runs in Incognito mode.
   command_updater->UpdateCommandEnabled(
       IDC_SHOW_BOOKMARK_MANAGER,
       browser_defaults::bookmarks_enabled && !forced_incognito);
@@ -1095,8 +1100,8 @@
                                         enable_extensions && !forced_incognito);
 
   command_updater->UpdateCommandEnabled(IDC_IMPORT_SETTINGS, !forced_incognito);
-  command_updater->UpdateCommandEnabled(IDC_OPTIONS,
-                                        !forced_incognito || guest_session);
+  command_updater->UpdateCommandEnabled(
+      IDC_OPTIONS, !forced_incognito || profile->IsGuestSession());
   command_updater->UpdateCommandEnabled(IDC_SHOW_SIGNIN, !forced_incognito);
 }
 
@@ -1242,6 +1247,7 @@
   command_updater_.UpdateCommandEnabled(
       IDC_SHOW_BOOKMARK_BAR, browser_defaults::bookmarks_enabled &&
                                  !profile()->IsGuestSession() &&
+                                 !profile()->IsEphemeralGuestProfile() &&
                                  !profile()->IsSystemProfile() &&
                                  !profile()->GetPrefs()->IsManagedPreference(
                                      bookmarks::prefs::kShowBookmarkBar) &&
diff --git a/chrome/browser/ui/browser_commands.cc b/chrome/browser/ui/browser_commands.cc
index 39f566e..e8858381 100644
--- a/chrome/browser/ui/browser_commands.cc
+++ b/chrome/browser/ui/browser_commands.cc
@@ -109,7 +109,6 @@
 #include "content/public/browser/render_widget_host_view.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/common/content_switches.h"
-#include "content/public/common/page_state.h"
 #include "content/public/common/url_constants.h"
 #include "content/public/common/url_utils.h"
 #include "content/public/common/user_agent.h"
diff --git a/chrome/browser/ui/browser_list.cc b/chrome/browser/ui/browser_list.cc
index 4546db7..88411db 100644
--- a/chrome/browser/ui/browser_list.cc
+++ b/chrome/browser/ui/browser_list.cc
@@ -93,7 +93,8 @@
   if (browser->window()->IsActive())
     SetLastActive(browser);
 
-  if (browser->profile()->IsGuestSession()) {
+  if (browser->profile()->IsGuestSession() ||
+      browser->profile()->IsEphemeralGuestProfile()) {
     base::UmaHistogramCounts100(
         "Browser.WindowCount.Guest",
         GetOffTheRecordBrowsersActiveForProfile(browser->profile()));
@@ -351,7 +352,9 @@
 size_t BrowserList::GetGuestBrowserCount() {
   BrowserList* list = BrowserList::GetInstance();
   return std::count_if(list->begin(), list->end(), [](Browser* browser) {
-    return browser->profile()->IsGuestSession() && !browser->is_type_devtools();
+    return (browser->profile()->IsGuestSession() ||
+            browser->profile()->IsEphemeralGuestProfile()) &&
+           !browser->is_type_devtools();
   });
 }
 
diff --git a/chrome/browser/ui/cocoa/notifications/unnotification_response_builder_mac.mm b/chrome/browser/ui/cocoa/notifications/unnotification_response_builder_mac.mm
index b6ed1f66..97eefc3 100644
--- a/chrome/browser/ui/cocoa/notifications/unnotification_response_builder_mac.mm
+++ b/chrome/browser/ui/cocoa/notifications/unnotification_response_builder_mac.mm
@@ -7,6 +7,7 @@
 #import <UserNotifications/UserNotifications.h>
 
 #include "base/check.h"
+#include "base/notreached.h"
 #include "chrome/browser/ui/cocoa/notifications/notification_constants_mac.h"
 #include "chrome/browser/ui/cocoa/notifications/notification_operation.h"
 
@@ -39,14 +40,28 @@
   NSNumber* notificationType =
       [userInfo objectForKey:notification_constants::kNotificationType];
 
-  NotificationOperation operation =
-      [[response actionIdentifier]
-          isEqual:UNNotificationDismissActionIdentifier]
-          ? NotificationOperation::NOTIFICATION_CLOSE
-          : NotificationOperation::NOTIFICATION_CLICK;
-
   int buttonIndex = notification_constants::kNotificationInvalidButtonIndex;
 
+  NotificationOperation operation = NotificationOperation::NOTIFICATION_CLICK;
+
+  if ([[response actionIdentifier]
+          isEqual:UNNotificationDismissActionIdentifier]) {
+    operation = NotificationOperation::NOTIFICATION_CLOSE;
+  } else if ([[response actionIdentifier]
+                 isEqual:UNNotificationDefaultActionIdentifier]) {
+    operation = NotificationOperation::NOTIFICATION_CLICK;
+  } else if ([[response actionIdentifier]
+                 isEqualToString:notification_constants::
+                                     kNotificationCloseButtonTag]) {
+    operation = NotificationOperation::NOTIFICATION_CLOSE;
+  } else if ([[response actionIdentifier]
+                 isEqualToString:notification_constants::
+                                     kNotificationSettingsButtonTag]) {
+    operation = NotificationOperation::NOTIFICATION_SETTINGS;
+  } else {
+    NOTREACHED();
+  }
+
   return @{
     notification_constants::kNotificationOrigin : origin,
     notification_constants::kNotificationId : notificationId,
diff --git a/chrome/browser/ui/cocoa/notifications/unnotification_response_builder_mac_unittest.mm b/chrome/browser/ui/cocoa/notifications/unnotification_response_builder_mac_unittest.mm
index d88cc61a..6bb15c3f 100644
--- a/chrome/browser/ui/cocoa/notifications/unnotification_response_builder_mac_unittest.mm
+++ b/chrome/browser/ui/cocoa/notifications/unnotification_response_builder_mac_unittest.mm
@@ -156,3 +156,57 @@
               buttonIndex.intValue);
   }
 }
+
+TEST(UNNotificationResponseBuilderMacTest, TestNotificationCloseButton) {
+  if (@available(macOS 10.14, *)) {
+    base::scoped_nsobject<UNNotificationBuilder> builder =
+        NewTestBuilder(NotificationHandler::Type::WEB_PERSISTENT);
+    UNMutableNotificationContent* content = [builder buildUserNotification];
+    base::scoped_nsobject<NSMutableDictionary> userInfo(
+        [[content userInfo] mutableCopy]);
+
+    FakeUNNotificationResponse* fakeResponse = CreateFakeResponse(userInfo);
+    fakeResponse.actionIdentifier =
+        notification_constants::kNotificationCloseButtonTag;
+
+    NSDictionary* response = [UNNotificationResponseBuilder
+        buildDictionary:static_cast<UNNotificationResponse*>(fakeResponse)];
+
+    NSNumber* operation =
+        [response objectForKey:notification_constants::kNotificationOperation];
+    NSNumber* buttonIndex = [response
+        objectForKey:notification_constants::kNotificationButtonIndex];
+
+    EXPECT_EQ(static_cast<int>(NotificationOperation::NOTIFICATION_CLOSE),
+              operation.intValue);
+    EXPECT_EQ(notification_constants::kNotificationInvalidButtonIndex,
+              buttonIndex.intValue);
+  }
+}
+
+TEST(UNNotificationResponseBuilderMacTest, TestNotificationSettingsButton) {
+  if (@available(macOS 10.14, *)) {
+    base::scoped_nsobject<UNNotificationBuilder> builder =
+        NewTestBuilder(NotificationHandler::Type::WEB_PERSISTENT);
+    UNMutableNotificationContent* content = [builder buildUserNotification];
+    base::scoped_nsobject<NSMutableDictionary> userInfo(
+        [[content userInfo] mutableCopy]);
+
+    FakeUNNotificationResponse* fakeResponse = CreateFakeResponse(userInfo);
+    fakeResponse.actionIdentifier =
+        notification_constants::kNotificationSettingsButtonTag;
+
+    NSDictionary* response = [UNNotificationResponseBuilder
+        buildDictionary:static_cast<UNNotificationResponse*>(fakeResponse)];
+
+    NSNumber* operation =
+        [response objectForKey:notification_constants::kNotificationOperation];
+    NSNumber* buttonIndex = [response
+        objectForKey:notification_constants::kNotificationButtonIndex];
+
+    EXPECT_EQ(static_cast<int>(NotificationOperation::NOTIFICATION_SETTINGS),
+              operation.intValue);
+    EXPECT_EQ(notification_constants::kNotificationInvalidButtonIndex,
+              buttonIndex.intValue);
+  }
+}
diff --git a/chrome/browser/ui/content_settings/content_setting_bubble_model.cc b/chrome/browser/ui/content_settings/content_setting_bubble_model.cc
index 4e991bec..7e35a25 100644
--- a/chrome/browser/ui/content_settings/content_setting_bubble_model.cc
+++ b/chrome/browser/ui/content_settings/content_setting_bubble_model.cc
@@ -34,7 +34,6 @@
 #include "chrome/browser/plugins/chrome_plugin_service_filter.h"
 #include "chrome/browser/plugins/plugin_utils.h"
 #include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/subresource_filter/chrome_subresource_filter_client.h"
 #include "chrome/browser/ui/collected_cookies_infobar_delegate.h"
 #include "chrome/browser/ui/content_settings/content_setting_bubble_model_delegate.h"
 #include "chrome/common/chrome_features.h"
@@ -1423,8 +1422,9 @@
 
 void ContentSettingSubresourceFilterBubbleModel::CommitChanges() {
   if (is_checked_) {
-    ChromeSubresourceFilterClient::FromWebContents(web_contents())
-        ->OnReloadRequested();
+    subresource_filter::ContentSubresourceFilterThrottleManager::
+        FromWebContents(web_contents())
+            ->OnReloadRequested();
   }
 }
 
diff --git a/chrome/browser/ui/views/apps/chrome_native_app_window_views_aura_ash.cc b/chrome/browser/ui/views/apps/chrome_native_app_window_views_aura_ash.cc
index 438bbdef..3f2dabaa 100644
--- a/chrome/browser/ui/views/apps/chrome_native_app_window_views_aura_ash.cc
+++ b/chrome/browser/ui/views/apps/chrome_native_app_window_views_aura_ash.cc
@@ -530,10 +530,6 @@
   if (app_window()->IsForcedFullscreen() || IsFrameless())
     return false;
 
-  // Always use immersive mode in a public session in fullscreen state.
-  if (profiles::IsPublicSession() && IsFullscreen())
-    return true;
-
   // Always use immersive mode when fullscreen is set by the OS.
   if (app_window()->IsOsFullscreen())
     return true;
diff --git a/chrome/browser/ui/views/apps/chrome_native_app_window_views_aura_ash.h b/chrome/browser/ui/views/apps/chrome_native_app_window_views_aura_ash.h
index 38e49c6..5bc5bca 100644
--- a/chrome/browser/ui/views/apps/chrome_native_app_window_views_aura_ash.h
+++ b/chrome/browser/ui/views/apps/chrome_native_app_window_views_aura_ash.h
@@ -146,7 +146,7 @@
   FRIEND_TEST_ALL_PREFIXES(ChromeNativeAppWindowViewsAuraAshBrowserTest,
                            NoImmersiveModeWhenForcedFullscreen);
   FRIEND_TEST_ALL_PREFIXES(ChromeNativeAppWindowViewsAuraAshBrowserTest,
-                           PublicSessionImmersiveMode);
+                           PublicSessionNoImmersiveModeWhenFullscreen);
   FRIEND_TEST_ALL_PREFIXES(ChromeNativeAppWindowViewsAuraAshBrowserTest,
                            RestoreImmersiveMode);
   FRIEND_TEST_ALL_PREFIXES(ChromeNativeAppWindowViewsAuraAshBrowserTest,
@@ -154,9 +154,9 @@
   FRIEND_TEST_ALL_PREFIXES(ChromeNativeAppWindowViewsAuraAshBrowserTest,
                            NoImmersiveOrBubbleOutsidePublicSessionDom);
   FRIEND_TEST_ALL_PREFIXES(ChromeNativeAppWindowViewsAuraAshBrowserTest,
-                           ImmersiveAndBubbleInsidePublicSessionWindow);
+                           BubbleInsidePublicSessionWindow);
   FRIEND_TEST_ALL_PREFIXES(ChromeNativeAppWindowViewsAuraAshBrowserTest,
-                           ImmersiveAndBubbleInsidePublicSessionDom);
+                           BubbleInsidePublicSessionDom);
   FRIEND_TEST_ALL_PREFIXES(ShapedAppWindowTargeterTest,
                            ResizeInsetsWithinBounds);
 
diff --git a/chrome/browser/ui/views/apps/chrome_native_app_window_views_aura_ash_browsertest.cc b/chrome/browser/ui/views/apps/chrome_native_app_window_views_aura_ash_browsertest.cc
index 887a8dc1..8a18f76 100644
--- a/chrome/browser/ui/views/apps/chrome_native_app_window_views_aura_ash_browsertest.cc
+++ b/chrome/browser/ui/views/apps/chrome_native_app_window_views_aura_ash_browsertest.cc
@@ -74,6 +74,47 @@
         GetFirstAppWindow()->GetBaseWindow());
   }
 
+  std::unique_ptr<ExtensionTestMessageListener>
+  LaunchPlatformAppWithFocusedWindow() {
+    std::unique_ptr<ExtensionTestMessageListener> launched_listener =
+        std::make_unique<ExtensionTestMessageListener>("Launched", true);
+    LoadAndLaunchPlatformApp("leave_fullscreen", launched_listener.get());
+
+    // We start by making sure the window is actually focused.
+    EXPECT_TRUE(ui_test_utils::ShowAndFocusNativeWindow(
+        GetFirstAppWindow()->GetNativeWindow()));
+    return launched_listener;
+  }
+
+  // When receiving the reply, the application will try to go fullscreen using
+  // the Window API but there is no synchronous way to know if that actually
+  // succeeded. Also, failure will not be notified. A failure case will only be
+  // known with a timeout.
+  void WaitFullscreenChange(ExtensionTestMessageListener* launched_listener) {
+    FullscreenChangeWaiter fullscreen_changed(
+        GetFirstAppWindow()->GetBaseWindow());
+    launched_listener->Reply("window");
+    fullscreen_changed.Wait();
+  }
+
+  // Because the DOM way to go fullscreen requires user gesture, we simulate a
+  // key event to get the window to enter fullscreen mode. The reply will
+  // make the window listen for the key event. The reply will be sent to the
+  // renderer process before the keypress and should be received in that order.
+  // When receiving the key event, the application will try to go fullscreen
+  // using the Window API but there is no synchronous way to know if that
+  // actually succeeded. Also, failure will not be notified. A failure case will
+  // only be known with a timeout.
+  void WaitFullscreenChangeUntilKeyFocus(
+      ExtensionTestMessageListener* launched_listener) {
+    launched_listener->Reply("dom");
+
+    FullscreenChangeWaiter fs_changed(GetFirstAppWindow()->GetBaseWindow());
+    WaitUntilKeyFocus();
+    ASSERT_TRUE(SimulateKeyPress(ui::VKEY_A));
+    fs_changed.Wait();
+  }
+
   extensions::AppWindow* app_window_ = nullptr;
 
  private:
@@ -181,10 +222,10 @@
   EXPECT_FALSE(IsImmersiveActive());
 }
 
-// Make sure a normal window is not in immersive mode, and uses
-// immersive in fullscreen.
+// Verify that immersive mode stays disabled in the public session, no matter
+// that the app is in a normal window or fullscreen mode.
 IN_PROC_BROWSER_TEST_F(ChromeNativeAppWindowViewsAuraAshBrowserTest,
-                       PublicSessionImmersiveMode) {
+                       PublicSessionNoImmersiveModeWhenFullscreen) {
   chromeos::ScopedTestPublicSessionLoginState login_state;
 
   InitWindow();
@@ -194,7 +235,7 @@
   app_window_->SetFullscreen(extensions::AppWindow::FULLSCREEN_TYPE_HTML_API,
                              true);
 
-  EXPECT_TRUE(IsImmersiveActive());
+  EXPECT_FALSE(IsImmersiveActive());
 }
 
 // Verifies that apps in clamshell mode with immersive fullscreen enabled will
@@ -234,119 +275,55 @@
   CloseAppWindow(app_window_);
 }
 
+// Ensures that JS-activated fullscreen doesn't trigger the immersive mode or
+// show a bubble except the public session. (Window API)
 IN_PROC_BROWSER_TEST_F(ChromeNativeAppWindowViewsAuraAshBrowserTest,
                        NoImmersiveOrBubbleOutsidePublicSessionWindow) {
-  ExtensionTestMessageListener launched_listener("Launched", true);
-  LoadAndLaunchPlatformApp("leave_fullscreen", &launched_listener);
-
-  // We start by making sure the window is actually focused.
-  ASSERT_TRUE(ui_test_utils::ShowAndFocusNativeWindow(
-      GetFirstAppWindow()->GetNativeWindow()));
-
-  // When receiving the reply, the application will try to go fullscreen using
-  // the Window API but there is no synchronous way to know if that actually
-  // succeeded. Also, failure will not be notified. A failure case will only be
-  // known with a timeout.
-  {
-    FullscreenChangeWaiter fs_changed(GetFirstAppWindow()->GetBaseWindow());
-
-    launched_listener.Reply("window");
-
-    fs_changed.Wait();
-  }
+  std::unique_ptr<ExtensionTestMessageListener> launched_listener =
+      LaunchPlatformAppWithFocusedWindow();
+  WaitFullscreenChange(launched_listener.get());
 
   EXPECT_FALSE(window()->IsImmersiveModeEnabled());
   EXPECT_FALSE(window()->exclusive_access_bubble_);
 }
 
+// Ensures that JS-activated fullscreen doesn't trigger the immersive mode or
+// show a bubble except the public session. (DOM)
 IN_PROC_BROWSER_TEST_F(ChromeNativeAppWindowViewsAuraAshBrowserTest,
                        NoImmersiveOrBubbleOutsidePublicSessionDom) {
-  ExtensionTestMessageListener launched_listener("Launched", true);
-  LoadAndLaunchPlatformApp("leave_fullscreen", &launched_listener);
-
-  // We start by making sure the window is actually focused.
-  ASSERT_TRUE(ui_test_utils::ShowAndFocusNativeWindow(
-      GetFirstAppWindow()->GetNativeWindow()));
-
-  launched_listener.Reply("dom");
-
-  // Because the DOM way to go fullscreen requires user gesture, we simulate a
-  // key event to get the window entering in fullscreen mode. The reply will
-  // make the window listen for the key event. The reply will be sent to the
-  // renderer process before the keypress and should be received in that order.
-  // When receiving the key event, the application will try to go fullscreen
-  // using the Window API but there is no synchronous way to know if that
-  // actually succeeded. Also, failure will not be notified. A failure case will
-  // only be known with a timeout.
-  {
-    FullscreenChangeWaiter fs_changed(GetFirstAppWindow()->GetBaseWindow());
-
-    WaitUntilKeyFocus();
-    ASSERT_TRUE(SimulateKeyPress(ui::VKEY_A));
-
-    fs_changed.Wait();
-  }
+  std::unique_ptr<ExtensionTestMessageListener> launched_listener =
+      LaunchPlatformAppWithFocusedWindow();
+  WaitFullscreenChangeUntilKeyFocus(launched_listener.get());
 
   EXPECT_FALSE(window()->IsImmersiveModeEnabled());
   EXPECT_FALSE(window()->exclusive_access_bubble_);
 }
 
+// Ensures that JS-activated fullscreen in the Public session doesn't trigger
+// the immersive mode, but shows a bubble to guide users how to exit the
+// fullscreen mode under different conditions. (Window API)
 IN_PROC_BROWSER_TEST_F(ChromeNativeAppWindowViewsAuraAshBrowserTest,
-                       ImmersiveAndBubbleInsidePublicSessionWindow) {
+                       BubbleInsidePublicSessionWindow) {
   chromeos::ScopedTestPublicSessionLoginState state;
-  ExtensionTestMessageListener launched_listener("Launched", true);
-  LoadAndLaunchPlatformApp("leave_fullscreen", &launched_listener);
+  std::unique_ptr<ExtensionTestMessageListener> launched_listener =
+      LaunchPlatformAppWithFocusedWindow();
+  WaitFullscreenChange(launched_listener.get());
 
-  // We start by making sure the window is actually focused.
-  ASSERT_TRUE(ui_test_utils::ShowAndFocusNativeWindow(
-      GetFirstAppWindow()->GetNativeWindow()));
-
-  // When receiving the reply, the application will try to go fullscreen using
-  // the Window API but there is no synchronous way to know if that actually
-  // succeeded. Also, failure will not be notified. A failure case will only be
-  // known with a timeout.
-  {
-    FullscreenChangeWaiter fs_changed(GetFirstAppWindow()->GetBaseWindow());
-
-    launched_listener.Reply("window");
-
-    fs_changed.Wait();
-  }
-
-  EXPECT_TRUE(window()->IsImmersiveModeEnabled());
+  EXPECT_FALSE(window()->IsImmersiveModeEnabled());
   EXPECT_TRUE(window()->exclusive_access_bubble_);
 }
 
+// Ensures that JS-activated fullscreen in the Public session doesn't trigger
+// the immersive mode, but shows a bubble to guide users how to exit the
+// fullscreen mode under different conditions. (DOM)
 IN_PROC_BROWSER_TEST_F(ChromeNativeAppWindowViewsAuraAshBrowserTest,
-                       ImmersiveAndBubbleInsidePublicSessionDom) {
+                       BubbleInsidePublicSessionDom) {
   chromeos::ScopedTestPublicSessionLoginState state;
-  ExtensionTestMessageListener launched_listener("Launched", true);
-  LoadAndLaunchPlatformApp("leave_fullscreen", &launched_listener);
+  std::unique_ptr<ExtensionTestMessageListener> launched_listener =
+      LaunchPlatformAppWithFocusedWindow();
+  WaitFullscreenChangeUntilKeyFocus(launched_listener.get());
 
-  // We start by making sure the window is actually focused.
-  ASSERT_TRUE(ui_test_utils::ShowAndFocusNativeWindow(
-      GetFirstAppWindow()->GetNativeWindow()));
-
-  launched_listener.Reply("dom");
-
-  // Because the DOM way to go fullscreen requires user gesture, we simulate a
-  // key event to get the window entering in fullscreen mode. The reply will
-  // make the window listen for the key event. The reply will be sent to the
-  // renderer process before the keypress and should be received in that order.
-  // When receiving the key event, the application will try to go fullscreen
-  // using the Window API but there is no synchronous way to know if that
-  // actually succeeded. Also, failure will not be notified. A failure case will
-  // only be known with a timeout.
-  {
-    FullscreenChangeWaiter fs_changed(GetFirstAppWindow()->GetBaseWindow());
-
-    WaitUntilKeyFocus();
-    ASSERT_TRUE(SimulateKeyPress(ui::VKEY_A));
-
-    fs_changed.Wait();
-  }
-
-  EXPECT_TRUE(window()->IsImmersiveModeEnabled());
+  EXPECT_FALSE(window()->IsImmersiveModeEnabled());
   EXPECT_TRUE(window()->exclusive_access_bubble_);
 }
 
diff --git a/chrome/browser/ui/views/autofill/payments/save_card_bubble_views_browsertest.cc b/chrome/browser/ui/views/autofill/payments/save_card_bubble_views_browsertest.cc
index bf291cc..72a7c817 100644
--- a/chrome/browser/ui/views/autofill/payments/save_card_bubble_views_browsertest.cc
+++ b/chrome/browser/ui/views/autofill/payments/save_card_bubble_views_browsertest.cc
@@ -966,6 +966,17 @@
 }
 #endif
 
+IN_PROC_BROWSER_TEST_F(SaveCardBubbleViewsFullFormBrowserTest,
+                       AlertAccessibleEvent) {
+  views::test::AXEventCounter counter(views::AXEventManager::Get());
+  EXPECT_EQ(0, counter.GetCount(ax::mojom::Event::kAlert));
+
+  FillForm();
+  SubmitFormAndWaitForCardLocalSaveBubble();
+
+  EXPECT_EQ(1, counter.GetCount(ax::mojom::Event::kAlert));
+}
+
 // Tests the sign in promo bubble. Ensures that signin action is recorded when
 // user accepts promo.
 #if BUILDFLAG(ENABLE_DICE_SUPPORT)
diff --git a/chrome/browser/ui/views/frame/browser_view.cc b/chrome/browser/ui/views/frame/browser_view.cc
index dbb3d707..3b8a6b8 100644
--- a/chrome/browser/ui/views/frame/browser_view.cc
+++ b/chrome/browser/ui/views/frame/browser_view.cc
@@ -3287,11 +3287,6 @@
   // Kiosk mode needs the whole screen.
   if (chrome::IsRunningInAppMode())
     return false;
-
-  // In Public Session, always use immersive fullscreen.
-  if (profiles::IsPublicSession())
-    return true;
-
   return url.is_empty();
 #else
   // No immersive except in Chrome OS.
diff --git a/chrome/browser/ui/views/omnibox/omnibox_suggestion_button_row_view.cc b/chrome/browser/ui/views/omnibox/omnibox_suggestion_button_row_view.cc
index 01d4982..c15101f 100644
--- a/chrome/browser/ui/views/omnibox/omnibox_suggestion_button_row_view.cc
+++ b/chrome/browser/ui/views/omnibox/omnibox_suggestion_button_row_view.cc
@@ -29,6 +29,7 @@
 #include "ui/views/controls/focus_ring.h"
 #include "ui/views/controls/highlight_path_generator.h"
 #include "ui/views/layout/flex_layout.h"
+#include "ui/views/painter.h"
 #include "ui/views/view_class_properties.h"
 
 class OmniboxSuggestionRowButton : public views::MdTextButton {
@@ -81,12 +82,30 @@
 
   void OnThemeChanged() override {
     MdTextButton::OnThemeChanged();
-    SkColor color =
+    // We can't use colors from NativeTheme as the omnibox theme might be
+    // different (for example, if the NTP colors are customized).
+    SkColor icon_color =
         GetOmniboxColor(GetThemeProvider(), OmniboxPart::RESULTS_ICON,
                         OmniboxPartState::NORMAL);
     SetImage(views::Button::STATE_NORMAL,
              gfx::CreateVectorIcon(
-                 icon_, GetLayoutConstant(LOCATION_BAR_ICON_SIZE), color));
+                 icon_, GetLayoutConstant(LOCATION_BAR_ICON_SIZE), icon_color));
+    SetEnabledTextColors(GetOmniboxColor(GetThemeProvider(),
+                                         OmniboxPart::RESULTS_TEXT_DEFAULT,
+                                         OmniboxPartState::NORMAL));
+  }
+
+  void UpdateBackgroundColor() override {
+    // See comment in OnThemeChanged.
+    SkColor stroke_color =
+        GetOmniboxColor(GetThemeProvider(), OmniboxPart::RESULTS_BACKGROUND,
+                        OmniboxPartState::SELECTED);
+    SkColor bg_color =
+        GetOmniboxColor(GetThemeProvider(), OmniboxPart::RESULTS_BACKGROUND,
+                        OmniboxPartState::NORMAL);
+    SetBackground(CreateBackgroundFromPainter(
+        views::Painter::CreateRoundRectWith1PxBorderPainter(
+            bg_color, stroke_color, GetCornerRadius())));
   }
 
   void GetAccessibleNodeData(ui::AXNodeData* node_data) override {
diff --git a/chrome/browser/ui/views/overlay/back_to_tab_image_button.cc b/chrome/browser/ui/views/overlay/back_to_tab_image_button.cc
index 8e4deaf..8c1466f 100644
--- a/chrome/browser/ui/views/overlay/back_to_tab_image_button.cc
+++ b/chrome/browser/ui/views/overlay/back_to_tab_image_button.cc
@@ -21,8 +21,8 @@
 
 namespace views {
 
-BackToTabImageButton::BackToTabImageButton(ButtonListener* listener)
-    : ImageButton(listener) {
+BackToTabImageButton::BackToTabImageButton(PressedCallback callback)
+    : ImageButton(std::move(callback)) {
   SetImageHorizontalAlignment(views::ImageButton::ALIGN_CENTER);
   SetImageVerticalAlignment(views::ImageButton::ALIGN_MIDDLE);
   SetImage(views::Button::STATE_NORMAL,
diff --git a/chrome/browser/ui/views/overlay/back_to_tab_image_button.h b/chrome/browser/ui/views/overlay/back_to_tab_image_button.h
index aacaeb3..9b75425b 100644
--- a/chrome/browser/ui/views/overlay/back_to_tab_image_button.h
+++ b/chrome/browser/ui/views/overlay/back_to_tab_image_button.h
@@ -13,7 +13,7 @@
 // An image button representing a back-to-tab button.
 class BackToTabImageButton : public views::ImageButton {
  public:
-  explicit BackToTabImageButton(ButtonListener*);
+  explicit BackToTabImageButton(PressedCallback callback);
   ~BackToTabImageButton() override = default;
 
  private:
diff --git a/chrome/browser/ui/views/overlay/close_image_button.cc b/chrome/browser/ui/views/overlay/close_image_button.cc
index e9b64a8..f35abd0 100644
--- a/chrome/browser/ui/views/overlay/close_image_button.cc
+++ b/chrome/browser/ui/views/overlay/close_image_button.cc
@@ -22,8 +22,8 @@
 
 namespace views {
 
-CloseImageButton::CloseImageButton(ButtonListener* listener)
-    : ImageButton(listener) {
+CloseImageButton::CloseImageButton(PressedCallback callback)
+    : ImageButton(std::move(callback)) {
   SetImageHorizontalAlignment(views::ImageButton::ALIGN_CENTER);
   SetImageVerticalAlignment(views::ImageButton::ALIGN_MIDDLE);
   SetSize(gfx::Size(kCloseButtonSize, kCloseButtonSize));
diff --git a/chrome/browser/ui/views/overlay/close_image_button.h b/chrome/browser/ui/views/overlay/close_image_button.h
index 887f272b..396134c 100644
--- a/chrome/browser/ui/views/overlay/close_image_button.h
+++ b/chrome/browser/ui/views/overlay/close_image_button.h
@@ -13,7 +13,7 @@
 // An image button representing a close button.
 class CloseImageButton : public views::ImageButton {
  public:
-  explicit CloseImageButton(ButtonListener*);
+  explicit CloseImageButton(PressedCallback callback);
   ~CloseImageButton() override = default;
 
   // Sets the position of itself with an offset from the given window size.
diff --git a/chrome/browser/ui/views/overlay/overlay_window_views.cc b/chrome/browser/ui/views/overlay/overlay_window_views.cc
index b7a09819..c2a8d15 100644
--- a/chrome/browser/ui/views/overlay/overlay_window_views.cc
+++ b/chrome/browser/ui/views/overlay/overlay_window_views.cc
@@ -349,22 +349,57 @@
   auto window_background_view = std::make_unique<views::View>();
   auto video_view = std::make_unique<views::View>();
   auto controls_scrim_view = std::make_unique<views::View>();
-  auto close_controls_view = std::make_unique<views::CloseImageButton>(this);
+  auto close_controls_view =
+      std::make_unique<views::CloseImageButton>(base::BindRepeating(
+          [](OverlayWindowViews* overlay) {
+            overlay->controller_->Close(/*should_pause_video=*/true);
+            overlay->RecordButtonPressed(OverlayWindowControl::kClose);
+          },
+          base::Unretained(this)));
   auto back_to_tab_controls_view =
-      std::make_unique<views::BackToTabImageButton>(this);
+      std::make_unique<views::BackToTabImageButton>(base::BindRepeating(
+          [](OverlayWindowViews* overlay) {
+            overlay->controller_->CloseAndFocusInitiator();
+            overlay->RecordButtonPressed(OverlayWindowControl::kBackToTab);
+          },
+          base::Unretained(this)));
   auto previous_track_controls_view = std::make_unique<views::TrackImageButton>(
-      this, vector_icons::kMediaPreviousTrackIcon,
+      base::BindRepeating(
+          [](OverlayWindowViews* overlay) {
+            overlay->controller_->PreviousTrack();
+            overlay->RecordButtonPressed(OverlayWindowControl::kPreviousTrack);
+          },
+          base::Unretained(this)),
+      vector_icons::kMediaPreviousTrackIcon,
       l10n_util::GetStringUTF16(
           IDS_PICTURE_IN_PICTURE_PREVIOUS_TRACK_CONTROL_ACCESSIBLE_TEXT));
   auto play_pause_controls_view =
-      std::make_unique<views::PlaybackImageButton>(this);
+      std::make_unique<views::PlaybackImageButton>(base::BindRepeating(
+          [](OverlayWindowViews* overlay) {
+            overlay->TogglePlayPause();
+            overlay->RecordButtonPressed(OverlayWindowControl::kPlayPause);
+          },
+          base::Unretained(this)));
   auto next_track_controls_view = std::make_unique<views::TrackImageButton>(
-      this, vector_icons::kMediaNextTrackIcon,
+      base::BindRepeating(
+          [](OverlayWindowViews* overlay) {
+            overlay->controller_->NextTrack();
+            overlay->RecordButtonPressed(OverlayWindowControl::kNextTrack);
+          },
+          base::Unretained(this)),
+      vector_icons::kMediaNextTrackIcon,
       l10n_util::GetStringUTF16(
           IDS_PICTURE_IN_PICTURE_NEXT_TRACK_CONTROL_ACCESSIBLE_TEXT));
-  auto skip_ad_controls_view = std::make_unique<views::SkipAdLabelButton>(this);
+  auto skip_ad_controls_view =
+      std::make_unique<views::SkipAdLabelButton>(base::BindRepeating(
+          [](OverlayWindowViews* overlay) {
+            overlay->controller_->SkipAd();
+            overlay->RecordButtonPressed(OverlayWindowControl::kSkipAd);
+          },
+          base::Unretained(this)));
 #if defined(OS_CHROMEOS)
-  auto resize_handle_view = std::make_unique<views::ResizeHandleButton>(this);
+  auto resize_handle_view = std::make_unique<views::ResizeHandleButton>(
+      views::Button::PressedCallback());
 #endif
 
   window_background_view->SetPaintToLayer(ui::LAYER_SOLID_COLOR);
@@ -940,39 +975,6 @@
   }
 }
 
-void OverlayWindowViews::ButtonPressed(views::Button* sender,
-                                       const ui::Event& event) {
-  if (sender == back_to_tab_controls_view_) {
-    controller_->CloseAndFocusInitiator();
-    RecordButtonPressed(OverlayWindowControl::kBackToTab);
-  }
-
-  if (sender == skip_ad_controls_view_) {
-    controller_->SkipAd();
-    RecordButtonPressed(OverlayWindowControl::kSkipAd);
-  }
-
-  if (sender == close_controls_view_) {
-    controller_->Close(true /* should_pause_video */);
-    RecordButtonPressed(OverlayWindowControl::kClose);
-  }
-
-  if (sender == play_pause_controls_view_) {
-    TogglePlayPause();
-    RecordButtonPressed(OverlayWindowControl::kPlayPause);
-  }
-
-  if (sender == next_track_controls_view_) {
-    controller_->NextTrack();
-    RecordButtonPressed(OverlayWindowControl::kNextTrack);
-  }
-
-  if (sender == previous_track_controls_view_) {
-    controller_->PreviousTrack();
-    RecordButtonPressed(OverlayWindowControl::kPreviousTrack);
-  }
-}
-
 void OverlayWindowViews::RecordTapGesture(OverlayWindowControl window_control) {
   UMA_HISTOGRAM_ENUMERATION("PictureInPictureWindow.TapGesture",
                             window_control);
diff --git a/chrome/browser/ui/views/overlay/overlay_window_views.h b/chrome/browser/ui/views/overlay/overlay_window_views.h
index 459a85d..00757ca 100644
--- a/chrome/browser/ui/views/overlay/overlay_window_views.h
+++ b/chrome/browser/ui/views/overlay/overlay_window_views.h
@@ -9,7 +9,6 @@
 
 #include "base/timer/timer.h"
 #include "ui/gfx/geometry/size.h"
-#include "ui/views/controls/button/button.h"
 #include "ui/views/widget/widget.h"
 
 #if defined(OS_CHROMEOS)
@@ -28,7 +27,6 @@
 // The Chrome desktop implementation of OverlayWindow. This will only be
 // implemented in views, which will support all desktop platforms.
 class OverlayWindowViews : public content::OverlayWindow,
-                           public views::ButtonListener,
                            public views::Widget {
  public:
   static std::unique_ptr<content::OverlayWindow> Create(
@@ -68,9 +66,6 @@
   void OnMouseEvent(ui::MouseEvent* event) override;
   void OnGestureEvent(ui::GestureEvent* event) override;
 
-  // views::ButtonListener:
-  void ButtonPressed(views::Button* sender, const ui::Event& event) override;
-
   // Gets the bounds of the controls.
   gfx::Rect GetBackToTabControlsBounds();
   gfx::Rect GetSkipAdControlsBounds();
diff --git a/chrome/browser/ui/views/overlay/playback_image_button.cc b/chrome/browser/ui/views/overlay/playback_image_button.cc
index d9e5174e..5f90df7 100644
--- a/chrome/browser/ui/views/overlay/playback_image_button.cc
+++ b/chrome/browser/ui/views/overlay/playback_image_button.cc
@@ -20,8 +20,8 @@
 
 namespace views {
 
-PlaybackImageButton::PlaybackImageButton(ButtonListener* listener)
-    : ImageButton(listener) {
+PlaybackImageButton::PlaybackImageButton(PressedCallback callback)
+    : ImageButton(std::move(callback)) {
   SetImageHorizontalAlignment(views::ImageButton::ALIGN_CENTER);
   SetImageVerticalAlignment(views::ImageButton::ALIGN_MIDDLE);
 
diff --git a/chrome/browser/ui/views/overlay/playback_image_button.h b/chrome/browser/ui/views/overlay/playback_image_button.h
index 5a43fe62..70b83af2 100644
--- a/chrome/browser/ui/views/overlay/playback_image_button.h
+++ b/chrome/browser/ui/views/overlay/playback_image_button.h
@@ -13,7 +13,7 @@
 // A resizable playback button with 3 states: play/pause/replay.
 class PlaybackImageButton : public views::ImageButton {
  public:
-  explicit PlaybackImageButton(ButtonListener*);
+  explicit PlaybackImageButton(PressedCallback callback);
   ~PlaybackImageButton() override = default;
 
   // Show appropriate images based on playback state.
diff --git a/chrome/browser/ui/views/overlay/resize_handle_button.cc b/chrome/browser/ui/views/overlay/resize_handle_button.cc
index aeba6fb..583900afa7 100644
--- a/chrome/browser/ui/views/overlay/resize_handle_button.cc
+++ b/chrome/browser/ui/views/overlay/resize_handle_button.cc
@@ -26,8 +26,8 @@
 
 namespace views {
 
-ResizeHandleButton::ResizeHandleButton(ButtonListener* listener)
-    : ImageButton(listener) {
+ResizeHandleButton::ResizeHandleButton(PressedCallback callback)
+    : ImageButton(std::move(callback)) {
   SetSize(gfx::Size(kResizeHandleButtonSize, kResizeHandleButtonSize));
   SetImageForQuadrant(OverlayWindowViews::WindowQuadrant::kBottomRight);
 
diff --git a/chrome/browser/ui/views/overlay/resize_handle_button.h b/chrome/browser/ui/views/overlay/resize_handle_button.h
index f37cf478..3e4b9c3 100644
--- a/chrome/browser/ui/views/overlay/resize_handle_button.h
+++ b/chrome/browser/ui/views/overlay/resize_handle_button.h
@@ -13,7 +13,7 @@
 // An image button representing a white resize handle affordance.
 class ResizeHandleButton : public views::ImageButton {
  public:
-  explicit ResizeHandleButton(ButtonListener*);
+  explicit ResizeHandleButton(PressedCallback callback);
   ~ResizeHandleButton() override;
 
   void SetPosition(const gfx::Size& size,
diff --git a/chrome/browser/ui/views/overlay/skip_ad_label_button.cc b/chrome/browser/ui/views/overlay/skip_ad_label_button.cc
index da780c96..cda0a75 100644
--- a/chrome/browser/ui/views/overlay/skip_ad_label_button.cc
+++ b/chrome/browser/ui/views/overlay/skip_ad_label_button.cc
@@ -23,8 +23,8 @@
 
 namespace views {
 
-SkipAdLabelButton::SkipAdLabelButton(ButtonListener* listener)
-    : LabelButton(listener,
+SkipAdLabelButton::SkipAdLabelButton(PressedCallback callback)
+    : LabelButton(std::move(callback),
                   l10n_util::GetStringUTF16(
                       IDS_PICTURE_IN_PICTURE_SKIP_AD_CONTROL_TEXT)) {
   SetBackground(
diff --git a/chrome/browser/ui/views/overlay/skip_ad_label_button.h b/chrome/browser/ui/views/overlay/skip_ad_label_button.h
index 91128c0..386455a3 100644
--- a/chrome/browser/ui/views/overlay/skip_ad_label_button.h
+++ b/chrome/browser/ui/views/overlay/skip_ad_label_button.h
@@ -13,7 +13,7 @@
 // A label button representing a skip-ad button.
 class SkipAdLabelButton : public views::LabelButton {
  public:
-  explicit SkipAdLabelButton(ButtonListener*);
+  explicit SkipAdLabelButton(PressedCallback callback);
   ~SkipAdLabelButton() override = default;
 
   // Sets the position of itself with an offset from the given window size.
diff --git a/chrome/browser/ui/views/overlay/track_image_button.cc b/chrome/browser/ui/views/overlay/track_image_button.cc
index 8f42277..3390876f 100644
--- a/chrome/browser/ui/views/overlay/track_image_button.cc
+++ b/chrome/browser/ui/views/overlay/track_image_button.cc
@@ -22,10 +22,10 @@
 
 namespace views {
 
-TrackImageButton::TrackImageButton(ButtonListener* listener,
+TrackImageButton::TrackImageButton(PressedCallback callback,
                                    const gfx::VectorIcon& icon,
                                    base::string16 label)
-    : ImageButton(listener),
+    : ImageButton(std::move(callback)),
       image_(gfx::CreateVectorIcon(icon, kTrackImageSize, kTrackIconColor)) {
   SetImageHorizontalAlignment(views::ImageButton::ALIGN_CENTER);
   SetImageVerticalAlignment(views::ImageButton::ALIGN_MIDDLE);
diff --git a/chrome/browser/ui/views/overlay/track_image_button.h b/chrome/browser/ui/views/overlay/track_image_button.h
index 95067ad..293a952 100644
--- a/chrome/browser/ui/views/overlay/track_image_button.h
+++ b/chrome/browser/ui/views/overlay/track_image_button.h
@@ -17,7 +17,7 @@
 // A resizable previous/next track image button.
 class TrackImageButton : public views::ImageButton {
  public:
-  explicit TrackImageButton(ButtonListener*,
+  explicit TrackImageButton(PressedCallback callback,
                             const gfx::VectorIcon& icon,
                             base::string16 label);
   ~TrackImageButton() override = default;
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 8694e2e8..0647ffae 100644
--- a/chrome/browser/ui/views/profiles/profile_menu_view_browsertest.cc
+++ b/chrome/browser/ui/views/profiles/profile_menu_view_browsertest.cc
@@ -869,5 +869,5 @@
   histogram_tester_.ExpectUniqueSample(
       "Profile.Menu.ClickedActionableItem",
       ProfileMenuViewBase::ActionableItem::kOtherProfileButton,
-      /*count=*/1);
+      /*expected_count=*/1);
 }
diff --git a/chrome/browser/ui/views/translate/translate_bubble_view_browsertest.cc b/chrome/browser/ui/views/translate/translate_bubble_view_browsertest.cc
index ea3aeb6..a1f5484 100644
--- a/chrome/browser/ui/views/translate/translate_bubble_view_browsertest.cc
+++ b/chrome/browser/ui/views/translate/translate_bubble_view_browsertest.cc
@@ -28,6 +28,7 @@
 #include "ui/base/ui_base_features.h"
 #include "ui/events/keycodes/dom/dom_code.h"
 #include "ui/views/controls/button/menu_button.h"
+#include "ui/views/test/ax_event_counter.h"
 
 namespace translate {
 
@@ -131,4 +132,16 @@
                            false);
 }
 
+IN_PROC_BROWSER_TEST_F(TranslateBubbleViewBrowserTest, AlertAccessibleEvent) {
+  views::test::AXEventCounter counter(views::AXEventManager::Get());
+  EXPECT_EQ(0, counter.GetCount(ax::mojom::Event::kAlert));
+
+  GURL french_url = ui_test_utils::GetTestUrl(
+      base::FilePath(), base::FilePath(FILE_PATH_LITERAL("french_page.html")));
+  NavigateAndWaitForLanguageDetection(french_url, "fr");
+
+  // TODO(crbug.com/1082217): This should produce one event instead of two.
+  EXPECT_LT(0, counter.GetCount(ax::mojom::Event::kAlert));
+}
+
 }  // namespace translate
diff --git a/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc
index e8eaa250..7b11675 100644
--- a/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc
@@ -211,6 +211,18 @@
     params->SetString("flow", "nosignup");
 }
 
+bool ShouldCheckUserTypeBeforeAllowing() {
+  if (!chromeos::features::IsFamilyLinkOnSchoolDeviceEnabled())
+    return false;
+
+  CrosSettings* cros_settings = CrosSettings::Get();
+  bool family_link_allowed = false;
+  cros_settings->GetBoolean(kAccountsPrefFamilyLinkAccountsAllowed,
+                            &family_link_allowed);
+
+  return family_link_allowed;
+}
+
 void RecordSAMLScrapingVerificationResultInHistogram(bool success) {
   UMA_HISTOGRAM_BOOLEAN("ChromeOS.SAML.Scraping.VerificationResult", success);
 }
@@ -629,6 +641,8 @@
   builder->Add("allowlistErrorConsumer", IDS_LOGIN_ERROR_ALLOWLIST);
   builder->Add("allowlistErrorEnterprise",
                IDS_ENTERPRISE_LOGIN_ERROR_ALLOWLIST);
+  builder->Add("allowlistErrorEnterpriseAndFamilyLink",
+               IDS_ENTERPRISE_AND_FAMILY_LINK_LOGIN_ERROR_ALLOWLIST);
   builder->Add("tryAgainButton", IDS_ALLOWLIST_ERROR_TRY_AGAIN_BUTTON);
   builder->Add("learnMoreButton", IDS_LEARN_MORE);
   builder->Add("gaiaLoading", IDS_LOGIN_GAIA_LOADING_MESSAGE);
@@ -763,10 +777,16 @@
 }
 
 void GaiaScreenHandler::HandleIdentifierEntered(const std::string& user_email) {
+  // We cannot tell a user type from the identifier, so we delay checking if
+  // the account should be allowed.
+  if (ShouldCheckUserTypeBeforeAllowing())
+    return;
+
   if (LoginDisplayHost::default_host() &&
       !LoginDisplayHost::default_host()->IsUserAllowlisted(
           user_manager::known_user::GetAccountId(
-              user_email, std::string() /* id */, AccountType::UNKNOWN))) {
+              user_email, std::string() /* id */, AccountType::UNKNOWN),
+          base::nullopt)) {
     ShowAllowlistCheckFailedError();
   }
 }
@@ -841,6 +861,17 @@
 
   DCHECK(!email.empty());
   DCHECK(!gaia_id.empty());
+
+  // Execute delayed allowlist check that is based on user type.
+  const user_manager::UserType user_type =
+      GetUsertypeFromServicesString(services);
+  if (ShouldCheckUserTypeBeforeAllowing() &&
+      !LoginDisplayHost::default_host()->IsUserAllowlisted(
+          GetAccountId(email, gaia_id, AccountType::GOOGLE), user_type)) {
+    ShowAllowlistCheckFailedError();
+    return;
+  }
+
   const std::string sanitized_email = gaia::SanitizeEmail(email);
   LoginDisplayHost::default_host()->SetDisplayEmail(sanitized_email);
 
@@ -1443,6 +1474,12 @@
                     g_browser_process->platform_part()
                         ->browser_policy_connector_chromeos()
                         ->IsEnterpriseManaged());
+
+  bool family_link_allowed = false;
+  CrosSettings::Get()->GetBoolean(kAccountsPrefFamilyLinkAccountsAllowed,
+                                  &family_link_allowed);
+  params.SetBoolean("familyLinkAllowed", family_link_allowed);
+
   CallJS("login.GaiaSigninScreen.showAllowlistCheckFailedError", true, params);
 }
 
diff --git a/chrome/browser/ui/webui/profile_helper_browsertest.cc b/chrome/browser/ui/webui/profile_helper_browsertest.cc
index dffb6c1..c490603 100644
--- a/chrome/browser/ui/webui/profile_helper_browsertest.cc
+++ b/chrome/browser/ui/webui/profile_helper_browsertest.cc
@@ -154,17 +154,13 @@
 #endif
 }
 
-// Test is flaky on Lacros. crbug.com/1130131
-#if defined(OS_LINUX) || defined(OS_CHROMEOS)
-#define MAYBE_DeleteSoleProfile DISABLED_DeleteSoleProfile
-#else
-#define MAYBE_DeleteSoleProfile DeleteSoleProfile
-#endif
-IN_PROC_BROWSER_TEST_F(ProfileHelperTest, MAYBE_DeleteSoleProfile) {
+IN_PROC_BROWSER_TEST_F(ProfileHelperTest, DeleteSoleProfile) {
   content::TestWebUI web_ui;
   Browser* original_browser = browser();
   ProfileAttributesStorage& storage =
       g_browser_process->profile_manager()->GetProfileAttributesStorage();
+  base::FilePath original_browser_profile_path =
+      original_browser->profile()->GetPath();
 
   BrowserList* browser_list = BrowserList::GetInstance();
   EXPECT_EQ(1u, browser_list->size());
@@ -179,8 +175,13 @@
   Browser* new_browser = added_observer.Wait();
 
   EXPECT_EQ(1u, browser_list->size());
+  // On Lacros, the pointer to the new browser may be the same as the old one.
+  // https://crbug.com/1130131
+#if !defined(OS_CHROMEOS) || !defined(OS_LINUX)
   EXPECT_FALSE(base::Contains(*browser_list, original_browser));
   EXPECT_NE(new_browser, original_browser);
+#endif
+  EXPECT_NE(original_browser_profile_path, new_browser->profile()->GetPath());
   EXPECT_EQ(1u, storage.GetNumberOfProfiles());
 }
 
diff --git a/chrome/browser/ui/webui/settings/settings_ui.cc b/chrome/browser/ui/webui/settings/settings_ui.cc
index 8b1133c..220cc6d 100644
--- a/chrome/browser/ui/webui/settings/settings_ui.cc
+++ b/chrome/browser/ui/webui/settings/settings_ui.cc
@@ -138,7 +138,7 @@
 
 #if !BUILDFLAG(OPTIMIZE_WEBUI)
 constexpr char kGeneratedPath[] =
-    "@out_folder@/gen/chrome/browser/resources/settings/";
+    "@out_folder@/gen/chrome/browser/resources/settings/preprocessed/";
 #endif
 
 // static
diff --git a/chrome/browser/video_tutorials/android/java/src/org/chromium/chrome/browser/video_tutorials/iph/VideoTutorialIPHUtils.java b/chrome/browser/video_tutorials/android/java/src/org/chromium/chrome/browser/video_tutorials/iph/VideoTutorialIPHUtils.java
index d9d514f..7e75a702 100644
--- a/chrome/browser/video_tutorials/android/java/src/org/chromium/chrome/browser/video_tutorials/iph/VideoTutorialIPHUtils.java
+++ b/chrome/browser/video_tutorials/android/java/src/org/chromium/chrome/browser/video_tutorials/iph/VideoTutorialIPHUtils.java
@@ -81,15 +81,4 @@
         }
     }
 
-    /** @return The text used to show the video length on the IPH card. */
-    public static String getVideoLengthString(int videoLength) {
-        int minutes = videoLength / 60;
-        int seconds = videoLength % 60;
-
-        StringBuilder builder = new StringBuilder();
-        builder.append(minutes);
-        builder.append(":");
-        builder.append(seconds);
-        return builder.toString();
-    }
 }
diff --git a/chrome/browser/video_tutorials/android/java/src/org/chromium/chrome/browser/video_tutorials/test/TestVideoTutorialService.java b/chrome/browser/video_tutorials/android/java/src/org/chromium/chrome/browser/video_tutorials/test/TestVideoTutorialService.java
index ed9d72de..82599bd 100644
--- a/chrome/browser/video_tutorials/android/java/src/org/chromium/chrome/browser/video_tutorials/test/TestVideoTutorialService.java
+++ b/chrome/browser/video_tutorials/android/java/src/org/chromium/chrome/browser/video_tutorials/test/TestVideoTutorialService.java
@@ -65,6 +65,11 @@
     }
 
     private void initializeTutorialList() {
+        mTutorials.add(new Tutorial(FeatureType.CHROME_INTRO, "Introduction to chrome",
+                "https://storage.googleapis.com/stock-wizard.appspot.com/portrait.jpg",
+                "https://storage.googleapis.com/stock-wizard.appspot.com/portrait.jpg",
+                "caption url", "share url", 25));
+
         mTutorials.add(new Tutorial(FeatureType.DOWNLOAD,
                 "How to use Google Chrome's download functionality",
                 "https://storage.googleapis.com/stock-wizard.appspot.com/portrait.jpg",
diff --git a/chrome/browser/video_tutorials/internal/android/java/src/org/chromium/chrome/browser/video_tutorials/VideoTutorialUtils.java b/chrome/browser/video_tutorials/internal/android/java/src/org/chromium/chrome/browser/video_tutorials/VideoTutorialUtils.java
index 72932af..78c2dfeb 100644
--- a/chrome/browser/video_tutorials/internal/android/java/src/org/chromium/chrome/browser/video_tutorials/VideoTutorialUtils.java
+++ b/chrome/browser/video_tutorials/internal/android/java/src/org/chromium/chrome/browser/video_tutorials/VideoTutorialUtils.java
@@ -7,12 +7,30 @@
 import org.chromium.base.Callback;
 
 import java.util.List;
+import java.util.Locale;
 
 /**
  * Handles various feature utility functions associated with video tutorials UI.
  */
 public class VideoTutorialUtils {
     /**
+     * Converts a duration string in ms to a human-readable form.
+     * @param videoLengthSeconds The video length in seconds.
+     * @return The video length in human-readable form.
+     */
+    public static String getVideoLengthString(int videoLengthSeconds) {
+        int hours = videoLengthSeconds / 3600;
+        int minutes = (videoLengthSeconds / 60) % 60;
+        int seconds = videoLengthSeconds % 60;
+
+        if (hours > 0) {
+            return String.format(Locale.US, "%d:%02d:%02d", hours, minutes, seconds);
+        } else {
+            return String.format(Locale.US, "%d:%02d", minutes, seconds);
+        }
+    }
+
+    /**
      * Finds the next video tutorial to be presented to the user after the user has completed one.
      */
     public static void getNextTutorial(VideoTutorialService videoTutorialService, Tutorial tutorial,
diff --git a/chrome/browser/video_tutorials/internal/android/java/src/org/chromium/chrome/browser/video_tutorials/iph/VideoIPHCoordinatorImpl.java b/chrome/browser/video_tutorials/internal/android/java/src/org/chromium/chrome/browser/video_tutorials/iph/VideoIPHCoordinatorImpl.java
index 031e8fc..a840685 100644
--- a/chrome/browser/video_tutorials/internal/android/java/src/org/chromium/chrome/browser/video_tutorials/iph/VideoIPHCoordinatorImpl.java
+++ b/chrome/browser/video_tutorials/internal/android/java/src/org/chromium/chrome/browser/video_tutorials/iph/VideoIPHCoordinatorImpl.java
@@ -12,6 +12,7 @@
 import org.chromium.base.Callback;
 import org.chromium.chrome.browser.image_fetcher.ImageFetcher;
 import org.chromium.chrome.browser.video_tutorials.Tutorial;
+import org.chromium.chrome.browser.video_tutorials.VideoTutorialUtils;
 import org.chromium.ui.modelutil.PropertyModel;
 import org.chromium.ui.modelutil.PropertyModelChangeProcessor;
 
@@ -51,7 +52,7 @@
         mModel.set(VideoIPHProperties.VISIBILITY, true);
         mModel.set(VideoIPHProperties.DISPLAY_TITLE, tutorial.displayTitle);
         mModel.set(VideoIPHProperties.VIDEO_LENGTH,
-                VideoTutorialIPHUtils.getVideoLengthString(tutorial.videoLength));
+                VideoTutorialUtils.getVideoLengthString(tutorial.videoLength));
         mModel.set(VideoIPHProperties.CLICK_LISTENER, () -> mOnClickListener.onResult(tutorial));
         mModel.set(
                 VideoIPHProperties.DISMISS_LISTENER, () -> mOnDismissListener.onResult(tutorial));
diff --git a/chrome/browser/video_tutorials/internal/android/java/src/org/chromium/chrome/browser/video_tutorials/list/TutorialListCoordinatorTest.java b/chrome/browser/video_tutorials/internal/android/java/src/org/chromium/chrome/browser/video_tutorials/list/TutorialListCoordinatorTest.java
index a8db226..484b47519 100644
--- a/chrome/browser/video_tutorials/internal/android/java/src/org/chromium/chrome/browser/video_tutorials/list/TutorialListCoordinatorTest.java
+++ b/chrome/browser/video_tutorials/internal/android/java/src/org/chromium/chrome/browser/video_tutorials/list/TutorialListCoordinatorTest.java
@@ -32,6 +32,7 @@
 import org.chromium.base.Callback;
 import org.chromium.chrome.browser.video_tutorials.R;
 import org.chromium.chrome.browser.video_tutorials.Tutorial;
+import org.chromium.chrome.browser.video_tutorials.VideoTutorialUtils;
 import org.chromium.chrome.browser.video_tutorials.test.TestImageFetcher;
 import org.chromium.chrome.browser.video_tutorials.test.TestVideoTutorialService;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
@@ -81,7 +82,8 @@
     public void testShowList() {
         Tutorial tutorial = mTestVideoTutorialService.getTestTutorials().get(0);
         onView(withText(tutorial.displayTitle)).check(matches(isDisplayed()));
-        onView(withText("0:35")).check(matches(isDisplayed()));
+        onView(withText(VideoTutorialUtils.getVideoLengthString(tutorial.videoLength)))
+                .check(matches(isDisplayed()));
         onView(withText(tutorial.displayTitle)).perform(ViewActions.click());
         Mockito.verify(mClickCallback).onResult(tutorial);
     }
diff --git a/chrome/browser/video_tutorials/internal/android/java/src/org/chromium/chrome/browser/video_tutorials/list/TutorialListMediator.java b/chrome/browser/video_tutorials/internal/android/java/src/org/chromium/chrome/browser/video_tutorials/list/TutorialListMediator.java
index dc124c11..bc5b9ee 100644
--- a/chrome/browser/video_tutorials/internal/android/java/src/org/chromium/chrome/browser/video_tutorials/list/TutorialListMediator.java
+++ b/chrome/browser/video_tutorials/internal/android/java/src/org/chromium/chrome/browser/video_tutorials/list/TutorialListMediator.java
@@ -12,7 +12,7 @@
 import org.chromium.chrome.browser.image_fetcher.ImageFetcher;
 import org.chromium.chrome.browser.video_tutorials.Tutorial;
 import org.chromium.chrome.browser.video_tutorials.VideoTutorialService;
-import org.chromium.chrome.browser.video_tutorials.iph.VideoTutorialIPHUtils;
+import org.chromium.chrome.browser.video_tutorials.VideoTutorialUtils;
 import org.chromium.ui.modelutil.MVCListAdapter;
 import org.chromium.ui.modelutil.MVCListAdapter.ListItem;
 import org.chromium.ui.modelutil.PropertyModel;
@@ -59,7 +59,7 @@
                 new PropertyModel.Builder(TutorialCardProperties.ALL_KEYS)
                         .with(TutorialCardProperties.TITLE, tutorial.displayTitle)
                         .with(TutorialCardProperties.VIDEO_LENGTH,
-                                VideoTutorialIPHUtils.getVideoLengthString(tutorial.videoLength))
+                                VideoTutorialUtils.getVideoLengthString(tutorial.videoLength))
                         .with(TutorialCardProperties.CLICK_CALLBACK,
                                 () -> mClickCallback.onResult(tutorial));
 
diff --git a/chrome/browser/video_tutorials/internal/android/java/src/org/chromium/chrome/browser/video_tutorials/player/VideoPlayerMediatorUnitTest.java b/chrome/browser/video_tutorials/internal/android/java/src/org/chromium/chrome/browser/video_tutorials/player/VideoPlayerMediatorUnitTest.java
index b5ea618..71a1d4c 100644
--- a/chrome/browser/video_tutorials/internal/android/java/src/org/chromium/chrome/browser/video_tutorials/player/VideoPlayerMediatorUnitTest.java
+++ b/chrome/browser/video_tutorials/internal/android/java/src/org/chromium/chrome/browser/video_tutorials/player/VideoPlayerMediatorUnitTest.java
@@ -23,6 +23,7 @@
 import org.chromium.base.metrics.test.ShadowRecordHistogram;
 import org.chromium.base.test.BaseRobolectricTestRunner;
 import org.chromium.chrome.browser.video_tutorials.Tutorial;
+import org.chromium.chrome.browser.video_tutorials.VideoTutorialUtils;
 import org.chromium.chrome.browser.video_tutorials.languages.LanguagePickerCoordinator;
 import org.chromium.chrome.browser.video_tutorials.test.TestVideoTutorialService;
 import org.chromium.content_public.browser.NavigationController;
@@ -132,4 +133,14 @@
         assertThat(mModel.get(VideoPlayerProperties.SHOW_WATCH_NEXT), equalTo(true));
         assertThat(mModel.get(VideoPlayerProperties.SHOW_CHANGE_LANGUAGE), equalTo(true));
     }
+
+    @Test
+    public void testVideoLengthString() {
+        assertThat(VideoTutorialUtils.getVideoLengthString(0), equalTo("0:00"));
+        assertThat(VideoTutorialUtils.getVideoLengthString(5), equalTo("0:05"));
+        assertThat(VideoTutorialUtils.getVideoLengthString(55), equalTo("0:55"));
+        assertThat(VideoTutorialUtils.getVideoLengthString(70), equalTo("1:10"));
+        assertThat(VideoTutorialUtils.getVideoLengthString(1200), equalTo("20:00"));
+        assertThat(VideoTutorialUtils.getVideoLengthString(3615), equalTo("1:00:15"));
+    }
 }
diff --git a/chrome/browser/web_applications/web_app_install_task.cc b/chrome/browser/web_applications/web_app_install_task.cc
index 2527101..13aeddd 100644
--- a/chrome/browser/web_applications/web_app_install_task.cc
+++ b/chrome/browser/web_applications/web_app_install_task.cc
@@ -254,7 +254,7 @@
 
   data_retriever_->GetIcons(
       web_contents, std::move(icon_urls),
-      /*skip_page_fav_icons=*/true, WebAppIconDownloader::Histogram::kForUpdate,
+      /*skip_page_favicons=*/true, WebAppIconDownloader::Histogram::kForUpdate,
       base::BindOnce(&WebAppInstallTask::OnIconsRetrievedFinalizeUpdate,
                      base::Unretained(this), std::move(web_application_info)));
 }
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt
index 3d59c9e..175d7398 100644
--- a/chrome/build/linux.pgo.txt
+++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@
-chrome-linux-master-1602201537-8720b3c79a1854f8e56100a84c355502c0dbbf4a.profdata
+chrome-linux-master-1602244639-8a31cdfac3c26c19c9de644309ff096c0a612320.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt
index 61cf2cd..78b82f0 100644
--- a/chrome/build/mac.pgo.txt
+++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@
-chrome-mac-master-1602201537-11aed398f2fb6b4c095a189eb8886f38c679c48f.profdata
+chrome-mac-master-1602244639-6cd23926ee4e898bd11627c63cc4edf5ffd59847.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt
index 18db2c6..c5cc205 100644
--- a/chrome/build/win32.pgo.txt
+++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@
-chrome-win32-master-1602179909-b26649051a7d8d0314e04dcc1e82c76ad349e786.profdata
+chrome-win32-master-1602201537-a14eb3c04e9257cb13970f54aebda7b1af96d2f4.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt
index 003c4f0..519d88a 100644
--- a/chrome/build/win64.pgo.txt
+++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@
-chrome-win64-master-1602179909-18dbc89acedf4f15864b841a6fe7487536bbc059.profdata
+chrome-win64-master-1602212356-910f3b9c14ad8fb9eb002bc49aff02d2bc68cf6f.profdata
diff --git a/chrome/common/sync_encryption_keys_extension.mojom b/chrome/common/sync_encryption_keys_extension.mojom
index d8a167e..f87a575e 100644
--- a/chrome/common/sync_encryption_keys_extension.mojom
+++ b/chrome/common/sync_encryption_keys_extension.mojom
@@ -13,4 +13,8 @@
   // of encryption keys not being needed even prior to this call).
   SetEncryptionKeys(string gaia_id, array<array<uint8>> encryption_keys,
                     int32 last_key_version) => ();
+
+  // Registers a new trusted recovery method that can be used by other clients
+  // to retrieve sync trusted vault encryption keys.
+  AddTrustedRecoveryMethod(string gaia_id, array<uint8> public_key) => ();
 };
diff --git a/chrome/renderer/DEPS b/chrome/renderer/DEPS
index d57c556..5e7c5c4 100644
--- a/chrome/renderer/DEPS
+++ b/chrome/renderer/DEPS
@@ -50,6 +50,7 @@
   "+components/subresource_filter/content/common",
   "+components/subresource_filter/content/renderer",
   "+components/subresource_filter/core/common/common_features.h",
+  "+components/sync/driver/sync_driver_switches.h",
   "+components/sync/engine/sync_engine_switches.h",
   "+components/translate/content/common",
   "+components/translate/content/renderer",
diff --git a/chrome/renderer/sync_encryption_keys_extension.cc b/chrome/renderer/sync_encryption_keys_extension.cc
index a21eb18..899450f 100644
--- a/chrome/renderer/sync_encryption_keys_extension.cc
+++ b/chrome/renderer/sync_encryption_keys_extension.cc
@@ -8,8 +8,11 @@
 #include <vector>
 
 #include "base/bind.h"
+#include "base/feature_list.h"
 #include "base/logging.h"
 #include "base/no_destructor.h"
+#include "base/stl_util.h"
+#include "components/sync/driver/sync_driver_switches.h"
 #include "content/public/common/isolated_world_ids.h"
 #include "content/public/renderer/chrome_object_extensions_utils.h"
 #include "content/public/renderer/render_frame.h"
@@ -97,16 +100,34 @@
 
   v8::Local<v8::Object> chrome =
       content::GetOrCreateChromeObject(isolate, context);
-  v8::Local<v8::Function> function =
-      gin::CreateFunctionTemplate(
-          isolate, base::BindRepeating(
-                       &SyncEncryptionKeysExtension::SetSyncEncryptionKeys,
-                       weak_ptr_factory_.GetWeakPtr()))
-          ->GetFunction(context)
-          .ToLocalChecked();
+
   chrome
-      ->Set(context, gin::StringToSymbol(isolate, "setSyncEncryptionKeys"),
-            function)
+      ->Set(
+          context, gin::StringToSymbol(isolate, "setSyncEncryptionKeys"),
+          gin::CreateFunctionTemplate(
+              isolate, base::BindRepeating(
+                           &SyncEncryptionKeysExtension::SetSyncEncryptionKeys,
+                           weak_ptr_factory_.GetWeakPtr()))
+              ->GetFunction(context)
+              .ToLocalChecked())
+      .Check();
+
+  if (!base::FeatureList::IsEnabled(
+          switches::kSyncSupportTrustedVaultPassphraseRecovery)) {
+    return;
+  }
+
+  chrome
+      ->Set(context,
+            gin::StringToSymbol(isolate,
+                                "addTrustedSyncEncryptionRecoveryMethod"),
+            gin::CreateFunctionTemplate(
+                isolate,
+                base::BindRepeating(&SyncEncryptionKeysExtension::
+                                        AddTrustedSyncEncryptionRecoveryMethod,
+                                    weak_ptr_factory_.GetWeakPtr()))
+                ->GetFunction(context)
+                .ToLocalChecked())
       .Check();
 }
 
@@ -175,6 +196,55 @@
                      std::move(global_callback)));
 }
 
+void SyncEncryptionKeysExtension::AddTrustedSyncEncryptionRecoveryMethod(
+    gin::Arguments* args) {
+  DCHECK(render_frame());
+
+  // This function as exposed to the web has the following signature:
+  //   addTrustedSyncEncryptionRecoveryMethod(callback, gaia_id, public_key)
+  //
+  // Where:
+  //   callback: Allows caller to get notified upon completion.
+  //   gaia_id: String representing the user's server-provided ID.
+  //   public_key: A public key representing the recovery method to be added.
+
+  v8::HandleScope handle_scope(args->isolate());
+
+  v8::Local<v8::Function> callback;
+  if (!args->GetNext(&callback)) {
+    DLOG(ERROR) << "No callback";
+    args->ThrowError();
+    return;
+  }
+
+  std::string gaia_id;
+  if (!args->GetNext(&gaia_id)) {
+    DLOG(ERROR) << "No account ID";
+    args->ThrowError();
+    return;
+  }
+
+  v8::Local<v8::ArrayBuffer> public_key;
+  if (!args->GetNext(&public_key)) {
+    DLOG(ERROR) << "No public key";
+    args->ThrowError();
+    return;
+  }
+
+  auto global_callback =
+      std::make_unique<v8::Global<v8::Function>>(args->isolate(), callback);
+
+  if (!remote_.is_bound()) {
+    render_frame()->GetRemoteAssociatedInterfaces()->GetInterface(&remote_);
+  }
+
+  remote_->AddTrustedRecoveryMethod(
+      gaia_id, ArrayBufferAsBytes(public_key),
+      base::BindOnce(&SyncEncryptionKeysExtension::RunCompletionCallback,
+                     weak_ptr_factory_.GetWeakPtr(),
+                     std::move(global_callback)));
+}
+
 void SyncEncryptionKeysExtension::RunCompletionCallback(
     std::unique_ptr<v8::Global<v8::Function>> callback) {
   if (!render_frame()) {
diff --git a/chrome/renderer/sync_encryption_keys_extension.h b/chrome/renderer/sync_encryption_keys_extension.h
index 9499f84..8422ba90 100644
--- a/chrome/renderer/sync_encryption_keys_extension.h
+++ b/chrome/renderer/sync_encryption_keys_extension.h
@@ -36,6 +36,7 @@
 
   void Install();
   void SetSyncEncryptionKeys(gin::Arguments* args);
+  void AddTrustedSyncEncryptionRecoveryMethod(gin::Arguments* args);
   void RunCompletionCallback(
       std::unique_ptr<v8::Global<v8::Function>> callback);
 
diff --git a/chrome/renderer/translate/per_frame_translate_agent_browsertest.cc b/chrome/renderer/translate/per_frame_translate_agent_browsertest.cc
index 38927ef..ee98a8d 100644
--- a/chrome/renderer/translate/per_frame_translate_agent_browsertest.cc
+++ b/chrome/renderer/translate/per_frame_translate_agent_browsertest.cc
@@ -489,7 +489,7 @@
                                                    &has_notranslate_meta));
   EXPECT_EQ("es", detected_content_meta_lang);
 
-  content::PageState back_state = GetCurrentPageState();
+  blink::PageState back_state = GetCurrentPageState();
 
   LoadHTML(
       "<html><head><meta http-equiv=\"content-language\" content=\"fr\">"
diff --git a/chrome/renderer/translate/translate_agent_browsertest.cc b/chrome/renderer/translate/translate_agent_browsertest.cc
index 6782adc..a27f166 100644
--- a/chrome/renderer/translate/translate_agent_browsertest.cc
+++ b/chrome/renderer/translate/translate_agent_browsertest.cc
@@ -511,7 +511,7 @@
   EXPECT_EQ("es", fake_translate_driver_.details_->adopted_language);
   fake_translate_driver_.ResetNewPageValues();
 
-  content::PageState back_state = GetCurrentPageState();
+  blink::PageState back_state = GetCurrentPageState();
 
   LoadHTML(
       "<html><head><meta http-equiv=\"content-language\" content=\"fr\">"
diff --git a/chrome/service/service_utility_process_host.cc b/chrome/service/service_utility_process_host.cc
index 16cf4fe..e1b9c0fe 100644
--- a/chrome/service/service_utility_process_host.cc
+++ b/chrome/service/service_utility_process_host.cc
@@ -328,6 +328,7 @@
     switches::kVModule,
 #if defined(OS_WIN)
     switches::kDisableHighResTimer,
+    switches::kRaiseTimerFrequency,
 #endif
   };
   cmd_line->CopySwitchesFrom(service_command_line, kForwardSwitches,
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index a5691f9..3a22f380 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -3523,6 +3523,8 @@
     "../browser/permissions/crowd_deny_preload_data_unittest.cc",
     "../browser/permissions/crowd_deny_safe_browsing_request_unittest.cc",
     "../browser/permissions/permission_context_base_feature_policy_unittest.cc",
+    "../browser/persisted_state_db/persisted_state_db_factory_unittest.cc",
+    "../browser/persisted_state_db/persisted_state_db_unittest.cc",
     "../browser/plugins/pdf_iframe_navigation_throttle_unittest.cc",
     "../browser/policy/boolean_disabling_policy_handler_unittest.cc",
     "../browser/policy/chrome_browser_policy_connector_unittest.cc",
@@ -3609,8 +3611,6 @@
     "../browser/resources_util_unittest.cc",
     "../browser/subresource_redirect/https_image_compression_bypass_decider_unittest.cc",
     "../browser/subresource_redirect/https_image_compression_infobar_decider_unittest.cc",
-    "../browser/tab/state/tab_state_db_factory_unittest.cc",
-    "../browser/tab/state/tab_state_db_unittest.cc",
 
     # TODO(hashimoto): those tests should be componentized and moved to
     # //components:components_unittests, http://crbug.com/527882.
@@ -3950,6 +3950,7 @@
       "../browser/media/kaleidoscope/kaleidoscope_metrics_recorder_unittest.cc",
       "../browser/media/kaleidoscope/kaleidoscope_service_unittest.cc",
       "../browser/media/kaleidoscope/kaleidoscope_switches_unittest.cc",
+      "../browser/notifications/screen_capture_notification_blocker_unittest.cc",
       "../browser/password_manager/generated_password_leak_detection_pref_unittest.cc",
       "../browser/performance_manager/test_support/page_discarding_utils.cc",
       "../browser/performance_manager/test_support/page_discarding_utils.h",
@@ -4078,6 +4079,7 @@
     "//chrome/browser/media/router:unittests",
     "//chrome/browser/notifications:unit_tests",
     "//chrome/browser/payments:unittests",
+    "//chrome/browser/persisted_state_db:persisted_state_db",
     "//chrome/browser/privacy_budget:unit_tests",
     "//chrome/browser/updates/announcement_notification:unit_tests",
     "//chrome/browser/video_tutorials:unit_tests",
@@ -6962,12 +6964,13 @@
       "../browser/sync/test/integration/single_client_sessions_sync_test.cc",
       "../browser/sync/test/integration/single_client_sharing_message_sync_test.cc",
       "../browser/sync/test/integration/single_client_standalone_transport_sync_test.cc",
+      "../browser/sync/test/integration/single_client_sync_invalidations_test.cc",
       "../browser/sync/test/integration/single_client_themes_sync_test.cc",
       "../browser/sync/test/integration/single_client_typed_urls_sync_test.cc",
       "../browser/sync/test/integration/single_client_user_consents_sync_test.cc",
       "../browser/sync/test/integration/single_client_user_events_sync_test.cc",
       "../browser/sync/test/integration/single_client_wallet_sync_test.cc",
-      "../browser/sync/test/integration/single_client_web_apps_bmo_sync_test.cc",
+      "../browser/sync/test/integration/single_client_web_apps_sync_test.cc",
       "../browser/sync/test/integration/sync_auth_test.cc",
       "../browser/sync/test/integration/sync_errors_test.cc",
       "../browser/sync/test/integration/sync_exponential_backoff_test.cc",
diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/signin/AccountManagerTestRule.java b/chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/signin/AccountManagerTestRule.java
index 7ed91bff..dbf6656 100644
--- a/chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/signin/AccountManagerTestRule.java
+++ b/chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/signin/AccountManagerTestRule.java
@@ -5,19 +5,25 @@
 package org.chromium.chrome.test.util.browser.signin;
 
 import android.accounts.Account;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.drawable.Drawable;
 
 import androidx.annotation.Nullable;
+import androidx.appcompat.content.res.AppCompatResources;
 
 import org.junit.rules.TestRule;
 import org.junit.runner.Description;
 import org.junit.runners.model.Statement;
 
+import org.chromium.base.ContextUtils;
 import org.chromium.chrome.browser.sync.ProfileSyncService;
 import org.chromium.components.signin.AccountManagerFacadeProvider;
 import org.chromium.components.signin.AccountUtils;
 import org.chromium.components.signin.ProfileDataSource;
 import org.chromium.components.signin.base.CoreAccountId;
 import org.chromium.components.signin.base.CoreAccountInfo;
+import org.chromium.components.signin.core.browser.javatests.R;
 import org.chromium.components.signin.test.util.FakeAccountManagerFacade;
 import org.chromium.components.signin.test.util.FakeProfileDataSource;
 import org.chromium.content_public.browser.test.util.TestThreadUtils;
@@ -210,4 +216,18 @@
         SigninTestUtil.signOut();
         mIsSignedIn = false;
     }
+
+    /**
+     * Returns a profile image created from test resource.
+     */
+    public Bitmap createProfileImage() {
+        Drawable drawable = AppCompatResources.getDrawable(
+                ContextUtils.getApplicationContext(), R.drawable.test_profile_picture);
+        Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(),
+                drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
+        Canvas canvas = new Canvas(bitmap);
+        drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
+        drawable.draw(canvas);
+        return bitmap;
+    }
 }
diff --git a/chrome/test/data/sync/encryption_keys_recoverability.html b/chrome/test/data/sync/encryption_keys_recoverability.html
new file mode 100644
index 0000000..6715065
--- /dev/null
+++ b/chrome/test/data/sync/encryption_keys_recoverability.html
@@ -0,0 +1,16 @@
+<html>
+<head>
+<script>
+window.onload = function() {
+  setTimeout(function() {
+    // A second page is loaded as part of user action, such that Blink sees a
+    // non-empty navigation history when determining whether closing the tab via
+    // Javascript is allowed.
+    this.document.location.href =
+        "/sync/encryption_keys_recoverability_complete.html" +
+        location.search;
+  }, 0);
+}
+</script>
+</head>
+</html>
diff --git a/chrome/test/data/sync/encryption_keys_recoverability_complete.html b/chrome/test/data/sync/encryption_keys_recoverability_complete.html
new file mode 100644
index 0000000..4daedf3
--- /dev/null
+++ b/chrome/test/data/sync/encryption_keys_recoverability_complete.html
@@ -0,0 +1,11 @@
+<html>
+<head>
+<script>
+window.onload = function() {
+  chrome.addTrustedSyncEncryptionRecoveryMethod(() => { window.close(); },
+                                                /*gaia_id=*/location.search.substring(1),
+                                                /*public_key=*/new ArrayBuffer(7));
+}
+</script>
+</head>
+</html>
diff --git a/chrome/updater/tools/.style.yapf b/chrome/updater/tools/.style.yapf
new file mode 100644
index 0000000..557fa7b
--- /dev/null
+++ b/chrome/updater/tools/.style.yapf
@@ -0,0 +1,2 @@
+[style]
+based_on_style = pep8
diff --git a/chrome/updater/tools/PRESUBMIT.py b/chrome/updater/tools/PRESUBMIT.py
new file mode 100644
index 0000000..b7a3433c
--- /dev/null
+++ b/chrome/updater/tools/PRESUBMIT.py
@@ -0,0 +1,20 @@
+# Copyright 2020 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.
+"""Presubmit script for chrome/updater/tools/.
+
+See http://dev.chromium.org/developers/how-tos/depottools/presubmit-scripts
+for more details about the presubmit API built into depot_tools.
+"""
+
+
+def CommonChecks(input_api, output_api):
+    return input_api.canned_checks.RunPylint(input_api, output_api)
+
+
+def CheckChangeOnUpload(input_api, output_api):
+    return CommonChecks(input_api, output_api)
+
+
+def CheckChangeOnCommit(input_api, output_api):
+    return CommonChecks(input_api, output_api)
diff --git a/chrome/updater/tools/tag.py b/chrome/updater/tools/tag.py
new file mode 100755
index 0000000..9d82206
--- /dev/null
+++ b/chrome/updater/tools/tag.py
@@ -0,0 +1,99 @@
+#!/usr/bin/python3
+# Copyright 2020 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.
+"""A tool for tagging an updater metainstaller.
+
+For example:
+python3 chrome/updater/tools/tag.py --certificate_tag=certificate_tag.exe
+    --in_file=UpdaterSetup.signed.exe --out_file=ChromeSetup.exe
+    --tag=appguid={8A69D345-D564-463c-AFF1-A69D9E530F96}
+
+The script requires the presence of `certificate_tag.exe` and a signed
+metainstaller. If the --out_file argument is not specified, then the output
+goes to a file named `tagged_<in_file>`.
+
+The tag is encoded as an ASCII string.
+
+To run locally:
+1. find the certificate_tag.exe. This file is usually in the build out dir.
+2. use the signing/sign.py script to sign the updatersetup.exe target.
+3. run this script as suggested above, using the correct paths for the args.
+"""
+
+import argparse
+import binascii
+import os.path
+import struct
+import subprocess
+
+
+class TaggingError(Exception):
+    """Module exception class."""
+    pass
+
+
+class Tagger(object):
+    """A container for a tagging operation."""
+
+    def __init__(self, tagging_exe):
+        """Inits a tagger with the certificate tag tool."""
+        self._tagging_exe = tagging_exe
+
+    def _make_hex_tag(self, tag):
+        """ Builds the string which gets embedded in the metainstaller.
+
+        The tag contains a magic start, followed by a 2-byte big endian value
+        representing the length of the tag, followed by the tag bytes. The
+        entire tag is hex-encoded."""
+        if len(tag) > 0xFFFF:
+            raise TaggingError('Tag is too long.')
+        bin_tag = bytearray(binascii.hexlify('Gact2.0Omaha'.encode()))
+        bin_tag.extend(binascii.hexlify(struct.pack(">H", len(tag))))
+        bin_tag.extend(binascii.hexlify(tag.encode()))
+        return bin_tag.decode()
+
+    def _insert_tag(self, tag, in_file, out_file):
+        """Inserts the tag. This overrides any tag previously present in
+        the metainstaller."""
+        subprocess.run([
+            self._tagging_exe,
+            '--set-superfluous-cert-tag=0x%s' % self._make_hex_tag(tag),
+            '--padded-length=8206',
+            '--out=%s' % out_file, in_file
+        ],
+                       check=True)
+
+    def tag_metainstaller(self, tag, in_file, out_file):
+        if not out_file:
+            out_file = os.path.join(os.path.dirname(in_file),
+                                    'tagged_' + os.path.basename(in_file))
+        return self._insert_tag(tag, in_file, out_file)
+
+
+def main():
+    parser = argparse.ArgumentParser(
+        description=__doc__,
+        formatter_class=argparse.RawDescriptionHelpFormatter)
+    parser.add_argument('--certificate_tag',
+                        required=True,
+                        help='The path to the certificate_tag executable.')
+    parser.add_argument('--tag',
+                        required=True,
+                        help='The tag as an ASCII string.')
+    parser.add_argument('--in_file',
+                        required=True,
+                        help='The path to the signed metainstaller.')
+    parser.add_argument('--out_file',
+                        required=False,
+                        help='The path to save the tagged metainstaller to.'
+                        ' "tagged_" is prepended to in_file name if'
+                        ' the out_file is not specified.')
+
+    args = parser.parse_args()
+    Tagger(args.certificate_tag).tag_metainstaller(args.tag, args.in_file,
+                                                   args.out_file)
+
+
+if __name__ == '__main__':
+    main()
diff --git a/chromecast/browser/webview/client/webview.cc b/chromecast/browser/webview/client/webview.cc
index ec5bdc6..4d35cd5 100644
--- a/chromecast/browser/webview/client/webview.cc
+++ b/chromecast/browser/webview/client/webview.cc
@@ -480,7 +480,10 @@
   key_input->set_key_code(keyboard_code);
   key_input->set_dom_code(static_cast<int32_t>(dom_code));
   key_input->set_dom_key(static_cast<int32_t>(dom_key));
-  key_input->set_is_char(dom_key.IsCharacter());
+
+  // Hardcoded to true for our purposes, as IsCharacter doesn't seem to work
+  // here. Just means we can't test with modifier keys.
+  key_input->set_is_char(true);
 
   auto key_event = std::make_unique<InputEvent>();
   key_event->set_event_type(down ? ui::EventType::ET_KEY_PRESSED
diff --git a/chromecast/browser/webview/proto/webview.proto b/chromecast/browser/webview/proto/webview.proto
index 24fd148..c816eb7 100644
--- a/chromecast/browser/webview/proto/webview.proto
+++ b/chromecast/browser/webview/proto/webview.proto
@@ -249,6 +249,58 @@
   int32 height = 2;
 }
 
+// Represents the input mode of a focused text input field
+// Corresponds with:
+// http://www.whatwg.org/specs/web-apps/current-work/#attr-fe-inputmode
+enum TextInputMode {
+  TEXT_INPUT_MODE_DEFAULT = 0;
+  TEXT_INPUT_MODE_NONE = 1;
+  TEXT_INPUT_MODE_TEXT = 2;
+  TEXT_INPUT_MODE_TEL = 3;
+  TEXT_INPUT_MODE_URL = 4;
+  TEXT_INPUT_MODE_EMAIL = 5;
+  TEXT_INPUT_MODE_NUMERIC = 6;
+  TEXT_INPUT_MODE_DECIMAL = 7;
+  TEXT_INPUT_MODE_SEARCH = 8;
+};
+
+// Represents the type of a focused text input field.
+// Corresponds with blink's public/platform/WebTextInputType.h
+// Reference that source for more extended commentary on meaning of each value.
+enum TextInputType {
+  // Input caret is not in an editable node, no input method shall be used.
+  TEXT_INPUT_TYPE_NONE = 0;
+  TEXT_INPUT_TYPE_TEXT = 1;
+  TEXT_INPUT_TYPE_PASSWORD = 2;
+  TEXT_INPUT_TYPE_SEARCH = 3;
+  TEXT_INPUT_TYPE_EMAIL = 4;
+  TEXT_INPUT_TYPE_NUMBER = 5;
+  TEXT_INPUT_TYPE_TELEPHONE = 6;
+  TEXT_INPUT_TYPE_URL = 7;
+  TEXT_INPUT_TYPE_DATE = 8;
+  TEXT_INPUT_TYPE_DATE_TIME = 9;
+  TEXT_INPUT_TYPE_DATE_TIME_LOCAL = 10;
+  TEXT_INPUT_TYPE_MONTH = 11;
+  TEXT_INPUT_TYPE_TIME = 12;
+  TEXT_INPUT_TYPE_WEEK = 13;
+  TEXT_INPUT_TYPE_TEXT_AREA = 14;
+  TEXT_INPUT_TYPE_CONTENT_EDITABLE = 15;
+  TEXT_INPUT_TYPE_DATE_TIME_FIELD = 16;
+
+  // Input caret is in an editable node which doesn't support rich editing.
+  TEXT_INPUT_TYPE_NULL = 17;
+}
+
+// Represents a focus event for an input field within the webview's contents.
+message TextInputFocusEvent {
+  TextInputType type = 1;
+
+  // Flagged attributes of the focused text input field.
+  // Corresponds with those described in blink::WebTextInputFlags in
+  // public/platform/WebTextInputType.h
+  int32 flags = 2;
+}
+
 message WebviewRequest {
   // Unique identifier for the request. For requests that will have a response,
   // the response id will match the request id.
@@ -317,6 +369,7 @@
     // channels via AddJavascriptChannelsRequest.
     JavascriptChannelMessage javascript_channel_message = 10;
     ClearCookiesResponse clear_cookies = 11;
+    TextInputFocusEvent input_focus_event = 12;
     AssociateCastAppWindowResponse associate = 20;
   }
 }
diff --git a/chromecast/browser/webview/web_content_controller.cc b/chromecast/browser/webview/web_content_controller.cc
index 0f97c377..bd0096e 100644
--- a/chromecast/browser/webview/web_content_controller.cc
+++ b/chromecast/browser/webview/web_content_controller.cc
@@ -25,10 +25,136 @@
 #include "third_party/blink/public/common/input/web_touch_event.h"
 #include "ui/aura/window.h"
 #include "ui/aura/window_delegate.h"
+#include "ui/aura/window_tree_host.h"
 #include "ui/base/ime/constants.h"
+#include "ui/base/ime/input_method.h"
+#include "ui/base/ime/input_method_observer.h"
+#include "ui/base/ime/text_input_client.h"
+#include "ui/base/ime/text_input_type.h"
 #include "ui/events/event.h"
 #include "ui/events/event_constants.h"
 
+namespace {
+
+chromecast::webview::TextInputType ConvertTextInputType(
+    const ui::TextInputType text_input_type) {
+  switch (text_input_type) {
+    case ui::TEXT_INPUT_TYPE_NONE:
+      return chromecast::webview::TEXT_INPUT_TYPE_NONE;
+      break;
+    case ui::TEXT_INPUT_TYPE_TEXT:
+      return chromecast::webview::TEXT_INPUT_TYPE_TEXT;
+      break;
+    case ui::TEXT_INPUT_TYPE_CONTENT_EDITABLE:
+      return chromecast::webview::TEXT_INPUT_TYPE_CONTENT_EDITABLE;
+      break;
+    case ui::TEXT_INPUT_TYPE_PASSWORD:
+      return chromecast::webview::TEXT_INPUT_TYPE_PASSWORD;
+      break;
+    case ui::TEXT_INPUT_TYPE_SEARCH:
+      return chromecast::webview::TEXT_INPUT_TYPE_SEARCH;
+      break;
+    case ui::TEXT_INPUT_TYPE_EMAIL:
+      return chromecast::webview::TEXT_INPUT_TYPE_EMAIL;
+      break;
+    case ui::TEXT_INPUT_TYPE_NUMBER:
+      return chromecast::webview::TEXT_INPUT_TYPE_NUMBER;
+      break;
+    case ui::TEXT_INPUT_TYPE_TELEPHONE:
+      return chromecast::webview::TEXT_INPUT_TYPE_TELEPHONE;
+      break;
+    case ui::TEXT_INPUT_TYPE_DATE:
+      return chromecast::webview::TEXT_INPUT_TYPE_DATE;
+      break;
+    case ui::TEXT_INPUT_TYPE_DATE_TIME:
+      return chromecast::webview::TEXT_INPUT_TYPE_DATE_TIME;
+      break;
+    case ui::TEXT_INPUT_TYPE_MONTH:
+      return chromecast::webview::TEXT_INPUT_TYPE_MONTH;
+      break;
+    case ui::TEXT_INPUT_TYPE_TIME:
+      return chromecast::webview::TEXT_INPUT_TYPE_TIME;
+      break;
+    case ui::TEXT_INPUT_TYPE_URL:
+      return chromecast::webview::TEXT_INPUT_TYPE_URL;
+      break;
+    case ui::TEXT_INPUT_TYPE_WEEK:
+      return chromecast::webview::TEXT_INPUT_TYPE_WEEK;
+      break;
+    case ui::TEXT_INPUT_TYPE_TEXT_AREA:
+      return chromecast::webview::TEXT_INPUT_TYPE_TEXT_AREA;
+      break;
+    case ui::TEXT_INPUT_TYPE_DATE_TIME_FIELD:
+      return chromecast::webview::TEXT_INPUT_TYPE_DATE_TIME_FIELD;
+      break;
+    case ui::TEXT_INPUT_TYPE_DATE_TIME_LOCAL:
+      return chromecast::webview::TEXT_INPUT_TYPE_DATE_TIME_LOCAL;
+      break;
+    case ui::TEXT_INPUT_TYPE_NULL:
+      return chromecast::webview::TEXT_INPUT_TYPE_NULL;
+      break;
+  }
+  LOG(ERROR) << "Unmapped TextInputType: " << text_input_type;
+  return chromecast::webview::TEXT_INPUT_TYPE_NULL;
+}
+
+// Used to watch for text field input focus changes and notify the client
+// accordingly.
+class WebviewInputMethodObserver : public ui::InputMethodObserver {
+ public:
+  WebviewInputMethodObserver(chromecast::WebContentController::Client* client,
+                             ui::InputMethod* input_method);
+  ~WebviewInputMethodObserver() override;
+
+  WebviewInputMethodObserver(const WebviewInputMethodObserver&) = delete;
+  WebviewInputMethodObserver& operator=(const WebviewInputMethodObserver&) =
+      delete;
+
+  // ui::InputMethodObserver
+  void OnFocus() override {}
+  void OnBlur() override {}
+  void OnCaretBoundsChanged(const ui::TextInputClient* client) override {}
+  void OnTextInputStateChanged(const ui::TextInputClient* client) override;
+  void OnInputMethodDestroyed(const ui::InputMethod* input_method) override;
+  void OnShowVirtualKeyboardIfEnabled() override {}
+
+ private:
+  chromecast::WebContentController::Client* client_;
+  ui::InputMethod* input_method_;
+};
+
+void WebviewInputMethodObserver::OnTextInputStateChanged(
+    const ui::TextInputClient* client) {
+  if (!client)
+    return;
+  std::unique_ptr<chromecast::webview::WebviewResponse> focus_event_response =
+      std::make_unique<chromecast::webview::WebviewResponse>();
+  auto* focus_event = focus_event_response->mutable_input_focus_event();
+  focus_event->set_flags(client->GetTextInputFlags());
+  focus_event->set_type(ConvertTextInputType(client->GetTextInputType()));
+  client_->EnqueueSend(std::move(focus_event_response));
+}
+
+WebviewInputMethodObserver::WebviewInputMethodObserver(
+    chromecast::WebContentController::Client* client,
+    ui::InputMethod* input_method)
+    : client_(client), input_method_(input_method) {
+  input_method_->AddObserver(this);
+}
+
+WebviewInputMethodObserver::~WebviewInputMethodObserver() {
+  if (input_method_) {
+    input_method_->RemoveObserver(this);
+  }
+}
+
+void WebviewInputMethodObserver::OnInputMethodDestroyed(
+    const ui::InputMethod* input_method) {
+  input_method_ = nullptr;
+}
+
+}  // namespace
+
 namespace chromecast {
 
 WebContentController::WebContentController(Client* client) : client_(client) {
@@ -168,6 +294,10 @@
   surface_->SetEmbeddedSurfaceId(base::BindRepeating(
       &WebContentController::GetSurfaceId, base::Unretained(this)));
   HandleResize(contents_window->bounds().size());
+
+  // Register for IME events
+  input_method_observer_ = std::make_unique<WebviewInputMethodObserver>(
+      client_, contents_window->GetHost()->GetInputMethod());
 }
 
 void WebContentController::ProcessInputEvent(const webview::InputEvent& ev) {
diff --git a/chromecast/browser/webview/web_content_controller.h b/chromecast/browser/webview/web_content_controller.h
index 44f8cf9..4972dfd 100644
--- a/chromecast/browser/webview/web_content_controller.h
+++ b/chromecast/browser/webview/web_content_controller.h
@@ -16,6 +16,8 @@
 #include "components/exo/surface_observer.h"
 #include "content/public/browser/render_widget_host.h"
 #include "content/public/browser/web_contents_observer.h"
+#include "ui/base/ime/input_method.h"
+#include "ui/base/ime/input_method_observer.h"
 #include "ui/events/gestures/gesture_recognizer_impl.h"
 
 namespace aura {
@@ -139,6 +141,9 @@
   std::set<content::RenderFrameHost*> current_render_frame_set_;
   std::set<content::RenderWidgetHost*> current_render_widget_set_;
 
+  // Used to watch key focus events.
+  std::unique_ptr<ui::InputMethodObserver> input_method_observer_;
+
   base::WeakPtrFactory<WebContentController> weak_ptr_factory_{this};
 
   DISALLOW_COPY_AND_ASSIGN(WebContentController);
diff --git a/chromeos/CHROMEOS_LKGM b/chromeos/CHROMEOS_LKGM
index 0d4a97c..5544157 100644
--- a/chromeos/CHROMEOS_LKGM
+++ b/chromeos/CHROMEOS_LKGM
@@ -1 +1 @@
-13513.0.0
\ No newline at end of file
+13520.0.0
\ No newline at end of file
diff --git a/chromeos/components/media_app_ui/BUILD.gn b/chromeos/components/media_app_ui/BUILD.gn
index 6ff57584..67c7fbd 100644
--- a/chromeos/components/media_app_ui/BUILD.gn
+++ b/chromeos/components/media_app_ui/BUILD.gn
@@ -87,12 +87,11 @@
 mojom("mojo_bindings") {
   sources = [ "media_app_ui.mojom" ]
 }
-
-media_test_lib_closure_flags = system_app_closure_flags_strict + [ "hide_warnings_for=chromeos/components/media_app_ui/media_app_ui.mojom-lite-for-compile.js" ]
+media_test_lib_closure_flags = system_app_closure_flags_strict + [ "hide_warnings_for=chromeos/components/media_app_ui/media_app_ui.mojom-lite-for-compile.js" ] + ignore_load_time_data_errors_closure_flags
 
 # Use relaxed flags for the browsertest files themselves. This removes null
 # checks and "could not determine type" errors which don't add a lot of value.
-media_browsertest_closure_flags = system_app_closure_flags + [ "hide_warnings_for=chromeos/components/media_app_ui/media_app_ui.mojom-lite-for-compile.js" ]
+media_browsertest_closure_flags = system_app_closure_flags + [ "hide_warnings_for=chromeos/components/media_app_ui/media_app_ui.mojom-lite-for-compile.js" ] + ignore_load_time_data_errors_closure_flags
 
 js_type_check("closure_compile_test_lib") {
   testonly = true
@@ -167,6 +166,7 @@
       [ "//chromeos/components/web_applications/js2gtest_support.externs.js" ]
   deps = [
     ":test_driver_js",
+    "//chromeos/components/media_app_ui/resources/js:receiver",
     "//chromeos/components/system_apps/public/js:message_pipe",
   ]
 }
diff --git a/chromeos/components/media_app_ui/DEPS b/chromeos/components/media_app_ui/DEPS
index fb6db41..9a43f61 100644
--- a/chromeos/components/media_app_ui/DEPS
+++ b/chromeos/components/media_app_ui/DEPS
@@ -3,8 +3,8 @@
   "+chromeos/components/web_applications",
   "+chromeos/grit/chromeos_media_app_bundle_resources.h",
   "+chromeos/grit/chromeos_resources.h",
-  "+components/content_settings/core/common",
   "+chromeos/strings/grit/chromeos_strings.h",
+  "+components/content_settings/core/common",
   "+content/public/browser",
   "+content/public/common",
   "+ui/webui",
diff --git a/chromeos/components/media_app_ui/resources/app.html b/chromeos/components/media_app_ui/resources/app.html
index 36204e1..f573ccc 100644
--- a/chromeos/components/media_app_ui/resources/app.html
+++ b/chromeos/components/media_app_ui/resources/app.html
@@ -3,13 +3,19 @@
      found in the LICENSE file. -->
 <!DOCTYPE html>
 <html dir="$i18n{textdirection}" lang="$i18n{appLocale}">
-<meta charset="utf-8"/>
+<meta charset="utf-8">
 <style>
   body {
     margin: 0;
     overflow: hidden;
   }
 </style>
+
 <script src="/js/app_main.js"></script>
 <script src="/media_app_app_scripts.js"></script>
+
+<!-- Populates `window.loadTimeData`, needs to be after
+  "media_app_app_scripts.js" which loads "load_time_data.js" -->
+<script src="/strings.js"></script>
+
 </html>
diff --git a/chromeos/components/media_app_ui/resources/js/BUILD.gn b/chromeos/components/media_app_ui/resources/js/BUILD.gn
index 9d5bbb36..0e27cd6 100644
--- a/chromeos/components/media_app_ui/resources/js/BUILD.gn
+++ b/chromeos/components/media_app_ui/resources/js/BUILD.gn
@@ -24,7 +24,8 @@
 }
 
 js_type_check("closure_compile_app") {
-  closure_flags = media_closure_flags
+  closure_flags =
+      media_closure_flags + ignore_load_time_data_errors_closure_flags
   deps = [ ":receiver" ]
 }
 
@@ -60,6 +61,7 @@
   deps = [
     ":message_types",
     "//chromeos/components/system_apps/public/js:message_pipe",
+    "//ui/webui/resources/js:load_time_data",
   ]
 }
 
diff --git a/chromeos/components/media_app_ui/resources/js/media_app_app_scripts.js b/chromeos/components/media_app_ui/resources/js/media_app_app_scripts.js
index a8b7a8c..cb6443e 100644
--- a/chromeos/components/media_app_ui/resources/js/media_app_app_scripts.js
+++ b/chromeos/components/media_app_ui/resources/js/media_app_app_scripts.js
@@ -4,6 +4,7 @@
 
 /** @fileoverview Concatenation of the JS files we use in app.html. */
 
+// <include src="../../../../../ui/webui/resources/js/load_time_data.js">
 // <include src="../../../system_apps/public/js/message_pipe.js">
 // <include src="message_types.js">
 // <include src="receiver.js">
diff --git a/chromeos/components/media_app_ui/test/media_app_guest_ui_browsertest.js b/chromeos/components/media_app_ui/test/media_app_guest_ui_browsertest.js
index d6fd2d9..baf0f4cc 100644
--- a/chromeos/components/media_app_ui/test/media_app_guest_ui_browsertest.js
+++ b/chromeos/components/media_app_ui/test/media_app_guest_ui_browsertest.js
@@ -41,6 +41,14 @@
   assertEquals(document.documentElement.lang, 'en-US');
 });
 
+GUEST_TEST('GuestLoadsLoadTimeData', () => {
+  // Check `LoadTimeData` exists.
+  chai.assert.isTrue(loadTimeData !== undefined);
+  // Check data loaded into `LoadTimeData` by "strings.js" via
+  // `source->UseStringsJs()` exists.
+  assertEquals(loadTimeData.getValue('appLocale'), 'en-US');
+});
+
 // Test can load files with CSP restrictions. We expect `error` to be called
 // as these tests are loading resources that don't exist. Note: we can't violate
 // CSP in tests or Js Errors will cause test failures.
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 8a97cd1d..b85d1bfb9 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
@@ -1144,6 +1144,11 @@
   testDone();
 });
 
+TEST_F('MediaAppUIBrowserTest', 'GuestLoadsLoadTimeData', async () => {
+  await runTestInGuest('GuestLoadsLoadTimeData');
+  testDone();
+});
+
 TEST_F('MediaAppUIBrowserTest', 'GuestCanLoadWithCspRestrictions', async () => {
   await runTestInGuest('GuestCanLoadWithCspRestrictions');
   testDone();
diff --git a/chromeos/components/web_applications/system_apps.gni b/chromeos/components/web_applications/system_apps.gni
index cb097dd58..43f085ac 100644
--- a/chromeos/components/web_applications/system_apps.gni
+++ b/chromeos/components/web_applications/system_apps.gni
@@ -30,3 +30,12 @@
       "jscomp_error=conformanceViolations",
       "jscomp_error=reportUnknownTypes",
     ]
+
+ignore_load_time_data_errors_closure_flags = [
+  "hide_warnings_for=ui/webui/resources/js/load_time_data.js",
+
+  # load_time_data.js has dependencies on these files that also throw closure errors.
+  "hide_warnings_for=ui/webui/resources/js/assert.js",
+  "hide_warnings_for=ui/webui/resources/js/parse_html_subset.js",
+  "hide_warnings_for=third_party/jstemplate/",
+]
diff --git a/chromeos/constants/chromeos_features.cc b/chromeos/constants/chromeos_features.cc
index 7387491..6383551 100644
--- a/chromeos/constants/chromeos_features.cc
+++ b/chromeos/constants/chromeos_features.cc
@@ -260,6 +260,11 @@
 const base::Feature kExoPointerLock{"ExoPointerLock",
                                     base::FEATURE_DISABLED_BY_DEFAULT};
 
+// Enables policy that controls feature to allow Family Link accounts on school
+// owned devices.
+const base::Feature kFamilyLinkOnSchoolDevice{
+    "FamilyLinkOnSchoolDevice", base::FEATURE_DISABLED_BY_DEFAULT};
+
 // Enables the camera folder handling in files app.
 const base::Feature kFilesCameraFolder{"FilesCameraFolder",
                                        base::FEATURE_ENABLED_BY_DEFAULT};
@@ -674,6 +679,10 @@
   return base::FeatureList::IsEnabled(kEnableHostnameSetting);
 }
 
+bool IsFamilyLinkOnSchoolDeviceEnabled() {
+  return base::FeatureList::IsEnabled(kFamilyLinkOnSchoolDevice);
+}
+
 bool IsImeSandboxEnabled() {
   return base::FeatureList::IsEnabled(kEnableImeSandbox);
 }
diff --git a/chromeos/constants/chromeos_features.h b/chromeos/constants/chromeos_features.h
index eb440557..90ba70b 100644
--- a/chromeos/constants/chromeos_features.h
+++ b/chromeos/constants/chromeos_features.h
@@ -128,6 +128,8 @@
 COMPONENT_EXPORT(CHROMEOS_CONSTANTS)
 extern const base::Feature kExoPointerLock;
 COMPONENT_EXPORT(CHROMEOS_CONSTANTS)
+extern const base::Feature kFamilyLinkOnSchoolDevice;
+COMPONENT_EXPORT(CHROMEOS_CONSTANTS)
 extern const base::Feature kFilesCameraFolder;
 COMPONENT_EXPORT(CHROMEOS_CONSTANTS) extern const base::Feature kFilesNG;
 COMPONENT_EXPORT(CHROMEOS_CONSTANTS)
@@ -298,6 +300,7 @@
 COMPONENT_EXPORT(CHROMEOS_CONSTANTS) bool IsDeepLinkingEnabled();
 COMPONENT_EXPORT(CHROMEOS_CONSTANTS) bool IsDiagnosticsAppEnabled();
 COMPONENT_EXPORT(CHROMEOS_CONSTANTS) bool IsHostnameSettingEnabled();
+COMPONENT_EXPORT(CHROMEOS_CONSTANTS) bool IsFamilyLinkOnSchoolDeviceEnabled();
 COMPONENT_EXPORT(CHROMEOS_CONSTANTS) bool IsImeSandboxEnabled();
 COMPONENT_EXPORT(CHROMEOS_CONSTANTS)
 bool IsInstantTetheringBackgroundAdvertisingSupported();
diff --git a/chromeos/login/auth/login_performer.cc b/chromeos/login/auth/login_performer.cc
index 012297a1..b267434 100644
--- a/chromeos/login/auth/login_performer.cc
+++ b/chromeos/login/auth/login_performer.cc
@@ -142,7 +142,8 @@
   bool wildcard_match = false;
 
   const AccountId& account_id = user_context.GetAccountId();
-  if (!IsUserAllowlisted(account_id, &wildcard_match)) {
+  if (!IsUserAllowlisted(account_id, &wildcard_match,
+                         user_context.GetUserType())) {
     NotifyAllowlistCheckFailure();
     return;
   }
diff --git a/chromeos/login/auth/login_performer.h b/chromeos/login/auth/login_performer.h
index 2c33d9aa..7b1ff222 100644
--- a/chromeos/login/auth/login_performer.h
+++ b/chromeos/login/auth/login_performer.h
@@ -13,10 +13,12 @@
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
 #include "base/memory/weak_ptr.h"
+#include "base/optional.h"
 #include "chromeos/login/auth/auth_status_consumer.h"
 #include "chromeos/login/auth/authenticator.h"
 #include "chromeos/login/auth/extended_authenticator.h"
 #include "chromeos/login/auth/user_context.h"
+#include "components/user_manager/user_type.h"
 #include "google_apis/gaia/google_service_auth_error.h"
 
 class AccountId;
@@ -129,9 +131,13 @@
 
   // Check if user is allowed to sign in on device. |wildcard_match| will
   // contain additional information whether this user is explicitly listed or
-  // not (may be relevant for external-based sign-in).
-  virtual bool IsUserAllowlisted(const AccountId& account_id,
-                                 bool* wildcard_match) = 0;
+  // not (may be relevant for external-based sign-in). |user_type| will be used
+  // to check if the user is allowed because of the user type, pass
+  // base::nullopt if user type is not known.
+  virtual bool IsUserAllowlisted(
+      const AccountId& account_id,
+      bool* wildcard_match,
+      const base::Optional<user_manager::UserType>& user_type) = 0;
 
  protected:
   // Platform-dependant methods to be implemented by concrete class.
diff --git a/chromeos/network/managed_network_configuration_handler_unittest.cc b/chromeos/network/managed_network_configuration_handler_unittest.cc
index 25d13d9b..799c6ef9 100644
--- a/chromeos/network/managed_network_configuration_handler_unittest.cc
+++ b/chromeos/network/managed_network_configuration_handler_unittest.cc
@@ -175,11 +175,10 @@
   void SetPolicy(::onc::ONCSource onc_source,
                  const std::string& userhash,
                  const std::string& path_to_onc) {
-    std::unique_ptr<base::DictionaryValue> policy =
+    base::Value policy =
         path_to_onc.empty()
-            ? base::DictionaryValue::From(onc::ReadDictionaryFromJson(
-                  onc::kEmptyUnencryptedConfiguration))
-            : test_utils::ReadTestDictionary(path_to_onc);
+            ? onc::ReadDictionaryFromJson(onc::kEmptyUnencryptedConfiguration)
+            : test_utils::ReadTestDictionaryValue(path_to_onc);
 
     onc::Validator validator(true,   // error_on_unknown_field
                              true,   // error_on_wrong_recommended
@@ -188,17 +187,18 @@
                              true);  // log_warnings
     validator.SetOncSource(onc_source);
     onc::Validator::Result validation_result;
-    policy = validator.ValidateAndRepairObject(
-        &onc::kToplevelConfigurationSignature, *policy, &validation_result);
+    std::unique_ptr<base::DictionaryValue> validated_policy =
+        validator.ValidateAndRepairObject(&onc::kToplevelConfigurationSignature,
+                                          policy, &validation_result);
     if (validation_result == onc::Validator::INVALID) {
       ADD_FAILURE() << "Network configuration invalid.";
       return;
     }
 
     base::ListValue network_configs;
-    const base::Value* found_network_configs =
-        policy->FindKeyOfType(::onc::toplevel_config::kNetworkConfigurations,
-                              base::Value::Type::LIST);
+    const base::Value* found_network_configs = validated_policy->FindKeyOfType(
+        ::onc::toplevel_config::kNetworkConfigurations,
+        base::Value::Type::LIST);
     if (found_network_configs) {
       for (const auto& network_config : found_network_configs->GetList()) {
         network_configs.Append(network_config.Clone());
@@ -206,7 +206,7 @@
     }
 
     base::DictionaryValue global_config;
-    const base::Value* found_global_config = policy->FindKeyOfType(
+    const base::Value* found_global_config = validated_policy->FindKeyOfType(
         ::onc::toplevel_config::kGlobalNetworkConfiguration,
         base::Value::Type::DICTIONARY);
     if (found_global_config) {
diff --git a/chromeos/network/network_state.cc b/chromeos/network/network_state.cc
index 531231c5..90a2b97 100644
--- a/chromeos/network/network_state.cc
+++ b/chromeos/network/network_state.cc
@@ -182,13 +182,12 @@
       proxy_config_ = base::Value();
       return true;
     }
-    std::unique_ptr<base::Value> proxy_config_dict(
-        onc::ReadDictionaryFromJson(proxy_config_str));
-    if (proxy_config_dict) {
-      proxy_config_ = std::move(*proxy_config_dict);
-    } else {
-      proxy_config_ = base::Value();
+    base::Value proxy_config = onc::ReadDictionaryFromJson(proxy_config_str);
+    if (!proxy_config.is_dict()) {
       NET_LOG(ERROR) << "Failed to parse " << path() << "." << key;
+      proxy_config_ = base::Value();
+    } else {
+      proxy_config_ = std::move(proxy_config);
     }
     return true;
   } else if (key == shill::kProviderProperty) {
diff --git a/chromeos/network/network_state_test_helper.cc b/chromeos/network/network_state_test_helper.cc
index ca41892..5db2b7c 100644
--- a/chromeos/network/network_state_test_helper.cc
+++ b/chromeos/network/network_state_test_helper.cc
@@ -109,10 +109,8 @@
     const std::string& shill_json_string) {
   last_created_service_path_.clear();
 
-  std::unique_ptr<base::DictionaryValue> shill_json_dict =
-      base::DictionaryValue::From(
-          onc::ReadDictionaryFromJson(shill_json_string));
-  if (!shill_json_dict) {
+  base::Value shill_json_dict = onc::ReadDictionaryFromJson(shill_json_string);
+  if (!shill_json_dict.is_dict()) {
     LOG(ERROR) << "Error parsing json: " << shill_json_string;
     return last_created_service_path_;
   }
@@ -123,7 +121,7 @@
   // error cases, ConfigureCallback() will not run, resulting in "" being
   // returned from this function.
   ShillManagerClient::Get()->ConfigureService(
-      *shill_json_dict,
+      shill_json_dict,
       base::BindOnce(&NetworkStateTestHelper::ConfigureCallback,
                      weak_ptr_factory_.GetWeakPtr()),
       base::BindOnce(&FailErrorCallback));
diff --git a/chromeos/network/onc/onc_mapper.cc b/chromeos/network/onc/onc_mapper.cc
index ff1ac50..e2901a8 100644
--- a/chromeos/network/onc/onc_mapper.cc
+++ b/chromeos/network/onc/onc_mapper.cc
@@ -47,7 +47,7 @@
 
 std::unique_ptr<base::DictionaryValue> Mapper::MapObject(
     const OncValueSignature& signature,
-    const base::DictionaryValue& onc_object,
+    const base::Value& onc_object,
     bool* error) {
   std::unique_ptr<base::DictionaryValue> result(new base::DictionaryValue);
 
@@ -66,21 +66,21 @@
 }
 
 void Mapper::MapFields(const OncValueSignature& object_signature,
-                       const base::DictionaryValue& onc_object,
+                       const base::Value& onc_object,
                        bool* found_unknown_field,
                        bool* nested_error,
                        base::DictionaryValue* result) {
-  for (base::DictionaryValue::Iterator it(onc_object); !it.IsAtEnd();
-       it.Advance()) {
+  DCHECK(onc_object.is_dict());
+  for (auto it : onc_object.DictItems()) {
     bool current_field_unknown = false;
     std::unique_ptr<base::Value> result_value =
-        MapField(it.key(), object_signature, it.value(), &current_field_unknown,
+        MapField(it.first, object_signature, it.second, &current_field_unknown,
                  nested_error);
 
     if (current_field_unknown)
       *found_unknown_field = true;
     else if (result_value.get() != NULL)
-      result->SetWithoutPathExpansion(it.key(), std::move(result_value));
+      result->SetWithoutPathExpansion(it.first, std::move(result_value));
     else
       DCHECK(*nested_error);
   }
diff --git a/chromeos/network/onc/onc_mapper.h b/chromeos/network/onc/onc_mapper.h
index b23910c..e2f22024ec 100644
--- a/chromeos/network/onc/onc_mapper.h
+++ b/chromeos/network/onc/onc_mapper.h
@@ -55,7 +55,7 @@
   // implementation only unknown fields are errors.
   virtual std::unique_ptr<base::DictionaryValue> MapObject(
       const OncValueSignature& signature,
-      const base::DictionaryValue& onc_object,
+      const base::Value& onc_object,
       bool* error);
 
   // Maps primitive values like BinaryValue, StringValue, IntegerValue... (all
@@ -72,7 +72,7 @@
   // dictionary contains any unknown fields. Set |nested_error| to true only if
   // nested errors occured.
   virtual void MapFields(const OncValueSignature& object_signature,
-                         const base::DictionaryValue& onc_object,
+                         const base::Value& onc_object,
                          bool* found_unknown_field,
                          bool* nested_error,
                          base::DictionaryValue* result);
diff --git a/chromeos/network/onc/onc_normalizer.cc b/chromeos/network/onc/onc_normalizer.cc
index a4bac43..4481718 100644
--- a/chromeos/network/onc/onc_normalizer.cc
+++ b/chromeos/network/onc/onc_normalizer.cc
@@ -24,7 +24,7 @@
 
 std::unique_ptr<base::DictionaryValue> Normalizer::NormalizeObject(
     const OncValueSignature* object_signature,
-    const base::DictionaryValue& onc_object) {
+    const base::Value& onc_object) {
   CHECK(object_signature != nullptr);
   bool error = false;
   std::unique_ptr<base::DictionaryValue> result =
@@ -35,7 +35,7 @@
 
 std::unique_ptr<base::DictionaryValue> Normalizer::MapObject(
     const OncValueSignature& signature,
-    const base::DictionaryValue& onc_object,
+    const base::Value& onc_object,
     bool* error) {
   std::unique_ptr<base::DictionaryValue> normalized =
       Mapper::MapObject(signature, onc_object, error);
diff --git a/chromeos/network/onc/onc_normalizer.h b/chromeos/network/onc/onc_normalizer.h
index a5ced40..7a67376 100644
--- a/chromeos/network/onc/onc_normalizer.h
+++ b/chromeos/network/onc/onc_normalizer.h
@@ -32,13 +32,13 @@
   // created and stored in the field "HexSSID".
   std::unique_ptr<base::DictionaryValue> NormalizeObject(
       const OncValueSignature* object_signature,
-      const base::DictionaryValue& onc_object);
+      const base::Value& onc_object);
 
  private:
   // Dispatch to the right normalization function according to |signature|.
   std::unique_ptr<base::DictionaryValue> MapObject(
       const OncValueSignature& signature,
-      const base::DictionaryValue& onc_object,
+      const base::Value& onc_object,
       bool* error) override;
 
   void NormalizeCertificate(base::DictionaryValue* cert);
diff --git a/chromeos/network/onc/onc_test_utils.cc b/chromeos/network/onc/onc_test_utils.cc
index 28a8edb8..7792e6e0 100644
--- a/chromeos/network/onc/onc_test_utils.cc
+++ b/chromeos/network/onc/onc_test_utils.cc
@@ -32,8 +32,7 @@
   base::ScopedAllowBlockingForTesting allow_io;
   base::FilePath path;
   if (!chromeos::test_utils::GetTestDataPath(kNetworkComponentDirectory,
-                                             filename,
-                                             &path)) {
+                                             filename, &path)) {
     LOG(FATAL) << "Unable to get test data path for "
                << kNetworkComponentDirectory << "/" << filename;
     return "";
@@ -45,14 +44,17 @@
 
 std::unique_ptr<base::DictionaryValue> ReadTestDictionary(
     const std::string& filename) {
-  std::unique_ptr<base::DictionaryValue> dict;
+  return base::DictionaryValue::From(
+      base::Value::ToUniquePtrValue(ReadTestDictionaryValue(filename)));
+}
+
+base::Value ReadTestDictionaryValue(const std::string& filename) {
   base::FilePath path;
   if (!chromeos::test_utils::GetTestDataPath(kNetworkComponentDirectory,
-                                             filename,
-                                             &path)) {
+                                             filename, &path)) {
     LOG(FATAL) << "Unable to get test dictionary path for "
                << kNetworkComponentDirectory << "/" << filename;
-    return dict;
+    return base::Value();
   }
 
   JSONFileValueDeserializer deserializer(path,
@@ -60,29 +62,30 @@
 
   std::string error_message;
   std::unique_ptr<base::Value> content =
-      deserializer.Deserialize(NULL, &error_message);
-  CHECK(content != NULL) << "Couldn't json-deserialize file '"
-                         << filename << "': " << error_message;
+      deserializer.Deserialize(nullptr, &error_message);
+  CHECK(content != nullptr) << "Couldn't json-deserialize file '" << filename
+                            << "': " << error_message;
 
-  dict = base::DictionaryValue::From(std::move(content));
-  CHECK(dict) << "File '" << filename
-              << "' does not contain a dictionary as expected, but type "
-              << content->type();
-  return dict;
+  CHECK(content->is_dict())
+      << "File '" << filename
+      << "' does not contain a dictionary as expected, but type "
+      << content->type();
+  return std::move(*content);
 }
 
 ::testing::AssertionResult Equals(const base::Value* expected,
                                   const base::Value* actual) {
-  CHECK(expected != NULL);
-  if (actual == NULL)
-    return ::testing::AssertionFailure() << "Actual value pointer is NULL";
+  CHECK(expected != nullptr);
+  if (actual == nullptr)
+    return ::testing::AssertionFailure() << "Actual value pointer is nullptr";
 
   if (*expected == *actual)
     return ::testing::AssertionSuccess() << "Values are equal";
 
   return ::testing::AssertionFailure() << "Values are unequal.\n"
-                                       << "Expected value:\n" << *expected
-                                       << "Actual value:\n" << *actual;
+                                       << "Expected value:\n"
+                                       << *expected << "Actual value:\n"
+                                       << *actual;
 }
 
 }  // namespace test_utils
diff --git a/chromeos/network/onc/onc_test_utils.h b/chromeos/network/onc/onc_test_utils.h
index 0f5e453..96e97771 100644
--- a/chromeos/network/onc/onc_test_utils.h
+++ b/chromeos/network/onc/onc_test_utils.h
@@ -13,7 +13,7 @@
 namespace base {
 class DictionaryValue;
 class Value;
-}
+}  // namespace base
 
 namespace chromeos {
 namespace onc {
@@ -22,8 +22,11 @@
 // Read the file at |filename| as a string. CHECKs if any error occurs.
 std::string ReadTestData(const std::string& filename);
 
-// Read a JSON dictionary from |filename| and return it as a
-// DictionaryValue. CHECKs if any error occurs.
+// Read a JSON dictionary from |filename| and return it as a base::Value.
+// CHECKs if any error occurs.
+base::Value ReadTestDictionaryValue(const std::string& filename);
+
+// Deprecated version of the above.
 std::unique_ptr<base::DictionaryValue> ReadTestDictionary(
     const std::string& filename);
 
diff --git a/chromeos/network/onc/onc_translator_shill_to_onc.cc b/chromeos/network/onc/onc_translator_shill_to_onc.cc
index 14f89e4..46c9f830 100644
--- a/chromeos/network/onc/onc_translator_shill_to_onc.cc
+++ b/chromeos/network/onc/onc_translator_shill_to_onc.cc
@@ -645,11 +645,10 @@
   const std::string* proxy_config_str =
       shill_dictionary_->FindStringKey(shill::kProxyConfigProperty);
   if (proxy_config_str && !proxy_config_str->empty()) {
-    std::unique_ptr<base::Value> proxy_config_value(
-        ReadDictionaryFromJson(*proxy_config_str));
-    if (proxy_config_value) {
+    base::Value proxy_config_value = ReadDictionaryFromJson(*proxy_config_str);
+    if (!proxy_config_value.is_none()) {
       base::Value proxy_settings =
-          ConvertProxyConfigToOncProxySettings(*proxy_config_value);
+          ConvertProxyConfigToOncProxySettings(proxy_config_value);
       if (!proxy_settings.is_none()) {
         onc_object_->SetKey(::onc::network_config::kProxySettings,
                             std::move(proxy_settings));
diff --git a/chromeos/network/onc/onc_utils.cc b/chromeos/network/onc/onc_utils.cc
index 9934db5a2..c71993e 100644
--- a/chromeos/network/onc/onc_utils.cc
+++ b/chromeos/network/onc/onc_utils.cc
@@ -123,13 +123,13 @@
 // passphrases) in ONC.
 class OncMaskValues : public Mapper {
  public:
-  static std::unique_ptr<base::DictionaryValue> Mask(
-      const OncValueSignature& signature,
-      const base::DictionaryValue& onc_object,
-      const std::string& mask) {
+  static base::Value Mask(const OncValueSignature& signature,
+                          const base::Value& onc_object,
+                          const std::string& mask) {
     OncMaskValues masker(mask);
     bool unused_error;
-    return masker.MapObject(signature, onc_object, &unused_error);
+    return base::Value::FromUniquePtrValue(
+        masker.MapObject(signature, onc_object, &unused_error));
   }
 
  protected:
@@ -645,24 +645,23 @@
     "{\"Type\":\"UnencryptedConfiguration\",\"NetworkConfigurations\":[],"
     "\"Certificates\":[]}";
 
-std::unique_ptr<base::Value> ReadDictionaryFromJson(const std::string& json) {
+base::Value ReadDictionaryFromJson(const std::string& json) {
   if (json.empty()) {
     // Policy may contain empty values, just log a debug message.
     NET_LOG(DEBUG) << "Empty json string";
-    return nullptr;
+    return base::Value();
   }
   base::JSONReader::ValueWithError parsed_json =
       base::JSONReader::ReadAndReturnValueWithError(
           json, base::JSON_ALLOW_TRAILING_COMMAS);
   if (!parsed_json.value || !parsed_json.value->is_dict()) {
     NET_LOG(ERROR) << "Invalid JSON Dictionary: " << parsed_json.error_message;
-    return nullptr;
+    return base::Value();
   }
-  return base::Value::ToUniquePtrValue(std::move(*parsed_json.value));
+  return std::move(*parsed_json.value);
 }
 
-std::unique_ptr<base::Value> Decrypt(const std::string& passphrase,
-                                     const base::Value& root) {
+base::Value Decrypt(const std::string& passphrase, const base::Value& root) {
   const int kKeySizeInBits = 256;
   const int kMaxIterationCount = 500000;
   std::string onc_type;
@@ -686,32 +685,32 @@
       !GetString(root, ::onc::toplevel_config::kType, &onc_type) ||
       onc_type != ::onc::toplevel_config::kEncryptedConfiguration) {
     NET_LOG(ERROR) << "Encrypted ONC malformed.";
-    return nullptr;
+    return base::Value();
   }
 
   if (hmac_method != ::onc::encrypted::kSHA1 ||
       cipher != ::onc::encrypted::kAES256 ||
       stretch_method != ::onc::encrypted::kPBKDF2) {
     NET_LOG(ERROR) << "Encrypted ONC unsupported encryption scheme.";
-    return nullptr;
+    return base::Value();
   }
 
   // Make sure iterations != 0, since that's not valid.
   if (iterations == 0) {
     NET_LOG(ERROR) << kUnableToDecrypt;
-    return nullptr;
+    return base::Value();
   }
 
   // Simply a sanity check to make sure we can't lock up the machine
   // for too long with a huge number (or a negative number).
   if (iterations < 0 || iterations > kMaxIterationCount) {
     NET_LOG(ERROR) << "Too many iterations in encrypted ONC";
-    return nullptr;
+    return base::Value();
   }
 
   if (!base::Base64Decode(salt, &salt)) {
     NET_LOG(ERROR) << kUnableToDecode;
-    return nullptr;
+    return base::Value();
   }
 
   std::unique_ptr<crypto::SymmetricKey> key(
@@ -721,41 +720,39 @@
 
   if (!base::Base64Decode(initial_vector, &initial_vector)) {
     NET_LOG(ERROR) << kUnableToDecode;
-    return nullptr;
+    return base::Value();
   }
   if (!base::Base64Decode(ciphertext, &ciphertext)) {
     NET_LOG(ERROR) << kUnableToDecode;
-    return nullptr;
+    return base::Value();
   }
   if (!base::Base64Decode(hmac, &hmac)) {
     NET_LOG(ERROR) << kUnableToDecode;
-    return nullptr;
+    return base::Value();
   }
 
   crypto::HMAC hmac_verifier(crypto::HMAC::SHA1);
   if (!hmac_verifier.Init(key.get()) ||
       !hmac_verifier.Verify(ciphertext, hmac)) {
     NET_LOG(ERROR) << kUnableToDecrypt;
-    return nullptr;
+    return base::Value();
   }
 
   crypto::Encryptor decryptor;
   if (!decryptor.Init(key.get(), crypto::Encryptor::CBC, initial_vector)) {
     NET_LOG(ERROR) << kUnableToDecrypt;
-    return nullptr;
+    return base::Value();
   }
 
   std::string plaintext;
   if (!decryptor.Decrypt(ciphertext, &plaintext)) {
     NET_LOG(ERROR) << kUnableToDecrypt;
-    return nullptr;
+    return base::Value();
   }
 
-  std::unique_ptr<base::Value> new_root = ReadDictionaryFromJson(plaintext);
-  if (!new_root) {
+  base::Value new_root = ReadDictionaryFromJson(plaintext);
+  if (new_root.is_none())
     NET_LOG(ERROR) << "Property dictionary malformed.";
-    return nullptr;
-  }
 
   return new_root;
 }
@@ -854,10 +851,9 @@
       base::Value(base::HexEncode(ssid_string.c_str(), ssid_string.size())));
 }
 
-std::unique_ptr<base::DictionaryValue> MaskCredentialsInOncObject(
-    const OncValueSignature& signature,
-    const base::DictionaryValue& onc_object,
-    const std::string& mask) {
+base::Value MaskCredentialsInOncObject(const OncValueSignature& signature,
+                                       const base::Value& onc_object,
+                                       const std::string& mask) {
   return OncMaskValues::Mask(signature, onc_object, mask);
 }
 
@@ -903,8 +899,8 @@
   if (onc_blob.empty())
     return true;
 
-  std::unique_ptr<base::Value> toplevel_onc = ReadDictionaryFromJson(onc_blob);
-  if (!toplevel_onc) {
+  base::Value toplevel_onc = ReadDictionaryFromJson(onc_blob);
+  if (toplevel_onc.is_none()) {
     NET_LOG(ERROR) << "Not a valid ONC JSON dictionary: "
                    << GetSourceAsString(onc_source);
     return false;
@@ -912,10 +908,10 @@
 
   // Check and see if this is an encrypted ONC file. If so, decrypt it.
   std::string onc_type;
-  if (GetString(*toplevel_onc, ::onc::toplevel_config::kType, &onc_type) &&
+  if (GetString(toplevel_onc, ::onc::toplevel_config::kType, &onc_type) &&
       onc_type == ::onc::toplevel_config::kEncryptedConfiguration) {
-    toplevel_onc = Decrypt(passphrase, *toplevel_onc);
-    if (!toplevel_onc) {
+    toplevel_onc = Decrypt(passphrase, toplevel_onc);
+    if (toplevel_onc.is_none()) {
       NET_LOG(ERROR) << "Unable to decrypt ONC from "
                      << GetSourceAsString(onc_source);
       return false;
@@ -935,10 +931,9 @@
   validator.SetOncSource(onc_source);
 
   Validator::Result validation_result;
-  std::unique_ptr<base::DictionaryValue> toplevel_onc_dict =
-      base::DictionaryValue::From(std::move(toplevel_onc));
-  toplevel_onc = validator.ValidateAndRepairObject(
-      &kToplevelConfigurationSignature, *toplevel_onc_dict, &validation_result);
+  std::unique_ptr<base::DictionaryValue> validated_toplevel_onc =
+      validator.ValidateAndRepairObject(&kToplevelConfigurationSignature,
+                                        toplevel_onc, &validation_result);
 
   if (from_policy) {
     UMA_HISTOGRAM_BOOLEAN("Enterprise.ONC.PolicyValidation",
@@ -950,14 +945,15 @@
     NET_LOG(DEBUG) << "ONC validation produced warnings: "
                    << GetSourceAsString(onc_source);
     success = false;
-  } else if (validation_result == Validator::INVALID || !toplevel_onc) {
+  } else if (validation_result == Validator::INVALID ||
+             !validated_toplevel_onc) {
     NET_LOG(ERROR) << "ONC is invalid and couldn't be repaired: "
                    << GetSourceAsString(onc_source);
     return false;
   }
 
   if (certificates) {
-    base::Value* validated_certs = toplevel_onc->FindKeyOfType(
+    base::Value* validated_certs = validated_toplevel_onc->FindKeyOfType(
         ::onc::toplevel_config::kCertificates, base::Value::Type::LIST);
     if (validated_certs)
       *certificates = base::ListValue(validated_certs->TakeList());
@@ -967,7 +963,7 @@
   // nullptr, because ResolveServerCertRefsInNetworks could affect the return
   // value of the function (which is supposed to aggregate validation issues in
   // all segments of the ONC blob).
-  base::Value* validated_networks = toplevel_onc->FindKeyOfType(
+  base::Value* validated_networks = validated_toplevel_onc->FindKeyOfType(
       ::onc::toplevel_config::kNetworkConfigurations, base::Value::Type::LIST);
   base::ListValue* validated_networks_list;
   if (validated_networks &&
@@ -990,9 +986,10 @@
   }
 
   if (global_network_config) {
-    base::Value* validated_global_config = toplevel_onc->FindKeyOfType(
-        ::onc::toplevel_config::kGlobalNetworkConfiguration,
-        base::Value::Type::DICTIONARY);
+    base::Value* validated_global_config =
+        validated_toplevel_onc->FindKeyOfType(
+            ::onc::toplevel_config::kGlobalNetworkConfiguration,
+            base::Value::Type::DICTIONARY);
     if (validated_global_config) {
       base::DictionaryValue* validated_global_config_dict = nullptr;
       if (validated_global_config->GetAsDictionary(
@@ -1110,6 +1107,8 @@
 
 base::Value ConvertProxyConfigToOncProxySettings(
     const base::Value& proxy_config_value) {
+  DCHECK(proxy_config_value.is_dict());
+
   // Create a ProxyConfigDictionary from the dictionary.
   ProxyConfigDictionary proxy_config(proxy_config_value.Clone());
 
diff --git a/chromeos/network/onc/onc_utils.h b/chromeos/network/onc/onc_utils.h
index 461439c..1331f9a 100644
--- a/chromeos/network/onc/onc_utils.h
+++ b/chromeos/network/onc/onc_utils.h
@@ -45,16 +45,15 @@
 
 // Parses |json| according to the JSON format. If |json| is a JSON formatted
 // dictionary, the function returns the dictionary value, otherwise returns
-// null.
+// an empty Value.
 COMPONENT_EXPORT(CHROMEOS_NETWORK)
-std::unique_ptr<base::Value> ReadDictionaryFromJson(const std::string& json);
+base::Value ReadDictionaryFromJson(const std::string& json);
 
 // Decrypts the given EncryptedConfiguration |onc| (see the ONC specification)
 // using |passphrase|. The resulting UnencryptedConfiguration is returned. If an
-// error occurs, returns null.
+// error occurs, returns an empty Value.
 COMPONENT_EXPORT(CHROMEOS_NETWORK)
-std::unique_ptr<base::Value> Decrypt(const std::string& passphrase,
-                                     const base::Value& onc);
+base::Value Decrypt(const std::string& passphrase, const base::Value& onc);
 
 // For logging only: strings not user facing.
 COMPONENT_EXPORT(CHROMEOS_NETWORK)
@@ -91,10 +90,9 @@
 // by |mask|. To find sensitive fields, signature and field name are checked
 // with the function FieldIsCredential().
 COMPONENT_EXPORT(CHROMEOS_NETWORK)
-std::unique_ptr<base::DictionaryValue> MaskCredentialsInOncObject(
-    const OncValueSignature& signature,
-    const base::DictionaryValue& onc_object,
-    const std::string& mask);
+base::Value MaskCredentialsInOncObject(const OncValueSignature& signature,
+                                       const base::Value& onc_object,
+                                       const std::string& mask);
 
 // Decrypts |onc_blob| with |passphrase| if necessary. Clears |network_configs|,
 // |global_network_config| and |certificates| and fills them with the validated
diff --git a/chromeos/network/onc/onc_utils_unittest.cc b/chromeos/network/onc/onc_utils_unittest.cc
index e212f358..b75b1a2 100644
--- a/chromeos/network/onc/onc_utils_unittest.cc
+++ b/chromeos/network/onc/onc_utils_unittest.cc
@@ -46,39 +46,35 @@
 namespace onc {
 
 TEST(ONCDecrypterTest, BrokenEncryptionIterations) {
-  std::unique_ptr<base::Value> encrypted_onc =
-      test_utils::ReadTestDictionary("broken-encrypted-iterations.onc");
+  base::Value encrypted_onc =
+      test_utils::ReadTestDictionaryValue("broken-encrypted-iterations.onc");
 
-  std::unique_ptr<base::Value> decrypted_onc =
-      Decrypt("test0000", *encrypted_onc);
+  base::Value decrypted_onc = Decrypt("test0000", encrypted_onc);
 
-  EXPECT_EQ(nullptr, decrypted_onc.get());
+  EXPECT_TRUE(decrypted_onc.is_none());
 }
 
 TEST(ONCDecrypterTest, BrokenEncryptionZeroIterations) {
-  std::unique_ptr<base::Value> encrypted_onc =
-      test_utils::ReadTestDictionary("broken-encrypted-zero-iterations.onc");
+  base::Value encrypted_onc = test_utils::ReadTestDictionaryValue(
+      "broken-encrypted-zero-iterations.onc");
 
-  std::string error;
-  std::unique_ptr<base::Value> decrypted_onc =
-      Decrypt("test0000", *encrypted_onc);
+  base::Value decrypted_onc = Decrypt("test0000", encrypted_onc);
 
-  EXPECT_EQ(nullptr, decrypted_onc.get());
+  EXPECT_TRUE(decrypted_onc.is_none());
 }
 
 TEST(ONCDecrypterTest, LoadEncryptedOnc) {
-  std::unique_ptr<base::Value> encrypted_onc =
-      test_utils::ReadTestDictionary("encrypted.onc");
-  std::unique_ptr<base::Value> expected_decrypted_onc =
-      test_utils::ReadTestDictionary("decrypted.onc");
+  base::Value encrypted_onc =
+      test_utils::ReadTestDictionaryValue("encrypted.onc");
+  base::Value expected_decrypted_onc =
+      test_utils::ReadTestDictionaryValue("decrypted.onc");
 
   std::string error;
-  std::unique_ptr<base::Value> actual_decrypted_onc =
-      Decrypt("test0000", *encrypted_onc);
+  base::Value actual_decrypted_onc = Decrypt("test0000", encrypted_onc);
 
   base::Value emptyDict;
-  EXPECT_TRUE(test_utils::Equals(expected_decrypted_onc.get(),
-                                 actual_decrypted_onc.get()));
+  EXPECT_TRUE(
+      test_utils::Equals(&expected_decrypted_onc, &actual_decrypted_onc));
 }
 
 namespace {
diff --git a/chromeos/network/onc/onc_validator.cc b/chromeos/network/onc/onc_validator.cc
index 4dd4fcee..f677f8d21 100644
--- a/chromeos/network/onc/onc_validator.cc
+++ b/chromeos/network/onc/onc_validator.cc
@@ -120,7 +120,7 @@
 
 std::unique_ptr<base::DictionaryValue> Validator::MapObject(
     const OncValueSignature& signature,
-    const base::DictionaryValue& onc_object,
+    const base::Value& onc_object,
     bool* error) {
   std::unique_ptr<base::DictionaryValue> repaired(new base::DictionaryValue);
 
@@ -246,7 +246,7 @@
 }
 
 bool Validator::ValidateObjectDefault(const OncValueSignature& signature,
-                                      const base::DictionaryValue& onc_object,
+                                      const base::Value& onc_object,
                                       base::DictionaryValue* result) {
   bool found_unknown_field = false;
   bool nested_error_occured = false;
@@ -604,9 +604,9 @@
 }
 
 bool Validator::IsGlobalNetworkConfigInUserImport(
-    const base::DictionaryValue& onc_object) {
+    const base::Value& onc_object) {
   if (onc_source_ == ::onc::ONC_SOURCE_USER_IMPORT &&
-      onc_object.HasKey(::onc::toplevel_config::kGlobalNetworkConfiguration)) {
+      onc_object.FindKey(::onc::toplevel_config::kGlobalNetworkConfiguration)) {
     std::ostringstream msg;
     msg << "Field '" << ::onc::toplevel_config::kGlobalNetworkConfiguration
         << "' is prohibited in ONC user imports";
diff --git a/chromeos/network/onc/onc_validator.h b/chromeos/network/onc/onc_validator.h
index 41670c0..5f187e0 100644
--- a/chromeos/network/onc/onc_validator.h
+++ b/chromeos/network/onc/onc_validator.h
@@ -130,7 +130,7 @@
   // repaired dictionary. Only on error returns NULL.
   std::unique_ptr<base::DictionaryValue> MapObject(
       const OncValueSignature& signature,
-      const base::DictionaryValue& onc_object,
+      const base::Value& onc_object,
       bool* error) override;
 
   // Pushes/pops the |field_name| to |path_|, otherwise like |Mapper::MapField|.
@@ -158,7 +158,7 @@
   // |onc_object| according to |object_signature|. |result| must point to a
   // dictionary into which the repaired fields are written.
   bool ValidateObjectDefault(const OncValueSignature& object_signature,
-                             const base::DictionaryValue& onc_object,
+                             const base::Value& onc_object,
                              base::DictionaryValue* result);
 
   // Validates/repairs the kRecommended array in |result| according to
@@ -207,7 +207,7 @@
       const std::vector<const char*>& valid_values);
 
   bool FieldExistsAndIsNotInRange(const base::DictionaryValue& object,
-                                  const std::string &field_name,
+                                  const std::string& field_name,
                                   int lower_bound,
                                   int upper_bound);
 
@@ -245,11 +245,10 @@
   // order to identify duplicates.
   bool CheckGuidIsUniqueAndAddToSet(const base::DictionaryValue& dict,
                                     const std::string& kGUID,
-                                    std::set<std::string> *guids);
+                                    std::set<std::string>* guids);
 
   // Prohibit global network configuration in user ONC imports.
-  bool IsGlobalNetworkConfigInUserImport(
-      const base::DictionaryValue& onc_object);
+  bool IsGlobalNetworkConfigInUserImport(const base::Value& onc_object);
 
   void AddValidationIssue(bool is_error, const std::string& debug_info);
 
diff --git a/chromeos/network/onc/onc_validator_unittest.cc b/chromeos/network/onc/onc_validator_unittest.cc
index 934c89e..79fb606 100644
--- a/chromeos/network/onc/onc_validator_unittest.cc
+++ b/chromeos/network/onc/onc_validator_unittest.cc
@@ -28,7 +28,7 @@
   // validation is stored, so that expectations can be checked afterwards using
   // one of the Expect* functions below.
   void Validate(bool strict,
-                std::unique_ptr<base::Value> onc_object,
+                base::Value onc_object,
                 const OncValueSignature* signature,
                 bool managed_onc,
                 ::onc::ONCSource onc_source) {
@@ -51,19 +51,17 @@
                                       true);        // log_warnings
     }
     validator->SetOncSource(onc_source);
-    original_object_ = base::DictionaryValue::From(std::move(onc_object));
+    original_object_ = std::move(onc_object);
     repaired_object_ = validator->ValidateAndRepairObject(
-        signature, *original_object_, &validation_result_);
+        signature, original_object_, &validation_result_);
   }
 
   void ExpectValid() {
     EXPECT_EQ(Validator::VALID, validation_result_);
-    EXPECT_TRUE(
-        test_utils::Equals(original_object_.get(), repaired_object_.get()));
+    EXPECT_TRUE(test_utils::Equals(&original_object_, repaired_object_.get()));
   }
 
-  void ExpectRepairWithWarnings(
-      const base::DictionaryValue& expected_repaired) {
+  void ExpectRepairWithWarnings(const base::Value& expected_repaired) {
     EXPECT_EQ(Validator::VALID_WITH_WARNINGS, validation_result_);
     EXPECT_TRUE(test_utils::Equals(&expected_repaired, repaired_object_.get()));
   }
@@ -75,7 +73,7 @@
 
  private:
   Validator::Result validation_result_;
-  std::unique_ptr<const base::DictionaryValue> original_object_;
+  base::Value original_object_;
   std::unique_ptr<const base::DictionaryValue> repaired_object_;
 };
 
@@ -123,15 +121,15 @@
 
 TEST_P(ONCValidatorValidTest, StrictValidationValid) {
   OncParams onc = GetParam();
-  Validate(true, test_utils::ReadTestDictionary(onc.location), onc.signature,
-           onc.is_managed, onc.onc_source);
+  Validate(true, test_utils::ReadTestDictionaryValue(onc.location),
+           onc.signature, onc.is_managed, onc.onc_source);
   ExpectValid();
 }
 
 TEST_P(ONCValidatorValidTest, LiberalValidationValid) {
   OncParams onc = GetParam();
-  Validate(false, test_utils::ReadTestDictionary(onc.location), onc.signature,
-           onc.is_managed, onc.onc_source);
+  Validate(false, test_utils::ReadTestDictionaryValue(onc.location),
+           onc.signature, onc.is_managed, onc.onc_source);
   ExpectValid();
 }
 
@@ -289,13 +287,12 @@
  public:
   // Load the common test data and return the dictionary at the field with
   // name |name|.
-  std::unique_ptr<base::DictionaryValue> GetDictionaryFromTestFile(
-      const std::string& name) {
-    std::unique_ptr<const base::DictionaryValue> dict(
-        test_utils::ReadTestDictionary("invalid_settings_with_repairs.json"));
-    const base::DictionaryValue* onc_object = NULL;
-    CHECK(dict->GetDictionary(name, &onc_object));
-    return base::WrapUnique(onc_object->DeepCopy());
+  base::Value GetDictionaryFromTestFile(const std::string& name) {
+    base::Value dict = test_utils::ReadTestDictionaryValue(
+        "invalid_settings_with_repairs.json");
+    base::Value* result = dict.FindKey(name);
+    EXPECT_TRUE(result);
+    return result ? std::move(*result) : base::Value();
   }
 };
 
@@ -308,7 +305,7 @@
   if (location_of_repaired.empty())
     ExpectInvalid();
   else
-    ExpectRepairWithWarnings(*GetDictionaryFromTestFile(location_of_repaired));
+    ExpectRepairWithWarnings(GetDictionaryFromTestFile(location_of_repaired));
 }
 
 TEST_P(ONCValidatorTestRepairable, LiberalValidation) {
@@ -323,8 +320,7 @@
     if (location_of_repaired.empty())
       ExpectInvalid();
     else
-      ExpectRepairWithWarnings(
-          *GetDictionaryFromTestFile(location_of_repaired));
+      ExpectRepairWithWarnings(GetDictionaryFromTestFile(location_of_repaired));
   }
 }
 
diff --git a/chromeos/network/policy_util.cc b/chromeos/network/policy_util.cc
index c3c9c800..5da5d8b 100644
--- a/chromeos/network/policy_util.cc
+++ b/chromeos/network/policy_util.cc
@@ -374,9 +374,10 @@
     // Shill's GetProperties doesn't return credentials. Masking credentials
     // instead of just removing them, allows remembering if a credential is set
     // or not.
-    std::unique_ptr<base::DictionaryValue> sanitized_user_settings(
-        onc::MaskCredentialsInOncObject(onc::kNetworkConfigurationSignature,
-                                        *user_settings, kFakeCredential));
+    std::unique_ptr<base::Value> sanitized_user_settings =
+        base::Value::ToUniquePtrValue(
+            onc::MaskCredentialsInOncObject(onc::kNetworkConfigurationSignature,
+                                            *user_settings, kFakeCredential));
     ui_data->SetUserSettingsDictionary(std::move(sanitized_user_settings));
   }
 
diff --git a/chromeos/network/proxy/ui_proxy_config_service_unittest.cc b/chromeos/network/proxy/ui_proxy_config_service_unittest.cc
index 7b43c6d..4ec46ff8 100644
--- a/chromeos/network/proxy/ui_proxy_config_service_unittest.cc
+++ b/chromeos/network/proxy/ui_proxy_config_service_unittest.cc
@@ -121,12 +121,11 @@
   ~UIProxyConfigServiceTest() override = default;
 
   void ConfigureService(const std::string& shill_json_string) {
-    std::unique_ptr<base::DictionaryValue> shill_json_dict =
-        base::DictionaryValue::From(
-            onc::ReadDictionaryFromJson(shill_json_string));
-    ASSERT_TRUE(shill_json_dict);
+    base::Value shill_json_dict =
+        onc::ReadDictionaryFromJson(shill_json_string);
+    ASSERT_TRUE(shill_json_dict.is_dict());
     ShillManagerClient::Get()->ConfigureService(
-        *shill_json_dict, base::DoNothing(),
+        shill_json_dict, base::DoNothing(),
         base::BindOnce([](const std::string& name, const std::string& msg) {}));
     base::RunLoop().RunUntilIdle();
   }
diff --git a/chromeos/network/shill_property_util.cc b/chromeos/network/shill_property_util.cc
index c8d98e3..7f79f593 100644
--- a/chromeos/network/shill_property_util.cc
+++ b/chromeos/network/shill_property_util.cc
@@ -197,11 +197,10 @@
     return std::unique_ptr<NetworkUIData>();
   if (ui_data_str.empty())
     return std::make_unique<NetworkUIData>();
-  std::unique_ptr<base::Value> ui_data_dict(
-      chromeos::onc::ReadDictionaryFromJson(ui_data_str));
-  if (!ui_data_dict)
+  base::Value ui_data_dict = chromeos::onc::ReadDictionaryFromJson(ui_data_str);
+  if (!ui_data_dict.is_dict())
     return std::unique_ptr<NetworkUIData>();
-  return std::make_unique<NetworkUIData>(*ui_data_dict);
+  return std::make_unique<NetworkUIData>(ui_data_dict);
 }
 
 std::unique_ptr<NetworkUIData> GetUIDataFromProperties(
diff --git a/chromeos/profiles/airmont.afdo.newest.txt b/chromeos/profiles/airmont.afdo.newest.txt
index 8767837..7100799 100644
--- a/chromeos/profiles/airmont.afdo.newest.txt
+++ b/chromeos/profiles/airmont.afdo.newest.txt
@@ -1 +1 @@
-chromeos-chrome-amd64-airmont-87-4265.0-1601895675-benchmark-87.0.4280.13-r1-redacted.afdo.xz
+chromeos-chrome-amd64-airmont-87-4265.0-1601895675-benchmark-87.0.4280.14-r1-redacted.afdo.xz
diff --git a/chromeos/profiles/broadwell.afdo.newest.txt b/chromeos/profiles/broadwell.afdo.newest.txt
index ca95ce2..1d3db2b 100644
--- a/chromeos/profiles/broadwell.afdo.newest.txt
+++ b/chromeos/profiles/broadwell.afdo.newest.txt
@@ -1 +1 @@
-chromeos-chrome-amd64-broadwell-87-4265.0-1601892862-benchmark-87.0.4280.13-r1-redacted.afdo.xz
+chromeos-chrome-amd64-broadwell-87-4265.0-1601892862-benchmark-87.0.4280.14-r1-redacted.afdo.xz
diff --git a/chromeos/profiles/silvermont.afdo.newest.txt b/chromeos/profiles/silvermont.afdo.newest.txt
index 96ea487..a40a982 100644
--- a/chromeos/profiles/silvermont.afdo.newest.txt
+++ b/chromeos/profiles/silvermont.afdo.newest.txt
@@ -1 +1 @@
-chromeos-chrome-amd64-silvermont-87-4265.0-1601890590-benchmark-87.0.4280.13-r1-redacted.afdo.xz
+chromeos-chrome-amd64-silvermont-87-4265.0-1601890590-benchmark-87.0.4280.14-r1-redacted.afdo.xz
diff --git a/chromeos/services/assistant/assistant_manager_service_impl.cc b/chromeos/services/assistant/assistant_manager_service_impl.cc
index 3b8cd6b..5e51a71 100644
--- a/chromeos/services/assistant/assistant_manager_service_impl.cc
+++ b/chromeos/services/assistant/assistant_manager_service_impl.cc
@@ -989,17 +989,6 @@
       /*is_user_initiated=*/true);
 }
 
-bool AssistantManagerServiceImpl::IsSettingSupported(
-    const std::string& setting_id) {
-  DVLOG(2) << "IsSettingSupported=" << setting_id;
-
-  return settings_delegate_->IsSettingSupported(setting_id);
-}
-
-bool AssistantManagerServiceImpl::SupportsModifySettings() {
-  return true;
-}
-
 void AssistantManagerServiceImpl::OnNotificationRemoved(
     const std::string& grouping_key) {
   ENSURE_MAIN_THREAD(&AssistantManagerServiceImpl::OnNotificationRemoved,
diff --git a/chromeos/services/assistant/assistant_manager_service_impl.h b/chromeos/services/assistant/assistant_manager_service_impl.h
index c675ce2..ff05a476 100644
--- a/chromeos/services/assistant/assistant_manager_service_impl.h
+++ b/chromeos/services/assistant/assistant_manager_service_impl.h
@@ -196,8 +196,6 @@
   void OnRespondingStarted(bool is_error_response) override;
 
   // AssistantManagerDelegate overrides:
-  bool IsSettingSupported(const std::string& setting_id) override;
-  bool SupportsModifySettings() override;
   void OnConversationTurnStartedInternal(
       const assistant_client::ConversationTurnMetadata& metadata) override;
   void OnNotificationRemoved(const std::string& grouping_key) override;
@@ -279,9 +277,9 @@
   // Record the response type for each query. Note that query on device
   // actions (e.g. turn on Bluetooth, turn on WiFi) will cause duplicate
   // record because it interacts with server twice on on the same query.
-  // The first round interaction checks IsSettingSupported with no responses
-  // sent back and ends normally (will be recorded as kUnspecified), and
-  // settings modification proto along with any text/voice responses would
+  // The first round interaction checks if a setting is supported with no
+  // responses sent back and ends normally (will be recorded as kUnspecified),
+  // and settings modification proto along with any text/voice responses would
   // be sent back in the second round (recorded as kDeviceAction).
   void RecordQueryResponseTypeUMA();
 
diff --git a/chromeos/services/network_config/cros_network_config_unittest.cc b/chromeos/services/network_config/cros_network_config_unittest.cc
index c5540bc..70cd015 100644
--- a/chromeos/services/network_config/cros_network_config_unittest.cc
+++ b/chromeos/services/network_config/cros_network_config_unittest.cc
@@ -131,15 +131,14 @@
         /*global_network_config=*/base::DictionaryValue());
 
     const std::string user_policy_ssid = "wifi2";
-    base::Value wifi2_onc = base::Value::FromUniquePtrValue(
-        onc::ReadDictionaryFromJson(base::StringPrintf(
-            R"({"GUID": "wifi2_guid", "Type": "WiFi",
+    base::Value wifi2_onc = onc::ReadDictionaryFromJson(base::StringPrintf(
+        R"({"GUID": "wifi2_guid", "Type": "WiFi",
                 "Name": "wifi2", "Priority": 0,
                 "WiFi": { "Passphrase": "fake", "SSID": "%s", "HexSSID": "%s",
                           "Security": "WPA-PSK", "AutoConnect": true}})",
-            user_policy_ssid.c_str(),
-            base::HexEncode(user_policy_ssid.c_str(), user_policy_ssid.size())
-                .c_str())));
+        user_policy_ssid.c_str(),
+        base::HexEncode(user_policy_ssid.c_str(), user_policy_ssid.size())
+            .c_str()));
     base::ListValue user_policy_onc;
     user_policy_onc.Append(std::move(wifi2_onc));
     managed_network_configuration_handler_->SetPolicy(
diff --git a/chromeos/strings/chromeos_strings_af.xtb b/chromeos/strings/chromeos_strings_af.xtb
index 7ce7bdc..005568d 100644
--- a/chromeos/strings/chromeos_strings_af.xtb
+++ b/chromeos/strings/chromeos_strings_af.xtb
@@ -89,6 +89,7 @@
 <translation id="8294431847097064396">Bron</translation>
 <translation id="8347227221149377169">Druktake</translation>
 <translation id="8352772353338965963">Voeg 'n rekening by meervuldige aanmelding. Daar kan sonder 'n wagwoord by alle aangemelde rekeninge ingegaan word, en daarom moet hierdie kenmerk net met vertroude rekeninge gebruik word.</translation>
+<translation id="8668052347555487755">Kleurmodus</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> bestuur hierdie gebruiker. Dit kan dalk oor 'n afstand instellings bestuur en gebruikeraktiwiteit monitor.</translation>
 <translation id="871560550817059752">Misluk – Ink is op</translation>
 <translation id="8726019395068607495">Gestop – deur is oop</translation>
diff --git a/chromeos/strings/chromeos_strings_am.xtb b/chromeos/strings/chromeos_strings_am.xtb
index eb0550b..6859bb1d 100644
--- a/chromeos/strings/chromeos_strings_am.xtb
+++ b/chromeos/strings/chromeos_strings_am.xtb
@@ -89,6 +89,7 @@
 <translation id="8294431847097064396">ምንጭ</translation>
 <translation id="8347227221149377169">የኅትመት ሥራዎች</translation>
 <translation id="8352772353338965963">አንድ መለያ ባለብዙ መለያ መግቢያ ላይ ያክሉ። ሁሉም የተገባባቸው መለያዎች ያለይለፍ ቃል ሊደረስባቸው ይችላሉ፣ ስለዚህ ይህ ባህሪ በታመኑ መለያዎች ላይ ብቻ ነው መጠቀም ያለባቸው።</translation>
+<translation id="8668052347555487755">የቀለም ሁነታ</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> እነኚህን ተጠቃሚ ያስተዳድራል። ቅንብሮችን የተጠቃሚ እንቅስቃሴን በርቀት ሊያስተዳድር እና ሊቆጣጠር ይችላል።</translation>
 <translation id="871560550817059752">አልተሳካም - ቀለም አልቋል</translation>
 <translation id="8726019395068607495">ቆሟል - በር ክፍት ነው</translation>
diff --git a/chromeos/strings/chromeos_strings_ar.xtb b/chromeos/strings/chromeos_strings_ar.xtb
index e60a0e3..bc5226d 100644
--- a/chromeos/strings/chromeos_strings_ar.xtb
+++ b/chromeos/strings/chromeos_strings_ar.xtb
@@ -89,6 +89,7 @@
 <translation id="8294431847097064396">المصدر</translation>
 <translation id="8347227221149377169">مهام الطباعة</translation>
 <translation id="8352772353338965963">يمكنك إضافة حساب إلى الدخول المتعدد. يمكن الدخول إلى جميع الحسابات التي تم تسجيل الدخول إليها بدون كلمة مرور، لذا فإن هذه الميزة لا يجب استخدامها إلا مع الحسابات الموثوق بها.</translation>
+<translation id="8668052347555487755">وضع اللون</translation>
 <translation id="8701136875688985581">يُدير <ph name="ENROLLMENT_DOMAIN" /> هذا المستخدِم. وقد يعمل على إدارة الإعدادات ورصد نشاط المستخدِم.</translation>
 <translation id="871560550817059752">تعذَّرت الطباعة - نفد الحبر</translation>
 <translation id="8726019395068607495">توقّفت الطابعة - باب الطابعة مفتوح</translation>
diff --git a/chromeos/strings/chromeos_strings_as.xtb b/chromeos/strings/chromeos_strings_as.xtb
index 0bf5667..e3db393 100644
--- a/chromeos/strings/chromeos_strings_as.xtb
+++ b/chromeos/strings/chromeos_strings_as.xtb
@@ -89,6 +89,7 @@
 <translation id="8294431847097064396">উৎস</translation>
 <translation id="8347227221149377169">প্ৰিণ্টিঙৰ কামসমূহ</translation>
 <translation id="8352772353338965963">একাধিক ছাইন-ইন কৰিবলৈ এটা একাউণ্ট যোগ কৰক। ছাইন ইন কৰি থোৱা সকলো একাউণ্ট পাছৱৰ্ড অবিহনেই এক্সেছ কৰিব পাৰি, সেয়েহে এই সুবিধাটো কেৱল বিশ্বাসযোগ্য একাউণ্টৰ সৈতেহে ব্যৱহাৰ কৰা উচিত।</translation>
+<translation id="8668052347555487755">ৰঙৰ ম'ড</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" />এ এই ব্যৱহাৰকাৰী গৰাকীক পৰিচালনা কৰে। এইটোৱে হয়তো দূৰৰ পৰা ছেটিংসমূহ পৰিচালনা কৰিব আৰু ব্যৱহাৰকাৰীৰ কার্যকলাপ নিৰীক্ষণ কৰিব পাৰে।</translation>
 <translation id="871560550817059752">বিফল হৈছে - চিয়াহী শেষ হৈছে</translation>
 <translation id="8726019395068607495">বন্ধ হৈছে - দুৱাৰ খোল খাই আছে</translation>
diff --git a/chromeos/strings/chromeos_strings_az.xtb b/chromeos/strings/chromeos_strings_az.xtb
index aeaff137..55f5ff36 100644
--- a/chromeos/strings/chromeos_strings_az.xtb
+++ b/chromeos/strings/chromeos_strings_az.xtb
@@ -88,6 +88,7 @@
 <translation id="8294431847097064396">Mənbə</translation>
 <translation id="8347227221149377169">Çap işləri</translation>
 <translation id="8352772353338965963">Çoxsaylı giriş üçün hesab əlavə edin. Bu hesablara parolsuz daxil olmaq olar, ona görə də bu funksiya yalnız güvənilən hesablar ilə işlədilməlidir.</translation>
+<translation id="8668052347555487755">Rəng rejimi</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> bu istifadəçini idarə edir. O, ayarları məsafədən idarə edə və istifadəçi fəaliyyətini izləyə bilər.</translation>
 <translation id="871560550817059752">Alınmadı - Mürəkkəb yoxdur</translation>
 <translation id="8726019395068607495">Dayanıb - Qapı açıqdır</translation>
diff --git a/chromeos/strings/chromeos_strings_be.xtb b/chromeos/strings/chromeos_strings_be.xtb
index 12497a21..6f15570 100644
--- a/chromeos/strings/chromeos_strings_be.xtb
+++ b/chromeos/strings/chromeos_strings_be.xtb
@@ -89,6 +89,7 @@
 <translation id="8294431847097064396">Крыніца</translation>
 <translation id="8347227221149377169">Заданні друку</translation>
 <translation id="8352772353338965963">Дадайце ўліковы запіс для функцыі ўваходу ў некалькі ўліковых запісаў. Гэта функцыя дае магчымасць пераключацца паміж уліковымі запісамі, у якія выкананы ўваход, без уводу пароля. Таму выкарыстоўвайце яе толькі для ўліковых запісаў, якім давяраеце.</translation>
+<translation id="8668052347555487755">Рэжым колеру</translation>
 <translation id="8701136875688985581">Гэты карыстальнік знаходзіцца пад кіраваннем дамена <ph name="ENROLLMENT_DOMAIN" />. Дамен можа кіраваць наладамі карыстальніка і адсочваць яго дзеянні.</translation>
 <translation id="871560550817059752">Збой: скончылася чарніла</translation>
 <translation id="8726019395068607495">Спынена: дзверцы прынтара адкрыты</translation>
diff --git a/chromeos/strings/chromeos_strings_bg.xtb b/chromeos/strings/chromeos_strings_bg.xtb
index 4b0fcaf..f72ba9c 100644
--- a/chromeos/strings/chromeos_strings_bg.xtb
+++ b/chromeos/strings/chromeos_strings_bg.xtb
@@ -89,6 +89,7 @@
 <translation id="8294431847097064396">Източник</translation>
 <translation id="8347227221149377169">Задания за отпечатване</translation>
 <translation id="8352772353338965963">Добавете профил към функцията за централизиран вход. Всички профили, в които влезете чрез нея, ще бъдат достъпни без парола, така че трябва да използвате тази функция само с надеждни профили.</translation>
+<translation id="8668052347555487755">Цветови режим</translation>
 <translation id="8701136875688985581">Този потребител се управлява от <ph name="ENROLLMENT_DOMAIN" />. Възможно е отдалечено управление на настройките и наблюдение на потребителската активност.</translation>
 <translation id="871560550817059752">Неуспешно – няма мастило</translation>
 <translation id="8726019395068607495">Спряло – вратичката е отворена</translation>
diff --git a/chromeos/strings/chromeos_strings_bn.xtb b/chromeos/strings/chromeos_strings_bn.xtb
index af6d0b2..7270e32 100644
--- a/chromeos/strings/chromeos_strings_bn.xtb
+++ b/chromeos/strings/chromeos_strings_bn.xtb
@@ -88,6 +88,7 @@
 <translation id="8294431847097064396">উৎস</translation>
 <translation id="8347227221149377169">প্রিন্ট করার কাজগুলি</translation>
 <translation id="8352772353338965963">একাধিক সাইন-ইন-এ একটি অ্যাকাউন্ট যোগ করুন৷ সমস্ত সাইন-ইন থাকা অ্যাকাউন্টগুলি কোনো পাসওয়ার্ড ছাড়াই অ্যাক্সেস করা যাবে, তাই এই বৈশিষ্ট্যটি শুধুমাত্র বিশ্বস্ত অ্যাকাউন্টগুলির সাথে ব্যবহার করা উচিৎ৷</translation>
+<translation id="8668052347555487755">কালার মোড</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> এই ব্যবহারকারীকে ম্যানেজ করে। এটি দূর থেকে সেটিংস ম্যানেজ করতে পারে এবং ব্যবহারকারীর গতিবিধির উপর নজর রাখতে পারে।</translation>
 <translation id="871560550817059752">প্রিন্ট করা যায়নি - প্রিন্টারে কালি নেই</translation>
 <translation id="8726019395068607495">বন্ধ হয়ে গেছে - প্রিন্টার ডোর খোলা আছে</translation>
diff --git a/chromeos/strings/chromeos_strings_bs.xtb b/chromeos/strings/chromeos_strings_bs.xtb
index 0466b48..19f834a 100644
--- a/chromeos/strings/chromeos_strings_bs.xtb
+++ b/chromeos/strings/chromeos_strings_bs.xtb
@@ -89,6 +89,7 @@
 <translation id="8294431847097064396">Izvor</translation>
 <translation id="8347227221149377169">Zadaci štampanja</translation>
 <translation id="8352772353338965963">Dodajte račun za višestruku prijavu. Svim računima na kojima je izvršena prijava je moguće pristupiti bez lozinke. Ovu funkciju treba koristiti isključivo s pouzdanim računima.</translation>
+<translation id="8668052347555487755">Način rada boja</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> upravlja ovim korisnikom. Može udaljeno upravljati postavkama i pratiti aktivnost korisnika.</translation>
 <translation id="871560550817059752">Nije uspjelo – nema tinte</translation>
 <translation id="8726019395068607495">Zaustavljeno – poklopac je otvoren</translation>
diff --git a/chromeos/strings/chromeos_strings_ca.xtb b/chromeos/strings/chromeos_strings_ca.xtb
index e29a7209..50664ab4 100644
--- a/chromeos/strings/chromeos_strings_ca.xtb
+++ b/chromeos/strings/chromeos_strings_ca.xtb
@@ -89,6 +89,7 @@
 <translation id="8294431847097064396">Font</translation>
 <translation id="8347227221149377169">Tasques d'impressió</translation>
 <translation id="8352772353338965963">Afegiu un compte per a l'inici de sessió múltiple. Es pot accedir a tots el comptes registrats sense contrasenya, de manera que només hauríeu d'utilitzar aquesta funció en comptes de confiança.</translation>
+<translation id="8668052347555487755">Mode de color</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> gestiona aquest usuari. És possible que gestioni la configuració i monitori l'activitat de l'usuari de manera remota.</translation>
 <translation id="871560550817059752">Error: no hi ha tinta</translation>
 <translation id="8726019395068607495">S'ha aturat: porta oberta</translation>
diff --git a/chromeos/strings/chromeos_strings_cs.xtb b/chromeos/strings/chromeos_strings_cs.xtb
index a98742df..f83719c3 100644
--- a/chromeos/strings/chromeos_strings_cs.xtb
+++ b/chromeos/strings/chromeos_strings_cs.xtb
@@ -89,6 +89,7 @@
 <translation id="8294431847097064396">Zdroj</translation>
 <translation id="8347227221149377169">Tiskové úlohy</translation>
 <translation id="8352772353338965963">Přidat účet do vícenásobného přihlášení. Ke všem přihlášeným účtům lze přistupovat bez zadání hesla, proto byste tuto funkci měli používat pouze s důvěryhodnými účty.</translation>
+<translation id="8668052347555487755">Režim barvy</translation>
 <translation id="8701136875688985581">Tohoto uživatele spravuje doména <ph name="ENROLLMENT_DOMAIN" />. Může vzdáleně spravovat nastavení a sledovat aktivitu uživatele.</translation>
 <translation id="871560550817059752">Tisk selhal – došel inkoust</translation>
 <translation id="8726019395068607495">Zastaveno – jsou otevřená dvířka</translation>
diff --git a/chromeos/strings/chromeos_strings_da.xtb b/chromeos/strings/chromeos_strings_da.xtb
index d6eb7fe..0f43434 100644
--- a/chromeos/strings/chromeos_strings_da.xtb
+++ b/chromeos/strings/chromeos_strings_da.xtb
@@ -88,6 +88,7 @@
 <translation id="8294431847097064396">Kilde</translation>
 <translation id="8347227221149377169">Udskriftsjobs</translation>
 <translation id="8352772353338965963">Føj en konto til samlet login fra flere konti. Det er muligt at få adgang til alle de konti, der er logget ind på, uden en adgangskode, så denne funktion bør kun bruges til de konti, du har tillid til.</translation>
+<translation id="8668052347555487755">Farvetilstand</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> administrerer denne bruger. Det kan administrere indstillinger via fjernadgang og overvåge brugeraktivitet.</translation>
 <translation id="871560550817059752">Handlingen mislykkedes – Mangler blæk</translation>
 <translation id="8726019395068607495">Stoppet – Åben låge</translation>
diff --git a/chromeos/strings/chromeos_strings_de.xtb b/chromeos/strings/chromeos_strings_de.xtb
index 8e7c9d94..de7fd97a 100644
--- a/chromeos/strings/chromeos_strings_de.xtb
+++ b/chromeos/strings/chromeos_strings_de.xtb
@@ -89,6 +89,7 @@
 <translation id="8294431847097064396">Quelle</translation>
 <translation id="8347227221149377169">Druckaufträge</translation>
 <translation id="8352772353338965963">Fügen Sie ein Konto für die Mehrfachanmeldung hinzu. Sie können auf alle angemeldeten Konten zugreifen, ohne ein Passwort eingeben zu müssen. Verwenden Sie diese Funktion daher nur mit vertrauenswürdigen Konten.</translation>
+<translation id="8668052347555487755">Farbmodus</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> verwaltet diesen Nutzer. Es werden möglicherweise per Remotezugriff Einstellungen verwaltet und Nutzeraktivitäten überwacht.</translation>
 <translation id="871560550817059752">Fehlgeschlagen – Keine Tinte</translation>
 <translation id="8726019395068607495">Angehalten – Druckerklappe offen</translation>
diff --git a/chromeos/strings/chromeos_strings_el.xtb b/chromeos/strings/chromeos_strings_el.xtb
index ad20db0..db60097 100644
--- a/chromeos/strings/chromeos_strings_el.xtb
+++ b/chromeos/strings/chromeos_strings_el.xtb
@@ -89,6 +89,7 @@
 <translation id="8294431847097064396">Πηγή</translation>
 <translation id="8347227221149377169">Εργασίες εκτύπωσης</translation>
 <translation id="8352772353338965963">Προσθέστε έναν λογαριασμό στη σύνδεση σε πολλούς λογαριασμούς. Όλοι οι συνδεδεμένοι λογαριασμοί μπορούν να προσπελαστούν χωρίς κωδικό πρόσβασης, επομένως αυτή η δυνατότητα πρέπει να χρησιμοποιείται μόνο με αξιόπιστους λογαριασμούς.</translation>
+<translation id="8668052347555487755">Λειτουργία χρώματος</translation>
 <translation id="8701136875688985581">Ο τομέας <ph name="ENROLLMENT_DOMAIN" /> διαχειρίζεται αυτόν τον χρήστη. Ενδέχεται να διαχειρίζεται απομακρυσμένα τις ρυθμίσεις και να παρακολουθεί τη δραστηριότητα του χρήστη.</translation>
 <translation id="871560550817059752">Σφάλμα - Τελείωσε το μελάνι</translation>
 <translation id="8726019395068607495">Διακοπή - Ανοικτή θύρα</translation>
diff --git a/chromeos/strings/chromeos_strings_en-GB.xtb b/chromeos/strings/chromeos_strings_en-GB.xtb
index 506a861..9ca8db66 100644
--- a/chromeos/strings/chromeos_strings_en-GB.xtb
+++ b/chromeos/strings/chromeos_strings_en-GB.xtb
@@ -89,6 +89,7 @@
 <translation id="8294431847097064396">Source</translation>
 <translation id="8347227221149377169">Print jobs</translation>
 <translation id="8352772353338965963">Add an account to multiple sign-in. All signed-in accounts can be accessed without a password, so this feature should only be used with trusted accounts.</translation>
+<translation id="8668052347555487755">Colour mode</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> manages this user. It may remotely manage settings and monitor user activity.</translation>
 <translation id="871560550817059752">Failed – Out of ink</translation>
 <translation id="8726019395068607495">Stopped – door open</translation>
diff --git a/chromeos/strings/chromeos_strings_es-419.xtb b/chromeos/strings/chromeos_strings_es-419.xtb
index ebea285..e8c658e 100644
--- a/chromeos/strings/chromeos_strings_es-419.xtb
+++ b/chromeos/strings/chromeos_strings_es-419.xtb
@@ -89,6 +89,7 @@
 <translation id="8294431847097064396">Fuente</translation>
 <translation id="8347227221149377169">Trabajos de impresión</translation>
 <translation id="8352772353338965963">Agrega una cuenta para el acceso múltiple. Puedes acceder a todas las cuentas abiertas sin una contraseña, por lo que esta función solo debe utilizarse con cuentas de confianza.</translation>
+<translation id="8668052347555487755">Modo de color</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> administra a este usuario. Puede supervisar la actividad del usuario y cambiar la configuración de forma remota.</translation>
 <translation id="871560550817059752">Error: Sin tinta</translation>
 <translation id="8726019395068607495">Se detuvo: la tapa está abierta</translation>
diff --git a/chromeos/strings/chromeos_strings_es.xtb b/chromeos/strings/chromeos_strings_es.xtb
index 18ed5840..5f5c260 100644
--- a/chromeos/strings/chromeos_strings_es.xtb
+++ b/chromeos/strings/chromeos_strings_es.xtb
@@ -88,6 +88,7 @@
 <translation id="8294431847097064396">Origen</translation>
 <translation id="8347227221149377169">Trabajos de impresión</translation>
 <translation id="8352772353338965963">Se puede añadir una cuenta al inicio de sesión múltiple y acceder a todas las cuentas en las que se haya iniciado sesión sin una contraseña, por lo que esta función solo se debe utilizar con cuentas de confianza.</translation>
+<translation id="8668052347555487755">Modo de color</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> gestiona este usuario. Puede gestionar ajustes y supervisar la actividad del usuario de forma remota.</translation>
 <translation id="871560550817059752">No se ha podido imprimir - Sin tinta</translation>
 <translation id="8726019395068607495">Detenido: cubierta abierta</translation>
diff --git a/chromeos/strings/chromeos_strings_et.xtb b/chromeos/strings/chromeos_strings_et.xtb
index e446673..72fbc48 100644
--- a/chromeos/strings/chromeos_strings_et.xtb
+++ b/chromeos/strings/chromeos_strings_et.xtb
@@ -89,6 +89,7 @@
 <translation id="8294431847097064396">Allikas</translation>
 <translation id="8347227221149377169">Prinditööd</translation>
 <translation id="8352772353338965963">Lisage mitmele kontole sisselogimiseks konto. Kõigile kontodele, kuhu on sisse logitud, pääseb juurde ilma paroolita, seega soovitame seda funktsiooni kasutada vaid usaldusväärsete kontodega.</translation>
+<translation id="8668052347555487755">Värvirežiim</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> haldab seda kasutajat. See võib eemalt hallata seadeid ja jälgida kasutaja tegevusi.</translation>
 <translation id="871560550817059752">Ebaõnnestus – tint on otsas</translation>
 <translation id="8726019395068607495">Peatatud – luuk on avatud</translation>
diff --git a/chromeos/strings/chromeos_strings_eu.xtb b/chromeos/strings/chromeos_strings_eu.xtb
index c8979d4..1f015594 100644
--- a/chromeos/strings/chromeos_strings_eu.xtb
+++ b/chromeos/strings/chromeos_strings_eu.xtb
@@ -89,6 +89,7 @@
 <translation id="8294431847097064396">Iturburua</translation>
 <translation id="8347227221149377169">Inprimatze-lanak</translation>
 <translation id="8352772353338965963">Gehitu kontu bat saio-hasiera anitzean. Saioa hasita daukaten kontu guztiak pasahitzik gabe atzi daitezkeenez, kontu fidagarriekin soilik erabili behar da eginbide hori.</translation>
+<translation id="8668052347555487755">Kolore modua</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> domeinuak kudeatzen du erabiltzaile hau. Ezarpenak kudeatu eta erabiltzailearen jarduerak gainbegira ditzake urrunetik.</translation>
 <translation id="871560550817059752">Hutsegitea - Ez dago tintarik</translation>
 <translation id="8726019395068607495">Geldituta: atea irekita dago</translation>
diff --git a/chromeos/strings/chromeos_strings_fa.xtb b/chromeos/strings/chromeos_strings_fa.xtb
index 0ac2f9c..a9f0ec9a 100644
--- a/chromeos/strings/chromeos_strings_fa.xtb
+++ b/chromeos/strings/chromeos_strings_fa.xtb
@@ -89,6 +89,7 @@
 <translation id="8294431847097064396">منبع</translation>
 <translation id="8347227221149377169">کارهای چاپی</translation>
 <translation id="8352772353338965963">افزودن یک حساب برای ورود چندگانه به سیستم. کلیه حساب‌هایی که به سیستم وارد شده‌اند بدون گذرواژه قابل دسترسی هستند، بنابراین این قابلیت فقط باید با حساب‌های مورداعتماد استفاده شود.</translation>
+<translation id="8668052347555487755">حالت رنگی</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> این کاربر را مدیریت می‌کند. می‌تواند تنظیمات را ازراه‌دور مدیریت کند و بر فعالیت کاربر نظارت کند.</translation>
 <translation id="871560550817059752">انجام نشد - جوهر تمام شده است</translation>
 <translation id="8726019395068607495">متوقف شد - در باز است</translation>
diff --git a/chromeos/strings/chromeos_strings_fi.xtb b/chromeos/strings/chromeos_strings_fi.xtb
index 02b8a79..c647681 100644
--- a/chromeos/strings/chromeos_strings_fi.xtb
+++ b/chromeos/strings/chromeos_strings_fi.xtb
@@ -89,6 +89,7 @@
 <translation id="8294431847097064396">Lähde</translation>
 <translation id="8347227221149377169">Tulostustyöt</translation>
 <translation id="8352772353338965963">Lisää tili useaan tiliin kirjautumiseen. Kaikkia tilejä, joihin on kirjauduttu sisään, voi käyttää ilman salasanaa. Käytä siis ominaisuutta vain luotetuilla tileillä.</translation>
+<translation id="8668052347555487755">Väritila</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> on tämän käyttäjän ylläpitäjä. Se voi muuttaa asetuksia ja seurata käyttäjän toimia etänä.</translation>
 <translation id="871560550817059752">Epäonnistui – Muste loppu</translation>
 <translation id="8726019395068607495">Pysähtynyt – Luukku auki</translation>
diff --git a/chromeos/strings/chromeos_strings_fil.xtb b/chromeos/strings/chromeos_strings_fil.xtb
index fceea909..dad0f1de 100644
--- a/chromeos/strings/chromeos_strings_fil.xtb
+++ b/chromeos/strings/chromeos_strings_fil.xtb
@@ -89,6 +89,7 @@
 <translation id="8294431847097064396">Pinagmulan</translation>
 <translation id="8347227221149377169">Mga pag-print</translation>
 <translation id="8352772353338965963">Magdagdag ng account sa multiple na pag-sign in. Maa-access ang lahat ng naka-sign in na account nang walang password, kaya dapat na gamitin lang ang feature na ito sa mga pinagkakatiwalaang account.</translation>
+<translation id="8668052347555487755">Mode ng kulay</translation>
 <translation id="8701136875688985581">Pinapamahalaan ng <ph name="ENROLLMENT_DOMAIN" /> ang user na ito. Posible nitong pamahalaan ang mga setting at subaybayan ang aktibidad ng user sa remote na paraan.</translation>
 <translation id="871560550817059752">Hindi na-print - Wala nang ink</translation>
 <translation id="8726019395068607495">Huminto - Nakabukas ang door</translation>
diff --git a/chromeos/strings/chromeos_strings_fr-CA.xtb b/chromeos/strings/chromeos_strings_fr-CA.xtb
index c9c8dd7..f6133e0 100644
--- a/chromeos/strings/chromeos_strings_fr-CA.xtb
+++ b/chromeos/strings/chromeos_strings_fr-CA.xtb
@@ -89,6 +89,7 @@
 <translation id="8294431847097064396">Source</translation>
 <translation id="8347227221149377169">Tâches d'impression</translation>
 <translation id="8352772353338965963">Ajouter un compte à la connexion multicompte. Tous les comptes connectés sont accessibles sans mot de passe. Nous vous recommandons donc de n'utiliser cette fonctionnalité qu'avec des comptes fiables.</translation>
+<translation id="8668052347555487755">Mode couleur</translation>
 <translation id="8701136875688985581">Le domaine <ph name="ENROLLMENT_DOMAIN" /> gère cet utilisateur. Il peut gérer les paramètres et faire le suivi de l'activité de l'utilisateur à distance.</translation>
 <translation id="871560550817059752">Échec : à court d'encre</translation>
 <translation id="8726019395068607495">Tâchez arrêtée : porte de l'imprimante ouverte</translation>
diff --git a/chromeos/strings/chromeos_strings_fr.xtb b/chromeos/strings/chromeos_strings_fr.xtb
index cad79c8..7716f0a 100644
--- a/chromeos/strings/chromeos_strings_fr.xtb
+++ b/chromeos/strings/chromeos_strings_fr.xtb
@@ -89,6 +89,7 @@
 <translation id="8294431847097064396">Source</translation>
 <translation id="8347227221149377169">Tâches d'impression</translation>
 <translation id="8352772353338965963">Ajoutez un compte à la connexion multicompte. Tous les comptes connectés sont accessibles sans mot de passe. Nous vous recommandons donc de n'utiliser cette fonctionnalité qu'avec des comptes fiables.</translation>
+<translation id="8668052347555487755">Mode couleur</translation>
 <translation id="8701136875688985581">Cet utilisateur est géré par <ph name="ENROLLMENT_DOMAIN" />, qui peut modifier ses paramètres et surveiller son activité à distance.</translation>
 <translation id="871560550817059752">Échec – À court d'encre</translation>
 <translation id="8726019395068607495">Tâche suspendue - Capot ouvert</translation>
diff --git a/chromeos/strings/chromeos_strings_gl.xtb b/chromeos/strings/chromeos_strings_gl.xtb
index 3892b50..491aad67 100644
--- a/chromeos/strings/chromeos_strings_gl.xtb
+++ b/chromeos/strings/chromeos_strings_gl.xtb
@@ -89,6 +89,7 @@
 <translation id="8294431847097064396">Fonte</translation>
 <translation id="8347227221149377169">Traballos de impresión</translation>
 <translation id="8352772353338965963">Engade unha conta ao inicio de sesión múltiple. É posible acceder a todas as contas en que iniciaches sesión sen necesidade de inserir un contrasinal, polo que esta función só se debe utilizar coas contas de confianza.</translation>
+<translation id="8668052347555487755">Modo de cor</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> xestiona este usuario. Pode xestionar a súa configuración e controlar a súa actividade de forma remota.</translation>
 <translation id="871560550817059752">Produciuse un erro: a impresora quedou sen tinta</translation>
 <translation id="8726019395068607495">Detívose (a tapa está aberta)</translation>
diff --git a/chromeos/strings/chromeos_strings_gu.xtb b/chromeos/strings/chromeos_strings_gu.xtb
index 91e142b..ddfb01eb 100644
--- a/chromeos/strings/chromeos_strings_gu.xtb
+++ b/chromeos/strings/chromeos_strings_gu.xtb
@@ -88,6 +88,7 @@
 <translation id="8294431847097064396">સ્રોત</translation>
 <translation id="8347227221149377169">પ્રિન્ટ કરવાના કામો</translation>
 <translation id="8352772353338965963">એકથી વધુ સાઇન ઇન કરવા એક એકાઉન્ટ ઉમેરો. બધા સાઇન ઇન એકાઉન્ટ પાસવર્ડ વગર ઉપયોગ કરી શકાય છે, તેથી આ સુવિધા માત્ર વિશ્વસનીય એકાઉન્ટ સાથે ઉપયોગમાં આવવી જોઇએ.</translation>
+<translation id="8668052347555487755">કલર મોડ</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> આ વપરાશકર્તાને મેનેજ કરે છે. આ કદાચ સેટિંગ અને વપરાશકર્તાની પ્રવૃત્તિને દૂરથી મેનેજ અને તેનું નિરીક્ષણ કરી શકે.</translation>
 <translation id="871560550817059752">નિષ્ફળ થયું - પ્રિન્ટરમાં શાહી પૂરી થઈ ગઈ છે</translation>
 <translation id="8726019395068607495">બંધ - ઢાંકણ ખુલ્લું છે</translation>
diff --git a/chromeos/strings/chromeos_strings_hi.xtb b/chromeos/strings/chromeos_strings_hi.xtb
index fde911c..3c47cafd 100644
--- a/chromeos/strings/chromeos_strings_hi.xtb
+++ b/chromeos/strings/chromeos_strings_hi.xtb
@@ -89,6 +89,7 @@
 <translation id="8294431847097064396">स्रोत</translation>
 <translation id="8347227221149377169">प्रिंट जॉब</translation>
 <translation id="8352772353338965963">एक से ज़्यादा साइन-इन के लिए कोई खाता जोड़ें. सभी साइन इन किए गए खातों को पासवर्ड के बिना एक्सेस किया जा सकता है, इसलिए इस सुविधा का इस्तेमाल सिर्फ़ विश्वसनीय खातों के साथ किया जाना चाहिए.</translation>
+<translation id="8668052347555487755">कलर मोड</translation>
 <translation id="8701136875688985581">इस उपयोगकर्ता को <ph name="ENROLLMENT_DOMAIN" /> प्रबंधित करता है. यह दूर से सेटिंग प्रबंधित कर सकता है. साथ ही, उपयोगकर्ता गतिविधि की निगरानी कर सकता है.</translation>
 <translation id="871560550817059752">प्रिंट नहीं हो पाया - स्याही खत्म हो गई</translation>
 <translation id="8726019395068607495">बंद हो गया - दरवाज़ा खुला है</translation>
diff --git a/chromeos/strings/chromeos_strings_hr.xtb b/chromeos/strings/chromeos_strings_hr.xtb
index 9f522ef..58bd45b9 100644
--- a/chromeos/strings/chromeos_strings_hr.xtb
+++ b/chromeos/strings/chromeos_strings_hr.xtb
@@ -89,6 +89,7 @@
 <translation id="8294431847097064396">Izvor</translation>
 <translation id="8347227221149377169">Zadaci ispisa</translation>
 <translation id="8352772353338965963">Dodajte račun na višestruku prijavu. Svim računima na koje ste prijavljeni može se pristupiti bez zaporke, pa bi se ta značajka trebala upotrebljavati samo s pouzdanim računima.</translation>
+<translation id="8668052347555487755">Način boje</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> upravlja ovim korisnikom. Može daljinski upravljati postavkama i nadzirati aktivnost korisnika.</translation>
 <translation id="871560550817059752">Nije uspjelo – nema tinte</translation>
 <translation id="8726019395068607495">Zaustavljeno – vratašca su otvorena</translation>
diff --git a/chromeos/strings/chromeos_strings_hu.xtb b/chromeos/strings/chromeos_strings_hu.xtb
index b0f946c..f9fcdfc8 100644
--- a/chromeos/strings/chromeos_strings_hu.xtb
+++ b/chromeos/strings/chromeos_strings_hu.xtb
@@ -89,6 +89,7 @@
 <translation id="8294431847097064396">Forrás</translation>
 <translation id="8347227221149377169">Nyomtatási feladatok</translation>
 <translation id="8352772353338965963">Adjon hozzá egy fiókot a többfiókos bejelentkezéshez. Az összes bejelentkezett fiók elérhető a jelszó megadása nélkül, ezért ezt a funkciót csak megbízható fiókokkal használja.</translation>
+<translation id="8668052347555487755">Színmód</translation>
 <translation id="8701136875688985581">A(z) <ph name="ENROLLMENT_DOMAIN" /> kezeli ezt a felhasználót. A domain távolról módosíthatja a beállításokat, és figyelheti a felhasználó tevékenységeit.</translation>
 <translation id="871560550817059752">Sikertelen – Kifogyott a tinta</translation>
 <translation id="8726019395068607495">Leállt – Nyitva van a nyomtató fedele</translation>
diff --git a/chromeos/strings/chromeos_strings_hy.xtb b/chromeos/strings/chromeos_strings_hy.xtb
index 27caca5..b0cd2eda 100644
--- a/chromeos/strings/chromeos_strings_hy.xtb
+++ b/chromeos/strings/chromeos_strings_hy.xtb
@@ -89,6 +89,7 @@
 <translation id="8294431847097064396">Աղբյուր</translation>
 <translation id="8347227221149377169">Տպելու առաջադրանքներ</translation>
 <translation id="8352772353338965963">Ավելացնել հաշիվ բազմակի մուտքի համակարգում: Բոլոր մուտք գործած հաշիվները մատչելի են առանց գաղտնաբառի մուտքագրման, ուստի այս գործառույթը պետք է միայն օգտագործվի վստահելի հաշիվների հետ:</translation>
+<translation id="8668052347555487755">Գույների ռեժիմ</translation>
 <translation id="8701136875688985581">Այս օգտատերը կառավարվում է <ph name="ENROLLMENT_DOMAIN" /> տիրույթի կողմից։ Այն կարող է հեռակա կառավարել կարգավորումները և վերահսկել օգտատիրոջ գործողությունները։</translation>
 <translation id="871560550817059752">Չհաջողվեց տպել – Թանաքը սպառվել է</translation>
 <translation id="8726019395068607495">Դադարեցվել է – Դռնակը բաց է</translation>
diff --git a/chromeos/strings/chromeos_strings_id.xtb b/chromeos/strings/chromeos_strings_id.xtb
index 2c6ba4de..9bbae4a 100644
--- a/chromeos/strings/chromeos_strings_id.xtb
+++ b/chromeos/strings/chromeos_strings_id.xtb
@@ -89,6 +89,7 @@
 <translation id="8294431847097064396">Sumber</translation>
 <translation id="8347227221149377169">Pekerjaan cetak</translation>
 <translation id="8352772353338965963">Tambahkan akun ke fitur masuk banyak akun. Semua akun yang masuk dapat diakses tanpa menggunakan sandi, sebaiknya hanya gunakan akun ini dengan akun tepercaya.</translation>
+<translation id="8668052347555487755">Mode warna</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> mengelola pengguna ini. Domain dapat mengelola setelan dan memantau aktivitas pengguna dari jarak jauh.</translation>
 <translation id="871560550817059752">Gagal - Tinta habis</translation>
 <translation id="8726019395068607495">Dihentikan - Tutup terbuka</translation>
diff --git a/chromeos/strings/chromeos_strings_is.xtb b/chromeos/strings/chromeos_strings_is.xtb
index 847c2be..abb7529 100644
--- a/chromeos/strings/chromeos_strings_is.xtb
+++ b/chromeos/strings/chromeos_strings_is.xtb
@@ -89,6 +89,7 @@
 <translation id="8294431847097064396">Uppruni</translation>
 <translation id="8347227221149377169">Prentverk</translation>
 <translation id="8352772353338965963">Bæta reikningi við innskráningu á marga reikninga. Hægt er að fá aðgang að öllum innskráðum reikningum án aðgangsorðs og því ætti aðeins að nota þennan eiginleika með traustum reikningum.</translation>
+<translation id="8668052347555487755">Litastilling</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> stjórnar þessum notanda. Það getur valið stillingar og skoðað notandavirkni með fjartengingu.</translation>
 <translation id="871560550817059752">Mistókst – blekið er búið</translation>
 <translation id="8726019395068607495">Stöðvað – hlíf er opin</translation>
diff --git a/chromeos/strings/chromeos_strings_it.xtb b/chromeos/strings/chromeos_strings_it.xtb
index b3a53fe..cafce17 100644
--- a/chromeos/strings/chromeos_strings_it.xtb
+++ b/chromeos/strings/chromeos_strings_it.xtb
@@ -89,6 +89,7 @@
 <translation id="8294431847097064396">Origine</translation>
 <translation id="8347227221149377169">Processi di stampa</translation>
 <translation id="8352772353338965963">Aggiungi un account per l'accesso simultaneo. Poiché gli account che hanno effettuato l'accesso sono tutti accessibili senza password, devi utilizzare questa funzione solo con gli account attendibili.</translation>
+<translation id="8668052347555487755">Modalità colore</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> gestisce questo utente. Può gestire in remoto le impostazioni e monitorare l'attività utente.</translation>
 <translation id="871560550817059752">Operazione non riuscita - Inchiostro esaurito</translation>
 <translation id="8726019395068607495">Operazione interrotta - Sportello aperto</translation>
diff --git a/chromeos/strings/chromeos_strings_iw.xtb b/chromeos/strings/chromeos_strings_iw.xtb
index fe1634e..adabae6f 100644
--- a/chromeos/strings/chromeos_strings_iw.xtb
+++ b/chromeos/strings/chromeos_strings_iw.xtb
@@ -89,6 +89,7 @@
 <translation id="8294431847097064396">מקור</translation>
 <translation id="8347227221149377169">משימות הדפסה</translation>
 <translation id="8352772353338965963">הוסף חשבון לכניסה עם מספר חשבונות. כל החשבונות שאליהם נכנסת נגישים ללא סיסמה, לכן יש להשתמש בתכונה זו עם חשבונות אמינים בלבד.</translation>
+<translation id="8668052347555487755">מצב הצבעים</translation>
 <translation id="8701136875688985581">משתמש זה מנוהל על ידי <ph name="ENROLLMENT_DOMAIN" />. הדומיין עשוי לנהל מרחוק את ההגדרות ולעקוב אחרי פעילות המשתמש.</translation>
 <translation id="871560550817059752">נכשלה – הדיו נגמר</translation>
 <translation id="8726019395068607495">הפסיקה – דלת המדפסת פתוחה</translation>
diff --git a/chromeos/strings/chromeos_strings_ja.xtb b/chromeos/strings/chromeos_strings_ja.xtb
index db152c3..9613ebed 100644
--- a/chromeos/strings/chromeos_strings_ja.xtb
+++ b/chromeos/strings/chromeos_strings_ja.xtb
@@ -89,6 +89,7 @@
 <translation id="8294431847097064396">ソース</translation>
 <translation id="8347227221149377169">印刷ジョブ</translation>
 <translation id="8352772353338965963">マルチログインにアカウントを追加します。ログインしているすべてのアカウントにパスワードなしでアクセスできるようになるため、この機能は信頼できるアカウントでのみ使用してください。</translation>
+<translation id="8668052347555487755">色モード</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> がこのユーザーを管理しています。設定の管理とユーザー アクティビティの監視がリモートで行われることがあります。</translation>
 <translation id="871560550817059752">失敗 - インクがありません</translation>
 <translation id="8726019395068607495">停止 - 扉が開いています</translation>
diff --git a/chromeos/strings/chromeos_strings_ka.xtb b/chromeos/strings/chromeos_strings_ka.xtb
index 2e6266d..a82f50b5 100644
--- a/chromeos/strings/chromeos_strings_ka.xtb
+++ b/chromeos/strings/chromeos_strings_ka.xtb
@@ -89,6 +89,7 @@
 <translation id="8294431847097064396">წყარო</translation>
 <translation id="8347227221149377169">ბეჭდვის დავალებები</translation>
 <translation id="8352772353338965963">დაამატეთ ანგარიში მრავლობითი შესვლისთვის. სისტემაში შესულ ანგარიშზე წვდომის მიღება შესაძლებელია პაროლის შეყვანის გარეშე, ამიტომ ეს ფუნქცია უნდა გამოიყენოთ მხოლოდ სანდო ანგარიშებზე.</translation>
+<translation id="8668052347555487755">ფერთა რეჟიმი</translation>
 <translation id="8701136875688985581">ამ მომხმარებელს მართავს <ph name="ENROLLMENT_DOMAIN" />. მას შეუძლია პარამეტრების დისტანციურად მართვა და მომხმარებლის აქტივობის მონიტორინგი.</translation>
 <translation id="871560550817059752">ვერ მოხერხდა — მელანი გაუთავდა</translation>
 <translation id="8726019395068607495">გაჩერდა — პრინტერის კარი ღიაა</translation>
diff --git a/chromeos/strings/chromeos_strings_kk.xtb b/chromeos/strings/chromeos_strings_kk.xtb
index ace49709..591f5d17 100644
--- a/chromeos/strings/chromeos_strings_kk.xtb
+++ b/chromeos/strings/chromeos_strings_kk.xtb
@@ -88,6 +88,7 @@
 <translation id="8294431847097064396">Дереккөз</translation>
 <translation id="8347227221149377169">Баспа жұмыстары</translation>
 <translation id="8352772353338965963">Бірнеше есептік жазбаға кіру үшін есептік жазба қосыңыз. Барлық кірілген есептік жазбаларға құпия сөзсіз кіруге болады, сондықтан бұл мүмкіндікті тек сенімді есептік жазбалар пайдалануы тиіс.</translation>
+<translation id="8668052347555487755">Түс режимі</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> пайдаланушыны басқарады. Сонымен қатар қашықтан параметрлерді басқарады және пайдаланушының әрекетін қадағалайды.</translation>
 <translation id="871560550817059752">Сәтсіз: сия бітіп қалды</translation>
 <translation id="8726019395068607495">Тоқтатылды: есігі ашық</translation>
diff --git a/chromeos/strings/chromeos_strings_km.xtb b/chromeos/strings/chromeos_strings_km.xtb
index 872000a3..acf3621 100644
--- a/chromeos/strings/chromeos_strings_km.xtb
+++ b/chromeos/strings/chromeos_strings_km.xtb
@@ -88,6 +88,7 @@
 <translation id="8294431847097064396">ប្រភព</translation>
 <translation id="8347227221149377169">ការងារ​បោះពុម្ព</translation>
 <translation id="8352772353338965963">បន្ថែមគណនីមួយដើម្បីចូលពីគណនីច្រើន។ គណនីដែលចូលទាំងអស់អាចចូលប្រើដោយគ្មានពាក្យសម្ងាត់ ដូច្នេះលក្ខណពិសេសនេះគួរត្រូវបានប្រើជាមួយគណនីដែលគួរជឿជាក់តែប៉ុណ្ណោះ។</translation>
+<translation id="8668052347555487755">មុខងារពណ៌</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> គ្រប់គ្រង​អ្នកប្រើប្រាស់​នេះ។ ដែននេះអាច​តាមដាន​សកម្មភាព​អ្នកប្រើប្រាស់ និង​គ្រប់គ្រង​ការកំណត់​ពីចម្ងាយ​បាន។</translation>
 <translation id="871560550817059752">មិនបានសម្រេច - ​​អស់ទឹកថ្នាំ</translation>
 <translation id="8726019395068607495">បានឈប់ - ទ្វារចំហ</translation>
diff --git a/chromeos/strings/chromeos_strings_kn.xtb b/chromeos/strings/chromeos_strings_kn.xtb
index 2a5570a..1fe4500e 100644
--- a/chromeos/strings/chromeos_strings_kn.xtb
+++ b/chromeos/strings/chromeos_strings_kn.xtb
@@ -88,6 +88,7 @@
 <translation id="8294431847097064396">ಮೂಲ</translation>
 <translation id="8347227221149377169">ಮುದ್ರಣ ಕಾರ್ಯಗಳು</translation>
 <translation id="8352772353338965963">ಬಹು ಸೈನ್‌ಇನ್‌ಗೆ ಖಾತೆಯನ್ನು ಸೇರಿಸಿ. ಎಲ್ಲ ಸೈನ್‌-ಇನ್‌ ಮಾಡಲಾದ ಖಾತೆಗಳನ್ನು ಪಾಸ್‌ವರ್ಡ್‌ ಇಲ್ಲದೆಯೇ ಪ್ರವೇಶಿಸಬಹುದಾಗಿದೆ, ಹಾಗಾಗಿ ಈ ವೈಶಿಷ್ಟ್ಯವನ್ನು ವಿಶ್ವಾಸಾರ್ಹ ಖಾತೆಗಳಿಗಾಗಿ ಮಾತ್ರ ಬಳಸಬೇಕು.</translation>
+<translation id="8668052347555487755">ಬಣ್ಣದ ಮೋಡ್</translation>
 <translation id="8701136875688985581">ಈ ಬಳಕೆದಾರರನ್ನು <ph name="ENROLLMENT_DOMAIN" /> ನಿರ್ವಹಿಸುತ್ತದೆ. ಇದು ದೂರದಿಂದಲೇ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ನಿರ್ವಹಿಸಬಹುದು ಮತ್ತು ಬಳಕೆದಾರರ ಚಟುವಟಿಕೆಯ ಮೇಲೆ ಗಮನವಿರಿಸಬಹುದು.</translation>
 <translation id="871560550817059752">ವಿಫಲವಾಗಿದೆ - ಇಂಕ್ ಖಾಲಿಯಾಗಿದೆ</translation>
 <translation id="8726019395068607495">ನಿಲ್ಲಿಸಲಾಗಿದೆ - ಡೋರ್ ಓಪನ್ ಆಗಿದೆ</translation>
diff --git a/chromeos/strings/chromeos_strings_ko.xtb b/chromeos/strings/chromeos_strings_ko.xtb
index ca004e4..e0cfdd49 100644
--- a/chromeos/strings/chromeos_strings_ko.xtb
+++ b/chromeos/strings/chromeos_strings_ko.xtb
@@ -89,6 +89,7 @@
 <translation id="8294431847097064396">출처</translation>
 <translation id="8347227221149377169">인쇄 작업</translation>
 <translation id="8352772353338965963">멀티 로그인에 계정을 추가하세요. 비밀번호를 입력하지 않고 모든 로그인 계정에 액세스할 수 있으므로 이 기능은 신뢰할 수 있는 계정에만 사용해야 합니다.</translation>
+<translation id="8668052347555487755">색상 모드</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" />에서 이 사용자를 관리합니다. 원격으로 설정을 관리하고 사용자 활동을 모니터링할 수 있습니다.</translation>
 <translation id="871560550817059752">실패 - 잉크 없음</translation>
 <translation id="8726019395068607495">중지됨 - 덮개 열림</translation>
diff --git a/chromeos/strings/chromeos_strings_ky.xtb b/chromeos/strings/chromeos_strings_ky.xtb
index fd87806f..b389763e 100644
--- a/chromeos/strings/chromeos_strings_ky.xtb
+++ b/chromeos/strings/chromeos_strings_ky.xtb
@@ -89,6 +89,7 @@
 <translation id="8294431847097064396">Булак</translation>
 <translation id="8347227221149377169">Басып чыгаруу тапшырмалары</translation>
 <translation id="8352772353338965963">Бир нече профиль менен кирүү үчүн каттоо эсебин кошуңуз. Катталган бардык аккаунттарына кирүүдө сырсөз талап кылынбагандыктан, бул мүмкүнчүлүктү ишенимдүү каттоо эсептери гана колдонушу керек.</translation>
+<translation id="8668052347555487755">Түстүү режим</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> бул колдонуучуну башкарат. Ал алыстан жөндөөлөрдү башкарып, колдонуучунун аракеттерин көзөмөлдөй алат.</translation>
 <translation id="871560550817059752">Басылып чыгарылган жок - Сыя түгөнүп калды</translation>
 <translation id="8726019395068607495">Токтоду – Эшик ачык</translation>
diff --git a/chromeos/strings/chromeos_strings_lo.xtb b/chromeos/strings/chromeos_strings_lo.xtb
index 099b7fa..16c5cbe 100644
--- a/chromeos/strings/chromeos_strings_lo.xtb
+++ b/chromeos/strings/chromeos_strings_lo.xtb
@@ -89,6 +89,7 @@
 <translation id="8294431847097064396">ແຫຼ່ງທີ່ມາ</translation>
 <translation id="8347227221149377169">ວຽກການພິມ</translation>
 <translation id="8352772353338965963">ເພີ່ມບັນຊີໃສ່ຫຼາຍການລົງຊື່ເຂົ້າໃສ່. ສາມາດເຂົ້າ​ຫາທຸກບັນຊີທີ່ລົງຊື່ເຂົ້າ​ໃຊ້ແລ້ວໂດຍບໍ່ຕ້ອງມີລະຫັດຜ່ານ, ດັ່ງນັ້ນຄວນໃຊ້ແຕ່ຄຸນສົມບັດນີ້ກັບແຕ່ບັນຊີທີ່ເຊື່ອຖືໄດ້ເທົ່ານັ້ນ.</translation>
+<translation id="8668052347555487755">ຮູບແບບສີ</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> ຈັດການຜູ້ໃຊ້ນີ້. ມັນອາດຈະຈັດການຕັ້ງຄ່າ ແລະ ຕິດຕາມເບິ່ງການເຄື່ອນໄຫວຂອງຜູ້ໃຊ້ຈາກທາງໄກໄດ້.</translation>
 <translation id="871560550817059752">ບໍ່ສຳເລັດ, ນໍ້າໝຶກໝົດ</translation>
 <translation id="8726019395068607495">ຢຸດພິມ, ຝາເປີດຢູ່</translation>
diff --git a/chromeos/strings/chromeos_strings_lt.xtb b/chromeos/strings/chromeos_strings_lt.xtb
index c010cd5..8ce0f3f1 100644
--- a/chromeos/strings/chromeos_strings_lt.xtb
+++ b/chromeos/strings/chromeos_strings_lt.xtb
@@ -89,6 +89,7 @@
 <translation id="8294431847097064396">Šaltinis</translation>
 <translation id="8347227221149377169">Spausdinimo užduotys</translation>
 <translation id="8352772353338965963">Pridėkite paskyrą prie kelių paskyrų. Visos paskyros, prie kurių prisijungta, gali būti pasiekiamos be slaptažodžio, todėl ši funkcija turėtų būti naudojama tik su patikimomis paskyromis.</translation>
+<translation id="8668052347555487755">Spalvos režimas</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> valdo šį naudotoją. Jis gali nuotoliniu būdu valdyti nustatymus ir stebėti naudotojo veiklą.</translation>
 <translation id="871560550817059752">Nepavyko – baigėsi rašalas</translation>
 <translation id="8726019395068607495">Sustabdyta – atidarytos durelės</translation>
diff --git a/chromeos/strings/chromeos_strings_lv.xtb b/chromeos/strings/chromeos_strings_lv.xtb
index aef1a23..a8260a5a 100644
--- a/chromeos/strings/chromeos_strings_lv.xtb
+++ b/chromeos/strings/chromeos_strings_lv.xtb
@@ -89,6 +89,7 @@
 <translation id="8294431847097064396">Avots</translation>
 <translation id="8347227221149377169">Drukas uzdevumi</translation>
 <translation id="8352772353338965963">Pievienojiet kontu vairākkārtējās pierakstīšanās funkcijai. Visiem kontiem, kuros esat pierakstījies, varēs piekļūt, neievadot paroli, tāpēc šī funkcija ir jāizmanto tikai uzticamiem kontiem.</translation>
+<translation id="8668052347555487755">Krāsu režīms</translation>
 <translation id="8701136875688985581">Šis lietotājs tiek pārvaldīts domēnā<ph name="ENROLLMENT_DOMAIN" />. Šajā domēnā var tikt attālināti pārvaldīti iestatījumi un uzraudzītas lietotāja darbības.</translation>
 <translation id="871560550817059752">Neizdevās — beigusies tinte</translation>
 <translation id="8726019395068607495">Apturēts — durtiņas ir atvērtas</translation>
diff --git a/chromeos/strings/chromeos_strings_mk.xtb b/chromeos/strings/chromeos_strings_mk.xtb
index 6f923aa..eb1a09ae 100644
--- a/chromeos/strings/chromeos_strings_mk.xtb
+++ b/chromeos/strings/chromeos_strings_mk.xtb
@@ -89,6 +89,7 @@
 <translation id="8294431847097064396">Извор</translation>
 <translation id="8347227221149377169">Налози за печатење</translation>
 <translation id="8352772353338965963">Додајте сметка за повеќекратно најавување. Сите најавени сметки се достапни без лозинка, така што оваа можност треба да се користи само со сметки на кои им се верува.</translation>
+<translation id="8668052347555487755">Режим во боја</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> управува со корисников. Може далечински да управува со поставките и да ја следи активноста на корисникот.</translation>
 <translation id="871560550817059752">Неуспешно - нема мастило</translation>
 <translation id="8726019395068607495">Запрено - вратата е отворена</translation>
diff --git a/chromeos/strings/chromeos_strings_ml.xtb b/chromeos/strings/chromeos_strings_ml.xtb
index dbd60d6..72afabcd 100644
--- a/chromeos/strings/chromeos_strings_ml.xtb
+++ b/chromeos/strings/chromeos_strings_ml.xtb
@@ -88,6 +88,7 @@
 <translation id="8294431847097064396">ഉറവിടം</translation>
 <translation id="8347227221149377169">പ്രിന്റ് ജോലികൾ</translation>
 <translation id="8352772353338965963">ഒന്നിലധികം സൈൻ-ഇന്നിനായി ഒരു അക്കൗണ്ട് ചേർക്കുക. സൈൻ-ഇൻ ചെയ്‌ത അക്കൗണ്ടുകളെല്ലാം ഒരു പാസ്‌വേഡില്ലാതെ ആക്‌സസ് ചെയ്യാനാകുമെന്നതിനാൽ ഈ സവിശേഷത പരിചയമുള്ള അക്കൗണ്ടുകളിൽ മാത്രമേ ഉപയോഗിക്കാവൂ.</translation>
+<translation id="8668052347555487755">വർണ്ണ മോഡ്</translation>
 <translation id="8701136875688985581">ഈ ഉപയോക്താവിനെ <ph name="ENROLLMENT_DOMAIN" /> മാനേജ് ചെയ്യുന്നു. ഇത് വിദൂരമായി ക്രമീകരണം മാനേജ് ചെയ്യുകയും ഉപയോക്തൃ ആക്‌റ്റിവിറ്റി നിരീക്ഷിക്കുകയും ചെയ്‌തേക്കാം.</translation>
 <translation id="871560550817059752">പ്രിന്റ് ചെയ്യാനായില്ല - മഷിയില്ല</translation>
 <translation id="8726019395068607495">പ്രിന്റ് ജോലി നിർത്തി - ഡോർ തുറന്നിരിക്കുന്നു</translation>
diff --git a/chromeos/strings/chromeos_strings_mn.xtb b/chromeos/strings/chromeos_strings_mn.xtb
index bacba5c..0b9bbff 100644
--- a/chromeos/strings/chromeos_strings_mn.xtb
+++ b/chromeos/strings/chromeos_strings_mn.xtb
@@ -89,6 +89,7 @@
 <translation id="8294431847097064396">Эх сурвалж</translation>
 <translation id="8347227221149377169">Хэвлэх ажлууд</translation>
 <translation id="8352772353338965963">Олон хэрэглэгч бүхий нэвтрэх хэсэгт бүртгэл нэмж оруулах. Бүх нэвтэрсэн бүртгэлүүд нууц үггүйгээр нэвтрэх боломжтой учраас энэ горимыг зөвхөн итгэл хүлээсэн бүртгэлүүдэд ашиглахыг зөвлөж байна.</translation>
+<translation id="8668052347555487755">Өнгөний горим</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> энэ хэрэглэгчийг удирддаг. Энэ нь алсаас тохиргоог удирдаж, хэрэглэгчийн үйл ажиллагааг хянаж болзошгүй.</translation>
 <translation id="871560550817059752">Амжилтгүй болсон - Бэх дууссан</translation>
 <translation id="8726019395068607495">Зогссон - Таг нээлттэй</translation>
diff --git a/chromeos/strings/chromeos_strings_mr.xtb b/chromeos/strings/chromeos_strings_mr.xtb
index 53566f1..b1890b0 100644
--- a/chromeos/strings/chromeos_strings_mr.xtb
+++ b/chromeos/strings/chromeos_strings_mr.xtb
@@ -89,6 +89,7 @@
 <translation id="8294431847097064396">स्रोत</translation>
 <translation id="8347227221149377169">प्रिंट कार्ये</translation>
 <translation id="8352772353338965963">मल्टिपल साइन-इन वर खाते जोडा. सर्व साइन इन केलेल्या खात्यांवर पासवर्डशिवाय प्रवेश केला जाऊ शकतो, म्हणून हे वैशिष्ट्य केवळ विश्वसनीय खात्यांसह वापरले जावे.</translation>
+<translation id="8668052347555487755">रंगीत मोड</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> हा वापरकर्ता व्यवस्थापित करते. ते रिमोट पद्धतीने सेटिंग्ज व्यवस्थापित करू शकते आणि वापरकर्ता अ‍ॅक्टिव्हिटीचे परीक्षण करू शकते.</translation>
 <translation id="871560550817059752">अयशस्वी झाले - शाई संपली आहे</translation>
 <translation id="8726019395068607495">थांबले - दार उघडे आहे</translation>
diff --git a/chromeos/strings/chromeos_strings_ms.xtb b/chromeos/strings/chromeos_strings_ms.xtb
index 2d1ab9b3..8633f4b 100644
--- a/chromeos/strings/chromeos_strings_ms.xtb
+++ b/chromeos/strings/chromeos_strings_ms.xtb
@@ -89,6 +89,7 @@
 <translation id="8294431847097064396">Sumber</translation>
 <translation id="8347227221149377169">Tugas cetak</translation>
 <translation id="8352772353338965963">Tambahkan akaun untuk berbilang log masuk. Semua akaun dilog masuk boleh diakses tanpa kata laluan, jadi ciri ini mesti digunakan dengan akaun yang dipercayai sahaja.</translation>
+<translation id="8668052347555487755">Mod warna</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> mengurus pengguna ini. Domain ini mungkin mengurus tetapan dan memantau aktiviti pengguna dari jauh.</translation>
 <translation id="871560550817059752">Gagal - Kehabisan dakwat</translation>
 <translation id="8726019395068607495">Dihentikan - Pintu terbuka</translation>
diff --git a/chromeos/strings/chromeos_strings_my.xtb b/chromeos/strings/chromeos_strings_my.xtb
index b8eee972..02f606b1 100644
--- a/chromeos/strings/chromeos_strings_my.xtb
+++ b/chromeos/strings/chromeos_strings_my.xtb
@@ -88,6 +88,7 @@
 <translation id="8294431847097064396">အရင်းအမြစ်</translation>
 <translation id="8347227221149377169">ပရင့်ထုတ်ရန် ဖိုင်များ</translation>
 <translation id="8352772353338965963">အရာ အများအပြားထဲသို့ လက်မှတ်ထိုး ဝင်နိုင်ရန် အတွက် အကောင့် တစ်ခုကို ထည့်ပါ။ လက်မှတ်ထိုး ဝင်ထားသည့် အကောင့်များ အားလုံးကို စကားဝှက် မသုံးရဘဲ သုံးနိုင်မည် ဖြစ်ရာ၊ ဒီအင်္ဂါရပ်ကို ယုံကြည်ရသည့် အကောင့်များ အတွက်သာ အသုံးပြသင့်သည်။</translation>
+<translation id="8668052347555487755">အရောင်မုဒ်</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> က ဤအသုံးပြုသူကို စီမံသည်။ ၎င်းက ဆက်တင်များကို အဝေးထိန်းစီမံပြီး အသုံးပြုသူ လုပ်ဆောင်ချက်ကို စောင့်ကြည့်နိုင်သည်။</translation>
 <translation id="871560550817059752">မအောင်မြင်ပါ - မင်ကုန်နေသည်</translation>
 <translation id="8726019395068607495">ရပ်သွားသည် - တံခါးပွင့်နေသည်</translation>
diff --git a/chromeos/strings/chromeos_strings_ne.xtb b/chromeos/strings/chromeos_strings_ne.xtb
index c542c08..7ee08642 100644
--- a/chromeos/strings/chromeos_strings_ne.xtb
+++ b/chromeos/strings/chromeos_strings_ne.xtb
@@ -88,6 +88,7 @@
 <translation id="8294431847097064396">स्रोत</translation>
 <translation id="8347227221149377169">प्रिन्टसम्बन्धी कार्यहरू</translation>
 <translation id="8352772353338965963">बहुविध साइन-इन को लागि एउटा खाता थप्नुहोस्। सबै साइन-इन भएका खाताहरू पासवर्ड विना नै पहुँच गर्न सकिन्छ, त्यसैले यो सुविधा विश्वसनीय खाताहरूसँग मात्रै प्रयोग गर्नुपर्छ।</translation>
+<translation id="8668052347555487755">रङ मोड</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> ले यो प्रयोगकर्ताको व्यवस्थापन गर्छ। यसले दूरवर्ती रूपमा सेटिङ व्यवस्थापन गर्न र प्रयोगकर्ताले गर्ने क्रियाकलाप निगरानी गर्न सक्छ।</translation>
 <translation id="871560550817059752">प्रिन्ट गर्न सकिएन - मसी सकियो</translation>
 <translation id="8726019395068607495">रोकियो - प्रिन्टरको कभर खुला छ</translation>
diff --git a/chromeos/strings/chromeos_strings_nl.xtb b/chromeos/strings/chromeos_strings_nl.xtb
index b3c6d91b..77901c6 100644
--- a/chromeos/strings/chromeos_strings_nl.xtb
+++ b/chromeos/strings/chromeos_strings_nl.xtb
@@ -89,6 +89,7 @@
 <translation id="8294431847097064396">Bron</translation>
 <translation id="8347227221149377169">Afdruktaken</translation>
 <translation id="8352772353338965963">Een account toevoegen aan Toegang tot meerdere accounts. Alle ingelogde accounts zijn toegankelijk zonder wachtwoord, dus deze functie moet alleen worden gebruikt voor vertrouwde accounts.</translation>
+<translation id="8668052347555487755">Kleurenmodus</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> beheert deze gebruiker. Dit domein kan op afstand instellingen beheren en gebruikersactiviteit in de gaten houden.</translation>
 <translation id="871560550817059752">Mislukt - Geen inkt meer</translation>
 <translation id="8726019395068607495">Gestopt: klep geopend</translation>
diff --git a/chromeos/strings/chromeos_strings_no.xtb b/chromeos/strings/chromeos_strings_no.xtb
index 593d541..c8d7eae6 100644
--- a/chromeos/strings/chromeos_strings_no.xtb
+++ b/chromeos/strings/chromeos_strings_no.xtb
@@ -89,6 +89,7 @@
 <translation id="8294431847097064396">Kilde</translation>
 <translation id="8347227221149377169">Utskriftsjobber</translation>
 <translation id="8352772353338965963">Legg til en konto for multipålogging. Alle påloggede kontoer kan brukes uten passord, så denne funksjonen burde bare brukes med pålitelige kontoer.</translation>
+<translation id="8668052347555487755">Fargemodus</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> administrerer denne brukeren. Domenet kan administrere innstillinger og overvåke brukeraktivitet eksternt.</translation>
 <translation id="871560550817059752">Mislykket – tom for blekk</translation>
 <translation id="8726019395068607495">Stoppet – luken er åpen</translation>
diff --git a/chromeos/strings/chromeos_strings_or.xtb b/chromeos/strings/chromeos_strings_or.xtb
index 6358b00..286cc5f 100644
--- a/chromeos/strings/chromeos_strings_or.xtb
+++ b/chromeos/strings/chromeos_strings_or.xtb
@@ -89,6 +89,7 @@
 <translation id="8294431847097064396">ଉତ୍ସ</translation>
 <translation id="8347227221149377169">ପ୍ରିଣ୍ଟ ଜବ୍</translation>
 <translation id="8352772353338965963">ଏକାଧିକ ସାଇନ୍-ଇନ୍ କରିବାକୁ ଏକ ଆକାଉଣ୍ଟ ଯୋଗ କରନ୍ତୁ। ସାଇନ୍-ଇନ୍ ହୋଇଥିବା ସମସ୍ତ ଆକାଉଣ୍ଟ ବିନା ପାସ୍‌ୱର୍ଡରେ ଆକ୍ସେସ୍ କରାଯାଇପାରିବ, ତେଣୁ ଏହି ସୁବିଧା କେବଳ ବିଶ୍ୱସ୍ତ ଆକାଉଣ୍ଟ ସହ ବ୍ୟବହାର କରାଯିବା ଉଚିତ୍।</translation>
+<translation id="8668052347555487755">କଲର୍ ମୋଡ୍</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> ଏହି ଉପଯୋଗକର୍ତ୍ତାଙ୍କୁ ପରିଚାଳନା କରେ। ଏହା ରିମୋଟ୍ ଭାବେ ସେଟିଂସ୍ ପରିଚାଳନା ଏବଂ ଉପଯୋଗକର୍ତ୍ତା କାର୍ଯ୍ୟକଳାପ ମନିଟର୍ କରିପାରେ।</translation>
 <translation id="871560550817059752">ବିଫଳ ହୋଇଛି - ସ୍ୟାହି ଶେଷ ହୋଇଯାଇଛି</translation>
 <translation id="8726019395068607495">ବନ୍ଦ ହୋଇଯାଇଛି - ପ୍ରିଣ୍ଟରର କଭର୍ ଖୋଲା ଅଛି</translation>
diff --git a/chromeos/strings/chromeos_strings_pa.xtb b/chromeos/strings/chromeos_strings_pa.xtb
index 430db89..c74d958 100644
--- a/chromeos/strings/chromeos_strings_pa.xtb
+++ b/chromeos/strings/chromeos_strings_pa.xtb
@@ -88,6 +88,7 @@
 <translation id="8294431847097064396">ਸ੍ਰੋਤ</translation>
 <translation id="8347227221149377169">ਪ੍ਰਿੰਟ ਜੌਬਾਂ</translation>
 <translation id="8352772353338965963">ਬਹੁ-ਗਿਣਤੀ ਸਾਈਨ-ਇਨ ਲਈ ਇੱਕ ਖਾਤਾ ਸ਼ਾਮਲ ਕਰੋ। ਸਾਰੇ ਸਾਈਨ-ਇਨ ਕੀਤੇ ਖਾਤਿਆਂ ਤੱਕ ਬਿਨਾਂ ਕਿਸੇ ਪਾਸਵਰਡ ਦੇ ਪਹੁੰਚਿਆ ਜਾ ਸਕਦਾ ਹੈ, ਇਸਲਈ ਇਹ ਵਿਸ਼ੇਸ਼ਤਾ ਸਿਰਫ਼ ਭਰੋਸੇਯੋਗ ਖਾਤਿਆਂ ਨਾਲ ਵਰਤੀ ਜਾਣੀ ਚਾਹੀਦੀ ਹੈ।</translation>
+<translation id="8668052347555487755">ਰੰਗਦਾਰ ਮੋਡ</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> ਇਸ ਵਰਤੋਂਕਾਰ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰਦਾ ਹੈ। ਇਹ ਦੂਰ-ਦਰਾਡੇ ਤੋਂ ਸੈਟਿੰਗਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰ ਸਕਦਾ ਹੈ ਅਤੇ ਵਰਤੋਂਕਾਰ ਸਰਗਰਮੀ ਦੀ ਨਿਗਰਾਨੀ ਕਰ ਸਕਦਾ ਹੈ।</translation>
 <translation id="871560550817059752">ਅਸਫਲ ਰਹੀ - ਸਿਆਹੀ ਖਤਮ ਹੋ ਗਈ ਹੈ</translation>
 <translation id="8726019395068607495">ਬੰਦ ਹੋ ਗਿਆ - ਢੱਕਣ ਖੁੱਲ੍ਹਾ ਹੈ</translation>
diff --git a/chromeos/strings/chromeos_strings_pl.xtb b/chromeos/strings/chromeos_strings_pl.xtb
index 2f0e2a1..b886ffd 100644
--- a/chromeos/strings/chromeos_strings_pl.xtb
+++ b/chromeos/strings/chromeos_strings_pl.xtb
@@ -89,6 +89,7 @@
 <translation id="8294431847097064396">Źródło</translation>
 <translation id="8347227221149377169">Zadania drukowania</translation>
 <translation id="8352772353338965963">Tu możesz dodać konto do wielokrotnego logowania. Ponieważ dostęp do wszystkich zalogowanych kont można uzyskać bez podawania hasła, tej funkcji należy używać tylko z zaufanymi kontami.</translation>
+<translation id="8668052347555487755">Tryb koloru</translation>
 <translation id="8701136875688985581">Tym użytkownikiem zarządza domena <ph name="ENROLLMENT_DOMAIN" />. Może ona zdalnie zarządzać ustawieniami i monitorować aktywność użytkownika.</translation>
 <translation id="871560550817059752">Niepowodzenie – brak tuszu</translation>
 <translation id="8726019395068607495">Zatrzymano – otwarte drzwiczki drukarki</translation>
diff --git a/chromeos/strings/chromeos_strings_pt-BR.xtb b/chromeos/strings/chromeos_strings_pt-BR.xtb
index c330318..861438d 100644
--- a/chromeos/strings/chromeos_strings_pt-BR.xtb
+++ b/chromeos/strings/chromeos_strings_pt-BR.xtb
@@ -89,6 +89,7 @@
 <translation id="8294431847097064396">Origem</translation>
 <translation id="8347227221149377169">Trabalhos de impressão</translation>
 <translation id="8352772353338965963">Adicione uma conta de login múltiplo. Todas as contas conectadas podem ser acessadas sem uma senha; portanto esse recurso só deve ser usado com contas confiáveis.</translation>
+<translation id="8668052347555487755">Modo de cor</translation>
 <translation id="8701136875688985581">O domínio <ph name="ENROLLMENT_DOMAIN" /> gerencia esta conta. Ele pode gerenciar configurações e monitorar a atividade do usuário remotamente.</translation>
 <translation id="871560550817059752">Falha - Sem tinta</translation>
 <translation id="8726019395068607495">Parado (porta aberta)</translation>
diff --git a/chromeos/strings/chromeos_strings_pt-PT.xtb b/chromeos/strings/chromeos_strings_pt-PT.xtb
index 824910f..e8dadbb 100644
--- a/chromeos/strings/chromeos_strings_pt-PT.xtb
+++ b/chromeos/strings/chromeos_strings_pt-PT.xtb
@@ -89,6 +89,7 @@
 <translation id="8294431847097064396">Origem</translation>
 <translation id="8347227221149377169">Tarefas de impressão</translation>
 <translation id="8352772353338965963">Adicione uma conta para início de sessão integrado. É possível aceder a todas as contas com a sessão iniciada sem uma palavra-passe, por isso, só deve utilizar esta funcionalidade com contas fidedignas.</translation>
+<translation id="8668052347555487755">Modo de cor</translation>
 <translation id="8701136875688985581">Este utilizador é gerido por <ph name="ENROLLMENT_DOMAIN" />. Pode gerir definições e monitorizar remotamente a atividade do utilizador.</translation>
 <translation id="871560550817059752">Falha – Sem tinta</translation>
 <translation id="8726019395068607495">Parada – Porta aberta</translation>
diff --git a/chromeos/strings/chromeos_strings_ro.xtb b/chromeos/strings/chromeos_strings_ro.xtb
index 4d5874b6..893faec0 100644
--- a/chromeos/strings/chromeos_strings_ro.xtb
+++ b/chromeos/strings/chromeos_strings_ro.xtb
@@ -89,6 +89,7 @@
 <translation id="8294431847097064396">Sursă</translation>
 <translation id="8347227221149377169">Sarcini de printare</translation>
 <translation id="8352772353338965963">Adăugați un cont pentru conectarea multiplă. Conturile conectate pot fi accesate fără parolă, prin urmare, această funcție trebuie folosită numai cu conturile de încredere.</translation>
+<translation id="8668052347555487755">Modul de culoare</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> gestionează acest utilizator. Poate să gestioneze de la distanță setările și să monitorizeze activitatea utilizatorului.</translation>
 <translation id="871560550817059752">Nereușită – Cerneală epuizată</translation>
 <translation id="8726019395068607495">Oprită – Ușă deschisă</translation>
diff --git a/chromeos/strings/chromeos_strings_ru.xtb b/chromeos/strings/chromeos_strings_ru.xtb
index ca049f21..2725035 100644
--- a/chromeos/strings/chromeos_strings_ru.xtb
+++ b/chromeos/strings/chromeos_strings_ru.xtb
@@ -89,6 +89,7 @@
 <translation id="8294431847097064396">Источник</translation>
 <translation id="8347227221149377169">Задания печати</translation>
 <translation id="8352772353338965963">Добавить аккаунт в систему множественного входа. Для доступа к аккаунтам, в которые выполнен вход, пароль не требуется, поэтому эту функцию следует использовать только для надежных аккаунтов.</translation>
+<translation id="8668052347555487755">Цвета</translation>
 <translation id="8701136875688985581">Этот аккаунт находится под управлением домена <ph name="ENROLLMENT_DOMAIN" />, из которого можно отслеживать действия пользователя и удаленно изменять настройки.</translation>
 <translation id="871560550817059752">Сбой: закончились чернила</translation>
 <translation id="8726019395068607495">Печать прервана: открыта крышка</translation>
diff --git a/chromeos/strings/chromeos_strings_si.xtb b/chromeos/strings/chromeos_strings_si.xtb
index 0b788bb8..9e04584 100644
--- a/chromeos/strings/chromeos_strings_si.xtb
+++ b/chromeos/strings/chromeos_strings_si.xtb
@@ -89,6 +89,7 @@
 <translation id="8294431847097064396">මූලාශ්‍රය</translation>
 <translation id="8347227221149377169">මුද්‍රණ වැඩ</translation>
 <translation id="8352772353338965963">බහු පිවිසුම් සඳහා ගිනුමක් එක් කරන්න. සියළු පිවිසි ගිනුම් වෙත මුරපදයක් නොමැතිව පිවිසිය හැක. එම නිසා මෙම විශේෂාංගය භාවිත කළ යුත්තේ විශ්වාසී ගිනුම් සමඟ පමණි.</translation>
+<translation id="8668052347555487755">වර්ණ ප්‍රකාරය</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> මෙම පරිශීලකයා කළමනා කරයි. එය දුරස්ථව සැකසීම් කළමනා කිරීමට සහ පරිශීලක ක්‍රියාකාරකම නිරීක්‍ෂණ කිරීමට හැකිය.</translation>
 <translation id="871560550817059752">අසාර්ථක විය - තීන්ත නැත</translation>
 <translation id="8726019395068607495">නැවතිණි - දොර විවෘතයි</translation>
diff --git a/chromeos/strings/chromeos_strings_sk.xtb b/chromeos/strings/chromeos_strings_sk.xtb
index 82ef8c7..4446cc0 100644
--- a/chromeos/strings/chromeos_strings_sk.xtb
+++ b/chromeos/strings/chromeos_strings_sk.xtb
@@ -89,6 +89,7 @@
 <translation id="8294431847097064396">Zdroj</translation>
 <translation id="8347227221149377169">Tlačové úlohy</translation>
 <translation id="8352772353338965963">Pridanie účtu pre viacnásobné prihlásenie. Ku všetkým prihláseným účtom môžete pristupovať bez hesla, takže táto funkcia by mala byť použitá iba s dôveryhodnými účtami.</translation>
+<translation id="8668052347555487755">Farebný režim</translation>
 <translation id="8701136875688985581">Tohto používateľa spravuje doména <ph name="ENROLLMENT_DOMAIN" />. Môže vzdialene spravovať nastavenia a monitorovať aktivitu používateľa.</translation>
 <translation id="871560550817059752">Nepodarilo sa – minul sa atrament</translation>
 <translation id="8726019395068607495">Zastavené – dvierka sú otvorené</translation>
diff --git a/chromeos/strings/chromeos_strings_sl.xtb b/chromeos/strings/chromeos_strings_sl.xtb
index 3ddeb8286..8a74109 100644
--- a/chromeos/strings/chromeos_strings_sl.xtb
+++ b/chromeos/strings/chromeos_strings_sl.xtb
@@ -89,6 +89,7 @@
 <translation id="8294431847097064396">Vir</translation>
 <translation id="8347227221149377169">Tiskalna opravila</translation>
 <translation id="8352772353338965963">Dodajte račun za prijavo z več računi. Do vseh prijavljenih računov je mogoče dostopati brez gesla, zato to funkcijo uporabljajte samo z zaupanja vrednimi računi.</translation>
+<translation id="8668052347555487755">Barvni način</translation>
 <translation id="8701136875688985581">Domena <ph name="ENROLLMENT_DOMAIN" /> upravlja tega uporabnika. Na daljavo lahko upravlja nastavitve in nadzira dejavnost uporabnika.</translation>
 <translation id="871560550817059752">Napaka – zmanjkalo je črnila</translation>
 <translation id="8726019395068607495">Ustavljeno – vrata so odprta</translation>
diff --git a/chromeos/strings/chromeos_strings_sq.xtb b/chromeos/strings/chromeos_strings_sq.xtb
index 74055a3..455f1ce 100644
--- a/chromeos/strings/chromeos_strings_sq.xtb
+++ b/chromeos/strings/chromeos_strings_sq.xtb
@@ -88,6 +88,7 @@
 <translation id="8294431847097064396">Burimi</translation>
 <translation id="8347227221149377169">Printimet</translation>
 <translation id="8352772353338965963">Shto një llogari në identifikimin e shumëfishtë. Të gjitha llogaritë e identifikuara mund të qasen pa fjalëkalim, prandaj ky funksion duhet të përdoret vetëm me llogari të besuara.</translation>
+<translation id="8668052347555487755">Modaliteti me ngjyra</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> e menaxhon këtë përdorues. Ai domen mund të menaxhojë në distancë cilësimet dhe të monitorojë aktivitetin e përdoruesit.</translation>
 <translation id="871560550817059752">Dështoi - Nuk ka bojë</translation>
 <translation id="8726019395068607495">Ndaloi - Dera e hapur</translation>
diff --git a/chromeos/strings/chromeos_strings_sr-Latn.xtb b/chromeos/strings/chromeos_strings_sr-Latn.xtb
index 841cf22..7f2282ca 100644
--- a/chromeos/strings/chromeos_strings_sr-Latn.xtb
+++ b/chromeos/strings/chromeos_strings_sr-Latn.xtb
@@ -89,6 +89,7 @@
 <translation id="8294431847097064396">Izvor</translation>
 <translation id="8347227221149377169">Zadaci štampanja</translation>
 <translation id="8352772353338965963">Dodajte nalog za višestruko prijavljivanje. Svim prijavljenim nalozima se može pristupiti bez lozinke, pa ovu funkciju treba koristiti samo sa pouzdanim nalozima.</translation>
+<translation id="8668052347555487755">Režim boja</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> upravlja ovim korisnikom. Može daljinski da upravlja podešavanjima i nadgleda aktivnosti korisnika.</translation>
 <translation id="871560550817059752">Nije uspelo – nema više mastila</translation>
 <translation id="8726019395068607495">Zaustavljeno – vrata su otvorena</translation>
diff --git a/chromeos/strings/chromeos_strings_sr.xtb b/chromeos/strings/chromeos_strings_sr.xtb
index d3de65ec..369fd91f 100644
--- a/chromeos/strings/chromeos_strings_sr.xtb
+++ b/chromeos/strings/chromeos_strings_sr.xtb
@@ -89,6 +89,7 @@
 <translation id="8294431847097064396">Извор</translation>
 <translation id="8347227221149377169">Задаци штампања</translation>
 <translation id="8352772353338965963">Додајте налог за вишеструко пријављивање. Свим пријављеним налозима се може приступити без лозинке, па ову функцију треба користити само са поузданим налозима.</translation>
+<translation id="8668052347555487755">Режим боја</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> управља овим корисником. Може даљински да управља подешавањима и надгледа активности корисника.</translation>
 <translation id="871560550817059752">Није успело – нема више мастила</translation>
 <translation id="8726019395068607495">Заустављено – врата су отворена</translation>
diff --git a/chromeos/strings/chromeos_strings_sv.xtb b/chromeos/strings/chromeos_strings_sv.xtb
index 53b4faf..5c61285 100644
--- a/chromeos/strings/chromeos_strings_sv.xtb
+++ b/chromeos/strings/chromeos_strings_sv.xtb
@@ -89,6 +89,7 @@
 <translation id="8294431847097064396">Källa</translation>
 <translation id="8347227221149377169">Utskriftsjobb</translation>
 <translation id="8352772353338965963">Lägg till ett konto för multiinloggning. Alla inloggade konton kan öppnas utan lösenord, så använd bara den här funktionen med konton du litar på.</translation>
+<translation id="8668052347555487755">Färgläge</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> hanterar denna användare och kan fjärrhantera inställningar och övervaka användaraktivitet.</translation>
 <translation id="871560550817059752">Misslyckades – slut på bläck</translation>
 <translation id="8726019395068607495">Har stoppats – luckan är öppen</translation>
diff --git a/chromeos/strings/chromeos_strings_sw.xtb b/chromeos/strings/chromeos_strings_sw.xtb
index 3f7b959..aa8c4a4 100644
--- a/chromeos/strings/chromeos_strings_sw.xtb
+++ b/chromeos/strings/chromeos_strings_sw.xtb
@@ -88,6 +88,7 @@
 <translation id="8294431847097064396">Chanzo</translation>
 <translation id="8347227221149377169">Kazi za kuchapisha</translation>
 <translation id="8352772353338965963">Ongeza akaunti ya uwezo wa kuingia katika akaunti nyingi kwa wakati mmoja. Akaunti zote zilizoingiwa zinaweza kufikiwa bila nenosiri, hivyo kipengee hiki lazima kitumike kwenye akaunti zinazoaminika pekee.</translation>
+<translation id="8668052347555487755">Hali ya rangi</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> inasimamia mtumiaji huyu. Huenda itadhibiti mipangilio kwa mbali na kufuatilia shughuli za mtumiaji.</translation>
 <translation id="871560550817059752">Haijakamilika - Wino umeisha</translation>
 <translation id="8726019395068607495">Imesimama - Mlango umefunguka</translation>
diff --git a/chromeos/strings/chromeos_strings_ta.xtb b/chromeos/strings/chromeos_strings_ta.xtb
index 713c1fd..fc2378c 100644
--- a/chromeos/strings/chromeos_strings_ta.xtb
+++ b/chromeos/strings/chromeos_strings_ta.xtb
@@ -89,6 +89,7 @@
 <translation id="8294431847097064396">மூலம்</translation>
 <translation id="8347227221149377169">அச்சுப் பணிகள்</translation>
 <translation id="8352772353338965963">பல உள்நுழைவுக்குக் கணக்கைச் சேர்க்கவும். உள்நுழைந்த அனைத்து கணக்குகளையும் கடவுச்சொல் இல்லாமலே அணுகலாம் என்பதால் இந்த அம்சத்தை நம்பகமான கணக்குகளுடன் மட்டுமே பயன்படுத்த வேண்டும்.</translation>
+<translation id="8668052347555487755">வண்ணப் பயன்முறை</translation>
 <translation id="8701136875688985581">இந்தப் பயனரை <ph name="ENROLLMENT_DOMAIN" /> நிர்வகிக்கிறது. இது தொலைநிலையிலிருந்து அமைப்புகளை நிர்வகிக்கலாம், அத்துடன் பயனர் செயல்பாட்டையும் கண்காணிக்கலாம்.</translation>
 <translation id="871560550817059752">பிரிண்டரில் மை தீர்ந்துவிட்டதால் அச்சிட முடியவில்லை</translation>
 <translation id="8726019395068607495">மூடி திறந்துள்ளதால் அச்சிட முடியவில்லை</translation>
diff --git a/chromeos/strings/chromeos_strings_te.xtb b/chromeos/strings/chromeos_strings_te.xtb
index 4357379d0..84b01ca 100644
--- a/chromeos/strings/chromeos_strings_te.xtb
+++ b/chromeos/strings/chromeos_strings_te.xtb
@@ -88,6 +88,7 @@
 <translation id="8294431847097064396">మూలం</translation>
 <translation id="8347227221149377169">ప్రింట్ టాస్క్‌లు</translation>
 <translation id="8352772353338965963">బహుళ సైన్ ఇన్ కోసం ఖాతాను జోడించండి. అన్ని సైన్ ఇన్ చేసిన ఖాతాలను పాస్‌వర్డ్ లేకుండానే యాక్సెస్‌ చేయవచ్చు. కాబ‌ట్టి ఈ ఫీచ‌ర్‌ను విశ్వసనీయ ఖాతాలతో మాత్రమే ఉపయోగించాలి.</translation>
+<translation id="8668052347555487755">రంగు మోడ్</translation>
 <translation id="8701136875688985581">ఈ యూజర్‌ను <ph name="ENROLLMENT_DOMAIN" /> మేనేజ్ చేస్తుంది. అది సెట్టింగ్‌లను రిమోట్‌గా మేనేజ్ చేయవచ్చు, యూజర్ యాక్టివిటీని మానిటర్ చేయవచ్చు.</translation>
 <translation id="871560550817059752">విఫలమైంది - ఇంక్ అయిపోయింది</translation>
 <translation id="8726019395068607495">ఆగిపోయింది - డోర్ తెరిచి ఉంది</translation>
diff --git a/chromeos/strings/chromeos_strings_th.xtb b/chromeos/strings/chromeos_strings_th.xtb
index 9b389c0f..6ac56ec 100644
--- a/chromeos/strings/chromeos_strings_th.xtb
+++ b/chromeos/strings/chromeos_strings_th.xtb
@@ -89,6 +89,7 @@
 <translation id="8294431847097064396">แหล่งที่มา</translation>
 <translation id="8347227221149377169">งานพิมพ์</translation>
 <translation id="8352772353338965963">เพิ่มบัญชีเพื่อลงชื่อเข้าสู่ระบบพร้อมกันหลายบัญชี บัญชีที่ลงชื่อเข้าใช้แล้วทั้งหมดสามารถเข้าถึงได้โดยไม่ต้องใช้รหัสผ่าน คุณจึงควรใช้ฟีเจอร์นี้กับบัญชีที่เชื่อถือเท่านั้น</translation>
+<translation id="8668052347555487755">โหมดสี</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> จัดการผู้ใช้รายนี้ โดยอาจจัดการการตั้งค่าและตรวจสอบกิจกรรมของผู้ใช้จากระยะไกล</translation>
 <translation id="871560550817059752">ไม่สำเร็จ - หมึกหมด</translation>
 <translation id="8726019395068607495">หยุดพิมพ์ - ฝาเครื่องเปิดอยู่</translation>
diff --git a/chromeos/strings/chromeos_strings_tr.xtb b/chromeos/strings/chromeos_strings_tr.xtb
index 18aa2dc..0c419c5 100644
--- a/chromeos/strings/chromeos_strings_tr.xtb
+++ b/chromeos/strings/chromeos_strings_tr.xtb
@@ -89,6 +89,7 @@
 <translation id="8294431847097064396">Kaynak</translation>
 <translation id="8347227221149377169">Yazdırma işleri</translation>
 <translation id="8352772353338965963">Çoklu oturum açmaya bir hesap ekleyin. Oturum açılmış tüm hesaplara şifresiz erişilebileceği için bu özellik sadece güvenilir hesaplarla kullanılmalıdır.</translation>
+<translation id="8668052347555487755">Renk modu</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" />, bu kullanıcıyı yönetiyor. Ayarları uzaktan yönetebilir ve kullanıcı etkinliğini izleyebilir.</translation>
 <translation id="871560550817059752">İşlem başarısız - Mürekkep yok</translation>
 <translation id="8726019395068607495">Durduruldu - Kapak açık</translation>
diff --git a/chromeos/strings/chromeos_strings_uk.xtb b/chromeos/strings/chromeos_strings_uk.xtb
index 95cc798..279db0810 100644
--- a/chromeos/strings/chromeos_strings_uk.xtb
+++ b/chromeos/strings/chromeos_strings_uk.xtb
@@ -89,6 +89,7 @@
 <translation id="8294431847097064396">Джерело</translation>
 <translation id="8347227221149377169">Завдання друку</translation>
 <translation id="8352772353338965963">Додайте обліковий запис для паралельного входу. Доступ до всіх облікових записів, у які ви ввійшли, можна отримувати без пароля, тому цю функцію варто використовувати лише з надійними обліковими записами.</translation>
+<translation id="8668052347555487755">Режим кольору</translation>
 <translation id="8701136875688985581">Домен <ph name="ENROLLMENT_DOMAIN" /> керує цим користувачем. Він може віддалено змінювати налаштування й відстежувати дії користувача.</translation>
 <translation id="871560550817059752">Не надруковано – закінчилося чорнило</translation>
 <translation id="8726019395068607495">Зупинено – відкрито кришку принтера</translation>
diff --git a/chromeos/strings/chromeos_strings_ur.xtb b/chromeos/strings/chromeos_strings_ur.xtb
index a325f36..ec9b6fe 100644
--- a/chromeos/strings/chromeos_strings_ur.xtb
+++ b/chromeos/strings/chromeos_strings_ur.xtb
@@ -88,6 +88,7 @@
 <translation id="8294431847097064396">ماخذ</translation>
 <translation id="8347227221149377169">پرنٹ جابز</translation>
 <translation id="8352772353338965963">متعدد سائن ان میں ایک اکاؤنٹ شامل کریں۔ سبھی سائن ان کردہ اکاؤنٹس تک پاس ورڈ کے بغیر رسائی کی جا سکتی ہے لہذا یہ خصوصیت صرف بھروسہ مند اکاؤنٹس کے ساتھ استعمال کی جانی چاہیے۔</translation>
+<translation id="8668052347555487755">رنگ کی وضع</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> اس صارف کا نظم کرتا ہے۔ یہ دور سے ترتیبات کا نظم اور صارف کی سرگرمی کو مانیٹر کر سکتا ہے۔</translation>
 <translation id="871560550817059752">ناکام ہو گیا - سیاہی ختم ہو گئی</translation>
 <translation id="8726019395068607495">رک گیا - دروازہ کھلا ہے</translation>
diff --git a/chromeos/strings/chromeos_strings_uz.xtb b/chromeos/strings/chromeos_strings_uz.xtb
index 35b2a56..42957b13 100644
--- a/chromeos/strings/chromeos_strings_uz.xtb
+++ b/chromeos/strings/chromeos_strings_uz.xtb
@@ -89,6 +89,7 @@
 <translation id="8294431847097064396">Manba</translation>
 <translation id="8347227221149377169">Chop etish vazifalari</translation>
 <translation id="8352772353338965963">Bir nechta hisobga kirish tizimiga hisob qo‘shish. Kirish bajarilgan hisoblarni ko‘rish uchun parol so‘ralmaydi, shuning uchun bu funksiyadan faqat ishonchli hisoblarda foydalanish kerak.</translation>
+<translation id="8668052347555487755">Rangli rejim</translation>
 <translation id="8701136875688985581">Bu hisob <ph name="ENROLLMENT_DOMAIN" /> domenida boshqariladi. Bu domenda foydalanuvchilar faoliyati masofadan kuzatilishi va boshqarilishi mumkin.</translation>
 <translation id="871560550817059752">Bajarilmadi - Rang tugadi</translation>
 <translation id="8726019395068607495">Toʻxtatildi – Eshikchasi ochiq</translation>
diff --git a/chromeos/strings/chromeos_strings_vi.xtb b/chromeos/strings/chromeos_strings_vi.xtb
index 349e204..0ffc8a91 100644
--- a/chromeos/strings/chromeos_strings_vi.xtb
+++ b/chromeos/strings/chromeos_strings_vi.xtb
@@ -89,6 +89,7 @@
 <translation id="8294431847097064396">Nguồn</translation>
 <translation id="8347227221149377169">Lệnh in</translation>
 <translation id="8352772353338965963">Thêm một tài khoản để đăng nhập nhiều lần. Tất cả các tài khoản đã đăng nhập đều có thể truy cập được mà không cần mật khẩu, do đó bạn chỉ nên sử dụng tính năng này với các tài khoản đáng tin cậy.</translation>
+<translation id="8668052347555487755">Chế độ màu</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> quản lý người dùng này. Miền này có thể quản lý từ xa các tùy chọn cài đặt và giám sát hoạt động của người dùng.</translation>
 <translation id="871560550817059752">Không thành công – Hết mực</translation>
 <translation id="8726019395068607495">Đã dừng – Cửa máy in đang mở</translation>
diff --git a/chromeos/strings/chromeos_strings_zh-CN.xtb b/chromeos/strings/chromeos_strings_zh-CN.xtb
index 262f04b31..be49b60 100644
--- a/chromeos/strings/chromeos_strings_zh-CN.xtb
+++ b/chromeos/strings/chromeos_strings_zh-CN.xtb
@@ -89,6 +89,7 @@
 <translation id="8294431847097064396">来源</translation>
 <translation id="8347227221149377169">打印任务</translation>
 <translation id="8352772353338965963">为多帐号登录添加帐号。用户无需使用密码即可访问所有已登录的帐号,因此您应仅通过受信任的帐号使用此功能。</translation>
+<translation id="8668052347555487755">颜色模式</translation>
 <translation id="8701136875688985581">此用户由 <ph name="ENROLLMENT_DOMAIN" /> 管理。管理方可能会远程管理设置并监控用户活动。</translation>
 <translation id="871560550817059752">失败 - 墨水已用完</translation>
 <translation id="8726019395068607495">已停止 - 机盖未关</translation>
diff --git a/chromeos/strings/chromeos_strings_zh-HK.xtb b/chromeos/strings/chromeos_strings_zh-HK.xtb
index 5c24d68..1f779c7 100644
--- a/chromeos/strings/chromeos_strings_zh-HK.xtb
+++ b/chromeos/strings/chromeos_strings_zh-HK.xtb
@@ -89,6 +89,7 @@
 <translation id="8294431847097064396">來源</translation>
 <translation id="8347227221149377169">列印工作</translation>
 <translation id="8352772353338965963">新增可多重登入的帳戶。這些帳戶的使用者不需提供密碼即可存取所有已登入的帳戶。因此,建議您只讓信任的帳戶使用這項功能。</translation>
+<translation id="8668052347555487755">色彩模式</translation>
 <translation id="8701136875688985581">由 <ph name="ENROLLMENT_DOMAIN" /> 管理這位使用者,因此可能會從遠端管理設定並監察用戶活動。</translation>
 <translation id="871560550817059752">失敗 - 墨水已用完</translation>
 <translation id="8726019395068607495">已停止 - 機門未關</translation>
diff --git a/chromeos/strings/chromeos_strings_zh-TW.xtb b/chromeos/strings/chromeos_strings_zh-TW.xtb
index 1c1a3e8..c1fd372 100644
--- a/chromeos/strings/chromeos_strings_zh-TW.xtb
+++ b/chromeos/strings/chromeos_strings_zh-TW.xtb
@@ -89,6 +89,7 @@
 <translation id="8294431847097064396">來源</translation>
 <translation id="8347227221149377169">列印工作</translation>
 <translation id="8352772353338965963">新增可多重登入的帳戶。這些帳戶的使用者不需提供密碼即可存取所有已登入的帳戶。因此,建議你只讓信任的帳戶使用這項功能。</translation>
+<translation id="8668052347555487755">色彩模式</translation>
 <translation id="8701136875688985581">由 <ph name="ENROLLMENT_DOMAIN" /> 管理這位使用者,因此可能會從遠端管理設定並監控使用者活動。</translation>
 <translation id="871560550817059752">失敗 - 墨水用盡</translation>
 <translation id="8726019395068607495">已停止 - 蓋子處於開啟狀態</translation>
diff --git a/chromeos/strings/chromeos_strings_zu.xtb b/chromeos/strings/chromeos_strings_zu.xtb
index d716507e..d46514a0 100644
--- a/chromeos/strings/chromeos_strings_zu.xtb
+++ b/chromeos/strings/chromeos_strings_zu.xtb
@@ -89,6 +89,7 @@
 <translation id="8294431847097064396">Umthombo</translation>
 <translation id="8347227221149377169">Imisebenzi yokuphrinta</translation>
 <translation id="8352772353338965963">Engeza i-akhawunti ekungeneni ngemvume okuningi. Wonke ama-akhawunti angene ngemvume angafinyelelwa ngaphandle kwephasiwedi, ngakho-ke lesi sici kumele sisetshenziswe kuphela nama-akhawunti athenjiwe.</translation>
+<translation id="8668052347555487755">Imodi yombala</translation>
 <translation id="8701136875688985581">I-<ph name="ENROLLMENT_DOMAIN" /> ilawula lo msebenzisi. Ingalawula amasethingi isekudeni futhi iqaphe umsebenzi womsebenzisi.</translation>
 <translation id="871560550817059752">Yehlulekile - Uyinki uphelile</translation>
 <translation id="8726019395068607495">Imile - Umnyango uvuliwe</translation>
diff --git a/components/arc/session/arc_data_remover.cc b/components/arc/session/arc_data_remover.cc
index 23aabe9..b1cc83c 100644
--- a/components/arc/session/arc_data_remover.cc
+++ b/components/arc/session/arc_data_remover.cc
@@ -57,9 +57,8 @@
           .account_id();
   upstart_client->StartJob(
       kArcRemoveDataUpstartJob, {"CHROMEOS_USER=" + account_id},
-      base::AdaptCallbackForRepeating(
-          base::BindOnce(&ArcDataRemover::OnDataRemoved,
-                         weak_factory_.GetWeakPtr(), std::move(callback))));
+      base::BindOnce(&ArcDataRemover::OnDataRemoved, weak_factory_.GetWeakPtr(),
+                     std::move(callback)));
 }
 
 void ArcDataRemover::OnDataRemoved(RunCallback callback, bool success) {
diff --git a/components/autofill/core/browser/geo/country_data.cc b/components/autofill/core/browser/geo/country_data.cc
index a85fba5..3204376 100644
--- a/components/autofill/core/browser/geo/country_data.cc
+++ b/components/autofill/core/browser/geo/country_data.cc
@@ -147,7 +147,7 @@
            ADDRESS_REQUIRES_LINE1_CITY } },
   {"BY", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
-           ADDRESS_REQUIRES_LINE1_CITY_STATE_ZIP } },
+           ADDRESS_REQUIRES_LINE1_CITY } },
   {"BZ", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
            ADDRESS_REQUIRES_LINE1_CITY } },
@@ -612,7 +612,7 @@
            ADDRESS_REQUIRES_LINE1_CITY_ZIP } },
   {"RU", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
-           ADDRESS_REQUIRES_LINE1_CITY_ZIP } },
+           ADDRESS_REQUIRES_LINE1_CITY } },
   {"RW", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
            ADDRESS_REQUIRES_LINE1_CITY } },
@@ -726,7 +726,7 @@
            ADDRESS_REQUIRES_LINE1_CITY_ZIP } },
   {"UA", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
-           ADDRESS_REQUIRES_LINE1_CITY_STATE_ZIP } },
+           ADDRESS_REQUIRES_LINE1_CITY } },
   {"UG", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE,
            IDS_AUTOFILL_FIELD_LABEL_PROVINCE,
            ADDRESS_REQUIRES_LINE1_CITY } },
diff --git a/components/autofill_assistant/browser/actions/action_delegate_util.cc b/components/autofill_assistant/browser/actions/action_delegate_util.cc
index d4a2479..29eb45b 100644
--- a/components/autofill_assistant/browser/actions/action_delegate_util.cc
+++ b/components/autofill_assistant/browser/actions/action_delegate_util.cc
@@ -11,7 +11,7 @@
 #include "components/autofill_assistant/browser/web/element_finder.h"
 
 namespace autofill_assistant {
-namespace ActionDelegateUtil {
+namespace action_delegate_util {
 namespace {
 
 void RetainElementAndExecuteCallback(
@@ -112,14 +112,15 @@
                            base::OnceCallback<void(const ClientStatus&)> done) {
   auto actions = std::make_unique<ElementActionVector>();
   actions->emplace_back(std::move(perform));
-  FindElementAndPerform(delegate, selector, std::move(actions),
-                        std::move(done));
+  FindElementAndPerformAll(delegate, selector, std::move(actions),
+                           std::move(done));
 }
 
-void FindElementAndPerform(ActionDelegate* delegate,
-                           const Selector& selector,
-                           std::unique_ptr<ElementActionVector> perform_actions,
-                           base::OnceCallback<void(const ClientStatus&)> done) {
+void FindElementAndPerformAll(
+    ActionDelegate* delegate,
+    const Selector& selector,
+    std::unique_ptr<ElementActionVector> perform_actions,
+    base::OnceCallback<void(const ClientStatus&)> done) {
   DCHECK(!selector.empty());
   VLOG(3) << __func__ << " " << selector;
   delegate->FindElement(
@@ -149,8 +150,8 @@
   actions->emplace_back(base::BindOnce(&ActionDelegate::ClickOrTapElement,
                                        delegate->GetWeakPtr(), click_type));
 
-  FindElementAndPerform(delegate, selector, std::move(actions),
-                        std::move(callback));
+  FindElementAndPerformAll(delegate, selector, std::move(actions),
+                           std::move(callback));
 }
 
 void SendKeyboardInput(ActionDelegate* delegate,
@@ -171,8 +172,8 @@
                                        delegate->GetWeakPtr(), codepoints,
                                        delay_in_millis));
 
-  FindElementAndPerform(delegate, selector, std::move(actions),
-                        std::move(callback));
+  FindElementAndPerformAll(delegate, selector, std::move(actions),
+                           std::move(callback));
 }
 
 void SetFieldValue(ActionDelegate* delegate,
@@ -192,5 +193,5 @@
       std::move(callback));
 }
 
-}  // namespace ActionDelegateUtil
+}  // namespace action_delegate_util
 }  // namespace autofill_assistant
diff --git a/components/autofill_assistant/browser/actions/action_delegate_util.h b/components/autofill_assistant/browser/actions/action_delegate_util.h
index 2c80009..c89eed8 100644
--- a/components/autofill_assistant/browser/actions/action_delegate_util.h
+++ b/components/autofill_assistant/browser/actions/action_delegate_util.h
@@ -11,7 +11,7 @@
 #include "components/autofill_assistant/browser/service.pb.h"
 
 namespace autofill_assistant {
-namespace ActionDelegateUtil {
+namespace action_delegate_util {
 
 using ElementActionCallback =
     base::OnceCallback<void(const ElementFinder::Result&,
@@ -38,7 +38,7 @@
 // immediately executes the |done| callback. If the resolution succeeds, it
 // executes the |perform_actions| callbacks in sequence with the element and
 // the |done| callback as arguments, while retaining the element.
-void FindElementAndPerform(
+void FindElementAndPerformAll(
     /* const */ ActionDelegate* delegate,
     const Selector& selector,
     std::unique_ptr<ElementActionVector> perform_actions,
@@ -74,7 +74,7 @@
                    int key_press_delay_in_millisecond,
                    base::OnceCallback<void(const ClientStatus&)> callback);
 
-}  // namespace ActionDelegateUtil
+}  // namespace action_delegate_util
 }  // namespace autofill_assistant
 
 #endif  // COMPONENTS_AUTOFILL_ASSISTANT_BROWSER_ACTIONS_ACTION_DELEGATE_UTIL_H_
diff --git a/components/autofill_assistant/browser/actions/action_delegate_util_unittest.cc b/components/autofill_assistant/browser/actions/action_delegate_util_unittest.cc
index 557eff1..03329aa 100644
--- a/components/autofill_assistant/browser/actions/action_delegate_util_unittest.cc
+++ b/components/autofill_assistant/browser/actions/action_delegate_util_unittest.cc
@@ -12,6 +12,7 @@
 #include "testing/gmock/include/gmock/gmock.h"
 
 namespace autofill_assistant {
+namespace action_delegate_util {
 namespace {
 
 using ::base::test::RunOnceCallback;
@@ -55,12 +56,11 @@
   EXPECT_CALL(*this,
               MockDone(EqualsStatus(ClientStatus(ELEMENT_RESOLUTION_FAILED))));
 
-  ActionDelegateUtil::FindElementAndPerform(
-      &mock_action_delegate_, Selector({"#nothing"}),
-      base::BindOnce(&ActionDelegateUtilTest::MockAction,
-                     base::Unretained(this)),
-      base::BindOnce(&ActionDelegateUtilTest::MockDone,
-                     base::Unretained(this)));
+  FindElementAndPerform(&mock_action_delegate_, Selector({"#nothing"}),
+                        base::BindOnce(&ActionDelegateUtilTest::MockAction,
+                                       base::Unretained(this)),
+                        base::BindOnce(&ActionDelegateUtilTest::MockDone,
+                                       base::Unretained(this)));
 }
 
 TEST_F(ActionDelegateUtilTest, FindElementAndExecuteSingleAction) {
@@ -72,12 +72,11 @@
       .WillOnce(RunOnceCallback<1>(OkClientStatus()));
   EXPECT_CALL(*this, MockDone(EqualsStatus(OkClientStatus())));
 
-  ActionDelegateUtil::FindElementAndPerform(
-      &mock_action_delegate_, expected_selector,
-      base::BindOnce(&ActionDelegateUtilTest::MockAction,
-                     base::Unretained(this)),
-      base::BindOnce(&ActionDelegateUtilTest::MockDone,
-                     base::Unretained(this)));
+  FindElementAndPerform(&mock_action_delegate_, expected_selector,
+                        base::BindOnce(&ActionDelegateUtilTest::MockAction,
+                                       base::Unretained(this)),
+                        base::BindOnce(&ActionDelegateUtilTest::MockDone,
+                                       base::Unretained(this)));
 }
 
 TEST_F(ActionDelegateUtilTest, FindElementAndExecuteMultipleActions) {
@@ -95,7 +94,7 @@
       .WillOnce(RunOnceCallback<2>(OkClientStatus()));
   EXPECT_CALL(*this, MockDone(EqualsStatus(OkClientStatus())));
 
-  auto actions = std::make_unique<ActionDelegateUtil::ElementActionVector>();
+  auto actions = std::make_unique<ElementActionVector>();
   actions->emplace_back(base::BindOnce(
       &ActionDelegateUtilTest::MockIndexedAction, base::Unretained(this), 1));
   actions->emplace_back(base::BindOnce(
@@ -103,10 +102,10 @@
   actions->emplace_back(base::BindOnce(
       &ActionDelegateUtilTest::MockIndexedAction, base::Unretained(this), 3));
 
-  ActionDelegateUtil::FindElementAndPerform(
-      &mock_action_delegate_, expected_selector, std::move(actions),
-      base::BindOnce(&ActionDelegateUtilTest::MockDone,
-                     base::Unretained(this)));
+  FindElementAndPerformAll(&mock_action_delegate_, expected_selector,
+                           std::move(actions),
+                           base::BindOnce(&ActionDelegateUtilTest::MockDone,
+                                          base::Unretained(this)));
 }
 
 TEST_F(ActionDelegateUtilTest, ActionDelegateDeletedDuringExecution) {
@@ -124,7 +123,7 @@
   EXPECT_CALL(*mock_delegate, ScrollIntoView(_, _)).Times(0);
   EXPECT_CALL(*this, MockDone(_)).Times(0);
 
-  auto actions = std::make_unique<ActionDelegateUtil::ElementActionVector>();
+  auto actions = std::make_unique<ElementActionVector>();
   actions->emplace_back(
       base::BindOnce(&ActionDelegate::WaitForDocumentToBecomeInteractive,
                      mock_delegate->GetWeakPtr()));
@@ -139,10 +138,10 @@
   actions->emplace_back(base::BindOnce(&ActionDelegate::ScrollIntoView,
                                        mock_delegate->GetWeakPtr()));
 
-  ActionDelegateUtil::FindElementAndPerform(
-      mock_delegate.get(), expected_selector, std::move(actions),
-      base::BindOnce(&ActionDelegateUtilTest::MockDone,
-                     base::Unretained(this)));
+  FindElementAndPerformAll(mock_delegate.get(), expected_selector,
+                           std::move(actions),
+                           base::BindOnce(&ActionDelegateUtilTest::MockDone,
+                                          base::Unretained(this)));
 }
 
 TEST_F(ActionDelegateUtilTest, FindElementForGetFails) {
@@ -154,7 +153,7 @@
       *this,
       MockDoneGet(EqualsStatus(ClientStatus(ELEMENT_RESOLUTION_FAILED)), ""));
 
-  ActionDelegateUtil::FindElementAndGetProperty(
+  FindElementAndGetProperty(
       &mock_action_delegate_, Selector({"#nothing"}),
       base::BindOnce(&ActionDelegateUtilTest::MockGetAction,
                      base::Unretained(this)),
@@ -171,7 +170,7 @@
       .WillOnce(RunOnceCallback<1>(OkClientStatus(), "value"));
   EXPECT_CALL(*this, MockDoneGet(EqualsStatus(OkClientStatus()), "value"));
 
-  ActionDelegateUtil::FindElementAndGetProperty(
+  FindElementAndGetProperty(
       &mock_action_delegate_, expected_selector,
       base::BindOnce(&ActionDelegateUtilTest::MockGetAction,
                      base::Unretained(this)),
@@ -180,4 +179,5 @@
 }
 
 }  // namespace
+}  // namespace action_delegate_util
 }  // namespace autofill_assistant
diff --git a/components/autofill_assistant/browser/actions/click_action.cc b/components/autofill_assistant/browser/actions/click_action.cc
index 962c48c0..6ac79137 100644
--- a/components/autofill_assistant/browser/actions/click_action.cc
+++ b/components/autofill_assistant/browser/actions/click_action.cc
@@ -51,7 +51,7 @@
     return;
   }
 
-  ActionDelegateUtil::ClickOrTapElement(
+  action_delegate_util::ClickOrTapElement(
       delegate_, selector, click_type_,
       base::BindOnce(&::autofill_assistant::ClickAction::OnClick,
                      weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
diff --git a/components/autofill_assistant/browser/actions/fallback_handler/required_fields_fallback_handler.cc b/components/autofill_assistant/browser/actions/fallback_handler/required_fields_fallback_handler.cc
index c7bf053..2082a465 100644
--- a/components/autofill_assistant/browser/actions/fallback_handler/required_fields_fallback_handler.cc
+++ b/components/autofill_assistant/browser/actions/fallback_handler/required_fields_fallback_handler.cc
@@ -225,7 +225,7 @@
   const RequiredField& required_field = required_fields_[required_fields_index];
 
   if (required_field.value_expression.empty()) {
-    ActionDelegateUtil::SetFieldValue(
+    action_delegate_util::SetFieldValue(
         action_delegate_, required_field.selector, "",
         required_field.fill_strategy, required_field.delay_in_millisecond,
         base::BindOnce(&RequiredFieldsFallbackHandler::OnSetFallbackFieldValue,
@@ -249,7 +249,7 @@
       // default: TAP
       click_type = ClickType::TAP;
     }
-    ActionDelegateUtil::ClickOrTapElement(
+    action_delegate_util::ClickOrTapElement(
         action_delegate_, required_field.selector, click_type,
         base::BindOnce(
             &RequiredFieldsFallbackHandler::OnClickOrTapFallbackElement,
@@ -374,7 +374,7 @@
     // default: TAP
     click_type = ClickType::TAP;
   }
-  ActionDelegateUtil::ClickOrTapElement(
+  action_delegate_util::ClickOrTapElement(
       action_delegate_, selector_to_click, click_type,
       base::BindOnce(&RequiredFieldsFallbackHandler::OnSetFallbackFieldValue,
                      weak_ptr_factory_.GetWeakPtr(), required_fields_index,
diff --git a/components/autofill_assistant/browser/actions/focus_element_action.cc b/components/autofill_assistant/browser/actions/focus_element_action.cc
index 65849c0..8a54e9e 100644
--- a/components/autofill_assistant/browser/actions/focus_element_action.cc
+++ b/components/autofill_assistant/browser/actions/focus_element_action.cc
@@ -72,14 +72,14 @@
     return;
   }
 
-  auto actions = std::make_unique<ActionDelegateUtil::ElementActionVector>();
+  auto actions = std::make_unique<action_delegate_util::ElementActionVector>();
   actions->emplace_back(
       base::BindOnce(&ActionDelegate::WaitForDocumentToBecomeInteractive,
                      delegate_->GetWeakPtr()));
   actions->emplace_back(base::BindOnce(&ActionDelegate::FocusElement,
                                        delegate_->GetWeakPtr(), selector,
                                        top_padding));
-  ActionDelegateUtil::FindElementAndPerform(
+  action_delegate_util::FindElementAndPerformAll(
       delegate_, selector, std::move(actions),
       base::BindOnce(&FocusElementAction::OnFocusElement,
                      weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
diff --git a/components/autofill_assistant/browser/actions/highlight_element_action.cc b/components/autofill_assistant/browser/actions/highlight_element_action.cc
index 9d0ed11..673b029 100644
--- a/components/autofill_assistant/browser/actions/highlight_element_action.cc
+++ b/components/autofill_assistant/browser/actions/highlight_element_action.cc
@@ -48,7 +48,7 @@
     return;
   }
 
-  ActionDelegateUtil::FindElementAndPerform(
+  action_delegate_util::FindElementAndPerform(
       delegate_, selector,
       base::BindOnce(&ActionDelegate::HighlightElement,
                      delegate_->GetWeakPtr()),
diff --git a/components/autofill_assistant/browser/actions/select_option_action.cc b/components/autofill_assistant/browser/actions/select_option_action.cc
index c8adc11..bf56ede 100644
--- a/components/autofill_assistant/browser/actions/select_option_action.cc
+++ b/components/autofill_assistant/browser/actions/select_option_action.cc
@@ -72,7 +72,7 @@
     return;
   }
 
-  ActionDelegateUtil::FindElementAndPerform(
+  action_delegate_util::FindElementAndPerform(
       delegate_, selector,
       base::BindOnce(&ActionDelegate::SelectOption, delegate_->GetWeakPtr(),
                      value_, proto_.select_option().select_strategy()),
diff --git a/components/autofill_assistant/browser/actions/set_attribute_action.cc b/components/autofill_assistant/browser/actions/set_attribute_action.cc
index 7a7c8c9..53f1928 100644
--- a/components/autofill_assistant/browser/actions/set_attribute_action.cc
+++ b/components/autofill_assistant/browser/actions/set_attribute_action.cc
@@ -46,7 +46,7 @@
     return;
   }
 
-  ActionDelegateUtil::FindElementAndPerform(
+  action_delegate_util::FindElementAndPerform(
       delegate_, selector,
       base::BindOnce(&ActionDelegate::SetAttribute, delegate_->GetWeakPtr(),
                      ExtractVector(proto_.set_attribute().attribute()),
diff --git a/components/autofill_assistant/browser/actions/set_form_field_value_action.cc b/components/autofill_assistant/browser/actions/set_form_field_value_action.cc
index 032960f..2b38d72a 100644
--- a/components/autofill_assistant/browser/actions/set_form_field_value_action.cc
+++ b/components/autofill_assistant/browser/actions/set_form_field_value_action.cc
@@ -186,7 +186,7 @@
       /* next = */ next + 1);
   const auto& field_input = field_inputs_[next];
   if (field_input.keyboard_input) {
-    ActionDelegateUtil::SendKeyboardInput(
+    action_delegate_util::SendKeyboardInput(
         delegate_, selector_, *field_input.keyboard_input, delay_in_millisecond,
         std::move(next_field_callback));
   } else if (field_input.password_type != PasswordValueType::NOT_SET) {
@@ -205,11 +205,11 @@
   } else {
     auto fill_strategy = proto_.set_form_value().fill_strategy();
     if (IsSimulatingKeyPresses(fill_strategy)) {
-      ActionDelegateUtil::SetFieldValue(delegate_, selector_, field_input.value,
-                                        fill_strategy, delay_in_millisecond,
-                                        std::move(next_field_callback));
+      action_delegate_util::SetFieldValue(
+          delegate_, selector_, field_input.value, fill_strategy,
+          delay_in_millisecond, std::move(next_field_callback));
     } else {
-      ActionDelegateUtil::SetFieldValue(
+      action_delegate_util::SetFieldValue(
           delegate_, selector_, field_input.value, fill_strategy,
           delay_in_millisecond,
           base::BindOnce(
@@ -256,7 +256,7 @@
 
     // Run |SetFieldValue| with keyboard simulation on and move on to next value
     // afterwards.
-    ActionDelegateUtil::SetFieldValue(
+    action_delegate_util::SetFieldValue(
         delegate_, selector_, requested_value, SIMULATE_KEY_PRESSES,
         proto_.set_form_value().delay_in_millisecond(),
         base::BindOnce(&SetFormFieldValueAction::OnSetFieldValue,
@@ -279,13 +279,13 @@
   auto fill_strategy = proto_.set_form_value().fill_strategy();
   int delay_in_millisecond = proto_.set_form_value().delay_in_millisecond();
   if (IsSimulatingKeyPresses(fill_strategy)) {
-    ActionDelegateUtil::SetFieldValue(
+    action_delegate_util::SetFieldValue(
         delegate_, selector_, password, fill_strategy, delay_in_millisecond,
         base::BindOnce(&SetFormFieldValueAction::OnSetFieldValue,
                        weak_ptr_factory_.GetWeakPtr(),
                        /* next = */ field_index + 1));
   } else {
-    ActionDelegateUtil::SetFieldValue(
+    action_delegate_util::SetFieldValue(
         delegate_, selector_, password, fill_strategy, delay_in_millisecond,
         base::BindOnce(
             &SetFormFieldValueAction::OnSetFieldValueAndCheckFallback,
diff --git a/components/autofill_assistant/browser/actions/upload_dom_action.cc b/components/autofill_assistant/browser/actions/upload_dom_action.cc
index b37b6d8..084ed12 100644
--- a/components/autofill_assistant/browser/actions/upload_dom_action.cc
+++ b/components/autofill_assistant/browser/actions/upload_dom_action.cc
@@ -43,7 +43,7 @@
     return;
   }
 
-  ActionDelegateUtil::FindElementAndGetProperty(
+  action_delegate_util::FindElementAndGetProperty(
       delegate_, selector,
       base::BindOnce(&ActionDelegate::GetOuterHtml, delegate_->GetWeakPtr()),
       base::BindOnce(&UploadDomAction::OnGetOuterHtml,
diff --git a/components/autofill_assistant/browser/client.h b/components/autofill_assistant/browser/client.h
index 5398ef8..0d932cd 100644
--- a/components/autofill_assistant/browser/client.h
+++ b/components/autofill_assistant/browser/client.h
@@ -15,10 +15,6 @@
 class PersonalDataManager;
 }  // namespace autofill
 
-namespace password_manager {
-class PasswordManagerClient;
-}  // namespace password_manager
-
 namespace version_info {
 enum class Channel;
 }  // namespace version_info
@@ -60,10 +56,6 @@
   // Returns the current active personal data manager.
   virtual autofill::PersonalDataManager* GetPersonalDataManager() const = 0;
 
-  // Return the password manager client for the current WebContents.
-  virtual password_manager::PasswordManagerClient* GetPasswordManagerClient()
-      const = 0;
-
   // Returns the currently active login fetcher.
   virtual WebsiteLoginManager* GetWebsiteLoginManager() const = 0;
 
diff --git a/components/autofill_assistant/browser/field_formatter.cc b/components/autofill_assistant/browser/field_formatter.cc
index 3f46888..4f93ef3 100644
--- a/components/autofill_assistant/browser/field_formatter.cc
+++ b/components/autofill_assistant/browser/field_formatter.cc
@@ -133,6 +133,14 @@
         AutofillFormatProto::CREDIT_CARD_NUMBER_LAST_FOUR_DIGITS))] =
         last_four_digits;
   }
+  int month;
+  if (base::StringToInt(
+          credit_card.GetInfo(autofill::CREDIT_CARD_EXP_MONTH, locale),
+          &month)) {
+    mappings[base::NumberToString(static_cast<int>(
+        AutofillFormatProto::CREDIT_CARD_NON_PADDED_EXP_MONTH))] =
+        base::NumberToString(month);
+  }
 
   return mappings;
 }
diff --git a/components/autofill_assistant/browser/field_formatter_unittest.cc b/components/autofill_assistant/browser/field_formatter_unittest.cc
index 54fb90b..a59f531 100644
--- a/components/autofill_assistant/browser/field_formatter_unittest.cc
+++ b/components/autofill_assistant/browser/field_formatter_unittest.cc
@@ -108,6 +108,11 @@
   EXPECT_EQ(*FormatString("${-2} ${-5}",
                           CreateAutofillMappings(credit_card, "en-US")),
             "visa Visa");
+
+  // CREDIT_CARD_NON_PADDED_EXP_MONTH
+  EXPECT_EQ(
+      *FormatString("${-7}", CreateAutofillMappings(credit_card, "en-US")),
+      "1");
 }
 
 TEST(FieldFormatterTest, SpecialCases) {
@@ -189,6 +194,7 @@
 
 TEST(FieldFormatterTest, AddsAllCreditCardFields) {
   std::map<std::string, std::string> expected_values = {
+      {"-7", "8"},
       {"-5", "Visa"},
       {"-4", "1111"},
       {"-2", "visa"},
diff --git a/components/autofill_assistant/browser/generic_ui.proto b/components/autofill_assistant/browser/generic_ui.proto
index 9334e05..954033a 100644
--- a/components/autofill_assistant/browser/generic_ui.proto
+++ b/components/autofill_assistant/browser/generic_ui.proto
@@ -199,6 +199,7 @@
     CREDIT_CARD_NETWORK_FOR_DISPLAY = -5;
     // Currently only US states are supported. The state name is in lower case.
     ADDRESS_HOME_STATE_NAME = -6;
+    CREDIT_CARD_NON_PADDED_EXP_MONTH = -7;
   }
   // The format string to use. May contain one or multiple "${key}"
   // placeholders, where the key is an integer corresponding to
diff --git a/components/autofill_assistant/browser/mock_client.h b/components/autofill_assistant/browser/mock_client.h
index 31b2153..1ddf240 100644
--- a/components/autofill_assistant/browser/mock_client.h
+++ b/components/autofill_assistant/browser/mock_client.h
@@ -31,8 +31,6 @@
   MOCK_CONST_METHOD0(GetWebContents, content::WebContents*());
   MOCK_CONST_METHOD0(GetPersonalDataManager, autofill::PersonalDataManager*());
   MOCK_CONST_METHOD0(GetWebsiteLoginManager, WebsiteLoginManager*());
-  MOCK_CONST_METHOD0(GetPasswordManagerClient,
-                     password_manager::PasswordManagerClient*());
   MOCK_METHOD0(GetAccessTokenFetcher, AccessTokenFetcher*());
   MOCK_METHOD1(Shutdown, void(Metrics::DropOutReason reason));
   MOCK_METHOD1(RecordDropOut, void(Metrics::DropOutReason reason));
diff --git a/components/autofill_assistant/browser/script_executor.cc b/components/autofill_assistant/browser/script_executor.cc
index c552b281..06fa739 100644
--- a/components/autofill_assistant/browser/script_executor.cc
+++ b/components/autofill_assistant/browser/script_executor.cc
@@ -1210,7 +1210,8 @@
     return;
 
   if (!main_script_->last_focused_element_selector_.empty()) {
-    auto actions = std::make_unique<ActionDelegateUtil::ElementActionVector>();
+    auto actions =
+        std::make_unique<action_delegate_util::ElementActionVector>();
     actions->emplace_back(
         base::BindOnce(&ActionDelegate::WaitForDocumentToBecomeInteractive,
                        main_script_->GetWeakPtr()));
@@ -1218,7 +1219,7 @@
         &ActionDelegate::FocusElement, main_script_->GetWeakPtr(),
         main_script_->last_focused_element_selector_,
         main_script_->last_focused_element_top_padding_));
-    ActionDelegateUtil::FindElementAndPerform(
+    action_delegate_util::FindElementAndPerformAll(
         main_script_, main_script_->last_focused_element_selector_,
         std::move(actions), base::DoNothing());
   }
diff --git a/components/autofill_assistant/browser/service.proto b/components/autofill_assistant/browser/service.proto
index 178cfef..789a9d8c 100644
--- a/components/autofill_assistant/browser/service.proto
+++ b/components/autofill_assistant/browser/service.proto
@@ -431,6 +431,7 @@
   SIMULATE_KEY_PRESSES_SELECT_VALUE = 3;
 }
 
+// Note: On multiple matches, the first one will be selected.
 enum DropdownSelectStrategy {
   UNSPECIFIED_SELECT_STRATEGY = 0;
 
diff --git a/components/blocked_content/safe_browsing_triggered_popup_blocker_unittest.cc b/components/blocked_content/safe_browsing_triggered_popup_blocker_unittest.cc
index 1bc377d..5900bf6 100644
--- a/components/blocked_content/safe_browsing_triggered_popup_blocker_unittest.cc
+++ b/components/blocked_content/safe_browsing_triggered_popup_blocker_unittest.cc
@@ -71,6 +71,7 @@
   GetSafeBrowsingDatabaseManager() override {
     return nullptr;
   }
+  void OnReloadRequested() override {}
 
   // content::RenderViewHostTestHarness:
   void SetUp() override {
diff --git a/components/dbus/menu/BUILD.gn b/components/dbus/menu/BUILD.gn
index 75dd0eb..8192b75 100644
--- a/components/dbus/menu/BUILD.gn
+++ b/components/dbus/menu/BUILD.gn
@@ -29,6 +29,9 @@
       "//ui/gfx/x",
     ]
   }
+  if (use_ozone) {
+    deps += [ "//ui/ozone" ]
+  }
 }
 
 source_set("unit_tests") {
diff --git a/components/dbus/menu/DEPS b/components/dbus/menu/DEPS
index 9b41b13..1afde18eb 100644
--- a/components/dbus/menu/DEPS
+++ b/components/dbus/menu/DEPS
@@ -4,4 +4,5 @@
   "+ui/events/keycodes",
   "+ui/gfx/image",
   "+ui/gfx/x",
+  "+ui/ozone/public",
 ]
diff --git a/components/dbus/menu/menu_property_list.cc b/components/dbus/menu/menu_property_list.cc
index 94f9b3f6..ee1ac0a 100644
--- a/components/dbus/menu/menu_property_list.cc
+++ b/components/dbus/menu/menu_property_list.cc
@@ -8,19 +8,65 @@
 
 #include "base/strings/string16.h"
 #include "base/strings/utf_string_conversions.h"
+#include "build/build_config.h"
 #include "ui/base/accelerators/accelerator.h"
 #include "ui/base/accelerators/menu_label_accelerator_util_linux.h"
 #include "ui/base/models/image_model.h"
 #include "ui/base/models/menu_model.h"
-#include "ui/events/keycodes/keysym_to_unicode.h"
 #include "ui/gfx/image/image.h"
 
 #if defined(USE_X11)
-#include "ui/base/ui_base_features.h"
 #include "ui/events/keycodes/keyboard_code_conversion_x.h"  // nogncheck
+#include "ui/events/keycodes/keysym_to_unicode.h"           // nogncheck
 #include "ui/gfx/x/x11.h"                                   // nogncheck
 #endif
 
+#if defined(USE_OZONE)
+#include "ui/base/ui_base_features.h"             // nogncheck
+#include "ui/ozone/public/ozone_platform.h"       // nogncheck
+#include "ui/ozone/public/platform_menu_utils.h"  // nogncheck
+#endif
+
+namespace {
+
+std::string ToDBusKeySym(ui::KeyboardCode code) {
+#if defined(USE_OZONE)
+  if (features::IsUsingOzonePlatform()) {
+    const auto* const platorm_menu_utils =
+        ui::OzonePlatform::GetInstance()->GetPlatformMenuUtils();
+    if (platorm_menu_utils)
+      return platorm_menu_utils->ToDBusKeySym(code);
+    return {};
+  }
+#endif
+#if defined(USE_X11)
+  return base::UTF16ToUTF8(
+      base::string16(1, ui::GetUnicodeCharacterFromXKeySym(
+                            XKeysymForWindowsKeyCode(code, false))));
+#endif
+  return {};
+}
+
+std::vector<DbusString> GetDbusMenuShortcut(ui::Accelerator accelerator) {
+  auto dbus_key_sym = ToDBusKeySym(accelerator.key_code());
+  if (dbus_key_sym.empty())
+    return {};
+
+  std::vector<DbusString> parts;
+  if (accelerator.IsCtrlDown())
+    parts.emplace_back("Control");
+  if (accelerator.IsAltDown())
+    parts.emplace_back("Alt");
+  if (accelerator.IsShiftDown())
+    parts.emplace_back("Shift");
+  if (accelerator.IsCmdDown())
+    parts.emplace_back("Super");
+  parts.emplace_back(dbus_key_sym);
+  return parts;
+}
+
+}  // namespace
+
 MenuItemProperties ComputeMenuPropertiesForMenuItem(ui::MenuModel* menu,
                                                     int i) {
   // Properties should only be set if they differ from the default values.
@@ -48,26 +94,11 @@
 
   ui::Accelerator accelerator;
   if (menu->GetAcceleratorAt(i, &accelerator)) {
-    std::vector<DbusString> parts;
-    if (accelerator.IsCtrlDown())
-      parts.emplace_back("Control");
-    if (accelerator.IsAltDown())
-      parts.emplace_back("Alt");
-    if (accelerator.IsShiftDown())
-      parts.emplace_back("Shift");
-    if (accelerator.IsCmdDown())
-      parts.emplace_back("Super");
-#if defined(USE_X11)
-    if (!features::IsUsingOzonePlatform()) {
-      uint16_t keysym = ui::GetUnicodeCharacterFromXKeySym(
-          XKeysymForWindowsKeyCode(accelerator.key_code(), false));
-      parts.emplace_back(base::UTF16ToUTF8(base::string16(1, keysym)));
+    auto parts = GetDbusMenuShortcut(accelerator);
+    if (!parts.empty()) {
       properties["shortcut"] = MakeDbusVariant(
           MakeDbusArray(DbusArray<DbusString>(std::move(parts))));
     }
-#else
-    NOTIMPLEMENTED();
-#endif
   }
 
   switch (menu->GetTypeAt(i)) {
diff --git a/components/dbus/menu/menu_property_list_unittest.cc b/components/dbus/menu/menu_property_list_unittest.cc
index 06e24b8..4de2919 100644
--- a/components/dbus/menu/menu_property_list_unittest.cc
+++ b/components/dbus/menu/menu_property_list_unittest.cc
@@ -7,6 +7,7 @@
 #include <memory>
 
 #include "base/strings/utf_string_conversions.h"
+#include "build/build_config.h"
 #include "components/dbus/properties/types.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/base/accelerators/accelerator.h"
@@ -318,7 +319,7 @@
   EXPECT_EQ(menu->ComputeProperties(), props);
 }
 
-#if defined(USE_X11)
+#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
 TEST(MenuPropertyListTest, ComputePropertiesAccelerator) {
   if (features::IsUsingOzonePlatform())
     return;
diff --git a/components/leveldb_proto/public/shared_proto_database_client_list.cc b/components/leveldb_proto/public/shared_proto_database_client_list.cc
index 1b37477..eae251d 100644
--- a/components/leveldb_proto/public/shared_proto_database_client_list.cc
+++ b/components/leveldb_proto/public/shared_proto_database_client_list.cc
@@ -80,8 +80,8 @@
       return "PrintJobDatabase";
     case ProtoDbType::FEED_STREAM_DATABASE:
       return "FeedStreamDatabase";
-    case ProtoDbType::TAB_STATE_DATABASE:
-      return "TabStateDatabase";
+    case ProtoDbType::PERSISTED_STATE_DATABASE:
+      return "PersistedStateDatabase";
     case ProtoDbType::UPBOARDING_QUERY_TILE_STORE:
       return "UpboardingQueryTileStore";
     case ProtoDbType::NEARBY_SHARE_PUBLIC_CERTIFICATE_DATABASE:
diff --git a/components/leveldb_proto/public/shared_proto_database_client_list.h b/components/leveldb_proto/public/shared_proto_database_client_list.h
index 3e694d5..57d6886 100644
--- a/components/leveldb_proto/public/shared_proto_database_client_list.h
+++ b/components/leveldb_proto/public/shared_proto_database_client_list.h
@@ -49,7 +49,7 @@
   // DB Used by shared database, will always be unique.
   SHARED_DB_METADATA = 25,
   FEED_STREAM_DATABASE = 26,
-  TAB_STATE_DATABASE = 27,
+  PERSISTED_STATE_DATABASE = 27,
   UPBOARDING_QUERY_TILE_STORE = 28,
   NEARBY_SHARE_PUBLIC_CERTIFICATE_DATABASE = 29,
   VIDEO_TUTORIALS_DATABASE = 30,
@@ -64,7 +64,7 @@
     ProtoDbType::NOTIFICATION_SCHEDULER_NOTIFICATION_STORE,
     ProtoDbType::PRINT_JOB_DATABASE,
     ProtoDbType::FEED_STREAM_DATABASE,
-    ProtoDbType::TAB_STATE_DATABASE,
+    ProtoDbType::PERSISTED_STATE_DATABASE,
     ProtoDbType::UPBOARDING_QUERY_TILE_STORE,
     ProtoDbType::NEARBY_SHARE_PUBLIC_CERTIFICATE_DATABASE,
     ProtoDbType::VIDEO_TUTORIALS_DATABASE,
diff --git a/components/nacl/common/nacl_cmd_line.cc b/components/nacl/common/nacl_cmd_line.cc
index c4560db..bd9d371 100644
--- a/components/nacl/common/nacl_cmd_line.cc
+++ b/components/nacl/common/nacl_cmd_line.cc
@@ -32,6 +32,7 @@
 #endif
 #if defined(OS_WIN)
     switches::kDisableHighResTimer,
+    switches::kRaiseTimerFrequency,
 #endif
   };
   cmd_line->CopySwitchesFrom(browser_command_line, kSwitchNames,
diff --git a/components/password_manager/core/browser/credential_manager_impl.cc b/components/password_manager/core/browser/credential_manager_impl.cc
index 8c0af636..f755962 100644
--- a/components/password_manager/core/browser/credential_manager_impl.cc
+++ b/components/password_manager/core/browser/credential_manager_impl.cc
@@ -132,7 +132,7 @@
     return;
   }
   // Return an empty credential while autofill-assistant is running.
-  if (client_->GetAutofillAssistantMode() == AutofillAssistantMode::kUIShown) {
+  if (client_->IsAutofillAssistantUIVisible()) {
     // Callback with empty credential info.
     std::move(callback).Run(CredentialManagerError::SUCCESS, CredentialInfo());
     LogCredentialManagerGetResult(
diff --git a/components/password_manager/core/browser/credential_manager_impl_unittest.cc b/components/password_manager/core/browser/credential_manager_impl_unittest.cc
index 06078d1..23b70d7 100644
--- a/components/password_manager/core/browser/credential_manager_impl_unittest.cc
+++ b/components/password_manager/core/browser/credential_manager_impl_unittest.cc
@@ -78,7 +78,7 @@
                void(const std::vector<const PasswordForm*>&,
                     const url::Origin&,
                     const std::vector<const PasswordForm*>*));
-  MOCK_CONST_METHOD0(GetAutofillAssistantMode, AutofillAssistantMode());
+  MOCK_CONST_METHOD0(IsAutofillAssistantUIVisible, bool());
 
   explicit MockPasswordManagerClient(PasswordStore* profile_store,
                                      PasswordStore* account_store)
@@ -96,6 +96,8 @@
                                             true);
     prefs_->registry()->RegisterBooleanPref(::prefs::kSafeBrowsingEnhanced,
                                             false);
+    ON_CALL(*this, IsAutofillAssistantUIVisible)
+        .WillByDefault(testing::Return(false));
   }
   ~MockPasswordManagerClient() override = default;
 
@@ -1455,8 +1457,8 @@
       .Times(testing::Exactly(0));
   EXPECT_CALL(*client_, NotifyUserAutoSigninPtr()).Times(testing::Exactly(0));
   EXPECT_CALL(*client_, IsIncognito()).WillRepeatedly(testing::Return(false));
-  EXPECT_CALL(*client_, GetAutofillAssistantMode())
-      .WillRepeatedly(testing::Return(AutofillAssistantMode::kUIShown));
+  EXPECT_CALL(*client_, IsAutofillAssistantUIVisible())
+      .WillRepeatedly(testing::Return(true));
 
   ExpectCredentialType(CredentialMediationRequirement::kOptional, true,
                        federations, CredentialType::CREDENTIAL_TYPE_EMPTY);
diff --git a/components/password_manager/core/browser/password_manager.cc b/components/password_manager/core/browser/password_manager.cc
index a1c8efe..e5810e4 100644
--- a/components/password_manager/core/browser/password_manager.cc
+++ b/components/password_manager/core/browser/password_manager.cc
@@ -890,8 +890,8 @@
 }
 
 void PasswordManager::OnLoginSuccessful() {
-  if (autofill_assistant_mode_ == AutofillAssistantMode::kUIShown) {
-    // Suppress prompts while Autofill Assistant is running.
+  if (client_->IsAutofillAssistantUIVisible()) {
+    // Suppress prompts while Autofill Assistant UI is shown.
     return;
   }
 
@@ -1223,23 +1223,10 @@
   }
 }
 
-void PasswordManager::SetAutofillAssistantMode(AutofillAssistantMode mode) {
-  if (autofill_assistant_mode_ == mode) {
-    return;
-  }
-  autofill_assistant_mode_ = mode;
-
-  if (autofill_assistant_mode_ == AutofillAssistantMode::kUINotShown) {
-    // Reset pending credentials as Autofill Assistant has handled the pending
-    // submission.
-    for (auto& form_manager : form_managers_)
-      form_manager->ResetState();
-    owned_submitted_form_manager_.reset();
-  }
-}
-
-AutofillAssistantMode PasswordManager::GetAutofillAssistantMode() const {
-  return autofill_assistant_mode_;
+void PasswordManager::ResetPendingCredentials() {
+  for (auto& form_manager : form_managers_)
+    form_manager->ResetState();
+  owned_submitted_form_manager_.reset();
 }
 
 #if defined(OS_IOS)
diff --git a/components/password_manager/core/browser/password_manager.h b/components/password_manager/core/browser/password_manager.h
index a09eb2f0..641e1fa 100644
--- a/components/password_manager/core/browser/password_manager.h
+++ b/components/password_manager/core/browser/password_manager.h
@@ -54,19 +54,6 @@
 class PasswordManagerMetricsRecorder;
 struct PossibleUsernameData;
 
-// Define the modes of collaboration between Password Manager and Autofill
-// Assistant (who handles form submissions, whether to show prompts or not).
-enum class AutofillAssistantMode {
-  // Autofill Assistant UI is not being shown. Password Manager operates in the
-  // regular
-  // mode - it handles submissions and shows prompts.
-  kUINotShown = 0,
-  // Autofill Assistant UI is being shown. The password manager
-  // is basically off - it does not handle submissions and therefore does not
-  // show prompts. The script does all the work instead.
-  kUIShown
-};
-
 // Per-tab password manager. Handles creation and management of UI elements,
 // receiving password form data from the renderer and managing the password
 // database through the PasswordStore.
@@ -219,12 +206,8 @@
   // Notifies that Credential Management API function store() is called.
   void NotifyStorePasswordCalled();
 
-  // Sets the Autofill Assistant mode to disable prompts while |mode=kRunning|.
-  // A script finish will clear pending credentials in all form managers.
-  void SetAutofillAssistantMode(AutofillAssistantMode mode);
-
-  // Returns the currently set autofill-assistant mode.
-  AutofillAssistantMode GetAutofillAssistantMode() const;
+  // Resets pending credentials.
+  void ResetPendingCredentials();
 
  private:
   FRIEND_TEST_ALL_PREFIXES(
@@ -326,9 +309,6 @@
   // Returns the timeout for the disabling Password Manager's prompts.
   base::TimeDelta GetTimeoutForDisablingPrompts();
 
-  // Resets |autofill_assistant_mode_| to the default.
-  void ResetAutofillAssistantMode();
-
 #if defined(OS_IOS)
   // Even though the formal submission might not happen, the manager
   // could still be provisionally saved on user input or have autofilled data,
@@ -391,11 +371,6 @@
 
   base::Optional<PossibleUsernameData> possible_username_;
 
-  // By default Autofill Assistant is not running. Password Manager handles
-  // submissions and shows prompts.
-  AutofillAssistantMode autofill_assistant_mode_ =
-      AutofillAssistantMode::kUINotShown;
-
   DISALLOW_COPY_AND_ASSIGN(PasswordManager);
 };
 
diff --git a/components/password_manager/core/browser/password_manager_client.cc b/components/password_manager/core/browser/password_manager_client.cc
index d01fabe..a6b1bd0 100644
--- a/components/password_manager/core/browser/password_manager_client.cc
+++ b/components/password_manager/core/browser/password_manager_client.cc
@@ -149,9 +149,4 @@
 bool PasswordManagerClient::IsUnderAdvancedProtection() const {
   return false;
 }
-
-AutofillAssistantMode PasswordManagerClient::GetAutofillAssistantMode() const {
-  return GetPasswordManager()->GetAutofillAssistantMode();
-}
-
 }  // namespace password_manager
diff --git a/components/password_manager/core/browser/password_manager_client.h b/components/password_manager/core/browser/password_manager_client.h
index 0d44551..4f971f33 100644
--- a/components/password_manager/core/browser/password_manager_client.h
+++ b/components/password_manager/core/browser/password_manager_client.h
@@ -408,8 +408,8 @@
   // Returns a FieldInfoManager associated with the current profile.
   virtual FieldInfoManager* GetFieldInfoManager() const = 0;
 
-  // Returns the currently set autofill-assistant mode.
-  virtual AutofillAssistantMode GetAutofillAssistantMode() const;
+  // Returns if the Autofill Assistant UI is shown.
+  virtual bool IsAutofillAssistantUIVisible() const = 0;
 
  private:
   DISALLOW_COPY_AND_ASSIGN(PasswordManagerClient);
diff --git a/components/password_manager/core/browser/password_manager_unittest.cc b/components/password_manager/core/browser/password_manager_unittest.cc
index d086624..03e0c4d 100644
--- a/components/password_manager/core/browser/password_manager_unittest.cc
+++ b/components/password_manager/core/browser/password_manager_unittest.cc
@@ -142,6 +142,7 @@
         .WillByDefault(Return(false));
     ON_CALL(filter_, IsSyncAccountEmail(_)).WillByDefault(Return(false));
     ON_CALL(*this, IsNewTabPage()).WillByDefault(Return(false));
+    ON_CALL(*this, IsAutofillAssistantUIVisible()).WillByDefault(Return(false));
   }
 
   MOCK_METHOD(bool,
@@ -184,6 +185,7 @@
               (),
               (override));
   MOCK_METHOD(bool, IsNewTabPage, (), (const, override));
+  MOCK_METHOD(bool, IsAutofillAssistantUIVisible, (), (const, override));
   MOCK_METHOD(SyncState, GetPasswordSyncState, (), (const, override));
   MOCK_METHOD(FieldInfoManager*, GetFieldInfoManager, (), (const, override));
 
@@ -3585,8 +3587,8 @@
 }
 
 TEST_P(PasswordManagerTest, NoPromptAutofillAssistantManuallyCuratedScript) {
-  manager()->SetAutofillAssistantMode(AutofillAssistantMode::kUIShown);
-
+  EXPECT_CALL(client_, IsAutofillAssistantUIVisible)
+      .WillRepeatedly(Return(true));
   EXPECT_CALL(client_, IsSavingAndFillingEnabled(_))
       .WillRepeatedly(Return(true));
   EXPECT_CALL(*store_, GetLogins)
@@ -3623,7 +3625,6 @@
     EXPECT_CALL(client_, IsSavingAndFillingEnabled)
         .WillRepeatedly(Return(true));
     EXPECT_CALL(client_, PromptUserToSaveOrUpdatePasswordPtr).Times(0);
-    manager()->SetAutofillAssistantMode(AutofillAssistantMode::kUIShown);
 
     // Make several forms ready for saving.
     PasswordForm form1(MakeFormWithOnlyNewPasswordField());
@@ -3634,20 +3635,25 @@
     manager()->OnInformAboutUserInput(&driver_, form2.form_data);
 
     // Simulate submission in different ways depending on whether
-    // |owned_submitted_form_manager_| should be set and |form_managers_| should
+    // |owned_submitted_form_manager_| should be set and |form_managers_|should
     // be cleared OR the submitted form manager should be in |form_managers_|.
     if (set_owned_form_manager)
       manager()->DidNavigateMainFrame(true /* form_may_be_submitted */);
     else
       OnPasswordFormSubmitted(form2.form_data);
 
-    manager()->SetAutofillAssistantMode(AutofillAssistantMode::kUINotShown);
-
+    // Test that Autofill Assistant has finished a script before Password
+    // Manager detected a successful submission. As a script has finished,
+    // pending credentials have reset.
+    manager()->ResetPendingCredentials();
     manager()->OnPasswordFormsRendered(&driver_, {} /* observed */,
                                        true /* did stop loading */);
+
     // No form manager is ready for saving.
     EXPECT_FALSE(manager()->GetSubmittedManagerForTest());
+
     Mock::VerifyAndClearExpectations(&client_);
+    EXPECT_CALL(client_, IsAutofillAssistantUIVisible).WillOnce(Return(false));
 
     // A form reappears again and a user submits it manually. Now expect a
     // prompt.
diff --git a/components/password_manager/core/browser/stub_password_manager_client.cc b/components/password_manager/core/browser/stub_password_manager_client.cc
index fe63a39..b3d47c7 100644
--- a/components/password_manager/core/browser/stub_password_manager_client.cc
+++ b/components/password_manager/core/browser/stub_password_manager_client.cc
@@ -161,4 +161,8 @@
   return nullptr;
 }
 
+bool StubPasswordManagerClient::IsAutofillAssistantUIVisible() const {
+  return false;
+}
+
 }  // namespace password_manager
diff --git a/components/password_manager/core/browser/stub_password_manager_client.h b/components/password_manager/core/browser/stub_password_manager_client.h
index 3608397..abba5f5 100644
--- a/components/password_manager/core/browser/stub_password_manager_client.h
+++ b/components/password_manager/core/browser/stub_password_manager_client.h
@@ -62,6 +62,7 @@
   const autofill::LogManager* GetLogManager() const override;
   const MockPasswordFeatureManager* GetPasswordFeatureManager() const override;
   MockPasswordFeatureManager* GetPasswordFeatureManager();
+  bool IsAutofillAssistantUIVisible() const override;
 
 #if defined(ON_FOCUS_PING_ENABLED) || defined(PASSWORD_REUSE_DETECTION_ENABLED)
   safe_browsing::PasswordProtectionService* GetPasswordProtectionService()
diff --git a/components/policy/resources/policy_templates_de.xtb b/components/policy/resources/policy_templates_de.xtb
index 0c0c59e..6b3b474 100644
--- a/components/policy/resources/policy_templates_de.xtb
+++ b/components/policy/resources/policy_templates_de.xtb
@@ -1077,6 +1077,7 @@
 
       Hinweis: Dieser Liste können auch über die Richtlinien "<ph name="USE_IE_SITELIST_POLICY_NAME" />" und "<ph name="EXTERNAL_SITELIST_URL_POLICY_NAME" />" Elemente hinzugefügt werden.</translation>
 <translation id="264093234299818170">Alle Drucker außer den in der Sperrliste aufgeführten werden angezeigt.</translation>
+<translation id="264252574246191885">Nicht gelistet</translation>
 <translation id="2647069081229792812">Bearbeitung von Lesezeichen aktivieren oder deaktivieren</translation>
 <translation id="2649896281375932517">Nutzer entscheiden lassen</translation>
 <translation id="2650049181907741121">Auszuführende Aktion beim Zuklappen des Geräts</translation>
@@ -4682,6 +4683,7 @@
 <translation id="7750991880413385988">"Neuer Tab"-Seite öffnen</translation>
 <translation id="7754704193130578113">Vor dem Download von Dateien nach dem Speicherort fragen</translation>
 <translation id="7758378441185523981">Aktiviert die passive Authentifizierung für Profiltypen.</translation>
+<translation id="776110834126722255">Eingestellt</translation>
 <translation id="7763614521440615342">Inhaltsvorschläge auf der "Neuer Tab"-Seite anzeigen</translation>
 <translation id="7765753178910647492">Ermöglicht die Zusammenstellung einer Liste mit <ph name="PRODUCT_OS_NAME" />-Funktionen, die deaktiviert werden sollen.
 
@@ -5195,22 +5197,6 @@
 <translation id="8537051350735478658">Wenn die Richtlinie auf "True" gesetzt ist, werden die Suchvorschläge in der Adressleiste von <ph name="PRODUCT_NAME" /> aktiviert. Ist sie auf "False" gesetzt, werden die Suchvorschläge deaktiviert.
 
       Wenn Sie diese Richtlinie konfigurieren, kann sie von Nutzern nicht geändert werden. Wird sie nicht konfiguriert, sind die Suchvorschläge standardmäßig aktiviert, können aber jederzeit von Nutzern deaktiviert werden.</translation>
-<translation id="8542290591179355871">Diese Richtlinie wurde eingestellt. Bitte verwenden Sie stattdessen die Richtlinie "<ph name="PROXY_SETTINGS_POLICY_NAME" />".
-
-       Durch Aktivieren der Richtlinie können Sie angeben, welcher Proxyserver von Chrome verwendet werden soll, und verhindern, dass Nutzer die Proxyeinstellungen ändern. Alle Proxyoptionen, die über die Befehlszeile eingegeben werden, werden von Chrome- und ARC-Apps ignoriert. Die Richtlinie ist nur wirksam, wenn die Richtlinie "<ph name="PROXY_SETTINGS_POLICY_NAME" />" nicht konfiguriert wurde.
-
-       Bei Auswahl einer der folgenden Einstellungen werden andere Optionen ignoriert:
-         * <ph name="PROXY_MODE_ENUM_DIRECT" /> = nie einen Proxyserver, sondern immer eine direkte Verbindung nutzen
-         * <ph name="PROXY_MODE_ENUM_SYSTEM" /> = Proxyeinstellungen des Systems verwenden
-         * <ph name="PROXY_MODE_ENUM_AUTO_DETECT" /> = automatische Erkennung des Proxyservers
-
-       Bei Auswahl der Einstellung:
-         * <ph name="PROXY_MODE_ENUM_FIXED_SERVERS" /> = feste Proxyserver. Mit "<ph name="PROXY_SERVER_POLICY_NAME" />" und "<ph name="PROXY_BYPASS_LIST_POLICY_NAME" />" können Sie weitere Optionen festlegen. Nur der HTTP-Proxyserver mit der höchsten Priorität ist für ARC-Apps verfügbar.
-         * <ph name="PROXY_MODE_ENUM_PAC_SCRIPT" /> = PAC-Proxyskript. Mit "<ph name="PROXY_PAC_URL_POLICY_NAME" />" können Sie die URL zu einer PAC-Proxydatei festlegen.
-
-      Wird die Richtlinie nicht konfiguriert, können Nutzer die Proxyeinstellungen auswählen.
-
-      Hinweis: Ausführliche Beispiele finden Sie in den Chromium-Projekten ( https://www.chromium.org/developers/design-documents/network-settings#TOC-Command-line-options-for-proxy-sett ).</translation>
 <translation id="8544375438507658205">Standardanwendung für HTML-Darstellung in <ph name="PRODUCT_FRAME_NAME" /></translation>
 <translation id="8544465954173828789">Zulassen, dass SMS zwischen Smartphone mit Chromebook synchronisiert werden.</translation>
 <translation id="8548832052135586762">Damit wird festgelegt, ob nur in Farbe, nur in Schwarz-Weiß oder ohne Farbmodusbeschränkung gedruckt wird. Ist die Richtlinie nicht konfiguriert, wird keine Einschränkung angewendet.</translation>
diff --git a/components/policy/resources/policy_templates_es-419.xtb b/components/policy/resources/policy_templates_es-419.xtb
index 749a8ab..e3a449e 100644
--- a/components/policy/resources/policy_templates_es-419.xtb
+++ b/components/policy/resources/policy_templates_es-419.xtb
@@ -1135,7 +1135,7 @@
 <translation id="2694143893026486692">Se habilitó la lupa con vista acoplada</translation>
 <translation id="2696077732471707315">En la versión M77, se quitó esta política.
       Esta política se aplica a la pantalla de acceso. Consulta también la política <ph name="SITE_PER_PROCESS_POLICY_NAME" />, que se aplica a la sesión de usuario. Se recomienda establecer ambas políticas en el mismo valor. Si los valores no coinciden, es posible que se produzca un retraso cuando se ingresa una sesión de usuario mientras se aplica el valor que especifica la política del usuario.</translation>
-<translation id="2702023190395322609">Habilita las recomendaciones de contenido multimedia</translation>
+<translation id="2702023190395322609">Habilitar las recomendaciones de contenido multimedia</translation>
 <translation id="2706708761587205154">Permite la impresión solo con PIN</translation>
 <translation id="2707873794476722903">Se activó la Navegación segura en el modo estándar.</translation>
 <translation id="2710534340210290498">Si esta política se configura como falsa, los usuarios no podrán bloquear la pantalla (solo podrán salir de la sesión). Si esta política se configura como verdadera, o no se configura, los usuarios autenticados con una contraseña podrán bloquear la pantalla.</translation>
@@ -1839,7 +1839,7 @@
 <translation id="3709266154059827597">Configurar la lista negra de instalación de extensiones</translation>
 <translation id="3711895659073496551">Suspender</translation>
 <translation id="3715569262675717862">Autenticación basada en certificados de clientes</translation>
-<translation id="3727675072430693164">Si habilitas la política, los dispositivos inscritos informarán sobre las estadísticas de hardware de los componentes SoC.
+<translation id="3727675072430693164">Si habilitas la política, los dispositivos inscritos informarán sobre las estadísticas de hardware de los componentes de SoC.
 
       Si la inhabilitas o no la estableces, los dispositivos inscritos no informarán sobre estas estadísticas.</translation>
 <translation id="3736879847913515635">Habilitar la opción para agregar una persona en el Administrador de usuarios</translation>
@@ -4448,7 +4448,7 @@
 <translation id="7464991223784276288">Restringir las cookies solo para las URL coincidentes en la sesión actual</translation>
 <translation id="7468182772656807573">Si estableces la política, se determinará la frecuencia con la que se envían paquetes de red de control (expresado en milisegundos). Los intervalos varían de 30 segundos a 24 horas. Los valores fuera de este rango se restringirán conforme a estos valores.
 
-      Si no la estableces, se aplicará el intervalo predeterminado de 3 minutos.</translation>
+      Si no estableces la política, se aplicará el intervalo predeterminado de 3 minutos.</translation>
 <translation id="7469554574977894907">Habilitar sugerencias de búsqueda</translation>
 <translation id="747014869399137701">Si estableces la política en 1, los sitios web podrán mostrar notificaciones de escritorio. Si la estableces en 2, se rechazarán las notificaciones de escritorio.
 
@@ -4719,7 +4719,7 @@
           De lo contrario, las combinaciones de teclas para las funciones de accesibilidad estarán habilitadas de forma predeterminada en la pantalla de acceso.</translation>
 <translation id="7777535871204167559">Tratar los dispositivos de almacenamiento externo como de solo lectura</translation>
 <translation id="7788511847830146438">Por perfil</translation>
-<translation id="780629758750905699">Permite agregar cuentas de Family Link al dispositivo</translation>
+<translation id="780629758750905699">Permitir agregar cuentas de Family Link al dispositivo</translation>
 <translation id="7807139251387225825">Lista de tipos que deben excluirse de la sincronización</translation>
 <translation id="7818131573217430250">Establece el estado predeterminado del modo de contraste alto en la pantalla de acceso.</translation>
 <translation id="7823902813460802031">Si habilitas la política, <ph name="PRODUCT_OS_NAME" /> sacará el dispositivo del Modo de desarrollador.
@@ -4943,7 +4943,7 @@
           Si estableces esta política, los usuarios no podrán cambiarla ni anularla.
 
           Si no la estableces, la función de resaltar la posición del cursor estará inicialmente inhabilitada, pero el usuario podrá habilitarla en cualquier momento.</translation>
-<translation id="8164687848393015214">Si habilitas la política, se enviarán paquetes de red de control (<ph name="HEARTBEATS_TERM" />) al servidor de administración para controlar el estado en línea, lo que permite que el servidor detecte si el dispositivo está sin conexión.
+<translation id="8164687848393015214">Si habilitas la política, se enviarán paquetes de red de control (<ph name="HEARTBEATS_TERM" />) al servidor de administración para controlar el estado de conexión, lo que permite que el servidor detecte si el dispositivo está desconectado de Internet.
 
       Si la inhabilitas o no la estableces, no se enviarán paquetes.</translation>
 <translation id="816783746144552109">Configura la versión mínima permitida del Sistema operativo Chrome para el dispositivo.</translation>
@@ -5236,22 +5236,6 @@
 <translation id="8537051350735478658">Si estableces la política como verdadera, se activarán las sugerencias de búsqueda en la barra de direcciones de <ph name="PRODUCT_NAME" />. Si la estableces como falsa, se desactivarán estas sugerencias de búsqueda.
 
       Si estableces la política, los usuarios no podrán cambiarla. Si no la estableces, las sugerencias de búsqueda estarán activadas al principio, pero los usuarios podrán desactivarlas en cualquier momento.</translation>
-<translation id="8542290591179355871">Esta política dejó de estar disponible; usa la política <ph name="PROXY_SETTINGS_POLICY_NAME" /> en su lugar.
-
-       Si estableces la política como habilitada, podrás especificar el servidor proxy que usa Chrome y evitar que los usuarios cambien la configuración del proxy. Chrome y las apps de ARC ignorarán todas las opciones relacionadas con el proxy que se especificaron en la línea de comandos. Esta política solo tendrá efecto si no se especifica la política <ph name="PROXY_SETTINGS_POLICY_NAME" />.
-
-       Las demás opciones se ignorarán si eliges lo siguiente:
-         * <ph name="PROXY_MODE_ENUM_DIRECT" /> = Nunca usar un servidor proxy y siempre conectarse directamente
-         * <ph name="PROXY_MODE_ENUM_SYSTEM" /> = Usar la configuración del proxy del sistema
-         * <ph name="PROXY_MODE_ENUM_AUTO_DETECT" /> = Detectar automáticamente el servidor proxy
-
-       Si eliges lo siguiente:
-         * <ph name="PROXY_MODE_ENUM_FIXED_SERVERS" /> = Servidores proxy fijos Puedes especificar más opciones con las políticas <ph name="PROXY_SERVER_POLICY_NAME" /> y <ph name="PROXY_BYPASS_LIST_POLICY_NAME" />. Las apps de ARC solo podrán usar el servidor proxy HTTP con la prioridad más alta.
-         * <ph name="PROXY_MODE_ENUM_PAC_SCRIPT" /> =  Una secuencia de comandos de proxy en formato .pac. Usa la política <ph name="PROXY_PAC_URL_POLICY_NAME" /> para especificar la dirección URL a un archivo de proxy en formato .pac.
-
-      Si no estableces la política, los usuarios podrán elegir la configuración de proxy.
-
-      Nota: Para obtener ejemplos detallados, visita The Chromium Projects ( https://www.chromium.org/developers/design-documents/network-settings#TOC-Command-line-options-for-proxy-sett ).</translation>
 <translation id="8544375438507658205">Procesador HTML predeterminado para <ph name="PRODUCT_FRAME_NAME" /></translation>
 <translation id="8544465954173828789">Permite que los mensajes SMS se sincronicen desde el teléfono con la Chromebook</translation>
 <translation id="8548832052135586762">Establece la impresión como solo a color, solo monocromática o sin restricción del modo de color. Si no se configura la política, no se aplicará ninguna restricción.</translation>
@@ -5267,7 +5251,7 @@
 
       Si se establece esta política como falsa o no se configura, el usuario podrá usar el navegador sin acceder a <ph name="PRODUCT_NAME" />.</translation>
 <translation id="858309738002328421">Bloquear la carga de archivos grandes</translation>
-<translation id="8583509234908413302">Permite que los protocolos TLS/DTLS heredados cambien a una versión inferior en WebRTC</translation>
+<translation id="8583509234908413302">Permitir que los protocolos TLS/DTLS heredados cambien a una versión inferior en WebRTC</translation>
 <translation id="8584279193368801689">Restringe el modo de impresión con PIN. Si no se configura la política, no se aplicará ninguna restricción. Si el modo no está disponible, se ignorará esta política. Ten en cuenta que solo se habilitará la función de impresión con PIN para impresoras que usen uno de los siguientes protocolos: IPPS, HTTPS, USB o IPP por USB.</translation>
 <translation id="8585558195682146109">Analizar las descargas del usuario</translation>
 <translation id="8587229956764455752">Permitir la creación de nuevas cuentas de usuario</translation>
diff --git a/components/policy/resources/policy_templates_es.xtb b/components/policy/resources/policy_templates_es.xtb
index 097cb8f0..c6ed73e 100644
--- a/components/policy/resources/policy_templates_es.xtb
+++ b/components/policy/resources/policy_templates_es.xtb
@@ -294,7 +294,7 @@
 
           Si se asigna un valor a esta política, los usuarios no podrán cambiarlo ni anularlo.</translation>
 <translation id="1502843533062797703">Habilitar el bloqueo de inserción de software de terceros</translation>
-<translation id="1503863096120373385">Sirve para configurar los ajustes de datos de navegación de por vida de <ph name="PRODUCT_NAME" />.
+<translation id="1503863096120373385">Sirve para configurar los ajustes del periodo de vida de los datos de navegación de <ph name="PRODUCT_NAME" />.
       Esta política controla el periodo de vida de determinados datos de navegación. Esta política no tiene efecto si la sincronización está habilitada.
       Los tipos de datos disponibles son <ph name="DATA_TYPE_BROWSING_HISTORY" />, <ph name="DATA_TYPE_DOWNLOAD_HISTORY" />, <ph name="DATA_TYPE_COOKIES_AND_OTHER_SITE_DATA" />, <ph name="DATA_TYPE_CACHED_IMAGES_AND_FILES" />, <ph name="DATA_TYPE_PASSWORD" />, <ph name="DATA_TYPE_AUTOFILL" />, <ph name="DATA_TYPE_SITE_SETTINGS" /> y <ph name="DATA_TYPE_HOSTED_APP_DATA" />.
       Chrome retira regularmente tipos específicos de datos con una antigüedad superior a <ph name="TIME_TO_LIVE_IN_HOURS" />. Como se eliminan datos en intervalos concretos, es posible que algunos datos perduren más tiempo, pero nunca más del doble de lo esperado (<ph name="TIME_TO_LIVE_IN_HOURS" />).
@@ -2660,11 +2660,11 @@
       Si no se asigna ningún valor a esta política, no se añadirá ningún sitio web a la lista.
 
       Nota: También se pueden añadir elementos a la lista a través de la política <ph name="EXTERNAL_SITELIST_URL_POLICY_NAME" />.</translation>
-<translation id="5065753964276395784">Esta política está obsoleta. Usa la política <ph name="PROXY_SETTINGS_POLICY_NAME" /> en su lugar.
+<translation id="5065753964276395784">Esta política está obsoleta. Se debe usar la política <ph name="PROXY_SETTINGS_POLICY_NAME" /> en su lugar.
 
-       Si se le asigna un valor a la política, <ph name="PRODUCT_NAME" /> omite cualquier proxy que se incluya en la lista de hosts especificada. Esta política solo tiene validez si no se especifica la política <ph name="PROXY_SETTINGS_POLICY_NAME" /> y se selecciona <ph name="PROXY_MODE_ENUM_FIXED_SERVERS" /> con <ph name="PROXY_MODE_POLICY_NAME" />.
+       Si se le asigna un valor a la política, <ph name="PRODUCT_NAME" /> omite cualquier proxy que se incluya en la lista de hosts especificada. Esta política solo tiene validez si no se especifica la política <ph name="PROXY_SETTINGS_POLICY_NAME" /> y se ha seleccionado <ph name="PROXY_MODE_ENUM_FIXED_SERVERS" /> con <ph name="PROXY_MODE_POLICY_NAME" />.
 
-       Si has seleccionado otro modo para la configuración de las políticas de proxy, no le asignes ningún valor a esta política.
+       Si se ha seleccionado otro modo para la configuración de las políticas de proxy, no se le debe asignar ningún valor a esta política.
 
        Nota: Puedes consultar más ejemplos detallados en The Chromium Projects ( https://www.chromium.org/developers/design-documents/network-settings#TOC-Command-line-options-for-proxy-sett ).</translation>
 <translation id="5067143124345820993">Lista de admisión de usuarios con permiso para iniciar sesión</translation>
@@ -4086,7 +4086,7 @@
       Si se le asigna el valor <ph name="BR_UNDER_USER_CONTROL" />, se muestran mensajes a los usuarios para preguntarles si quieren utilizar el servicio de copia de seguridad y restauración. Si los usuarios activan el servicio de copia de seguridad y restauración, los datos de la aplicación Android se subirán a los servidores de copia de seguridad de Android y se restaurarán cuando se vuelvan a instalar las aplicaciones compatibles.
 
       Los usuarios podrán activar o desactivar el servicio de copia de seguridad y restauración después de la configuración inicial.</translation>
-<translation id="6986172482189158664">Ajustes de datos de navegación de por vida</translation>
+<translation id="6986172482189158664">Ajustes del periodo de vida de los datos de navegación</translation>
 <translation id="6994082778848658360">Especifica cómo se puede utilizar el hardware del elemento seguro integrado para proporcionar una autenticación de dos factores si es compatible con esta función. El botón de encendido del ordenador se utiliza para detectar la presencia física del usuario.
 
       Si se inhabilita esta opción, no se proporciona ninguna autenticación de dos factores.
@@ -4094,13 +4094,13 @@
       Si se selecciona la opción U2F, la autenticación de dos factores integrada sigue la especificación FIDO U2F.
 
       Si se selecciona la opción U2F_EXTENDED, la autenticación de dos factores integrada proporciona las funciones de U2F y algunas extensiones de confirmación individual.</translation>
-<translation id="6999948519306285655">Esta política está obsoleta. Usa la política <ph name="PROXY_SETTINGS_POLICY_NAME" /> en su lugar.
+<translation id="6999948519306285655">Esta política está obsoleta. Se debe usar la política <ph name="PROXY_SETTINGS_POLICY_NAME" /> en su lugar.
 
-       Si se le asigna un valor a esta política, se especificará la URL de un archivo .pac de proxy. Esta política solo tiene validez si no se especifica la política <ph name="PROXY_SETTINGS_POLICY_NAME" /> y se selecciona <ph name="PROXY_MODE_ENUM_PAC_SCRIPT" /> con <ph name="PROXY_MODE_POLICY_NAME" />.
+       Si se le asigna un valor a esta política, se especificará la URL de un archivo .pac de proxy. Esta política solo tiene validez si no se especifica la política <ph name="PROXY_SETTINGS_POLICY_NAME" /> y se ha seleccionado <ph name="PROXY_MODE_ENUM_PAC_SCRIPT" /> con <ph name="PROXY_MODE_POLICY_NAME" />.
 
-       Si has seleccionado otro modo para la configuración de las políticas de proxy, no le asignes ningún valor a esta política.
+       Si se ha seleccionado otro modo para la configuración de las políticas de proxy, no se le debe asignar ningún valor a esta política.
 
-       Nota: Puedes consultar ejemplos detallados en The Chromium Projects (https://www.chromium.org/developers/design-documents/network-settings#TOC-Command-line-options-for-proxy-sett).</translation>
+       Nota: Puedes consultar ejemplos detallados en The Chromium Projects ( https://www.chromium.org/developers/design-documents/network-settings#TOC-Command-line-options-for-proxy-sett ).</translation>
 <translation id="7002040773317582266">Habilita la comprobación en tiempo real de las URL de marcos principales.</translation>
 <translation id="7003746348783715221">Preferencias de <ph name="PRODUCT_NAME" /></translation>
 <translation id="7008308728445338159">Comprobaciones de interceptación de DNS habilitadas</translation>
@@ -4688,13 +4688,13 @@
 <translation id="7712109699186360774">Preguntar siempre que un sitio quiera acceder a mi cámara o a mi micrófono</translation>
 <translation id="7713608076604149344">Restricciones de descarga</translation>
 <translation id="7715711044277116530">Porcentaje que permite ajustar el retraso de inactividad de la pantalla en el modo de presentación</translation>
-<translation id="7716020145539921591">Esta política está obsoleta. Usa la política <ph name="PROXY_SETTINGS_POLICY_NAME" /> en su lugar.
+<translation id="7716020145539921591">Esta política está obsoleta. Se debe usar la política <ph name="PROXY_SETTINGS_POLICY_NAME" /> en su lugar.
 
-       Si se le asigna un valor a esta política, se especificará la URL del servidor proxy. Esta política solo tiene validez si no se especifica la política <ph name="PROXY_SETTINGS_POLICY_NAME" /> y se selecciona <ph name="PROXY_MODE_ENUM_FIXED_SERVERS" /> con <ph name="PROXY_MODE_POLICY_NAME" />.
+       Si se le asigna un valor a esta política, se especificará la URL del servidor proxy. Esta política solo tiene validez si no se especifica la política <ph name="PROXY_SETTINGS_POLICY_NAME" /> y se ha seleccionado <ph name="PROXY_MODE_ENUM_FIXED_SERVERS" /> con <ph name="PROXY_MODE_POLICY_NAME" />.
 
-       Si has seleccionado otro modo para la configuración de las políticas de proxy, no le asignes ningún valor a esta política.
+       Si se ha seleccionado otro modo para la configuración de las políticas de proxy, no se le debe asignar ningún valor a esta política.
 
-      Nota: Puedes consultar ejemplos detallados en The Chromium Projects (https://www.chromium.org/developers/design-documents/network-settings#TOC-Command-line-options-for-proxy-sett).</translation>
+      Nota: Puedes consultar ejemplos detallados en The Chromium Projects ( https://www.chromium.org/developers/design-documents/network-settings#TOC-Command-line-options-for-proxy-sett ).</translation>
 <translation id="7717938661004793600">Permite configurar funciones de accesibilidad de <ph name="PRODUCT_OS_NAME" />.</translation>
 <translation id="7721944091689270995">ID de usuario de <ph name="PLUGIN_VM_NAME" /></translation>
 <translation id="7724161903134898864">Si se asigna el valor 1 a esta política, los sitios web podrán mostrar ventanas emergentes. Si se le asigna el valor 2, se denegarán las ventanas emergentes.
@@ -5244,22 +5244,6 @@
 <translation id="8537051350735478658">Si se asigna el valor "Verdadero" a esta política, se activarán las sugerencias de búsqueda en la barra de direcciones de <ph name="PRODUCT_NAME" />. Si se le asigna el valor "Falso", se desactivarán estas sugerencias de búsqueda.
 
       Si le asignas un valor a esta política, los usuarios no podrán cambiarlo. Si no se le asigna ningún valor, las sugerencias de búsqueda estarán activadas inicialmente, pero los usuarios podrán desactivarlas en cualquier momento.</translation>
-<translation id="8542290591179355871">Esta política está obsoleta. Usa la política <ph name="PROXY_SETTINGS_POLICY_NAME" /> en su lugar.
-
-       Si se habilita esta política, se permite especificar el servidor proxy que debe usar Chrome y se evita que los usuarios cambien los ajustes de proxy. Chrome y las aplicaciones ARC ignorarán todas las opciones relacionadas con el proxy especificadas en la línea de comandos. Esta política solo tiene validez si no se especifica la política <ph name="PROXY_SETTINGS_POLICY_NAME" />.
-
-       Se ignoran otras opciones cuando se elige:
-         * <ph name="PROXY_MODE_ENUM_DIRECT" />: establecer siempre conexión directamente en lugar de utilizar un servidor proxy.
-         * <ph name="PROXY_MODE_ENUM_SYSTEM" />: usar la configuración de proxy del sistema.
-         * <ph name="PROXY_MODE_ENUM_AUTO_DETECT" />: detectar automáticamente el servidor proxy.
-
-       Si se decide usar:
-         * <ph name="PROXY_MODE_ENUM_FIXED_SERVERS" />: servidores proxy fijos. Se pueden especificar otras opciones con <ph name="PROXY_SERVER_POLICY_NAME" /> y <ph name="PROXY_BYPASS_LIST_POLICY_NAME" />. Solo el servidor proxy HTTP con la mayor prioridad está disponible para las aplicaciones ARC.
-         * <ph name="PROXY_MODE_ENUM_PAC_SCRIPT" />: una secuencia de comandos .pac de proxy. Usa <ph name="PROXY_PAC_URL_POLICY_NAME" /> en la URL de un archivo .pac de proxy.
-
-      Si no se asigna ningún valor a esta política, los usuarios pueden elegir los ajustes de proxy.
-
-      Nota: Puedes consultar ejemplos detallados en The Chromium Projects (https://www.chromium.org/developers/design-documents/network-settings#TOC-Command-line-options-for-proxy-sett).</translation>
 <translation id="8544375438507658205">Procesador de HTML predeterminado de <ph name="PRODUCT_FRAME_NAME" /></translation>
 <translation id="8544465954173828789">Permite que los SMS del teléfono se sincronicen con Chromebook.</translation>
 <translation id="8548832052135586762">Establece el modo de impresión: solo en color, solo monocromo o sin restricción. Si no se asigna ningún valor a esta política, no se aplica ninguna restricción.</translation>
diff --git a/components/policy/resources/policy_templates_fr.xtb b/components/policy/resources/policy_templates_fr.xtb
index 144f2c15..96e7c418 100644
--- a/components/policy/resources/policy_templates_fr.xtb
+++ b/components/policy/resources/policy_templates_fr.xtb
@@ -1107,6 +1107,7 @@
 
       Remarque : Vous pouvez également utiliser les règles <ph name="USE_IE_SITELIST_POLICY_NAME" /> et <ph name="EXTERNAL_SITELIST_URL_POLICY_NAME" /> pour ajouter des éléments à cette liste.</translation>
 <translation id="264093234299818170">Toutes les imprimantes sont affichées, sauf celles figurant dans la liste de blocage.</translation>
+<translation id="264252574246191885">Non répertorié</translation>
 <translation id="2647069081229792812">Activer ou désactiver la modification des favoris</translation>
 <translation id="2649896281375932517">Choix laissé aux utilisateurs</translation>
 <translation id="2650049181907741121">Action à effectuer lorsque l'utilisateur ferme le couvercle</translation>
@@ -2663,7 +2664,7 @@
 
        Si cette règle est configurée, <ph name="PRODUCT_NAME" /> contourne tout proxy de la liste d'hôtes indiquée ici. Elle ne s'applique que si la règle <ph name="PROXY_SETTINGS_POLICY_NAME" /> n'est pas spécifiée et si vous avez sélectionné l'option <ph name="PROXY_MODE_ENUM_FIXED_SERVERS" /> dans la règle <ph name="PROXY_MODE_POLICY_NAME" />.
 
-       Ne configurez pas cette règle si vous avez sélectionné un autre mode de spécification des règles de proxy.
+       Ne configurez pas cette règle si vous avez sélectionné un autre mode pour spécifier les règles de proxy.
 
        Remarque : Pour consulter des exemples détaillés, accédez au site The Chromium Projects ( https://www.chromium.org/developers/design-documents/network-settings#TOC-Command-line-options-for-proxy-sett ).</translation>
 <translation id="5067143124345820993">Liste des utilisateurs autorisés à se connecter</translation>
@@ -4082,7 +4083,7 @@
 
        Elle permet de définir l'URL d'un fichier .pac proxy. Elle ne s'applique que si la règle <ph name="PROXY_SETTINGS_POLICY_NAME" /> n'est pas spécifiée et si vous avez sélectionné l'option <ph name="PROXY_MODE_ENUM_PAC_SCRIPT" /> dans la règle <ph name="PROXY_MODE_POLICY_NAME" />.
 
-       Ne configurez pas cette règle si vous avez sélectionné un autre mode de spécification des règles de proxy.
+       Ne configurez pas cette règle si vous avez sélectionné un autre mode pour spécifier les règles de proxy.
 
        Remarque : Pour consulter des exemples détaillés, accédez au site The Chromium Projects ( https://www.chromium.org/developers/design-documents/network-settings#TOC-Command-line-options-for-proxy-sett ).</translation>
 <translation id="7002040773317582266">La vérification en temps réel des URL du frame principal est activée.</translation>
@@ -4677,7 +4678,7 @@
 
        Elle permet de définir l'URL du serveur proxy. Elle ne s'applique que si la règle <ph name="PROXY_SETTINGS_POLICY_NAME" /> n'est pas spécifiée et si vous avez sélectionné l'option <ph name="PROXY_MODE_ENUM_FIXED_SERVERS" /> dans la règle <ph name="PROXY_MODE_POLICY_NAME" />.
 
-       Ne configurez pas cette règle si vous avez sélectionné un autre mode de spécification des règles de proxy.
+       Ne configurez pas cette règle si vous avez sélectionné un autre mode pour spécifier les règles de proxy.
 
       Remarque : Pour consulter des exemples détaillés, accédez au site The Chromium Projects ( https://www.chromium.org/developers/design-documents/network-settings#TOC-Command-line-options-for-proxy-sett ).</translation>
 <translation id="7717938661004793600">Permet de configurer les fonctionnalités d'accessibilité de <ph name="PRODUCT_OS_NAME" />.</translation>
@@ -4706,6 +4707,7 @@
 <translation id="7750991880413385988">Ouvrir la page Nouvel onglet</translation>
 <translation id="7754704193130578113">Toujours demander où enregistrer les fichiers</translation>
 <translation id="7758378441185523981">Activer l'authentification ambiante en fonction du type de profil.</translation>
+<translation id="776110834126722255">Obsolète</translation>
 <translation id="7763614521440615342">Afficher des recommandations de contenus sur la page "Nouvel onglet"</translation>
 <translation id="7765753178910647492">Permet de dresser la liste des fonctionnalités <ph name="PRODUCT_OS_NAME" /> à désactiver.
 
@@ -5226,22 +5228,6 @@
 <translation id="8537051350735478658">Si cette règle est définie sur "True", la fonctionnalité Suggestions de recherche est activée dans la barre d'adresse du navigateur <ph name="PRODUCT_NAME" />. Si cette règle est définie sur "False", cette fonctionnalité est désactivée.
 
       Si vous configurez cette règle, les utilisateurs ne peuvent pas la modifier. Si cette règle n'est pas configurée, cette fonctionnalité est activée par défaut, mais les utilisateurs peuvent la désactiver à tout moment.</translation>
-<translation id="8542290591179355871">Cette règle étant obsolète, veuillez utiliser la règle <ph name="PROXY_SETTINGS_POLICY_NAME" /> à la place.
-
-       Si elle est activée, vous pouvez définir le serveur proxy que Chrome utilise. En revanche, les utilisateurs ne peuvent pas modifier les paramètres de proxy. Chrome et les applications ARC ignorent toutes les options liées au proxy spécifiées à partir de la ligne de commande. Cette règle ne s'applique que si la règle <ph name="PROXY_SETTINGS_POLICY_NAME" /> n'est pas spécifiée.
-
-       Les autres options sont ignorées si vous sélectionnez celles ci-dessous :
-         * <ph name="PROXY_MODE_ENUM_DIRECT" /> : la connexion s'effectue toujours directement sans aucun serveur proxy.
-         * <ph name="PROXY_MODE_ENUM_SYSTEM" /> : les paramètres de proxy utilisés sont ceux du système.
-         * <ph name="PROXY_MODE_ENUM_AUTO_DETECT" /> : le serveur proxy est détecté automatiquement.
-
-       
-         * <ph name="PROXY_MODE_ENUM_FIXED_SERVERS" /> : des serveurs proxy spécifiés sont utilisés. Vous pouvez définir d'autres options avec les règles <ph name="PROXY_SERVER_POLICY_NAME" /> et <ph name="PROXY_BYPASS_LIST_POLICY_NAME" />. Les applications ARC n'utilisent que le serveur proxy HTTP ayant la priorité la plus élevée.
-         * <ph name="PROXY_MODE_ENUM_PAC_SCRIPT" /> : un script de proxy .pac est utilisé. Utilisez la règle <ph name="PROXY_PAC_URL_POLICY_NAME" /> pour spécifier l'URL d'un fichier .pac de proxy.
-
-      Si cette règle n'est pas configurée, les utilisateurs peuvent sélectionner les paramètres de proxy.
-
-      Remarque : Pour consulter des exemples détaillés, accédez au site The Chromium Projects ( https://www.chromium.org/developers/design-documents/network-settings#TOC-Command-line-options-for-proxy-sett ).</translation>
 <translation id="8544375438507658205">Moteur de rendu HTML par défaut pour <ph name="PRODUCT_FRAME_NAME" /></translation>
 <translation id="8544465954173828789">Autoriser la synchronisation des SMS entre le téléphone et le Chromebook</translation>
 <translation id="8548832052135586762">Définit l'impression couleur seulement, monochrome seulement ou sans restriction de couleur. Si aucune règle n'est définie, on considère qu'il n'y a aucune restriction.</translation>
diff --git a/components/policy/resources/policy_templates_id.xtb b/components/policy/resources/policy_templates_id.xtb
index 5d0489c..8b080f7 100644
--- a/components/policy/resources/policy_templates_id.xtb
+++ b/components/policy/resources/policy_templates_id.xtb
@@ -296,7 +296,7 @@
 <translation id="1503863096120373385">Mengonfigurasi setelan masa berlaku data penjelajahan untuk <ph name="PRODUCT_NAME" />.
       Kebijakan ini mengontrol waktu aktif data penjelajahan yang dipilih. Kebijakan ini tidak berpengaruh jika Sinkronisasi diaktifkan.
       Jenis data yang tersedia adalah <ph name="DATA_TYPE_BROWSING_HISTORY" />, <ph name="DATA_TYPE_DOWNLOAD_HISTORY" />, <ph name="DATA_TYPE_COOKIES_AND_OTHER_SITE_DATA" />, <ph name="DATA_TYPE_CACHED_IMAGES_AND_FILES" />, <ph name="DATA_TYPE_PASSWORD" />, <ph name="DATA_TYPE_AUTOFILL" />, <ph name="DATA_TYPE_SITE_SETTINGS" />, dan <ph name="DATA_TYPE_HOSTED_APP_DATA" />.
-      Chrome akan menghapus data yang termasuk dalam jenis yang lebih lama dari <ph name="TIME_TO_LIVE_IN_HOURS" /> secara berkala. Karena penghapusan ini hanya terjadi dalam interval tertentu, beberapa data mungkin aktif sedikit lebih lama tetapi tidak pernah melebihi dua kali lipat dari estimasi <ph name="TIME_TO_LIVE_IN_HOURS" />-nya.
+      Untuk data dengan jenis yang dipilih, Chrome akan secara berkala menghapus yang usianya lebih dari <ph name="TIME_TO_LIVE_IN_HOURS" />. Karena penghapusan ini hanya terjadi dalam interval tertentu, beberapa data mungkin aktif sedikit lebih lama tetapi tidak pernah melebihi dua kali lipat dari estimasi <ph name="TIME_TO_LIVE_IN_HOURS" />-nya.
       </translation>
 <translation id="1507382822467487898">
           Mengonfigurasi alamat MAC (kontrol akses media) mana yang akan digunakan saat dok terhubung ke perangkat.
@@ -1101,6 +1101,7 @@
 
       Catatan: Elemen juga dapat ditambahkan ke daftar ini melalui kebijakan <ph name="USE_IE_SITELIST_POLICY_NAME" /> dan <ph name="EXTERNAL_SITELIST_URL_POLICY_NAME" />.</translation>
 <translation id="264093234299818170">Semua printer akan ditampilkan, kecuali printer yang tercantum dalam daftar yang tidak diizinkan.</translation>
+<translation id="264252574246191885">Tidak terdaftar</translation>
 <translation id="2647069081229792812">Aktifkan atau nonaktifkan pengeditan bookmark</translation>
 <translation id="2649896281375932517">Biarkan pengguna memutuskan</translation>
 <translation id="2650049181907741121">Tindakan yang akan diambil saat pengguna menutup penutupnya</translation>
@@ -2660,11 +2661,11 @@
       Catatan: Elemen juga dapat ditambahkan ke daftar ini melalui kebijakan <ph name="EXTERNAL_SITELIST_URL_POLICY_NAME" />.</translation>
 <translation id="5065753964276395784">Kebijakan ini tidak digunakan lagi. Sebagai gantinya, gunakan <ph name="PROXY_SETTINGS_POLICY_NAME" />.
 
-       Jika kebijakan disetel, <ph name="PRODUCT_NAME" /> akan mengabaikan proxy apa pun untuk daftar host yang diberikan di sini. Kebijakan ini hanya berpengaruh jika kebijakan <ph name="PROXY_SETTINGS_POLICY_NAME" /> tidak ditentukan dan Anda memilih <ph name="PROXY_MODE_ENUM_FIXED_SERVERS" /> dengan <ph name="PROXY_MODE_POLICY_NAME" />.
+       Jika kebijakan disetel, <ph name="PRODUCT_NAME" /> akan mengabaikan proxy apa pun untuk daftar host yang diberikan di sini. Kebijakan ini hanya berlaku jika kebijakan <ph name="PROXY_SETTINGS_POLICY_NAME" /> tidak ditentukan dan Anda memilih <ph name="PROXY_MODE_ENUM_FIXED_SERVERS" /> dengan <ph name="PROXY_MODE_POLICY_NAME" />.
 
        Biarkan kebijakan ini tidak disetel, jika Anda memilih mode lain untuk menyetel kebijakan proxy.
 
-       Catatan: Untuk contoh yang lebih mendetail, buka Project Chromium (https://www.chromium.org/developers/design-documents/network-settings#TOC-Command-line-options-for-proxy-sett).</translation>
+       Catatan: Untuk contoh yang lebih mendetail, buka Project Chromium ( https://www.chromium.org/developers/design-documents/network-settings#TOC-Command-line-options-for-proxy-sett ).</translation>
 <translation id="5067143124345820993">Daftar putih pengguna masuk</translation>
 <translation id="5073609397321802133">Jika kebijakan ditetapkan ke false, halaman Tab Baru tidak akan mengizinkan pengguna menyesuaikan latar belakang. Latar belakang kustom yang ada akan dihapus secara permanen meskipun nanti kebijakan ditetapkan ke true.
 
@@ -4090,11 +4091,11 @@
       Jika 'U2F_EXTENDED' dipilih, faktor kedua yang diintegrasikan akan memberikan fungsi U2F, ditambah beberapa ekstensi untuk masing-masing pengesahan.</translation>
 <translation id="6999948519306285655">Kebijakan ini tidak digunakan lagi. Sebagai gantinya, gunakan <ph name="PROXY_SETTINGS_POLICY_NAME" />.
 
-       Menyetel kebijakan memungkinkan Anda menentukan URL untuk file .pac proxy. Kebijakan ini hanya berpengaruh jika kebijakan <ph name="PROXY_SETTINGS_POLICY_NAME" /> tidak ditentukan dan Anda memilih <ph name="PROXY_MODE_ENUM_PAC_SCRIPT" /> dengan <ph name="PROXY_MODE_POLICY_NAME" />.
+       Menyetel kebijakan memungkinkan Anda menentukan URL untuk file .pac proxy. Kebijakan ini hanya berlaku jika kebijakan <ph name="PROXY_SETTINGS_POLICY_NAME" /> tidak ditentukan dan Anda memilih <ph name="PROXY_MODE_ENUM_PAC_SCRIPT" /> dengan <ph name="PROXY_MODE_POLICY_NAME" />.
 
        Biarkan kebijakan ini tidak disetel, jika Anda memilih mode lain untuk menyetel kebijakan proxy.
 
-       Catatan: Untuk contoh mendetail, buka Project Chromium (https://www.chromium.org/developers/design-documents/network-settings#TOC-Command-line-options-for-proxy-sett).</translation>
+       Catatan: Untuk contoh mendetail, buka Project Chromium ( https://www.chromium.org/developers/design-documents/network-settings#TOC-Command-line-options-for-proxy-sett ).</translation>
 <translation id="7002040773317582266">Pemeriksaan URL frame utama secara real-time diaktifkan.</translation>
 <translation id="7003746348783715221">Preferensi <ph name="PRODUCT_NAME" /></translation>
 <translation id="7008308728445338159">Pemeriksaan intersepsi DNS diaktifkan</translation>
@@ -4684,7 +4685,7 @@
 
        Biarkan kebijakan ini tidak disetel, jika Anda memilih mode lain untuk menyetel kebijakan proxy.
 
-      Catatan: Untuk contoh mendetail, buka Project Chromium (https://www.chromium.org/developers/design-documents/network-settings#TOC-Command-line-options-for-proxy-sett).</translation>
+      Catatan: Untuk contoh mendetail, buka Project Chromium ( https://www.chromium.org/developers/design-documents/network-settings#TOC-Command-line-options-for-proxy-sett ).</translation>
 <translation id="7717938661004793600">Mengonfigurasikan fitur aksesibilitas <ph name="PRODUCT_OS_NAME" />.</translation>
 <translation id="7721944091689270995">ID pengguna <ph name="PLUGIN_VM_NAME" /></translation>
 <translation id="7724161903134898864">Jika kebijakan disetel ke 1, situs akan menampilkan pop-up. Jika kebijakan disetel ke 2, pop-up tidak dapat ditampilkan.
@@ -4711,6 +4712,7 @@
 <translation id="7750991880413385988">Buka Halaman Tab Baru</translation>
 <translation id="7754704193130578113">Tanyakan lokasi penyimpanan setiap file sebelum mendownload</translation>
 <translation id="7758378441185523981">Mengaktifkan Autentikasi Pasif untuk jenis profil.</translation>
+<translation id="776110834126722255">Tidak digunakan lagi</translation>
 <translation id="7763614521440615342">Tampilkan saran konten di halaman Tab Baru</translation>
 <translation id="7765753178910647492">Memungkinkan Anda menetapkan daftar fitur <ph name="PRODUCT_OS_NAME" /> untuk dinonaktifkan.
 
@@ -5220,22 +5222,6 @@
 <translation id="8537051350735478658">Jika kebijakan ditetapkan ke Benar (True), saran penelusuran akan diaktifkan di kolom URL <ph name="PRODUCT_NAME" />. Jika kebijakan ditetapkan ke Salah (False), saran penelusuran akan dinonaktifkan.
 
       Jika Anda menetapkan kebijakan, pengguna tidak dapat mengubahnya. Jika tidak ditetapkan, saran penelusuran mula-mula akan diaktifkan, tetapi pengguna dapat menonaktifkannya kapan saja.</translation>
-<translation id="8542290591179355871">Kebijakan ini tidak digunakan lagi. Sebagai gantinya, gunakan <ph name="PROXY_SETTINGS_POLICY_NAME" />.
-
-       Menyetel kebijakan ke Aktif memungkinkan Anda menentukan server proxy yang digunakan oleh Chrome dan mencegah pengguna mengubah setelan proxy. Chrome dan aplikasi ARC akan mengabaikan semua opsi terkait proxy yang ditentukan dari command line. Kebijakan ini hanya berpengaruh jika kebijakan <ph name="PROXY_SETTINGS_POLICY_NAME" /> tidak ditentukan.
-
-       Opsi lain akan diabaikan jika Anda memilih:
-         * <ph name="PROXY_MODE_ENUM_DIRECT" /> = Jangan pernah menggunakan server proxy dan selalu hubungkan secara langsung 
-         * <ph name="PROXY_MODE_ENUM_SYSTEM" /> = Gunakan setelan proxy sistem
-         * <ph name="PROXY_MODE_ENUM_AUTO_DETECT" /> = Deteksi otomatis server proxy
-
-       Jika Anda memilih untuk menggunakan:
-         * <ph name="PROXY_MODE_ENUM_FIXED_SERVERS" /> = Server Proxy tetap. Anda dapat menentukan opsi lebih lanjut dengan <ph name="PROXY_SERVER_POLICY_NAME" /> dan <ph name="PROXY_BYPASS_LIST_POLICY_NAME" />. Hanya server proxy HTTP dengan prioritas tertinggi yang tersedia untuk aplikasi ARC.
-         * <ph name="PROXY_MODE_ENUM_PAC_SCRIPT" /> =  Skrip proxy .pac. Gunakan <ph name="PROXY_PAC_URL_POLICY_NAME" /> pada URL untuk file .pac proxy.
-
-      Jika kebijakan tidak disetel, pengguna dapat memilih setelan proxy.
-
-      Catatan: Untuk contoh mendetail, buka Project Chromium (https://www.chromium.org/developers/design-documents/network-settings#TOC-Command-line-options-for-proxy-sett).</translation>
 <translation id="8544375438507658205">Pengurai HTML default untuk <ph name="PRODUCT_FRAME_NAME" /></translation>
 <translation id="8544465954173828789">Izinkan SMS disinkronkan dari ponsel ke Chromebook.</translation>
 <translation id="8548832052135586762">Menyetel pencetakan ke hanya warna, hanya monokrom, atau tanpa batasan mode warna. Kebijakan yang tidak disetel diperlakukan sebagai tidak ada batasan.</translation>
diff --git a/components/policy/resources/policy_templates_it.xtb b/components/policy/resources/policy_templates_it.xtb
index 9dcee0c..0b20e65 100644
--- a/components/policy/resources/policy_templates_it.xtb
+++ b/components/policy/resources/policy_templates_it.xtb
@@ -286,7 +286,7 @@
 <translation id="1503863096120373385">Consente di configurare le impostazioni del periodo di validità dei dati di navigazione per <ph name="PRODUCT_NAME" />.
       Questo criterio consente di controllare il periodo di validità dei dati di navigazione selezionati. Questo criterio non viene applicato se la sincronizzazione è attiva.
       I tipi di dati disponibili sono i seguenti: <ph name="DATA_TYPE_BROWSING_HISTORY" />, <ph name="DATA_TYPE_DOWNLOAD_HISTORY" />, <ph name="DATA_TYPE_COOKIES_AND_OTHER_SITE_DATA" />, <ph name="DATA_TYPE_CACHED_IMAGES_AND_FILES" />, <ph name="DATA_TYPE_PASSWORD" />, <ph name="DATA_TYPE_AUTOFILL" />, <ph name="DATA_TYPE_SITE_SETTINGS" /> e <ph name="DATA_TYPE_HOSTED_APP_DATA" />.
-      Chrome rimuove regolarmente i dati dei tipi selezionati che superano il tempo previsto (<ph name="TIME_TO_LIVE_IN_HOURS" />). Poiché l'eliminazione avviene solo in determinati intervalli di tempo, alcuni dati potrebbero durare più a lungo, ma mai oltre il doppio del tempo previsto (<ph name="TIME_TO_LIVE_IN_HOURS" />).
+      Chrome rimuove regolarmente i dati dei tipi selezionati che sono antecedenti al periodo indicato (<ph name="TIME_TO_LIVE_IN_HOURS" />). Poiché l'eliminazione avviene solo in determinati intervalli di tempo, alcuni dati potrebbero durare più a lungo, ma mai oltre il doppio del periodo previsto (<ph name="TIME_TO_LIVE_IN_HOURS" />).
       </translation>
 <translation id="1507382822467487898">
           Consente di configurare quale indirizzo MAC (media access control) verrà utilizzato quando il dispositivo è inserito in un dock.
@@ -2641,11 +2641,11 @@
       Nota: puoi aggiungere elementi all'elenco anche tramite il criterio <ph name="EXTERNAL_SITELIST_URL_POLICY_NAME" />.</translation>
 <translation id="5065753964276395784">Questo criterio è deprecato. Usa il criterio <ph name="PROXY_SETTINGS_POLICY_NAME" />.
 
-       Se il criterio viene configurato, <ph name="PRODUCT_NAME" /> aggira qualsiasi proxy per l'elenco di host fornito. Questo criterio viene applicato solo se il criterio <ph name="PROXY_SETTINGS_POLICY_NAME" /> non è specificato e selezioni <ph name="PROXY_MODE_ENUM_FIXED_SERVERS" /> con <ph name="PROXY_MODE_POLICY_NAME" />.
+       Se il criterio viene configurato, <ph name="PRODUCT_NAME" /> aggira qualsiasi proxy per l'elenco di host fornito. Questo criterio viene applicato solo se il criterio <ph name="PROXY_SETTINGS_POLICY_NAME" /> non è specificato e hai selezionato <ph name="PROXY_MODE_ENUM_FIXED_SERVERS" /> con <ph name="PROXY_MODE_POLICY_NAME" />.
 
-       Non configurare questo criterio se hai selezionato una qualsiasi altra modalità per i criterio di impostazione del proxy.
+       Non configurare questo criterio se hai selezionato una qualsiasi altra modalità per i criteri di impostazione del proxy.
 
-       Nota: per esempi più approfonditi, consulta la pagina I progetti di Chromium (https://www.chromium.org/developers/design-documents/network-settings#TOC-Command-line-options-for-proxy-sett).</translation>
+       Nota: per esempi più approfonditi, consulta la pagina The Chromium Projects (https://www.chromium.org/developers/design-documents/network-settings#TOC-Command-line-options-for-proxy-sett).</translation>
 <translation id="5067143124345820993">Whitelist di utenti con accesso</translation>
 <translation id="5073609397321802133">Se il criterio viene impostato su false, gli utenti non possono personalizzare lo sfondo della pagina Nuova scheda. L'eventuale sfondo personalizzato esistente viene rimosso definitivamente anche se il criterio viene impostato su true in un secondo momento.
 
@@ -4073,11 +4073,11 @@
       Se selezioni l'opzione "U2F_EXTENDED", l'autenticazione a due fattori integrata fornirà le funzioni U2F più alcune estensioni per la singola attestazione.</translation>
 <translation id="6999948519306285655">Questo criterio è deprecato. Usa il criterio <ph name="PROXY_SETTINGS_POLICY_NAME" />.
 
-       La configurazione del criterio consente di specificare un URL a un file proxy .pac. Questo criterio viene applicato solo se il criterio <ph name="PROXY_SETTINGS_POLICY_NAME" /> non è specificato e selezioni <ph name="PROXY_MODE_ENUM_PAC_SCRIPT" /> con <ph name="PROXY_MODE_POLICY_NAME" />.
+       La configurazione del criterio consente di specificare un URL a un file proxy .pac. Questo criterio viene applicato solo se il criterio <ph name="PROXY_SETTINGS_POLICY_NAME" /> non è specificato e hai selezionato <ph name="PROXY_MODE_ENUM_PAC_SCRIPT" /> con <ph name="PROXY_MODE_POLICY_NAME" />.
 
-       Non configurare questo criterio se hai selezionato una qualsiasi altra modalità per i criterio di impostazione del proxy.
+       Non configurare questo criterio se hai selezionato una qualsiasi altra modalità per i criteri di impostazione del proxy.
 
-       Nota: per esempi approfonditi, consulta la pagina I progetti di Chromium (https://www.chromium.org/developers/design-documents/network-settings#TOC-Command-line-options-for-proxy-sett).</translation>
+       Nota: per esempi approfonditi, consulta la pagina The Chromium Projects (https://www.chromium.org/developers/design-documents/network-settings#TOC-Command-line-options-for-proxy-sett).</translation>
 <translation id="7002040773317582266">Il controllo in tempo reale degli URL del frame principale è attivo.</translation>
 <translation id="7003746348783715221">Preferenze di <ph name="PRODUCT_NAME" /></translation>
 <translation id="7008308728445338159">Controlli intercettazione DNS attivi</translation>
@@ -4665,11 +4665,11 @@
 <translation id="7715711044277116530">Percentuale di regolazione del ritardo di oscuramento dello schermo in modalità di presentazione</translation>
 <translation id="7716020145539921591">Questo criterio è deprecato. Usa il criterio <ph name="PROXY_SETTINGS_POLICY_NAME" />.
 
-       La configurazione del criterio consente di specificare l'URL del server proxy. Questo criterio viene applicato solo se il criterio <ph name="PROXY_SETTINGS_POLICY_NAME" /> non è specificato e selezioni <ph name="PROXY_MODE_ENUM_FIXED_SERVERS" /> con <ph name="PROXY_MODE_POLICY_NAME" />.
+       La configurazione del criterio consente di specificare l'URL del server proxy. Questo criterio viene applicato solo se il criterio <ph name="PROXY_SETTINGS_POLICY_NAME" /> non è specificato e hai selezionato <ph name="PROXY_MODE_ENUM_FIXED_SERVERS" /> con <ph name="PROXY_MODE_POLICY_NAME" />.
 
-       Non configurare questo criterio se hai selezionato una qualsiasi altra modalità per i criterio di impostazione del proxy.
+       Non configurare questo criterio se hai selezionato una qualsiasi altra modalità per i criteri di impostazione del proxy.
 
-      Nota: per esempi approfonditi, consulta la pagina I progetti di Chromium (https://www.chromium.org/developers/design-documents/network-settings#TOC-Command-line-options-for-proxy-sett).</translation>
+      Nota: per esempi approfonditi, consulta la pagina The Chromium Projects (https://www.chromium.org/developers/design-documents/network-settings#TOC-Command-line-options-for-proxy-sett).</translation>
 <translation id="7717938661004793600">Configura le funzioni di accessibilità di <ph name="PRODUCT_OS_NAME" />.</translation>
 <translation id="7721944091689270995">ID utente <ph name="PLUGIN_VM_NAME" /></translation>
 <translation id="7724161903134898864">Se il criterio è impostato su 1, i siti web possono mostrare i popup. Se il criterio è impostato su 2, i popup vengono negati.
@@ -5213,22 +5213,6 @@
 <translation id="8537051350735478658">Se il criterio è impostato su True, la funzionalità Suggerimenti per le ricerche viene attivata nella barra degli indirizzi di <ph name="PRODUCT_NAME" />. Se il criterio è impostato su False, tale funzionalità viene disattivata.
 
       Se il criterio è configurato, gli utenti non possono apportare modifiche. Se non è configurato, la funzionalità Suggerimenti per le ricerche è attiva all'inizio, ma gli utenti possono disattivarla in qualsiasi momento.</translation>
-<translation id="8542290591179355871">Questo criterio è deprecato. Usa il criterio <ph name="PROXY_SETTINGS_POLICY_NAME" />.
-
-       Se il criterio viene impostato su Attivato, puoi specificare il server proxy utilizzato da Chrome e impedire agli utenti di modificare le impostazioni del proxy. Chrome e le app ARC ignorano le opzioni relative al proxy specificate dalla riga di comando. Il criterio viene applicato solo se il criterio <ph name="PROXY_SETTINGS_POLICY_NAME" /> non è specificato.
-
-       Vengono ignorate altre opzioni se scegli il valore:
-         * <ph name="PROXY_MODE_ENUM_DIRECT" /> = Non utilizzare mai un server proxy e connettiti sempre direttamente
-         * <ph name="PROXY_MODE_ENUM_SYSTEM" /> = Utilizza le impostazioni del proxy di sistema
-         * <ph name="PROXY_MODE_ENUM_AUTO_DETECT" /> = Rileva automaticamente il server proxy
-
-       Se scegli di utilizzare:
-         * <ph name="PROXY_MODE_ENUM_FIXED_SERVERS" /> = Server proxy fissi. Puoi specificare ulteriori opzioni con i criteri <ph name="PROXY_SERVER_POLICY_NAME" /> e <ph name="PROXY_BYPASS_LIST_POLICY_NAME" />. Per le app ARC è disponibile solo il server proxy HTTP con la priorità più alta.
-         * <ph name="PROXY_MODE_ENUM_PAC_SCRIPT" /> = Uno script proxy .pac. Utilizza il criterio <ph name="PROXY_PAC_URL_POLICY_NAME" /> per l'URL a un file proxy .pac.
-
-      Se il criterio non viene configurato, gli utenti possono scegliere le impostazioni del proxy.
-
-      Nota: per esempi approfonditi, consulta la pagina I progetti di Chromium (https://www.chromium.org/developers/design-documents/network-settings#TOC-Command-line-options-for-proxy-sett).</translation>
 <translation id="8544375438507658205">Renderer HTML predefinito per <ph name="PRODUCT_FRAME_NAME" /></translation>
 <translation id="8544465954173828789">Consente la sincronizzazione di messaggi SMS dal telefono al Chromebook</translation>
 <translation id="8548832052135586762">Consente di impostare solo la stampa a colori, solo la stampa monocromatica oppure nessuna limitazione per la modalità a colori. Se la norma non viene impostata non vengono applicate limitazioni.</translation>
diff --git a/components/policy/resources/policy_templates_ja.xtb b/components/policy/resources/policy_templates_ja.xtb
index 6e9026b..b1f3d30 100644
--- a/components/policy/resources/policy_templates_ja.xtb
+++ b/components/policy/resources/policy_templates_ja.xtb
@@ -5149,22 +5149,6 @@
       有効な <ph name="URL_LABEL" /> パターンについて詳しくは、https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns をご覧ください。</translation>
 <translation id="8525526490824335042">Linux コンテナ</translation>
 <translation id="8537051350735478658">このポリシーを True に設定した場合、<ph name="PRODUCT_NAME" /> のアドレスバーで検索候補が有効になります。このポリシーを False に設定した場合、検索候補が無効になります。このポリシーを設定した場合、ユーザーは設定を変更できません。ポリシーを設定しない場合、検索候補は最初は有効ですが、ユーザーはいつでも無効にできます。</translation>
-<translation id="8542290591179355871">このポリシーはサポートが終了しています。代わりに <ph name="PROXY_SETTINGS_POLICY_NAME" /> を使用してください。
-
-       このポリシーを有効に設定した場合、Chrome で使用するプロキシ サーバーを指定できるようになり、ユーザーはプロキシ設定を変更できなくなります。Chrome と ARC アプリでは、コマンドラインで指定されたプロキシ関連の設定がすべて無視されます。このポリシーは、<ph name="PROXY_SETTINGS_POLICY_NAME" /> ポリシーが指定されていない場合のみ適用されます。
-
-       以下のいずれかを指定した場合、他の設定は無視されます。
-         * <ph name="PROXY_MODE_ENUM_DIRECT" /> = プロキシ サーバーを使用せず、常に直接接続します
-         * <ph name="PROXY_MODE_ENUM_SYSTEM" /> = システムのプロキシ設定を使用します
-         * <ph name="PROXY_MODE_ENUM_AUTO_DETECT" /> = プロキシ サーバーを自動検出します
-
-       プロキシ サーバーを使用する場合は、次のように指定します。
-         * <ph name="PROXY_MODE_ENUM_FIXED_SERVERS" /> = 固定プロキシ サーバー。<ph name="PROXY_SERVER_POLICY_NAME" /> と <ph name="PROXY_BYPASS_LIST_POLICY_NAME" /> を使用して、より詳細な設定が可能です。ARC アプリで使用できるのは、最も優先度が高い HTTP プロキシ サーバーのみです。
-         * <ph name="PROXY_MODE_ENUM_PAC_SCRIPT" /> = .pac プロキシ スクリプト。<ph name="PROXY_PAC_URL_POLICY_NAME" /> にプロキシ .pac ファイルへの URL を指定します。
-
-      このポリシーを未設定のままにした場合、ユーザーはプロキシ設定を選択できます。
-
-      注: 詳しい例については、Chromium プロジェクトの説明(https://www.chromium.org/developers/design-documents/network-settings#TOC-Command-line-options-for-proxy-sett)をご覧ください。</translation>
 <translation id="8544375438507658205"><ph name="PRODUCT_FRAME_NAME" /> のデフォルトの HTML レンダラ</translation>
 <translation id="8544465954173828789">スマートフォンから Chromebook への SMS メッセージの同期を許可する。</translation>
 <translation id="8548832052135586762">カラー印刷のみ、白黒印刷のみ、カラー印刷モードの制限なし、のいずれかに設定します。ポリシーが未設定の場合は、制限なしとして扱われます。</translation>
diff --git a/components/policy/resources/policy_templates_ko.xtb b/components/policy/resources/policy_templates_ko.xtb
index bf26050..5d4bd648 100644
--- a/components/policy/resources/policy_templates_ko.xtb
+++ b/components/policy/resources/policy_templates_ko.xtb
@@ -297,7 +297,7 @@
 <translation id="1503863096120373385"><ph name="PRODUCT_NAME" />의 인터넷 사용 기록 보관 기간 설정을 구성합니다.
       선택한 인터넷 사용 기록을 보관할 기간을 결정하는 정책입니다. 이 정책은 동기화가 사용 설정된 경우 적용되지 않습니다.
       사용 가능한 데이터 유형은 <ph name="DATA_TYPE_BROWSING_HISTORY" />, <ph name="DATA_TYPE_DOWNLOAD_HISTORY" />, <ph name="DATA_TYPE_COOKIES_AND_OTHER_SITE_DATA" />, <ph name="DATA_TYPE_CACHED_IMAGES_AND_FILES" />, <ph name="DATA_TYPE_PASSWORD" />, <ph name="DATA_TYPE_AUTOFILL" />, <ph name="DATA_TYPE_SITE_SETTINGS" /> 및 <ph name="DATA_TYPE_HOSTED_APP_DATA" />입니다.
-      Chrome에서 <ph name="TIME_TO_LIVE_IN_HOURS" />이 경과한 데이터 중 내가 선택한 유형의 데이터를 정기적으로 삭제합니다. 특정 간격으로만 삭제되므로 일부 데이터가 좀 더 오래 보관될 수 있지만 예상 기간인 <ph name="TIME_TO_LIVE_IN_HOURS" />보다 2배 길게 보관되지는 않습니다.
+      Chrome에서 <ph name="TIME_TO_LIVE_IN_HOURS" /> 값을 경과한 데이터 중 내가 선택한 유형의 데이터를 정기적으로 삭제합니다. 일정한 간격이 지나야만 삭제되므로 일부 데이터가 좀 더 오래 보관될 수 있지만 예상 기간인 <ph name="TIME_TO_LIVE_IN_HOURS" />보다 2배 이상으로 길게 보관되지는 않습니다.
       </translation>
 <translation id="1507382822467487898">
           기기에 도크가 연결되었을 때 어떤 미디어 액세스 컨트롤(MAC) 주소가 사용될지 설정합니다.
@@ -2658,7 +2658,7 @@
       참고: <ph name="EXTERNAL_SITELIST_URL_POLICY_NAME" /> 정책을 통해서도 이 목록에 요소를 추가할 수 있습니다.</translation>
 <translation id="5065753964276395784">이 정책은 지원 중단되었으므로 <ph name="PROXY_SETTINGS_POLICY_NAME" /> 정책을 대신 사용하세요.
 
-       정책을 설정하면 <ph name="PRODUCT_NAME" />에서 여기에 지정된 호스트 목록에 대해 모든 프록시를 우회합니다. 이 정책은 <ph name="PROXY_SETTINGS_POLICY_NAME" /> 정책을 지정하지 않고 <ph name="PROXY_MODE_ENUM_FIXED_SERVERS" />에 <ph name="PROXY_MODE_POLICY_NAME" /> 값을 선택한 경우에만 적용됩니다.
+       정책을 설정하면 <ph name="PRODUCT_NAME" />에서 여기에 지정된 호스트 목록에 대해 모든 프록시를 우회합니다. 이 정책은 <ph name="PROXY_SETTINGS_POLICY_NAME" /> 정책을 지정하지 않고 <ph name="PROXY_MODE_POLICY_NAME" />에 <ph name="PROXY_MODE_ENUM_FIXED_SERVERS" /> 값을 선택한 경우에만 적용됩니다.
 
        프록시 정책 설정에 다른 모드를 선택했다면 이 정책을 설정하지 마세요.
 
@@ -4092,7 +4092,7 @@
       'U2F_EXTENDED'를 선택하면 통합된 2차 요소가 U2F 기능과 함께 개별 인증용 확장 프로그램을 일부 제공합니다.</translation>
 <translation id="6999948519306285655">이 정책은 지원 중단되었으므로 <ph name="PROXY_SETTINGS_POLICY_NAME" /> 정책을 대신 사용하세요.
 
-       정책을 설정하면 프록시 .pac 파일 URL을 지정할 수 있습니다. 이 정책은 <ph name="PROXY_SETTINGS_POLICY_NAME" /> 정책을 지정하지 않고 <ph name="PROXY_MODE_ENUM_PAC_SCRIPT" />에 <ph name="PROXY_MODE_POLICY_NAME" /> 값을 선택한 경우에만 적용됩니다.
+       정책을 설정하면 프록시 .pac 파일 URL을 지정할 수 있습니다. 이 정책은 <ph name="PROXY_SETTINGS_POLICY_NAME" /> 정책을 지정하지 않고 <ph name="PROXY_MODE_POLICY_NAME" />에 <ph name="PROXY_MODE_ENUM_PAC_SCRIPT" /> 값을 선택한 경우에만 적용됩니다.
 
        프록시 정책 설정에 다른 모드를 선택했다면 이 정책을 설정하지 마세요.
 
@@ -4686,7 +4686,7 @@
 <translation id="7715711044277116530">프레젠테이션 모드에서 화면 어둡게 하기 지연 시간이 조정되는 비율</translation>
 <translation id="7716020145539921591">이 정책은 지원 중단되었으므로 <ph name="PROXY_SETTINGS_POLICY_NAME" /> 정책을 대신 사용하세요.
 
-       정책을 설정하면 프록시 서버의 URL을 지정할 수 있습니다. 이 정책은 <ph name="PROXY_SETTINGS_POLICY_NAME" /> 정책을 지정하지 않고 <ph name="PROXY_MODE_ENUM_FIXED_SERVERS" />에 <ph name="PROXY_MODE_POLICY_NAME" /> 값을 선택한 경우에만 적용됩니다.
+       정책을 설정하면 프록시 서버의 URL을 지정할 수 있습니다. 이 정책은 <ph name="PROXY_SETTINGS_POLICY_NAME" /> 정책을 지정하지 않고 <ph name="PROXY_MODE_POLICY_NAME" />에 <ph name="PROXY_MODE_ENUM_FIXED_SERVERS" /> 값을 선택한 경우에만 적용됩니다.
 
        프록시 정책 설정에 다른 모드를 선택했다면 이 정책을 설정하지 마세요.
 
@@ -5247,22 +5247,6 @@
 <translation id="8537051350735478658">정책을 True로 설정하면 <ph name="PRODUCT_NAME" />의 주소 표시줄에서 추천 검색어가 사용됩니다. 정책을 False로 설정하면 추천 검색어가 사용 중지됩니다.
 
       정책을 설정하면 사용자가 변경할 수 없습니다. 정책을 설정하지 않으면 처음에는 추천 검색어가 표시되지만 사용자가 언제든지 사용 중지할 수 있습니다.</translation>
-<translation id="8542290591179355871">이 정책은 지원 중단되었으므로 <ph name="PROXY_SETTINGS_POLICY_NAME" /> 정책을 대신 사용하세요.
-
-       정책을 사용 설정하면 Chrome의 프록시 서버를 지정할 수 있으며 사용자가 프록시 설정을 변경하지 못합니다. Chrome과 ARC 앱이 명령줄에 지정된 모든 프록시 관련 옵션을 무시합니다. 이 정책은 <ph name="PROXY_SETTINGS_POLICY_NAME" /> 정책이 지정되지 않은 경우에 적용됩니다.
-
-       다음을 선택하면 다른 옵션이 무시됩니다.
-         * <ph name="PROXY_MODE_ENUM_DIRECT" /> = 프록시 서버를 사용하지 않고 항상 직접 연결
-         * <ph name="PROXY_MODE_ENUM_SYSTEM" /> = 시스템 프록시 설정 사용
-         * <ph name="PROXY_MODE_ENUM_AUTO_DETECT" /> = 프록시 서버 자동 감지
-
-       다음을 사용하도록 선택하면 다른 옵션이 무시됩니다.
-         * <ph name="PROXY_MODE_ENUM_FIXED_SERVERS" /> = 고정된 프록시 서버 <ph name="PROXY_SERVER_POLICY_NAME" /> 및 <ph name="PROXY_BYPASS_LIST_POLICY_NAME" />로 추가 옵션을 지정할 수 있습니다. ARC 앱은 우선순위가 가장 높은 HTTP 프록시 서버만 사용합니다.
-         * <ph name="PROXY_MODE_ENUM_PAC_SCRIPT" /> =  .pac 프록시 스크립트 프록시 .pac 파일 URL에 <ph name="PROXY_PAC_URL_POLICY_NAME" />을 사용합니다.
-
-      정책을 설정하지 않으면 사용자가 프록시 설정을 선택할 수 있습니다.
-
-      참고: 자세한 예시를 보려면 Chromium 프로젝트(https://www.chromium.org/developers/design-documents/network-settings#TOC-Command-line-options-for-proxy-sett)를 참고하세요.</translation>
 <translation id="8544375438507658205"><ph name="PRODUCT_FRAME_NAME" />의 기본 HTML 렌더러</translation>
 <translation id="8544465954173828789">SMS 메시지가 휴대전화에서 Chromebook으로 동기화되도록 허용</translation>
 <translation id="8548832052135586762">컬러만, 단색만, 컬러 모드 제한 없음으로 인쇄를 설정합니다. 정책이 설정되어 있지 않으면 제한이 없는 것으로 처리됩니다.</translation>
diff --git a/components/policy/resources/policy_templates_nl.xtb b/components/policy/resources/policy_templates_nl.xtb
index a485dd82..547447f 100644
--- a/components/policy/resources/policy_templates_nl.xtb
+++ b/components/policy/resources/policy_templates_nl.xtb
@@ -5199,22 +5199,6 @@
 <translation id="8537051350735478658">Als je het beleid instelt op 'True', worden zoeksuggesties ingeschakeld in de adresbalk van <ph name="PRODUCT_NAME" />. Als je het beleid instelt op 'False', worden deze zoeksuggesties uitgeschakeld.
 
       Als je het beleid instelt, kunnen gebruikers het niet wijzigen. Als je dit beleid niet instelt, zijn zoeksuggesties in eerste instantie ingeschakeld, maar kunnen gebruikers deze op elk moment uitschakelen.</translation>
-<translation id="8542290591179355871">Dit beleid is verouderd. Gebruik in plaats daarvan <ph name="PROXY_SETTINGS_POLICY_NAME" />.
-
-       Als je het beleid inschakelt, kun je de proxyserver opgeven die Chrome gebruikt en voorkomen dat gebruikers de proxyinstellingen wijzigen. Chrome en ARC-apps negeren alle proxygerelateerde opties die via de opdrachtregel worden opgegeven. Het beleid is alleen van kracht als het beleid <ph name="PROXY_SETTINGS_POLICY_NAME" /> niet is opgegeven.
-
-       Andere opties worden genegeerd als je het volgende kiest:
-         * <ph name="PROXY_MODE_ENUM_DIRECT" /> = Nooit een proxyserver gebruiken en altijd rechtstreeks verbinding maken
-         * <ph name="PROXY_MODE_ENUM_SYSTEM" /> = De proxyinstellingen van het systeem gebruiken
-         * <ph name="PROXY_MODE_ENUM_AUTO_DETECT" /> = De proxyserver automatisch zoeken
-
-       Als je ervoor kiest het volgende te gebruiken:
-         * <ph name="PROXY_MODE_ENUM_FIXED_SERVERS" /> = Vaste proxyservers. Je kunt verdere opties opgeven met <ph name="PROXY_SERVER_POLICY_NAME" /> en <ph name="PROXY_BYPASS_LIST_POLICY_NAME" />. Alleen de http-proxyserver met de hoogste prioriteit is beschikbaar voor ARC-apps.
-         * <ph name="PROXY_MODE_ENUM_PAC_SCRIPT" /> = Een pac-proxyscript. Gebruik <ph name="PROXY_PAC_URL_POLICY_NAME" /> voor de URL naar een pac-bestand van de proxy.
-
-      Als je het beleid niet instelt, kunnen gebruikers de proxyinstellingen kiezen.
-
-      Opmerking: Voor gedetailleerde voorbeelden ga je naar The Chromium Projects ( https://www.chromium.org/developers/design-documents/network-settings#TOC-Command-line-options-for-proxy-sett ).</translation>
 <translation id="8544375438507658205">Standaard HTML-renderer voor <ph name="PRODUCT_FRAME_NAME" /></translation>
 <translation id="8544465954173828789">Toestaan dat sms-berichten worden gesynchroniseerd tussen telefoon en Chromebook.</translation>
 <translation id="8548832052135586762">Hiermee bepaal je of je alleen in kleur, alleen in monochroom of zonder kleurbeperking wilt afdrukken. Als er geen beleid is ingesteld, gelden er geen beperkingen.</translation>
diff --git a/components/policy/resources/policy_templates_pt-BR.xtb b/components/policy/resources/policy_templates_pt-BR.xtb
index a88cd0d3..d5f58dd 100644
--- a/components/policy/resources/policy_templates_pt-BR.xtb
+++ b/components/policy/resources/policy_templates_pt-BR.xtb
@@ -5188,22 +5188,6 @@
 <translation id="8537051350735478658">Se a política for definida como verdadeira, as sugestões de pesquisa na barra de endereço do <ph name="PRODUCT_NAME" /> serão ativadas. Se ela for definida como falsa, essas sugestões serão desativadas.
 
       Se você definir a política, os usuários não poderão mudá-la. Se ela não for definida, as sugestões de pesquisa ficarão inicialmente ativadas, mas os usuários poderão desativá-las quando quiserem.</translation>
-<translation id="8542290591179355871">Esta política está obsoleta. Use a <ph name="PROXY_SETTINGS_POLICY_NAME" />.
-
-       Se a política for definida como "Ativada", você poderá especificar o servidor proxy usado pelo Chrome e evitar que os usuários mudem as configurações de proxy. O Chrome e os apps ARC ignoram todas as opções relacionadas a proxy especificadas na linha de comando. A política só terá efeito se a <ph name="PROXY_SETTINGS_POLICY_NAME" /> não for especificada.
-
-       Outras opções serão ignoradas se você escolher uma destas:
-         * <ph name="PROXY_MODE_ENUM_DIRECT" />: nunca usar um servidor proxy e sempre conectar diretamente.
-         * <ph name="PROXY_MODE_ENUM_SYSTEM" />: usar as configurações de proxy do sistema.
-         * <ph name="PROXY_MODE_ENUM_AUTO_DETECT" />: detectar automaticamente o servidor proxy.
-
-       Se você escolher usar:
-         * <ph name="PROXY_MODE_ENUM_FIXED_SERVERS" />: servidores proxy corrigidos. Será possível especificar mais opções com <ph name="PROXY_SERVER_POLICY_NAME" /> e <ph name="PROXY_BYPASS_LIST_POLICY_NAME" />. Apenas o servidor proxy HTTP com a maior prioridade está disponível para apps ARC.
-         * <ph name="PROXY_MODE_ENUM_PAC_SCRIPT" />: um script de proxy .pac. Use <ph name="PROXY_PAC_URL_POLICY_NAME" /> no URL de um arquivo proxy .pac.
-
-      Se a política não for definida, os usuários poderão escolher as configurações de proxy.
-
-      Observação: para ver exemplos detalhados, acesse The Chromium Projects (https://www.chromium.org/developers/design-documents/network-settings#TOC-Command-line-options-for-proxy-sett, link em inglês).</translation>
 <translation id="8544375438507658205">Renderizador padrão de HTML para o <ph name="PRODUCT_FRAME_NAME" /></translation>
 <translation id="8544465954173828789">Permite a sincronização de mensagens SMS do smartphone com o Chromebook.</translation>
 <translation id="8548832052135586762">Define a impressão para apenas em cores, apenas monocromática ou sem restrição de modo de cor. Se a política não for definida, não haverá restrição.</translation>
diff --git a/components/policy/resources/policy_templates_ru.xtb b/components/policy/resources/policy_templates_ru.xtb
index 050ad71..81446e1 100644
--- a/components/policy/resources/policy_templates_ru.xtb
+++ b/components/policy/resources/policy_templates_ru.xtb
@@ -294,7 +294,7 @@
 <translation id="1503863096120373385">Правило устанавливает настройки автоматической очистки данных для браузера <ph name="PRODUCT_NAME" />.
       С помощью правила можно задать срок хранения выбранных данных, таких как история браузера, кеш, файлы cookie и т. д. Правило не работает при включенной синхронизации.
       Вы можете выбрать следующие типы данных: <ph name="DATA_TYPE_BROWSING_HISTORY" />, <ph name="DATA_TYPE_DOWNLOAD_HISTORY" />, <ph name="DATA_TYPE_COOKIES_AND_OTHER_SITE_DATA" />, <ph name="DATA_TYPE_CACHED_IMAGES_AND_FILES" />, <ph name="DATA_TYPE_PASSWORD" />, <ph name="DATA_TYPE_AUTOFILL" />, <ph name="DATA_TYPE_SITE_SETTINGS" /> и <ph name="DATA_TYPE_HOSTED_APP_DATA" />.
-      Браузер Chrome будет удалять выбранные данные, которые хранятся дольше <ph name="TIME_TO_LIVE_IN_HOURS" />. Поскольку удаление происходит с определенным интервалом, указанный срок хранения некоторой информации (<ph name="TIME_TO_LIVE_IN_HOURS" />) может увеличиться, но не более чем вдвое.
+      Браузер Chrome будет удалять выбранные данные, которые хранятся дольше <ph name="TIME_TO_LIVE_IN_HOURS" />. Поскольку удаление происходит с определенной периодичностью, фактический срок хранения некоторой информации (<ph name="TIME_TO_LIVE_IN_HOURS" />) может оказаться больше, но не более чем вдвое ожидаемого.
       </translation>
 <translation id="1507382822467487898">
           Определяет, какой MAC-адрес (адрес управления доступом к среде) будет использоваться при подключении устройства к док-станции.
@@ -5215,22 +5215,6 @@
 <translation id="8537051350735478658">Если для правила задано значение True, в адресной строке <ph name="PRODUCT_NAME" /> при поиске будут появляться подсказки. Если указано значение False, таких подсказок не будет.
 
       Если вы настроите это правило, пользователи не смогут его изменить. Если вы не настроите правило, подсказки при поиске будут включены, но пользователи смогут отключить их в любое время.</translation>
-<translation id="8542290591179355871">Это правило больше не поддерживается. Используйте вместо него правило <ph name="PROXY_SETTINGS_POLICY_NAME" />.
-
-       Оно позволяет задать прокси-сервер для Chrome и запрещает пользователям менять его настройки. Chrome и ARC-приложения будут игнорировать все настройки прокси-сервера, указанные с помощью командной строки. Это правило действует, только если не настроено правило <ph name="PROXY_SETTINGS_POLICY_NAME" />.
-
-       При выборе одного из следующих параметров остальные игнорируются:
-         * Параметр <ph name="PROXY_MODE_ENUM_DIRECT" /> запрещает использование прокси-сервера и устанавливает прямое соединение.
-         * Параметр <ph name="PROXY_MODE_ENUM_SYSTEM" /> активирует системные настройки прокси-сервера.
-         * Параметр <ph name="PROXY_MODE_ENUM_AUTO_DETECT" /> автоматически определяет прокси-сервер.
-
-       Вы также можете выбрать следующий параметр:
-         * <ph name="PROXY_MODE_ENUM_FIXED_SERVERS" /> – использование фиксированных прокси-серверов. Дополнительные параметры определяются правилами <ph name="PROXY_SERVER_POLICY_NAME" /> и <ph name="PROXY_BYPASS_LIST_POLICY_NAME" />. ARC-приложениям будет доступен только HTTP-прокси с наивысшим приоритетом.
-         * <ph name="PROXY_MODE_ENUM_PAC_SCRIPT" /> – скрипт автоконфигурации прокси. Установите правило <ph name="PROXY_PAC_URL_POLICY_NAME" /> для URL файла PAC прокси-сервера.
-
-      Если правило не задано, пользователи смогут самостоятельно настраивать прокси-сервер.
-
-      Примечание. Подробную информацию можно найти здесь: https://www.chromium.org/developers/design-documents/network-settings#TOC-Command-line-options-for-proxy-sett.</translation>
 <translation id="8544375438507658205">Средство обработки HTML в <ph name="PRODUCT_FRAME_NAME" /> по умолчанию</translation>
 <translation id="8544465954173828789">Разрешить синхронизацию SMS на телефоне и устройстве Chromebook</translation>
 <translation id="8548832052135586762">Устанавливает режим печати: только цветная, только черно-белая, без ограничений. Если правило не задано, ограничение не действует.</translation>
diff --git a/components/policy/resources/policy_templates_th.xtb b/components/policy/resources/policy_templates_th.xtb
index 81fe98d..8c790a76 100644
--- a/components/policy/resources/policy_templates_th.xtb
+++ b/components/policy/resources/policy_templates_th.xtb
@@ -284,7 +284,7 @@
 
           หากตั้งค่านโยบายนี้ ผู้ใช้จะเปลี่ยนหรือลบล้างไม่ได้</translation>
 <translation id="1502843533062797703">เปิดใช้การบล็อกการแทรกซอฟต์แวร์ของบุคคลที่สาม</translation>
-<translation id="1503863096120373385">กำหนดค่าการตั้งค่าอายุการใช้งานของข้อมูลการท่องเว็บสำหรับ <ph name="PRODUCT_NAME" />
+<translation id="1503863096120373385">กำหนดค่าอายุการใช้งานของข้อมูลการท่องเว็บสำหรับ <ph name="PRODUCT_NAME" />
       นโยบายนี้จะควบคุมอายุการใช้งานของข้อมูลการท่องเว็บที่เลือก นโยบายนี้ไม่มีผลหากเปิดการซิงค์ไว้
       ประเภทข้อมูลที่พร้อมใช้งาน ได้แก่ <ph name="DATA_TYPE_BROWSING_HISTORY" />, <ph name="DATA_TYPE_DOWNLOAD_HISTORY" />, <ph name="DATA_TYPE_COOKIES_AND_OTHER_SITE_DATA" />, <ph name="DATA_TYPE_CACHED_IMAGES_AND_FILES" />, <ph name="DATA_TYPE_PASSWORD" />, <ph name="DATA_TYPE_AUTOFILL" />, <ph name="DATA_TYPE_SITE_SETTINGS" /> และ <ph name="DATA_TYPE_HOSTED_APP_DATA" />
       Chrome จะนำข้อมูลประเภทที่เลือกไว้ที่มีอายุนานกว่า <ph name="TIME_TO_LIVE_IN_HOURS" /> ชั่วโมงออกอยู่เสมอ เนื่องจากการลบนี้จะเกิดขึ้นในบางช่วงเวลาเท่านั้น ข้อมูลบางอย่างจึงอาจมีอายุการใช้งานนานกว่าเล็กน้อย แต่จะไม่เกิน 2 เท่าของ <ph name="TIME_TO_LIVE_IN_HOURS" /> ที่คาดไว้
@@ -2625,7 +2625,7 @@
       โปรดทราบว่าคุณเพิ่มเอลิเมนต์ลงในรายการนี้ผ่านนโยบาย <ph name="EXTERNAL_SITELIST_URL_POLICY_NAME" /> ได้ด้วย</translation>
 <translation id="5065753964276395784">นโยบายนี้เลิกใช้งานไปแล้ว โปรดใช้ <ph name="PROXY_SETTINGS_POLICY_NAME" /> แทน
 
-       การตั้งค่านโยบายหมายความว่า <ph name="PRODUCT_NAME" /> จะข้ามพร็อกซีสำหรับรายชื่อโฮสต์ที่ระบุไว้ที่นี่ นโยบายนี้จะมีผลก็ต่อเมื่อไม่ได้ระบุนโยบาย <ph name="PROXY_SETTINGS_POLICY_NAME" /> และคุณเลือก <ph name="PROXY_MODE_ENUM_FIXED_SERVERS" /> ด้วย <ph name="PROXY_MODE_POLICY_NAME" /> เท่านั้น
+       การตั้งค่านโยบายนี้หมายความว่า <ph name="PRODUCT_NAME" /> จะข้ามพร็อกซีสำหรับรายชื่อโฮสต์ที่ระบุไว้ที่นี่ นโยบายนี้จะมีผลก็ต่อเมื่อไม่ได้ระบุนโยบาย <ph name="PROXY_SETTINGS_POLICY_NAME" /> และคุณเลือก <ph name="PROXY_MODE_ENUM_FIXED_SERVERS" /> ด้วย <ph name="PROXY_MODE_POLICY_NAME" /> เท่านั้น
 
        ไม่ต้องตั้งค่านโยบายนี้หากได้เลือกโหมดอื่นสำหรับการตั้งค่านโยบายพร็อกซีแล้ว
 
@@ -4044,7 +4044,7 @@
       หากเลือก "U2F_EXTENDED" ปัจจัยที่ 2 ที่รวมอยู่จะแจ้งฟังก์ชัน U2F พร้อมส่วนขยายบางอย่างสำหรับการรับรองแต่ละรายการ</translation>
 <translation id="6999948519306285655">นโยบายนี้เลิกใช้งานไปแล้ว โปรดใช้ <ph name="PROXY_SETTINGS_POLICY_NAME" /> แทน
 
-       การตั้งค่านโยบายช่วยให้คุณระบุ URL ไปยังไฟล์ .pac ของพร็อกซีได้ นโยบายนี้จะมีผลก็ต่อเมื่อไม่ได้ระบุนโยบาย <ph name="PROXY_SETTINGS_POLICY_NAME" /> และคุณเลือก <ph name="PROXY_MODE_ENUM_PAC_SCRIPT" /> ด้วย <ph name="PROXY_MODE_POLICY_NAME" /> เท่านั้น
+       การตั้งค่านโยบายนี้ช่วยให้คุณระบุ URL ไปยังไฟล์ .pac ของพร็อกซีได้ นโยบายนี้จะมีผลก็ต่อเมื่อไม่ได้ระบุนโยบาย <ph name="PROXY_SETTINGS_POLICY_NAME" /> และคุณเลือก <ph name="PROXY_MODE_ENUM_PAC_SCRIPT" /> ด้วย <ph name="PROXY_MODE_POLICY_NAME" /> เท่านั้น
 
        ไม่ต้องตั้งค่านโยบายนี้หากได้เลือกโหมดอื่นสำหรับการตั้งค่านโยบายพร็อกซีแล้ว
 
@@ -4634,7 +4634,7 @@
 <translation id="7715711044277116530">เปอร์เซ็นต์ของระดับการปรับการหน่วงเวลาการสลัวหน้าจอในโหมดการนำเสนอ</translation>
 <translation id="7716020145539921591">นโยบายนี้เลิกใช้งานไปแล้ว โปรดใช้ <ph name="PROXY_SETTINGS_POLICY_NAME" /> แทน
 
-       การตั้งค่านโยบายช่วยให้คุณระบุ URL ของพร็อกซีเซิร์ฟเวอร์ได้ นโยบายนี้จะมีผลก็ต่อเมื่อไม่ได้ระบุนโยบาย <ph name="PROXY_SETTINGS_POLICY_NAME" /> และคุณเลือก <ph name="PROXY_MODE_ENUM_FIXED_SERVERS" /> ด้วย <ph name="PROXY_MODE_POLICY_NAME" /> เท่านั้น
+       การตั้งค่านโยบายนี้ช่วยให้คุณระบุ URL ของพร็อกซีเซิร์ฟเวอร์ได้ นโยบายนี้จะมีผลก็ต่อเมื่อไม่ได้ระบุนโยบาย <ph name="PROXY_SETTINGS_POLICY_NAME" /> และคุณเลือก <ph name="PROXY_MODE_ENUM_FIXED_SERVERS" /> ด้วย <ph name="PROXY_MODE_POLICY_NAME" /> เท่านั้น
 
        ไม่ต้องตั้งค่านโยบายนี้หากได้เลือกโหมดอื่นสำหรับการตั้งค่านโยบายพร็อกซีแล้ว
 
@@ -5187,22 +5187,6 @@
 <translation id="8537051350735478658">การตั้งค่านโยบายเป็น "จริง" จะเปิดการแนะนำการค้นหาในแถบที่อยู่ของ <ph name="PRODUCT_NAME" /> การตั้งค่านโยบายเป็น "เท็จ" จะปิดการแนะนำการค้นหา
 
       หากคุณตั้งค่านโยบายนี้ ผู้ใช้จะเปลี่ยนไม่ได้ หากไม่ได้ตั้งค่า การแนะนำการค้นหาจะเปิดอยู่ในตอนแรก แต่ผู้ใช้จะปิดได้ทุกเมื่อ</translation>
-<translation id="8542290591179355871">นโยบายนี้เลิกใช้งานไปแล้ว โปรดใช้ <ph name="PROXY_SETTINGS_POLICY_NAME" /> แทน
-
-       การตั้งค่านโยบายเป็น "เปิดใช้" ช่วยให้คุณระบุพร็อกซีเซิร์ฟเวอร์ที่ Chrome จะใช้ได้ และป้องกันไม่ให้ผู้ใช้เปลี่ยนการตั้งค่าพร็อกซี Chrome และแอป ARC จะไม่สนใจตัวเลือกที่เกี่ยวข้องกับพร็อกซีทั้งหมดที่ระบุจากบรรทัดคำสั่ง นโยบายนี้จะมีผลก็ต่อเมื่อไม่ได้ระบุนโยบาย <ph name="PROXY_SETTINGS_POLICY_NAME" /> เท่านั้น
-
-       ระบบจะไม่สนใจตัวเลือกอื่นๆ หากคุณเลือกตัวเลือกต่อไปนี้
-         * <ph name="PROXY_MODE_ENUM_DIRECT" /> = ไม่ใช้พร็อกซีเซิร์ฟเวอร์และเชื่อมต่อโดยตรงเสมอ
-         * <ph name="PROXY_MODE_ENUM_SYSTEM" /> = ใช้การตั้งค่าพร็อกซีของระบบ
-         * <ph name="PROXY_MODE_ENUM_AUTO_DETECT" /> = ตรวจจับพร็อกซีเซิร์ฟเวอร์อัตโนมัติ
-
-       หากคุณเลือกใช้ตัวเลือกต่อไปนี้
-         * <ph name="PROXY_MODE_ENUM_FIXED_SERVERS" /> = พร็อกซีเซิร์ฟเวอร์แบบคงที่ คุณจะระบุตัวเลือกอื่นๆ ต่อไปได้ด้วย <ph name="PROXY_SERVER_POLICY_NAME" /> และ <ph name="PROXY_BYPASS_LIST_POLICY_NAME" /> มีเฉพาะพร็อกซีเซิร์ฟเวอร์ HTTP ที่มีลำดับความสำคัญสูงสุดเท่านั้นที่พร้อมใช้งานสำหรับแอป ARC
-         * <ph name="PROXY_MODE_ENUM_PAC_SCRIPT" /> =  สคริปต์พร็อกซี .pac ใช้ <ph name="PROXY_PAC_URL_POLICY_NAME" /> กับ URL ไปยังไฟล์ .pac ของพร็อกซี
-
-      การไม่ตั้งค่านโยบายจะทำให้ผู้ใช้เลือกการตั้งค่าพร็อกซีได้
-
-      หมายเหตุ: ดูตัวอย่างโดยละเอียดได้ที่ The Chromium Projects ( https://www.chromium.org/developers/design-documents/network-settings#TOC-Command-line-options-for-proxy-sett )</translation>
 <translation id="8544375438507658205">โปรแกรมแสดง HTML เริ่มต้นสำหรับ <ph name="PRODUCT_FRAME_NAME" /></translation>
 <translation id="8544465954173828789">อนุญาตให้ซิงค์ข้อความ SMS จากโทรศัพท์ไปยัง Chromebook</translation>
 <translation id="8548832052135586762">ตั้งค่าการพิมพ์เป็นสีเท่านั้น ขาวดำเท่านั้น หรือไม่มีข้อจำกัดโหมดสี ระบบจะถือว่าไม่มีข้อจำกัดหากไม่ได้ตั้งค่านโยบายไว้</translation>
diff --git a/components/policy/resources/policy_templates_tr.xtb b/components/policy/resources/policy_templates_tr.xtb
index 6dceb22..450cd35 100644
--- a/components/policy/resources/policy_templates_tr.xtb
+++ b/components/policy/resources/policy_templates_tr.xtb
@@ -5200,22 +5200,6 @@
 <translation id="8537051350735478658">Politikayı True (Doğru) değerine ayarlamak, <ph name="PRODUCT_NAME" /> ürününün adres çubuğunda arama önerilerini açar. Politikayı False (Yanlış) değerine ayarlamak, arama önerilerini kapatır.
 
       Bu politikayı ayarlarsanız kullanıcılar değiştiremez. Ayarlanmazsa arama önerileri ilk başta açıktır, ancak kullanıcılar istedikleri zaman kapatabilir.</translation>
-<translation id="8542290591179355871">Bu politika kullanımdan kaldırıldı, lütfen bunun yerine <ph name="PROXY_SETTINGS_POLICY_NAME" /> politikasını kullanın.
-
-       Bu politikanın Etkin değerine ayarlanması, Chrome'un kullandığı proxy sunucusunu belirtmenizi sağlar ve kullanıcıların proxy ayarlarını değiştirmesini önler. Chrome ve ARC uygulamaları, komut satırında proxy ile ilgili belirtilen tüm seçenekleri yok sayar. Bu politika, yalnızca <ph name="PROXY_SETTINGS_POLICY_NAME" /> politikası belirtilmediğinde geçerli olur.
-
-       Aşağıdakileri belirlerseniz diğer seçenekler yok sayılır:
-         * <ph name="PROXY_MODE_ENUM_DIRECT" /> = Hiçbir zaman proxy sunucu kullanma ve her zaman doğrudan bağlan
-         * <ph name="PROXY_MODE_ENUM_SYSTEM" /> = Sistem proxy ayarlarını kullan
-         * <ph name="PROXY_MODE_ENUM_AUTO_DETECT" /> = Proxy sunucuyu otomatik olarak algıla
-
-       Aşağıdakini kullanmayı seçerseniz:
-         * <ph name="PROXY_MODE_ENUM_FIXED_SERVERS" /> = Sabit proxy sunucular. <ph name="PROXY_SERVER_POLICY_NAME" /> ve <ph name="PROXY_BYPASS_LIST_POLICY_NAME" /> ile daha ayrıntılı seçenekler belirtebilirsiniz. ARC uygulamaları için yalnızca en yüksek önceliğe sahip HTTP proxy sunucusu kullanılabilir.
-         * <ph name="PROXY_MODE_ENUM_PAC_SCRIPT" /> = .pac proxy komut dosyası. Proxy .pac dosyasının URL'si için <ph name="PROXY_PAC_URL_POLICY_NAME" /> kullanın.
-
-      Politika ayarlanmazsa kullanıcılar proxy ayarlarını seçebilir.
-
-      Not: Ayrıntılı örnekler için Chromium Projeleri'ni ziyaret edin ( https://www.chromium.org/developers/design-documents/network-settings#TOC-Command-line-options-for-proxy-sett ).</translation>
 <translation id="8544375438507658205"><ph name="PRODUCT_FRAME_NAME" /> için varsayılan HTML oluşturucusu</translation>
 <translation id="8544465954173828789">SMS Mesajlarının telefondan Chromebook'a senkronize edilmesine izin ver</translation>
 <translation id="8548832052135586762">Yazdırmayı yalnızca renkli, yalnızca tek renk veya renk modu kısıtlaması yok değerine ayarlar. Ayarlanmayan politika, kısıtlama yokmuş gibi işlenir.</translation>
diff --git a/components/policy/resources/policy_templates_uk.xtb b/components/policy/resources/policy_templates_uk.xtb
index cc5e561e..0eefe42c 100644
--- a/components/policy/resources/policy_templates_uk.xtb
+++ b/components/policy/resources/policy_templates_uk.xtb
@@ -143,7 +143,7 @@
 <translation id="1243570869342663665">Керує фільтруванням вмісту для дорослих SafeSites.</translation>
 <translation id="1247850578871017740">Якщо для цього правила задано дійсне значення, <ph name="PRODUCT_NAME" /> не використовуватиме SSL/TLS нижчих версій, ніж указано. Нерозпізнані значення ігноруватимуться.
 
-      Якщо це правило не налаштовано, у <ph name="PRODUCT_NAME" /> для TLS 1.0 і TLS 1.1 з'являтиметься помилка, але користувач матиме змогу обійти її.</translation>
+      Якщо це правило не налаштовано, <ph name="PRODUCT_NAME" /> повідомлятиме про помилку на сайтах, які використовують TLS 1.0 і TLS 1.1, але користувач матиме змогу обійти її.</translation>
 <translation id="1252536192437793850">Дозволити сайтам запитувати в користувача доступ до послідовного порту</translation>
 <translation id="1257550411839719984">Указати каталог для завантаження за умовчанням</translation>
 <translation id="1265053460044691532">Обмеження часу, упродовж якого користувач, автентифікований через SAML, може входити в режимі офлайн</translation>
@@ -2305,7 +2305,7 @@
       Якщо це правило не налаштовано, Безпечний перегляд буде ввімкнено в режимі стандартного захисту, але користувачі можуть змінити цей параметр.
 
       Докладніше про Безпечний перегляд читайте на сторінці https://developers.google.com/safe-browsing.</translation>
-<translation id="4402887080007986374">Дійсна версія Умов використання Edu Coexistence</translation>
+<translation id="4402887080007986374">Дійсна версія Умов використання облікового запису закладу освіти</translation>
 <translation id="4408428864159735559">Список попередньо налаштованих мережевих файлообмінників.</translation>
 <translation id="4410236409016356088">Увімкнути обмеження пропускної спроможності мережі</translation>
 <translation id="441217499641439905">Вимкнути Google Диск через мобільні з’єднання в додатку Файли в <ph name="PRODUCT_OS_NAME" /></translation>
@@ -3792,11 +3792,11 @@
 
       * "Блокувати всі завантаження" – контент не можна завантажувати.
 
-      * "Блокувати шкідливі завантаження" – можна завантажувати контент, який не вважається ймовірно зловмисним програмним забезпеченням. На відміну від небезпечних завантажень, тут береться до уваги не тип файлу, а хост.
+      * "Блокувати шкідливі завантаження" – можна завантажувати будь-який контент, який не визначено з високою ймовірністю як зловмисне програмне забезпечення. На відміну від небезпечних завантажень, тут береться до уваги не тип файлу, а хост.
 
       * "Немає особливих обмежень" – завантаження мають звичайні обмеження на основі результатів аналізу безпеки.
 
-      Примітка: ці обмеження застосовуються до завантажень, які активовано вмістом веб-сторінки або опцією меню "Завантажити дані за посиланням". Вони не діють під час завантаження відкритої сторінки чи зберігання контенту у форматі PDF через параметри друку. Докладніше про Безпечний перегляд читайте на сторінці https://developers.google.com/safe-browsing.</translation>
+      Примітка: ці обмеження застосовуються до завантажень, які активовано контентом веб-сторінки або опцією меню "Завантажити дані за посиланням". Вони не діють під час завантаження відкритої сторінки чи зберігання контенту у форматі PDF через параметри друку. Докладніше про Безпечний перегляд читайте на сторінці https://developers.google.com/safe-browsing.</translation>
 <translation id="6641981670621198190">Вимкнути підтримку API для 3D-графіки</translation>
 <translation id="6646056064606561298">Дозволити запуск, коли підключено змінний струм.
 
@@ -5238,22 +5238,6 @@
 <translation id="8537051350735478658">Якщо для цього правила вибрано значення True, підказки в пошуку в адресному рядку <ph name="PRODUCT_NAME" /> буде ввімкнено. Якщо для нього вибрано значення False, підказки в пошуку буде вимкнено.
 
       Якщо це правило налаштовано, користувачі не зможуть змінювати його. Якщо це правило не налаштовано, підказки в пошуку буде ввімкнено, але користувачі зможуть будь-коли вимкнути їх.</translation>
-<translation id="8542290591179355871">Це правило більше не підтримується. Натомість використовуйте правило <ph name="PROXY_SETTINGS_POLICY_NAME" />.
-
-       Якщо це правило ввімкнено, ви зможете вказати, який проксі-сервер має використовувати Chrome, а користувачі не матимуть змоги змінити ці налаштування. Chrome і додатки ARC ігнорують усі параметри проксі, указані в командному рядку. Це правило діє, лише якщо правило <ph name="PROXY_SETTINGS_POLICY_NAME" /> невказане.
-
-       Якщо ви виберете параметри нижче, то інші ігноруватимуться:
-         * <ph name="PROXY_MODE_ENUM_DIRECT" /> = ніколи не використовувати проксі-сервер і завжди підключатися напряму
-         * <ph name="PROXY_MODE_ENUM_SYSTEM" /> = використовувати налаштування проксі-сервера системи
-         * <ph name="PROXY_MODE_ENUM_AUTO_DETECT" /> = автоматично визначати проксі-сервер
-
-       Якщо ви виберете параметр:
-         * <ph name="PROXY_MODE_ENUM_FIXED_SERVERS" /> = використовувати фіксовані проксі-сервери. Інші параметри можна вказати за допомогою правил <ph name="PROXY_SERVER_POLICY_NAME" /> і <ph name="PROXY_BYPASS_LIST_POLICY_NAME" />. Для додатків ARC доступний лише проксі-сервер HTTP з найвищим пріоритетом.
-         * <ph name="PROXY_MODE_ENUM_PAC_SCRIPT" /> = скрипт .pac для проксі-сервера. Використовуйте правило <ph name="PROXY_PAC_URL_POLICY_NAME" /> щоб указати URL-адресу файлу .pac проксі-сервера.
-
-      Якщо це правило не налаштовано, користувачі зможуть вибирати налаштування проксі.
-
-      Примітка: щоб переглянути детальніші приклади, відвідайте веб-сайт проектів Chromium (https://www.chromium.org/developers/design-documents/network-settings#TOC-Command-line-options-for-proxy-sett).</translation>
 <translation id="8544375438507658205">Відтворення у форматі HTML за умовчанням для <ph name="PRODUCT_FRAME_NAME" /></translation>
 <translation id="8544465954173828789">Дозволити синхронізацію SMS-повідомлень на телефоні з Chromebook.</translation>
 <translation id="8548832052135586762">Налаштовує лише кольоровий, одноколірний або чорно-білий режим друку. Якщо це правило не налаштовано, вважається, що воно не має обмежень.</translation>
@@ -5512,11 +5496,11 @@
 <translation id="8942616385591203339">Це правило визначає, чи можна показувати Синхронізацію згоди під час першого входу користувача. Для нього потрібно встановити значення false, якщо користувачеві ніколи не потрібна Синхронізація згоди.
       Якщо вибрано значення false, Синхронізація згоди не показуватиметься.
       Якщо це правило не налаштовано або має значення true, Синхронізація згоди може показуватися.</translation>
-<translation id="8943744188513019866">Це правило визначає дійсну версію Умов використання Edu Coexistence.
+<translation id="8943744188513019866">Це правило визначає дійсну версію Умов використання облікового запису закладу освіти.
       Вона порівнюється з останньою прийнятою батьками версією та використовується, щоб просити батьків знову надати дозвіл за потреби.
 
       Коли це правило налаштовано, версію Умов використання можна підтвердити.
-      Якщо це правило не налаштовано, неможливо підтвердити, чи версія Умов використання Edu Coexistence дійсна.
+      Якщо це правило не налаштовано, неможливо підтвердити, чи версія Умов використання облікового запису закладу освіти дійсна.
 
       Це правило застосовується лише для користувачів Family Link.</translation>
 <translation id="8943934315109955032">Не перевіряти на відповідність правилам щодо захисту конфіденційних даних</translation>
diff --git a/components/policy/resources/policy_templates_vi.xtb b/components/policy/resources/policy_templates_vi.xtb
index 548f3615..d5fefb7 100644
--- a/components/policy/resources/policy_templates_vi.xtb
+++ b/components/policy/resources/policy_templates_vi.xtb
@@ -294,7 +294,7 @@
 
           Nếu bạn đặt chính sách này, thì người dùng không thể thay đổi hay ghi đè chính sách.</translation>
 <translation id="1502843533062797703">Cho phép chặn phần mềm bên thứ ba thêm mã thực thi</translation>
-<translation id="1503863096120373385">Định cấu hình các tùy chọn cài đặt về thời gian lưu giữ dữ liệu duyệt web của <ph name="PRODUCT_NAME" />.
+<translation id="1503863096120373385">Thiết lập chế độ cài đặt thời gian lưu giữ dữ liệu duyệt web của <ph name="PRODUCT_NAME" />.
       Chính sách này kiểm soát khoảng thời gian lưu giữ dữ liệu duyệt web đã chọn. Chính sách này sẽ không có hiệu lực nếu bạn bật tính năng Đồng bộ hóa.
       Dữ liệu duyệt web gồm có các loại sau đây: <ph name="DATA_TYPE_BROWSING_HISTORY" />, <ph name="DATA_TYPE_DOWNLOAD_HISTORY" />, <ph name="DATA_TYPE_COOKIES_AND_OTHER_SITE_DATA" />, <ph name="DATA_TYPE_CACHED_IMAGES_AND_FILES" />, <ph name="DATA_TYPE_PASSWORD" />, <ph name="DATA_TYPE_AUTOFILL" />, <ph name="DATA_TYPE_SITE_SETTINGS" /> và <ph name="DATA_TYPE_HOSTED_APP_DATA" />.
       Chrome sẽ thường xuyên xóa dữ liệu thuộc những loại đã chọn có khoảng thời gian lưu giữ quá <ph name="TIME_TO_LIVE_IN_HOURS" />. Vì hoạt động xóa này chỉ diễn ra định kỳ, nên một số dữ liệu có thể tồn tại lâu hơn một chút nhưng không quá 2 lần khoảng thời gian lưu giữ dự kiến là <ph name="TIME_TO_LIVE_IN_HOURS" />.
@@ -451,7 +451,7 @@
       Nếu không đặt chính sách này, không Điều khoản dịch vụ nào được hiển thị.
 
       Phải đặt chính sách thành một URL nơi <ph name="PRODUCT_OS_NAME" /> có thể tải xuống Điều khoản dịch vụ. Điều khoản dịch vụ phải là văn bản thuần túy, được phân phối dưới dạng văn bản/thuần túy loại MIME. Không cho phép đánh dấu.</translation>
-<translation id="1750315445671978749">Chặn tất cả các mục tải xuống</translation>
+<translation id="1750315445671978749">Chặn tải tất cả các tệp xuống</translation>
 <translation id="1760951637494635692">Cho phép API nối tiếp trên các trang web này</translation>
 <translation id="1765512315997108908">Kiểm soát những máy in trong <ph name="DEVICE_PRINTERS_POLICY_NAME" /> mà người dùng có thể sử dụng.
 
@@ -2666,7 +2666,7 @@
 
        Bạn không nên đặt chính sách này nếu đã chọn chế độ khác để đặt chính sách proxy.
 
-       Lưu ý: Để xem các ví dụ cụ thể khác, hãy truy cập vào trang The Chromium Projects (https://www.chromium.org/developers/design-documents/network-settings#TOC-Command-line-options-for-proxy-sett).</translation>
+       Lưu ý: Để xem thêm ví dụ cụ thể, hãy truy cập vào trang The Chromium Projects (https://www.chromium.org/developers/design-documents/network-settings#TOC-Command-line-options-for-proxy-sett).</translation>
 <translation id="5067143124345820993">Danh sách trắng những người dùng được phép đăng nhập</translation>
 <translation id="5073609397321802133">Nếu bạn đặt chính sách này thành false, thì trang Thẻ mới sẽ không cho phép người dùng tùy chỉnh nền. Các nền tùy chỉnh hiện có sẽ bị xóa vĩnh viễn ngay cả khi sau này, bạn đặt chính sách này thành true.
 
@@ -2807,7 +2807,7 @@
       Nếu bạn không đặt chính sách này, thì không có hạn chế nào được áp dụng, và người dùng có thể đăng nhập bất kể phiên bản của <ph name="PRODUCT_NAME" />.
 
       Ở đây, "Phiên bản" có thể là phiên bản chính xác, chẳng hạn như "61.0.3163.120", hoặc chỉ có tiền tố của phiên bản, chẳng hạn như "61.0"  </translation>
-<translation id="5247006254130721952">Chặn các mục tải xuống nguy hiểm</translation>
+<translation id="5247006254130721952">Chặn tải các tệp nguy hiểm xuống</translation>
 <translation id="5249453807420671499">Người dùng có thể thêm các tài khoản Kerberos</translation>
 <translation id="5252995168844634755">Nếu bạn đặt chính sách này thành True, thì Màn hình hợp nhất sẽ bật và cho phép các ứng dụng mở rộng trên nhiều màn hình. Người dùng có thể tắt Màn hình hợp nhất cho các màn hình riêng lẻ.
 
@@ -2826,7 +2826,7 @@
 
           Nếu bạn không đặt chính sách này, thì ban đầu, tính năng làm nổi bật con trỏ sẽ tắt trên màn hình đăng nhập nhưng người dùng có thể bật bất cứ lúc nào.</translation>
 <translation id="5283457834853986457">Tắt trình tìm kiếm plugin (không được dùng nữa)</translation>
-<translation id="5285315763984334157">Chặn tệp độc hại đã tải xuống</translation>
+<translation id="5285315763984334157">Chặn tải các tệp độc hại xuống</translation>
 <translation id="5288772341821359899">Nếu đã đặt chính sách, phạm vi cổng UDP mà WebRTC sử dụng sẽ được hạn chế đến phạm vi cổng được chỉ định (đã bao gồm cả điểm cuối).
 
       Nếu chưa đặt chính sách hoặc nếu chính sách được đặt thành chuỗi trống hoặc phạm vi cổng không hợp lệ thì WebRTC được phép sử dụng bất kỳ cổng UDP cục bộ khả dụng nào.</translation>
@@ -3052,7 +3052,7 @@
       Nếu không đặt chính sách này, <ph name="PRODUCT_OS_NAME" /> sẽ sử dụng giá trị mặc định là 3 giờ.
 
       Xin lưu ý rằng nếu nền tảng hỗ trợ thông báo chính sách, độ trễ làm mới sẽ được đặt thành 24 giờ (bỏ qua tất cả các cài đặt mặc định và giá trị của chính sách này) vì thông báo chính sách được kỳ vọng sẽ bắt buộc làm mới tự động bất cứ khi nào chính sách thay đổi, giúp việc làm mới thường xuyên hơn trở nên không cần thiết.</translation>
-<translation id="5530347722229944744">Chặn các mục tải xuống có thể gây nguy hiểm</translation>
+<translation id="5530347722229944744">Chặn tải các tệp có thể gây nguy hiểm xuống</translation>
 <translation id="5534198977061777727">Kiểm soát cách <ph name="PRODUCT_NAME" /> xử lý dữ liệu được tải lên, tải xuống, dán từ khay nhớ tạm hoặc kéo và thả nhưng có các loại tệp không được hỗ trợ quét tìm phần mềm độc hại hoặc quét tìm dựa trên tính năng Ngăn chặn mất dữ liệu.
 
       Nếu bạn đặt hoặc không đặt chính sách này thành 'Không chặn các loại tệp không được hỗ trợ' (0), thì <ph name="PRODUCT_NAME" /> sẽ cho phép tải lên hoặc tải xuống dữ liệu có các loại tệp không được hỗ trợ quét tìm phần mềm độc hại hoặc quét tìm dựa trên tính năng Ngăn chặn mất dữ liệu.
@@ -3793,17 +3793,17 @@
 
        Nếu bạn đặt chính sách này thành:
 
-      * Chặn các tệp nguy hiểm đã tải xuống, thì tất cả tệp đã tải xuống đều được phép, trừ những tệp có cảnh báo an toàn.
+      * Chặn tải các tệp nguy hiểm xuống, thì hệ thống sẽ cho phép tải tất cả các tệp xuống, trừ những tệp có cảnh báo an toàn.
 
-      * Chặn các tệp đã tải xuống có thể gây nguy hiểm, thì tất cả tệp đã tải xuống đều được phép, trừ những tệp có cảnh báo an toàn cho biết tệp đã tải xuống có thể gây nguy hiểm.
+      * Chặn tải các tệp có thể gây nguy hiểm xuống, thì hệ thống sẽ cho phép tải tất cả tệp xuống, trừ những tệp có cảnh báo an toàn rằng tệp tải xuống có thể gây nguy hiểm.
 
-      * Chặn tất cả tệp đã tải xuống, thì tất cả tệp đã tải xuống đều bị chặn.
+      * Chặn tải tất cả các tệp xuống, thì tất cả tệp tải xuống đều bị chặn.
 
-      * Chặn các tệp độc hại đã tải xuống, thì tất cả tệp tải xuống đều được phép, trừ những tệp được đánh giá có nhiều khả năng là độc hại. Khác với các tệp nguy hiểm đã tải xuống, chính sách này không xem xét loại tệp mà xem xét máy chủ.
+      * Chặn tải các tệp độc hại xuống, thì hệ thống sẽ cho phép tải tất cả các tệp xuống, trừ những tệp được đánh giá có nhiều khả năng là độc hại. Khác với các tệp tải xuống nguy hiểm, chính sách này không xem xét loại tệp mà xem xét máy chủ.
 
-      * Không có hạn chế đặc biệt, thì các hạn chế bảo mật thông thường sẽ được áp dụng cho các tệp đã tải xuống dựa trên kết quả phân tích mức độ an toàn.
+      * Không có hạn chế đặc biệt, thì các hạn chế bảo mật thông thường sẽ được áp dụng cho các tệp tải xuống dựa trên kết quả phân tích mức độ an toàn.
 
-      Lưu ý: Những hạn chế này áp dụng cho các tệp đã tải xuống được kích hoạt từ nội dung trang web, cũng như tùy chọn trình đơn "Đường liên kết tải xuống...". Những hạn chế này không áp dụng cho việc tải trang đang hiển thị xuống, cũng như không áp dụng cho việc lưu ở dạng tệp PDF từ các tùy chọn in. Đọc thêm về tính năng Duyệt web an toàn (https://developers.google.com/safe-browsing).</translation>
+      Lưu ý: Những hạn chế này áp dụng cho các tệp tải xuống được kích hoạt từ nội dung trang web, cũng như tùy chọn trình đơn "Đường liên kết tải xuống...". Những hạn chế này không áp dụng cho việc tải trang đang hiển thị xuống, cũng như không áp dụng cho việc lưu ở dạng tệp PDF từ các tùy chọn in. Đọc thêm về tính năng Duyệt web an toàn (https://developers.google.com/safe-browsing).</translation>
 <translation id="6641981670621198190">Tắt hỗ trợ dành cho API đồ họa 3D</translation>
 <translation id="6646056064606561298">Bật chính sách quản lý tính năng khởi động trên nguồn AC.
 
@@ -4088,7 +4088,7 @@
       Nếu bạn đặt chính sách này thành <ph name="BR_UNDER_USER_CONTROL" />, thì người dùng sẽ nhìn thấy lời nhắc sử dụng dịch vụ sao lưu và khôi phục. Nếu người dùng bật dịch vụ sao lưu vào khôi phục, thì dữ liệu ứng dụng Android sẽ được tải lên các máy chủ sao lưu của Android và được khôi phục trong những lần cài đặt lại các ứng dụng tương thích.
 
       Sau lần thiết lập ban đầu, người dùng có thể bật hoặc tắt dịch vụ sao lưu và khôi phục.</translation>
-<translation id="6986172482189158664">Tùy chọn cài đặt về thời gian lưu giữ dữ liệu duyệt web</translation>
+<translation id="6986172482189158664">Chế độ cài đặt thời gian lưu giữ dữ liệu duyệt web</translation>
 <translation id="6994082778848658360">Chỉ định cách bạn có thể sử dụng phần cứng tích hợp phần tử bảo mật để cung cấp xác thực hai yếu tố nếu tương thích với tính năng này. Nút nguồn của máy dùng để phát hiện sự hiện diện của người dùng.
 
       Nếu bạn chọn 'Đã tắt' thì sẽ không nhận được hai yếu tố.
@@ -5249,22 +5249,6 @@
 <translation id="8537051350735478658">Nếu bạn đặt chính sách này thành True, thì các đề xuất tìm kiếm sẽ bật trong thanh địa chỉ của <ph name="PRODUCT_NAME" />. Nếu bạn đặt chính sách này thành False, thì các đề xuất tìm kiếm này sẽ tắt.
 
       Nếu bạn đặt chính sách này, thì người dùng sẽ không thể thay đổi được. Nếu bạn không đặt chính sách này, thì các đề xuất tìm kiếm sẽ bật lúc đầu nhưng người dùng có thể tắt bất cứ lúc nào.</translation>
-<translation id="8542290591179355871">Chính sách này không còn dùng nữa, vui lòng sử dụng <ph name="PROXY_SETTINGS_POLICY_NAME" />.
-
-       Nếu đặt chính sách này thành Bật, bạn có thể chỉ định máy chủ proxy mà Chrome sẽ sử dụng và ngăn người dùng thay đổi tùy chọn cài đặt proxy. Chrome và các ứng dụng dùng App Runtime for Chrome (ARC) sẽ bỏ qua mọi tùy chọn liên quan đến proxy được chỉ định từ dòng lệnh. Chính sách này chỉ có hiệu lực nếu bạn chưa chỉ định chính sách <ph name="PROXY_SETTINGS_POLICY_NAME" />.
-
-       Các tùy chọn khác sẽ được bỏ qua nếu bạn chọn:
-         * <ph name="PROXY_MODE_ENUM_DIRECT" /> = Không bao giờ sử dụng máy chủ proxy và luôn kết nối trực tiếp
-         * <ph name="PROXY_MODE_ENUM_SYSTEM" /> = Sử dụng tùy chọn cài đặt proxy hệ thống
-         * <ph name="PROXY_MODE_ENUM_AUTO_DETECT" /> = Tự động phát hiện máy chủ proxy
-
-       Nếu bạn chọn sử dụng:
-         * <ph name="PROXY_MODE_ENUM_FIXED_SERVERS" /> = Máy chủ proxy cố định. Bạn có thể chỉ định thêm tùy chọn trong <ph name="PROXY_SERVER_POLICY_NAME" /> và <ph name="PROXY_BYPASS_LIST_POLICY_NAME" />. Chỉ máy chủ proxy HTTP có mức ưu tiên cao nhất mới dùng được cho các ứng dụng dùng App Runtime for Chrome (ARC).
-         * <ph name="PROXY_MODE_ENUM_PAC_SCRIPT" /> = Một tập lệnh proxy .pac. Sử dụng <ph name="PROXY_PAC_URL_POLICY_NAME" /> cho URL dẫn tới một tệp proxy .pac.
-
-      Nếu bạn không đặt chính sách này, người dùng có thể chọn các tùy chọn cài đặt proxy.
-
-      Lưu ý: Để xem các ví dụ cụ thể, hãy truy cập vào trang The Chromium Projects (https://www.chromium.org/developers/design-documents/network-settings#TOC-Command-line-options-for-proxy-sett).</translation>
 <translation id="8544375438507658205">Trình hiển thị HTML mặc định dành cho <ph name="PRODUCT_FRAME_NAME" /></translation>
 <translation id="8544465954173828789">Cho phép đồng bộ hóa Tin nhắn SMS từ điện thoại sang Chromebook.</translation>
 <translation id="8548832052135586762">Đặt chế độ in thành chỉ in màu, chỉ in đen trắng hoặc không có hạn chế về chế độ in màu. Khi bạn không đặt chính sách, thì sẽ không có hạn chế nào.</translation>
@@ -5527,9 +5511,9 @@
       Nếu đặt chính sách thành false, thì màn hình Đồng ý đồng bộ hóa sẽ không hiển thị.
       Nếu đặt thành true hoặc không đặt chính sách này, thì màn hình Đồng ý đồng bộ hóa có thể được hiển thị.</translation>
 <translation id="8943744188513019866">Chính sách này cho biết phiên bản hợp lệ hiện tại của Điều khoản dịch vụ của tài khoản trường học.
-      Chính sách hợp lệ hiện tại được so sánh với phiên bản được cha mẹ chấp nhận gần đây nhất và dùng để nhắc về việc gia hạn quyền của cha mẹ khi cần.
+      Phiên bản hợp lệ hiện tại được so sánh với phiên bản được cha mẹ chấp nhận gần đây nhất và dùng để nhắc về việc gia hạn quyền của cha mẹ khi cần.
 
-      Khi bạn đặt chính sách này, hệ thống sẽ xác thực phiên bản Điều khoản dịch vụ.
+      Khi bạn đặt chính sách này, hệ thống có thể xác thực được phiên bản của Điều khoản dịch vụ.
       Khi bạn không đặt chính sách này, hệ thống sẽ không thể xác minh tính hợp lệ của Điều khoản dịch vụ của tài khoản trường học.
 
       Chính sách này chỉ dùng cho người dùng Family Link.</translation>
diff --git a/components/policy/resources/policy_templates_zh-CN.xtb b/components/policy/resources/policy_templates_zh-CN.xtb
index 5a3e8c41..42d2f99 100644
--- a/components/policy/resources/policy_templates_zh-CN.xtb
+++ b/components/policy/resources/policy_templates_zh-CN.xtb
@@ -2620,7 +2620,7 @@
       注意:系统也可通过 <ph name="EXTERNAL_SITELIST_URL_POLICY_NAME" /> 政策向该列表添加元素。</translation>
 <translation id="5065753964276395784">此政策已被弃用,请改用 <ph name="PROXY_SETTINGS_POLICY_NAME" />。
 
-       如果您设置了此政策,<ph name="PRODUCT_NAME" /> 会绕过与此处指定的这一系列主机对应的所有代理。此政策仅在 <ph name="PROXY_SETTINGS_POLICY_NAME" /> 政策未被指定并且您选择了 <ph name="PROXY_MODE_POLICY_NAME" /> 中的 <ph name="PROXY_MODE_ENUM_FIXED_SERVERS" /> 时生效。
+       如果您设置了此政策,<ph name="PRODUCT_NAME" /> 会绕过此列表指定的域名,不对其使用任何代理。此政策仅在 <ph name="PROXY_SETTINGS_POLICY_NAME" /> 政策未被指定并且您选择了 <ph name="PROXY_MODE_POLICY_NAME" /> 中的 <ph name="PROXY_MODE_ENUM_FIXED_SERVERS" /> 时生效。
 
        如果您选择了任何其他用于设置代理政策的模式,请勿设置此政策。
 
@@ -3744,7 +3744,7 @@
 
       *“无特殊限制”,系统将根据安全分析结果检查下载内容是否符合常规安全限制。
 
-      注意:这些限制适用于从网页内容以及“下载链接…”菜单选项触发的下载,但不适用于下载当前显示的页面,也不适用于通过打印选项另存为 PDF 文件。详细了解“安全浏览”功能 ( https://developers.google.com/safe-browsing )。</translation>
+      注意:这些限制适用于从网页内容以及“下载链接…”菜单选项触发的下载,但不适用于当前所示页面的下载,也不适用于通过打印选项另存为 PDF 文件。详细了解“安全浏览”功能 ( https://developers.google.com/safe-browsing )。</translation>
 <translation id="6641981670621198190">停用对 3D 图形 API 的支持</translation>
 <translation id="6646056064606561298">启用“接通交流电时启动”电源管理政策。
 
@@ -5172,22 +5172,6 @@
 <translation id="8537051350735478658">如果此政策设为 True,系统会在 <ph name="PRODUCT_NAME" /> 地址栏中显示搜索建议。如果此政策设为 False,系统会停用此类搜索建议功能。
 
       如果您设置了此政策,用户便无法更改它。如果您不设置此政策,系统最初会显示搜索建议,但用户可随时停用此功能。</translation>
-<translation id="8542290591179355871">此政策已被弃用,请改用 <ph name="PROXY_SETTINGS_POLICY_NAME" />。
-
-       如果此政策已启用,您便可指定 Chrome 使用的代理服务器,并禁止用户更改代理设置。Chrome 和 ARC 应用会忽略通过命令行指定的所有与代理有关的选项。此政策仅在 <ph name="PROXY_SETTINGS_POLICY_NAME" /> 政策未被指定时生效。
-
-       如果您选择以下设置,系统会忽略其他选项:
-         * <ph name="PROXY_MODE_ENUM_DIRECT" /> = 永不使用代理服务器,一律直接连接
-         * <ph name="PROXY_MODE_ENUM_SYSTEM" /> = 使用系统的代理设置
-         * <ph name="PROXY_MODE_ENUM_AUTO_DETECT" /> = 自动检测代理服务器
-
-       如果您选择使用:
-         * <ph name="PROXY_MODE_ENUM_FIXED_SERVERS" /> = 固定的代理服务器。您可借助 <ph name="PROXY_SERVER_POLICY_NAME" /> 和 <ph name="PROXY_BYPASS_LIST_POLICY_NAME" /> 进一步指定相关选项。ARC 应用只能使用优先级最高的 HTTP 代理服务器。
-         * <ph name="PROXY_MODE_ENUM_PAC_SCRIPT" /> = .pac 代理脚本。使用 <ph name="PROXY_PAC_URL_POLICY_NAME" /> 指定代理 .pac 文件的网址。
-
-      如果您未设置此政策,用户便可自行选择代理设置。
-
-      注意:如需查看详细示例,请访问 Chromium 项目 ( https://www.chromium.org/developers/design-documents/network-settings#TOC-Command-line-options-for-proxy-sett )。</translation>
 <translation id="8544375438507658205">默认 HTML 呈现器为“<ph name="PRODUCT_FRAME_NAME" />”</translation>
 <translation id="8544465954173828789">允许将短信从手机同步到 Chromebook。</translation>
 <translation id="8548832052135586762">将打印模式设置为仅限彩色打印、仅限单色打印或无颜色模式限制。如果未设置此政策,则会被视为无限制。</translation>
diff --git a/components/policy/resources/policy_templates_zh-TW.xtb b/components/policy/resources/policy_templates_zh-TW.xtb
index bb060bb..8fde677 100644
--- a/components/policy/resources/policy_templates_zh-TW.xtb
+++ b/components/policy/resources/policy_templates_zh-TW.xtb
@@ -1069,6 +1069,7 @@
 
       注意:系統也可以透過 <ph name="USE_IE_SITELIST_POLICY_NAME" /> 和 <ph name="EXTERNAL_SITELIST_URL_POLICY_NAME" /> 政策將元素加入這份清單。</translation>
 <translation id="264093234299818170">系統會顯示所有印表機 (封鎖清單中的印表機除外)。</translation>
+<translation id="264252574246191885">不公開</translation>
 <translation id="2647069081229792812">允許或禁止編輯書籤</translation>
 <translation id="2649896281375932517">讓使用者決定</translation>
 <translation id="2650049181907741121">使用者蓋上螢幕時所採取的動作</translation>
@@ -2618,7 +2619,7 @@
 
        如果你選擇了透過任何其他模式設定 Proxy 政策,請勿設定這項政策。
 
-       注意:如需詳細範例,請前往 Chromium 計畫 (網址為https://www.chromium.org/developers/design-documents/network-settings#TOC-Command-line-options-for-proxy-sett)。</translation>
+       注意:如需詳細範例,請前往 Chromium 計畫 (網址為 https://www.chromium.org/developers/design-documents/network-settings#TOC-Command-line-options-for-proxy-sett )。</translation>
 <translation id="5067143124345820993">登入使用者許可清單</translation>
 <translation id="5073609397321802133">如果將這項政策設為 False,系統將禁止使用者自訂新分頁的背景。即使日後將這項政策設為 True,系統仍會永久移除任何現有的自訂背景。
 
@@ -4038,7 +4039,7 @@
 
        如果你選擇了透過任何其他模式設定 Proxy 政策,請勿設定這項政策。
 
-       注意:如需詳細範例,請前往 Chromium 計畫 (網址為 https://www.chromium.org/developers/design-documents/network-settings#TOC-Command-line-options-for-proxy-sett)。</translation>
+       注意:如需詳細範例,請前往 Chromium 計畫 (網址為 https://www.chromium.org/developers/design-documents/network-settings#TOC-Command-line-options-for-proxy-sett )。</translation>
 <translation id="7002040773317582266">已啟用主頁框網址的即時檢查功能。</translation>
 <translation id="7003746348783715221"><ph name="PRODUCT_NAME" /> 偏好設定</translation>
 <translation id="7008308728445338159">已啟用 DNS 攔截檢查功能</translation>
@@ -4621,7 +4622,7 @@
 
        如果你選擇了透過任何其他模式設定 Proxy 政策,請勿設定這項政策。
 
-      注意:如需詳細範例,請前往 Chromium 計畫 (網址為 https://www.chromium.org/developers/design-documents/network-settings#TOC-Command-line-options-for-proxy-sett)。</translation>
+      注意:如需詳細範例,請前往 Chromium 計畫 (網址為 https://www.chromium.org/developers/design-documents/network-settings#TOC-Command-line-options-for-proxy-sett )。</translation>
 <translation id="7717938661004793600">設定 <ph name="PRODUCT_OS_NAME" /> 無障礙功能。</translation>
 <translation id="7721944091689270995"><ph name="PLUGIN_VM_NAME" /> 使用者 ID</translation>
 <translation id="7724161903134898864">如果將這項政策設為 1,網站即可顯示彈出式視窗。如果將這項政策設為 2,網站將無法顯示彈出式視窗。
@@ -4648,6 +4649,7 @@
 <translation id="7750991880413385988">開啟新分頁</translation>
 <translation id="7754704193130578113">下載每個檔案前先詢問儲存位置</translation>
 <translation id="7758378441185523981">為設定檔類型啟用背景驗證。</translation>
+<translation id="776110834126722255">已淘汰</translation>
 <translation id="7763614521440615342">在新分頁顯示內容建議</translation>
 <translation id="7765753178910647492">這項政策可讓你設定要停用的 <ph name="PRODUCT_OS_NAME" />功能清單。
 
@@ -5160,23 +5162,6 @@
 <translation id="8537051350735478658">如果將這項政策設為 True,系統會在 <ph name="PRODUCT_NAME" /> 的網址列中啟用搜尋建議功能。如果將這項政策設為 False,系統會停用這類搜尋建議功能。
 
       如果設定這項政策,使用者將無法變更。如果未設定,系統會先啟用搜尋建議功能,但使用者隨時可以停用。</translation>
-<translation id="8542290591179355871">這項政策已遭淘汰,請改用 <ph name="PROXY_SETTINGS_POLICY_NAME" />。
-
-       如果將這項政策設為啟用,就可指定 Chrome 要使用的 Proxy 伺服器,並禁止使用者變更 Proxy 設定。Chrome 和 ARC 應用程式會忽略所有從指令列所指定的 Proxy 相關選項。只有在 <ph name="PROXY_SETTINGS_POLICY_NAME" /> 政策未設定時,這項政策才會生效。
-
-          如果你選擇下列項目,系統會忽略其他選項:
-         * <ph name="PROXY_MODE_ENUM_DIRECT" /> = 完全不使用 Proxy 伺服器,一律直接連線
-         * <ph name="PROXY_MODE_ENUM_SYSTEM" /> = 使用系統 Proxy 設定
-         * <ph name="PROXY_MODE_ENUM_AUTO_DETECT" /> = 自動偵測 Proxy 伺服器
-
-       如果你選擇使用:
-         * <ph name="PROXY_MODE_ENUM_FIXED_SERVERS" /> = 使用固定的 Proxy 伺服器。你可以透過 <ph name="PROXY_SERVER_POLICY_NAME" /> 和 <ph name="PROXY_BYPASS_LIST_POLICY_NAME" /> 指定更多選項。ARC 應用程式只能使用優先級最高的 HTTP Proxy 伺服器。
-
-          * <ph name="PROXY_MODE_ENUM_PAC_SCRIPT" /> = 使用 .pac Proxy 指令碼。使用 <ph name="PROXY_PAC_URL_POLICY_NAME" /> 來指定 Proxy .pac 檔案的網址。
-
-      如果不設定這項政策,使用者將可選擇要使用的 Proxy 設定。
-
-      注意:如需詳細範例,請前往 Chromium 計畫 (網址為 https://www.chromium.org/developers/design-documents/network-settings#TOC-Command-line-options-for-proxy-sett)。</translation>
 <translation id="8544375438507658205">預設 <ph name="PRODUCT_FRAME_NAME" /> 的 HTML 轉譯器</translation>
 <translation id="8544465954173828789">允許將簡訊從手機同步至 Chromebook。</translation>
 <translation id="8548832052135586762">設定僅限彩色列印、僅限單色列印,或是不限制色彩模式。如未設定這項政策,系統會視為未設限制。</translation>
diff --git a/components/profile_metrics/state.cc b/components/profile_metrics/state.cc
index 3bb503ad..4f1b666 100644
--- a/components/profile_metrics/state.cc
+++ b/components/profile_metrics/state.cc
@@ -46,6 +46,11 @@
       account_type);
 }
 
+void LogProfileSyncEnabled(bool sync_enabled, StateSuffix suffix) {
+  base::UmaHistogramBoolean(
+      "Profile.State.SyncEnabled" + GetStateSuffix(suffix), sync_enabled);
+}
+
 void LogProfileDaysSinceLastUse(int days_since_last_use, StateSuffix suffix) {
   base::UmaHistogramCounts1000(
       "Profile.State.LastUsed" + GetStateSuffix(suffix), days_since_last_use);
diff --git a/components/profile_metrics/state.h b/components/profile_metrics/state.h
index 79ff2599..efccc5a8 100644
--- a/components/profile_metrics/state.h
+++ b/components/profile_metrics/state.h
@@ -103,6 +103,9 @@
 void LogProfileAccountType(UnconsentedPrimaryAccountType account_type,
                            StateSuffix suffix);
 
+// Records the state of profile's sync.
+void LogProfileSyncEnabled(bool sync_enabled, StateSuffix suffix);
+
 // Records the days since last use of a profile.
 void LogProfileDaysSinceLastUse(int days_since_last_use, StateSuffix suffix);
 
diff --git a/components/sessions/content/DEPS b/components/sessions/content/DEPS
index ce5cab76a..06e1f243 100644
--- a/components/sessions/content/DEPS
+++ b/components/sessions/content/DEPS
@@ -4,7 +4,8 @@
   "+content/public/test",
   "+extensions/buildflags",
   "+extensions/common",
-  "+third_party/blink/public/platform",
+  "+third_party/blink/public/common/page_state/page_state.h",
   "+third_party/blink/public/common/user_agent/user_agent_metadata.h",
+  "+third_party/blink/public/platform",
   "+services/network/public/mojom/referrer_policy.mojom.h",
 ]
diff --git a/components/sessions/content/content_serialized_navigation_builder.cc b/components/sessions/content/content_serialized_navigation_builder.cc
index 27b66c0..6c9558b 100644
--- a/components/sessions/content/content_serialized_navigation_builder.cc
+++ b/components/sessions/content/content_serialized_navigation_builder.cc
@@ -17,8 +17,8 @@
 #include "content/public/browser/navigation_controller.h"
 #include "content/public/browser/navigation_entry.h"
 #include "content/public/browser/replaced_navigation_entry_data.h"
-#include "content/public/common/page_state.h"
 #include "content/public/common/referrer.h"
+#include "third_party/blink/public/common/page_state/page_state.h"
 
 namespace sessions {
 namespace {
@@ -122,7 +122,7 @@
     // Ensure that the deserialized/restored content::NavigationEntry (and
     // the content::FrameNavigationEntry underneath) has a valid PageState.
     entry->SetPageState(
-        content::PageState::CreateFromURL(navigation->virtual_url_));
+        blink::PageState::CreateFromURL(navigation->virtual_url_));
 
     // The |navigation|-based referrer set below might be inconsistent with the
     // referrer embedded inside the PageState set above.  Nevertheless, to
@@ -141,7 +141,7 @@
     // Note that PageState covers some of the values inside |navigation| (e.g.
     // URL, Referrer).  Calling SetPageState will clobber these values in
     // content::NavigationEntry (and FrameNavigationEntry(s) below).
-    entry->SetPageState(content::PageState::CreateFromEncodedData(
+    entry->SetPageState(blink::PageState::CreateFromEncodedData(
         navigation->encoded_page_state_));
 
     // |navigation|-level referrer information is redundant wrt PageState, but
diff --git a/components/sessions/content/content_serialized_navigation_builder_unittest.cc b/components/sessions/content/content_serialized_navigation_builder_unittest.cc
index a8d2d28..9c4e1d7 100644
--- a/components/sessions/content/content_serialized_navigation_builder_unittest.cc
+++ b/components/sessions/content/content_serialized_navigation_builder_unittest.cc
@@ -18,11 +18,11 @@
 #include "components/sessions/core/serialized_navigation_entry_test_helper.h"
 #include "content/public/browser/favicon_status.h"
 #include "content/public/browser/navigation_entry.h"
-#include "content/public/common/page_state.h"
 #include "content/public/common/referrer.h"
 #include "content/public/test/browser_task_environment.h"
 #include "content/public/test/test_browser_context.h"
 #include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/blink/public/common/page_state/page_state.h"
 
 namespace sessions {
 
diff --git a/components/sessions/content/content_serialized_navigation_driver.cc b/components/sessions/content/content_serialized_navigation_driver.cc
index 3521d41..017f8059 100644
--- a/components/sessions/content/content_serialized_navigation_driver.cc
+++ b/components/sessions/content/content_serialized_navigation_driver.cc
@@ -8,8 +8,8 @@
 
 #include "base/memory/singleton.h"
 #include "components/sessions/core/serialized_navigation_entry.h"
-#include "content/public/common/page_state.h"
 #include "services/network/public/mojom/referrer_policy.mojom.h"
+#include "third_party/blink/public/common/page_state/page_state.h"
 
 namespace sessions {
 
@@ -60,8 +60,8 @@
   if (!navigation->has_post_data())
     return navigation->encoded_page_state();
 
-  content::PageState page_state = content::PageState::CreateFromEncodedData(
-      navigation->encoded_page_state());
+  blink::PageState page_state =
+      blink::PageState::CreateFromEncodedData(navigation->encoded_page_state());
   return page_state.RemovePasswordData().ToEncodedData();
 }
 
@@ -71,7 +71,7 @@
 
 std::string ContentSerializedNavigationDriver::StripReferrerFromPageState(
       const std::string& page_state) const {
-  return content::PageState::CreateFromEncodedData(page_state)
+  return blink::PageState::CreateFromEncodedData(page_state)
       .RemoveReferrer()
       .ToEncodedData();
 }
diff --git a/components/signin/core/browser/android/BUILD.gn b/components/signin/core/browser/android/BUILD.gn
index 4b08d8a..a0f4d233 100644
--- a/components/signin/core/browser/android/BUILD.gn
+++ b/components/signin/core/browser/android/BUILD.gn
@@ -102,6 +102,7 @@
   testonly = true
   deps = [
     ":java",
+    ":signin_test_resources",
     "//base:base_java",
     "//base:base_java_test_support",
     "//third_party/android_deps:androidx_annotation_annotation_java",
@@ -116,4 +117,12 @@
     "javatests/src/org/chromium/components/signin/test/util/FakeAccountManagerFacade.java",
     "javatests/src/org/chromium/components/signin/test/util/FakeProfileDataSource.java",
   ]
+  resources_package = "org.chromium.components.signin.core.browser.javatests"
+}
+
+android_resources("signin_test_resources") {
+  testonly = true
+
+  create_srcjar = false
+  sources = [ "javatests/res/drawable/test_profile_picture.xml" ]
 }
diff --git a/components/signin/core/browser/android/javatests/res/drawable/test_profile_picture.xml b/components/signin/core/browser/android/javatests/res/drawable/test_profile_picture.xml
new file mode 100644
index 0000000..1ac46f0a
--- /dev/null
+++ b/components/signin/core/browser/android/javatests/res/drawable/test_profile_picture.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright 2020 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    tools:targetApi="21"
+    android:width="40dp"
+    android:height="40dp"
+    android:viewportWidth="192"
+    android:viewportHeight="192">
+
+    <path
+        android:fillColor="#1E8E3E"
+        android:pathData="M96,0C43.01,0,0,43.01,0,96s43.01,96,96,96s96-43.01,96-96S148.99,0,96,0z" />
+    <path
+        android:fillColor="#4C8BF5"
+        android:pathData="M96,85.09c13.28,0,24-10.72,24-24c0-13.28-10.72-24-24-24s-24,10.72-24,24
+C72,74.37,82.72,85.09,96,85.09z" />
+    <path
+        android:fillColor="#F4C20D"
+        android:pathData="M96,99.27c-29.33,0-52.36,14.18-52.36,27.27c11.09,17.06,30.51,28.36,52.36,28.36
+s41.27-11.3,52.36-28.36C148.36,113.45,125.33,99.27,96,99.27z" />
+    <path
+        android:pathData="M 0 0 H 192 V 192 H 0 V 0 Z" />
+</vector>
diff --git a/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager.cc b/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager.cc
index eaa76f7..2ba72ce3 100644
--- a/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager.cc
+++ b/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager.cc
@@ -404,6 +404,10 @@
   return base::nullopt;
 }
 
+void ContentSubresourceFilterThrottleManager::OnReloadRequested() {
+  client_->OnReloadRequested();
+}
+
 // static
 void ContentSubresourceFilterThrottleManager::LogAction(
     SubresourceFilterAction action) {
diff --git a/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager.h b/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager.h
index 73accaf..70df03b9 100644
--- a/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager.h
+++ b/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager.h
@@ -142,6 +142,10 @@
   base::Optional<LoadPolicy> LoadPolicyForLastCommittedNavigation(
       const content::RenderFrameHost* frame_host) const;
 
+  // Notifies the client that the user has requested a reload of a page with
+  // blocked ads (e.g., via an infobar).
+  void OnReloadRequested();
+
   static void LogAction(SubresourceFilterAction action);
 
  protected:
diff --git a/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager_unittest.cc b/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager_unittest.cc
index 8fc20b5..5a0bd11 100644
--- a/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager_unittest.cc
+++ b/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager_unittest.cc
@@ -196,6 +196,7 @@
   GetSafeBrowsingDatabaseManager() override {
     return database_manager_;
   }
+  void OnReloadRequested() override {}
 
   void CreateSafeBrowsingDatabaseManager() {
     database_manager_ =
diff --git a/components/subresource_filter/content/browser/subresource_filter_client.h b/components/subresource_filter/content/browser/subresource_filter_client.h
index 0614894..949c0363 100644
--- a/components/subresource_filter/content/browser/subresource_filter_client.h
+++ b/components/subresource_filter/content/browser/subresource_filter_client.h
@@ -53,6 +53,10 @@
   // client, or null if there is no such instance.
   virtual const scoped_refptr<safe_browsing::SafeBrowsingDatabaseManager>
   GetSafeBrowsingDatabaseManager() = 0;
+
+  // Invoked when the user has requested a reload of a page with blocked ads
+  // (e.g., via an infobar).
+  virtual void OnReloadRequested() = 0;
 };
 
 }  // namespace subresource_filter
diff --git a/components/subresource_filter/content/browser/subresource_filter_safe_browsing_activation_throttle_unittest.cc b/components/subresource_filter/content/browser/subresource_filter_safe_browsing_activation_throttle_unittest.cc
index bdbed24e..8a6089a 100644
--- a/components/subresource_filter/content/browser/subresource_filter_safe_browsing_activation_throttle_unittest.cc
+++ b/components/subresource_filter/content/browser/subresource_filter_safe_browsing_activation_throttle_unittest.cc
@@ -94,6 +94,7 @@
   MOCK_METHOD0(
       GetSafeBrowsingDatabaseManager,
       const scoped_refptr<safe_browsing::SafeBrowsingDatabaseManager>());
+  MOCK_METHOD0(OnReloadRequested, void());
 
   void AllowlistInCurrentWebContents(const GURL& url) {
     ASSERT_TRUE(url.SchemeIsHTTPOrHTTPS());
diff --git a/components/sync/driver/fake_sync_service.cc b/components/sync/driver/fake_sync_service.cc
index 14d2b87..ab543be 100644
--- a/components/sync/driver/fake_sync_service.cc
+++ b/components/sync/driver/fake_sync_service.cc
@@ -160,6 +160,11 @@
     const std::vector<std::vector<uint8_t>>& keys,
     int last_key_version) {}
 
+void FakeSyncService::AddTrustedVaultRecoveryMethodFromWeb(
+    const std::string& gaia_id,
+    const std::vector<uint8_t>& public_key,
+    base::OnceClosure callback) {}
+
 UserDemographicsResult FakeSyncService::GetUserNoisedBirthYearAndGender(
     base::Time now) {
   return UserDemographicsResult::ForStatus(
diff --git a/components/sync/driver/fake_sync_service.h b/components/sync/driver/fake_sync_service.h
index 2148c23f..055f05c0 100644
--- a/components/sync/driver/fake_sync_service.h
+++ b/components/sync/driver/fake_sync_service.h
@@ -70,6 +70,10 @@
       const std::string& gaia_id,
       const std::vector<std::vector<uint8_t>>& keys,
       int last_key_version) override;
+  void AddTrustedVaultRecoveryMethodFromWeb(
+      const std::string& gaia_id,
+      const std::vector<uint8_t>& public_key,
+      base::OnceClosure callback) override;
   UserDemographicsResult GetUserNoisedBirthYearAndGender(
       base::Time now) override;
 
diff --git a/components/sync/driver/mock_sync_service.h b/components/sync/driver/mock_sync_service.h
index cd2b9ec..315d6658 100644
--- a/components/sync/driver/mock_sync_service.h
+++ b/components/sync/driver/mock_sync_service.h
@@ -59,6 +59,10 @@
                void(const std::string& gaia_id,
                     const std::vector<std::vector<uint8_t>>& keys,
                     int last_key_version));
+  MOCK_METHOD3(AddTrustedVaultRecoveryMethodFromWeb,
+               void(const std::string& gaia_id,
+                    const std::vector<uint8_t>& public_key,
+                    base::OnceClosure callback));
   MOCK_METHOD1(GetUserNoisedBirthYearAndGender,
                UserDemographicsResult(base::Time now));
 
diff --git a/components/sync/driver/profile_sync_service.cc b/components/sync/driver/profile_sync_service.cc
index 94c28b8..82ec68f 100644
--- a/components/sync/driver/profile_sync_service.cc
+++ b/components/sync/driver/profile_sync_service.cc
@@ -1845,6 +1845,14 @@
                                                    last_key_version);
 }
 
+void ProfileSyncService::AddTrustedVaultRecoveryMethodFromWeb(
+    const std::string& gaia_id,
+    const std::vector<uint8_t>& public_key,
+    base::OnceClosure callback) {
+  sync_client_->GetTrustedVaultClient()->AddTrustedRecoveryMethod(
+      gaia_id, public_key, std::move(callback));
+}
+
 UserDemographicsResult ProfileSyncService::GetUserNoisedBirthYearAndGender(
     base::Time now) {
   // Do not provide the synced user’s birth year and gender when sync is
diff --git a/components/sync/driver/profile_sync_service.h b/components/sync/driver/profile_sync_service.h
index b809a57..df08badb 100644
--- a/components/sync/driver/profile_sync_service.h
+++ b/components/sync/driver/profile_sync_service.h
@@ -139,6 +139,10 @@
       const std::string& gaia_id,
       const std::vector<std::vector<uint8_t>>& keys,
       int last_key_version) override;
+  void AddTrustedVaultRecoveryMethodFromWeb(
+      const std::string& gaia_id,
+      const std::vector<uint8_t>& public_key,
+      base::OnceClosure callback) override;
   UserDemographicsResult GetUserNoisedBirthYearAndGender(
       base::Time now) override;
   void AddObserver(SyncServiceObserver* observer) override;
diff --git a/components/sync/driver/sync_service.h b/components/sync/driver/sync_service.h
index 27916b4..58118d5 100644
--- a/components/sync/driver/sync_service.h
+++ b/components/sync/driver/sync_service.h
@@ -365,6 +365,13 @@
       const std::vector<std::vector<uint8_t>>& keys,
       int last_key_version) = 0;
 
+  // Registers a new trusted recovery method that can be used to retrieve
+  // trusted vault encryption keys.
+  virtual void AddTrustedVaultRecoveryMethodFromWeb(
+      const std::string& gaia_id,
+      const std::vector<uint8_t>& public_key,
+      base::OnceClosure callback) = 0;
+
   //////////////////////////////////////////////////////////////////////////////
   // USER DEMOGRAPHICS
   //////////////////////////////////////////////////////////////////////////////
diff --git a/components/sync/driver/test_sync_service.cc b/components/sync/driver/test_sync_service.cc
index dfaba8a6..7d3745dd 100644
--- a/components/sync/driver/test_sync_service.cc
+++ b/components/sync/driver/test_sync_service.cc
@@ -303,6 +303,11 @@
     const std::vector<std::vector<uint8_t>>& keys,
     int last_key_version) {}
 
+void TestSyncService::AddTrustedVaultRecoveryMethodFromWeb(
+    const std::string& gaia_id,
+    const std::vector<uint8_t>& public_key,
+    base::OnceClosure callback) {}
+
 UserDemographicsResult TestSyncService::GetUserNoisedBirthYearAndGender(
     base::Time now) {
   return user_demographics_result_;
diff --git a/components/sync/driver/test_sync_service.h b/components/sync/driver/test_sync_service.h
index 9af2339..465e4b84 100644
--- a/components/sync/driver/test_sync_service.h
+++ b/components/sync/driver/test_sync_service.h
@@ -107,6 +107,10 @@
       const std::string& gaia_id,
       const std::vector<std::vector<uint8_t>>& keys,
       int last_key_version) override;
+  void AddTrustedVaultRecoveryMethodFromWeb(
+      const std::string& gaia_id,
+      const std::vector<uint8_t>& public_key,
+      base::OnceClosure callback) override;
   UserDemographicsResult GetUserNoisedBirthYearAndGender(
       base::Time now) override;
 
diff --git a/components/sync/trusted_vault/standalone_trusted_vault_backend.cc b/components/sync/trusted_vault/standalone_trusted_vault_backend.cc
index 3fc7b86..686a18b 100644
--- a/components/sync/trusted_vault/standalone_trusted_vault_backend.cc
+++ b/components/sync/trusted_vault/standalone_trusted_vault_backend.cc
@@ -227,11 +227,6 @@
   delegate_->NotifyRecoverabilityDegradedChanged();
 }
 
-void StandaloneTrustedVaultBackend::ResolveRecoverabilityDegradedForTesting() {
-  is_recoverability_degraded_for_testing_ = false;
-  delegate_->NotifyRecoverabilityDegradedChanged();
-}
-
 void StandaloneTrustedVaultBackend::MaybeRegisterDevice(
     const std::string& gaia_id) {
   if (!base::FeatureList::IsEnabled(switches::kFollowTrustedVaultKeyRotation)) {
diff --git a/components/sync/trusted_vault/standalone_trusted_vault_backend.h b/components/sync/trusted_vault/standalone_trusted_vault_backend.h
index dd2df4d..17e623b6a4 100644
--- a/components/sync/trusted_vault/standalone_trusted_vault_backend.h
+++ b/components/sync/trusted_vault/standalone_trusted_vault_backend.h
@@ -96,7 +96,6 @@
       const std::string& gaia_id);
 
   void SetRecoverabilityDegradedForTesting();
-  void ResolveRecoverabilityDegradedForTesting();
 
  private:
   friend class base::RefCountedThreadSafe<StandaloneTrustedVaultBackend>;
diff --git a/components/sync/trusted_vault/standalone_trusted_vault_client.cc b/components/sync/trusted_vault/standalone_trusted_vault_client.cc
index daf6a02..89ec7c1 100644
--- a/components/sync/trusted_vault/standalone_trusted_vault_client.cc
+++ b/components/sync/trusted_vault/standalone_trusted_vault_client.cc
@@ -276,15 +276,6 @@
           backend_));
 }
 
-void StandaloneTrustedVaultClient::ResolveRecoverabilityDegradedForTesting() {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  DCHECK(backend_);
-  backend_task_runner_->PostTask(
-      FROM_HERE, base::BindOnce(&StandaloneTrustedVaultBackend::
-                                    ResolveRecoverabilityDegradedForTesting,
-                                backend_));
-}
-
 void StandaloneTrustedVaultClient::NotifyRecoverabilityDegradedChanged() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   recoverability_observer_list_.Notify();
diff --git a/components/sync/trusted_vault/standalone_trusted_vault_client.h b/components/sync/trusted_vault/standalone_trusted_vault_client.h
index 0c2828f..1c10255 100644
--- a/components/sync/trusted_vault/standalone_trusted_vault_client.h
+++ b/components/sync/trusted_vault/standalone_trusted_vault_client.h
@@ -76,7 +76,6 @@
       base::OnceCallback<void(const base::Optional<CoreAccountInfo>&)> callback)
       const;
   void SetRecoverabilityDegradedForTesting();
-  void ResolveRecoverabilityDegradedForTesting();
 
  private:
   void NotifyRecoverabilityDegradedChanged();
diff --git a/components/sync_bookmarks/synced_bookmark_tracker_unittest.cc b/components/sync_bookmarks/synced_bookmark_tracker_unittest.cc
index ed8ce4d..49e9168 100644
--- a/components/sync_bookmarks/synced_bookmark_tracker_unittest.cc
+++ b/components/sync_bookmarks/synced_bookmark_tracker_unittest.cc
@@ -572,7 +572,7 @@
 
   histogram_tester.ExpectUniqueSample(
       "Sync.BookmarksModelMetadataCorruptionReason",
-      /*sample=*/ExpectedCorruptionReason::NO_CORRUPTION, /*count=*/1);
+      /*sample=*/ExpectedCorruptionReason::NO_CORRUPTION, /*expected_count=*/1);
 }
 
 TEST(SyncedBookmarkTrackerTest, ShouldInvalidateMetadataIfMissingMobileFolder) {
diff --git a/components/viz/service/display_embedder/skia_output_device_buffer_queue.cc b/components/viz/service/display_embedder/skia_output_device_buffer_queue.cc
index 1666ec0..5efbb28 100644
--- a/components/viz/service/display_embedder/skia_output_device_buffer_queue.cc
+++ b/components/viz/service/display_embedder/skia_output_device_buffer_queue.cc
@@ -114,16 +114,6 @@
   capabilities_.only_invalidates_damage_rect = false;
   capabilities_.number_of_buffers = 3;
   capabilities_.orientation_mode = OutputSurface::OrientationMode::kHardware;
-#if defined(OS_ANDROID)
-  // With vulkan, if the chrome is launched in landscape mode, the chrome is
-  // always blank until chrome window is rotated once. Workaround this problem
-  // by using logic rotation mode.
-  // TODO(https://crbug.com/1115065): use hardware orientation mode for vulkan,
-  if (dependency_->GetSharedContextState()->GrContextIsVulkan() &&
-      base::FeatureList::GetFieldTrial(features::kVulkan)) {
-    capabilities_.orientation_mode = OutputSurface::OrientationMode::kLogic;
-  }
-#endif
 
   // Force the number of max pending frames to one when the switch
   // "double-buffer-compositing" is passed.
diff --git a/content/browser/BUILD.gn b/content/browser/BUILD.gn
index 2e2725ec..ea3dbb3 100644
--- a/content/browser/BUILD.gn
+++ b/content/browser/BUILD.gn
@@ -1471,6 +1471,8 @@
     "renderer_host/p2p/socket_dispatcher_host.h",
     "renderer_host/page_lifecycle_state_manager.cc",
     "renderer_host/page_lifecycle_state_manager.h",
+    "renderer_host/policy_container.cc",
+    "renderer_host/policy_container.h",
     "renderer_host/raw_clipboard_host_impl.cc",
     "renderer_host/raw_clipboard_host_impl.h",
     "renderer_host/render_frame_host_delegate.cc",
diff --git a/content/browser/back_forward_cache_browsertest.cc b/content/browser/back_forward_cache_browsertest.cc
index 115f3b5..62084d4 100644
--- a/content/browser/back_forward_cache_browsertest.cc
+++ b/content/browser/back_forward_cache_browsertest.cc
@@ -3444,16 +3444,9 @@
 // Same test as above, but with eviction happening before URL loader starts a
 // response.
 // Flaky on most platforms (see crbug.com/1136683)
-#if defined(OS_MAC)
-#define MAYBE_ReissuesNavigationIfEvictedDuringNavigation_BeforeResponse \
-  DISABLED_ReissuesNavigationIfEvictedDuringNavigation_BeforeResponse
-#else
-#define MAYBE_ReissuesNavigationIfEvictedDuringNavigation_BeforeResponse \
-  ReissuesNavigationIfEvictedDuringNavigation_BeforeResponse
-#endif
 IN_PROC_BROWSER_TEST_F(
     BackForwardCacheBrowserTest,
-    MAYBE_ReissuesNavigationIfEvictedDuringNavigation_BeforeResponse) {
+    DISABLED_ReissuesNavigationIfEvictedDuringNavigation_BeforeResponse) {
   ASSERT_TRUE(embedded_test_server()->Start());
   GURL url_a(embedded_test_server()->GetURL("a.com", "/title1.html"));
   GURL url_b(embedded_test_server()->GetURL("b.com", "/title2.html"));
diff --git a/content/browser/devtools/protocol/network_handler.cc b/content/browser/devtools/protocol/network_handler.cc
index e66cde0..52d124e2 100644
--- a/content/browser/devtools/protocol/network_handler.cc
+++ b/content/browser/devtools/protocol/network_handler.cc
@@ -43,6 +43,7 @@
 #include "content/browser/web_package/signed_exchange_envelope.h"
 #include "content/browser/web_package/signed_exchange_error.h"
 #include "content/common/navigation_params.h"
+#include "content/common/navigation_params.mojom.h"
 #include "content/common/web_package/signed_exchange_utils.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/browser_task_traits.h"
@@ -1611,6 +1612,48 @@
   return blockedReason(static_cast<blink::ResourceRequestBlockedReason>(
       status.extended_error_code));
 }
+
+String GetTrustTokenOperationType(
+    network::mojom::TrustTokenOperationType type) {
+  switch (type) {
+    case network::mojom::TrustTokenOperationType::kIssuance:
+      return protocol::Network::TrustTokenOperationTypeEnum::Issuance;
+    case network::mojom::TrustTokenOperationType::kRedemption:
+      return protocol::Network::TrustTokenOperationTypeEnum::Redemption;
+    case network::mojom::TrustTokenOperationType::kSigning:
+      return protocol::Network::TrustTokenOperationTypeEnum::Signing;
+  }
+}
+
+String GetTrustTokenRefreshPolicy(
+    network::mojom::TrustTokenRefreshPolicy policy) {
+  switch (policy) {
+    case network::mojom::TrustTokenRefreshPolicy::kUseCached:
+      return protocol::Network::TrustTokenParams::RefreshPolicyEnum::UseCached;
+    case network::mojom::TrustTokenRefreshPolicy::kRefresh:
+      return protocol::Network::TrustTokenParams::RefreshPolicyEnum::Refresh;
+  }
+}
+
+std::unique_ptr<protocol::Network::TrustTokenParams> BuildTrustTokenParams(
+    const network::mojom::TrustTokenParams& params) {
+  auto protocol_params =
+      protocol::Network::TrustTokenParams::Create()
+          .SetType(GetTrustTokenOperationType(params.type))
+          .SetRefreshPolicy(GetTrustTokenRefreshPolicy(params.refresh_policy))
+          .Build();
+
+  if (!params.issuers.empty()) {
+    auto issuers = std::make_unique<protocol::Array<protocol::String>>();
+    for (const auto& issuer : params.issuers) {
+      issuers->push_back(issuer.Serialize());
+    }
+    protocol_params->SetIssuers(std::move(issuers));
+  }
+
+  return protocol_params;
+}
+
 }  // namespace
 
 void NetworkHandler::NavigationRequestWillBeSent(
@@ -1685,6 +1728,13 @@
   double current_wall_time = base::Time::Now().ToDoubleT();
   std::string frame_token =
       nav_request.frame_tree_node()->devtools_frame_token().ToString();
+
+  const mojom::BeginNavigationParams* begin_params = nav_request.begin_params();
+  if (begin_params->trust_token_params) {
+    request->SetTrustTokenParams(
+        BuildTrustTokenParams(*begin_params->trust_token_params));
+  }
+
   frontend_->RequestWillBeSent(
       id, id, url_without_fragment, std::move(request), current_ticks,
       current_wall_time, std::move(initiator), std::move(redirect_response),
@@ -1720,6 +1770,10 @@
           .Build();
   if (!url_fragment.empty())
     request_object->SetUrlFragment(url_fragment);
+  if (request.trust_token_params.has_value()) {
+    request_object->SetTrustTokenParams(
+        BuildTrustTokenParams(request.trust_token_params.value()));
+  }
   frontend_->RequestWillBeSent(
       request_id, loader_id, url_without_fragment, std::move(request_object),
       timestamp.since_origin().InSecondsF(), base::Time::Now().ToDoubleT(),
diff --git a/content/browser/gpu/gpu_process_host.cc b/content/browser/gpu/gpu_process_host.cc
index de4eada..aa76137 100644
--- a/content/browser/gpu/gpu_process_host.cc
+++ b/content/browser/gpu/gpu_process_host.cc
@@ -231,6 +231,7 @@
 #endif
 #if defined(OS_WIN)
     switches::kDisableHighResTimer,
+    switches::kRaiseTimerFrequency,
 #endif  // defined(OS_WIN)
     switches::kEnableANGLEFeatures,
     switches::kDisableANGLEFeatures,
diff --git a/content/browser/renderer_host/frame_navigation_entry.cc b/content/browser/renderer_host/frame_navigation_entry.cc
index cfd0452..6f4e955a0 100644
--- a/content/browser/renderer_host/frame_navigation_entry.cc
+++ b/content/browser/renderer_host/frame_navigation_entry.cc
@@ -9,7 +9,7 @@
 #include "base/stl_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "content/browser/web_package/web_bundle_navigation_info.h"
-#include "content/common/page_state_serialization.h"
+#include "third_party/blink/public/common/page_state/page_state_serialization.h"
 
 namespace content {
 
@@ -27,7 +27,7 @@
     const Referrer& referrer,
     const base::Optional<url::Origin>& initiator_origin,
     const std::vector<GURL>& redirect_chain,
-    const PageState& page_state,
+    const blink::PageState& page_state,
     const std::string& method,
     int64_t post_id,
     scoped_refptr<network::SharedURLLoaderFactory> blob_url_loader_factory,
@@ -80,7 +80,7 @@
     const Referrer& referrer,
     const base::Optional<url::Origin>& initiator_origin,
     const std::vector<GURL>& redirect_chain,
-    const PageState& page_state,
+    const blink::PageState& page_state,
     const std::string& method,
     int64_t post_id,
     scoped_refptr<network::SharedURLLoaderFactory> blob_url_loader_factory,
@@ -118,11 +118,11 @@
   document_sequence_number_ = document_sequence_number;
 }
 
-void FrameNavigationEntry::SetPageState(const PageState& page_state) {
+void FrameNavigationEntry::SetPageState(const blink::PageState& page_state) {
   page_state_ = page_state;
 
-  ExplodedPageState exploded_state;
-  if (!DecodePageState(page_state_.ToEncodedData(), &exploded_state))
+  blink::ExplodedPageState exploded_state;
+  if (!blink::DecodePageState(page_state_.ToEncodedData(), &exploded_state))
     return;
 
   item_sequence_number_ = exploded_state.top.item_sequence_number;
@@ -142,8 +142,8 @@
     return nullptr;
 
   // Generate the body from the PageState.
-  ExplodedPageState exploded_state;
-  if (!DecodePageState(page_state_.ToEncodedData(), &exploded_state))
+  blink::ExplodedPageState exploded_state;
+  if (!blink::DecodePageState(page_state_.ToEncodedData(), &exploded_state))
     return nullptr;
 
   *content_type = base::UTF16ToASCII(
diff --git a/content/browser/renderer_host/frame_navigation_entry.h b/content/browser/renderer_host/frame_navigation_entry.h
index ac7335d..635a2bbc3 100644
--- a/content/browser/renderer_host/frame_navigation_entry.h
+++ b/content/browser/renderer_host/frame_navigation_entry.h
@@ -11,10 +11,10 @@
 #include "base/memory/ref_counted.h"
 #include "base/optional.h"
 #include "content/browser/site_instance_impl.h"
-#include "content/public/common/page_state.h"
 #include "content/public/common/referrer.h"
 #include "services/network/public/cpp/resource_request_body.h"
 #include "services/network/public/cpp/shared_url_loader_factory.h"
+#include "third_party/blink/public/common/page_state/page_state.h"
 #include "url/gurl.h"
 #include "url/origin.h"
 
@@ -51,7 +51,7 @@
       const Referrer& referrer,
       const base::Optional<url::Origin>& initiator_origin,
       const std::vector<GURL>& redirect_chain,
-      const PageState& page_state,
+      const blink::PageState& page_state,
       const std::string& method,
       int64_t post_id,
       scoped_refptr<network::SharedURLLoaderFactory> blob_url_loader_factory,
@@ -73,7 +73,7 @@
       const Referrer& referrer,
       const base::Optional<url::Origin>& initiator_origin,
       const std::vector<GURL>& redirect_chain,
-      const PageState& page_state,
+      const blink::PageState& page_state,
       const std::string& method,
       int64_t post_id,
       scoped_refptr<network::SharedURLLoaderFactory> blob_url_loader_factory,
@@ -160,8 +160,8 @@
   }
   const std::vector<GURL>& redirect_chain() const { return redirect_chain_; }
 
-  void SetPageState(const PageState& page_state);
-  const PageState& page_state() const { return page_state_; }
+  void SetPageState(const blink::PageState& page_state);
+  const blink::PageState& page_state() const { return page_state_; }
 
   // Remember the set of bindings granted to this FrameNavigationEntry at the
   // time of commit, to ensure that we do not grant it additional bindings if we
@@ -230,7 +230,7 @@
   // It is preserved after commit but should not be persisted.
   std::vector<GURL> redirect_chain_;
   // TODO(creis): Change this to FrameState.
-  PageState page_state_;
+  blink::PageState page_state_;
   // TODO(creis): Persist bindings_. https://crbug.com/173672.
   int bindings_ = kInvalidBindings;
   std::string method_;
diff --git a/content/browser/renderer_host/navigation_controller_impl.cc b/content/browser/renderer_host/navigation_controller_impl.cc
index 6e2b985..81eb6e0 100644
--- a/content/browser/renderer_host/navigation_controller_impl.cc
+++ b/content/browser/renderer_host/navigation_controller_impl.cc
@@ -2335,8 +2335,8 @@
         node, -1, -1, nullptr,
         static_cast<SiteInstanceImpl*>(source_site_instance), url,
         base::nullopt /* commit_origin */, referrer, initiator_origin,
-        std::vector<GURL>(), PageState(), method, -1, blob_url_loader_factory,
-        nullptr /* web_bundle_navigation_info */);
+        std::vector<GURL>(), blink::PageState(), method, -1,
+        blob_url_loader_factory, nullptr /* web_bundle_navigation_info */);
   } else {
     // Main frame case.
     entry = NavigationEntryImpl::FromNavigationEntry(CreateNavigationEntry(
@@ -2367,7 +2367,7 @@
         node->unique_name(), -1, -1, nullptr,
         static_cast<SiteInstanceImpl*>(source_site_instance), url,
         nullptr /* origin */, referrer, initiator_origin, std::vector<GURL>(),
-        PageState(), method, -1, blob_url_loader_factory,
+        blink::PageState(), method, -1, blob_url_loader_factory,
         nullptr /* web_bundle_navigation_info */);
   }
 
@@ -3140,8 +3140,8 @@
         node, -1, -1, nullptr,
         static_cast<SiteInstanceImpl*>(params.source_site_instance.get()),
         params.url, base::nullopt, params.referrer, params.initiator_origin,
-        params.redirect_chain, PageState(), "GET", -1, blob_url_loader_factory,
-        nullptr /* web_bundle_navigation_info */);
+        params.redirect_chain, blink::PageState(), "GET", -1,
+        blob_url_loader_factory, nullptr /* web_bundle_navigation_info */);
   } else {
     // Otherwise, create a pending entry for the main frame.
     entry = NavigationEntryImpl::FromNavigationEntry(CreateNavigationEntry(
diff --git a/content/browser/renderer_host/navigation_controller_impl_browsertest.cc b/content/browser/renderer_host/navigation_controller_impl_browsertest.cc
index 97aeba4b..4fb60640 100644
--- a/content/browser/renderer_host/navigation_controller_impl_browsertest.cc
+++ b/content/browser/renderer_host/navigation_controller_impl_browsertest.cc
@@ -37,7 +37,6 @@
 #include "content/browser/web_contents/web_contents_view.h"
 #include "content/common/content_navigation_policy.h"
 #include "content/common/frame_messages.h"
-#include "content/common/page_state_serialization.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/browser_task_traits.h"
 #include "content/public/browser/browser_thread.h"
@@ -74,6 +73,7 @@
 #include "net/test/embedded_test_server/http_request.h"
 #include "net/test/url_request/url_request_failed_job.h"
 #include "testing/gmock/include/gmock/gmock.h"
+#include "third_party/blink/public/common/page_state/page_state_serialization.h"
 #include "third_party/blink/public/mojom/frame/frame.mojom-test-utils.h"
 #include "third_party/blink/public/mojom/frame/user_activation_update_types.mojom.h"
 #include "third_party/blink/public/mojom/renderer_preferences.mojom.h"
@@ -4267,7 +4267,7 @@
               main_url, Referrer(), base::nullopt, ui::PAGE_TRANSITION_RELOAD,
               false, std::string(), controller.GetBrowserContext(),
               nullptr /* blob_url_loader_factory */));
-  restored_entry->SetPageState(PageState::CreateFromURL(main_url));
+  restored_entry->SetPageState(blink::PageState::CreateFromURL(main_url));
   EXPECT_EQ(0U, restored_entry->root_node()->children.size());
 
   // Restore the new entry in a new tab and verify the iframe loads and has
@@ -6349,9 +6349,9 @@
   // Check the PageState of the previous entry to ensure it isn't corrupted.
   NavigationEntry* entry = controller.GetEntryAtIndex(1);
   EXPECT_EQ(url_a, entry->GetURL());
-  ExplodedPageState exploded_state;
-  EXPECT_TRUE(
-      DecodePageState(entry->GetPageState().ToEncodedData(), &exploded_state));
+  blink::ExplodedPageState exploded_state;
+  EXPECT_TRUE(blink::DecodePageState(entry->GetPageState().ToEncodedData(),
+                                     &exploded_state));
   EXPECT_EQ(url_a,
             GURL(exploded_state.top.url_string.value_or(base::string16())));
   EXPECT_EQ(frame_url_a2,
@@ -6469,9 +6469,9 @@
   EXPECT_EQ(url_b, root->current_url());
   NavigationEntry* entry = controller.GetLastCommittedEntry();
   EXPECT_EQ(url_b, entry->GetURL());
-  ExplodedPageState exploded_state;
-  EXPECT_TRUE(
-      DecodePageState(entry->GetPageState().ToEncodedData(), &exploded_state));
+  blink::ExplodedPageState exploded_state;
+  EXPECT_TRUE(blink::DecodePageState(entry->GetPageState().ToEncodedData(),
+                                     &exploded_state));
   EXPECT_EQ(url_b,
             GURL(exploded_state.top.url_string.value_or(base::string16())));
   EXPECT_EQ(0U, exploded_state.top.children.size());
@@ -6563,9 +6563,9 @@
   EXPECT_EQ(data_url, root->child_at(0)->current_url());
   NavigationEntry* entry = controller.GetLastCommittedEntry();
   EXPECT_EQ(url_b, entry->GetURL());
-  ExplodedPageState exploded_state;
-  EXPECT_TRUE(
-      DecodePageState(entry->GetPageState().ToEncodedData(), &exploded_state));
+  blink::ExplodedPageState exploded_state;
+  EXPECT_TRUE(blink::DecodePageState(entry->GetPageState().ToEncodedData(),
+                                     &exploded_state));
   EXPECT_EQ(url_b,
             GURL(exploded_state.top.url_string.value_or(base::string16())));
 
diff --git a/content/browser/renderer_host/navigation_controller_impl_unittest.cc b/content/browser/renderer_host/navigation_controller_impl_unittest.cc
index 5e31dca..3113294 100644
--- a/content/browser/renderer_host/navigation_controller_impl_unittest.cc
+++ b/content/browser/renderer_host/navigation_controller_impl_unittest.cc
@@ -39,7 +39,6 @@
 #include "content/public/browser/web_contents_delegate.h"
 #include "content/public/browser/web_contents_observer.h"
 #include "content/public/common/bindings_policy.h"
-#include "content/public/common/page_state.h"
 #include "content/public/common/page_type.h"
 #include "content/public/common/url_constants.h"
 #include "content/public/test/mock_render_process_host.h"
@@ -55,6 +54,7 @@
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/blink/public/common/frame/frame_policy.h"
 #include "third_party/blink/public/common/loader/previews_state.h"
+#include "third_party/blink/public/common/page_state/page_state.h"
 #include "third_party/blink/public/mojom/frame/frame_owner_properties.mojom.h"
 #include "third_party/blink/public/mojom/frame/user_activation_update_types.mojom.h"
 
@@ -2282,7 +2282,7 @@
   params.should_update_history = false;
   params.gesture = NavigationGestureUser;
   params.method = "GET";
-  params.page_state = PageState::CreateFromURL(url2);
+  params.page_state = blink::PageState::CreateFromURL(url2);
 
   // This should NOT generate a new entry, nor prune the list.
   LoadCommittedDetailsObserver observer(contents());
@@ -2301,7 +2301,7 @@
   params.nav_entry_id = 0;
   params.did_create_new_entry = true;
   params.url = url;
-  params.page_state = PageState::CreateFromURL(url);
+  params.page_state = blink::PageState::CreateFromURL(url);
   main_test_rfh()->SendRendererInitiatedNavigationRequest(url, false);
   main_test_rfh()->PrepareForCommit();
   contents()->GetMainFrame()->SendNavigateWithParams(&params, true);
@@ -3003,7 +3003,7 @@
   params.origin = file_origin;
   params.transition = ui::PAGE_TRANSITION_LINK;
   params.gesture = NavigationGestureUser;
-  params.page_state = PageState::CreateFromURL(different_origin_url);
+  params.page_state = blink::PageState::CreateFromURL(different_origin_url);
   params.method = "GET";
   params.post_id = -1;
   main_test_rfh()->SendRendererInitiatedNavigationRequest(different_origin_url,
@@ -4050,7 +4050,7 @@
   params.nav_entry_id = 0;
   params.did_create_new_entry = true;
   params.url = kUrl2;
-  params.page_state = PageState::CreateFromURL(kUrl2);
+  params.page_state = blink::PageState::CreateFromURL(kUrl2);
   main_test_rfh()->SendNavigateWithParams(&params, true);
 
   // The title should immediately be visible on the new NavigationEntry.
@@ -4161,7 +4161,7 @@
   params.url = url;
   params.transition = ui::PAGE_TRANSITION_LINK;
   params.gesture = NavigationGestureUser;
-  params.page_state = PageState::CreateFromURL(url);
+  params.page_state = blink::PageState::CreateFromURL(url);
   params.method = "POST";
   params.post_id = 2;
   params.url_is_unreachable = true;
diff --git a/content/browser/renderer_host/navigation_entry_impl.cc b/content/browser/renderer_host/navigation_entry_impl.cc
index aaae7044..b6030282 100644
--- a/content/browser/renderer_host/navigation_entry_impl.cc
+++ b/content/browser/renderer_host/navigation_entry_impl.cc
@@ -24,11 +24,11 @@
 #include "content/browser/web_package/web_bundle_navigation_info.h"
 #include "content/common/content_constants_internal.h"
 #include "content/common/navigation_params.h"
-#include "content/common/page_state_serialization.h"
 #include "content/public/browser/reload_type.h"
 #include "content/public/common/content_constants.h"
 #include "content/public/common/url_constants.h"
 #include "services/metrics/public/cpp/ukm_source_id.h"
+#include "third_party/blink/public/common/page_state/page_state_serialization.h"
 #include "third_party/blink/public/mojom/frame/frame.mojom.h"
 #include "ui/gfx/text_elider.h"
 
@@ -50,11 +50,11 @@
 }
 
 void RecursivelyGenerateFrameEntries(
-    const ExplodedFrameState& state,
+    const blink::ExplodedFrameState& state,
     const std::vector<base::Optional<base::string16>>& referenced_files,
     NavigationEntryImpl::TreeNode* node) {
   // Set a single-frame PageState on the entry.
-  ExplodedPageState page_state;
+  blink::ExplodedPageState page_state;
 
   // Copy the incoming PageState's list of referenced files into the main
   // frame's PageState.  (We don't pass the list to subframes below.)
@@ -66,7 +66,7 @@
 
   page_state.top = state;
   std::string data;
-  EncodePageState(page_state, &data);
+  blink::EncodePageState(page_state, &data);
   DCHECK(!data.empty()) << "Shouldn't generate an empty PageState.";
 
   node->frame_entry = base::MakeRefCounted<FrameNavigationEntry>(
@@ -79,7 +79,7 @@
       Referrer(GURL(state.referrer.value_or(base::string16())),
                state.referrer_policy),
       state.initiator_origin, std::vector<GURL>(),
-      PageState::CreateFromEncodedData(data), "GET", -1,
+      blink::PageState::CreateFromEncodedData(data), "GET", -1,
       nullptr /* blob_url_loader_factory */,
       nullptr /* web_bundle_navigation_info */);
 
@@ -88,7 +88,7 @@
   // RecursivelyGenerateFrameState).
   std::vector<base::Optional<base::string16>> empty_file_list;
 
-  for (const ExplodedFrameState& child_state : state.children) {
+  for (const blink::ExplodedFrameState& child_state : state.children) {
     node->children.push_back(
         std::make_unique<NavigationEntryImpl::TreeNode>(node, nullptr));
     RecursivelyGenerateFrameEntries(child_state, empty_file_list,
@@ -104,17 +104,17 @@
 
 void RecursivelyGenerateFrameState(
     NavigationEntryImpl::TreeNode* node,
-    ExplodedFrameState* state,
+    blink::ExplodedFrameState* state,
     std::vector<base::Optional<base::string16>>* referenced_files) {
   // The FrameNavigationEntry's PageState contains just the ExplodedFrameState
   // for that particular frame.
-  ExplodedPageState exploded_page_state;
-  if (!DecodePageState(node->frame_entry->page_state().ToEncodedData(),
-                       &exploded_page_state)) {
+  blink::ExplodedPageState exploded_page_state;
+  if (!blink::DecodePageState(node->frame_entry->page_state().ToEncodedData(),
+                              &exploded_page_state)) {
     NOTREACHED();
     return;
   }
-  ExplodedFrameState frame_state = exploded_page_state.top;
+  blink::ExplodedFrameState frame_state = exploded_page_state.top;
 
   // Copy the FrameNavigationEntry's frame state into the destination state.
   *state = frame_state;
@@ -331,7 +331,7 @@
               referrer,
               initiator_origin,
               std::vector<GURL>(),
-              PageState(),
+              blink::PageState(),
               "GET",
               -1,
               std::move(blob_url_loader_factory),
@@ -425,7 +425,7 @@
   return title_;
 }
 
-void NavigationEntryImpl::SetPageState(const PageState& state) {
+void NavigationEntryImpl::SetPageState(const blink::PageState& state) {
   DCHECK(state.IsValid());
 
   // SetPageState should only be called before the NavigationEntry has been
@@ -442,8 +442,8 @@
 
   // If the PageState can't be parsed, just store it on the main frame's
   // FrameNavigationEntry without recursively creating subframe entries.
-  ExplodedPageState exploded_state;
-  if (!DecodePageState(state.ToEncodedData(), &exploded_state)) {
+  blink::ExplodedPageState exploded_state;
+  if (!blink::DecodePageState(state.ToEncodedData(), &exploded_state)) {
     frame_tree_->frame_entry->SetPageState(state);
     return;
   }
@@ -452,16 +452,16 @@
       exploded_state.top, exploded_state.referenced_files, frame_tree_.get());
 }
 
-PageState NavigationEntryImpl::GetPageState() {
+blink::PageState NavigationEntryImpl::GetPageState() {
   // Each FrameNavigationEntry has a frame-specific PageState.  We combine these
   // into an ExplodedPageState tree and generate a full PageState from it.
-  ExplodedPageState exploded_state;
+  blink::ExplodedPageState exploded_state;
   RecursivelyGenerateFrameState(frame_tree_.get(), &exploded_state.top,
                                 &exploded_state.referenced_files);
 
   std::string encoded_data;
-  EncodePageState(exploded_state, &encoded_data);
-  return PageState::CreateFromEncodedData(encoded_data);
+  blink::EncodePageState(exploded_state, &encoded_data);
+  return blink::PageState::CreateFromEncodedData(encoded_data);
 }
 
 void NavigationEntryImpl::set_site_instance(
@@ -848,7 +848,7 @@
     const Referrer& referrer,
     const base::Optional<url::Origin>& initiator_origin,
     const std::vector<GURL>& redirect_chain,
-    const PageState& page_state,
+    const blink::PageState& page_state,
     const std::string& method,
     int64_t post_id,
     scoped_refptr<network::SharedURLLoaderFactory> blob_url_loader_factory,
@@ -942,10 +942,11 @@
       // See RenderProcessHostImpl::FilterURL to know which URLs are rewritten.
       // See https://crbug.com/657896 for details.
       bool is_about_blank = false;
-      ExplodedPageState exploded_page_state;
-      if (DecodePageState(child->frame_entry->page_state().ToEncodedData(),
-                          &exploded_page_state)) {
-        ExplodedFrameState frame_state = exploded_page_state.top;
+      blink::ExplodedPageState exploded_page_state;
+      if (blink::DecodePageState(
+              child->frame_entry->page_state().ToEncodedData(),
+              &exploded_page_state)) {
+        blink::ExplodedFrameState frame_state = exploded_page_state.top;
         if (UTF16ToUTF8(frame_state.url_string.value_or(base::string16())) ==
             url::kAboutBlankURL)
           is_about_blank = true;
diff --git a/content/browser/renderer_host/navigation_entry_impl.h b/content/browser/renderer_host/navigation_entry_impl.h
index f96aea9..ef1e96e 100644
--- a/content/browser/renderer_host/navigation_entry_impl.h
+++ b/content/browser/renderer_host/navigation_entry_impl.h
@@ -29,9 +29,9 @@
 #include "content/public/browser/replaced_navigation_entry_data.h"
 #include "content/public/browser/restore_type.h"
 #include "content/public/browser/ssl_status.h"
-#include "content/public/common/page_state.h"
 #include "net/base/isolation_info.h"
 #include "third_party/blink/public/common/loader/previews_state.h"
+#include "third_party/blink/public/common/page_state/page_state.h"
 #include "url/origin.h"
 
 namespace content {
@@ -114,8 +114,8 @@
   const GURL& GetVirtualURL() override;
   void SetTitle(const base::string16& title) override;
   const base::string16& GetTitle() override;
-  void SetPageState(const PageState& state) override;
-  PageState GetPageState() override;
+  void SetPageState(const blink::PageState& state) override;
+  blink::PageState GetPageState() override;
   const base::string16& GetTitleForDisplay() override;
   bool IsViewSourceMode() override;
   void SetTransitionType(ui::PageTransition transition_type) override;
@@ -229,7 +229,7 @@
       const Referrer& referrer,
       const base::Optional<url::Origin>& initiator_origin,
       const std::vector<GURL>& redirect_chain,
-      const PageState& page_state,
+      const blink::PageState& page_state,
       const std::string& method,
       int64_t post_id,
       scoped_refptr<network::SharedURLLoaderFactory> blob_url_loader_factory,
diff --git a/content/browser/renderer_host/navigation_entry_impl_unittest.cc b/content/browser/renderer_host/navigation_entry_impl_unittest.cc
index 23a9adf6..187da4c 100644
--- a/content/browser/renderer_host/navigation_entry_impl_unittest.cc
+++ b/content/browser/renderer_host/navigation_entry_impl_unittest.cc
@@ -15,11 +15,11 @@
 #include "base/time/time.h"
 #include "build/build_config.h"
 #include "content/browser/site_instance_impl.h"
-#include "content/common/page_state_serialization.h"
 #include "content/public/browser/ssl_status.h"
 #include "content/public/test/browser_task_environment.h"
 #include "content/public/test/test_browser_context.h"
 #include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/blink/public/common/page_state/page_state_serialization.h"
 
 using base::ASCIIToUTF16;
 
@@ -51,11 +51,11 @@
   DISALLOW_COPY_AND_ASSIGN(TestSSLStatusData);
 };
 
-PageState CreateTestPageState() {
-  ExplodedPageState exploded_state;
+blink::PageState CreateTestPageState() {
+  blink::ExplodedPageState exploded_state;
   std::string encoded_data;
-  EncodePageState(exploded_state, &encoded_data);
-  return PageState::CreateFromEncodedData(encoded_data);
+  blink::EncodePageState(exploded_state, &encoded_data);
+  return blink::PageState::CreateFromEncodedData(encoded_data);
 }
 
 }  // namespace
@@ -309,7 +309,7 @@
   // Note that calling SetPageState may also set some other FNE members
   // (referrer, initiator, etc.).  This is why it is important to test
   // SetPageState/GetPageState last.
-  PageState test_page_state = CreateTestPageState();
+  blink::PageState test_page_state = CreateTestPageState();
   entry2_->SetPageState(test_page_state);
   EXPECT_EQ(test_page_state.ToEncodedData(),
             entry2_->GetPageState().ToEncodedData());
diff --git a/content/browser/renderer_host/navigation_request.cc b/content/browser/renderer_host/navigation_request.cc
index c05a8dfb..ee8fc66 100644
--- a/content/browser/renderer_host/navigation_request.cc
+++ b/content/browser/renderer_host/navigation_request.cc
@@ -854,7 +854,7 @@
           /*post_content_type=*/std::string(), common_params->url,
           common_params->method,
           /*can_load_local_resources=*/false,
-          /*page_state=*/PageState(),
+          /*page_state=*/blink::PageState(),
           /*nav_entry_id=*/0,
           /*subframe_unique_names=*/base::flat_map<std::string, bool>(),
           /*intended_as_new_entry=*/false,
@@ -1076,6 +1076,31 @@
                                     base::trace_event::ToTracedValue(this));
   TRACE_EVENT_NESTABLE_ASYNC_BEGIN0("navigation", "Initializing",
                                     navigation_id_);
+
+  policy_container_ = std::make_unique<PolicyContainer>();
+
+  // Local schemes inherit the policy container from the initiator.
+  //
+  // TODO(antoniosartori): Fill up the policy container and/or replace it with a
+  // new one whenever needed (e.g. blob: or filesystem: URLs should get the
+  // policy container from the document which created them and not from the
+  // initiator of the navigation).
+  if (common_params_->url.SchemeIs(url::kAboutScheme) ||
+      common_params_->url.SchemeIs(url::kDataScheme) ||
+      common_params_->url.SchemeIs(url::kBlobScheme) ||
+      common_params_->url.SchemeIs(url::kFileSystemScheme)) {
+    if (GetInitiatorRoutingId()) {
+      RenderFrameHostImpl* initiator_rfh = static_cast<RenderFrameHostImpl*>(
+          RenderFrameHost::FromID(GetInitiatorRoutingId()));
+      // It can happen that the initiator RenderFrameHost is deleted just before
+      // this NavigationRequest is created, se https://crbug.com/1129416.
+      //
+      // TODO(antoniosartori): Fix this.
+      if (initiator_rfh) {
+        policy_container_ = initiator_rfh->policy_container()->Clone();
+      }
+    }
+  }
   NavigationControllerImpl* controller = GetNavigationController();
 
   if (frame_entry) {
@@ -1584,7 +1609,7 @@
   // Reset any existing PageState with a non-empty, clean PageState, so that old
   // attacker-controlled state is not pulled into the new process.
   if (commit_params_->page_state.IsValid())
-    commit_params_->page_state = PageState::CreateFromURL(GetURL());
+    commit_params_->page_state = blink::PageState::CreateFromURL(GetURL());
 
   // Any previously computed origin to commit is no longer valid (e.g., an
   // opaque origin for an error page).
@@ -1640,6 +1665,10 @@
   return std::move(required_csp_);
 }
 
+std::unique_ptr<PolicyContainer> NavigationRequest::TakePolicyContainer() {
+  return std::move(policy_container_);
+}
+
 void NavigationRequest::CreateCoepReporter(
     StoragePartition* storage_partition) {
   const auto& coep = client_security_state_->cross_origin_embedder_policy;
@@ -1686,7 +1715,7 @@
 
   // Reset the page state as it can no longer be used at commit time since the
   // navigation was redirected.
-  commit_params_->page_state = PageState();
+  commit_params_->page_state = blink::PageState();
 
 #if defined(OS_ANDROID)
   base::WeakPtr<NavigationRequest> this_ptr(weak_factory_.GetWeakPtr());
diff --git a/content/browser/renderer_host/navigation_request.h b/content/browser/renderer_host/navigation_request.h
index 79922f4..1bcb9a4c 100644
--- a/content/browser/renderer_host/navigation_request.h
+++ b/content/browser/renderer_host/navigation_request.h
@@ -24,6 +24,7 @@
 #include "content/browser/renderer_host/navigation_controller_impl.h"
 #include "content/browser/renderer_host/navigation_entry_impl.h"
 #include "content/browser/renderer_host/navigation_throttle_runner.h"
+#include "content/browser/renderer_host/policy_container.h"
 #include "content/browser/site_instance_impl.h"
 #include "content/browser/web_package/web_bundle_handle.h"
 #include "content/common/content_export.h"
@@ -637,6 +638,9 @@
   void SetRequiredCSP(network::mojom::ContentSecurityPolicyPtr csp);
   network::mojom::ContentSecurityPolicyPtr TakeRequiredCSP();
 
+  std::unique_ptr<PolicyContainer> TakePolicyContainer();
+  PolicyContainer* policy_container() { return policy_container_.get(); }
+
   CrossOriginEmbedderPolicyReporter* coep_reporter() {
     return coep_reporter_.get();
   }
@@ -1443,6 +1447,11 @@
   // the RenderFrameHost at DidCommitNavigation time.
   network::mojom::ContentSecurityPolicyPtr required_csp_;
 
+  // Holds the policy container for the new document that will be created by
+  // this navigation. It is moved into the RenderFrameHostImpl at
+  // DidCommitNavigation time.
+  std::unique_ptr<PolicyContainer> policy_container_;
+
   std::unique_ptr<CrossOriginEmbedderPolicyReporter> coep_reporter_;
 
   std::unique_ptr<PeakGpuMemoryTracker> loading_mem_tracker_ = nullptr;
diff --git a/content/browser/renderer_host/navigation_request_unittest.cc b/content/browser/renderer_host/navigation_request_unittest.cc
index dec5fd7e..f4d3ea8 100644
--- a/content/browser/renderer_host/navigation_request_unittest.cc
+++ b/content/browser/renderer_host/navigation_request_unittest.cc
@@ -502,4 +502,51 @@
   SetBrowserClientForTesting(old_browser_client);
 }
 
+TEST_F(NavigationRequestTest, PolicyContainerInheritance) {
+  struct TestCase {
+    const char* url;
+    bool expect_inherit;
+  } cases[]{{"about:blank", true},
+            {"data:text/plain,hello", true},
+            {"file://local", false},
+            {"http://chromium.org", false}};
+
+  const GURL kUrl1 = GURL("http://chromium.org");
+  auto navigation =
+      NavigationSimulatorImpl::CreateRendererInitiated(kUrl1, main_rfh());
+  navigation->Commit();
+
+  for (auto test : cases) {
+    // We navigate child frames because the BlockedSchemeNavigationThrottle
+    // restricts navigations in the main frame.
+    auto* child_frame = static_cast<TestRenderFrameHost*>(
+        content::RenderFrameHostTester::For(main_rfh())->AppendChild("child"));
+
+    // We set the referrer policy of the frame to "always". We then create a new
+    // navigation, set as initiator the frame itself, start the navigation, and
+    // change the referrer policy of the frame to "never". After we commit the
+    // navigation:
+    // - If navigating to a local scheme, the target frame should have inherited
+    //   the referrer policy of the initiator ("always").
+    // - If navigating to a non-local scheme, the target frame should have a new
+    //   policy container (hence referrer policy set to "default").
+    const GURL kUrl = GURL(test.url);
+    auto navigation =
+        NavigationSimulatorImpl::CreateRendererInitiated(kUrl, child_frame);
+    child_frame->policy_container()->SetReferrerPolicy(
+        network::mojom::ReferrerPolicy::kAlways);
+    navigation->SetInitiatorFrame(child_frame);
+    navigation->Start();
+    child_frame->policy_container()->SetReferrerPolicy(
+        network::mojom::ReferrerPolicy::kNever);
+    navigation->Commit();
+    EXPECT_EQ(
+        test.expect_inherit ? network::mojom::ReferrerPolicy::kAlways
+                            : network::mojom::ReferrerPolicy::kDefault,
+        static_cast<RenderFrameHostImpl*>(navigation->GetFinalRenderFrameHost())
+            ->policy_container()
+            ->referrer_policy());
+  }
+}
+
 }  // namespace content
diff --git a/content/browser/renderer_host/policy_container.cc b/content/browser/renderer_host/policy_container.cc
new file mode 100644
index 0000000..eb60583
--- /dev/null
+++ b/content/browser/renderer_host/policy_container.cc
@@ -0,0 +1,24 @@
+// Copyright 2020 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 "content/browser/renderer_host/policy_container.h"
+
+namespace content {
+
+PolicyContainer::PolicyContainer() = default;
+PolicyContainer::PolicyContainer(network::mojom::ReferrerPolicy referrer_policy)
+    : referrer_policy_(referrer_policy) {}
+
+void PolicyContainer::SetReferrerPolicy(
+    network::mojom::ReferrerPolicy referrer_policy) {
+  referrer_policy_ = referrer_policy;
+}
+
+std::unique_ptr<PolicyContainer> PolicyContainer::Clone() const {
+  std::unique_ptr<PolicyContainer> copy =
+      std::make_unique<PolicyContainer>(referrer_policy());
+  return copy;
+}
+
+}  // namespace content
diff --git a/content/browser/renderer_host/policy_container.h b/content/browser/renderer_host/policy_container.h
new file mode 100644
index 0000000..dd95cf3
--- /dev/null
+++ b/content/browser/renderer_host/policy_container.h
@@ -0,0 +1,44 @@
+// Copyright 2020 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 CONTENT_BROWSER_RENDERER_HOST_POLICY_CONTAINER_H_
+#define CONTENT_BROWSER_RENDERER_HOST_POLICY_CONTAINER_H_
+
+#include "content/common/content_export.h"
+#include "services/network/public/mojom/referrer_policy.mojom-shared.h"
+
+namespace content {
+
+// PolicyContainer serves as a container for several security policies. It
+// should be owned by a RenderFrameHost. It keep tracks of the policies assigned
+// to a document. When a document creates/opens another document with a local
+// scheme (about:blank, about:srcdoc, data, blob, filesystem), the policy
+// container of the opener is cloned and a copy is attached to the new document,
+// so that the same security policies are applied to it.
+class CONTENT_EXPORT PolicyContainer {
+ public:
+  PolicyContainer();
+  explicit PolicyContainer(network::mojom::ReferrerPolicy referrer_policy);
+  PolicyContainer(const PolicyContainer&) = delete;
+  PolicyContainer& operator=(const PolicyContainer&) = delete;
+
+  void SetReferrerPolicy(network::mojom::ReferrerPolicy referrer_policy);
+  network::mojom::ReferrerPolicy referrer_policy() const {
+    return referrer_policy_;
+  }
+
+  std::unique_ptr<PolicyContainer> Clone() const;
+
+ private:
+  // The referrer policy for the associated document. If not overwritten via a
+  // call to SetReferrerPolicy (for example after parsing the Referrer-Policy
+  // header or a meta tag), the default referrer policy will be applied to the
+  // document.
+  network::mojom::ReferrerPolicy referrer_policy_ =
+      network::mojom::ReferrerPolicy::kDefault;
+};
+
+}  // namespace content
+
+#endif
diff --git a/content/browser/renderer_host/render_frame_host_delegate.h b/content/browser/renderer_host/render_frame_host_delegate.h
index 11aec6f..e2cdbcc4 100644
--- a/content/browser/renderer_host/render_frame_host_delegate.h
+++ b/content/browser/renderer_host/render_frame_host_delegate.h
@@ -72,6 +72,7 @@
 namespace mojom {
 class FullscreenOptions;
 }
+class PageState;
 namespace web_pref {
 struct WebPreferences;
 }
@@ -84,7 +85,6 @@
 namespace content {
 class AgentSchedulingGroupHost;
 class FrameTreeNode;
-class PageState;
 class RenderFrameHostImpl;
 class SessionStorageNamespace;
 class WebContents;
@@ -220,7 +220,7 @@
 
   // The state for the page changed and should be updated in session history.
   virtual void UpdateStateForFrame(RenderFrameHost* render_frame_host,
-                                   const PageState& page_state) {}
+                                   const blink::PageState& page_state) {}
 
   // The page's title was changed and should be updated. Only called for the
   // top-level frame.
diff --git a/content/browser/renderer_host/render_frame_host_impl.cc b/content/browser/renderer_host/render_frame_host_impl.cc
index ea6910c..c54cb61 100644
--- a/content/browser/renderer_host/render_frame_host_impl.cc
+++ b/content/browser/renderer_host/render_frame_host_impl.cc
@@ -986,6 +986,32 @@
     set_nav_entry_id(parent_->nav_entry_id());
   }
 
+  // The initial empty document inherits its policy container from its creator.
+  // The creator is either its parent for iframes or its opener for new windows.
+  //
+  // Note 1: For normal document created from a navigation, the policy container
+  // is computed from the NavigationRequest and assigned in
+  // DidCommitNewDocument().
+  //
+  // Note 2: After creating a new frame, blink emits a second IPC
+  // (DidCommitProvisionalLoad) for committing the initial empty
+  // document. However, since the RenderFrameHost has already been created, we
+  // cannot use DidCommitProvisionalLoad to set the policy container, since we
+  // could run into a race condition. Hence we need to set The policy container
+  // immediately when creating the RenderFrameHost here.
+  if (!frame_tree_node_->has_committed_real_load()) {
+    if (parent_) {
+      policy_container_ = parent_->policy_container()->Clone();
+    } else if (frame_tree_node_->opener()) {
+      policy_container_ = frame_tree_node_->opener()
+                              ->current_frame_host()
+                              ->policy_container()
+                              ->Clone();
+    } else {
+      policy_container_ = std::make_unique<PolicyContainer>();
+    }
+  }
+
   SetUpMojoIfNeeded();
 
   unload_event_monitor_timeout_ =
@@ -4778,7 +4804,7 @@
                                initial_rect, user_gesture);
 }
 
-void RenderFrameHostImpl::UpdateState(const PageState& state) {
+void RenderFrameHostImpl::UpdateState(const blink::PageState& state) {
   // TODO(creis): Verify the state's ISN matches the last committed FNE.
 
   // Without this check, the renderer can trick the browser into using
@@ -6494,6 +6520,8 @@
     if (IsURLHandledByNetworkStack(common_params->url))
       last_navigation_previews_state_ = common_params->previews_state;
 
+    DCHECK(navigation_request->policy_container());
+
     dom_content_loaded_ = false;
     SendCommitNavigation(
         navigation_client, navigation_request, std::move(common_params),
@@ -7058,12 +7086,14 @@
   return main_frame;
 }
 
-bool RenderFrameHostImpl::CanAccessFilesOfPageState(const PageState& state) {
+bool RenderFrameHostImpl::CanAccessFilesOfPageState(
+    const blink::PageState& state) {
   return ChildProcessSecurityPolicyImpl::GetInstance()->CanReadAllFiles(
       GetProcess()->GetID(), state.GetReferencedFiles());
 }
 
-void RenderFrameHostImpl::GrantFileAccessFromPageState(const PageState& state) {
+void RenderFrameHostImpl::GrantFileAccessFromPageState(
+    const blink::PageState& state) {
   GrantFileAccess(GetProcess()->GetID(), state.GetReferencedFiles());
 }
 
@@ -8651,6 +8681,15 @@
                        weak_ptr_factory_.GetWeakPtr(), std::move(receiver)));
   }
 
+  // We move the policy container of |navigation_request| into the
+  // RenderFrameHost unless this is the initial, "fake" navigation to
+  // about:blank (because otherwise we would overwrite the policy container of
+  // the new document, inherited at RenderFrameHost creation time, with an empty
+  // policy container).
+  if (navigation_request->IsWaitingToCommit()) {
+    policy_container_ = navigation_request->TakePolicyContainer();
+  }
+
   // Set the state whether this navigation is to an MHTML document, since there
   // are certain security checks that we cannot apply to subframes in MHTML
   // documents. Do not trust renderer data when determining that, rather use
diff --git a/content/browser/renderer_host/render_frame_host_impl.h b/content/browser/renderer_host/render_frame_host_impl.h
index 7e4755d..1cc529e 100644
--- a/content/browser/renderer_host/render_frame_host_impl.h
+++ b/content/browser/renderer_host/render_frame_host_impl.h
@@ -44,6 +44,7 @@
 #include "content/browser/renderer_host/back_forward_cache_metrics.h"
 #include "content/browser/renderer_host/media/render_frame_audio_input_stream_factory.h"
 #include "content/browser/renderer_host/media/render_frame_audio_output_stream_factory.h"
+#include "content/browser/renderer_host/policy_container.h"
 #include "content/browser/renderer_host/should_swap_browsing_instance.h"
 #include "content/browser/site_instance_impl.h"
 #include "content/browser/webui/web_ui_impl.h"
@@ -1488,6 +1489,8 @@
     return required_csp_.get();
   }
 
+  PolicyContainer* policy_container() { return policy_container_.get(); }
+
   // This function mimics DidCommitProvisionalLoad for navigations served from
   // the back-forward cache.
   void DidCommitBackForwardCacheNavigation(
@@ -2060,7 +2063,7 @@
                          WindowOpenDisposition disposition,
                          const gfx::Rect& initial_rect,
                          bool user_gesture) override;
-  void UpdateState(const PageState& state) override;
+  void UpdateState(const blink::PageState& state) override;
   void OpenURL(mojom::OpenURLParamsPtr params) override;
   void DidStopLoading() override;
 
@@ -2102,13 +2105,13 @@
 
   // Returns whether the current RenderProcessHost has read access to all the
   // files reported in |state|.
-  bool CanAccessFilesOfPageState(const PageState& state);
+  bool CanAccessFilesOfPageState(const blink::PageState& state);
 
   // Grants the current RenderProcessHost read access to any file listed in
   // |validated_state|.  It is important that the PageState has been validated
   // upon receipt from the renderer process to prevent it from forging access to
   // files without the user's consent.
-  void GrantFileAccessFromPageState(const PageState& validated_state);
+  void GrantFileAccessFromPageState(const blink::PageState& validated_state);
 
   // Grants the current RenderProcessHost read access to any file listed in
   // |body|.  It is important that the ResourceRequestBody has been validated
@@ -3236,6 +3239,14 @@
   // stored when the frame commits the navigation.
   network::mojom::ContentSecurityPolicyPtr required_csp_;
 
+  // The policy container for the current document, containing security policies
+  // that apply to it. It should never be null if the RenderFrameHost is
+  // displaying a document. Its lifetime should coincide with the lifetime of
+  // the document displayed in the RenderFrameHost. It is overwritten at
+  // navigation commit time in DidCommitNewDocument with the policy container of
+  // the new document.
+  std::unique_ptr<PolicyContainer> policy_container_;
+
   // NOTE: This must be the last member.
   base::WeakPtrFactory<RenderFrameHostImpl> weak_ptr_factory_{this};
 
diff --git a/content/browser/renderer_host/render_frame_host_impl_unittest.cc b/content/browser/renderer_host/render_frame_host_impl_unittest.cc
index 29d04f6..4e45298 100644
--- a/content/browser/renderer_host/render_frame_host_impl_unittest.cc
+++ b/content/browser/renderer_host/render_frame_host_impl_unittest.cc
@@ -99,4 +99,40 @@
       mojo::PendingAssociatedRemote<blink::mojom::Widget>(), base::DoNothing());
 }
 
+TEST_F(RenderFrameHostImplTest, PolicyContainerLifecycle) {
+  TestRenderFrameHost* main_rfh = contents()->GetMainFrame();
+  ASSERT_NE(main_rfh->policy_container(), nullptr);
+  EXPECT_EQ(main_rfh->policy_container()->referrer_policy(),
+            network::mojom::ReferrerPolicy::kDefault);
+
+  main_rfh->policy_container()->SetReferrerPolicy(
+      network::mojom::ReferrerPolicy::kAlways);
+  EXPECT_EQ(main_rfh->policy_container()->referrer_policy(),
+            network::mojom::ReferrerPolicy::kAlways);
+
+  // Create a child frame and check that it inherits the policy container from
+  // the parent frame.
+  auto* child_frame = static_cast<TestRenderFrameHost*>(
+      content::RenderFrameHostTester::For(main_test_rfh())
+          ->AppendChild("child"));
+
+  ASSERT_NE(child_frame->policy_container(), nullptr);
+  EXPECT_EQ(child_frame->policy_container()->referrer_policy(),
+            network::mojom::ReferrerPolicy::kAlways);
+
+  // Create a new WebContents with opener and test that the new main frame
+  // inherits the policy container from the opener.
+  child_frame->policy_container()->SetReferrerPolicy(
+      network::mojom::ReferrerPolicy::kNever);
+  WebContents::CreateParams params(browser_context());
+  std::unique_ptr<WebContentsImpl> new_contents(
+      WebContentsImpl::CreateWithOpener(params, child_frame));
+  RenderFrameHostImpl* new_frame =
+      new_contents->GetFrameTree()->root()->current_frame_host();
+
+  ASSERT_NE(new_frame->policy_container(), nullptr);
+  EXPECT_EQ(new_frame->policy_container()->referrer_policy(),
+            network::mojom::ReferrerPolicy::kNever);
+}
+
 }  // namespace content
diff --git a/content/browser/renderer_host/render_frame_host_manager_browsertest.cc b/content/browser/renderer_host/render_frame_host_manager_browsertest.cc
index e77e0c7..d6f1713 100644
--- a/content/browser/renderer_host/render_frame_host_manager_browsertest.cc
+++ b/content/browser/renderer_host/render_frame_host_manager_browsertest.cc
@@ -54,7 +54,6 @@
 #include "content/public/common/content_client.h"
 #include "content/public/common/content_features.h"
 #include "content/public/common/content_switches.h"
-#include "content/public/common/page_state.h"
 #include "content/public/common/url_constants.h"
 #include "content/public/test/browser_test.h"
 #include "content/public/test/browser_test_utils.h"
diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc
index af9b36b6..c4df57d 100644
--- a/content/browser/renderer_host/render_process_host_impl.cc
+++ b/content/browser/renderer_host/render_process_host_impl.cc
@@ -3476,6 +3476,7 @@
     switches::kDisableHighResTimer,
     switches::kEnableWin7WebRtcHWH264Decoding,
     switches::kTrySupportedChannelLayouts,
+    switches::kRaiseTimerFrequency,
 #endif
 #if defined(USE_OZONE)
     switches::kOzonePlatform,
diff --git a/content/browser/renderer_host/render_view_host_unittest.cc b/content/browser/renderer_host/render_view_host_unittest.cc
index 24e8637..5a8f9d4 100644
--- a/content/browser/renderer_host/render_view_host_unittest.cc
+++ b/content/browser/renderer_host/render_view_host_unittest.cc
@@ -217,7 +217,7 @@
   auto navigation1 =
       NavigationSimulatorImpl::CreateRendererInitiated(url, main_test_rfh());
   navigation1->set_page_state(
-      PageState::CreateForTesting(url, false, "data", &file_path));
+      blink::PageState::CreateForTesting(url, false, "data", &file_path));
   navigation1->Commit();
   EXPECT_EQ(1, process()->bad_msg_count());
 
@@ -226,7 +226,7 @@
   auto navigation2 =
       NavigationSimulatorImpl::CreateRendererInitiated(url, main_test_rfh());
   navigation2->set_page_state(
-      PageState::CreateForTesting(url, false, "data", &file_path));
+      blink::PageState::CreateForTesting(url, false, "data", &file_path));
   navigation2->Commit();
   EXPECT_EQ(1, process()->bad_msg_count());
 }
diff --git a/content/browser/security_exploit_browsertest.cc b/content/browser/security_exploit_browsertest.cc
index 9ff535e..262677bf 100644
--- a/content/browser/security_exploit_browsertest.cc
+++ b/content/browser/security_exploit_browsertest.cc
@@ -614,7 +614,8 @@
   FrameTreeNode* child1 = root->child_at(1);
   GURL child1_url = child1->current_url();
   int child1_pid = child1->current_frame_host()->GetProcess()->GetID();
-  PageState child1_page_state = back_entry->GetFrameEntry(child1)->page_state();
+  blink::PageState child1_page_state =
+      back_entry->GetFrameEntry(child1)->page_state();
 
   // Add a history item in the nested frame.  It's important to do it there and
   // not the main frame for the repro to work, since we don't walk the subtree
@@ -639,7 +640,8 @@
   params->should_update_history = false;
   params->gesture = NavigationGestureAuto;
   params->method = "GET";
-  params->page_state = PageState::CreateFromURL(GURL("data:text/html,foo"));
+  params->page_state =
+      blink::PageState::CreateFromURL(GURL("data:text/html,foo"));
   params->origin = url::Origin::Create(GURL("about:blank"));
   params->embedding_token = base::UnguessableToken::Create();
 
diff --git a/content/browser/site_per_process_browsertest.cc b/content/browser/site_per_process_browsertest.cc
index ea2c2ce..325cb076 100644
--- a/content/browser/site_per_process_browsertest.cc
+++ b/content/browser/site_per_process_browsertest.cc
@@ -14820,7 +14820,7 @@
   params->should_update_history = false;
   params->gesture = NavigationGestureAuto;
   params->method = "GET";
-  params->page_state = PageState::CreateFromURL(start_url);
+  params->page_state = blink::PageState::CreateFromURL(start_url);
   params->navigation_token =
       root->navigation_request()->commit_params().navigation_token;
 
diff --git a/content/browser/utility_process_host.cc b/content/browser/utility_process_host.cc
index b25f220..74c7e179 100644
--- a/content/browser/utility_process_host.cc
+++ b/content/browser/utility_process_host.cc
@@ -281,6 +281,7 @@
       switches::kDisableHighResTimer,
       switches::kEnableExclusiveAudio,
       switches::kForceWaveAudio,
+      switches::kRaiseTimerFrequency,
       switches::kTrySupportedChannelLayouts,
       switches::kWaveOutBuffers,
       switches::kWebXrForceRuntime,
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc
index 58e9d2d..5fa3aba 100644
--- a/content/browser/web_contents/web_contents_impl.cc
+++ b/content/browser/web_contents/web_contents_impl.cc
@@ -105,7 +105,6 @@
 #include "content/common/frame_messages.h"
 #include "content/common/input_messages.h"
 #include "content/common/page_messages.h"
-#include "content/common/page_state_serialization.h"
 #include "content/common/render_message_filter.mojom.h"
 #include "content/common/view_messages.h"
 #include "content/common/widget_messages.h"
@@ -143,7 +142,6 @@
 #include "content/public/common/content_constants.h"
 #include "content/public/common/content_features.h"
 #include "content/public/common/content_switches.h"
-#include "content/public/common/page_state.h"
 #include "content/public/common/referrer_type_converters.h"
 #include "content/public/common/result_codes.h"
 #include "content/public/common/url_utils.h"
@@ -164,6 +162,8 @@
 #include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h"
 #include "third_party/blink/public/common/mime_util/mime_util.h"
 #include "third_party/blink/public/common/page/page_zoom.h"
+#include "third_party/blink/public/common/page_state/page_state.h"
+#include "third_party/blink/public/common/page_state/page_state_serialization.h"
 #include "third_party/blink/public/common/security/security_style.h"
 #include "third_party/blink/public/common/web_preferences/web_preferences.h"
 #include "third_party/blink/public/mojom/frame/frame.mojom.h"
@@ -5665,7 +5665,7 @@
   // Do not restore scroller position.
   // TODO(creis, lukasza, arthursonzogni): Do not reuse the original PageState,
   // but start from a new one and only copy the needed data.
-  const PageState& new_page_state =
+  const blink::PageState& new_page_state =
       frame_entry->page_state().RemoveScrollOffset();
 
   scoped_refptr<FrameNavigationEntry> new_frame_entry =
@@ -7375,7 +7375,7 @@
 }
 
 void WebContentsImpl::UpdateStateForFrame(RenderFrameHost* render_frame_host,
-                                          const PageState& page_state) {
+                                          const blink::PageState& page_state) {
   OPTIONAL_TRACE_EVENT1("content", "WebContentsImpl::UpdateStateForFrame",
                         "render_frame_host",
                         base::trace_event::ToTracedValue(render_frame_host));
@@ -7411,8 +7411,8 @@
   // FrameNavigationEntry should not differ from the one coming with the update,
   // since it must come from the same document. Do not update it if a difference
   // is detected, as this indicates that |frame_entry| is not the correct one.
-  ExplodedPageState exploded_state;
-  if (!DecodePageState(page_state.ToEncodedData(), &exploded_state))
+  blink::ExplodedPageState exploded_state;
+  if (!blink::DecodePageState(page_state.ToEncodedData(), &exploded_state))
     return;
 
   if (exploded_state.top.document_sequence_number !=
diff --git a/content/browser/web_contents/web_contents_impl.h b/content/browser/web_contents/web_contents_impl.h
index 632968c..a7e60496 100644
--- a/content/browser/web_contents/web_contents_impl.h
+++ b/content/browser/web_contents/web_contents_impl.h
@@ -598,7 +598,7 @@
   void DOMContentLoaded(RenderFrameHost* render_frame_host) override;
   void DocumentOnLoadCompleted(RenderFrameHost* render_frame_host) override;
   void UpdateStateForFrame(RenderFrameHost* render_frame_host,
-                           const PageState& page_state) override;
+                           const blink::PageState& page_state) override;
   void UpdateTitle(RenderFrameHost* render_frame_host,
                    const base::string16& title,
                    base::i18n::TextDirection title_direction) override;
diff --git a/content/browser/webrtc/resources/webrtc_internals.js b/content/browser/webrtc/resources/webrtc_internals.js
index e26c17c..60da2dd 100644
--- a/content/browser/webrtc/resources/webrtc_internals.js
+++ b/content/browser/webrtc/resources/webrtc_internals.js
@@ -146,6 +146,13 @@
 
   p.appendChild(document.createTextNode('Read Stats From: '));
   p.appendChild(selectElement);
+
+  const statsDocumentation = document.createElement('p');
+  statsDocumentation.appendChild(
+    document.createTextNode('Note: computed stats are in []. ' +
+      'Experimental stats are marked with an * at the end.'));
+  p.appendChild(statsDocumentation);
+
   return p;
 }
 
diff --git a/content/common/BUILD.gn b/content/common/BUILD.gn
index 22e877a..2bed6dd4 100644
--- a/content/common/BUILD.gn
+++ b/content/common/BUILD.gn
@@ -127,8 +127,6 @@
     "navigation_params_utils.h",
     "origin_util.cc",
     "page_messages.h",
-    "page_state_serialization.cc",
-    "page_state_serialization.h",
     "pepper_file_util.cc",
     "pepper_file_util.h",
     "pepper_plugin_list.cc",
@@ -634,7 +632,7 @@
         },
         {
           mojom = "content.mojom.PageState"
-          cpp = "::content::PageState"
+          cpp = "::blink::PageState"
         },
         {
           mojom = "content.mojom.PageTransition"
@@ -650,7 +648,7 @@
         "//content/common/navigation_params.h",
         "//content/public/common/impression.h",
         "//content/public/common/navigation_policy.h",
-        "//content/public/common/page_state.h",
+        "//third_party/blink/public/common/page_state/page_state.h",
         "//third_party/blink/public/platform/web_mixed_content_context_type.h",
         "//ui/base/page_transition_types.h",
       ]
diff --git a/content/common/frame.mojom b/content/common/frame.mojom
index e769df39..6f122e19 100644
--- a/content/common/frame.mojom
+++ b/content/common/frame.mojom
@@ -52,6 +52,9 @@
 import "url/mojom/origin.mojom";
 import "url/mojom/url.mojom";
 
+[Native]
+struct PageState;
+
 // The name of the InterfaceProviderSpec in service manifests used by the
 // frame tree to expose frame-specific interfaces between renderer and browser.
 const string kNavigation_FrameSpec = "navigation:frame";
diff --git a/content/common/frame_messages.h b/content/common/frame_messages.h
index 2658ca3f..238f40ee 100644
--- a/content/common/frame_messages.h
+++ b/content/common/frame_messages.h
@@ -32,7 +32,6 @@
 #include "content/public/common/frame_navigate_params.h"
 #include "content/public/common/impression.h"
 #include "content/public/common/navigation_policy.h"
-#include "content/public/common/page_state.h"
 #include "content/public/common/referrer.h"
 #include "content/public/common/stop_find_action.h"
 #include "content/public/common/three_d_api_types.h"
@@ -49,6 +48,7 @@
 #include "third_party/blink/public/common/loader/previews_state.h"
 #include "third_party/blink/public/common/messaging/message_port_channel.h"
 #include "third_party/blink/public/common/navigation/triggering_event_info.h"
+#include "third_party/blink/public/common/page_state/page_state.h"
 #include "third_party/blink/public/mojom/choosers/file_chooser.mojom.h"
 #include "third_party/blink/public/mojom/devtools/console_message.mojom.h"
 #include "third_party/blink/public/mojom/favicon/favicon_url.mojom.h"
@@ -282,7 +282,7 @@
   IPC_STRUCT_MEMBER(bool, url_is_unreachable)
 
   // Serialized history item state to store in the navigation entry.
-  IPC_STRUCT_MEMBER(content::PageState, page_state)
+  IPC_STRUCT_MEMBER(blink::PageState, page_state)
 
   // Original request's URL.
   IPC_STRUCT_MEMBER(GURL, original_request_url)
diff --git a/content/common/view_messages.h b/content/common/view_messages.h
index baee1fb..e83612118 100644
--- a/content/common/view_messages.h
+++ b/content/common/view_messages.h
@@ -29,7 +29,6 @@
 #include "content/common/navigation_gesture.h"
 #include "content/public/common/common_param_traits.h"
 #include "content/public/common/menu_item.h"
-#include "content/public/common/page_state.h"
 #include "content/public/common/page_zoom.h"
 #include "content/public/common/referrer.h"
 #include "content/public/common/three_d_api_types.h"
diff --git a/content/public/browser/navigation_entry.h b/content/public/browser/navigation_entry.h
index 24a35b24..de3d800b 100644
--- a/content/public/browser/navigation_entry.h
+++ b/content/public/browser/navigation_entry.h
@@ -24,9 +24,12 @@
 
 class GURL;
 
+namespace blink {
+class PageState;
+}
+
 namespace content {
 
-class PageState;
 struct FaviconStatus;
 struct ReplacedNavigationEntryData;
 struct SSLStatus;
@@ -105,8 +108,8 @@
   // NOTE: This state is saved to disk and used to restore previous states.  If
   // the format is modified in the future, we should still be able to deal with
   // older versions.
-  virtual void SetPageState(const PageState& state) = 0;
-  virtual PageState GetPageState() = 0;
+  virtual void SetPageState(const blink::PageState& state) = 0;
+  virtual blink::PageState GetPageState() = 0;
 
   // Page-related helpers ------------------------------------------------------
 
diff --git a/content/public/common/BUILD.gn b/content/public/common/BUILD.gn
index d2ca192c..b0f18bcf 100644
--- a/content/public/common/BUILD.gn
+++ b/content/public/common/BUILD.gn
@@ -128,8 +128,6 @@
     "network_service_util.cc",
     "network_service_util.h",
     "origin_util.h",
-    "page_state.cc",
-    "page_state.h",
     "page_type.h",
     "page_visibility_state.h",
     "page_zoom.h",
diff --git a/content/public/common/common_param_traits.cc b/content/public/common/common_param_traits.cc
index 539c53e..a478d9a 100644
--- a/content/public/common/common_param_traits.cc
+++ b/content/public/common/common_param_traits.cc
@@ -8,29 +8,28 @@
 
 #include "base/containers/stack_container.h"
 #include "content/public/common/content_constants.h"
-#include "content/public/common/page_state.h"
 #include "content/public/common/referrer.h"
 #include "net/http/http_util.h"
+#include "third_party/blink/public/common/page_state/page_state.h"
 
 namespace IPC {
 
-void ParamTraits<content::PageState>::Write(base::Pickle* m,
-                                            const param_type& p) {
+void ParamTraits<blink::PageState>::Write(base::Pickle* m,
+                                          const param_type& p) {
   WriteParam(m, p.ToEncodedData());
 }
 
-bool ParamTraits<content::PageState>::Read(const base::Pickle* m,
-                                           base::PickleIterator* iter,
-                                           param_type* r) {
+bool ParamTraits<blink::PageState>::Read(const base::Pickle* m,
+                                         base::PickleIterator* iter,
+                                         param_type* r) {
   std::string data;
   if (!ReadParam(m, iter, &data))
     return false;
-  *r = content::PageState::CreateFromEncodedData(data);
+  *r = blink::PageState::CreateFromEncodedData(data);
   return true;
 }
 
-void ParamTraits<content::PageState>::Log(
-    const param_type& p, std::string* l) {
+void ParamTraits<blink::PageState>::Log(const param_type& p, std::string* l) {
   l->append("(");
   LogParam(p.ToEncodedData(), l);
   l->append(")");
diff --git a/content/public/common/common_param_traits.h b/content/public/common/common_param_traits.h
index 366da86..a8c2be9 100644
--- a/content/public/common/common_param_traits.h
+++ b/content/public/common/common_param_traits.h
@@ -31,15 +31,15 @@
 #include "base/win/win_util.h"
 #endif
 
-namespace content {
+namespace blink {
 class PageState;
 }
 
 namespace IPC {
 
 template <>
-struct CONTENT_EXPORT ParamTraits<content::PageState> {
-  typedef content::PageState param_type;
+struct CONTENT_EXPORT ParamTraits<blink::PageState> {
+  typedef blink::PageState param_type;
   static void Write(base::Pickle* m, const param_type& p);
   static bool Read(const base::Pickle* m,
                    base::PickleIterator* iter,
diff --git a/content/public/common/content_switches.cc b/content/public/common/content_switches.cc
index 275ecab2..8a97806 100644
--- a/content/public/common/content_switches.cc
+++ b/content/public/common/content_switches.cc
@@ -1026,6 +1026,12 @@
 const char kPpapiSubpixelRenderingSetting[] =
     "ppapi-subpixel-rendering-setting";
 
+// Raise the timer interrupt frequency in all Chrome processes, for experimental
+// purposes. This feature is needed because as of Windows 10 2004 the scheduling
+// effects of changing the timer interrupt frequency are not global, and this
+// lets us prove/disprove whether this matters. See https://crbug.com/1128917
+const char kRaiseTimerFrequency[] = "raise-timer-frequency";
+
 // Causes the second GPU process used for gpu info collection to display a
 // dialog on launch.
 const char kGpu2StartupDialog[] = "gpu2-startup-dialog";
diff --git a/content/public/common/content_switches.h b/content/public/common/content_switches.h
index bc16eb6..7c168275 100644
--- a/content/public/common/content_switches.h
+++ b/content/public/common/content_switches.h
@@ -288,6 +288,7 @@
 CONTENT_EXPORT extern const char kFontCacheSharedHandle[];
 CONTENT_EXPORT extern const char kPpapiAntialiasedTextEnabled[];
 CONTENT_EXPORT extern const char kPpapiSubpixelRenderingSetting[];
+CONTENT_EXPORT extern const char kRaiseTimerFrequency[];
 CONTENT_EXPORT extern const char kGpu2StartupDialog[];
 #endif
 
diff --git a/content/public/common/resource_request_body_android.cc b/content/public/common/resource_request_body_android.cc
index 9d6a27a..de96d35f 100644
--- a/content/public/common/resource_request_body_android.cc
+++ b/content/public/common/resource_request_body_android.cc
@@ -11,9 +11,9 @@
 #include "base/android/jni_array.h"
 #include "base/android/scoped_java_ref.h"
 #include "base/memory/ref_counted.h"
-#include "content/common/page_state_serialization.h"
 #include "content/public/android/content_jni_headers/ResourceRequestBody_jni.h"
 #include "services/network/public/cpp/resource_request_body.h"
+#include "third_party/blink/public/common/page_state/page_state_serialization.h"
 
 using base::android::JavaParamRef;
 
@@ -25,7 +25,7 @@
 JNI_ResourceRequestBody_ConvertResourceRequestBodyToJavaArray(
     JNIEnv* env,
     const network::ResourceRequestBody& body) {
-  std::string encoded = EncodeResourceRequestBody(body);
+  std::string encoded = blink::EncodeResourceRequestBody(body);
   return base::android::ToJavaByteArray(
       env, reinterpret_cast<const uint8_t*>(encoded.data()), encoded.size());
 }
@@ -80,7 +80,7 @@
   std::vector<uint8_t> encoded;
   base::android::JavaByteArrayToByteVector(env, j_encoded, &encoded);
 
-  return DecodeResourceRequestBody(
+  return blink::DecodeResourceRequestBody(
       reinterpret_cast<const char*>(encoded.data()), encoded.size());
 }
 
diff --git a/content/public/test/render_view_test.cc b/content/public/test/render_view_test.cc
index 0269550..5d56a5b 100644
--- a/content/public/test/render_view_test.cc
+++ b/content/public/test/render_view_test.cc
@@ -383,7 +383,7 @@
       blink::DocumentUpdateReason::kTest);
 }
 
-PageState RenderViewTest::GetCurrentPageState() {
+blink::PageState RenderViewTest::GetCurrentPageState() {
   RenderViewImpl* view = static_cast<RenderViewImpl*>(view_);
 
   // This returns a PageState object for the main frame, excluding subframes.
@@ -393,11 +393,11 @@
   return SingleHistoryItemToPageState(frame->current_history_item());
 }
 
-void RenderViewTest::GoBack(const GURL& url, const PageState& state) {
+void RenderViewTest::GoBack(const GURL& url, const blink::PageState& state) {
   GoToOffset(-1, url, state);
 }
 
-void RenderViewTest::GoForward(const GURL& url, const PageState& state) {
+void RenderViewTest::GoForward(const GURL& url, const blink::PageState& state) {
   GoToOffset(1, url, state);
 }
 
@@ -897,7 +897,7 @@
 
 void RenderViewTest::GoToOffset(int offset,
                                 const GURL& url,
-                                const PageState& state) {
+                                const blink::PageState& state) {
   RenderViewImpl* view = static_cast<RenderViewImpl*>(view_);
 
   int history_list_length =
diff --git a/content/public/test/render_view_test.h b/content/public/test/render_view_test.h
index 8b7258f7..01a88d5 100644
--- a/content/public/test/render_view_test.h
+++ b/content/public/test/render_view_test.h
@@ -17,15 +17,16 @@
 #include "build/build_config.h"
 #include "content/public/browser/native_web_keyboard_event.h"
 #include "content/public/common/main_function_params.h"
-#include "content/public/common/page_state.h"
 #include "content/public/test/mock_render_thread.h"
 #include "mojo/core/embedder/scoped_ipc_support.h"
 #include "mojo/public/cpp/bindings/binder_map.h"
 #include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/blink/public/common/page_state/page_state.h"
 #include "third_party/blink/public/platform/platform.h"
 #include "third_party/blink/public/web/web_frame.h"
 
 namespace blink {
+class PageState;
 namespace scheduler {
 class WebThreadScheduler;
 }
@@ -47,7 +48,6 @@
 class ContentRendererClient;
 class CompositorDependencies;
 class FakeRenderWidgetHost;
-class PageState;
 class RendererMainPlatformDelegate;
 class RendererBlinkPlatformImpl;
 class RendererBlinkPlatformImplTestOverrideImpl;
@@ -117,12 +117,12 @@
 
   // Returns the current PageState.
   // In OOPIF enabled modes, this returns a PageState object for the main frame.
-  PageState GetCurrentPageState();
+  blink::PageState GetCurrentPageState();
 
   // Navigates the main frame back or forward in session history and commits.
   // The caller must capture a PageState for the target page.
-  void GoBack(const GURL& url, const PageState& state);
-  void GoForward(const GURL& url, const PageState& state);
+  void GoBack(const GURL& url, const blink::PageState& state);
+  void GoForward(const GURL& url, const blink::PageState& state);
 
   // Sends one native key event over IPC.
   void SendNativeKeyEvent(const NativeWebKeyboardEvent& key_event);
@@ -240,7 +240,7 @@
 #endif
 
  private:
-  void GoToOffset(int offset, const GURL& url, const PageState& state);
+  void GoToOffset(int offset, const GURL& url, const blink::PageState& state);
   void SendInputEvent(const blink::WebInputEvent& input_event);
 };
 
diff --git a/content/renderer/history_serialization.cc b/content/renderer/history_serialization.cc
index 249f6f1..f4b0d865 100644
--- a/content/renderer/history_serialization.cc
+++ b/content/renderer/history_serialization.cc
@@ -8,10 +8,10 @@
 #include <algorithm>
 
 #include "base/strings/nullable_string16.h"
-#include "content/common/page_state_serialization.h"
-#include "content/public/common/page_state.h"
 #include "content/renderer/history_entry.h"
 #include "content/renderer/loader/web_url_request_util.h"
+#include "third_party/blink/public/common/page_state/page_state.h"
+#include "third_party/blink/public/common/page_state/page_state_serialization.h"
 #include "third_party/blink/public/platform/web_data.h"
 #include "third_party/blink/public/platform/web_http_body.h"
 #include "third_party/blink/public/platform/web_string.h"
@@ -38,7 +38,7 @@
 }
 
 void GenerateFrameStateFromItem(const WebHistoryItem& item,
-                                ExplodedFrameState* state) {
+                                blink::ExplodedFrameState* state) {
   state->url_string = WebString::ToOptionalString16(item.UrlString());
   state->referrer = WebString::ToOptionalString16(item.GetReferrer());
   state->referrer_policy = item.GetReferrerPolicy();
@@ -71,7 +71,7 @@
   state->scroll_anchor_simhash = anchor.simhash_;
 }
 
-void RecursivelyGenerateHistoryItem(const ExplodedFrameState& state,
+void RecursivelyGenerateHistoryItem(const blink::ExplodedFrameState& state,
                                     HistoryEntry::HistoryNode* node) {
   WebHistoryItem item;
   item.Initialize();
@@ -123,21 +123,21 @@
 
 }  // namespace
 
-PageState SingleHistoryItemToPageState(const WebHistoryItem& item) {
-  ExplodedPageState state;
+blink::PageState SingleHistoryItemToPageState(const WebHistoryItem& item) {
+  blink::ExplodedPageState state;
   ToOptionalString16Vector(item.GetReferencedFilePaths(),
                            &state.referenced_files);
   GenerateFrameStateFromItem(item, &state.top);
 
   std::string encoded_data;
-  EncodePageState(state, &encoded_data);
-  return PageState::CreateFromEncodedData(encoded_data);
+  blink::EncodePageState(state, &encoded_data);
+  return blink::PageState::CreateFromEncodedData(encoded_data);
 }
 
 std::unique_ptr<HistoryEntry> PageStateToHistoryEntry(
-    const PageState& page_state) {
-  ExplodedPageState state;
-  if (!DecodePageState(page_state.ToEncodedData(), &state))
+    const blink::PageState& page_state) {
+  blink::ExplodedPageState state;
+  if (!blink::DecodePageState(page_state.ToEncodedData(), &state))
     return std::unique_ptr<HistoryEntry>();
 
   std::unique_ptr<HistoryEntry> entry(new HistoryEntry());
diff --git a/content/renderer/history_serialization.h b/content/renderer/history_serialization.h
index c9f4fe9..46b2556c 100644
--- a/content/renderer/history_serialization.h
+++ b/content/renderer/history_serialization.h
@@ -11,18 +11,18 @@
 #include "content/common/content_export.h"
 
 namespace blink {
+class PageState;
 class WebHistoryItem;
 }
 
 namespace content {
 class HistoryEntry;
-class PageState;
 
-CONTENT_EXPORT PageState HistoryEntryToPageState(HistoryEntry* entry);
-CONTENT_EXPORT PageState SingleHistoryItemToPageState(
+CONTENT_EXPORT blink::PageState HistoryEntryToPageState(HistoryEntry* entry);
+CONTENT_EXPORT blink::PageState SingleHistoryItemToPageState(
     const blink::WebHistoryItem& item);
 CONTENT_EXPORT std::unique_ptr<HistoryEntry> PageStateToHistoryEntry(
-    const PageState& state);
+    const blink::PageState& state);
 
 }  // namespace content
 
diff --git a/content/renderer/loader/web_url_request_util.cc b/content/renderer/loader/web_url_request_util.cc
index 7c3a327..3ed6d44b 100644
--- a/content/renderer/loader/web_url_request_util.cc
+++ b/content/renderer/loader/web_url_request_util.cc
@@ -174,10 +174,10 @@
   WebHTTPBody::Element element;
   while (httpBody.ElementAt(i++, element)) {
     switch (element.type) {
-      case WebHTTPBody::Element::kTypeData:
+      case blink::HTTPBodyElementType::kTypeData:
         request_body->AppendBytes(element.data.Copy().ReleaseVector());
         break;
-      case WebHTTPBody::Element::kTypeFile:
+      case blink::HTTPBodyElementType::kTypeFile:
         if (element.file_length == -1) {
           request_body->AppendFileRange(
               blink::WebStringToFilePath(element.file_path), 0,
@@ -191,7 +191,7 @@
               element.modification_time.value_or(base::Time()));
         }
         break;
-      case WebHTTPBody::Element::kTypeBlob: {
+      case blink::HTTPBodyElementType::kTypeBlob: {
         DCHECK(element.optional_blob);
         mojo::Remote<blink::mojom::Blob> blob_remote(
             mojo::PendingRemote<blink::mojom::Blob>(
@@ -205,7 +205,7 @@
         request_body->AppendDataPipe(std::move(data_pipe_getter_remote));
         break;
       }
-      case WebHTTPBody::Element::kTypeDataPipe: {
+      case blink::HTTPBodyElementType::kTypeDataPipe: {
         // Convert the raw message pipe to
         // mojo::Remote<network::mojom::DataPipeGetter> data_pipe_getter.
         mojo::Remote<network::mojom::DataPipeGetter> data_pipe_getter(
diff --git a/content/renderer/pepper/pepper_video_capture_host.cc b/content/renderer/pepper/pepper_video_capture_host.cc
index c1f73fe..d87fe2c 100644
--- a/content/renderer/pepper/pepper_video_capture_host.cc
+++ b/content/renderer/pepper/pepper_video_capture_host.cc
@@ -21,6 +21,7 @@
 #include "ppapi/thunk/enter.h"
 #include "ppapi/thunk/ppb_buffer_api.h"
 #include "third_party/blink/public/web/modules/mediastream/media_stream_video_source.h"
+#include "third_party/libyuv/include/libyuv/planar_functions.h"
 #include "third_party/webrtc/common_video/libyuv/include/webrtc_libyuv.h"
 
 using ppapi::HostResource;
@@ -198,16 +199,13 @@
         gmb->Unmap();
       } else {
         DCHECK_EQ(frame.format(), media::PIXEL_FORMAT_I420);
-        for (size_t j = 0; j < media::VideoFrame::NumPlanes(frame.format());
-             ++j) {
-          const uint8_t* src = frame.visible_data(j);
-          const size_t row_bytes = frame.row_bytes(j);
-          const size_t src_stride = frame.stride(j);
-          for (int k = 0; k < frame.rows(j); ++k) {
-            memcpy(dst, src, row_bytes);
-            dst += row_bytes;
-            src += src_stride;
-          }
+        size_t num_planes = media::VideoFrame::NumPlanes(frame.format());
+        for (size_t plane = 0; plane < num_planes; ++plane) {
+          const uint8_t* src = frame.visible_data(plane);
+          int row_bytes = frame.row_bytes(plane);
+          int src_stride = frame.stride(plane);
+          int rows = frame.rows(plane);
+          libyuv::CopyPlane(src, src_stride, dst, row_bytes, row_bytes, rows);
         }
       }
 
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc
index a9c89bf..75381ef 100644
--- a/content/renderer/render_frame_impl.cc
+++ b/content/renderer/render_frame_impl.cc
@@ -74,7 +74,6 @@
 #include "content/public/common/impression.h"
 #include "content/public/common/isolated_world_ids.h"
 #include "content/public/common/navigation_policy.h"
-#include "content/public/common/page_state.h"
 #include "content/public/common/untrustworthy_context_menu_params.h"
 #include "content/public/common/url_constants.h"
 #include "content/public/common/url_utils.h"
@@ -158,6 +157,7 @@
 #include "third_party/blink/public/common/loader/resource_type_util.h"
 #include "third_party/blink/public/common/loader/url_loader_throttle.h"
 #include "third_party/blink/public/common/logging/logging_utils.h"
+#include "third_party/blink/public/common/page_state/page_state.h"
 #include "third_party/blink/public/common/thread_safe_browser_interface_broker_proxy.h"
 #include "third_party/blink/public/mojom/blob/blob.mojom.h"
 #include "third_party/blink/public/mojom/choosers/file_chooser.mojom.h"
diff --git a/content/renderer/render_view_browsertest.cc b/content/renderer/render_view_browsertest.cc
index 265cefa..93d4094c 100644
--- a/content/renderer/render_view_browsertest.cc
+++ b/content/renderer/render_view_browsertest.cc
@@ -338,7 +338,7 @@
   }
 
   void GoToOffsetWithParams(int offset,
-                            const PageState& state,
+                            const blink::PageState& state,
                             mojom::CommonNavigationParamsPtr common_params,
                             mojom::CommitNavigationParamsPtr commit_params) {
     EXPECT_TRUE(common_params->transition & ui::PAGE_TRANSITION_FORWARD_BACK);
@@ -853,7 +853,7 @@
   blink::WebHTTPBody::Element element;
   bool successful = body.ElementAt(0, element);
   EXPECT_TRUE(successful);
-  EXPECT_EQ(blink::WebHTTPBody::Element::kTypeData, element.type);
+  EXPECT_EQ(blink::HTTPBodyElementType::kTypeData, element.type);
   EXPECT_EQ(length, element.data.size());
 
   std::unique_ptr<char[]> flat_data(new char[element.data.size()]);
@@ -2176,7 +2176,7 @@
 
 TEST_F(RenderViewImplTest, TestBackForward) {
   LoadHTML("<div id=pagename>Page A</div>");
-  PageState page_a_state = GetCurrentPageState();
+  blink::PageState page_a_state = GetCurrentPageState();
   int was_page_a = -1;
   base::string16 check_page_a = base::ASCIIToUTF16(
       "Number(document.getElementById('pagename').innerHTML == 'Page A')");
@@ -2190,7 +2190,7 @@
   EXPECT_TRUE(ExecuteJavaScriptAndReturnIntValue(check_page_b, &was_page_b));
   EXPECT_EQ(1, was_page_b);
 
-  PageState back_state = GetCurrentPageState();
+  blink::PageState back_state = GetCurrentPageState();
 
   LoadHTML("<div id=pagename>Page C</div>");
   int was_page_c = -1;
@@ -2199,7 +2199,7 @@
   EXPECT_TRUE(ExecuteJavaScriptAndReturnIntValue(check_page_c, &was_page_c));
   EXPECT_EQ(1, was_page_c);
 
-  PageState forward_state = GetCurrentPageState();
+  blink::PageState forward_state = GetCurrentPageState();
 
   // Go back.
   GoBack(GURL("data:text/html;charset=utf-8,<div id=pagename>Page B</div>"),
@@ -2207,7 +2207,7 @@
 
   EXPECT_TRUE(ExecuteJavaScriptAndReturnIntValue(check_page_b, &was_page_b));
   EXPECT_EQ(1, was_page_b);
-  PageState back_state2 = GetCurrentPageState();
+  blink::PageState back_state2 = GetCurrentPageState();
 
   // Go forward.
   GoForward(GURL("data:text/html;charset=utf-8,<div id=pagename>Page C</div>"),
@@ -2790,9 +2790,9 @@
 TEST_F(RenderViewImplTest, NavigationStartForSameProcessHistoryNavigation) {
   LoadHTML("<div id=pagename>Page A</div>");
   LoadHTML("<div id=pagename>Page B</div>");
-  PageState back_state = GetCurrentPageState();
+  blink::PageState back_state = GetCurrentPageState();
   LoadHTML("<div id=pagename>Page C</div>");
-  PageState forward_state = GetCurrentPageState();
+  blink::PageState forward_state = GetCurrentPageState();
   base::RunLoop().RunUntilIdle();
   render_thread_->sink().ClearMessages();
 
@@ -2834,8 +2834,8 @@
       mojom::NavigationType::HISTORY_DIFFERENT_DOCUMENT;
 
   auto commit_params = CreateCommitNavigationParams();
-  commit_params->page_state =
-      PageState::CreateForTesting(common_params->url, false, nullptr, nullptr);
+  commit_params->page_state = blink::PageState::CreateForTesting(
+      common_params->url, false, nullptr, nullptr);
   commit_params->nav_entry_id = 42;
   commit_params->pending_history_list_offset = 1;
   commit_params->current_history_list_offset = 0;
diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc
index 4d9b8fdb..c8b9d26 100644
--- a/content/renderer/render_view_impl.cc
+++ b/content/renderer/render_view_impl.cc
@@ -52,7 +52,6 @@
 #include "content/public/common/content_constants.h"
 #include "content/public/common/content_features.h"
 #include "content/public/common/content_switches.h"
-#include "content/public/common/page_state.h"
 #include "content/public/common/referrer_type_converters.h"
 #include "content/public/common/three_d_api_types.h"
 #include "content/public/common/url_constants.h"
@@ -91,6 +90,7 @@
 #include "third_party/blink/public/common/dom_storage/session_storage_namespace_id.h"
 #include "third_party/blink/public/common/frame/user_activation_update_source.h"
 #include "third_party/blink/public/common/input/web_input_event.h"
+#include "third_party/blink/public/common/page_state/page_state.h"
 #include "third_party/blink/public/common/switches.h"
 #include "third_party/blink/public/common/web_preferences/web_preferences.h"
 #include "third_party/blink/public/platform/file_path_conversion.h"
diff --git a/content/shell/browser/shell_platform_delegate_views.cc b/content/shell/browser/shell_platform_delegate_views.cc
index 1e74c06..2faffa9 100644
--- a/content/shell/browser/shell_platform_delegate_views.cc
+++ b/content/shell/browser/shell_platform_delegate_views.cc
@@ -70,18 +70,15 @@
 namespace {
 
 // Maintain the UI controls and web view for content shell
-class ShellWindowDelegateView : public views::WidgetDelegateView,
-                                public views::TextfieldController,
-                                public views::ButtonListener {
+class ShellView : public views::View,
+                  public views::TextfieldController,
+                  public views::ButtonListener {
  public:
   enum UIControl { BACK_BUTTON, FORWARD_BUTTON, STOP_BUTTON };
 
-  explicit ShellWindowDelegateView(Shell* shell) : shell_(shell) {
-    SetHasWindowSizeControls(true);
-    InitShellWindow();
-  }
+  explicit ShellView(Shell* shell) : shell_(shell) { InitShellWindow(); }
 
-  ~ShellWindowDelegateView() override {}
+  ~ShellView() override {}
 
   // Update the state of UI controls
   void SetAddressBarURL(const GURL& url) {
@@ -116,7 +113,6 @@
 #endif
   }
 
-  void SetWindowTitle(const base::string16& title) { title_ = title; }
   void EnableUIControl(UIControl control, bool is_enabled) {
     if (control == BACK_BUTTON) {
       back_button_->SetState(is_enabled ? views::Button::STATE_NORMAL
@@ -266,9 +262,6 @@
       shell_->Stop();
   }
 
-  // Overridden from WidgetDelegateView
-  base::string16 GetWindowTitle() const override { return title_; }
-
   // Overridden from View
   gfx::Size GetMinimumSize() const override {
     // We want to be able to make the window smaller than its initial
@@ -290,7 +283,7 @@
         shell_->GoBackOrForward(1);
         return true;
       default:
-        return views::WidgetDelegateView::AcceleratorPressed(accelerator);
+        return views::View::AcceleratorPressed(accelerator);
     }
   }
 
@@ -312,9 +305,13 @@
   View* contents_view_ = nullptr;
   views::WebView* web_view_ = nullptr;
 
-  DISALLOW_COPY_AND_ASSIGN(ShellWindowDelegateView);
+  DISALLOW_COPY_AND_ASSIGN(ShellView);
 };
 
+ShellView* ShellViewForWidget(views::Widget* widget) {
+  return static_cast<ShellView*>(widget->widget_delegate()->GetContentsView());
+}
+
 }  // namespace
 
 ShellPlatformDelegate::ShellPlatformDelegate() = default;
@@ -349,16 +346,21 @@
 
   shell_data.content_size = initial_size;
 
+  auto delegate = std::make_unique<views::WidgetDelegate>();
+  delegate->SetContentsView(std::make_unique<ShellView>(shell));
+  delegate->SetHasWindowSizeControls(true);
+  delegate->SetOwnedByWidget(true);
+
 #if defined(OS_CHROMEOS)
   shell_data.window_widget = views::Widget::CreateWindowWithContext(
-      new ShellWindowDelegateView(shell),
+      std::move(delegate),
       platform_->wm_test_helper->GetDefaultParent(nullptr, gfx::Rect()),
       gfx::Rect(initial_size));
 #else
   shell_data.window_widget = new views::Widget();
   views::Widget::InitParams params;
   params.bounds = gfx::Rect(initial_size);
-  params.delegate = new ShellWindowDelegateView(shell);
+  params.delegate = delegate.release();
   params.wm_class_class = "chromium-content_shell";
   params.wm_class_name = params.wm_class_class;
   shell_data.window_widget->Init(std::move(params));
@@ -384,10 +386,8 @@
   DCHECK(base::Contains(shell_data_map_, shell));
   ShellData& shell_data = shell_data_map_[shell];
 
-  views::WidgetDelegate* widget_delegate =
-      shell_data.window_widget->widget_delegate();
-  auto* delegate_view = static_cast<ShellWindowDelegateView*>(widget_delegate);
-  delegate_view->SetWebContents(shell->web_contents(), shell_data.content_size);
+  ShellViewForWidget(shell_data.window_widget)
+      ->SetWebContents(shell->web_contents(), shell_data.content_size);
   shell_data.window_widget->GetNativeWindow()->GetHost()->Show();
   shell_data.window_widget->Show();
 }
@@ -406,17 +406,13 @@
   DCHECK(base::Contains(shell_data_map_, shell));
   ShellData& shell_data = shell_data_map_[shell];
 
-  auto* delegate_view = static_cast<ShellWindowDelegateView*>(
-      shell_data.window_widget->widget_delegate());
+  auto* view = ShellViewForWidget(shell_data.window_widget);
   if (control == BACK_BUTTON) {
-    delegate_view->EnableUIControl(ShellWindowDelegateView::BACK_BUTTON,
-                                   is_enabled);
+    view->EnableUIControl(ShellView::BACK_BUTTON, is_enabled);
   } else if (control == FORWARD_BUTTON) {
-    delegate_view->EnableUIControl(ShellWindowDelegateView::FORWARD_BUTTON,
-                                   is_enabled);
+    view->EnableUIControl(ShellView::FORWARD_BUTTON, is_enabled);
   } else if (control == STOP_BUTTON) {
-    delegate_view->EnableUIControl(ShellWindowDelegateView::STOP_BUTTON,
-                                   is_enabled);
+    view->EnableUIControl(ShellView::STOP_BUTTON, is_enabled);
   }
 }
 
@@ -427,9 +423,7 @@
   DCHECK(base::Contains(shell_data_map_, shell));
   ShellData& shell_data = shell_data_map_[shell];
 
-  auto* delegate_view = static_cast<ShellWindowDelegateView*>(
-      shell_data.window_widget->widget_delegate());
-  delegate_view->SetAddressBarURL(url);
+  ShellViewForWidget(shell_data.window_widget)->SetAddressBarURL(url);
 }
 
 void ShellPlatformDelegate::SetIsLoading(Shell* shell, bool loading) {}
@@ -439,10 +433,7 @@
   DCHECK(base::Contains(shell_data_map_, shell));
   ShellData& shell_data = shell_data_map_[shell];
 
-  auto* delegate_view = static_cast<ShellWindowDelegateView*>(
-      shell_data.window_widget->widget_delegate());
-  delegate_view->SetWindowTitle(title);
-  shell_data.window_widget->UpdateWindowTitle();
+  shell_data.window_widget->widget_delegate()->SetTitle(title);
 }
 
 void ShellPlatformDelegate::RenderViewReady(Shell* shell) {}
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn
index 8aef6f6..8a4473ca 100644
--- a/content/test/BUILD.gn
+++ b/content/test/BUILD.gn
@@ -2001,11 +2001,9 @@
     "../common/input/touch_event_stream_validator_unittest.cc",
     "../common/inter_process_time_ticks_converter_unittest.cc",
     "../common/origin_util_unittest.cc",
-    "../common/page_state_serialization_unittest.cc",
     "../common/service_manager/service_manager_connection_impl_unittest.cc",
     "../common/service_worker/service_worker_utils_unittest.cc",
     "../common/state_transitions_unittest.cc",
-    "../common/unique_name_helper_unittest.cc",
     "../common/user_agent_unittest.cc",
     "../common/webplugininfo_unittest.cc",
     "../public/browser/site_isolation_policy_unittest.cc",
diff --git a/content/test/data/accessibility/html/contenteditable-descendants-expected-auralinux.txt b/content/test/data/accessibility/html/contenteditable-descendants-expected-auralinux.txt
index 872ffb7..4c3a4dba 100644
--- a/content/test/data/accessibility/html/contenteditable-descendants-expected-auralinux.txt
+++ b/content/test/data/accessibility/html/contenteditable-descendants-expected-auralinux.txt
@@ -15,7 +15,8 @@
 ++++++++++[static] name='Always expose editable tables as tables.' editable
 ++++[list] editable
 ++++++[list item] editable
-++++++++[static] name='1. ' editable
+++++++++[panel] editable
+++++++++++[static] name='1. '
 ++++++++[static] name='Editable list item.' editable
 ++[paragraph]
 ++++[static] name='Non-editable paragraph.'
diff --git a/content/test/data/accessibility/html/contenteditable-descendants-expected-blink.txt b/content/test/data/accessibility/html/contenteditable-descendants-expected-blink.txt
index e53ced6..7a5e55d9 100644
--- a/content/test/data/accessibility/html/contenteditable-descendants-expected-blink.txt
+++ b/content/test/data/accessibility/html/contenteditable-descendants-expected-blink.txt
@@ -26,6 +26,8 @@
 ++++++++list editable richlyEditable
 ++++++++++listItem editable richlyEditable
 ++++++++++++listMarker editable richlyEditable name='1. '
+++++++++++++++staticText name='1. '
+++++++++++++++++inlineTextBox name='1. '
 ++++++++++++staticText editable richlyEditable name='Editable list item.'
 ++++++++++++++inlineTextBox name='Editable list item.'
 ++++++paragraph
diff --git a/content/test/data/accessibility/html/contenteditable-descendants-expected-uia-win.txt b/content/test/data/accessibility/html/contenteditable-descendants-expected-uia-win.txt
index 3752fa2a..745fc46b 100644
--- a/content/test/data/accessibility/html/contenteditable-descendants-expected-uia-win.txt
+++ b/content/test/data/accessibility/html/contenteditable-descendants-expected-uia-win.txt
@@ -15,7 +15,8 @@
 ++++++++++Text Name='Always expose editable tables as tables.' IsControlElement=false
 ++++List
 ++++++ListItem
-++++++++Text Name='1. ' IsControlElement=false
+++++++++Group
+++++++++++Text Name='1. ' IsControlElement=false
 ++++++++Text Name='Editable list item.' IsControlElement=false
 ++Group IsControlElement=false
 ++++Text Name='Non-editable paragraph.'
diff --git a/content/test/data/accessibility/html/contenteditable-descendants-expected-win.txt b/content/test/data/accessibility/html/contenteditable-descendants-expected-win.txt
index 659067a..16d32da 100644
--- a/content/test/data/accessibility/html/contenteditable-descendants-expected-win.txt
+++ b/content/test/data/accessibility/html/contenteditable-descendants-expected-win.txt
@@ -14,8 +14,9 @@
 ++++++++ROLE_SYSTEM_CELL name='Always expose editable tables as tables.' IA2_STATE_EDITABLE ia2_hypertext='Always expose editable tables as tables.' n_selections=0
 ++++++++++ROLE_SYSTEM_STATICTEXT name='Always expose editable tables as tables.' IA2_STATE_EDITABLE ia2_hypertext='Always expose editable tables as tables.' n_selections=0
 ++++ROLE_SYSTEM_LIST IA2_STATE_EDITABLE ia2_hypertext='<obj0>' n_selections=0
-++++++ROLE_SYSTEM_LISTITEM IA2_STATE_EDITABLE ia2_hypertext='1. Editable list item.' n_selections=0
-++++++++ROLE_SYSTEM_STATICTEXT name='1. ' IA2_STATE_EDITABLE ia2_hypertext='1. ' n_selections=0
+++++++ROLE_SYSTEM_LISTITEM IA2_STATE_EDITABLE ia2_hypertext='<obj0>Editable list item.' n_selections=0
+++++++++ROLE_SYSTEM_GROUPING IA2_STATE_EDITABLE ia2_hypertext='1. ' n_selections=0
+++++++++++ROLE_SYSTEM_STATICTEXT name='1. ' ia2_hypertext='1. ' n_selections=0
 ++++++++ROLE_SYSTEM_STATICTEXT name='Editable list item.' IA2_STATE_EDITABLE ia2_hypertext='Editable list item.' n_selections=0
 ++IA2_ROLE_PARAGRAPH ia2_hypertext='Non-editable paragraph.' n_selections=0
 ++++ROLE_SYSTEM_STATICTEXT name='Non-editable paragraph.' ia2_hypertext='Non-editable paragraph.' n_selections=0
diff --git a/content/test/data/accessibility/html/contenteditable-descendants-with-selection-expected-auralinux.txt b/content/test/data/accessibility/html/contenteditable-descendants-with-selection-expected-auralinux.txt
index 7d89afef..87602c67 100644
--- a/content/test/data/accessibility/html/contenteditable-descendants-with-selection-expected-auralinux.txt
+++ b/content/test/data/accessibility/html/contenteditable-descendants-with-selection-expected-auralinux.txt
@@ -15,5 +15,6 @@
 ++++++++++[static] name='Always expose editable tables as tables.' editable selection_start=0 selection_end=3
 ++++[list] editable selection_start=0 selection_end=3
 ++++++[list item] editable selection_start=0 selection_end=3
-++++++++[static] name='1. ' editable selection_start=0 selection_end=3
+++++++++[panel] editable selection_start=0 selection_end=3
+++++++++++[static] name='1. ' selection_start=0 selection_end=3
 ++++++++[static] name='Editable list item.' editable selection_start=0 selection_end=3
diff --git a/content/test/data/accessibility/html/contenteditable-descendants-with-selection-expected-blink.txt b/content/test/data/accessibility/html/contenteditable-descendants-with-selection-expected-blink.txt
index 1ffcf1e..ba4a362 100644
--- a/content/test/data/accessibility/html/contenteditable-descendants-with-selection-expected-blink.txt
+++ b/content/test/data/accessibility/html/contenteditable-descendants-with-selection-expected-blink.txt
@@ -26,5 +26,7 @@
 ++++++++list editable richlyEditable
 ++++++++++listItem editable richlyEditable
 ++++++++++++listMarker editable richlyEditable name='1. '
+++++++++++++++staticText name='1. '
+++++++++++++++++inlineTextBox name='1. '
 ++++++++++++staticText editable richlyEditable name='Editable list item.'
 ++++++++++++++inlineTextBox name='Editable list item.'
diff --git a/content/test/data/accessibility/html/contenteditable-descendants-with-selection-expected-uia-win.txt b/content/test/data/accessibility/html/contenteditable-descendants-with-selection-expected-uia-win.txt
index 1095415..c0a2d21 100644
--- a/content/test/data/accessibility/html/contenteditable-descendants-with-selection-expected-uia-win.txt
+++ b/content/test/data/accessibility/html/contenteditable-descendants-with-selection-expected-uia-win.txt
@@ -15,5 +15,6 @@
 ++++++++++Text Name='Always expose editable tables as tables.' IsControlElement=false
 ++++List
 ++++++ListItem
-++++++++Text Name='1. ' IsControlElement=false
+++++++++Group
+++++++++++Text Name='1. ' IsControlElement=false
 ++++++++Text Name='Editable list item.' IsControlElement=false
diff --git a/content/test/data/accessibility/html/contenteditable-descendants-with-selection-expected-win.txt b/content/test/data/accessibility/html/contenteditable-descendants-with-selection-expected-win.txt
index 24345161..fd33bdd 100644
--- a/content/test/data/accessibility/html/contenteditable-descendants-with-selection-expected-win.txt
+++ b/content/test/data/accessibility/html/contenteditable-descendants-with-selection-expected-win.txt
@@ -14,6 +14,7 @@
 ++++++++ROLE_SYSTEM_CELL name='Always expose editable tables as tables.' IA2_STATE_EDITABLE ia2_hypertext='Always expose editable tables as tables.' n_selections=1 selection_start=0 selection_end=3
 ++++++++++ROLE_SYSTEM_STATICTEXT name='Always expose editable tables as tables.' IA2_STATE_EDITABLE ia2_hypertext='Always expose editable tables as tables.' n_selections=1 selection_start=0 selection_end=3
 ++++ROLE_SYSTEM_LIST IA2_STATE_EDITABLE ia2_hypertext='<obj0>' n_selections=1 selection_start=0 selection_end=3
-++++++ROLE_SYSTEM_LISTITEM IA2_STATE_EDITABLE ia2_hypertext='1. Editable list item.' n_selections=1 selection_start=0 selection_end=3
-++++++++ROLE_SYSTEM_STATICTEXT name='1. ' IA2_STATE_EDITABLE ia2_hypertext='1. ' n_selections=1 selection_start=0 selection_end=3
+++++++ROLE_SYSTEM_LISTITEM IA2_STATE_EDITABLE ia2_hypertext='<obj0>Editable list item.' n_selections=1 selection_start=0 selection_end=3
+++++++++ROLE_SYSTEM_GROUPING IA2_STATE_EDITABLE ia2_hypertext='1. ' n_selections=1 selection_start=0 selection_end=3
+++++++++++ROLE_SYSTEM_STATICTEXT name='1. ' ia2_hypertext='1. ' n_selections=1 selection_start=0 selection_end=3
 ++++++++ROLE_SYSTEM_STATICTEXT name='Editable list item.' IA2_STATE_EDITABLE ia2_hypertext='Editable list item.' n_selections=1 selection_start=0 selection_end=3
diff --git a/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt
index 62a8e1a..4e8a6bc 100644
--- a/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt
+++ b/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt
@@ -357,8 +357,9 @@
 # 3D box is shaded incorrectly using SkiaRenderer Dawn on Windows.
 crbug.com/1082769 [ win use-skia-dawn ] Pixel_CSS3DBlueBox [ Failure ]
 
-# Flakes on gpu-fyi-try-chromeos-kevin, produces notably different image.
+# Flakes on gpu-fyi-try-chromeos-kevin and Fuchsia x64, produces notably different image.
 crbug.com/1086687 [ chromeos chromeos-board-kevin ] Pixel_PrecisionRoundedCorner [ Skip ]
+crbug.com/1136875 [ fuchsia ] Pixel_PrecisionRoundedCorner [ Skip ]
 
 # Still fails on Nexus 5 after all other Pixel_CanvasLowLatency* pass.
 crbug.com/1097752 [ android qualcomm-adreno-(tm)-330 ] Pixel_CanvasLowLatencyWebGLAlphaFalse [ Skip ]
diff --git a/content/test/navigation_simulator_impl.cc b/content/test/navigation_simulator_impl.cc
index ea20f0ea..ce149d7 100644
--- a/content/test/navigation_simulator_impl.cc
+++ b/content/test/navigation_simulator_impl.cc
@@ -1369,8 +1369,8 @@
   if (!same_document)
     params->embedding_token = base::UnguessableToken::Create();
 
-  params->page_state =
-      page_state_.value_or(PageState::CreateForTestingWithSequenceNumbers(
+  params->page_state = page_state_.value_or(
+      blink::PageState::CreateForTestingWithSequenceNumbers(
           navigation_url_, params->item_sequence_number,
           params->document_sequence_number));
 
diff --git a/content/test/navigation_simulator_impl.h b/content/test/navigation_simulator_impl.h
index 54f1aa4..bcad524 100644
--- a/content/test/navigation_simulator_impl.h
+++ b/content/test/navigation_simulator_impl.h
@@ -164,7 +164,9 @@
         block_invoking_before_unload_completed_callback;
   }
 
-  void set_page_state(const PageState& page_state) { page_state_ = page_state; }
+  void set_page_state(const blink::PageState& page_state) {
+    page_state_ = page_state;
+  }
 
   void set_origin(const url::Origin& origin) { origin_ = origin; }
 
@@ -309,7 +311,7 @@
       net::HttpResponseInfo::CONNECTION_INFO_UNKNOWN;
   net::ResolveErrorInfo resolve_error_info_ = net::ResolveErrorInfo(net::OK);
   base::Optional<net::SSLInfo> ssl_info_;
-  base::Optional<PageState> page_state_;
+  base::Optional<blink::PageState> page_state_;
   base::Optional<url::Origin> origin_;
   base::Optional<Impression> impression_;
   int64_t post_id_ = -1;
diff --git a/content/test/test_render_frame.cc b/content/test/test_render_frame.cc
index 1986f5ee..fd97f84 100644
--- a/content/test/test_render_frame.cc
+++ b/content/test/test_render_frame.cc
@@ -208,7 +208,7 @@
 
   void FrameSizeChanged(const gfx::Size& frame_size) override {}
 
-  void UpdateState(const PageState& state) override {
+  void UpdateState(const blink::PageState& state) override {
     is_page_state_updated_ = true;
   }
 
diff --git a/content/test/test_render_frame_host.cc b/content/test/test_render_frame_host.cc
index 3fdcdb4..fcd226e 100644
--- a/content/test/test_render_frame_host.cc
+++ b/content/test/test_render_frame_host.cc
@@ -229,7 +229,8 @@
        url.ReplaceComponents(replacements) ==
            GetLastCommittedURL().ReplaceComponents(replacements));
 
-  params.page_state = PageState::CreateForTesting(url, false, nullptr, nullptr);
+  params.page_state =
+      blink::PageState::CreateForTesting(url, false, nullptr, nullptr);
   if (!was_within_same_document)
     params.embedding_token = base::UnguessableToken::Create();
 
@@ -633,7 +634,7 @@
   url::Origin origin = url::Origin::Create(url);
   params->origin = origin;
 
-  params->page_state = PageState::CreateForTestingWithSequenceNumbers(
+  params->page_state = blink::PageState::CreateForTestingWithSequenceNumbers(
       url, params->item_sequence_number, params->document_sequence_number);
 
   return params;
diff --git a/content/test/test_render_view_host.cc b/content/test/test_render_view_host.cc
index 8f6bfa9..21e01623 100644
--- a/content/test/test_render_view_host.cc
+++ b/content/test/test_render_view_host.cc
@@ -28,12 +28,12 @@
 #include "content/public/browser/storage_partition.h"
 #include "content/public/common/content_client.h"
 #include "content/public/common/drop_data.h"
-#include "content/public/common/page_state.h"
 #include "content/test/test_render_frame_host.h"
 #include "content/test/test_render_view_host.h"
 #include "content/test/test_web_contents.h"
 #include "media/base/video_frame.h"
 #include "mojo/public/cpp/bindings/pending_remote.h"
+#include "third_party/blink/public/common/page_state/page_state.h"
 #include "third_party/blink/public/common/web_preferences/web_preferences.h"
 #include "third_party/blink/public/mojom/page/drag.mojom.h"
 #include "ui/aura/env.h"
@@ -62,7 +62,7 @@
   params->did_create_new_entry = did_create_new_entry;
   params->gesture = NavigationGestureUser;
   params->method = "GET";
-  params->page_state = PageState::CreateFromURL(url);
+  params->page_state = blink::PageState::CreateFromURL(url);
 }
 
 TestRenderWidgetHostView::TestRenderWidgetHostView(RenderWidgetHost* rwh)
@@ -337,8 +337,8 @@
 
 void TestRenderViewHost::TestOnUpdateStateWithFile(
     const base::FilePath& file_path) {
-  PageState state = PageState::CreateForTesting(GURL("http://www.google.com"),
-                                                false, "data", &file_path);
+  auto state = blink::PageState::CreateForTesting(GURL("http://www.google.com"),
+                                                  false, "data", &file_path);
   static_cast<RenderFrameHostImpl*>(GetMainFrame())->UpdateState(state);
 }
 
diff --git a/content/test/test_web_contents.cc b/content/test/test_web_contents.cc
index 26fa154..8cf45c5 100644
--- a/content/test/test_web_contents.cc
+++ b/content/test/test_web_contents.cc
@@ -25,11 +25,11 @@
 #include "content/public/browser/notification_registrar.h"
 #include "content/public/browser/notification_source.h"
 #include "content/public/browser/notification_types.h"
-#include "content/public/common/page_state.h"
 #include "content/public/common/url_utils.h"
 #include "content/public/test/mock_render_process_host.h"
 #include "content/public/test/navigation_simulator.h"
 #include "content/test/test_render_view_host.h"
+#include "third_party/blink/public/common/page_state/page_state.h"
 #include "third_party/blink/public/mojom/security_context/insecure_request_policy.mojom.h"
 #include "ui/base/page_transition_types.h"
 
@@ -176,10 +176,10 @@
   params.http_status_code = 200;
   params.url_is_unreachable = false;
   if (item_sequence_number != -1 && document_sequence_number != -1) {
-    params.page_state = PageState::CreateForTestingWithSequenceNumbers(
+    params.page_state = blink::PageState::CreateForTestingWithSequenceNumbers(
         url, item_sequence_number, document_sequence_number);
   } else {
-    params.page_state = PageState::CreateFromURL(url);
+    params.page_state = blink::PageState::CreateFromURL(url);
   }
   params.original_request_url = GURL();
   params.is_overriding_user_agent = false;
diff --git a/content/web_test/browser/web_test_control_host.cc b/content/web_test/browser/web_test_control_host.cc
index a1597c50..e6b609b9 100644
--- a/content/web_test/browser/web_test_control_host.cc
+++ b/content/web_test/browser/web_test_control_host.cc
@@ -36,7 +36,6 @@
 #include "base/threading/thread_task_runner_handle.h"
 #include "build/build_config.h"
 #include "cc/paint/skia_paint_canvas.h"
-#include "content/common/page_state_serialization.h"
 #include "content/public/browser/browser_task_traits.h"
 #include "content/public/browser/child_process_security_policy.h"
 #include "content/public/browser/child_process_termination_info.h"
@@ -58,7 +57,6 @@
 #include "content/public/browser/web_contents.h"
 #include "content/public/common/bindings_policy.h"
 #include "content/public/common/content_switches.h"
-#include "content/public/common/page_state.h"
 #include "content/public/common/url_constants.h"
 #include "content/public/test/blink_test_browser_support.h"
 #include "content/shell/browser/shell.h"
@@ -88,6 +86,8 @@
 #include "storage/browser/file_system/isolated_context.h"
 #include "storage/browser/quota/quota_manager.h"
 #include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h"
+#include "third_party/blink/public/common/page_state/page_state.h"
+#include "third_party/blink/public/common/page_state/page_state_serialization.h"
 #include "third_party/blink/public/common/unique_name/unique_name_helper.h"
 #include "third_party/blink/public/platform/web_rect.h"
 #include "ui/base/ui_base_switches.h"
@@ -104,7 +104,7 @@
 
 namespace {
 
-std::string DumpFrameState(const ExplodedFrameState& frame_state,
+std::string DumpFrameState(const blink::ExplodedFrameState& frame_state,
                            size_t indent,
                            bool is_current_index) {
   std::string result;
@@ -129,10 +129,11 @@
   }
   result.append("\n");
 
-  std::vector<ExplodedFrameState> sorted_children = frame_state.children;
+  std::vector<blink::ExplodedFrameState> sorted_children = frame_state.children;
   std::sort(
       sorted_children.begin(), sorted_children.end(),
-      [](const ExplodedFrameState& lhs, const ExplodedFrameState& rhs) {
+      [](const blink::ExplodedFrameState& lhs,
+         const blink::ExplodedFrameState& rhs) {
         // Child nodes should always have a target (aka unique name).
         DCHECK(lhs.target);
         DCHECK(rhs.target);
@@ -156,9 +157,10 @@
 std::string DumpNavigationEntry(NavigationEntry* navigation_entry,
                                 bool is_current_index) {
   // This is silly, but it's currently the best way to extract the information.
-  PageState page_state = navigation_entry->GetPageState();
-  ExplodedPageState exploded_page_state;
-  CHECK(DecodePageState(page_state.ToEncodedData(), &exploded_page_state));
+  blink::PageState page_state = navigation_entry->GetPageState();
+  blink::ExplodedPageState exploded_page_state;
+  CHECK(
+      blink::DecodePageState(page_state.ToEncodedData(), &exploded_page_state));
   return DumpFrameState(exploded_page_state.top, 8, is_current_index);
 }
 
diff --git a/crypto/nss_key_util.h b/crypto/nss_key_util.h
index 112a1b9b..9b642a6 100644
--- a/crypto/nss_key_util.h
+++ b/crypto/nss_key_util.h
@@ -51,12 +51,18 @@
 // Decodes |input| as a DER-encoded X.509 SubjectPublicKeyInfo and searches for
 // the private key half in the key database. Returns the private key on success
 // or nullptr on error.
+// Note: This function assumes the CKA_ID for public/private key pairs is
+// derived from the public key. NSS does this, but this is not guaranteed by
+// PKCS#11, so keys generated outside of NSS may not be found.
 CRYPTO_EXPORT ScopedSECKEYPrivateKey
 FindNSSKeyFromPublicKeyInfo(base::span<const uint8_t> input);
 
 // Decodes |input| as a DER-encoded X.509 SubjectPublicKeyInfo and searches for
 // the private key half in the slot specified by |slot|. Returns the private key
 // on success or nullptr on error.
+// Note: This function assumes the CKA_ID for public/private key pairs is
+// derived from the public key. NSS does this, but this is not guaranteed by
+// PKCS#11, so keys generated outside of NSS may not be found.
 CRYPTO_EXPORT ScopedSECKEYPrivateKey
 FindNSSKeyFromPublicKeyInfoInSlot(base::span<const uint8_t> input,
                                   PK11SlotInfo* slot);
diff --git a/crypto/scoped_nss_types.h b/crypto/scoped_nss_types.h
index 0a663ea7..ce86fc7 100644
--- a/crypto/scoped_nss_types.h
+++ b/crypto/scoped_nss_types.h
@@ -17,16 +17,12 @@
 
 template <typename Type, void (*Destroyer)(Type*)>
 struct NSSDestroyer {
-  void operator()(Type* ptr) const {
-    Destroyer(ptr);
-  }
+  void operator()(Type* ptr) const { Destroyer(ptr); }
 };
 
 template <typename Type, void (*Destroyer)(Type*, PRBool), PRBool freeit>
 struct NSSDestroyer1 {
-  void operator()(Type* ptr) const {
-    Destroyer(ptr, freeit);
-  }
+  void operator()(Type* ptr) const { Destroyer(ptr, freeit); }
 };
 
 // Define some convenient scopers around NSS pointers.
@@ -39,6 +35,10 @@
 typedef std::unique_ptr<PK11SlotList,
                         NSSDestroyer<PK11SlotList, PK11_FreeSlotList>>
     ScopedPK11SlotList;
+typedef std::unique_ptr<
+    SECKEYPublicKeyList,
+    NSSDestroyer<SECKEYPublicKeyList, SECKEY_DestroyPublicKeyList>>
+    ScopedSECKEYPublicKeyList;
 typedef std::unique_ptr<PK11SymKey, NSSDestroyer<PK11SymKey, PK11_FreeSymKey>>
     ScopedPK11SymKey;
 typedef std::unique_ptr<SECKEYPublicKey,
diff --git a/ios/chrome/browser/passwords/ios_chrome_password_manager_client.h b/ios/chrome/browser/passwords/ios_chrome_password_manager_client.h
index 919cc23..83d5a72 100644
--- a/ios/chrome/browser/passwords/ios_chrome_password_manager_client.h
+++ b/ios/chrome/browser/passwords/ios_chrome_password_manager_client.h
@@ -115,6 +115,7 @@
   bool IsIsolationForPasswordSitesEnabled() const override;
   bool IsNewTabPage() const override;
   password_manager::FieldInfoManager* GetFieldInfoManager() const override;
+  bool IsAutofillAssistantUIVisible() const override;
 
  private:
   __weak id<IOSChromePasswordManagerClientBridge> bridge_;
diff --git a/ios/chrome/browser/passwords/ios_chrome_password_manager_client.mm b/ios/chrome/browser/passwords/ios_chrome_password_manager_client.mm
index cddab07..41b9d68 100644
--- a/ios/chrome/browser/passwords/ios_chrome_password_manager_client.mm
+++ b/ios/chrome/browser/passwords/ios_chrome_password_manager_client.mm
@@ -294,3 +294,7 @@
 IOSChromePasswordManagerClient::GetFieldInfoManager() const {
   return nullptr;
 }
+
+bool IOSChromePasswordManagerClient::IsAutofillAssistantUIVisible() const {
+  return false;
+}
diff --git a/ios/chrome/browser/ui/bookmarks/bookmarks_entries_egtest.mm b/ios/chrome/browser/ui/bookmarks/bookmarks_entries_egtest.mm
index 71f28eb..03b44c6 100644
--- a/ios/chrome/browser/ui/bookmarks/bookmarks_entries_egtest.mm
+++ b/ios/chrome/browser/ui/bookmarks/bookmarks_entries_egtest.mm
@@ -12,6 +12,7 @@
 #import "ios/chrome/browser/ui/bookmarks/bookmark_earl_grey_ui.h"
 #import "ios/chrome/browser/ui/bookmarks/bookmark_ui_constants.h"
 #import "ios/chrome/browser/ui/table_view/feature_flags.h"
+#import "ios/chrome/browser/ui/util/multi_window_support.h"
 #include "ios/chrome/grit/ios_strings.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
 #import "ios/chrome/test/earl_grey/chrome_matchers.h"
@@ -47,13 +48,11 @@
 
   [ChromeEarlGrey waitForBookmarksToFinishLoading];
   [ChromeEarlGrey clearBookmarks];
-  [BookmarkEarlGrey clearBookmarksPositionCache];
 }
 
 // Tear down called once per test.
 - (void)tearDown {
   [super tearDown];
-  [ChromeEarlGrey closeAllExtraWindows];
   [ChromeEarlGrey clearBookmarks];
   [BookmarkEarlGrey clearBookmarksPositionCache];
 }
@@ -198,21 +197,23 @@
 
 // Tests display and selection of 'Open in New Window' in a context menu on a
 // bookmarks entry.
-- (void)testContextMenuOpenInNewWindow {
+// TODO(crbug.com/1126893): reenable this test once EG multiwindow support is
+// available.
+- (void)DISABLED_testContextMenuOpenInNewWindow {
   // TODO(crbug.com/1035764): EG1 Test fails on iOS 12.
   if (!base::ios::IsRunningOnIOS13OrLater()) {
     EARL_GREY_TEST_DISABLED(@"EG1 Fails on iOS 12.");
   }
 
-  if (![ChromeEarlGrey areMultipleWindowsSupported]) {
-    EARL_GREY_TEST_DISABLED(@"Multiple windows can't be opened.");
+  if (!IsMultipleScenesSupported()) {
+    EARL_GREY_TEST_DISABLED(@"Multiple scenes can't be opened.");
   }
 
   [BookmarkEarlGrey setupStandardBookmarks];
   [BookmarkEarlGreyUI openBookmarks];
   [BookmarkEarlGreyUI openMobileBookmarks];
 
-  [ChromeEarlGrey waitForForegroundWindowCount:1];
+  [ChromeEarlGrey waitForBrowserCount:1];
 
   // Open a bookmark in a new window (through a long press).
   [[EarlGrey selectElementWithMatcher:grey_accessibilityID(@"First URL")]
@@ -223,7 +224,10 @@
   [[EarlGrey selectElementWithMatcher:chrome_test_util::OmniboxText(
                                           GetFirstUrl().GetContent())]
       assertWithMatcher:grey_notNil()];
-  [ChromeEarlGrey waitForForegroundWindowCount:2];
+  [ChromeEarlGrey waitForBrowserCount:2];
+
+  [ChromeEarlGrey closeCurrentTab];
+  [ChromeEarlGrey waitForBrowserCount:1];
 }
 
 // Verify Edit Text functionality on single URL selection.
diff --git a/ios/chrome/browser/ui/history/history_ui_egtest.mm b/ios/chrome/browser/ui/history/history_ui_egtest.mm
index e5ac5d4..f6d4ba34 100644
--- a/ios/chrome/browser/ui/history/history_ui_egtest.mm
+++ b/ios/chrome/browser/ui/history/history_ui_egtest.mm
@@ -15,6 +15,7 @@
 #import "ios/chrome/browser/ui/table_view/feature_flags.h"
 #import "ios/chrome/browser/ui/table_view/table_view_constants.h"
 #import "ios/chrome/browser/ui/ui_feature_flags.h"
+#import "ios/chrome/browser/ui/util/multi_window_support.h"
 #include "ios/chrome/common/string_util.h"
 #include "ios/chrome/grit/ios_strings.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
@@ -122,9 +123,6 @@
 
 - (void)setUp {
   [super setUp];
-
-  [ChromeEarlGrey closeAllExtraWindows];
-
   self.testServer->RegisterRequestHandler(
       base::BindRepeating(&StandardResponse));
   GREYAssertTrue(self.testServer->Start(), @"Server did not start.");
@@ -140,8 +138,6 @@
 }
 
 - (void)tearDown {
-  [ChromeEarlGrey closeAllExtraWindows];
-
   NSError* error = nil;
   // Dismiss search bar by pressing cancel, if present. Passing error prevents
   // failure if the element is not found.
@@ -399,14 +395,16 @@
 
 // Tests display and selection of 'Open in New Window' in a context menu on a
 // history entry.
-- (void)testContextMenuOpenInNewWindow {
-  if (![ChromeEarlGrey areMultipleWindowsSupported])
-    EARL_GREY_TEST_DISABLED(@"Multiple windows can't be opened.");
+// TODO(crbug.com/1126893): reenable this test once EG multiwindow support is
+// available.
+- (void)DISABLED_testContextMenuOpenInNewWindow {
+  if (!IsMultipleScenesSupported())
+    return;
 
   [self loadTestURLs];
   [self openHistoryPanel];
 
-  [ChromeEarlGrey waitForForegroundWindowCount:1];
+  [ChromeEarlGrey waitForBrowserCount:1];
 
   // Long press on the history element.
   [[EarlGrey
@@ -417,10 +415,13 @@
   // selected URL in the new window.
   [[EarlGrey selectElementWithMatcher:OpenLinkInNewWindowButton()]
       performAction:grey_tap()];
-  [ChromeEarlGrey waitForForegroundWindowCount:2];
   [[EarlGrey selectElementWithMatcher:chrome_test_util::OmniboxText(
                                           _URL1.GetContent())]
       assertWithMatcher:grey_notNil()];
+  [ChromeEarlGrey waitForBrowserCount:2];
+
+  [ChromeEarlGrey closeCurrentTab];
+  [ChromeEarlGrey waitForBrowserCount:1];
 }
 
 // Tests display and selection of 'Open in New Incognito Tab' in a context menu
diff --git a/ios/chrome/browser/ui/location_bar/location_bar_view_controller.mm b/ios/chrome/browser/ui/location_bar/location_bar_view_controller.mm
index f7cec02..7dbd3c4 100644
--- a/ios/chrome/browser/ui/location_bar/location_bar_view_controller.mm
+++ b/ios/chrome/browser/ui/location_bar/location_bar_view_controller.mm
@@ -596,7 +596,7 @@
         initWithTitle:l10n_util::GetNSString(IDS_IOS_SEARCH_COPIED_TEXT)
                action:@selector(searchCopiedText:)]);
 
-    DCHECK([self updateCachedClipboardStateWithCompletion:^() {
+    BOOL updateSuccessful = [self updateCachedClipboardStateWithCompletion:^() {
       if (@available(iOS 13, *)) {
         [menu showMenuFromView:self.view rect:self.locationBarSteadyView.frame];
       } else {
@@ -608,7 +608,8 @@
       // presented menu.
       UIAccessibilityPostNotification(UIAccessibilityLayoutChangedNotification,
                                       menu);
-    }]);
+    }];
+    DCHECK(updateSuccessful);
   }
 }
 
diff --git a/ios/chrome/browser/ui/popup_menu/popup_menu_constants.h b/ios/chrome/browser/ui/popup_menu/popup_menu_constants.h
index 0c7c5af..e935e2d 100644
--- a/ios/chrome/browser/ui/popup_menu/popup_menu_constants.h
+++ b/ios/chrome/browser/ui/popup_menu/popup_menu_constants.h
@@ -21,7 +21,7 @@
 // New Tab item accessibility Identifier.
 extern NSString* const kToolsMenuNewTabId;
 // New Tab item accessibility Identifier.
-extern NSString* const kToolsMenuNewWindowId;
+extern NSString* const kToolsMenuNewWindow;
 // New incognito Tab item accessibility Identifier.
 extern NSString* const kToolsMenuNewIncognitoTabId;
 // Close all Tabs item accessibility Identifier.
diff --git a/ios/chrome/browser/ui/popup_menu/popup_menu_constants.mm b/ios/chrome/browser/ui/popup_menu/popup_menu_constants.mm
index aa3ba5e..631d763 100644
--- a/ios/chrome/browser/ui/popup_menu/popup_menu_constants.mm
+++ b/ios/chrome/browser/ui/popup_menu/popup_menu_constants.mm
@@ -17,7 +17,7 @@
 NSString* const kToolsMenuReload = @"kToolsMenuReload";
 NSString* const kToolsMenuStop = @"kToolsMenuStop";
 NSString* const kToolsMenuNewTabId = @"kToolsMenuNewTabId";
-NSString* const kToolsMenuNewWindowId = @"kToolsMenuNewWindowId";
+NSString* const kToolsMenuNewWindow = @"kToolsMenuNewWindow";
 NSString* const kToolsMenuNewIncognitoTabId = @"kToolsMenuNewIncognitoTabId";
 NSString* const kToolsMenuCloseAllTabsId = @"kToolsMenuCloseAllTabsId";
 NSString* const kToolsMenuCloseAllIncognitoTabsId =
diff --git a/ios/chrome/browser/ui/popup_menu/popup_menu_egtest.mm b/ios/chrome/browser/ui/popup_menu/popup_menu_egtest.mm
index 9d2d49f..9cccd3e 100644
--- a/ios/chrome/browser/ui/popup_menu/popup_menu_egtest.mm
+++ b/ios/chrome/browser/ui/popup_menu/popup_menu_egtest.mm
@@ -147,18 +147,6 @@
       assertWithMatcher:grey_notVisible()];
 }
 
-- (void)testNewWindowFromToolsMenu {
-  if (![ChromeEarlGrey areMultipleWindowsSupported])
-    EARL_GREY_TEST_DISABLED(@"Multiple windows can't be opened.");
-
-  [ChromeEarlGreyUI openToolsMenu];
-  [ChromeEarlGreyUI
-      tapToolsMenuButton:chrome_test_util::OpenNewWindowMenuButton()];
-
-  // Verify the second window.
-  [ChromeEarlGrey waitForForegroundWindowCount:2];
-}
-
 // Navigates to a pdf page and verifies that the "Find in Page..." tool
 // is not enabled
 - (void)testNoSearchForPDF {
diff --git a/ios/chrome/browser/ui/popup_menu/popup_menu_mediator.mm b/ios/chrome/browser/ui/popup_menu/popup_menu_mediator.mm
index 7465029..196aea5 100644
--- a/ios/chrome/browser/ui/popup_menu/popup_menu_mediator.mm
+++ b/ios/chrome/browser/ui/popup_menu/popup_menu_mediator.mm
@@ -893,7 +893,7 @@
   // Create the menu item -- hardcoded string and no accessibility ID.
   PopupMenuToolsItem* openNewWindowItem = CreateTableViewItem(
       IDS_IOS_TOOLS_MENU_NEW_WINDOW, PopupMenuActionOpenNewWindow,
-      @"popup_menu_new_window", kToolsMenuNewWindowId);
+      @"popup_menu_new_window", kToolsMenuNewWindow);
 
   return @[ openNewWindowItem ];
 }
diff --git a/ios/chrome/browser/ui/settings/settings_root_table_view_controller.mm b/ios/chrome/browser/ui/settings/settings_root_table_view_controller.mm
index 97e9a2ca..111f633 100644
--- a/ios/chrome/browser/ui/settings/settings_root_table_view_controller.mm
+++ b/ios/chrome/browser/ui/settings/settings_root_table_view_controller.mm
@@ -198,6 +198,18 @@
   return kDefaultHeaderFooterHeight;
 }
 
+#pragma mark - UITableViewDataSource
+
+- (UITableViewCell*)tableView:(UITableView*)tableView
+        cellForRowAtIndexPath:(NSIndexPath*)indexPath {
+  if (base::FeatureList::IsEnabled(kSettingsRefresh)) {
+    TableViewItem* item = [self.tableViewModel itemAtIndexPath:indexPath];
+    item.useCustomSeparator = YES;
+  }
+
+  return [super tableView:tableView cellForRowAtIndexPath:indexPath];
+}
+
 #pragma mark - TableViewLinkHeaderFooterItemDelegate
 
 - (void)view:(TableViewLinkHeaderFooterView*)view didTapLinkURL:(GURL)URL {
diff --git a/ios/chrome/browser/web_state_list/web_state_list_metrics_browser_agent.mm b/ios/chrome/browser/web_state_list/web_state_list_metrics_browser_agent.mm
index eb8e344..c30f0db 100644
--- a/ios/chrome/browser/web_state_list/web_state_list_metrics_browser_agent.mm
+++ b/ios/chrome/browser/web_state_list/web_state_list_metrics_browser_agent.mm
@@ -131,28 +131,6 @@
       crash_util::ResetFailedStartupAttemptCount();
     });
   }
-
-  DCHECK(web_state->GetNavigationManager());
-  web::NavigationItem* navigation_item =
-      web_state->GetNavigationManager()->GetPendingItem();
-
-  // TODO(crbug.com/676129): the pending item is not correctly set when the
-  // page is reloading, use the last committed item if pending item is null.
-  // Remove this once tracking bug is fixed.
-  if (!navigation_item) {
-    navigation_item = web_state->GetNavigationManager()->GetLastCommittedItem();
-  }
-
-  if (!navigation_item) {
-    // Pending item may not exist due to the bug in //ios/web layer.
-    // TODO(crbug.com/899827): remove this early return once GetPendingItem()
-    // always return valid object inside WebStateObserver::DidStartNavigation()
-    // callback.
-    //
-    // Note that GetLastCommittedItem() returns null if navigation manager does
-    // not have committed items (which is normal situation).
-    return;
-  }
 }
 
 void WebStateListMetricsBrowserAgent::DidFinishNavigation(
diff --git a/ios/chrome/test/earl_grey/BUILD.gn b/ios/chrome/test/earl_grey/BUILD.gn
index 2e215b35..85b2f56d 100644
--- a/ios/chrome/test/earl_grey/BUILD.gn
+++ b/ios/chrome/test/earl_grey/BUILD.gn
@@ -148,7 +148,6 @@
     "//ios/chrome/browser/ui/toolbar/public",
     "//ios/chrome/browser/ui/util",
     "//ios/chrome/browser/ui/util:eg_app_support+eg2",
-    "//ios/chrome/browser/ui/util:multiwindow_util",
     "//ios/chrome/browser/unified_consent",
     "//ios/chrome/browser/web:eg_app_support+eg2",
     "//ios/chrome/browser/web:tab_id_tab_helper",
diff --git a/ios/chrome/test/earl_grey/chrome_earl_grey.h b/ios/chrome/test/earl_grey/chrome_earl_grey.h
index 352e47e..5bbb599 100644
--- a/ios/chrome/test/earl_grey/chrome_earl_grey.h
+++ b/ios/chrome/test/earl_grey/chrome_earl_grey.h
@@ -142,6 +142,10 @@
 // GREYAssert is induced.
 - (void)waitForIncognitoTabCount:(NSUInteger)count;
 
+// Waits for there to be |count| number of browsers within a timeout,
+// or a GREYAssert is induced.
+- (void)waitForBrowserCount:(NSUInteger)count;
+
 // Loads |URL| as if it was opened from an external application.
 - (void)openURLFromExternalApp:(const GURL&)URL;
 
@@ -342,22 +346,6 @@
 // and tablet.
 - (void)showTabSwitcher;
 
-#pragma mark - Window utilities (EG2)
-
-// Returns the number of windows, including background and disconnected or
-// archived windows.
-- (NSUInteger)windowCount WARN_UNUSED_RESULT;
-
-// Returns the number of foreground (visible on screen) windows.
-- (NSUInteger)foregroundWindowCount WARN_UNUSED_RESULT;
-
-// Waits for there to be |count| number of browsers within a timeout,
-// or a GREYAssert is induced.
-- (void)waitForForegroundWindowCount:(NSUInteger)count;
-
-// Closes all but one window, including all non-foreground windows.
-- (void)closeAllExtraWindows;
-
 #pragma mark - SignIn Utilities (EG2)
 
 // Signs the user out, clears the known accounts entirely and checks whether the
@@ -535,10 +523,6 @@
 // Returns whether the native context menus feature is enabled or not.
 - (BOOL)isNativeContextMenusEnabled;
 
-// Returns whether the app is configured to, and running in an environment which
-// can, open multiple windows.
-- (BOOL)areMultipleWindowsSupported;
-
 #pragma mark - Popup Blocking
 
 // Gets the current value of the popup content setting preference for the
diff --git a/ios/chrome/test/earl_grey/chrome_earl_grey.mm b/ios/chrome/test/earl_grey/chrome_earl_grey.mm
index 66f1f81..a7fe700f 100644
--- a/ios/chrome/test/earl_grey/chrome_earl_grey.mm
+++ b/ios/chrome/test/earl_grey/chrome_earl_grey.mm
@@ -483,6 +483,30 @@
   EG_TEST_HELPER_ASSERT_TRUE(tabCountEqual, errorString);
 }
 
+- (void)waitForBrowserCount:(NSUInteger)count {
+  __block NSUInteger actualCount = [ChromeEarlGreyAppInterface browserCount];
+  NSString* conditionName = [NSString
+      stringWithFormat:@"Waiting for window count to become %" PRIuNS, count];
+
+  // Allow the UI to become idle, in case any tabs are being opened or closed.
+  GREYWaitForAppToIdle(@"App failed to idle");
+
+  GREYCondition* browserCountCheck = [GREYCondition
+      conditionWithName:conditionName
+                  block:^{
+                    actualCount = [ChromeEarlGreyAppInterface browserCount];
+                    return actualCount == count;
+                  }];
+  bool browserCountEqual =
+      [browserCountCheck waitWithTimeout:kWaitForUIElementTimeout];
+
+  NSString* errorString = [NSString
+      stringWithFormat:@"Failed waiting for window count to become %" PRIuNS
+                        "; actual count: %" PRIuNS,
+                       count, actualCount];
+  EG_TEST_HELPER_ASSERT_TRUE(browserCountEqual, errorString);
+}
+
 - (NSUInteger)indexOfActiveNormalTab {
   return [ChromeEarlGreyAppInterface indexOfActiveNormalTab];
 }
@@ -764,53 +788,6 @@
   EG_TEST_HELPER_ASSERT_TRUE(success, errorString);
 }
 
-#pragma mark - Window utilities (EG2)
-
-// Returns the number of windows, including background and disconnected or
-// archived windows.
-- (NSUInteger)windowCount WARN_UNUSED_RESULT {
-  return [ChromeEarlGreyAppInterface windowCount];
-}
-
-// Returns the number of foreground (visible on screen) windows.
-- (NSUInteger)foregroundWindowCount WARN_UNUSED_RESULT {
-  return [ChromeEarlGreyAppInterface foregroundWindowCount];
-}
-
-// Closes all but one window, including all non-foreground windows.
-- (void)closeAllExtraWindows {
-  [ChromeEarlGreyAppInterface closeAllExtraWindows];
-  // Tab changes are initiated through |WebStateList|. Need to wait its
-  // obeservers to complete UI changes at app.
-  GREYWaitForAppToIdle(@"App failed to idle");
-}
-
-- (void)waitForForegroundWindowCount:(NSUInteger)count {
-  __block NSUInteger actualCount =
-      [ChromeEarlGreyAppInterface foregroundWindowCount];
-  NSString* conditionName = [NSString
-      stringWithFormat:@"Waiting for window count to become %" PRIuNS, count];
-
-  // Allow the UI to become idle, in case any tabs are being opened or closed.
-  GREYWaitForAppToIdle(@"App failed to idle");
-
-  GREYCondition* browserCountCheck = [GREYCondition
-      conditionWithName:conditionName
-                  block:^{
-                    actualCount =
-                        [ChromeEarlGreyAppInterface foregroundWindowCount];
-                    return actualCount == count;
-                  }];
-  bool browserCountEqual =
-      [browserCountCheck waitWithTimeout:kWaitForUIElementTimeout];
-
-  NSString* errorString = [NSString
-      stringWithFormat:@"Failed waiting for window count to become %" PRIuNS
-                        "; actual count: %" PRIuNS,
-                       count, actualCount];
-  EG_TEST_HELPER_ASSERT_TRUE(browserCountEqual, errorString);
-}
-
 #pragma mark - SignIn Utilities (EG2)
 
 - (void)signOutAndClearIdentities {
@@ -921,10 +898,6 @@
   return [ChromeEarlGreyAppInterface isNativeContextMenusEnabled];
 }
 
-- (BOOL)areMultipleWindowsSupported {
-  return [ChromeEarlGreyAppInterface areMultipleWindowsSupported];
-}
-
 #pragma mark - ScopedBlockPopupsPref
 
 - (ContentSetting)popupPrefValue {
diff --git a/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.h b/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.h
index 8bf2192..a9c60b56 100644
--- a/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.h
+++ b/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.h
@@ -162,18 +162,6 @@
 // Returns the index of active tab in normal mode.
 + (NSUInteger)indexOfActiveNormalTab;
 
-#pragma mark - Window utilities (EG2)
-
-// Returns the number of windows, including background and disconnected or
-// archived windows.
-+ (NSUInteger)windowCount WARN_UNUSED_RESULT;
-
-// Returns the number of foreground (visible on screen) windows.
-+ (NSUInteger)foregroundWindowCount WARN_UNUSED_RESULT;
-
-// Closes all but one window, including all non-foreground windows.
-+ (void)closeAllExtraWindows;
-
 #pragma mark - WebState Utilities (EG2)
 
 // Attempts to tap the element with |element_id| within window.frames[0] of the
@@ -445,10 +433,6 @@
 // Returns whether the native context menus feature is enabled or not.
 + (BOOL)isNativeContextMenusEnabled;
 
-// Returns whether the app is configured to, and running in an environment which
-// can, open multiple windows.
-+ (BOOL)areMultipleWindowsSupported;
-
 #pragma mark - Popup Blocking
 
 // Gets the current value of the popup content setting preference for the
diff --git a/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.mm b/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.mm
index 8d26b22..fd4f648f 100644
--- a/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.mm
+++ b/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.mm
@@ -30,7 +30,6 @@
 #import "ios/chrome/browser/ui/table_view/feature_flags.h"
 #import "ios/chrome/browser/ui/ui_feature_flags.h"
 #import "ios/chrome/browser/ui/util/menu_util.h"
-#import "ios/chrome/browser/ui/util/multi_window_support.h"
 #import "ios/chrome/browser/ui/util/named_guide.h"
 #import "ios/chrome/browser/unified_consent/unified_consent_service_factory.h"
 #import "ios/chrome/browser/web/tab_id_tab_helper.h"
@@ -299,68 +298,6 @@
   return chrome_test_util::GetIndexOfActiveNormalTab();
 }
 
-#pragma mark - Window utilities (EG2)
-
-+ (NSUInteger)windowCount WARN_UNUSED_RESULT {
-  // If the scene API is in use, return the count of open sessions.
-  if (@available(iOS 13, *)) {
-    return UIApplication.sharedApplication.openSessions.count;
-  }
-
-  // Otherwise, there's always exectly one window;
-  return 1;
-}
-
-+ (NSUInteger)foregroundWindowCount WARN_UNUSED_RESULT {
-  // If the scene API is in use, look at all the connected scenes and count
-  // those in the foreground.
-  if (@available(iOS 13, *)) {
-    NSUInteger count = 0;
-    for (UIScene* scene in UIApplication.sharedApplication.connectedScenes) {
-      if (scene.activationState == UISceneActivationStateForegroundActive ||
-          scene.activationState == UISceneActivationStateForegroundInactive) {
-        count++;
-      }
-    }
-    return count;
-  }
-
-  // Otherwise, there's always exectly one window;
-  return 1;
-}
-
-+ (void)closeAllExtraWindows {
-  if (!IsMultipleScenesSupported())
-    return;
-
-  if (@available(iOS 13, *)) {
-    NSSet<UISceneSession*>* sessions =
-        UIApplication.sharedApplication.openSessions;
-    if (sessions.count <= 1)
-      return;
-    BOOL foundForegroundScene = NO;
-    for (UISceneSession* session in sessions) {
-      UIScene* scene = session.scene;
-      if (!foundForegroundScene && scene &&
-          (scene.activationState == UISceneActivationStateForegroundActive ||
-           scene.activationState == UISceneActivationStateForegroundInactive)) {
-        foundForegroundScene = YES;
-        // Leave the first foreground scene connected, so there's one open
-        // window left.
-        continue;
-      }
-      // If this isn't the first foreground scene, destroy it.
-      UIWindowSceneDestructionRequestOptions* options =
-          [[UIWindowSceneDestructionRequestOptions alloc] init];
-      options.windowDismissalAnimation =
-          UIWindowSceneDismissalAnimationStandard;
-      [UIApplication.sharedApplication requestSceneSessionDestruction:session
-                                                              options:options
-                                                         errorHandler:nil];
-    }
-  }
-}
-
 #pragma mark - WebState Utilities (EG2)
 
 + (NSError*)tapWebStateElementInIFrameWithID:(NSString*)elementID {
@@ -832,10 +769,6 @@
   return IsNativeContextMenuEnabled();
 }
 
-+ (BOOL)areMultipleWindowsSupported {
-  return IsMultipleScenesSupported();
-}
-
 #pragma mark - ScopedBlockPopupsPref
 
 + (ContentSetting)popupPrefValue {
diff --git a/ios/chrome/test/earl_grey/chrome_matchers.h b/ios/chrome/test/earl_grey/chrome_matchers.h
index 23db1a7c..8b101fa 100644
--- a/ios/chrome/test/earl_grey/chrome_matchers.h
+++ b/ios/chrome/test/earl_grey/chrome_matchers.h
@@ -310,9 +310,6 @@
 // Returns matcher for the payment request search bar.
 id<GREYMatcher> PaymentRequestPickerSearchBar();
 
-// Returns matcher for the New Window button on the Tools menu.
-id<GREYMatcher> OpenNewWindowMenuButton();
-
 // Returns matcher for the reading list on the Tools menu.
 id<GREYMatcher> ReadingListMenuButton();
 
diff --git a/ios/chrome/test/earl_grey/chrome_matchers.mm b/ios/chrome/test/earl_grey/chrome_matchers.mm
index b1c49a6..24c4dac 100644
--- a/ios/chrome/test/earl_grey/chrome_matchers.mm
+++ b/ios/chrome/test/earl_grey/chrome_matchers.mm
@@ -387,10 +387,6 @@
   return [ChromeMatchersAppInterface paymentRequestPickerSearchBar];
 }
 
-id<GREYMatcher> OpenNewWindowMenuButton() {
-  return [ChromeMatchersAppInterface openNewWindowMenuButton];
-}
-
 id<GREYMatcher> ReadingListMenuButton() {
   return [ChromeMatchersAppInterface readingListMenuButton];
 }
diff --git a/ios/chrome/test/earl_grey/chrome_matchers_app_interface.h b/ios/chrome/test/earl_grey/chrome_matchers_app_interface.h
index 2e53cae..a381260 100644
--- a/ios/chrome/test/earl_grey/chrome_matchers_app_interface.h
+++ b/ios/chrome/test/earl_grey/chrome_matchers_app_interface.h
@@ -315,9 +315,6 @@
 // Returns matcher for the payment request search bar.
 + (id<GREYMatcher>)paymentRequestPickerSearchBar;
 
-// Returns matcher for the New Window button on the Tools menu.
-+ (id<GREYMatcher>)openNewWindowMenuButton;
-
 // Returns matcher for the reading list button on the Tools menu.
 + (id<GREYMatcher>)readingListMenuButton;
 
diff --git a/ios/chrome/test/earl_grey/chrome_matchers_app_interface.mm b/ios/chrome/test/earl_grey/chrome_matchers_app_interface.mm
index cb2cf6dcd..7e6879af 100644
--- a/ios/chrome/test/earl_grey/chrome_matchers_app_interface.mm
+++ b/ios/chrome/test/earl_grey/chrome_matchers_app_interface.mm
@@ -670,10 +670,6 @@
   return nil;
 }
 
-+ (id<GREYMatcher>)openNewWindowMenuButton {
-  return grey_accessibilityID(kToolsMenuNewWindowId);
-}
-
 + (id<GREYMatcher>)readingListMenuButton {
   return grey_accessibilityID(kToolsMenuReadingListId);
 }
diff --git a/ios/chrome/test/earl_grey/chrome_test_case.mm b/ios/chrome/test/earl_grey/chrome_test_case.mm
index d34c05e39..3581fc9b 100644
--- a/ios/chrome/test/earl_grey/chrome_test_case.mm
+++ b/ios/chrome/test/earl_grey/chrome_test_case.mm
@@ -194,7 +194,6 @@
   [[AppLaunchManager sharedManager] addObserver:self];
 
   [super setUp];
-  [[self class] closeAllWindows];
   [self resetAppState];
 
   ResetAuthentication();
@@ -221,7 +220,6 @@
 
   // Clean up any UI that may remain open so the next test starts in a clean
   // state.
-  [[self class] closeAllWindows];
   [[self class] removeAnyOpenMenusAndInfoBars];
   [[self class] closeAllTabs];
 
@@ -258,12 +256,6 @@
       drainUntilIdleWithTimeout:kDrainTimeout];
 }
 
-+ (void)closeAllWindows {
-  [ChromeEarlGrey closeAllExtraWindows];
-  [[GREYUIThreadExecutor sharedInstance]
-      drainUntilIdleWithTimeout:kDrainTimeout];
-}
-
 - (void)disableMockAuthentication {
   [[self class] disableMockAuthentication];
 }
diff --git a/ios/web_view/internal/passwords/web_view_password_manager_client.h b/ios/web_view/internal/passwords/web_view_password_manager_client.h
index c0e8a1c9..7641d4d 100644
--- a/ios/web_view/internal/passwords/web_view_password_manager_client.h
+++ b/ios/web_view/internal/passwords/web_view_password_manager_client.h
@@ -114,6 +114,7 @@
   bool IsIsolationForPasswordSitesEnabled() const override;
   bool IsNewTabPage() const override;
   password_manager::FieldInfoManager* GetFieldInfoManager() const override;
+  bool IsAutofillAssistantUIVisible() const override;
 
   void set_bridge(id<PasswordManagerClientBridge> bridge) { bridge_ = bridge; }
   const syncer::SyncService* GetSyncService();
diff --git a/ios/web_view/internal/passwords/web_view_password_manager_client.mm b/ios/web_view/internal/passwords/web_view_password_manager_client.mm
index 18b3bce..360e84b 100644
--- a/ios/web_view/internal/passwords/web_view_password_manager_client.mm
+++ b/ios/web_view/internal/passwords/web_view_password_manager_client.mm
@@ -284,6 +284,10 @@
   return nullptr;
 }
 
+bool WebViewPasswordManagerClient::IsAutofillAssistantUIVisible() const {
+  return false;
+}
+
 const syncer::SyncService* WebViewPasswordManagerClient::GetSyncService() {
   return sync_service_;
 }
diff --git a/pdf/ppapi_migration/url_loader_unittest.cc b/pdf/ppapi_migration/url_loader_unittest.cc
index df79207c..31392351 100644
--- a/pdf/ppapi_migration/url_loader_unittest.cc
+++ b/pdf/ppapi_migration/url_loader_unittest.cc
@@ -270,7 +270,7 @@
 
   blink::WebHTTPBody::Element element;
   EXPECT_TRUE(request_body.ElementAt(0, element));
-  EXPECT_EQ(blink::WebHTTPBody::Element::kTypeData, element.type);
+  EXPECT_EQ(blink::HTTPBodyElementType::kTypeData, element.type);
 
   std::string data;
   element.data.ForEachSegment(
diff --git a/services/network/public/cpp/url_request_mojom_traits.cc b/services/network/public/cpp/url_request_mojom_traits.cc
index a6abb4e..0bb41983 100644
--- a/services/network/public/cpp/url_request_mojom_traits.cc
+++ b/services/network/public/cpp/url_request_mojom_traits.cc
@@ -270,12 +270,8 @@
     return false;
   }
   if (data.type() == network::mojom::DataElementType::kBytes) {
-    mojo_base::BigBufferView big_buffer;
-    if (!data.ReadBuf(&big_buffer))
+    if (!data.ReadBuf(&out->buf_))
       return false;
-    out->buf_.clear();
-    out->buf_.insert(out->buf_.end(), big_buffer.data().begin(),
-                     big_buffer.data().end());
   }
   out->type_ = data.type();
   out->data_pipe_getter_ = data.TakeDataPipeGetter<
diff --git a/services/network/public/cpp/url_request_mojom_traits.h b/services/network/public/cpp/url_request_mojom_traits.h
index e458ff0..6995a9f 100644
--- a/services/network/public/cpp/url_request_mojom_traits.h
+++ b/services/network/public/cpp/url_request_mojom_traits.h
@@ -10,7 +10,6 @@
 
 #include "base/component_export.h"
 #include "base/memory/scoped_refptr.h"
-#include "mojo/public/cpp/base/big_buffer_mojom_traits.h"
 #include "mojo/public/cpp/base/file_mojom_traits.h"
 #include "mojo/public/cpp/base/file_path_mojom_traits.h"
 #include "mojo/public/cpp/base/time_mojom_traits.h"
@@ -309,8 +308,8 @@
       const network::DataElement& element) {
     return element.type_;
   }
-  static mojo_base::BigBufferView buf(const network::DataElement& element) {
-    return mojo_base::BigBufferView(element.buf_);
+  static const std::vector<uint8_t>& buf(const network::DataElement& element) {
+    return element.buf_;
   }
   static const base::FilePath& path(const network::DataElement& element) {
     return element.path_;
diff --git a/services/network/public/mojom/url_loader.mojom b/services/network/public/mojom/url_loader.mojom
index 399a2e2..972ff20b 100644
--- a/services/network/public/mojom/url_loader.mojom
+++ b/services/network/public/mojom/url_loader.mojom
@@ -423,7 +423,7 @@
   DataElementType type;
 
   // For kBytes.
-  mojo_base.mojom.BigBuffer buf;
+  array<uint8> buf;
   // For kFile
   mojo_base.mojom.FilePath path;
   // For kDataPipe
diff --git a/sql/database.cc b/sql/database.cc
index 30fb84b..01dd2b1b 100644
--- a/sql/database.cc
+++ b/sql/database.cc
@@ -1487,22 +1487,15 @@
     return false;
   }
 
-  // If indicated, lock up the database before doing anything else, so
-  // that the following code doesn't have to deal with locking.
+  // If indicated, enable shared mode ("NORMAL") on the database, so it can be
+  // opened by multiple processes. This needs to happen before WAL mode is
+  // enabled.
   //
-  // Needs to happen before any other operation is performed in WAL mode so that
-  // no operation relies on shared memory if exclusive locking is turned on.
-  //
-  // TODO(shess): This code is brittle.  Find the cases where code
-  // doesn't request |exclusive_locking_| and audit that it does the
-  // right thing with SQLITE_BUSY, and that it doesn't make
-  // assumptions about who might change things in the database.
-  // http://crbug.com/56559
-  if (exclusive_locking_) {
-    // TODO(shess): This should probably be a failure.  Code which
-    // requests exclusive locking but doesn't get it is almost certain
-    // to be ill-tested.
-    ignore_result(Execute("PRAGMA locking_mode=EXCLUSIVE"));
+  // TODO(crbug.com/1120969): Remove support for non-exclusive mode.
+  if (!exclusive_locking_) {
+    err = ExecuteAndReturnErrorCode("PRAGMA locking_mode=NORMAL");
+    if (err != SQLITE_OK)
+      return false;
   }
 
   // Enable extended result codes to provide more color on I/O errors.
diff --git a/sql/database.h b/sql/database.h
index 15dac32..a6b75306 100644
--- a/sql/database.h
+++ b/sql/database.h
@@ -111,16 +111,25 @@
   // This must be called before Open() to have an effect.
   void want_wal_mode(bool enabled) { want_wal_mode_ = enabled; }
 
-  // Call to put the database in exclusive locking mode. There is no "back to
-  // normal" flag because of some additional requirements sqlite puts on this
-  // transaction (requires another access to the DB) and because we don't
-  // actually need it.
+  // Makes database accessible by only one process at a time.
   //
-  // Exclusive mode means that the database is not unlocked at the end of each
-  // transaction, which means there may be less time spent initializing the
-  // next transaction because it doesn't have to re-aquire locks.
+  // TODO(https://crbug.com/1120969): This should be the default mode. The
+  //                                  "NORMAL" mode should be opt-in.
   //
-  // This must be called before Open() to have an effect.
+  // SQLite supports a locking protocol that allows multiple processes to safely
+  // operate on the same database at the same time. The locking protocol is used
+  // on every transaction, and comes with a small performance penalty.
+  //
+  // Calling this method causes the locking protocol to be used once, when the
+  // database is opened. No other process will be able to access the database at
+  // the same time.
+  //
+  // This method must be called before Open() to have an effect.
+  //
+  // More details at https://www.sqlite.org/pragma.html#pragma_locking_mode
+  //
+  // SQLite's locking protocol is summarized at
+  // https://www.sqlite.org/c3ref/io_methods.html
   void set_exclusive_locking() { exclusive_locking_ = true; }
 
   // Call to use alternative status-tracking for mmap.  Usually this is tracked
diff --git a/sql/database_unittest.cc b/sql/database_unittest.cc
index b3df6ba..890e370 100644
--- a/sql/database_unittest.cc
+++ b/sql/database_unittest.cc
@@ -1252,6 +1252,18 @@
             ExecuteWithResult(&db(), "SELECT * FROM MmapStatus"));
 }
 
+TEST_F(SQLDatabaseTest, LockingModeExclusive) {
+  db().Close();
+  db().set_exclusive_locking();
+  ASSERT_TRUE(db().Open(db_path()));
+
+  EXPECT_EQ(ExecuteWithResult(&db(), "PRAGMA locking_mode"), "exclusive");
+}
+
+TEST_F(SQLDatabaseTest, LockingModeNormal) {
+  EXPECT_EQ(ExecuteWithResult(&db(), "PRAGMA locking_mode"), "normal");
+}
+
 TEST_F(SQLDatabaseTest, EnableWALMode) {
   db().want_wal_mode(true);
 #if defined(OS_FUCHSIA)  // Exclusive mode needs to be enabled to enter WAL mode
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index 19bf6d7..4c97575 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -1262,29 +1262,6 @@
             ]
         }
     ],
-    "ButterForPasswords": [
-        {
-            "platforms": [
-                "linux",
-                "mac",
-                "windows"
-            ],
-            "experiments": [
-                {
-                    "name": "ButterForPasswords",
-                    "params": {
-                        "event_1": "name:passwords_account_storage_unselected;comparator:==0;window:180;storage:180",
-                        "event_trigger": "name:passwords_account_storage_trigger;comparator:<5;window:180;storage:180",
-                        "event_used": "name:passwords_account_storage_used;comparator:==0;window:180;storage:180"
-                    },
-                    "enable_features": [
-                        "EnablePasswordsAccountStorage",
-                        "IPH_PasswordsAccountStorage"
-                    ]
-                }
-            ]
-        }
-    ],
     "CSSMatchedPropertiesCacheDependencies": [
         {
             "platforms": [
diff --git a/third_party/abseil-cpp/BUILD.gn b/third_party/abseil-cpp/BUILD.gn
index 5537c5c..4eb9ec0 100644
--- a/third_party/abseil-cpp/BUILD.gn
+++ b/third_party/abseil-cpp/BUILD.gn
@@ -10,7 +10,6 @@
 import("//build/config/sanitizers/sanitizers.gni")
 import("//build/toolchain/toolchain.gni")
 import("//build_overrides/build.gni")
-import("//testing/test.gni")
 import("//third_party/abseil-cpp/absl.gni")
 
 config("absl_component_build") {
@@ -178,28 +177,30 @@
   }
 }
 
-if (!is_component_build) {
-  test("absl_tests") {
-    testonly = true
-    deps = [
-      "absl/algorithm:algorithm_test",
-      "absl/algorithm:container_test",
-      "absl/base:config_test",
-      "absl/container:inlined_vector_test",
-      "absl/memory:memory_test",
-      "absl/meta:type_traits_test",
-      "absl/strings:ascii_test",
-      "absl/strings:match_test",
-      "absl/strings:str_replace_test",
-      "absl/strings:string_view_test",
-      "absl/types:optional_test",
-      "absl/types:variant_test",
-      "//third_party/googletest:gtest_main",
-    ]
-  }
-}
-
 if (build_with_chromium) {
+  import("//testing/test.gni")
+
+  if (!is_component_build) {
+    test("absl_tests") {
+      testonly = true
+      deps = [
+        "absl/algorithm:algorithm_test",
+        "absl/algorithm:container_test",
+        "absl/base:config_test",
+        "absl/container:inlined_vector_test",
+        "absl/memory:memory_test",
+        "absl/meta:type_traits_test",
+        "absl/strings:ascii_test",
+        "absl/strings:match_test",
+        "absl/strings:str_replace_test",
+        "absl/strings:string_view_test",
+        "absl/types:optional_test",
+        "absl/types:variant_test",
+        "//third_party/googletest:gtest_main",
+      ]
+    }
+  }
+
   test("absl_hardening_tests") {
     testonly = true
     sources = [ "absl_hardening_test.cc" ]
diff --git a/third_party/blink/common/BUILD.gn b/third_party/blink/common/BUILD.gn
index 330261b..b7ad5c2 100644
--- a/third_party/blink/common/BUILD.gn
+++ b/third_party/blink/common/BUILD.gn
@@ -142,6 +142,8 @@
     "page/content_to_visible_time_reporter.cc",
     "page/drag_mojom_traits.cc",
     "page/page_zoom.cc",
+    "page_state/page_state.cc",
+    "page_state/page_state_serialization.cc",
     "peerconnection/peer_connection_tracker_mojom_traits.cc",
     "peerconnection/webrtc_ip_handling_policy.cc",
     "permissions/permission_utils.cc",
@@ -184,6 +186,7 @@
     "//services/metrics/public/mojom:mojom",
     "//services/network/public/cpp:cpp",
     "//ui/base:base",
+    "//ui/display",
     "//ui/events:events_base",
     "//ui/latency/mojom:shared_mojom_traits",
   ]
@@ -226,6 +229,7 @@
       "//media/base/android:media_java",
     ]
   }
+  data_deps = [ ":common_unittests_data" ]
 }
 
 source_set("common_unittests_sources") {
@@ -256,10 +260,12 @@
     "origin_trials/trial_token_unittest.cc",
     "origin_trials/trial_token_validator_unittest.cc",
     "page/content_to_visible_time_reporter_unittest.cc",
+    "page_state/page_state_serialization_unittest.cc",
     "service_worker/service_worker_scope_match_unittest.cc",
     "test/run_all_unittests.cc",
     "tokens/multi_token_unittest.cc",
     "tokens/tokens_mojom_traits_unittest.cc",
+    "unique_name/unique_name_helper_unittest.cc",
     "user_agent/user_agent_metadata_unittest.cc",
     "web_package/web_package_request_matcher_unittest.cc",
   ]
@@ -302,3 +308,7 @@
     ]
   }
 }
+
+group("common_unittests_data") {
+  data = [ "page_state/test_data/" ]
+}
diff --git a/third_party/blink/common/DEPS b/third_party/blink/common/DEPS
index c6f515e..5ccdb7d 100644
--- a/third_party/blink/common/DEPS
+++ b/third_party/blink/common/DEPS
@@ -16,6 +16,7 @@
     "+services/metrics/public/cpp",
     "+services/metrics/public/mojom/ukm_interface.mojom.h",
     "+services/network/public/cpp",
+    "+services/network/public/mojom/referrer_policy.mojom.h",
     "+services/network/public/mojom/web_sandbox_flags.mojom-shared.h",
     "+services/network/public/mojom/url_loader.mojom.h",
     "+services/network/public/mojom/url_loader_factory.mojom.h",
@@ -30,6 +31,7 @@
     "+third_party/blink/public/mojom",
     "+third_party/icu/source/common/unicode/unistr.h",
     "+ui/base/ui_base_switches_util.h",
+    "+ui/display",
     "+ui/events/base_event_utils.h",
     "+ui/gfx/presentation_feedback.h",
     "+ui/gfx/transform.h",
diff --git a/content/public/common/page_state.cc b/third_party/blink/common/page_state/page_state.cc
similarity index 90%
rename from content/public/common/page_state.cc
rename to third_party/blink/common/page_state/page_state.cc
index 0b5b901..6de60c2 100644
--- a/content/public/common/page_state.cc
+++ b/third_party/blink/common/page_state/page_state.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "content/public/common/page_state.h"
+#include "third_party/blink/public/common/page_state/page_state.h"
 
 #include <stddef.h>
 
@@ -10,11 +10,11 @@
 #include "base/optional.h"
 #include "base/strings/string16.h"
 #include "base/strings/utf_string_conversions.h"
-#include "content/common/page_state_serialization.h"
 #include "services/network/public/cpp/resource_request_body.h"
 #include "services/network/public/mojom/referrer_policy.mojom.h"
+#include "third_party/blink/public/common/page_state/page_state_serialization.h"
 
-namespace content {
+namespace blink {
 namespace {
 
 base::FilePath ToFilePath(const base::Optional<base::string16>& s) {
@@ -49,8 +49,7 @@
   state->referrer.reset();
   state->referrer_policy = network::mojom::ReferrerPolicy::kDefault;
   for (std::vector<ExplodedFrameState>::iterator it = state->children.begin();
-       it != state->children.end();
-       ++it) {
+       it != state->children.end(); ++it) {
     RecursivelyRemoveReferrer(&*it);
   }
 }
@@ -91,14 +90,12 @@
     if (optional_body_file_path) {
       state.top.http_body.request_body = new network::ResourceRequestBody();
       state.top.http_body.request_body->AppendFileRange(
-          *optional_body_file_path,
-          0, std::numeric_limits<uint64_t>::max(),
+          *optional_body_file_path, 0, std::numeric_limits<uint64_t>::max(),
           base::Time());
       state.referenced_files.emplace_back(
           optional_body_file_path->AsUTF16Unsafe());
     }
-    state.top.http_body.contains_passwords =
-        body_contains_password_data;
+    state.top.http_body.contains_passwords = body_contains_password_data;
   }
 
   return ToPageState(state);
@@ -119,8 +116,7 @@
   return CreateFromEncodedData(encoded_page_state);
 }
 
-PageState::PageState() {
-}
+PageState::PageState() {}
 
 bool PageState::IsValid() const {
   return !data_.empty();
@@ -177,11 +173,10 @@
   return ToPageState(state);
 }
 
-PageState::PageState(const std::string& data)
-    : data_(data) {
+PageState::PageState(const std::string& data) : data_(data) {
   // TODO(darin): Enable this DCHECK once tests have been fixed up to not pass
   // bogus encoded data to CreateFromEncodedData.
-  //DCHECK(IsValid());
+  // DCHECK(IsValid());
 }
 
-}  // namespace content
+}  // namespace blink
diff --git a/content/common/page_state_serialization.cc b/third_party/blink/common/page_state/page_state_serialization.cc
similarity index 90%
rename from content/common/page_state_serialization.cc
rename to third_party/blink/common/page_state/page_state_serialization.cc
index 0aca12c4e..b7de54a 100644
--- a/content/common/page_state_serialization.cc
+++ b/third_party/blink/common/page_state/page_state_serialization.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "content/common/page_state_serialization.h"
+#include "third_party/blink/public/common/page_state/page_state_serialization.h"
 
 #include <algorithm>
 #include <limits>
@@ -13,18 +13,19 @@
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "build/build_config.h"
-#include "content/public/common/referrer.h"
-#include "ipc/ipc_message_utils.h"
 #include "mojo/public/cpp/base/string16_mojom_traits.h"
 #include "mojo/public/cpp/base/time_mojom_traits.h"
+#include "mojo/public/cpp/bindings/enum_utils.h"
 #include "services/network/public/cpp/resource_request_body.h"
+#include "third_party/blink/public/common/loader/http_body_element_type.h"
 #include "third_party/blink/public/common/unique_name/unique_name_helper.h"
+#include "third_party/blink/public/mojom/page_state/page_state.mojom.h"
 #include "ui/display/display.h"
 #include "ui/display/screen.h"
 #include "ui/gfx/geometry/mojom/geometry_mojom_traits.h"
 #include "url/mojom/url_gurl_mojom_traits.h"
 
-namespace content {
+namespace blink {
 
 namespace {
 
@@ -127,7 +128,7 @@
 bool RecursivelyAppendReferencedFiles(
     const ExplodedFrameState& frame_state,
     std::vector<base::Optional<base::string16>>* referenced_files) {
-  if (frame_state.http_body.request_body != nullptr) {
+  if (frame_state.http_body.request_body) {
     AppendReferencedFilesFromHttpBody(
         *frame_state.http_body.request_body->elements(), referenced_files);
   }
@@ -148,15 +149,10 @@
 //----------------------------------------------------------------------------
 
 struct SerializeObject {
-  SerializeObject()
-      : version(0),
-        parse_error(false) {
-  }
+  SerializeObject() : version(0), parse_error(false) {}
 
   SerializeObject(const char* data, int len)
-      : pickle(data, len),
-        version(0),
-        parse_error(false) {
+      : pickle(data, len), version(0), parse_error(false) {
     iter = base::PickleIterator(pickle);
   }
 
@@ -315,7 +311,7 @@
 }
 
 // This reads a serialized base::Optional<base::string16> from obj. If a string
-// can't be read, NULL is returned.
+// can't be read, nullptr is returned.
 const base::char16* ReadStringNoCopy(SerializeObject* obj, int* num_chars) {
   int length_in_bytes;
   if (!obj->iter.ReadInt(&length_in_bytes)) {
@@ -396,11 +392,11 @@
   for (const auto& element : *request_body.elements()) {
     switch (element.type()) {
       case network::mojom::DataElementType::kBytes:
-        WriteInteger(blink::WebHTTPBody::Element::kTypeData, obj);
+        WriteInteger(static_cast<int>(HTTPBodyElementType::kTypeData), obj);
         WriteData(element.bytes(), static_cast<int>(element.length()), obj);
         break;
       case network::mojom::DataElementType::kFile:
-        WriteInteger(blink::WebHTTPBody::Element::kTypeFile, obj);
+        WriteInteger(static_cast<int>(HTTPBodyElementType::kTypeFile), obj);
         WriteString(element.path().AsUTF16Unsafe(), obj);
         WriteInteger64(static_cast<int64_t>(element.offset()), obj);
         WriteInteger64(static_cast<int64_t>(element.length()), obj);
@@ -419,8 +415,9 @@
     const scoped_refptr<network::ResourceRequestBody>& request_body) {
   int num_elements = ReadInteger(obj);
   for (int i = 0; i < num_elements; ++i) {
-    int type = ReadInteger(obj);
-    if (type == blink::WebHTTPBody::Element::kTypeData) {
+    HTTPBodyElementType type =
+        static_cast<HTTPBodyElementType>(ReadInteger(obj));
+    if (type == HTTPBodyElementType::kTypeData) {
       const void* data;
       int length = -1;
       ReadData(obj, &data, &length);
@@ -428,7 +425,7 @@
         AppendDataToRequestBody(request_body, static_cast<const char*>(data),
                                 length);
       }
-    } else if (type == blink::WebHTTPBody::Element::kTypeFile) {
+    } else if (type == HTTPBodyElementType::kTypeFile) {
       base::Optional<base::string16> file_path = ReadString(obj);
       int64_t file_start = ReadInteger64(obj);
       int64_t file_length = ReadInteger64(obj);
@@ -436,7 +433,7 @@
       AppendFileRangeToRequestBody(
           request_body, file_path, file_start, file_length,
           base::Time::FromDoubleT(file_modification_time));
-    } else if (type == blink::WebHTTPBody::Element::kTypeBlob) {
+    } else if (type == HTTPBodyElementType::kTypeBlob) {
       // Skip obsolete blob values.
       if (obj->version >= 16) {
         ReadStdString(obj);
@@ -461,7 +458,7 @@
 }
 
 void WriteHttpBody(const ExplodedHttpBody& http_body, SerializeObject* obj) {
-  bool is_null = http_body.request_body == nullptr;
+  bool is_null = !http_body.request_body;
   WriteBoolean(!is_null, obj);
   if (is_null)
     return;
@@ -473,7 +470,7 @@
 void ReadFrameState(
     SerializeObject* obj,
     bool is_top,
-    std::vector<blink::UniqueNameHelper::Replacement>* unique_name_replacements,
+    std::vector<UniqueNameHelper::Replacement>* unique_name_replacements,
     ExplodedFrameState* state) {
   if (obj->version < 14 && !is_top)
     ReadInteger(obj);  // Skip over redundant version field.
@@ -485,9 +482,8 @@
 
   state->target = ReadString(obj);
   if (obj->version < 25 && state->target) {
-    state->target =
-        base::UTF8ToUTF16(blink::UniqueNameHelper::UpdateLegacyNameFromV24(
-            base::UTF16ToUTF8(*state->target), unique_name_replacements));
+    state->target = base::UTF8ToUTF16(UniqueNameHelper::UpdateLegacyNameFromV24(
+        base::UTF16ToUTF8(*state->target), unique_name_replacements));
   }
   if (obj->version < 15) {
     ReadString(obj);  // Skip obsolete parent field.
@@ -528,7 +524,10 @@
     ReadInteger64(obj);  // Skip obsolete target frame id number.
 
   if (obj->version >= 18) {
-    state->referrer_policy = Referrer::ConvertToPolicy(ReadInteger(obj));
+    state->referrer_policy =
+        mojo::ConvertIntToMojoEnum<network::mojom::ReferrerPolicy>(
+            ReadInteger(obj))
+            .value_or(network::mojom::ReferrerPolicy::kDefault);
   }
 
   if (obj->version >= 20 && state->did_save_scroll_or_scale_state) {
@@ -541,7 +540,7 @@
 
   if (obj->version >= 22) {
     state->scroll_restoration_type =
-        static_cast<blink::mojom::ScrollRestorationType>(ReadInteger(obj));
+        static_cast<mojom::ScrollRestorationType>(ReadInteger(obj));
   }
 
   bool has_state_object = ReadBoolean(obj);
@@ -660,9 +659,9 @@
 // "Modern" read/write functions start here. These are probably what you want.
 
 void WriteResourceRequestBody(const network::ResourceRequestBody& request_body,
-                              blink::mojom::RequestBody* mojo_body) {
+                              mojom::RequestBody* mojo_body) {
   for (const auto& element : *request_body.elements()) {
-    blink::mojom::ElementPtr data_element = blink::mojom::Element::New();
+    mojom::ElementPtr data_element = mojom::Element::New();
     switch (element.type()) {
       case network::mojom::DataElementType::kBytes: {
         data_element->set_bytes(std::vector<unsigned char>(
@@ -671,7 +670,7 @@
         break;
       }
       case network::mojom::DataElementType::kFile: {
-        blink::mojom::FilePtr file = blink::mojom::File::New(
+        mojom::FilePtr file = mojom::File::New(
             element.path().AsUTF16Unsafe(), element.offset(), element.length(),
             element.expected_modification_time());
         data_element->set_file(std::move(file));
@@ -692,27 +691,27 @@
 }
 
 void ReadResourceRequestBody(
-    blink::mojom::RequestBody* mojo_body,
+    mojom::RequestBody* mojo_body,
     const scoped_refptr<network::ResourceRequestBody>& request_body) {
   for (const auto& element : mojo_body->elements) {
-    blink::mojom::Element::Tag tag = element->which();
+    mojom::Element::Tag tag = element->which();
     switch (tag) {
-      case blink::mojom::Element::Tag::BYTES:
+      case mojom::Element::Tag::BYTES:
         AppendDataToRequestBody(
             request_body,
             reinterpret_cast<const char*>(element->get_bytes().data()),
             element->get_bytes().size());
         break;
-      case blink::mojom::Element::Tag::FILE: {
-        blink::mojom::File* file = element->get_file().get();
+      case mojom::Element::Tag::FILE: {
+        mojom::File* file = element->get_file().get();
         AppendFileRangeToRequestBody(request_body, file->path, file->offset,
                                      file->length, file->modification_time);
         break;
       }
-      case blink::mojom::Element::Tag::BLOB_UUID:
+      case mojom::Element::Tag::BLOB_UUID:
         // No longer supported.
         break;
-      case blink::mojom::Element::Tag::DEPRECATED_FILE_SYSTEM_FILE:
+      case mojom::Element::Tag::DEPRECATED_FILE_SYSTEM_FILE:
         // No longer supported.
         break;
     }
@@ -721,9 +720,9 @@
 }
 
 void WriteHttpBody(const ExplodedHttpBody& http_body,
-                   blink::mojom::HttpBody* mojo_body) {
-  if (http_body.request_body != nullptr) {
-    mojo_body->request_body = blink::mojom::RequestBody::New();
+                   mojom::HttpBody* mojo_body) {
+  if (http_body.request_body) {
+    mojo_body->request_body = mojom::RequestBody::New();
     mojo_body->contains_passwords = http_body.contains_passwords;
     mojo_body->http_content_type = http_body.http_content_type;
     WriteResourceRequestBody(*http_body.request_body,
@@ -731,8 +730,7 @@
   }
 }
 
-void ReadHttpBody(blink::mojom::HttpBody* mojo_body,
-                  ExplodedHttpBody* http_body) {
+void ReadHttpBody(mojom::HttpBody* mojo_body, ExplodedHttpBody* http_body) {
   http_body->contains_passwords = mojo_body->contains_passwords;
   http_body->http_content_type = mojo_body->http_content_type;
   if (mojo_body->request_body) {
@@ -744,7 +742,7 @@
 }
 
 void WriteFrameState(const ExplodedFrameState& state,
-                     blink::mojom::FrameState* frame) {
+                     mojom::FrameState* frame) {
   frame->url_string = state.url_string;
   frame->referrer = state.referrer;
   if (state.initiator_origin.has_value())
@@ -757,11 +755,10 @@
   }
 
   frame->scroll_restoration_type =
-      static_cast<blink::mojom::ScrollRestorationType>(
-          state.scroll_restoration_type);
+      static_cast<mojom::ScrollRestorationType>(state.scroll_restoration_type);
 
   if (state.did_save_scroll_or_scale_state) {
-    frame->view_state = blink::mojom::ViewState::New();
+    frame->view_state = mojom::ViewState::New();
     frame->view_state->scroll_offset = state.scroll_offset;
     frame->view_state->visual_viewport_scroll_offset =
         state.visual_viewport_scroll_offset;
@@ -782,20 +779,19 @@
 
   frame->referrer_policy = state.referrer_policy;
 
-  frame->http_body = blink::mojom::HttpBody::New();
+  frame->http_body = mojom::HttpBody::New();
   WriteHttpBody(state.http_body, frame->http_body.get());
 
   // Subitems
   const std::vector<ExplodedFrameState>& children = state.children;
   for (const auto& child : children) {
-    blink::mojom::FrameStatePtr child_frame = blink::mojom::FrameState::New();
+    mojom::FrameStatePtr child_frame = mojom::FrameState::New();
     WriteFrameState(child, child_frame.get());
     frame->children.push_back(std::move(child_frame));
   }
 }
 
-void ReadFrameState(blink::mojom::FrameState* frame,
-                    ExplodedFrameState* state) {
+void ReadFrameState(mojom::FrameState* frame, ExplodedFrameState* state) {
   state->url_string = frame->url_string;
   state->referrer = frame->referrer;
   if (frame->initiator_origin.has_value()) {
@@ -811,8 +807,7 @@
   }
 
   state->scroll_restoration_type =
-      static_cast<blink::mojom::ScrollRestorationType>(
-          frame->scroll_restoration_type);
+      static_cast<mojom::ScrollRestorationType>(frame->scroll_restoration_type);
 
   if (frame->view_state) {
     state->did_save_scroll_or_scale_state = true;
@@ -853,9 +848,8 @@
   if (obj->parse_error)
     return;
 
-  blink::mojom::PageStatePtr page;
-  obj->parse_error =
-      !(blink::mojom::PageState::Deserialize(tmp, length, &page));
+  mojom::PageStatePtr page;
+  obj->parse_error = !(mojom::PageState::Deserialize(tmp, length, &page));
   if (obj->parse_error)
     return;
 
@@ -873,15 +867,15 @@
 void WriteMojoPageState(const ExplodedPageState& state, SerializeObject* obj) {
   WriteInteger(obj->version, obj);
 
-  blink::mojom::PageStatePtr page = blink::mojom::PageState::New();
+  mojom::PageStatePtr page = mojom::PageState::New();
   for (const auto& referenced_file : state.referenced_files) {
     page->referenced_files.push_back(referenced_file.value());
   }
 
-  page->top = blink::mojom::FrameState::New();
+  page->top = mojom::FrameState::New();
   WriteFrameState(state.top, page->top.get());
 
-  std::vector<uint8_t> page_bytes = blink::mojom::PageState::Serialize(&page);
+  std::vector<uint8_t> page_bytes = mojom::PageState::Serialize(&page);
   obj->pickle.WriteData(reinterpret_cast<char*>(page_bytes.data()),
                         page_bytes.size());
 }
@@ -909,25 +903,23 @@
   if (obj->version >= 14)
     ReadStringVector(obj, &state->referenced_files);
 
-  std::vector<blink::UniqueNameHelper::Replacement> unique_name_replacements;
+  std::vector<UniqueNameHelper::Replacement> unique_name_replacements;
   ReadFrameState(obj, true, &unique_name_replacements, &state->top);
 
   if (obj->version < 14)
     RecursivelyAppendReferencedFiles(state->top, &state->referenced_files);
 
   // De-dupe
-  state->referenced_files.erase(
-      std::unique(state->referenced_files.begin(),
-                  state->referenced_files.end()),
-      state->referenced_files.end());
+  state->referenced_files.erase(std::unique(state->referenced_files.begin(),
+                                            state->referenced_files.end()),
+                                state->referenced_files.end());
 }
 
 }  // namespace
 
 ExplodedHttpBody::ExplodedHttpBody() : contains_passwords(false) {}
 
-ExplodedHttpBody::~ExplodedHttpBody() {
-}
+ExplodedHttpBody::~ExplodedHttpBody() {}
 
 ExplodedFrameState::ExplodedFrameState() = default;
 
@@ -935,8 +927,7 @@
   assign(other);
 }
 
-ExplodedFrameState::~ExplodedFrameState() {
-}
+ExplodedFrameState::~ExplodedFrameState() {}
 
 void ExplodedFrameState::operator=(const ExplodedFrameState& other) {
   if (&other != this)
@@ -964,11 +955,9 @@
   children = other.children;
 }
 
-ExplodedPageState::ExplodedPageState() {
-}
+ExplodedPageState::ExplodedPageState() {}
 
-ExplodedPageState::~ExplodedPageState() {
-}
+ExplodedPageState::~ExplodedPageState() {}
 
 int DecodePageStateInternal(const std::string& encoded,
                             ExplodedPageState* exploded) {
@@ -1048,4 +1037,4 @@
 
 #endif
 
-}  // namespace content
+}  // namespace blink
diff --git a/content/common/page_state_serialization_unittest.cc b/third_party/blink/common/page_state/page_state_serialization_unittest.cc
similarity index 95%
rename from content/common/page_state_serialization_unittest.cc
rename to third_party/blink/common/page_state/page_state_serialization_unittest.cc
index d79ea9c8..a9122e4f 100644
--- a/content/common/page_state_serialization_unittest.cc
+++ b/third_party/blink/common/page_state/page_state_serialization_unittest.cc
@@ -14,13 +14,20 @@
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
 #include "build/build_config.h"
-#include "content/common/page_state_serialization.h"
-#include "content/public/common/content_paths.h"
 #include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/blink/public/common/loader/http_body_element_type.h"
+#include "third_party/blink/public/common/page_state/page_state_serialization.h"
 
-namespace content {
+namespace blink {
 namespace {
 
+base::FilePath GetFilePath() {
+  base::FilePath path;
+  base::PathService::Get(base::DIR_SOURCE_ROOT, &path);
+  return base::MakeAbsoluteFilePath(path.Append(
+      FILE_PATH_LITERAL("third_party/blink/common/page_state/test_data")));
+}
+
 //-----------------------------------------------------------------------------
 
 template <typename T>
@@ -57,7 +64,7 @@
                     const ExplodedHttpBody& actual) {
   EXPECT_EQ(expected.http_content_type, actual.http_content_type);
   EXPECT_EQ(expected.contains_passwords, actual.contains_passwords);
-  if (expected.request_body == nullptr || actual.request_body == nullptr) {
+  if (!expected.request_body || !actual.request_body) {
     EXPECT_EQ(nullptr, expected.request_body);
     EXPECT_EQ(nullptr, actual.request_body);
   } else {
@@ -116,7 +123,7 @@
     frame_state->document_state.push_back(
         base::UTF8ToUTF16("dev.chromium.org"));
     frame_state->scroll_restoration_type =
-        blink::mojom::ScrollRestorationType::kManual;
+        mojom::ScrollRestorationType::kManual;
     frame_state->visual_viewport_scroll_offset = gfx::PointF(10, 15);
     frame_state->scroll_offset = gfx::Point(0, 100);
     frame_state->item_sequence_number = 1;
@@ -174,8 +181,7 @@
     frame_state->referrer_policy = network::mojom::ReferrerPolicy::kDefault;
     if (!is_child)
       frame_state->target = base::UTF8ToUTF16("target");
-    frame_state->scroll_restoration_type =
-        blink::mojom::ScrollRestorationType::kAuto;
+    frame_state->scroll_restoration_type = mojom::ScrollRestorationType::kAuto;
     frame_state->visual_viewport_scroll_offset = gfx::PointF(-1, -1);
     frame_state->scroll_offset = gfx::Point(42, -42);
     frame_state->item_sequence_number = 123;
@@ -224,11 +230,9 @@
   void ReadBackwardsCompatPageState(const std::string& suffix,
                                     int version,
                                     ExplodedPageState* page_state) {
-    base::FilePath path;
-    base::PathService::Get(content::DIR_TEST_DATA, &path);
-    path = path.AppendASCII("page_state")
-               .AppendASCII(
-                   base::StringPrintf("serialized_%s.dat", suffix.c_str()));
+    base::FilePath path = GetFilePath();
+    path = path.AppendASCII(
+        base::StringPrintf("serialized_%s.dat", suffix.c_str()));
 
     std::string file_contents;
     if (!base::ReadFileToString(path, &file_contents)) {
@@ -398,7 +402,7 @@
   p.WriteInt(0);
   // WebForm
   p.WriteInt(1);
-  p.WriteInt(blink::WebHTTPBody::Element::kTypeData);
+  p.WriteInt(static_cast<int>(HTTPBodyElementType::kTypeData));
 
   std::string s(static_cast<const char*>(p.data()), p.size());
 
@@ -417,9 +421,8 @@
   std::string actual_encoded_state;
   LegacyEncodePageStateForTesting(actual_state, 25, &actual_encoded_state);
 
-  base::FilePath path;
-  base::PathService::Get(content::DIR_TEST_DATA, &path);
-  path = path.AppendASCII("page_state").AppendASCII("serialized_v25.dat");
+  base::FilePath path = GetFilePath();
+  path = path.AppendASCII("serialized_v25.dat");
 
   std::string file_contents;
   ASSERT_TRUE(base::ReadFileToString(path, &file_contents))
@@ -637,8 +640,7 @@
 
 TEST_F(PageStateSerializationTest, BackwardsCompat_ScrollRestorationType) {
   ExplodedPageState state;
-  state.top.scroll_restoration_type =
-      blink::mojom::ScrollRestorationType::kManual;
+  state.top.scroll_restoration_type = mojom::ScrollRestorationType::kManual;
 
   ExplodedPageState saved_state;
   ReadBackwardsCompatPageState("scroll_restoration_type", 26, &saved_state);
@@ -698,4 +700,4 @@
 // where to put backwards compat version tests.
 
 }  // namespace
-}  // namespace content
+}  // namespace blink
diff --git a/content/test/data/page_state/serialized_document_state.dat b/third_party/blink/common/page_state/test_data/serialized_document_state.dat
similarity index 100%
rename from content/test/data/page_state/serialized_document_state.dat
rename to third_party/blink/common/page_state/test_data/serialized_document_state.dat
diff --git a/content/test/data/page_state/serialized_http_body.dat b/third_party/blink/common/page_state/test_data/serialized_http_body.dat
similarity index 100%
rename from content/test/data/page_state/serialized_http_body.dat
rename to third_party/blink/common/page_state/test_data/serialized_http_body.dat
diff --git a/content/test/data/page_state/serialized_referenced_files.dat b/third_party/blink/common/page_state/test_data/serialized_referenced_files.dat
similarity index 100%
rename from content/test/data/page_state/serialized_referenced_files.dat
rename to third_party/blink/common/page_state/test_data/serialized_referenced_files.dat
diff --git a/content/test/data/page_state/serialized_referrer.dat b/third_party/blink/common/page_state/test_data/serialized_referrer.dat
similarity index 100%
rename from content/test/data/page_state/serialized_referrer.dat
rename to third_party/blink/common/page_state/test_data/serialized_referrer.dat
diff --git a/content/test/data/page_state/serialized_referrer_policy.dat b/third_party/blink/common/page_state/test_data/serialized_referrer_policy.dat
similarity index 100%
rename from content/test/data/page_state/serialized_referrer_policy.dat
rename to third_party/blink/common/page_state/test_data/serialized_referrer_policy.dat
diff --git a/content/test/data/page_state/serialized_scroll_offset.dat b/third_party/blink/common/page_state/test_data/serialized_scroll_offset.dat
similarity index 100%
rename from content/test/data/page_state/serialized_scroll_offset.dat
rename to third_party/blink/common/page_state/test_data/serialized_scroll_offset.dat
diff --git a/content/test/data/page_state/serialized_scroll_restoration_type.dat b/third_party/blink/common/page_state/test_data/serialized_scroll_restoration_type.dat
similarity index 100%
rename from content/test/data/page_state/serialized_scroll_restoration_type.dat
rename to third_party/blink/common/page_state/test_data/serialized_scroll_restoration_type.dat
diff --git a/content/test/data/page_state/serialized_state_object.dat b/third_party/blink/common/page_state/test_data/serialized_state_object.dat
similarity index 100%
rename from content/test/data/page_state/serialized_state_object.dat
rename to third_party/blink/common/page_state/test_data/serialized_state_object.dat
diff --git a/content/test/data/page_state/serialized_target.dat b/third_party/blink/common/page_state/test_data/serialized_target.dat
similarity index 100%
rename from content/test/data/page_state/serialized_target.dat
rename to third_party/blink/common/page_state/test_data/serialized_target.dat
diff --git a/content/test/data/page_state/serialized_url_string.dat b/third_party/blink/common/page_state/test_data/serialized_url_string.dat
similarity index 100%
rename from content/test/data/page_state/serialized_url_string.dat
rename to third_party/blink/common/page_state/test_data/serialized_url_string.dat
diff --git a/content/test/data/page_state/serialized_v11.dat b/third_party/blink/common/page_state/test_data/serialized_v11.dat
similarity index 100%
rename from content/test/data/page_state/serialized_v11.dat
rename to third_party/blink/common/page_state/test_data/serialized_v11.dat
diff --git a/content/test/data/page_state/serialized_v11_android.dat b/third_party/blink/common/page_state/test_data/serialized_v11_android.dat
similarity index 100%
rename from content/test/data/page_state/serialized_v11_android.dat
rename to third_party/blink/common/page_state/test_data/serialized_v11_android.dat
diff --git a/content/test/data/page_state/serialized_v12.dat b/third_party/blink/common/page_state/test_data/serialized_v12.dat
similarity index 100%
rename from content/test/data/page_state/serialized_v12.dat
rename to third_party/blink/common/page_state/test_data/serialized_v12.dat
diff --git a/content/test/data/page_state/serialized_v13.dat b/third_party/blink/common/page_state/test_data/serialized_v13.dat
similarity index 100%
rename from content/test/data/page_state/serialized_v13.dat
rename to third_party/blink/common/page_state/test_data/serialized_v13.dat
diff --git a/content/test/data/page_state/serialized_v14.dat b/third_party/blink/common/page_state/test_data/serialized_v14.dat
similarity index 100%
rename from content/test/data/page_state/serialized_v14.dat
rename to third_party/blink/common/page_state/test_data/serialized_v14.dat
diff --git a/content/test/data/page_state/serialized_v15.dat b/third_party/blink/common/page_state/test_data/serialized_v15.dat
similarity index 100%
rename from content/test/data/page_state/serialized_v15.dat
rename to third_party/blink/common/page_state/test_data/serialized_v15.dat
diff --git a/content/test/data/page_state/serialized_v16.dat b/third_party/blink/common/page_state/test_data/serialized_v16.dat
similarity index 100%
rename from content/test/data/page_state/serialized_v16.dat
rename to third_party/blink/common/page_state/test_data/serialized_v16.dat
diff --git a/content/test/data/page_state/serialized_v18.dat b/third_party/blink/common/page_state/test_data/serialized_v18.dat
similarity index 100%
rename from content/test/data/page_state/serialized_v18.dat
rename to third_party/blink/common/page_state/test_data/serialized_v18.dat
diff --git a/content/test/data/page_state/serialized_v20.dat b/third_party/blink/common/page_state/test_data/serialized_v20.dat
similarity index 100%
rename from content/test/data/page_state/serialized_v20.dat
rename to third_party/blink/common/page_state/test_data/serialized_v20.dat
diff --git a/content/test/data/page_state/serialized_v21.dat b/third_party/blink/common/page_state/test_data/serialized_v21.dat
similarity index 100%
rename from content/test/data/page_state/serialized_v21.dat
rename to third_party/blink/common/page_state/test_data/serialized_v21.dat
diff --git a/content/test/data/page_state/serialized_v22.dat b/third_party/blink/common/page_state/test_data/serialized_v22.dat
similarity index 100%
rename from content/test/data/page_state/serialized_v22.dat
rename to third_party/blink/common/page_state/test_data/serialized_v22.dat
diff --git a/content/test/data/page_state/serialized_v23.dat b/third_party/blink/common/page_state/test_data/serialized_v23.dat
similarity index 100%
rename from content/test/data/page_state/serialized_v23.dat
rename to third_party/blink/common/page_state/test_data/serialized_v23.dat
diff --git a/content/test/data/page_state/serialized_v24.dat b/third_party/blink/common/page_state/test_data/serialized_v24.dat
similarity index 100%
rename from content/test/data/page_state/serialized_v24.dat
rename to third_party/blink/common/page_state/test_data/serialized_v24.dat
diff --git a/content/test/data/page_state/serialized_v25.dat b/third_party/blink/common/page_state/test_data/serialized_v25.dat
similarity index 100%
rename from content/test/data/page_state/serialized_v25.dat
rename to third_party/blink/common/page_state/test_data/serialized_v25.dat
diff --git a/content/test/data/page_state/serialized_v26.dat b/third_party/blink/common/page_state/test_data/serialized_v26.dat
similarity index 100%
rename from content/test/data/page_state/serialized_v26.dat
rename to third_party/blink/common/page_state/test_data/serialized_v26.dat
diff --git a/content/test/data/page_state/serialized_v27.dat b/third_party/blink/common/page_state/test_data/serialized_v27.dat
similarity index 100%
rename from content/test/data/page_state/serialized_v27.dat
rename to third_party/blink/common/page_state/test_data/serialized_v27.dat
diff --git a/content/test/data/page_state/serialized_v28.dat b/third_party/blink/common/page_state/test_data/serialized_v28.dat
similarity index 100%
rename from content/test/data/page_state/serialized_v28.dat
rename to third_party/blink/common/page_state/test_data/serialized_v28.dat
diff --git a/content/test/data/page_state/serialized_visual_viewport_scroll_offset.dat b/third_party/blink/common/page_state/test_data/serialized_visual_viewport_scroll_offset.dat
similarity index 100%
rename from content/test/data/page_state/serialized_visual_viewport_scroll_offset.dat
rename to third_party/blink/common/page_state/test_data/serialized_visual_viewport_scroll_offset.dat
diff --git a/content/common/unique_name_helper_unittest.cc b/third_party/blink/common/unique_name/unique_name_helper_unittest.cc
similarity index 97%
rename from content/common/unique_name_helper_unittest.cc
rename to third_party/blink/common/unique_name/unique_name_helper_unittest.cc
index 9a16845..b8f97de 100644
--- a/content/common/unique_name_helper_unittest.cc
+++ b/third_party/blink/common/unique_name/unique_name_helper_unittest.cc
@@ -13,16 +13,16 @@
 #include "base/strings/nullable_string16.h"
 #include "base/strings/string_piece.h"
 #include "base/strings/utf_string_conversions.h"
-#include "content/common/page_state_serialization.h"
 #include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/blink/public/common/page_state/page_state_serialization.h"
 
-namespace content {
+namespace blink {
 namespace {
 
 // Requested names longer than this (that are unique) should be hashed.
 constexpr size_t kMaxSize = 80;
 
-class TestFrameAdapter : public blink::UniqueNameHelper::FrameAdapter {
+class TestFrameAdapter : public UniqueNameHelper::FrameAdapter {
  public:
   // |virtual_index_in_parent| is the virtual index of this frame in the
   // parent's list of children, as unique name generation should see it. Note
@@ -136,8 +136,8 @@
     // UniqueNameHelper.
     if (!IsMainFrame()) {
       base::AutoReset<bool> enable_legacy_mode(&generate_legacy_name_, true);
-      legacy_name_ = blink::UniqueNameHelper::CalculateLegacyNameForTesting(
-          this, requested_name);
+      legacy_name_ =
+          UniqueNameHelper::CalculateLegacyNameForTesting(this, requested_name);
     }
   }
 
@@ -154,7 +154,7 @@
   TestFrameAdapter* const parent_;
   std::vector<TestFrameAdapter*> children_;
   const int virtual_index_in_parent_;
-  blink::UniqueNameHelper unique_name_helper_;
+  UniqueNameHelper unique_name_helper_;
   std::string legacy_name_;
 };
 
@@ -428,4 +428,4 @@
 }
 
 }  // namespace
-}  // namespace content
+}  // namespace blink
diff --git a/third_party/blink/public/common/BUILD.gn b/third_party/blink/public/common/BUILD.gn
index 8ef6b1f..6e58fb3f 100644
--- a/third_party/blink/public/common/BUILD.gn
+++ b/third_party/blink/public/common/BUILD.gn
@@ -114,6 +114,7 @@
     "input/web_pointer_properties.h",
     "input/web_touch_event.h",
     "input/web_touch_point.h",
+    "loader/http_body_element_type.h",
     "loader/loading_behavior_flag.h",
     "loader/mime_sniffing_throttle.h",
     "loader/mime_sniffing_url_loader.h",
@@ -162,6 +163,8 @@
     "page/drag_operation.h",
     "page/launching_process_state.h",
     "page/page_zoom.h",
+    "page_state/page_state.h",
+    "page_state/page_state_serialization.h",
     "peerconnection/peer_connection_tracker_mojom_traits.h",
     "peerconnection/webrtc_ip_handling_policy.h",
     "permissions/permission_utils.h",
diff --git a/third_party/blink/public/common/DEPS b/third_party/blink/public/common/DEPS
index bdebf51..f238e089 100644
--- a/third_party/blink/public/common/DEPS
+++ b/third_party/blink/public/common/DEPS
@@ -24,6 +24,7 @@
     "+ui/base/pointer/pointer_device.h",
     "+ui/events/event_constants.h",
     "+ui/events/types",
+    "+ui/display",
     "+ui/gfx/color_space.h",
     "+ui/gfx/display_color_spaces.h",
     "+ui/gfx/geometry",
diff --git a/third_party/blink/public/common/loader/http_body_element_type.h b/third_party/blink/public/common/loader/http_body_element_type.h
new file mode 100644
index 0000000..e338528
--- /dev/null
+++ b/third_party/blink/public/common/loader/http_body_element_type.h
@@ -0,0 +1,19 @@
+// Copyright 2020 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_PUBLIC_COMMON_LOADER_HTTP_BODY_ELEMENT_TYPE_H_
+#define THIRD_PARTY_BLINK_PUBLIC_COMMON_LOADER_HTTP_BODY_ELEMENT_TYPE_H_
+
+namespace blink {
+
+enum class HTTPBodyElementType {
+  kTypeData,
+  kTypeFile,
+  kTypeBlob,
+  kTypeDataPipe,
+};
+
+}  // namespace blink
+
+#endif  // THIRD_PARTY_BLINK_PUBLIC_COMMON_LOADER_HTTP_BODY_ELEMENT_TYPE_H_
diff --git a/content/public/common/page_state.h b/third_party/blink/public/common/page_state/page_state.h
similarity index 84%
rename from content/public/common/page_state.h
rename to third_party/blink/public/common/page_state/page_state.h
index c630e6b..d4ff9d64 100644
--- a/content/public/common/page_state.h
+++ b/third_party/blink/public/common/page_state/page_state.h
@@ -2,13 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CONTENT_PUBLIC_COMMON_PAGE_STATE_H_
-#define CONTENT_PUBLIC_COMMON_PAGE_STATE_H_
+#ifndef THIRD_PARTY_BLINK_PUBLIC_COMMON_PAGE_STATE_PAGE_STATE_H_
+#define THIRD_PARTY_BLINK_PUBLIC_COMMON_PAGE_STATE_PAGE_STATE_H_
 
 #include <string>
 #include <vector>
 
-#include "content/common/content_export.h"
+#include "third_party/blink/public/common/common_export.h"
 
 class GURL;
 
@@ -16,7 +16,7 @@
 class FilePath;
 }
 
-namespace content {
+namespace blink {
 
 // The PageState class represents the information needed by the rendering
 // engine to reconstruct a web page (and its tree of frames), including for
@@ -24,7 +24,7 @@
 // information is used when navigating back & forward through session history.
 //
 // The format of the encoded data is not exposed by the content API.
-class CONTENT_EXPORT PageState {
+class BLINK_COMMON_EXPORT PageState {
  public:
   static PageState CreateFromEncodedData(const std::string& data);
   static PageState CreateFromURL(const GURL& url);
@@ -65,6 +65,6 @@
   std::string data_;
 };
 
-}  // namespace content
+}  // namespace blink
 
-#endif  // CONTENT_PUBLIC_COMMON_PAGE_STATE_H_
+#endif  // THIRD_PARTY_BLINK_PUBLIC_COMMON_PAGE_STATE_PAGE_STATE_H_
diff --git a/content/common/page_state_serialization.h b/third_party/blink/public/common/page_state/page_state_serialization.h
similarity index 72%
rename from content/common/page_state_serialization.h
rename to third_party/blink/public/common/page_state/page_state_serialization.h
index 63c4145d..53df6ba 100644
--- a/content/common/page_state_serialization.h
+++ b/third_party/blink/public/common/page_state/page_state_serialization.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CONTENT_COMMON_PAGE_STATE_SERIALIZATION_H_
-#define CONTENT_COMMON_PAGE_STATE_SERIALIZATION_H_
+#ifndef THIRD_PARTY_BLINK_PUBLIC_COMMON_PAGE_STATE_PAGE_STATE_SERIALIZATION_H_
+#define THIRD_PARTY_BLINK_PUBLIC_COMMON_PAGE_STATE_PAGE_STATE_SERIALIZATION_H_
 
 #include <stdint.h>
 
@@ -13,21 +13,19 @@
 #include "base/optional.h"
 #include "base/strings/string16.h"
 #include "build/build_config.h"
-#include "content/common/content_export.h"
 #include "services/network/public/cpp/resource_request_body.h"
 #include "services/network/public/mojom/referrer_policy.mojom.h"
 #include "third_party/blink/public/mojom/page_state/page_state.mojom.h"
-#include "third_party/blink/public/platform/web_http_body.h"
 #include "ui/gfx/geometry/point.h"
 #include "ui/gfx/geometry/point_f.h"
 #include "url/gurl.h"
 #include "url/origin.h"
 
-namespace content {
+namespace blink {
 
 constexpr int kMaxScrollAnchorSelectorLength = 500;
 
-struct CONTENT_EXPORT ExplodedHttpBody {
+struct BLINK_COMMON_EXPORT ExplodedHttpBody {
   base::Optional<base::string16> http_content_type;
   scoped_refptr<network::ResourceRequestBody> request_body;
   bool contains_passwords;
@@ -36,7 +34,7 @@
   ~ExplodedHttpBody();
 };
 
-struct CONTENT_EXPORT ExplodedFrameState {
+struct BLINK_COMMON_EXPORT ExplodedFrameState {
   base::Optional<base::string16> url_string;
   base::Optional<base::string16> referrer;
   base::Optional<url::Origin> initiator_origin;
@@ -64,11 +62,11 @@
   ~ExplodedFrameState();
   void operator=(const ExplodedFrameState& other);
 
-private:
+ private:
   void assign(const ExplodedFrameState& other);
 };
 
-struct CONTENT_EXPORT ExplodedPageState {
+struct BLINK_COMMON_EXPORT ExplodedPageState {
   // TODO(creis, lukasza): Instead of storing them in |referenced_files|,
   // extract referenced files from ExplodedHttpBody.  |referenced_files|
   // currently contains a list from all frames, but cannot be deserialized into
@@ -80,21 +78,21 @@
   ~ExplodedPageState();
 };
 
-CONTENT_EXPORT bool DecodePageState(const std::string& encoded,
-                                    ExplodedPageState* exploded);
+BLINK_COMMON_EXPORT bool DecodePageState(const std::string& encoded,
+                                         ExplodedPageState* exploded);
 // Similar to |DecodePageState()|, but returns an int indicating the original
 // version number of the encoded state. Returns -1 on failure.
-CONTENT_EXPORT int DecodePageStateForTesting(const std::string& encoded,
-                                             ExplodedPageState* exploded);
-CONTENT_EXPORT void EncodePageState(const ExplodedPageState& exploded,
-                                    std::string* encoded);
-CONTENT_EXPORT void LegacyEncodePageStateForTesting(
+BLINK_COMMON_EXPORT int DecodePageStateForTesting(const std::string& encoded,
+                                                  ExplodedPageState* exploded);
+BLINK_COMMON_EXPORT void EncodePageState(const ExplodedPageState& exploded,
+                                         std::string* encoded);
+BLINK_COMMON_EXPORT void LegacyEncodePageStateForTesting(
     const ExplodedPageState& exploded,
     int version,
     std::string* encoded);
 
 #if defined(OS_ANDROID)
-CONTENT_EXPORT bool DecodePageStateWithDeviceScaleFactorForTesting(
+BLINK_COMMON_EXPORT bool DecodePageStateWithDeviceScaleFactorForTesting(
     const std::string& encoded,
     float device_scale_factor,
     ExplodedPageState* exploded);
@@ -102,15 +100,14 @@
 // Converts results of EncodeResourceRequestBody (passed in as a pair of |data|
 // + |size|) back into a ResourceRequestBody.  Returns nullptr if the
 // decoding fails (e.g. if |data| is malformed).
-scoped_refptr<network::ResourceRequestBody> DecodeResourceRequestBody(
-    const char* data,
-    size_t size);
+BLINK_COMMON_EXPORT scoped_refptr<network::ResourceRequestBody>
+DecodeResourceRequestBody(const char* data, size_t size);
 
 // Encodes |resource_request_body| into |encoded|.
-std::string EncodeResourceRequestBody(
+BLINK_COMMON_EXPORT std::string EncodeResourceRequestBody(
     const network::ResourceRequestBody& resource_request_body);
 #endif
 
-}  // namespace content
+}  // namespace blink
 
-#endif  // CONTENT_COMMON_PAGE_STATE_SERIALIZATION_H_
+#endif  // THIRD_PARTY_BLINK_PUBLIC_COMMON_PAGE_STATE_PAGE_STATE_SERIALIZATION_H_
diff --git a/third_party/blink/public/devtools_protocol/browser_protocol.pdl b/third_party/blink/public/devtools_protocol/browser_protocol.pdl
index 7cd0971..203c99d 100644
--- a/third_party/blink/public/devtools_protocol/browser_protocol.pdl
+++ b/third_party/blink/public/devtools_protocol/browser_protocol.pdl
@@ -4374,6 +4374,9 @@
         strict-origin-when-cross-origin
       # Whether is loaded via link preload.
       optional boolean isLinkPreload
+      # Set for requests when the TrustToken API is used. Contains the parameters
+      # passed by the developer (e.g. via "fetch") as understood by the backend.
+      experimental optional TrustTokenParams trustTokenParams
 
   # Details of a signed certificate timestamp (SCT).
   type SignedCertificateTimestamp extends object
@@ -4457,6 +4460,31 @@
       fallback-code
       network
 
+  # Determines what type of Trust Token operation is executed and
+  # depending on the type, some additional parameters.
+  experimental type TrustTokenParams extends object
+    properties
+      TrustTokenOperationType type
+
+      # Only set for "srr-token-redemption" type and determine whether
+      # to request a fresh SRR or use a still valid cached SRR.
+      enum refreshPolicy
+        UseCached
+        Refresh
+
+      # Origins of issuers from whom to request tokens or redemption
+      # records.
+      optional array of string issuers
+
+  experimental type TrustTokenOperationType extends string
+    enum
+      # Type "token-request" in the Trust Token API.
+      Issuance
+      # Type "srr-token-redemption" in the Trust Token API.
+      Redemption
+      # Type "send-srr" in the Trust Token API.
+      Signing
+
   # HTTP response data.
   type Response extends object
     properties
diff --git a/third_party/blink/public/platform/web_http_body.h b/third_party/blink/public/platform/web_http_body.h
index 2e45d18d..a1d85b4 100644
--- a/third_party/blink/public/platform/web_http_body.h
+++ b/third_party/blink/public/platform/web_http_body.h
@@ -34,6 +34,7 @@
 #include "base/optional.h"
 #include "base/time/time.h"
 #include "services/network/public/mojom/data_pipe_getter.mojom-shared.h"
+#include "third_party/blink/public/common/loader/http_body_element_type.h"
 #include "third_party/blink/public/mojom/blob/blob.mojom-shared.h"
 #include "third_party/blink/public/platform/cross_variant_mojo_util.h"
 #include "third_party/blink/public/platform/web_data.h"
@@ -51,12 +52,7 @@
 class WebHTTPBody {
  public:
   struct Element {
-    enum Type {
-      kTypeData,
-      kTypeFile,
-      kTypeBlob,
-      kTypeDataPipe,
-    } type;
+    HTTPBodyElementType type;
     WebData data;
     WebString file_path;
     int64_t file_start;
diff --git a/third_party/blink/renderer/core/css/css_properties.json5 b/third_party/blink/renderer/core/css/css_properties.json5
index ce0a6dbb..2150f76 100644
--- a/third_party/blink/renderer/core/css/css_properties.json5
+++ b/third_party/blink/renderer/core/css/css_properties.json5
@@ -1808,7 +1808,6 @@
       property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal", "InitialValue"],
       style_builder_custom_functions: ["initial", "inherit", "value"],
       inherited: true,
-      runtime_flag: "CSSColorScheme",
       include_paths: ["third_party/blink/public/common/css/color_scheme.h"],
       type_name: "Vector<AtomicString>",
       default_value: "Vector<AtomicString, 0>()",
diff --git a/third_party/blink/renderer/core/css/parser/css_proto_converter.cc b/third_party/blink/renderer/core/css/parser/css_proto_converter.cc
index f07a491..bb573c1 100644
--- a/third_party/blink/renderer/core/css/parser/css_proto_converter.cc
+++ b/third_party/blink/renderer/core/css/parser/css_proto_converter.cc
@@ -6,9 +6,17 @@
 #include "third_party/blink/renderer/core/css/parser/css_proto_converter.h"
 
 // TODO(metzman): Figure out how to remove this include and use DCHECK.
+#include "build/build_config.h"
 #include "third_party/blink/renderer/core/css/parser/css.pb.h"
 #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
 
+// TODO(bikineev): "IN" comes as a macro from <windows.h>. It conflicts with
+// Length::IN from the generated proto file. Change the name in css.proto rather
+// than hacking with directives here.
+#if defined(OS_WIN) && defined(IN)
+#undef IN
+#endif
+
 namespace css_proto_converter {
 
 const int Converter::kAtRuleDepthLimit = 5;
diff --git a/third_party/blink/renderer/core/css/style_engine_test.cc b/third_party/blink/renderer/core/css/style_engine_test.cc
index e008541..ff8ebe8 100644
--- a/third_party/blink/renderer/core/css/style_engine_test.cc
+++ b/third_party/blink/renderer/core/css/style_engine_test.cc
@@ -2199,7 +2199,6 @@
 }
 
 TEST_F(StyleEngineTest, ColorSchemeBaseBackgroundChange) {
-  ScopedCSSColorSchemeForTest enable_color_scheme(true);
   ColorSchemeHelper color_scheme_helper(GetDocument());
   color_scheme_helper.SetPreferredColorScheme(
       mojom::blink::PreferredColorScheme::kDark);
@@ -2224,7 +2223,6 @@
 }
 
 TEST_F(StyleEngineTest, ColorSchemeOverride) {
-  ScopedCSSColorSchemeForTest enable_color_scheme(true);
   ScopedCSSColorSchemeUARenderingForTest enable_color_scheme_ua(true);
 
   ColorSchemeHelper color_scheme_helper(GetDocument());
@@ -3283,8 +3281,6 @@
 }
 
 TEST_F(StyleEngineSimTest, OwnerColorSchemeBaseBackground) {
-  ScopedCSSColorSchemeForTest enable_color_scheme(true);
-
   SimRequest main_resource("https://example.com", "text/html");
   SimRequest dark_frame_resource("https://example.com/dark.html", "text/html");
   SimRequest light_frame_resource("https://example.com/light.html",
diff --git a/third_party/blink/renderer/core/dom/document.cc b/third_party/blink/renderer/core/dom/document.cc
index 86304cc..158b12f 100644
--- a/third_party/blink/renderer/core/dom/document.cc
+++ b/third_party/blink/renderer/core/dom/document.cc
@@ -33,7 +33,7 @@
 // instead of including more headers. If that is infeasible, adjust the limit.
 // For more info, see
 // https://chromium.googlesource.com/chromium/src/+/HEAD/docs/wmax_tokens.md
-#pragma clang max_tokens_here 900000
+#pragma clang max_tokens_here 950000
 
 #include <memory>
 #include <utility>
@@ -7102,9 +7102,6 @@
 }
 
 void Document::ColorSchemeMetaChanged() {
-  if (!RuntimeEnabledFeatures::MetaColorSchemeEnabled())
-    return;
-
   const CSSValue* color_scheme = nullptr;
   if (auto* root_element = documentElement()) {
     for (HTMLMetaElement& meta_element :
diff --git a/third_party/blink/renderer/core/exported/web_view_test.cc b/third_party/blink/renderer/core/exported/web_view_test.cc
index a7a2687c..924e1e56 100644
--- a/third_party/blink/renderer/core/exported/web_view_test.cc
+++ b/third_party/blink/renderer/core/exported/web_view_test.cc
@@ -566,8 +566,6 @@
 }
 
 TEST_F(WebViewTest, SetBaseBackgroundColorWithColorScheme) {
-  ScopedCSSColorSchemeForTest enable_color_scheme(true);
-
   WebViewImpl* web_view = web_view_helper_.Initialize();
   ColorSchemeHelper color_scheme_helper(*(web_view->GetPage()));
   color_scheme_helper.SetPreferredColorScheme(
diff --git a/third_party/blink/renderer/core/frame/visual_viewport_test.cc b/third_party/blink/renderer/core/frame/visual_viewport_test.cc
index 4713eaf..d9a0f6d 100644
--- a/third_party/blink/renderer/core/frame/visual_viewport_test.cc
+++ b/third_party/blink/renderer/core/frame/visual_viewport_test.cc
@@ -2717,7 +2717,6 @@
 }
 
 TEST_F(VisualViewportSimTest, UsedColorSchemeFromRootElement) {
-  ScopedCSSColorSchemeForTest color_scheme_enabled(true);
   ScopedCSSColorSchemeUARenderingForTest color_scheme_ua_enabled(true);
 
   ColorSchemeHelper color_scheme_helper(*(WebView().GetPage()));
diff --git a/third_party/blink/renderer/core/html/forms/step_range_test.cc b/third_party/blink/renderer/core/html/forms/step_range_test.cc
index 9916c50..c5cd79c 100644
--- a/third_party/blink/renderer/core/html/forms/step_range_test.cc
+++ b/third_party/blink/renderer/core/html/forms/step_range_test.cc
@@ -11,7 +11,7 @@
 TEST(StepRangeTest, ClampValueWithOutStepMatchedValue) {
   // <input type=range value=200 min=0 max=100 step=1000>
   StepRange step_range(Decimal(200), Decimal(0), Decimal(100), true,
-                       /*has_reversed_range=*/false, Decimal(1000),
+                       /*supports_reversed_range=*/false, Decimal(1000),
                        StepRange::StepDescription());
 
   EXPECT_EQ(Decimal(100), step_range.ClampValue(Decimal(200)));
@@ -21,7 +21,7 @@
 TEST(StepRangeTest, StepSnappedMaximum) {
   // <input type=number value="1110" max=100 step="20">
   StepRange step_range(Decimal::FromDouble(1110), Decimal(0), Decimal(100),
-                       true, /*has_reversed_range=*/false, Decimal(20),
+                       true, /*supports_reversed_range=*/false, Decimal(20),
                        StepRange::StepDescription());
   EXPECT_EQ(Decimal(90), step_range.StepSnappedMaximum());
 
@@ -30,7 +30,7 @@
   // value="8624024784918570374158793713225864658725102756338798521486349461900449498315865014065406918592181034633618363349807887404915072776534917803019477033072906290735591367789665757384135591225430117374220731087966"
   // min=0 max=100 step="18446744073709551575">
   StepRange step_range2(Decimal::FromDouble(8.62402e+207), Decimal(0),
-                        Decimal(100), true, /*has_reversed_range=*/false,
+                        Decimal(100), true, /*supports_reversed_range=*/false,
                         Decimal::FromDouble(1.84467e+19),
                         StepRange::StepDescription());
   EXPECT_FALSE(step_range2.StepSnappedMaximum().IsFinite());
diff --git a/third_party/blink/renderer/core/html/html_meta_element_test.cc b/third_party/blink/renderer/core/html/html_meta_element_test.cc
index 8548b00d..bcc7f9c 100644
--- a/third_party/blink/renderer/core/html/html_meta_element_test.cc
+++ b/third_party/blink/renderer/core/html/html_meta_element_test.cc
@@ -28,14 +28,9 @@
 namespace blink {
 
 class HTMLMetaElementTest : public PageTestBase,
-                            private ScopedDisplayCutoutAPIForTest,
-                            private ScopedMetaColorSchemeForTest,
-                            private ScopedCSSColorSchemeForTest {
+                            private ScopedDisplayCutoutAPIForTest {
  public:
-  HTMLMetaElementTest()
-      : ScopedDisplayCutoutAPIForTest(true),
-        ScopedMetaColorSchemeForTest(true),
-        ScopedCSSColorSchemeForTest(true) {}
+  HTMLMetaElementTest() : ScopedDisplayCutoutAPIForTest(true) {}
   void SetUp() override {
     PageTestBase::SetUp();
     GetDocument().GetSettings()->SetViewportMetaEnabled(true);
diff --git a/third_party/blink/renderer/core/html/image_document.cc b/third_party/blink/renderer/core/html/image_document.cc
index f743142..51728ec2 100644
--- a/third_party/blink/renderer/core/html/image_document.cc
+++ b/third_party/blink/renderer/core/html/image_document.cc
@@ -422,6 +422,15 @@
   else if (cursor_mode == kZoomOut)
     image_style.Append("cursor: zoom-out;");
 
+  if (GetFrame()->IsMainFrame()) {
+    if (image_is_loaded_) {
+      image_style.Append("background-color: hsl(0, 0%, 90%);");
+      image_style.Append("transition: background-color 300ms;");
+    } else if (image_size_is_known_) {
+      image_style.Append("background-color: hsl(0, 0%, 25%);");
+    }
+  }
+
   image_element_->setAttribute(html_names::kStyleAttr,
                                image_style.ToAtomicString());
 }
@@ -437,6 +446,7 @@
     return;
 
   image_size_is_known_ = true;
+  UpdateImageStyle();
 
   if (ShouldShrinkToFit()) {
     // Force resizing of the image
diff --git a/third_party/blink/renderer/core/input/BUILD.gn b/third_party/blink/renderer/core/input/BUILD.gn
index d489e89..5212629 100644
--- a/third_party/blink/renderer/core/input/BUILD.gn
+++ b/third_party/blink/renderer/core/input/BUILD.gn
@@ -5,6 +5,8 @@
 import("//third_party/blink/renderer/core/core.gni")
 
 blink_core_sources("input") {
+  configs += [ "//build/config/compiler:noshadowing" ]
+
   sources = [
     "boundary_event_dispatcher.cc",
     "boundary_event_dispatcher.h",
diff --git a/third_party/blink/renderer/core/input/pointer_event_manager.cc b/third_party/blink/renderer/core/input/pointer_event_manager.cc
index 5762eb6..544acefa 100644
--- a/third_party/blink/renderer/core/input/pointer_event_manager.cc
+++ b/third_party/blink/renderer/core/input/pointer_event_manager.cc
@@ -602,15 +602,16 @@
                  event_handling_util::ShouldDiscardEventTargetingFrame(
                      event, *pointer_event_target.target_frame);
   if (discard) {
-    PointerEvent* pointer_event = pointer_event_factory_.Create(
+    PointerEvent* core_pointer_event = pointer_event_factory_.Create(
         event, coalesced_events, predicted_events,
         pointer_event_target.target_element
             ? pointer_event_target.target_element->GetDocument().domWindow()
             : nullptr);
-    SendTouchPointerEvent(pointer_event_target.target_element,
-                          pointer_event_factory_.CreatePointerCancelEvent(
-                              pointer_event->pointerId(), event.TimeStamp()),
-                          event.hovering);
+    SendTouchPointerEvent(
+        pointer_event_target.target_element,
+        pointer_event_factory_.CreatePointerCancelEvent(
+            core_pointer_event->pointerId(), event.TimeStamp()),
+        event.hovering);
 
     WebPointerEvent pointer_cancel_event;
     pointer_cancel_event.pointer_type = event.pointer_type;
diff --git a/third_party/blink/renderer/core/inspector/inspector_network_agent.cc b/third_party/blink/renderer/core/inspector/inspector_network_agent.cc
index 131d659..cb752a7 100644
--- a/third_party/blink/renderer/core/inspector/inspector_network_agent.cc
+++ b/third_party/blink/renderer/core/inspector/inspector_network_agent.cc
@@ -41,6 +41,7 @@
 #include "net/base/ip_endpoint.h"
 #include "net/http/http_status_code.h"
 #include "services/network/public/mojom/referrer_policy.mojom-blink.h"
+#include "services/network/public/mojom/trust_tokens.mojom-blink.h"
 #include "services/network/public/mojom/websocket.mojom-blink.h"
 #include "third_party/blink/public/common/loader/referrer_utils.h"
 #include "third_party/blink/public/mojom/loader/request_context_frame_type.mojom-blink.h"
@@ -60,6 +61,7 @@
 #include "third_party/blink/renderer/core/inspector/identifiers_factory.h"
 #include "third_party/blink/renderer/core/inspector/inspected_frames.h"
 #include "third_party/blink/renderer/core/inspector/network_resources_data.h"
+#include "third_party/blink/renderer/core/inspector/protocol/Network.h"
 #include "third_party/blink/renderer/core/inspector/request_debug_header_scope.h"
 #include "third_party/blink/renderer/core/loader/document_loader.h"
 #include "third_party/blink/renderer/core/loader/frame_loader.h"
@@ -478,6 +480,47 @@
       .build();
 }
 
+String GetTrustTokenOperationType(
+    network::mojom::TrustTokenOperationType type) {
+  switch (type) {
+    case network::mojom::TrustTokenOperationType::kIssuance:
+      return protocol::Network::TrustTokenOperationTypeEnum::Issuance;
+    case network::mojom::TrustTokenOperationType::kRedemption:
+      return protocol::Network::TrustTokenOperationTypeEnum::Redemption;
+    case network::mojom::TrustTokenOperationType::kSigning:
+      return protocol::Network::TrustTokenOperationTypeEnum::Signing;
+  }
+}
+
+String GetTrustTokenRefreshPolicy(
+    network::mojom::TrustTokenRefreshPolicy policy) {
+  switch (policy) {
+    case network::mojom::TrustTokenRefreshPolicy::kUseCached:
+      return protocol::Network::TrustTokenParams::RefreshPolicyEnum::UseCached;
+    case network::mojom::TrustTokenRefreshPolicy::kRefresh:
+      return protocol::Network::TrustTokenParams::RefreshPolicyEnum::Refresh;
+  }
+}
+
+std::unique_ptr<protocol::Network::TrustTokenParams> BuildTrustTokenParams(
+    const network::mojom::blink::TrustTokenParams& params) {
+  auto protocol_params =
+      protocol::Network::TrustTokenParams::create()
+          .setType(GetTrustTokenOperationType(params.type))
+          .setRefreshPolicy(GetTrustTokenRefreshPolicy(params.refresh_policy))
+          .build();
+
+  if (!params.issuers.IsEmpty()) {
+    auto issuers = std::make_unique<protocol::Array<protocol::String>>();
+    for (const auto& issuer : params.issuers) {
+      issuers->push_back(issuer->ToString());
+    }
+    protocol_params->setIssuers(std::move(issuers));
+  }
+
+  return protocol_params;
+}
+
 void SetNetworkStateOverride(bool offline,
                              double latency,
                              double download_throughput,
@@ -606,6 +649,10 @@
     result->setPostDataEntries(std::move(data_entries));
   if (has_post_data)
     result->setHasPostData(true);
+  if (request.TrustTokenParams()) {
+    result->setTrustTokenParams(
+        BuildTrustTokenParams(*request.TrustTokenParams()));
+  }
   return result;
 }
 
diff --git a/third_party/blink/renderer/core/layout/layout_multi_column_flow_thread.cc b/third_party/blink/renderer/core/layout/layout_multi_column_flow_thread.cc
index 43fb364..0250af64 100644
--- a/third_party/blink/renderer/core/layout/layout_multi_column_flow_thread.cc
+++ b/third_party/blink/renderer/core/layout/layout_multi_column_flow_thread.cc
@@ -717,16 +717,67 @@
   }
 }
 
-void LayoutMultiColumnFlowThread::UpdateFromNG() {
+void LayoutMultiColumnFlowThread::StartLayoutFromNG(unsigned column_count) {
+  NOT_DESTROYED();
+  column_count_ = column_count;
+  last_set_worked_on_ = ToLayoutMultiColumnSetOrNull(FirstMultiColumnBox());
+}
+
+LayoutMultiColumnSet* LayoutMultiColumnFlowThread::PendingColumnSetForNG()
+    const {
+  NOT_DESTROYED();
+  if (last_set_worked_on_ &&
+      !last_set_worked_on_->FirstFragmentainerGroup().IsLogicalHeightKnown()) {
+    DCHECK_EQ(last_set_worked_on_->FragmentainerGroups().size(), 1u);
+    return last_set_worked_on_;
+  }
+  return nullptr;
+}
+
+void LayoutMultiColumnFlowThread::AppendNewFragmentainerGroupFromNG() {
+  NOT_DESTROYED();
+  // TODO(mstensho): This nullptr check shouldn't be here, but we need it for
+  // now. If we have no column set at this point, something has gone wrong, but
+  // NG nested column balancing sometimes acts up when doubly nested (or more),
+  // making the legacy write-back machinery call FinishLayoutFromNG()
+  // prematurely. See e.g. fast/multicol/client-rect-nested.html
+  if (last_set_worked_on_)
+    last_set_worked_on_->AppendNewFragmentainerGroup();
+}
+
+void LayoutMultiColumnFlowThread::SetCurrentColumnBlockSizeFromNG(
+    LayoutUnit block_size) {
+  NOT_DESTROYED();
+  // There are cases where NG creates an empty column even if we don't create a
+  // column set.
+  if (!last_set_worked_on_)
+    return;
+  last_set_worked_on_->LastFragmentainerGroup().SetColumnBlockSizeFromNG(
+      block_size);
+}
+
+void LayoutMultiColumnFlowThread::FinishLayoutFromNG(
+    LayoutUnit flow_thread_offset) {
   NOT_DESTROYED();
   all_columns_have_known_height_ = true;
   for (LayoutBox* column_box = FirstMultiColumnBox(); column_box;
        column_box = column_box->NextSiblingMultiColumnBox()) {
-    if (column_box->IsLayoutMultiColumnSet())
-      ToLayoutMultiColumnSet(column_box)->UpdateFromNG();
     column_box->ClearNeedsLayout();
     column_box->UpdateAfterLayout();
   }
+
+  // If we have a trailing column set, finish it.
+  if (LayoutMultiColumnSet* last_column_set =
+          ToLayoutMultiColumnSetOrNull(LastMultiColumnBox())) {
+    last_column_set->EndFlow(flow_thread_offset);
+    last_column_set->FinishLayoutFromNG();
+  }
+
+  ValidateColumnSets();
+  SetLogicalHeight(flow_thread_offset);
+  UpdateAfterLayout();
+  ClearNeedsLayout();
+  last_set_worked_on_ = nullptr;
 }
 
 bool LayoutMultiColumnFlowThread::IsFragmentainerLogicalHeightKnown() {
@@ -991,10 +1042,19 @@
 }
 
 void LayoutMultiColumnFlowThread::SkipColumnSpanner(
-    LayoutBox* layout_object,
+    const LayoutBox* layout_object,
     LayoutUnit logical_top_in_flow_thread) {
   NOT_DESTROYED();
   DCHECK(layout_object->IsColumnSpanAll());
+
+  // In legacy layout, |last_set_worked_on_| is only updated if we find a column
+  // set after the spanner. We don't want this in NG, since NG may have created
+  // empty columns after the spanner, without a column set being created, and
+  // then we want to leave the column set alone.
+  bool is_ng_layout = MultiColumnBlockFlow()->IsLayoutNGObject();
+  if (is_ng_layout)
+    last_set_worked_on_ = nullptr;
+
   LayoutMultiColumnSpannerPlaceholder* placeholder =
       layout_object->SpannerPlaceholder();
   LayoutBox* previous_column_box = placeholder->PreviousSiblingMultiColumnBox();
@@ -1008,6 +1068,9 @@
     next_set->BeginFlow(logical_top_in_flow_thread);
   }
 
+  if (is_ng_layout)
+    return;
+
   // We'll lay out of spanners after flow thread layout has finished (during
   // layout of the spanner placeholders). There may be containing blocks for
   // out-of-flow positioned descendants of the spanner in the flow thread, so
diff --git a/third_party/blink/renderer/core/layout/layout_multi_column_flow_thread.h b/third_party/blink/renderer/core/layout/layout_multi_column_flow_thread.h
index f70eabfd..2ab300c1 100644
--- a/third_party/blink/renderer/core/layout/layout_multi_column_flow_thread.h
+++ b/third_party/blink/renderer/core/layout/layout_multi_column_flow_thread.h
@@ -255,7 +255,8 @@
   // out inside the flow thread, since the flow thread is not in a spanner's
   // containing block chain (since the containing block is the multicol
   // container).
-  void SkipColumnSpanner(LayoutBox*, LayoutUnit logical_top_in_flow_thread);
+  void SkipColumnSpanner(const LayoutBox*,
+                         LayoutUnit logical_top_in_flow_thread);
 
   // Returns true if at least one column got a new height after flow thread
   // layout (during column set layout), in which case we need another layout
@@ -303,7 +304,11 @@
   void AppendNewFragmentainerGroupIfNeeded(LayoutUnit offset_in_flow_thread,
                                            PageBoundaryRule);
 
-  void UpdateFromNG();
+  void StartLayoutFromNG(unsigned column_count);
+  LayoutMultiColumnSet* PendingColumnSetForNG() const;
+  void AppendNewFragmentainerGroupFromNG();
+  void SetCurrentColumnBlockSizeFromNG(LayoutUnit);
+  void FinishLayoutFromNG(LayoutUnit flow_thread_offset);
 
   // Implementing FragmentationContext:
   bool IsFragmentainerLogicalHeightKnown() final;
diff --git a/third_party/blink/renderer/core/layout/layout_multi_column_set.cc b/third_party/blink/renderer/core/layout/layout_multi_column_set.cc
index 07032b73..b5b7a9856e 100644
--- a/third_party/blink/renderer/core/layout/layout_multi_column_set.cc
+++ b/third_party/blink/renderer/core/layout/layout_multi_column_set.cc
@@ -720,12 +720,15 @@
   return block_flow_bounds;
 }
 
-void LayoutMultiColumnSet::UpdateFromNG() {
+void LayoutMultiColumnSet::FinishLayoutFromNG() {
   NOT_DESTROYED();
-  DCHECK_EQ(fragmentainer_groups_.size(), 1U);
-  auto& group = fragmentainer_groups_[0];
-  group.UpdateFromNG(LogicalHeight());
-  ComputeLayoutOverflow(LogicalHeight());
+  // Calculate the block-size of all the fragmentainer groups combined.
+  LogicalExtentComputedValues computed_values;
+  ComputeLogicalHeight(/* logical_height */ LayoutUnit(),
+                       /* logical_top */ LayoutUnit(), computed_values);
+  SetLogicalHeight(computed_values.extent_);
+  ComputeLayoutOverflow(computed_values.extent_);
+  initial_height_calculated_ = false;
 }
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/layout/layout_multi_column_set.h b/third_party/blink/renderer/core/layout/layout_multi_column_set.h
index 85782690..cec7842 100644
--- a/third_party/blink/renderer/core/layout/layout_multi_column_set.h
+++ b/third_party/blink/renderer/core/layout/layout_multi_column_set.h
@@ -77,6 +77,10 @@
     NOT_DESTROYED();
     return fragmentainer_groups_.Last();
   }
+  MultiColumnFragmentainerGroup& LastFragmentainerGroup() {
+    NOT_DESTROYED();
+    return fragmentainer_groups_.Last();
+  }
   unsigned FragmentainerGroupIndexAtFlowThreadOffset(LayoutUnit,
                                                      PageBoundaryRule) const;
   MultiColumnFragmentainerGroup& FragmentainerGroupAtFlowThreadOffset(
@@ -264,7 +268,7 @@
   bool ComputeColumnRuleBounds(const LayoutPoint& paint_offset,
                                Vector<LayoutRect>& column_rule_bounds) const;
 
-  void UpdateFromNG();
+  void FinishLayoutFromNG();
 
  protected:
   LayoutMultiColumnSet(LayoutFlowThread*);
diff --git a/third_party/blink/renderer/core/layout/layout_object.cc b/third_party/blink/renderer/core/layout/layout_object.cc
index a635400..607a77f 100644
--- a/third_party/blink/renderer/core/layout/layout_object.cc
+++ b/third_party/blink/renderer/core/layout/layout_object.cc
@@ -190,6 +190,9 @@
   // The following fields are in FragmentData.
   PhysicalOffset paint_offset_;
   std::unique_ptr<int> rare_data_;
+#if DCHECK_IS_ON()
+  bool is_destroyed_;
+#endif
 };
 
 ASSERT_SIZE(LayoutObject, SameSizeAsLayoutObject);
@@ -329,6 +332,9 @@
   DCHECK(BeingDestroyed());
 #endif
   InstanceCounters::DecrementCounter(InstanceCounters::kLayoutObjectCounter);
+#if DCHECK_IS_ON()
+  is_destroyed_ = true;
+#endif
 }
 
 bool LayoutObject::IsDescendantOf(const LayoutObject* obj) const {
diff --git a/third_party/blink/renderer/core/layout/layout_object.h b/third_party/blink/renderer/core/layout/layout_object.h
index 6c65ee66..b3af32ed 100644
--- a/third_party/blink/renderer/core/layout/layout_object.h
+++ b/third_party/blink/renderer/core/layout/layout_object.h
@@ -4135,6 +4135,10 @@
   static bool affects_parent_block_;
 
   FragmentData fragment_;
+
+#if DCHECK_IS_ON()
+  bool is_destroyed_ = false;
+#endif
 };
 
 // Allow equality comparisons of LayoutObjects by reference or pointer,
diff --git a/third_party/blink/renderer/core/layout/layout_text_control.cc b/third_party/blink/renderer/core/layout/layout_text_control.cc
index bbef253..b0847fa 100644
--- a/third_party/blink/renderer/core/layout/layout_text_control.cc
+++ b/third_party/blink/renderer/core/layout/layout_text_control.cc
@@ -90,19 +90,20 @@
 }
 
 void LayoutTextControl::HitInnerEditorElement(
+    const LayoutBox& box,
+    HTMLElement& inner_editor,
     HitTestResult& result,
     const HitTestLocation& hit_test_location,
     const PhysicalOffset& accumulated_offset) {
   NOT_DESTROYED();
-  HTMLElement* inner_editor = InnerEditorElement();
-  if (!inner_editor->GetLayoutObject())
+  if (!inner_editor.GetLayoutObject())
     return;
 
   PhysicalOffset local_point =
       hit_test_location.Point() - accumulated_offset -
-      inner_editor->GetLayoutObject()->LocalToAncestorPoint(PhysicalOffset(),
-                                                            this);
-  result.SetNodeAndPosition(inner_editor, local_point);
+      inner_editor.GetLayoutObject()->LocalToAncestorPoint(PhysicalOffset(),
+                                                           &box);
+  result.SetNodeAndPosition(&inner_editor, local_point);
 }
 
 static const char* const kFontFamiliesWithInvalidCharWidth[] = {
diff --git a/third_party/blink/renderer/core/layout/layout_text_control.h b/third_party/blink/renderer/core/layout/layout_text_control.h
index 150de7fe..a26a2d46 100644
--- a/third_party/blink/renderer/core/layout/layout_text_control.h
+++ b/third_party/blink/renderer/core/layout/layout_text_control.h
@@ -53,6 +53,12 @@
   static float GetAvgCharWidth(const ComputedStyle& style);
   static bool HasValidAvgCharWidth(const Font& font);
 
+  static void HitInnerEditorElement(const LayoutBox& box,
+                                    HTMLElement& inner_editor,
+                                    HitTestResult&,
+                                    const HitTestLocation&,
+                                    const PhysicalOffset& accumulated_offset);
+
  protected:
   LayoutTextControl(TextControlElement*);
 
@@ -62,10 +68,6 @@
 
   void StyleDidChange(StyleDifference, const ComputedStyle* old_style) override;
 
-  void HitInnerEditorElement(HitTestResult&,
-                             const HitTestLocation&,
-                             const PhysicalOffset& accumulated_offset);
-
   LayoutObject* LayoutSpecialExcludedChild(bool relayout_children,
                                            SubtreeLayoutScope&) override;
 
diff --git a/third_party/blink/renderer/core/layout/layout_text_control_multi_line.cc b/third_party/blink/renderer/core/layout/layout_text_control_multi_line.cc
index 4ae3b98..fa608856 100644
--- a/third_party/blink/renderer/core/layout/layout_text_control_multi_line.cc
+++ b/third_party/blink/renderer/core/layout/layout_text_control_multi_line.cc
@@ -50,9 +50,10 @@
     return true;
 
   if (result.InnerNode() == GetNode() ||
-      result.InnerNode() == InnerEditorElement())
-    HitInnerEditorElement(result, hit_test_location, accumulated_offset);
-
+      result.InnerNode() == InnerEditorElement()) {
+    HitInnerEditorElement(*this, *InnerEditorElement(), result,
+                          hit_test_location, accumulated_offset);
+  }
   return true;
 }
 
diff --git a/third_party/blink/renderer/core/layout/layout_text_control_single_line.cc b/third_party/blink/renderer/core/layout/layout_text_control_single_line.cc
index 9bf9957..61c86ae 100644
--- a/third_party/blink/renderer/core/layout/layout_text_control_single_line.cc
+++ b/third_party/blink/renderer/core/layout/layout_text_control_single_line.cc
@@ -171,7 +171,8 @@
             container->GetLayoutBox()->PhysicalLocation();
       }
     }
-    HitInnerEditorElement(result, hit_test_location, accumulated_offset);
+    HitInnerEditorElement(*this, *InnerEditorElement(), result,
+                          hit_test_location, accumulated_offset);
   }
   return true;
 }
diff --git a/third_party/blink/renderer/core/layout/layout_theme_test.cc b/third_party/blink/renderer/core/layout/layout_theme_test.cc
index 5ce7d85f..76d7557 100644
--- a/third_party/blink/renderer/core/layout/layout_theme_test.cc
+++ b/third_party/blink/renderer/core/layout/layout_theme_test.cc
@@ -24,12 +24,9 @@
 namespace blink {
 
 class LayoutThemeTest : public PageTestBase,
-                        private ScopedCSSColorSchemeForTest,
                         private ScopedCSSColorSchemeUARenderingForTest {
  protected:
-  LayoutThemeTest()
-      : ScopedCSSColorSchemeForTest(true),
-        ScopedCSSColorSchemeUARenderingForTest(true) {}
+  LayoutThemeTest() : ScopedCSSColorSchemeUARenderingForTest(true) {}
   void SetHtmlInnerHTML(const char* html_content);
 };
 
diff --git a/third_party/blink/renderer/core/layout/multi_column_fragmentainer_group.cc b/third_party/blink/renderer/core/layout/multi_column_fragmentainer_group.cc
index e479280..aee79c33 100644
--- a/third_party/blink/renderer/core/layout/multi_column_fragmentainer_group.cc
+++ b/third_party/blink/renderer/core/layout/multi_column_fragmentainer_group.cc
@@ -327,8 +327,10 @@
   return count;
 }
 
-void MultiColumnFragmentainerGroup::UpdateFromNG(LayoutUnit logical_height) {
-  logical_height_ = logical_height;
+void MultiColumnFragmentainerGroup::SetColumnBlockSizeFromNG(
+    LayoutUnit block_size) {
+  DCHECK(!is_logical_height_known_ || logical_height_ == block_size);
+  logical_height_ = block_size;
   is_logical_height_known_ = true;
 }
 
diff --git a/third_party/blink/renderer/core/layout/multi_column_fragmentainer_group.h b/third_party/blink/renderer/core/layout/multi_column_fragmentainer_group.h
index 8a6c173d..67866cd 100644
--- a/third_party/blink/renderer/core/layout/multi_column_fragmentainer_group.h
+++ b/third_party/blink/renderer/core/layout/multi_column_fragmentainer_group.h
@@ -159,7 +159,7 @@
   // Returns 1 or greater, never 0.
   unsigned ActualColumnCount() const;
 
-  void UpdateFromNG(LayoutUnit logical_height);
+  void SetColumnBlockSizeFromNG(LayoutUnit);
 
  private:
   LayoutUnit HeightAdjustedForRowOffset(LayoutUnit height) const;
diff --git a/third_party/blink/renderer/core/layout/ng/layout_ng_block_flow_mixin.h b/third_party/blink/renderer/core/layout/ng/layout_ng_block_flow_mixin.h
index 9e58015..6f468e8 100644
--- a/third_party/blink/renderer/core/layout/ng/layout_ng_block_flow_mixin.h
+++ b/third_party/blink/renderer/core/layout/ng/layout_ng_block_flow_mixin.h
@@ -46,7 +46,7 @@
   bool NodeAtPoint(HitTestResult&,
                    const HitTestLocation&,
                    const PhysicalOffset& accumulated_offset,
-                   HitTestAction) final;
+                   HitTestAction) override;
 
   PositionWithAffinity PositionForPoint(const PhysicalOffset&) const override;
 
diff --git a/third_party/blink/renderer/core/layout/ng/layout_ng_text_control_multi_line.cc b/third_party/blink/renderer/core/layout/ng/layout_ng_text_control_multi_line.cc
index f3e87ca..e743bb0 100644
--- a/third_party/blink/renderer/core/layout/ng/layout_ng_text_control_multi_line.cc
+++ b/third_party/blink/renderer/core/layout/ng/layout_ng_text_control_multi_line.cc
@@ -4,6 +4,9 @@
 
 #include "third_party/blink/renderer/core/layout/ng/layout_ng_text_control_multi_line.h"
 
+#include "third_party/blink/renderer/core/html/forms/text_control_element.h"
+#include "third_party/blink/renderer/core/layout/layout_text_control.h"
+
 namespace blink {
 
 LayoutNGTextControlMultiLine::LayoutNGTextControlMultiLine(Element* element)
@@ -14,4 +17,26 @@
          LayoutNGBlockFlow::IsOfType(type);
 }
 
+bool LayoutNGTextControlMultiLine::NodeAtPoint(
+    HitTestResult& result,
+    const HitTestLocation& hit_test_location,
+    const PhysicalOffset& accumulated_offset,
+    HitTestAction hit_test_action) {
+  if (!LayoutNGBlockFlow::NodeAtPoint(result, hit_test_location,
+                                      accumulated_offset, hit_test_action))
+    return false;
+
+  const LayoutObject* stop_node = result.GetHitTestRequest().GetStopNode();
+  if (stop_node && stop_node->NodeForHitTest() == result.InnerNode())
+    return true;
+
+  HTMLElement* inner_editor =
+      To<TextControlElement>(GetNode())->InnerEditorElement();
+  if (result.InnerNode() == GetNode() || result.InnerNode() == inner_editor) {
+    LayoutTextControl::HitInnerEditorElement(
+        *this, *inner_editor, result, hit_test_location, accumulated_offset);
+  }
+  return true;
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/layout/ng/layout_ng_text_control_multi_line.h b/third_party/blink/renderer/core/layout/ng/layout_ng_text_control_multi_line.h
index 1792521c..793ff08 100644
--- a/third_party/blink/renderer/core/layout/ng/layout_ng_text_control_multi_line.h
+++ b/third_party/blink/renderer/core/layout/ng/layout_ng_text_control_multi_line.h
@@ -26,6 +26,11 @@
     NOT_DESTROYED();
     return true;
   }
+
+  bool NodeAtPoint(HitTestResult& result,
+                   const HitTestLocation& hit_test_location,
+                   const PhysicalOffset& accumulated_offset,
+                   HitTestAction hit_test_action) override;
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/layout/ng/ng_block_node.cc b/third_party/blink/renderer/core/layout/ng/ng_block_node.cc
index 89669c7..975e028 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_block_node.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_block_node.cc
@@ -11,6 +11,7 @@
 #include "third_party/blink/renderer/core/html/html_marquee_element.h"
 #include "third_party/blink/renderer/core/input_type_names.h"
 #include "third_party/blink/renderer/core/layout/box_layout_extra_input.h"
+#include "third_party/blink/renderer/core/layout/geometry/writing_mode_converter.h"
 #include "third_party/blink/renderer/core/layout/intrinsic_sizing_info.h"
 #include "third_party/blink/renderer/core/layout/layout_block_flow.h"
 #include "third_party/blink/renderer/core/layout/layout_fieldset.h"
@@ -207,89 +208,6 @@
   return result;
 }
 
-void UpdateLegacyMultiColumnFlowThread(
-    NGBlockNode node,
-    LayoutMultiColumnFlowThread* flow_thread,
-    const NGConstraintSpace& constraint_space,
-    const NGPhysicalBoxFragment& fragment) {
-  WritingMode writing_mode = constraint_space.GetWritingMode();
-  LayoutUnit flow_end;
-  bool has_processed_first_column_in_flow_thread = false;
-  bool has_processed_first_column_in_row = false;
-
-  // Stitch the columns together.
-  NGBoxStrut border_scrollbar_padding =
-      ComputeBorders(constraint_space, node) +
-      ComputeScrollbars(constraint_space, node) +
-      ComputePadding(constraint_space, node.Style());
-  NGFragment logical_multicol_fragment(writing_mode, fragment);
-  LayoutUnit column_row_inline_size = logical_multicol_fragment.InlineSize() -
-                                      border_scrollbar_padding.InlineSum();
-  LayoutMultiColumnSet* column_set =
-      ToLayoutMultiColumnSetOrNull(flow_thread->FirstMultiColumnBox());
-  for (const auto& child : fragment.Children()) {
-    if (child->GetLayoutObject() &&
-        child->GetLayoutObject()->IsColumnSpanAll()) {
-      // Column spanners are not part of the fragmentation context. We'll use
-      // them as stepping stones to get to the next column set. Note that there
-      // are known discrepancies between when the legacy engine creates column
-      // sets, and when LayoutNG creates column fragments, so our code here
-      // needs to deal with:
-      // 1: NG column fragments with no associated legacy column set
-      // 2: A legacy column set with no associated NG column fragments
-      NGFragment logical_spanner_fragment(writing_mode, *child);
-      if (column_set)
-        column_set->EndFlow(flow_end);
-      // Prepare the next column set, if there's one directly following this
-      // spanner.
-      LayoutMultiColumnSpannerPlaceholder* spanner_placeholder =
-          child->GetLayoutObject()->SpannerPlaceholder();
-      column_set = ToLayoutMultiColumnSetOrNull(
-          spanner_placeholder->NextSiblingMultiColumnBox());
-      if (column_set)
-        column_set->BeginFlow(flow_end);
-      has_processed_first_column_in_row = false;
-      continue;
-    }
-    NGFragment logical_column_fragment(writing_mode, *child);
-    flow_end += logical_column_fragment.BlockSize();
-    // Non-uniform fragmentainer widths not supported by legacy layout.
-    DCHECK(!has_processed_first_column_in_flow_thread ||
-           flow_thread->LogicalWidth() == logical_column_fragment.InlineSize());
-    if (!has_processed_first_column_in_flow_thread) {
-      // The offset of the flow thread should be the same as that of the first
-      // first column.
-      flow_thread->SetLocationAndUpdateOverflowControlsIfNeeded(
-          child.Offset().ToLayoutPoint());
-      flow_thread->SetLogicalWidth(logical_column_fragment.InlineSize());
-      has_processed_first_column_in_flow_thread = true;
-    }
-    if (!has_processed_first_column_in_row && column_set) {
-      column_set->SetLogicalLeft(border_scrollbar_padding.inline_start);
-      if (IsHorizontalWritingMode(writing_mode)) {
-        column_set->SetLogicalTop(child.offset.top);
-      } else if (IsFlippedBlocksWritingMode(writing_mode)) {
-        column_set->SetLogicalTop(fragment.Size().width - child.offset.left -
-                                  child->Size().width);
-      } else {
-        column_set->SetLogicalTop(child.offset.left);
-      }
-      column_set->SetLogicalWidth(column_row_inline_size);
-      column_set->SetLogicalHeight(logical_column_fragment.BlockSize());
-      has_processed_first_column_in_row = true;
-    }
-  }
-
-  if (column_set)
-    column_set->EndFlow(flow_end);
-
-  flow_thread->UpdateFromNG();
-  flow_thread->ValidateColumnSets();
-  flow_thread->SetLogicalHeight(flow_end);
-  flow_thread->UpdateAfterLayout();
-  flow_thread->ClearNeedsLayout();
-}
-
 NGConstraintSpace CreateConstraintSpaceForMinMax(
     const NGBlockNode& node,
     const MinMaxSizesInput& input) {
@@ -418,6 +336,38 @@
   return false;
 }
 
+// Convert a physical offset for an NG fragment to a physical legacy
+// LayoutPoint, to be used in LayoutBox. There are special considerations for
+// vertical-rl writing-mode, and also for block fragmentation (the block-offset
+// should include consumed space in previous fragments).
+inline LayoutPoint ToLayoutPoint(
+    const NGPhysicalBoxFragment& child_fragment,
+    PhysicalOffset offset,
+    const NGPhysicalBoxFragment& container_fragment,
+    const NGBlockBreakToken* previous_container_break_token) {
+  if (UNLIKELY(container_fragment.Style().IsFlippedBlocksWritingMode())) {
+    // Move the physical offset to the right side of the child fragment,
+    // relative to the right edge of the container fragment. This is the
+    // block-start offset in vertical-rl, and the legacy engine expects always
+    // expects the block offset to be relative to block-start.
+    offset.left = container_fragment.Size().width - offset.left -
+                  child_fragment.Size().width;
+  }
+
+  if (UNLIKELY(previous_container_break_token)) {
+    // Add the amount of block-size previously (in previous fragmentainers)
+    // consumed by the container fragment. This will map the child's offset
+    // nicely into the flow thread coordinate system used by the legacy engine.
+    LayoutUnit consumed = previous_container_break_token->ConsumedBlockSize();
+    if (container_fragment.Style().IsHorizontalWritingMode())
+      offset.top += consumed;
+    else
+      offset.left += consumed;
+  }
+
+  return offset.ToLayoutPoint();
+}
+
 }  // namespace
 
 scoped_refptr<const NGLayoutResult> NGBlockNode::Layout(
@@ -1122,10 +1072,12 @@
   // Position the children inside the box. We skip this if display-lock prevents
   // child layout.
   if (!ChildLayoutBlockedByDisplayLock()) {
-    if (UNLIKELY(flow_thread))
-      PlaceChildrenInFlowThread(physical_fragment);
-    else
+    if (UNLIKELY(flow_thread)) {
+      PlaceChildrenInFlowThread(flow_thread, constraint_space,
+                                physical_fragment, previous_break_token);
+    } else {
       PlaceChildrenInLayoutBox(physical_fragment, previous_break_token);
+    }
   }
 
   if (UNLIKELY(!is_last_fragment))
@@ -1138,14 +1090,10 @@
     block->CheckPositionedObjectsNeedLayout();
 #endif
 
-    if (UNLIKELY(flow_thread)) {
-      UpdateLegacyMultiColumnFlowThread(*this, flow_thread, constraint_space,
-                                        physical_fragment);
-
+    if (UNLIKELY(flow_thread && Style().HasColumnRule())) {
       // Issue full invalidation, in case the number of column rules have
       // changed.
-      if (Style().HasColumnRule())
-        needs_full_invalidation = true;
+      needs_full_invalidation = true;
     }
 
     block->SetNeedsOverflowRecalc(
@@ -1206,31 +1154,185 @@
 }
 
 void NGBlockNode::PlaceChildrenInFlowThread(
-    const NGPhysicalBoxFragment& physical_fragment) const {
-  const NGBlockBreakToken* previous_break_token = nullptr;
+    LayoutMultiColumnFlowThread* flow_thread,
+    const NGConstraintSpace& space,
+    const NGPhysicalBoxFragment& physical_fragment,
+    const NGBlockBreakToken* previous_container_break_token) const {
+  // Stitch the contents of the columns together in the legacy flow thread, and
+  // update the position and size of column sets, spanners and spanner
+  // placeholders. Create fragmentainer groups as needed. When in a nested
+  // fragmentation context, we need one fragmentainer group for each outer
+  // fragmentainer in which the column contents occur. All this ensures that the
+  // legacy layout tree is sufficiently set up, so that DOM position/size
+  // querying APIs (such as offsetTop and offsetLeft) work correctly. We still
+  // rely on the legacy engine for this.
+  //
+  // This rather complex piece of machinery is described to some extent in the
+  // design document for legacy multicol:
+  // https://www.chromium.org/developers/design-documents/multi-column-layout
+
+  NGBoxStrut border_scrollbar_padding = ComputeBorders(space, *this) +
+                                        ComputeScrollbars(space, *this) +
+                                        ComputePadding(space, Style());
+  WritingModeConverter converter(space.GetWritingDirection(),
+                                 physical_fragment.Size());
+  LayoutUnit column_row_inline_size =
+      converter.ToLogical(physical_fragment.Size()).inline_size -
+      border_scrollbar_padding.InlineSum();
+
+  const NGBlockBreakToken* previous_column_break_token = nullptr;
+  LayoutMultiColumnSet* pending_column_set = nullptr;
+  LayoutUnit flow_thread_offset;
+  bool has_processed_first_column_in_flow_thread = false;
+  bool should_append_fragmentainer_group = false;
+
+  if (IsResumingLayout(previous_container_break_token)) {
+    // This multicol container is nested inside another fragmentation context,
+    // and this isn't its first fragment. Locate the break token for the
+    // previous inner column contents, so that we include the correct amount of
+    // consumed block-size in the child offsets. If there's a break token for
+    // column contents, we'll find it at the back.
+    const auto& child_break_tokens =
+        previous_container_break_token->ChildBreakTokens();
+    if (!child_break_tokens.empty()) {
+      const auto* token = To<NGBlockBreakToken>(child_break_tokens.back());
+      // We also create break tokens for spanners, so we need to check.
+      if (token->InputNode() == *this) {
+        previous_column_break_token = token;
+        flow_thread_offset = previous_column_break_token->ConsumedBlockSize();
+
+        // We're usually resuming layout into a column set that has already been
+        // started in an earlier fragment, but in some cases the column set
+        // starts exactly at the outer fragmentainer boundary (right after a
+        // spanner that took up all remaining space in the earlier fragment),
+        // and when this happens, we need to initialize the set now.
+        pending_column_set = flow_thread->PendingColumnSetForNG();
+
+        // If we resume with column content (without being interrupted by a
+        // spanner) in this multicol fragment, we need to add another
+        // fragmentainer group to the column set that we're resuming.
+        should_append_fragmentainer_group = true;
+      }
+    }
+  } else {
+    // This is the first fragment generated for the multicol container (there
+    // may be multiple fragments if we're nested inside another fragmentation
+    // context).
+    int column_count =
+        ResolveUsedColumnCount(space.AvailableSize().inline_size, Style());
+    flow_thread->StartLayoutFromNG(column_count);
+    pending_column_set =
+        ToLayoutMultiColumnSetOrNull(flow_thread->FirstMultiColumnBox());
+  }
+
   for (const auto& child : physical_fragment.Children()) {
-    const LayoutObject* child_object = child->GetLayoutObject();
-    if (child_object && child_object != box_) {
-      DCHECK(child_object->IsColumnSpanAll());
-      CopyChildFragmentPosition(To<NGPhysicalBoxFragment>(*child), child.offset,
+    const auto& child_fragment = To<NGPhysicalBoxFragment>(*child);
+    const LayoutBox* child_box = ToLayoutBox(child_fragment.GetLayoutObject());
+    if (child_box && child_box != box_) {
+      DCHECK(child_box->IsColumnSpanAll());
+      CopyChildFragmentPosition(child_fragment, child.offset,
                                 physical_fragment);
+      LayoutBox* placeholder = child_box->SpannerPlaceholder();
+      if (!child_fragment.BreakToken()) {
+        // Last fragment for this spanner. Update its placeholder.
+        placeholder->SetLocation(child_box->Location());
+        placeholder->SetSize(child_box->Size());
+      }
+
+      flow_thread->SkipColumnSpanner(child_box, flow_thread_offset);
+
+      if (LayoutMultiColumnSet* previous_column_set =
+              ToLayoutMultiColumnSetOrNull(
+                  placeholder->PreviousSiblingMultiColumnBox()))
+        previous_column_set->FinishLayoutFromNG();
+
+      pending_column_set = ToLayoutMultiColumnSetOrNull(
+          placeholder->NextSiblingMultiColumnBox());
+
+      // If this multicol container was nested inside another fragmentation
+      // context, and we're resuming at a subsequent fragment, we'll normally
+      // append another fragmentainer group for column contents. But since we
+      // found a spanner first, we won't do that, since we'll move to another
+      // column set (if there's more column content at all).
+      should_append_fragmentainer_group = false;
       continue;
     }
+
+    DCHECK(!child_box);
+
+    LogicalSize logical_size = converter.ToLogical(child_fragment.Size());
+
+    if (has_processed_first_column_in_flow_thread) {
+      // Non-uniform fragmentainer widths not supported by legacy layout.
+      DCHECK_EQ(flow_thread->LogicalWidth(), logical_size.inline_size);
+    } else {
+      // The offset of the flow thread is the same as that of the first column.
+      LayoutPoint point =
+          ToLayoutPoint(child_fragment, child.offset, physical_fragment,
+                        previous_container_break_token);
+      flow_thread->SetLocationAndUpdateOverflowControlsIfNeeded(point);
+      flow_thread->SetLogicalWidth(logical_size.inline_size);
+      has_processed_first_column_in_flow_thread = true;
+    }
+
+    if (pending_column_set) {
+      // We're visiting this column set for the first time in this layout pass.
+      // Set up what we can set up. That's everything except for the block-size.
+      // Set the inline-size to that of the content-box of the multicol
+      // container. The inline-offset will be the content-box edge of the
+      // multicol container, and the block-offset will be the block-offset of
+      // the column itself. It doesn't matter which column from the same row we
+      // use, since all columns have the same block-offset and block-size (so
+      // just use the first one).
+      LogicalOffset logical_offset(
+          border_scrollbar_padding.inline_start,
+          converter.ToLogical(child.offset, child_fragment.Size())
+              .block_offset);
+      PhysicalOffset physical_offset =
+          converter.ToPhysical(logical_offset, child_fragment.Size());
+      // We have calculated the physical offset relative to the border edge of
+      // this multicol container fragment. We'll now convert it to a legacy
+      // engine LayoutPoint, which will also take care of converting it into the
+      // flow thread coordinate space, if we happen to be nested inside another
+      // fragmentation context.
+      LayoutPoint point =
+          ToLayoutPoint(child_fragment, physical_offset, physical_fragment,
+                        previous_container_break_token);
+
+      pending_column_set->SetLocation(point);
+      pending_column_set->SetLogicalWidth(column_row_inline_size);
+      pending_column_set->ResetColumnHeight();
+      pending_column_set = nullptr;
+    } else if (should_append_fragmentainer_group) {
+      // Resuming column layout from the previous outer fragmentainer into the
+      // same column set as we used there.
+      flow_thread->AppendNewFragmentainerGroupFromNG();
+      should_append_fragmentainer_group = false;
+    }
+
+    flow_thread->SetCurrentColumnBlockSizeFromNG(logical_size.block_size);
+
     // Each anonymous child of a multicol container constitutes one column.
     // Position each child fragment in the first column that they occur,
     // relatively to the block-start of the flow thread.
-    const auto* column = To<NGPhysicalBoxFragment>(child.get());
-    PlaceChildrenInLayoutBox(*column, previous_break_token);
+    PlaceChildrenInLayoutBox(child_fragment, previous_column_break_token);
 
     // If the multicol container has inline children, there may still be floats
     // there, but they aren't stored as child fragments of |column| in that case
     // (but rather inside fragment items). Make sure that they get positioned,
     // too.
-    if (const NGFragmentItems* items = column->Items())
-      CopyFragmentItemsToLayoutBox(*column, *items, previous_break_token);
+    if (const NGFragmentItems* items = child_fragment.Items()) {
+      CopyFragmentItemsToLayoutBox(child_fragment, *items,
+                                   previous_column_break_token);
+    }
 
-    previous_break_token = To<NGBlockBreakToken>(column->BreakToken());
+    flow_thread_offset += logical_size.block_size;
+    previous_column_break_token =
+        To<NGBlockBreakToken>(child_fragment.BreakToken());
   }
+
+  if (!physical_fragment.BreakToken())
+    flow_thread->FinishLayoutFromNG(flow_thread_offset);
 }
 
 // Copies data back to the legacy layout tree for a given child fragment.
@@ -1245,28 +1347,9 @@
 
   DCHECK(layout_box->Parent()) << "Should be called on children only.";
 
-  if (UNLIKELY(container_fragment.Style().IsFlippedBlocksWritingMode())) {
-    // Move the physical offset to the right side of the child fragment,
-    // relative to the right edge of the container fragment. This is the
-    // block-start offset in vertical-rl, and the legacy engine expects always
-    // expects the block offset to be relative to block-start.
-    offset.left = container_fragment.Size().width - offset.left -
-                  child_fragment.Size().width;
-  }
-
-  if (UNLIKELY(previous_container_break_token)) {
-    // Add the amount of block-size previously (in previous fragmentainers)
-    // consumed by the container fragment. This will map the child's offset
-    // nicely into the flow thread coordinate system used by the legacy engine.
-    LayoutUnit consumed = previous_container_break_token->ConsumedBlockSize();
-    if (container_fragment.Style().IsHorizontalWritingMode())
-      offset.top += consumed;
-    else
-      offset.left += consumed;
-  }
-
-  layout_box->SetLocationAndUpdateOverflowControlsIfNeeded(
-      offset.ToLayoutPoint());
+  LayoutPoint point = ToLayoutPoint(child_fragment, offset, container_fragment,
+                                    previous_container_break_token);
+  layout_box->SetLocationAndUpdateOverflowControlsIfNeeded(point);
 }
 
 // For inline children, NG painters handles fragments directly, but there are
diff --git a/third_party/blink/renderer/core/layout/ng/ng_block_node.h b/third_party/blink/renderer/core/layout/ng/ng_block_node.h
index 0017dba..20600016 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_block_node.h
+++ b/third_party/blink/renderer/core/layout/ng/ng_block_node.h
@@ -233,7 +233,11 @@
   void PlaceChildrenInLayoutBox(
       const NGPhysicalBoxFragment&,
       const NGBlockBreakToken* previous_break_token) const;
-  void PlaceChildrenInFlowThread(const NGPhysicalBoxFragment&) const;
+  void PlaceChildrenInFlowThread(
+      LayoutMultiColumnFlowThread*,
+      const NGConstraintSpace&,
+      const NGPhysicalBoxFragment&,
+      const NGBlockBreakToken* previous_container_break_token) const;
   void CopyChildFragmentPosition(
       const NGPhysicalBoxFragment& child_fragment,
       PhysicalOffset,
diff --git a/third_party/blink/renderer/core/layout/scrollbars_test.cc b/third_party/blink/renderer/core/layout/scrollbars_test.cc
index b4ab9588..5c2264ad 100644
--- a/third_party/blink/renderer/core/layout/scrollbars_test.cc
+++ b/third_party/blink/renderer/core/layout/scrollbars_test.cc
@@ -2990,7 +2990,6 @@
 
 TEST_P(ScrollbarColorSchemeTest, MAYBE_ThemeEnginePaint) {
   ScopedTestingPlatformSupport<ScrollbarTestingPlatformSupport> platform;
-  ScopedCSSColorSchemeForTest color_scheme_scope(true);
   ScopedCSSColorSchemeUARenderingForTest color_scheme_ua_scope(true);
 
   WebView().MainFrameViewWidget()->Resize(gfx::Size(800, 600));
diff --git a/third_party/blink/renderer/core/layout/svg/svg_marker_data.cc b/third_party/blink/renderer/core/layout/svg/svg_marker_data.cc
index 3673515..b3f9a69a 100644
--- a/third_party/blink/renderer/core/layout/svg/svg_marker_data.cc
+++ b/third_party/blink/renderer/core/layout/svg/svg_marker_data.cc
@@ -27,8 +27,10 @@
 namespace blink {
 
 static double BisectingAngle(double in_angle, double out_angle) {
+  double diff = in_angle - out_angle;
   // WK193015: Prevent bugs due to angles being non-continuous.
-  if (fabs(in_angle - out_angle) > 180)
+  // Use an inclusive lower limit to not produce the same angle for both limits.
+  if (diff > 180 || diff <= -180)
     in_angle += 360;
   return (in_angle + out_angle) / 2;
 }
diff --git a/third_party/blink/renderer/core/paint/ng/ng_box_fragment_painter.cc b/third_party/blink/renderer/core/paint/ng/ng_box_fragment_painter.cc
index c8e8f1a..78fe8fa6 100644
--- a/third_party/blink/renderer/core/paint/ng/ng_box_fragment_painter.cc
+++ b/third_party/blink/renderer/core/paint/ng/ng_box_fragment_painter.cc
@@ -2047,6 +2047,11 @@
     const NGPhysicalLineBoxFragment& fragment,
     const NGInlineBackwardCursor& cursor,
     const PhysicalOffset& physical_offset) {
+  PhysicalRect overflow_rect = cursor.Current().InkOverflow();
+  overflow_rect.Move(physical_offset);
+  if (!hit_test.location.Intersects(overflow_rect))
+    return false;
+
   if (HitTestChildren(hit_test, PhysicalFragment(),
                       cursor.CursorForDescendants(), physical_offset))
     return true;
diff --git a/third_party/blink/renderer/core/style/computed_style_test.cc b/third_party/blink/renderer/core/style/computed_style_test.cc
index 342be2e8..c8b3c36de 100644
--- a/third_party/blink/renderer/core/style/computed_style_test.cc
+++ b/third_party/blink/renderer/core/style/computed_style_test.cc
@@ -659,7 +659,6 @@
 }
 
 TEST(ComputedStyleTest, ApplyColorSchemeLightOnDark) {
-  ScopedCSSColorSchemeForTest scoped_property_enabled(true);
   ScopedCSSColorSchemeUARenderingForTest scoped_ua_enabled(true);
 
   std::unique_ptr<DummyPageHolder> dummy_page_holder_ =
@@ -694,7 +693,6 @@
 TEST(ComputedStyleTest, ApplyInternalLightDarkColor) {
   using css_test_helpers::ParseDeclarationBlock;
 
-  ScopedCSSColorSchemeForTest scoped_property_enabled(true);
   ScopedCSSColorSchemeUARenderingForTest scoped_ua_enabled(true);
 
   std::unique_ptr<DummyPageHolder> dummy_page_holder_ =
@@ -738,7 +736,6 @@
 TEST(ComputedStyleTest, ApplyInternalLightDarkBackgroundImage) {
   using css_test_helpers::ParseDeclarationBlock;
 
-  ScopedCSSColorSchemeForTest scoped_property_enabled(true);
   ScopedCSSColorSchemeUARenderingForTest scoped_ua_enabled(true);
 
   std::unique_ptr<DummyPageHolder> dummy_page_holder_ =
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 2c41f1c..d06e145 100644
--- a/third_party/blink/renderer/modules/peerconnection/peer_connection_tracker.cc
+++ b/third_party/blink/renderer/modules/peerconnection/peer_connection_tracker.cc
@@ -618,7 +618,10 @@
       for (const auto* member : stats.Members()) {
         if (!member->is_defined())
           continue;
-        name_value_pairs->AppendString(member->name());
+        // Non-standardized / provisional stats which are not exposed
+        // to Javascript are postfixed with an asterisk.
+        std::string postfix = member->is_standardized() ? "" : "*";
+        name_value_pairs->AppendString(member->name() + postfix);
         name_value_pairs->Append(MemberToValue(*member));
       }
       stats_subdictionary->Set("values", std::move(name_value_pairs));
diff --git a/third_party/blink/renderer/modules/sanitizer_api/sanitizer.cc b/third_party/blink/renderer/modules/sanitizer_api/sanitizer.cc
index af6bde64..7bbc247 100644
--- a/third_party/blink/renderer/modules/sanitizer_api/sanitizer.cc
+++ b/third_party/blink/renderer/modules/sanitizer_api/sanitizer.cc
@@ -28,12 +28,24 @@
 Sanitizer::Sanitizer(const SanitizerConfig* config)
     : config_(const_cast<SanitizerConfig*>(config)) {
   // Format dropElements to uppercases.
+  Vector<String> drop_elements = default_drop_elements_;
   if (config->hasDropElements()) {
-    Vector<String> l;
     for (const String& s : config->dropElements()) {
-      l.push_back(s.UpperASCII());
+      if (!drop_elements.Contains(s.UpperASCII())) {
+        drop_elements.push_back(s.UpperASCII());
+      }
     }
-    config_->setDropElements(l);
+  }
+  config_->setDropElements(drop_elements);
+
+  // Format allowElements to uppercases.
+  if (config->hasAllowElements()) {
+    Vector<String> l;
+    for (const String& s : config->allowElements()) {
+      if (!config_->dropElements().Contains(s))
+        l.push_back(s.UpperASCII());
+    }
+    config_->setAllowElements(l);
   }
 
   // Format dropAttributes to lowercases.
@@ -70,37 +82,56 @@
   DCHECK(document->QuerySelector("body"));
   fragment->ParseHTML(input, document->QuerySelector("body"));
 
-  // Remove all the elements in the dropElements list.
-  if (config_->hasDropElements() || config_->hasDropAttributes()) {
-    Node* node = fragment->firstChild();
+  Node* node = fragment->firstChild();
 
-    while (node) {
-      // Skip non-Element nodes.
-      if (node->getNodeType() != Node::NodeType::kElementNode) {
-        node = NodeTraversal::Next(*node, fragment);
-        continue;
-      }
+  while (node) {
+    // Skip non-Element nodes.
+    if (node->getNodeType() != Node::NodeType::kElementNode) {
+      node = NodeTraversal::Next(*node, fragment);
+      continue;
+    }
 
-      // TODO(crbug.com/1126936): Review the sanitising algorithm for non-HTMLs.
-      String node_name = node->nodeName();
-      // If the current element is dropped, remove current element entirely and
-      // proceed to its next sibling.
-      if (config_->hasDropElements() &&
-          config_->dropElements().Contains(node_name.UpperASCII())) {
-        Node* tmp = node;
-        node = NodeTraversal::NextSkippingChildren(*node, fragment);
-        tmp->remove();
-      } else {
-        // Otherwise, remove any attributes to be dropped from the current
-        // element, and proceed to the next node (preorder, depth-first
-        // traversal).
-        if (config_->hasDropAttributes()) {
-          for (auto attr : drop_attributes_) {
-            To<Element>(node)->removeAttribute(attr);
-          }
+    // TODO(crbug.com/1126936): Review the sanitising algorithm for non-HTMLs.
+    String node_name = node->nodeName().UpperASCII();
+    // If the current element is dropped, remove current element entirely and
+    // proceed to its next sibling.
+    if (config_->dropElements().Contains(node_name)) {
+      Node* tmp = node;
+      node = NodeTraversal::NextSkippingChildren(*node, fragment);
+      tmp->remove();
+    } else if (config_->hasAllowElements() &&
+               !config_->allowElements().Contains(node_name)) {
+      // If the current element is blocked, append its children after current
+      // node to parent node, remove current element and proceed to the next
+      // node.
+      Node* parent = node->parentNode();
+      Node* next_sibling = node->nextSibling();
+      while (node->hasChildren()) {
+        Node* n = node->firstChild();
+        if (next_sibling) {
+          parent->insertBefore(n, next_sibling, exception_state);
+        } else {
+          parent->appendChild(n, exception_state);
         }
-        node = NodeTraversal::Next(*node, fragment);
+        // TODO(lyf): review and make a proper decision for exceptions may
+        // happened here.
+        if (exception_state.HadException()) {
+          return nullptr;
+        }
       }
+      Node* tmp = node;
+      node = NodeTraversal::Next(*node, fragment);
+      tmp->remove();
+    } else {
+      // Otherwise, remove any attributes to be dropped from the current
+      // element, and proceed to the next node (preorder, depth-first
+      // traversal).
+      if (config_->hasDropAttributes()) {
+        for (auto attr : drop_attributes_) {
+          To<Element>(node)->removeAttribute(attr);
+        }
+      }
+      node = NodeTraversal::Next(*node, fragment);
     }
   }
 
diff --git a/third_party/blink/renderer/modules/sanitizer_api/sanitizer.h b/third_party/blink/renderer/modules/sanitizer_api/sanitizer.h
index ae8704e..1c732e66 100644
--- a/third_party/blink/renderer/modules/sanitizer_api/sanitizer.h
+++ b/third_party/blink/renderer/modules/sanitizer_api/sanitizer.h
@@ -36,6 +36,18 @@
   // Vector<QualifiedName> for drop_elements.
   Member<SanitizerConfig> config_ = {};
   Vector<AtomicString> drop_attributes_ = {};
+  const Vector<String> default_drop_elements_ = {"SCRIPT",    "ANNOTATION-XML",
+                                                 "AUDIO",     "COLGROUP",
+                                                 "DESC",      "FOREIGNOBJECT",
+                                                 "HEAD",      "IFRAME",
+                                                 "MATH",      "MI",
+                                                 "MN",        "MO",
+                                                 "MS",        "MTEXT",
+                                                 "NOEMBED",   "NOFRAMES",
+                                                 "PLAINTEXT", "STYLE",
+                                                 "SVG",       "TEMPLATE",
+                                                 "THEAD",     "TITLE",
+                                                 "VIDEO",     "XMP"};
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/sanitizer_api/sanitizer_config.idl b/third_party/blink/renderer/modules/sanitizer_api/sanitizer_config.idl
index 3eaebc4..0b59849 100644
--- a/third_party/blink/renderer/modules/sanitizer_api/sanitizer_config.idl
+++ b/third_party/blink/renderer/modules/sanitizer_api/sanitizer_config.idl
@@ -5,6 +5,7 @@
 // https://wicg.github.io/sanitizer-api/#sanitizer-api
 
 dictionary SanitizerConfig {
+  sequence<DOMString> allowElements;
   sequence<DOMString> dropElements;
   sequence<DOMString> dropAttributes;
 };
diff --git a/third_party/blink/renderer/modules/webdatabase/sqlite/sqlite_database.cc b/third_party/blink/renderer/modules/webdatabase/sqlite/sqlite_database.cc
index dedda1b..b35b1664 100644
--- a/third_party/blink/renderer/modules/webdatabase/sqlite/sqlite_database.cc
+++ b/third_party/blink/renderer/modules/webdatabase/sqlite/sqlite_database.cc
@@ -133,6 +133,9 @@
 
   opening_thread_ = CurrentThread();
 
+  if (!SQLiteStatement(*this, "PRAGMA locking_mode = NORMAL;").ExecuteCommand())
+    DLOG(ERROR) << "SQLite database could not set locking_mode to normal";
+
   if (!SQLiteStatement(*this, "PRAGMA temp_store = MEMORY;").ExecuteCommand())
     DLOG(ERROR) << "SQLite database could not set temp_store to memory";
 
diff --git a/third_party/blink/renderer/platform/exported/web_http_body.cc b/third_party/blink/renderer/platform/exported/web_http_body.cc
index d3ccce3..3971396 100644
--- a/third_party/blink/renderer/platform/exported/web_http_body.cc
+++ b/third_party/blink/renderer/platform/exported/web_http_body.cc
@@ -40,7 +40,6 @@
 #include "third_party/blink/renderer/platform/network/form_data_encoder.h"
 #include "third_party/blink/renderer/platform/network/wrapped_data_pipe_getter.h"
 #include "third_party/blink/renderer/platform/wtf/shared_buffer.h"
-
 namespace blink {
 
 void WebHTTPBody::Initialize() {
@@ -76,25 +75,25 @@
 
   switch (element.type_) {
     case FormDataElement::kData:
-      result.type = Element::kTypeData;
+      result.type = HTTPBodyElementType::kTypeData;
       result.data.Assign(element.data_.data(), element.data_.size());
       break;
     case FormDataElement::kEncodedFile:
-      result.type = Element::kTypeFile;
+      result.type = HTTPBodyElementType::kTypeFile;
       result.file_path = element.filename_;
       result.file_start = element.file_start_;
       result.file_length = element.file_length_;
       result.modification_time = element.expected_file_modification_time_;
       break;
     case FormDataElement::kEncodedBlob:
-      result.type = Element::kTypeBlob;
+      result.type = HTTPBodyElementType::kTypeBlob;
       result.blob_length = std::numeric_limits<uint64_t>::max();
       result.optional_blob =
           element.optional_blob_data_handle_->CloneBlobRemote();
       result.blob_length = element.optional_blob_data_handle_->size();
       break;
     case FormDataElement::kDataPipe:
-      result.type = Element::kTypeDataPipe;
+      result.type = HTTPBodyElementType::kTypeDataPipe;
       mojo::PendingRemote<network::mojom::blink::DataPipeGetter>
           data_pipe_getter;
       element.data_pipe_getter_->GetDataPipeGetter()->Clone(
diff --git a/third_party/blink/renderer/platform/geometry/float_point.cc b/third_party/blink/renderer/platform/geometry/float_point.cc
index f91fbfec..19811cb 100644
--- a/third_party/blink/renderer/platform/geometry/float_point.cc
+++ b/third_party/blink/renderer/platform/geometry/float_point.cc
@@ -31,6 +31,7 @@
 #include <algorithm>
 #include <limits>
 
+#include "build/build_config.h"
 #include "third_party/blink/renderer/platform/geometry/layout_point.h"
 #include "third_party/blink/renderer/platform/geometry/layout_size.h"
 #include "third_party/blink/renderer/platform/wtf/math_extras.h"
@@ -41,7 +42,14 @@
 namespace blink {
 
 float FloatPoint::SlopeAngleRadians() const {
+#if defined(OS_MAC)
+  // atan2f(...) returns less accurate results on Mac.
+  // 3.1415925 vs. 3.14159274 for atan2f(0, -50) as an example.
+  return static_cast<float>(
+      atan2(static_cast<double>(y_), static_cast<double>(x_)));
+#else
   return atan2f(y_, x_);
+#endif
 }
 
 float FloatPoint::length() const {
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5
index 643bfc985..3c192ab 100644
--- a/third_party/blink/renderer/platform/runtime_enabled_features.json5
+++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -422,12 +422,6 @@
       status: "test",
     },
     {
-      // Support for the CSS color-scheme property from the css-color-adjust spec.
-      // https://drafts.csswg.org/css-color-adjust/#color-scheme-prop
-      name: "CSSColorScheme",
-      status: "stable",
-    },
-    {
       // When the color-scheme is supported via the CSS color-scheme property
       // (CSSColorScheme) or the meta tag (MetaColorScheme), the only UA
       // rendering change is for the canvas background and the :root element
@@ -713,7 +707,7 @@
     {
       // http://crbug.com/707656 content editable in LayoutNG.
       name: "EditingNG",
-      status: "test",
+      status: "experimental",
     },
     {
       name: "EncryptedMediaEncryptionSchemeQuery",
@@ -1183,13 +1177,6 @@
       name: "MediaSourceStable",
       status: "stable",
     },
-    // Support for META tag for setting color-scheme used for opting into dark
-    // UA theming and opting out of forced dark mode.
-    // https://drafts.csswg.org/css-color-adjust/#color-scheme-meta
-    {
-      name: "MetaColorScheme",
-      status: "stable",
-    },
     // This is enabled by default on Windows only. The only part that's
     // "experimental" is the support on other platforms.
     {
diff --git a/third_party/blink/tools/blinkpy/common/system/executive.py b/third_party/blink/tools/blinkpy/common/system/executive.py
index b7a5424..316c6cc1 100644
--- a/third_party/blink/tools/blinkpy/common/system/executive.py
+++ b/third_party/blink/tools/blinkpy/common/system/executive.py
@@ -126,7 +126,10 @@
                 NtSuspendProcess(process_handle)
                 CloseHandle(process_handle)
 
-            command = ['taskkill.exe', '/f', '/t', '/pid', pid]
+            command = ['taskkill.exe', '/f']
+            if kill_tree:
+                command.append('/t')
+            command += ['/pid', pid]
             # taskkill will exit 128 if the process is not found. We should log.
             self.run_command(command, error_handler=self.log_error)
             return
diff --git a/third_party/blink/web_tests/SlowTests b/third_party/blink/web_tests/SlowTests
index bb3f075..03719a8 100644
--- a/third_party/blink/web_tests/SlowTests
+++ b/third_party/blink/web_tests/SlowTests
@@ -542,10 +542,3 @@
 crbug.com/1133836 external/wpt/scroll-to-text-fragment/redirects.html [ Slow ]
 
 crbug.com/1134580 virtual/eye-dropper/color-picker-show-eye-dropper.html [ Slow ]
-
-crbug.com/919361 [ Mac ] http/tests/fetch/serviceworker/fetch_upload-base-https-other-https.html [ Slow ]
-crbug.com/919361 [ Mac ] http/tests/fetch/serviceworker/fetch_upload.html [ Slow ]
-crbug.com/919361 [ Mac ] http/tests/fetch/window/fetch_upload-base-https-other-https.html [ Slow ]
-crbug.com/919361 [ Mac ] http/tests/fetch/window/fetch_upload.html [ Slow ]
-crbug.com/919361 [ Mac ] http/tests/fetch/workers/fetch_upload-base-https-other-https.html [ Slow ]
-crbug.com/919361 [ Mac ] http/tests/fetch/workers/fetch_upload.html [ Slow ]
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index 7576c8a..45852ed 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -1038,7 +1038,6 @@
 crbug.com/829028 virtual/layout_ng_block_frag/fast/multicol/caret-range-outside-columns.html [ Failure ]
 crbug.com/829028 virtual/layout_ng_block_frag/fast/multicol/caret-range-outside-columns-rtl.html [ Failure ]
 crbug.com/829028 virtual/layout_ng_block_frag/fast/multicol/client-rect-nested.html [ Failure ]
-crbug.com/829028 virtual/layout_ng_block_frag/fast/multicol/client-rects-crossing-boundaries-nested.html [ Failure ]
 crbug.com/829028 virtual/layout_ng_block_frag/fast/multicol/client-rects.html [ Crash Failure ]
 crbug.com/829028 virtual/layout_ng_block_frag/fast/multicol/client-rects-rtl.html [ Crash Failure ]
 crbug.com/1058792 virtual/layout_ng_block_frag/fast/multicol/composited-layer-multiple-fragments-translated.html [ Failure Crash ]
@@ -1054,7 +1053,6 @@
 crbug.com/1079031 virtual/layout_ng_block_frag/fast/multicol/dynamic/relpos-becomes-static-has-abspos.html [ Failure ]
 crbug.com/1079031 virtual/layout_ng_block_frag/fast/multicol/dynamic/remove-column-content-next-to-abspos-between-spanners.html [ Failure ]
 crbug.com/1079031 virtual/layout_ng_block_frag/fast/multicol/dynamic/static-becomes-relpos-has-abspos.html [ Failure ]
-crbug.com/829028 virtual/layout_ng_block_frag/fast/multicol/event-offset-in-nested.html [ Failure ]
 crbug.com/1061423 virtual/layout_ng_block_frag/fast/multicol/flipped-blocks-hit-test.html [ Failure ]
 crbug.com/829028 virtual/layout_ng_block_frag/fast/multicol/float-margin-at-row-boundary.html [ Failure ]
 crbug.com/829028 virtual/layout_ng_block_frag/fast/multicol/float-margin-at-row-boundary-fixed-multicol-height.html [ Failure ]
@@ -1107,27 +1105,20 @@
 crbug.com/829028 virtual/layout_ng_block_frag/fast/multicol/tall-content-in-inner-with-fixed-height.html [ Failure ]
 crbug.com/829028 virtual/layout_ng_block_frag/fast/multicol/tall-float1.html [ Failure ]
 crbug.com/1079031 virtual/layout_ng_block_frag/fast/multicol/tall-line-in-short-block.html [ Failure ]
-crbug.com/829028 virtual/layout_ng_block_frag/fast/multicol/three-inner-rows.html [ Failure ]
 crbug.com/1079031 virtual/layout_ng_block_frag/fast/multicol/transform-with-fixedpos.html [ Failure ]
 crbug.com/829028 virtual/layout_ng_block_frag/fast/multicol/vertical-lr/caret-range-anonymous-block.html [ Failure ]
 crbug.com/829028 virtual/layout_ng_block_frag/fast/multicol/vertical-lr/caret-range-anonymous-block-rtl.html [ Failure Crash ]
 crbug.com/829028 virtual/layout_ng_block_frag/fast/multicol/vertical-lr/caret-range-outside-columns.html [ Timeout Failure ]
 crbug.com/829028 virtual/layout_ng_block_frag/fast/multicol/vertical-lr/caret-range-outside-columns-rtl.html [ Failure ]
-crbug.com/829028 virtual/layout_ng_block_frag/fast/multicol/vertical-lr/client-rects-crossing-boundaries-nested.html [ Failure ]
 crbug.com/1058792 virtual/layout_ng_block_frag/fast/multicol/vertical-lr/composited-relpos-overlapping-will-change.html [ Failure ]
 crbug.com/829028 [ Mac ] virtual/layout_ng_block_frag/fast/multicol/vertical-lr/nested-columns.html [ Failure ]
-crbug.com/829028 virtual/layout_ng_block_frag/fast/multicol/vertical-lr/offset-top-and-left-at-boundaries-nested.html [ Failure ]
-crbug.com/829028 virtual/layout_ng_block_frag/fast/multicol/vertical-lr/offset-top-and-left-nested.html [ Failure ]
 crbug.com/829028 virtual/layout_ng_block_frag/fast/multicol/vertical-rl/caret-range-anonymous-block.html [ Failure ]
 crbug.com/829028 virtual/layout_ng_block_frag/fast/multicol/vertical-rl/caret-range-anonymous-block-rtl.html [ Failure ]
 crbug.com/829028 virtual/layout_ng_block_frag/fast/multicol/vertical-rl/caret-range-outside-columns.html [ Crash Failure ]
 crbug.com/829028 virtual/layout_ng_block_frag/fast/multicol/vertical-rl/caret-range-outside-columns-rtl.html [ Crash Failure ]
-crbug.com/829028 virtual/layout_ng_block_frag/fast/multicol/vertical-rl/client-rects-crossing-boundaries-nested.html [ Failure ]
 crbug.com/1058792 virtual/layout_ng_block_frag/fast/multicol/vertical-rl/composited-relpos-overlapping-will-change.html [ Failure ]
 crbug.com/1061423 virtual/layout_ng_block_frag/fast/multicol/vertical-rl/float-truncation.html [ Failure ]
 crbug.com/829028 virtual/layout_ng_block_frag/fast/multicol/vertical-rl/nested-columns.html [ Crash Failure ]
-crbug.com/829028 virtual/layout_ng_block_frag/fast/multicol/vertical-rl/offset-top-and-left-at-boundaries-nested.html [ Failure ]
-crbug.com/829028 virtual/layout_ng_block_frag/fast/multicol/vertical-rl/offset-top-and-left-nested.html [ Failure ]
 crbug.com/829028 virtual/layout_ng_block_frag/fast/multicol/widows-and-orphans.html [ Failure ]
 crbug.com/829028 virtual/layout_ng_block_frag/fast/multicol/widows.html [ Failure ]
 crbug.com/1079031 virtual/layout_ng_block_frag/fragmentation/abspos-after-forced-break.html [ Failure ]
@@ -2617,6 +2608,40 @@
 crbug.com/958381 [ Mac ] external/wpt/css/CSS2/tables/table-anonymous-objects-206.xht [ Failure ]
 
 # ====== New tests from wpt-importer added here ======
+crbug.com/626703 external/wpt/css/css-color/predefined-008.html [ Failure ]
+crbug.com/626703 virtual/system-color-compute/external/wpt/css/css-color/predefined-010.html [ Failure ]
+crbug.com/626703 external/wpt/css/css-color/predefined-015.html [ Failure ]
+crbug.com/626703 external/wpt/css/css-color/predefined-005.html [ Failure ]
+crbug.com/626703 virtual/system-color-compute/external/wpt/css/css-color/predefined-014.html [ Failure ]
+crbug.com/626703 virtual/system-color-compute/external/wpt/css/css-color/predefined-002.html [ Failure ]
+crbug.com/626703 virtual/system-color-compute/external/wpt/css/css-color/predefined-016.html [ Failure ]
+crbug.com/626703 external/wpt/css/css-color/predefined-001.html [ Failure ]
+crbug.com/626703 external/wpt/css/css-color/predefined-011.html [ Failure ]
+crbug.com/626703 external/wpt/css/css-color/predefined-013.html [ Failure ]
+crbug.com/626703 virtual/system-color-compute/external/wpt/css/css-color/predefined-012.html [ Failure ]
+crbug.com/626703 virtual/system-color-compute/external/wpt/css/css-color/predefined-007.html [ Failure ]
+crbug.com/626703 external/wpt/css/css-color/predefined-007.html [ Failure ]
+crbug.com/626703 virtual/system-color-compute/external/wpt/css/css-color/predefined-011.html [ Failure ]
+crbug.com/626703 external/wpt/css/css-color/predefined-014.html [ Failure ]
+crbug.com/626703 virtual/system-color-compute/external/wpt/css/css-color/predefined-004.html [ Failure ]
+crbug.com/626703 virtual/system-color-compute/external/wpt/css/css-color/predefined-006.html [ Failure ]
+crbug.com/626703 external/wpt/css/css-color/predefined-002.html [ Failure ]
+crbug.com/626703 external/wpt/css/css-color/predefined-012.html [ Failure ]
+crbug.com/626703 external/wpt/css/css-color/predefined-017.html [ Failure ]
+crbug.com/626703 virtual/system-color-compute/external/wpt/css/css-color/predefined-009.html [ Failure ]
+crbug.com/626703 virtual/system-color-compute/external/wpt/css/css-color/predefined-013.html [ Failure ]
+crbug.com/626703 external/wpt/css/css-color/predefined-016.html [ Failure ]
+crbug.com/626703 virtual/system-color-compute/external/wpt/css/css-color/predefined-001.html [ Failure ]
+crbug.com/626703 external/wpt/css/css-color/predefined-006.html [ Failure ]
+crbug.com/626703 external/wpt/css/css-color/predefined-004.html [ Failure ]
+crbug.com/626703 virtual/system-color-compute/external/wpt/css/css-color/predefined-008.html [ Failure ]
+crbug.com/626703 virtual/system-color-compute/external/wpt/css/css-color/predefined-017.html [ Failure ]
+crbug.com/626703 virtual/system-color-compute/external/wpt/css/css-color/predefined-005.html [ Failure ]
+crbug.com/626703 virtual/system-color-compute/external/wpt/css/css-color/predefined-015.html [ Failure ]
+crbug.com/626703 virtual/system-color-compute/external/wpt/css/css-color/predefined-003.html [ Failure ]
+crbug.com/626703 external/wpt/css/css-color/predefined-009.html [ Failure ]
+crbug.com/626703 external/wpt/css/css-color/predefined-010.html [ Failure ]
+crbug.com/626703 external/wpt/css/css-color/predefined-003.html [ Failure ]
 crbug.com/626703 [ Mac11.0 ] external/wpt/html/semantics/embedded-content/media-elements/preserves-pitch.html [ Timeout ]
 crbug.com/626703 external/wpt/input-events/input-events-get-target-ranges-during-and-after-dispatch.tentative.html [ Timeout ]
 crbug.com/626703 external/wpt/css/css-backgrounds/border-image-slice-007.htm [ Failure ]
@@ -5868,8 +5893,7 @@
 
 # Enable scroll-snap tests on impl thread
 # These are currently failing on Mac which needs more investigation, snap-scrolls-visual-viewport seems flaky
-crbug.com/878878 [ Mac ] virtual/threaded/fast/scroll-snap/snaps-after-keyboard-scrolling.html [ Pass Timeout ]
-crbug.com/878878 [ Win ] virtual/threaded/fast/scroll-snap/snaps-after-keyboard-scrolling.html [ Pass Timeout ]
+crbug.com/878878 [ Mac ] virtual/threaded/fast/scroll-snap/snaps-after-keyboard-scrolling.html [ Pass Timeout Failure ]
 crbug.com/878878 [ Mac ] virtual/threaded/fast/scroll-snap/snaps-after-scrollbar-scrolling.html [ Pass Timeout Failure ]
 crbug.com/878878 [ Win ] virtual/threaded/fast/scroll-snap/snaps-after-scrollbar-scrolling.html [ Pass Timeout Failure ]
 
@@ -6599,6 +6623,9 @@
 
 # TODO(michaelludwig) - Remove after Skia roll and rebaseline
 crbug.com/1135225 fast/sub-pixel/transformed-iframe-copy-on-scroll.html [ Pass Failure ]
+# TODO(michaelludwig) - Remove after Skia roll and rebaseline
+crbug.com/1136863 svg/W3C-SVG-1.1/filters-morph-01-f.svg [ Pass Failure ]
+crbug.com/1136863 svg/batik/text/smallFonts.svg [ Pass Failure ]
 
 # Sheriff 2020-09-29
 crbug.com/1133342 external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/reporting-observer.html [ Pass Failure Timeout ]
@@ -6621,5 +6648,5 @@
 crbug.com/1134237 virtual/origin-trials-runtimeflags-disabled/http/tests/origin_trials/webexposed/beforematch-origin-trial-interfaces.html [ Failure ]
 
 # Sheriff 2020-10-09
-crbug.com/1136687 [ Linux ] external/wpt/pointerevents/pointerlock/pointerevent_pointerlock_supercedes_capture.html [ Pass Failure ]
+crbug.com/1136687 external/wpt/pointerevents/pointerlock/pointerevent_pointerlock_supercedes_capture.html [ Pass Failure ]
 crbug.com/1136726 [ Linux ] virtual/gpu-rasterization/images/imagemap-focus-ring-outline-color-not-inherited-from-map.html [ Failure ]
diff --git a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
index e1e9b62..78ae39a 100644
--- a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
+++ b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
@@ -53062,6 +53062,227 @@
        {}
       ]
      ],
+     "predefined-001.html": [
+      "65cf808556b03e305431e4bf292b02a4a0295be3",
+      [
+       null,
+       [
+        [
+         "/css/css-color/greensquare-ref.html",
+         "=="
+        ]
+       ],
+       {}
+      ]
+     ],
+     "predefined-002.html": [
+      "4e125f96b571e932843065411a456620223c883e",
+      [
+       null,
+       [
+        [
+         "/css/css-color/greensquare-ref.html",
+         "=="
+        ]
+       ],
+       {}
+      ]
+     ],
+     "predefined-003.html": [
+      "1d014cb0483553d273c702985531c381bf1b6b01",
+      [
+       null,
+       [
+        [
+         "/css/css-color/greensquare-ref.html",
+         "=="
+        ]
+       ],
+       {}
+      ]
+     ],
+     "predefined-004.html": [
+      "f1bf6ddea30fd7db0c92f6e644ec53b76c8843b7",
+      [
+       null,
+       [
+        [
+         "/css/css-color/greensquare-ref.html",
+         "=="
+        ]
+       ],
+       {}
+      ]
+     ],
+     "predefined-005.html": [
+      "780b929d8565f33241a701ddb83a16687100c6b6",
+      [
+       null,
+       [
+        [
+         "/css/css-color/greensquare-ref.html",
+         "=="
+        ]
+       ],
+       {}
+      ]
+     ],
+     "predefined-006.html": [
+      "f53fb79a021358e9856b379c5c189201e20bfbd2",
+      [
+       null,
+       [
+        [
+         "/css/css-color/greensquare-ref.html",
+         "=="
+        ]
+       ],
+       {}
+      ]
+     ],
+     "predefined-007.html": [
+      "d67979318270449c331da4f76a73b9184e8c1372",
+      [
+       null,
+       [
+        [
+         "/css/css-color/greensquare-ref.html",
+         "=="
+        ]
+       ],
+       {}
+      ]
+     ],
+     "predefined-008.html": [
+      "57bbe3a51e790258bd968e54ff15975c5d8a66a3",
+      [
+       null,
+       [
+        [
+         "/css/css-color/greensquare-ref.html",
+         "=="
+        ]
+       ],
+       {}
+      ]
+     ],
+     "predefined-009.html": [
+      "e29305ec981eaf3cc050e761149823dd8edfe812",
+      [
+       null,
+       [
+        [
+         "/css/css-color/greensquare-ref.html",
+         "=="
+        ]
+       ],
+       {}
+      ]
+     ],
+     "predefined-010.html": [
+      "a0eb9952e1e912f7a6878364f32ace1672d54ad2",
+      [
+       null,
+       [
+        [
+         "/css/css-color/greensquare-ref.html",
+         "=="
+        ]
+       ],
+       {}
+      ]
+     ],
+     "predefined-011.html": [
+      "37a16f1b9f232a8925bc3c161d98780a0c0e0e0f",
+      [
+       null,
+       [
+        [
+         "/css/css-color/greensquare-ref.html",
+         "=="
+        ]
+       ],
+       {}
+      ]
+     ],
+     "predefined-012.html": [
+      "a4ead24196971458cb5809a6aeb9849d1b04bb04",
+      [
+       null,
+       [
+        [
+         "/css/css-color/greensquare-ref.html",
+         "=="
+        ]
+       ],
+       {}
+      ]
+     ],
+     "predefined-013.html": [
+      "ed4a48f90b0882fa7426564d6d5a81c0dd31b355",
+      [
+       null,
+       [
+        [
+         "/css/css-color/greensquare-ref.html",
+         "=="
+        ]
+       ],
+       {}
+      ]
+     ],
+     "predefined-014.html": [
+      "51f72650bd71e0531ac779cfb07a4368ee412cc1",
+      [
+       null,
+       [
+        [
+         "/css/css-color/greensquare-ref.html",
+         "=="
+        ]
+       ],
+       {}
+      ]
+     ],
+     "predefined-015.html": [
+      "27641397fa49f353b921a831a8a31be7eaaa8ae2",
+      [
+       null,
+       [
+        [
+         "/css/css-color/greensquare-ref.html",
+         "=="
+        ]
+       ],
+       {}
+      ]
+     ],
+     "predefined-016.html": [
+      "7b7c653010c9fe691dc357bfcd7b74bfb0a0c98b",
+      [
+       null,
+       [
+        [
+         "/css/css-color/greensquare-ref.html",
+         "=="
+        ]
+       ],
+       {}
+      ]
+     ],
+     "predefined-017.html": [
+      "ee1ebb6711f347807d8f6372032f3cdcf5cd11ef",
+      [
+       null,
+       [
+        [
+         "/css/css-color/greensquare-ref.html",
+         "=="
+        ]
+       ],
+       {}
+      ]
+     ],
      "rgb-001.html": [
       "30603faa9c5b70956d97139d7bb86cc9cb2fd9e3",
       [
@@ -226882,7 +227103,7 @@
          []
         ],
         "non-object.tentative.any.serviceworker-expected.txt": [
-         "36e95c63965d55fa21929e2d5d3a7fe09c46876c",
+         "25ca5d904d39e41d639846334c840117510cc58f",
          []
         ],
         "non-object.tentative.any.sharedworker-expected.txt": [
@@ -229986,7 +230207,7 @@
      []
     ],
     "badging.idl": [
-     "0b011a92f003a46df4219e528696003b40559fa3",
+     "28578621c9a4b1586798403a9c4ebc60cb5310ef",
      []
     ],
     "battery-status.idl": [
@@ -230871,7 +231092,7 @@
     ]
    },
    "lint.ignore": [
-    "8431077e6a677d6f0eeb2c05ab024fd073a5f490",
+    "5bcb811df36051225f60efa903f7f1e4cd7eda29",
     []
    ],
    "loading": {
@@ -238463,7 +238684,7 @@
       []
      ],
      "import-module-scripts.https-expected.txt": [
-      "c45166005be52bde9ecde3129e595cac691744a8",
+      "6bac8b097c273a972583a8d4c453f22915975bb7",
       []
      ],
      "import-scripts-redirect.https-expected.txt": [
@@ -250339,7 +250560,7 @@
       ]
      },
      "generate-test-wbns.sh": [
-      "247b9c781835357a12382ef7d7774c15b6555bc6",
+      "64a54bca3a408c5af751a59daf8664db62ea7d28",
       []
      ],
      "location": {
@@ -250353,16 +250574,38 @@
       ]
      },
      "path-restriction": {
-      "resource1.js": [
-       "7bd437364a24b6e94493c2acca939991b15cd41c",
+      "other": {
+       "resource.js": [
+        "a4967d2285ae3a87b6da6e41f786cf65527184b6",
+        []
+       ]
+      },
+      "resource.js": [
+       "a4967d2285ae3a87b6da6e41f786cf65527184b6",
        []
-      ]
-     },
-     "path-restriction1": {
-      "resource1.js": [
-       "e2da7e63c008ef405ee3a43595a940216a59d320",
+      ],
+      "wbn": {
+       "resource.js": [
+        "a4967d2285ae3a87b6da6e41f786cf65527184b6",
+        []
+       ],
+       "sub": {
+        "resource.js": [
+         "a4967d2285ae3a87b6da6e41f786cf65527184b6",
+         []
+        ]
+       }
+      },
+      "wbn-resource.js": [
+       "a4967d2285ae3a87b6da6e41f786cf65527184b6",
        []
-      ]
+      ],
+      "wbn1": {
+       "resource.js": [
+        "a4967d2285ae3a87b6da6e41f786cf65527184b6",
+        []
+       ]
+      }
      },
      "subresource": {
       "root.js": [
@@ -250422,7 +250665,7 @@
        []
       ],
       "path-restriction.wbn": [
-       "7255de59c107acd2a4f9c377f0b6bafdb878b131",
+       "e861469e122afd141bcec8d394a0d4504898208c",
        []
       ],
       "subresource.wbn": [
@@ -273345,7 +273588,7 @@
      ]
     ],
     "async-platform-specific-write-read.tentative.https.html": [
-     "685b5a58a809f43e7c1379055743d5536258681c",
+     "f8af468bff7885eeb6fca5493e85bc68b42bf615",
      [
       null,
       {
@@ -273354,7 +273597,7 @@
      ]
     ],
     "async-raw-write-read.tentative.https.html": [
-     "e6882b344f86de62af5c31f17719a4de6f94b2bb",
+     "480593dcd715eacefbdaa8f7f4da305992a80c65",
      [
       null,
       {
@@ -413924,7 +414167,14 @@
       ]
      ],
      "subresource-loading-from-web-bundle.tentative.html": [
-      "1d59e11e568cb8bdf0d7d58e7d22704ea4c1af14",
+      "c2de0eb0994f54c65a342b501aa3e9107949faf7",
+      [
+       null,
+       {}
+      ]
+     ],
+     "subresource-loading-path-restriction.tentative.html": [
+      "706bfb97b1142833380024c3f969b1b3b2756ec1",
       [
        null,
        {}
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color/predefined-001.html b/third_party/blink/web_tests/external/wpt/css/css-color/predefined-001.html
new file mode 100644
index 0000000..65cf8085
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-color/predefined-001.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Color 4: predefined colorspaces, srgb, decimal values</title>
+<link rel="author" title="Chris Lilley" href="mailto:chris@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-color-4/#predefined">
+<link rel="match" href="greensquare-ref.html">
+<meta name="assert" content="Color function with explicit srgb value as decimal matches sRGB #009900">
+<style>
+    .test { background-color: red; width: 12em; height: 6em; margin-top:0}
+    .ref { background-color: #009900; width: 12em; height: 6em; margin-bottom: 0}
+    .test {background-color: color(srgb 0 0.6 0)}
+</style>
+<body>
+    <p>Test passes if you see a green square, and no red.</p>
+    <p class="ref"> </p>
+    <p class="test"> </p>
+</body>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color/predefined-002.html b/third_party/blink/web_tests/external/wpt/css/css-color/predefined-002.html
new file mode 100644
index 0000000..4e125f9
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-color/predefined-002.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Color 4: predefined colorspaces, srgb, percent values</title>
+<link rel="author" title="Chris Lilley" href="mailto:chris@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-color-4/#predefined">
+<link rel="match" href="greensquare-ref.html">
+<meta name="assert" content="Color function with explicit srgb value as percent matches sRGB #009900">
+<style>
+    .test { background-color: red; width: 12em; height: 6em; margin-top:0}
+    .ref { background-color: #009900; width: 12em; height: 6em; margin-bottom: 0}
+    .test {background-color: color(srgb 0% 60% 0%)}
+</style>
+<body>
+    <p>Test passes if you see a green square, and no red.</p>
+    <p class="ref"> </p>
+    <p class="test"> </p>
+</body>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color/predefined-003.html b/third_party/blink/web_tests/external/wpt/css/css-color/predefined-003.html
new file mode 100644
index 0000000..1d014cb0
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-color/predefined-003.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Color 4: predefined colorspaces, default srgb, decimal values</title>
+<link rel="author" title="Chris Lilley" href="mailto:chris@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-color-4/#predefined">
+<link rel="match" href="greensquare-ref.html">
+<meta name="assert" content="Color function with default srgb value as decimal matches sRGB #009900">
+<style>
+    .test { background-color: red; width: 12em; height: 6em; margin-top:0}
+    .ref { background-color: #009900; width: 12em; height: 6em; margin-bottom: 0}
+    .test {background-color: color(0 0.6 0)}
+</style>
+<body>
+    <p>Test passes if you see a green square, and no red.</p>
+    <p class="ref"> </p>
+    <p class="test"> </p>
+</body>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color/predefined-004.html b/third_party/blink/web_tests/external/wpt/css/css-color/predefined-004.html
new file mode 100644
index 0000000..f1bf6dd
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-color/predefined-004.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Color 4: predefined colorspaces, default srgb, percent values</title>
+<link rel="author" title="Chris Lilley" href="mailto:chris@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-color-4/#predefined">
+<link rel="match" href="greensquare-ref.html">
+<meta name="assert" content="Color function with default srgb value as percent matches sRGB #009900">
+<style>
+    .test { background-color: red; width: 12em; height: 6em; margin-top:0}
+    .ref { background-color: #009900; width: 12em; height: 6em; margin-bottom: 0}
+    .test {background-color: color(0% 60% 0%)}
+</style>
+<body>
+    <p>Test passes if you see a green square, and no red.</p>
+    <p class="ref"> </p>
+    <p class="test"> </p>
+</body>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color/predefined-005.html b/third_party/blink/web_tests/external/wpt/css/css-color/predefined-005.html
new file mode 100644
index 0000000..780b929
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-color/predefined-005.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Color 4: predefined colorspaces, display-p3, decimal values</title>
+<link rel="author" title="Chris Lilley" href="mailto:chris@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-color-4/#predefined">
+<link rel="match" href="greensquare-ref.html">
+<meta name="assert" content="Color function with explicit display-p3 value as decimal matches sRGB #009900">
+<style>
+    .test { background-color: red; width: 12em; height: 6em; margin-top:0}
+    .ref { background-color: #009900; width: 12em; height: 6em; margin-bottom: 0}
+    .test {background-color: color(display-p3 0.26374 0.59085 0.16434)}
+</style>
+<body>
+    <p>Test passes if you see a green square, and no red.</p>
+    <p class="ref"> </p>
+    <p class="test"> </p>
+</body>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color/predefined-006.html b/third_party/blink/web_tests/external/wpt/css/css-color/predefined-006.html
new file mode 100644
index 0000000..f53fb79a
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-color/predefined-006.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Color 4: predefined colorspaces, display-p3, percent values</title>
+<link rel="author" title="Chris Lilley" href="mailto:chris@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-color-4/#predefined">
+<link rel="match" href="greensquare-ref.html">
+<meta name="assert" content="Color function with explicit display-p3 value as percent matches sRGB #009900">
+<style>
+    .test { background-color: red; width: 12em; height: 6em; margin-top:0}
+    .ref { background-color: #009900; width: 12em; height: 6em; margin-bottom: 0}
+    .test {background-color: color(display-p3 26.374% 59.085% 16.434%)}
+</style>
+<body>
+    <p>Test passes if you see a green square, and no red.</p>
+    <p class="ref"> </p>
+    <p class="test"> </p>
+</body>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color/predefined-007.html b/third_party/blink/web_tests/external/wpt/css/css-color/predefined-007.html
new file mode 100644
index 0000000..d679793
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-color/predefined-007.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Color 4: predefined colorspaces, a98-rgb, decimal values</title>
+<link rel="author" title="Chris Lilley" href="mailto:chris@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-color-4/#predefined">
+<link rel="match" href="greensquare-ref.html">
+<meta name="assert" content="Color function with explicit a98-rgb value as decimal matches sRGB #009900">
+<style>
+    .test { background-color: red; width: 12em; height: 6em; margin-top:0}
+    .ref { background-color: #009900; width: 12em; height: 6em; margin-bottom: 0}
+    .test {background-color: color(a98-rgb 0.33582 0.59441 0.13934)}
+</style>
+<body>
+    <p>Test passes if you see a green square, and no red.</p>
+    <p class="ref"> </p>
+    <p class="test"> </p>
+</body>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color/predefined-008.html b/third_party/blink/web_tests/external/wpt/css/css-color/predefined-008.html
new file mode 100644
index 0000000..57bbe3a
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-color/predefined-008.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Color 4: predefined colorspaces, a98-rgb, percent values</title>
+<link rel="author" title="Chris Lilley" href="mailto:chris@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-color-4/#predefined">
+<link rel="match" href="greensquare-ref.html">
+<meta name="assert" content="Color function with explicit a98-rgb value as percent matches sRGB #009900">
+<style>
+    .test { background-color: red; width: 12em; height: 6em; margin-top:0}
+    .ref { background-color: #009900; width: 12em; height: 6em; margin-bottom: 0}
+    .test {background-color: color(a98-rgb 33.582% 59.441% 13.934%)}
+</style>
+<body>
+    <p>Test passes if you see a green square, and no red.</p>
+    <p class="ref"> </p>
+    <p class="test"> </p>
+</body>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color/predefined-009.html b/third_party/blink/web_tests/external/wpt/css/css-color/predefined-009.html
new file mode 100644
index 0000000..e29305e
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-color/predefined-009.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Color 4: predefined colorspaces, prophoto-rgb, decimal values</title>
+<link rel="author" title="Chris Lilley" href="mailto:chris@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-color-4/#predefined">
+<link rel="match" href="greensquare-ref.html">
+<meta name="assert" content="Color function with explicit prophoto-rgb value as decimal matches sRGB #009900. Note that prophoto-rgb uses a D50 white so the chromatic adaptation step from Lab must be skipped.">
+<style>
+    .test { background-color: red; width: 12em; height: 6em; margin-top:0}
+    .ref { background-color: #009900; width: 12em; height: 6em; margin-bottom: 0}
+    .test {background-color: color(prophoto-rgb 0.2861 0.49131 0.16133)}
+</style>
+<body>
+    <p>Test passes if you see a green square, and no red.</p>
+    <p class="ref"> </p>
+    <p class="test"> </p>
+</body>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color/predefined-010.html b/third_party/blink/web_tests/external/wpt/css/css-color/predefined-010.html
new file mode 100644
index 0000000..a0eb995
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-color/predefined-010.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Color 4: predefined colorspaces, prophoto-rgb, percent values</title>
+<link rel="author" title="Chris Lilley" href="mailto:chris@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-color-4/#predefined">
+<link rel="match" href="greensquare-ref.html">
+<meta name="assert" content="Color function with explicit prophoto-rgb value as percent matches sRGB #009900. Note that prophoto-rgb uses a D50 white so the chromatic adaptation step from Lab must be skipped.">
+<style>
+    .test { background-color: red; width: 12em; height: 6em; margin-top:0}
+    .ref { background-color: #009900; width: 12em; height: 6em; margin-bottom: 0}
+    .test {background-color: color(prophoto-rgb 28.610% 49.131% 16.133%)}
+</style>
+<body>
+    <p>Test passes if you see a green square, and no red.</p>
+    <p class="ref"> </p>
+    <p class="test"> </p>
+</body>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color/predefined-011.html b/third_party/blink/web_tests/external/wpt/css/css-color/predefined-011.html
new file mode 100644
index 0000000..37a16f1
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-color/predefined-011.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Color 4: predefined colorspaces, rec2020, decimal values</title>
+<link rel="author" title="Chris Lilley" href="mailto:chris@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-color-4/#predefined">
+<link rel="match" href="greensquare-ref.html">
+<meta name="assert" content="Color function with explicit rec2020 value as decimal matches sRGB #009900">
+<style>
+    .test { background-color: red; width: 12em; height: 6em; margin-top:0}
+    .ref { background-color: #009900; width: 12em; height: 6em; margin-bottom: 0}
+    .test {background-color: color(rec2020 0.33033 0.55976 0.14863)}
+</style>
+<body>
+    <p>Test passes if you see a green square, and no red.</p>
+    <p class="ref"> </p>
+    <p class="test"> </p>
+</body>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color/predefined-012.html b/third_party/blink/web_tests/external/wpt/css/css-color/predefined-012.html
new file mode 100644
index 0000000..a4ead24
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-color/predefined-012.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Color 4: predefined colorspaces, rec2020, percent values</title>
+<link rel="author" title="Chris Lilley" href="mailto:chris@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-color-4/#predefined">
+<link rel="match" href="greensquare-ref.html">
+<meta name="assert" content="Color function with explicit rec2020 value as percent matches sRGB #009900">
+<style>
+    .test { background-color: red; width: 12em; height: 6em; margin-top:0}
+    .ref { background-color: #009900; width: 12em; height: 6em; margin-bottom: 0}
+    .test {background-color: color(rec2020 33.033% 55.976% 14.863%)}
+</style>
+<body>
+    <p>Test passes if you see a green square, and no red.</p>
+    <p class="ref"> </p>
+    <p class="test"> </p>
+</body>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color/predefined-013.html b/third_party/blink/web_tests/external/wpt/css/css-color/predefined-013.html
new file mode 100644
index 0000000..ed4a48f
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-color/predefined-013.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Color 4: predefined colorspaces, lab</title>
+<link rel="author" title="Chris Lilley" href="mailto:chris@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-color-4/#predefined">
+<link rel="match" href="greensquare-ref.html">
+<meta name="assert" content="Color function with explicit lab value matches sRGB #009900">
+<style>
+    .test { background-color: red; width: 12em; height: 6em; margin-top:0}
+    .ref { background-color: #009900; width: 12em; height: 6em; margin-bottom: 0}
+    .test {background-color: color(lab 54.903% -54.15 55.313)}
+</style>
+<body>
+    <p>Test passes if you see a green square, and no red.</p>
+    <p class="ref"> </p>
+    <p class="test"> </p>
+</body>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color/predefined-014.html b/third_party/blink/web_tests/external/wpt/css/css-color/predefined-014.html
new file mode 100644
index 0000000..51f7265
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-color/predefined-014.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Color 4: predefined colorspaces, fallback</title>
+<link rel="author" title="Chris Lilley" href="mailto:chris@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-color-4/#predefined">
+<link rel="match" href="greensquare-ref.html">
+<meta name="assert" content="Color function with invalid colorspace, fallback matches sRGB #009900">
+<style>
+    .test { background-color: red; width: 12em; height: 6em; margin-top:0}
+    .ref { background-color: #009900; width: 12em; height: 6em; margin-bottom: 0}
+    .test {background-color: color(banana 0.1 0.2 0.3, #009900)}
+</style>
+<body>
+    <p>Test passes if you see a green square, and no red.</p>
+    <p class="ref"> </p>
+    <p class="test"> </p>
+</body>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color/predefined-015.html b/third_party/blink/web_tests/external/wpt/css/css-color/predefined-015.html
new file mode 100644
index 0000000..2764139
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-color/predefined-015.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Color 4: predefined colorspaces, fallback</title>
+<link rel="author" title="Chris Lilley" href="mailto:chris@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-color-4/#predefined">
+<link rel="match" href="greensquare-ref.html">
+<meta name="assert" content="Color function with colorspace which matches sRGB #009900, red fallback">
+<style>
+    .test { background-color: red; width: 12em; height: 6em; margin-top:0}
+    .ref { background-color: #009900; width: 12em; height: 6em; margin-bottom: 0}
+    .test {background-color: color(display-p3 0.26374 0.59085 0.16434, red)}
+</style>
+<body>
+    <p>Test passes if you see a green square, and no red.</p>
+    <p class="ref"> </p>
+    <p class="test"> </p>
+</body>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color/predefined-016.html b/third_party/blink/web_tests/external/wpt/css/css-color/predefined-016.html
new file mode 100644
index 0000000..7b7c6530
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-color/predefined-016.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Color 4: predefined colorspaces, lab</title>
+<link rel="author" title="Chris Lilley" href="mailto:chris@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-color-4/#predefined">
+<link rel="match" href="greensquare-ref.html">
+<meta name="assert" content="Color function with explicit XYZ value matches sRGB #009900">
+<style>
+    .test { background-color: red; width: 12em; height: 6em; margin-top:0}
+    .ref { background-color: #009900; width: 12em; height: 6em; margin-bottom: 0}
+    .test {background-color: color(xyz 0.12266 0.22836 0.03093)}
+</style>
+<body>
+    <p>Test passes if you see a green square, and no red.</p>
+    <p class="ref"> </p>
+    <p class="test"> </p>
+</body>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-color/predefined-017.html b/third_party/blink/web_tests/external/wpt/css/css-color/predefined-017.html
new file mode 100644
index 0000000..ee1ebb67
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-color/predefined-017.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Color 4: predefined colorspaces, lab</title>
+<link rel="author" title="Chris Lilley" href="mailto:chris@w3.org">
+<link rel="help" href="https://drafts.csswg.org/css-color-4/#predefined">
+<link rel="match" href="greensquare-ref.html">
+<meta name="assert" content="Color function with explicit XYZ percentage value matches sRGB #009900">
+<style>
+    .test { background-color: red; width: 12em; height: 6em; margin-top:0}
+    .ref { background-color: #009900; width: 12em; height: 6em; margin-bottom: 0}
+    .test {background-color: color(xyz 12.266% 22.836% 3.093%)}
+</style>
+<body>
+    <p>Test passes if you see a green square, and no red.</p>
+    <p class="ref"> </p>
+    <p class="test"> </p>
+</body>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/interfaces/badging.idl b/third_party/blink/web_tests/external/wpt/interfaces/badging.idl
index 0b011a92..2857862 100644
--- a/third_party/blink/web_tests/external/wpt/interfaces/badging.idl
+++ b/third_party/blink/web_tests/external/wpt/interfaces/badging.idl
@@ -6,15 +6,15 @@
 // Methods only exposed on documents.
 [SecureContext]
 partial interface Navigator {
-  Promise<void> setClientBadge(optional [EnforceRange] unsigned long long contents);
-  Promise<void> clearClientBadge();
+  Promise<undefined> setClientBadge(optional [EnforceRange] unsigned long long contents);
+  Promise<undefined> clearClientBadge();
 };
 
 // Methods exposed on both documents and service workers.
 [SecureContext]
 interface mixin NavigatorBadge {
-  Promise<void> setAppBadge(optional [EnforceRange] unsigned long long contents);
-  Promise<void> clearAppBadge();
+  Promise<undefined> setAppBadge(optional [EnforceRange] unsigned long long contents);
+  Promise<undefined> clearAppBadge();
 };
 
 Navigator includes NavigatorBadge;
diff --git a/third_party/blink/web_tests/external/wpt/sanitizer-api/sanitizer-config.tentative-expected.txt b/third_party/blink/web_tests/external/wpt/sanitizer-api/sanitizer-config.tentative-expected.txt
new file mode 100644
index 0000000..8e126d4
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/sanitizer-api/sanitizer-config.tentative-expected.txt
@@ -0,0 +1,12 @@
+This is a testharness.js-based test.
+PASS SanitizerAPI creator without config.
+PASS SanitizerAPI creator with empty config.
+PASS SanitizerAPI creator with config ignore unknown values.
+PASS SanitizerAPI creator with config {"dropElements":[]}.
+PASS SanitizerAPI creator with config {"blockElements":[]}.
+FAIL SanitizerAPI creator with config {"allowElements":[]}. assert_equals: expected "<div>balabala<i>test</i></div>" but got "balabalatest"
+PASS SanitizerAPI creator with config {"dropAttributes":[]}.
+PASS SanitizerAPI creator with config {"blockAttributes":[]}.
+PASS SanitizerAPI creator with config {"allowAttributes":[]}.
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/svg/painting/reftests/markers-orient-002.svg b/third_party/blink/web_tests/external/wpt/svg/painting/reftests/markers-orient-002.svg
new file mode 100644
index 0000000..f371784e
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/svg/painting/reftests/markers-orient-002.svg
@@ -0,0 +1,15 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:h="http://www.w3.org/1999/xhtml">
+  <title>orient='auto' with 180 degree turns</title>
+  <h:link rel="help" href="https://svgwg.org/svg2-draft/painting.html#RenderingMarkers"/>
+  <h:link rel="match" href="../../pservers/reftests/reference/green-100x100.svg"/>
+  <marker id="m" markerWidth="100" markerHeight="50" markerUnits="userSpaceOnUse"
+          orient="auto" refX="50" refY="50">
+    <path d="M50,-5L105,50h-110z" fill="green"/>
+  </marker>
+  <g marker-start="url(#m)">
+    <path d="M50,0v50z"/>
+    <path d="M100,50h-50z"/>
+    <path d="M50,100v-50z"/>
+    <path d="M0,50h50z"/>
+  </g>
+</svg>
diff --git a/third_party/blink/web_tests/http/conf/php.ini b/third_party/blink/web_tests/http/conf/php.ini
index 4af42343..dcd2322f 100644
--- a/third_party/blink/web_tests/http/conf/php.ini
+++ b/third_party/blink/web_tests/http/conf/php.ini
@@ -1,3 +1,2 @@
 ; Let <meta charset> work. A charset provided in Content-Type takes precedence, and PHP 5.6+ defaults to UTF-8.
 default_charset = ""
-memory_limit = 512M
\ No newline at end of file
diff --git a/third_party/blink/web_tests/http/tests/devtools/console/console-big-array.js b/third_party/blink/web_tests/http/tests/devtools/console/console-big-array.js
index f026e108..6585107 100644
--- a/third_party/blink/web_tests/http/tests/devtools/console/console-big-array.js
+++ b/third_party/blink/web_tests/http/tests/devtools/console/console-big-array.js
@@ -68,7 +68,7 @@
 
   for (var i = 0; i < messages.length; ++i) {
     var consoleMessage = messages[i].consoleMessage();
-    var element = messages[i].toMessageElement();
+    var element = messages[i].element();
     var node = element.traverseNextNode(element);
 
     while (node) {
diff --git a/third_party/blink/web_tests/http/tests/devtools/console/console-filter-level-test.js b/third_party/blink/web_tests/http/tests/devtools/console/console-filter-level-test.js
index 47e8f72f..549c04dd 100644
--- a/third_party/blink/web_tests/http/tests/devtools/console/console-filter-level-test.js
+++ b/third_party/blink/web_tests/http/tests/devtools/console/console-filter-level-test.js
@@ -34,7 +34,7 @@
     for (var i = 0; i < messages.length; i++) {
       // Ordering is important here, as accessing the element the first time around
       // triggers live location creation and updates which we need to await properly.
-      const element = messages[i].toMessageElement();
+      const element = messages[i].element();
       await TestRunner.waitForPendingLiveLocationUpdates();
       TestRunner.addResult('>' + element.deepTextContent());
     }
diff --git a/third_party/blink/web_tests/http/tests/devtools/console/console-filter-test.js b/third_party/blink/web_tests/http/tests/devtools/console/console-filter-test.js
index 960072d..00c573e3 100644
--- a/third_party/blink/web_tests/http/tests/devtools/console/console-filter-test.js
+++ b/third_party/blink/web_tests/http/tests/devtools/console/console-filter-test.js
@@ -70,7 +70,7 @@
 
       // Ordering is important here, as accessing the element the first time around
       // triggers live location creation and updates which we need to await properly.
-      const element = viewMessage.toMessageElement();
+      const element = viewMessage.element();
       await TestRunner.waitForPendingLiveLocationUpdates();
       TestRunner.addResult(indent + delimeter + element.deepTextContent());
     }
diff --git a/third_party/blink/web_tests/http/tests/devtools/console/console-linkify-message-location.js b/third_party/blink/web_tests/http/tests/devtools/console/console-linkify-message-location.js
index 963f1678..1c650b9 100644
--- a/third_party/blink/web_tests/http/tests/devtools/console/console-linkify-message-location.js
+++ b/third_party/blink/web_tests/http/tests/devtools/console/console-linkify-message-location.js
@@ -56,7 +56,7 @@
     for (var i = 0; i < messages.length; ++i) {
       // Ordering is important here. Retrieveing the message element the first time triggers
       // live location creation and updates, which we need to await for correct locations.
-      var element = messages[i].toMessageElement();
+      var element = messages[i].element();
       await TestRunner.waitForPendingLiveLocationUpdates();
       var anchor = element.querySelector('.console-message-anchor');
       TestRunner.addResult(anchor.textContent.replace(/VM\d+/g, 'VM'));
diff --git a/third_party/blink/web_tests/http/tests/fetch/script-tests/fetch_upload.js b/third_party/blink/web_tests/http/tests/fetch/script-tests/fetch_upload.js
index 21d9f44..40d8fb58 100644
--- a/third_party/blink/web_tests/http/tests/fetch/script-tests/fetch_upload.js
+++ b/third_party/blink/web_tests/http/tests/fetch/script-tests/fetch_upload.js
@@ -69,63 +69,27 @@
   return crypto.subtle.digest('SHA-256', array);
 }
 
-function compare(a, b) {
-  if (a.length != b.length)
-    return [false, 'length is not equal'];
-  for (let i = 0; - 1 < i; i -= 1) {
-    if ((a[i] !== b[i]))
-      return [false, `a[${i}](${a[i]}) != b[${i}](${b[i]})`];
-  }
-  return [true, ''];
-}
-
-async function compare_long_array(a, b, description) {
-  const a_hash = await hash256(a);
-  const b_hash = await hash256(b);
-  const [eq, fail_reason] = compare(a_hash, b_hash);
-  if (eq)
-    return;
-
-  const [raw_eq, raw_fail_reason] = compare(a, b);
-  assert_false(raw_eq);
-  assert_(false, description + ': ' + raw_fail_reason);
-}
-
-async function test_echo_long_array(upload_body, expected_array) {
-  const response = await fetch_echo(upload_body);
-  const reader = response.body.getReader();
-  let index = 0;
-  while (index < expected_array.length) {
-    const chunk = await reader.read();
-    assert_false(chunk.done, `chunk.done@${index}/${expected_array.length}`);
-    const chunk_length = chunk.value.length;
-    await compare_long_array(
-        chunk.value, expected_array.subarray(index, index + chunk_length),
-        `Array of [${index}, ${index + chunk_length - 1}] should be same.`);
-    index += chunk_length;
-  }
-  const final_chunk = await reader.read();
-  assert_true(final_chunk.done, 'final_chunk.done');
-}
-
 promise_test(async () => {
   const length = 1000 * 1000;  // 1Mbytes
   const array = random_values_array(length);
   const stream = create_stream([array]);
-  await test_echo_long_array(stream, array);
-}, 'Fetch with ReadableStream body with 1Mbytes Uint8Array');
-
-promise_test(async () => {
-  const length = 1000 * 1000;  // 1 Mbytes
-  const array = random_values_array(length);
-  await test_echo_long_array(array, array);
-}, 'Fetch with Array body with 1 Mbytes Uint8Array');
-
-promise_test(async () => {
-  const length = 150 * 1000 * 1000;  // 150 Mbytes
-  const array = random_values_array(length);
-  await test_echo_long_array(array, array);
-}, 'Fetch with Array body with 150 Mbytes Uint8Array');
+  const response = await fetch_echo(stream);
+  const reader = response.body.getReader();
+  let index = 0;
+  while (index < length) {
+    const chunk = await reader.read();
+    assert_false(chunk.done);
+    const chunk_length = chunk.value.length;
+    const chunk_hash = await hash256(chunk.value);
+    const src_hash = await hash256(array.subarray(index, index + chunk_length));
+    assert_array_equals(
+        new Uint8Array(chunk_hash), new Uint8Array(src_hash),
+        `Array of [${index}, ${index + length - 1}] should be same.`);
+    index += chunk_length;
+  }
+  const final_chunk = await reader.read();
+  assert_true(final_chunk.done);
+}, 'Fetch with ReadableStream body with long Uint8Array');
 
 promise_test(async (t) => {
   const stream = create_stream(['Foobar']);
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/resources/iframe-request-trust-token.html b/third_party/blink/web_tests/http/tests/inspector-protocol/resources/iframe-request-trust-token.html
new file mode 100644
index 0000000..018434a
--- /dev/null
+++ b/third_party/blink/web_tests/http/tests/inspector-protocol/resources/iframe-request-trust-token.html
@@ -0,0 +1 @@
+<iframe src="https://issuer.example" trusttoken="{&#x22;type&#x22;: &#x22;token-request&#x22;}"></iframe>
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/trust-tokens/trust-token-params-fetch.js b/third_party/blink/web_tests/http/tests/inspector-protocol/trust-tokens/trust-token-params-fetch.js
new file mode 100644
index 0000000..0ea7488
--- /dev/null
+++ b/third_party/blink/web_tests/http/tests/inspector-protocol/trust-tokens/trust-token-params-fetch.js
@@ -0,0 +1,51 @@
+(async function(testRunner) {
+  const {session, dp} = await testRunner.startBlank(
+    `Check that TrustTokenParams are included in the basic Trust Token operations on 'fetch'`);
+
+  const clearTrustTokenState = async () => {
+    await session.evaluateAsync(`await new Promise(res => window.testRunner.clearTrustTokenState(res));`);
+  };
+
+  const issuanceRequest = `
+    fetch('https://trusttoken.test', {
+      trustToken: {
+        type: 'token-request'
+      }
+    });
+  `;
+
+  const redemptionRequest = `
+    fetch('https://trusttoken.test', {
+      trustToken: {
+        type: 'srr-token-redemption'
+      }
+    });
+  `;
+
+  const signingRequest = `
+    fetch('https://destination.test', {
+      trustToken: {
+        type: 'send-srr',
+        issuers: ['https://issuer.test']
+      }
+    });
+  `;
+
+  // Note that the requests are failing, as the provided URLs are neither valid
+  // issuers, nor redeemers. This test only cares about the parameters included
+  // in the requests.
+
+  await dp.Network.enable();
+  await dp.Network.onRequestWillBeSent(event => {
+    const trustTokenParams = event.params.request.trustTokenParams;
+    testRunner.log(`Included trustTokenParams in request: ${JSON.stringify(trustTokenParams)}`);
+  });
+
+  for (const request of [issuanceRequest, redemptionRequest, signingRequest]) {
+    testRunner.log(`Sending request: ${request}`);
+    await session.evaluateAsync(request);
+    await clearTrustTokenState();
+  }
+
+  testRunner.completeTest();
+})
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/trust-tokens/trust-token-params-iframe.js b/third_party/blink/web_tests/http/tests/inspector-protocol/trust-tokens/trust-token-params-iframe.js
new file mode 100644
index 0000000..c35b134
--- /dev/null
+++ b/third_party/blink/web_tests/http/tests/inspector-protocol/trust-tokens/trust-token-params-iframe.js
@@ -0,0 +1,18 @@
+(async function(testRunner) {
+  const {page, dp} = await testRunner.startBlank(
+      `Check that TrustTokenParams are included when an iframe requests a trust token'`);
+
+  await dp.Network.enable();
+  await dp.Network.onRequestWillBeSent(event => {
+    const trustTokenParams = event.params.request.trustTokenParams;
+    if (trustTokenParams) {
+      testRunner.log(`Included trustTokenParams in request: ${JSON.stringify(trustTokenParams)}`);
+    } else {
+      testRunner.log(`Main frame navigation not expected to contain trustTokenParams.`);
+    }
+  });
+
+  await page.navigate('https://devtools.test:8443/inspector-protocol/resources/iframe-request-trust-token.html');
+
+  testRunner.completeTest();
+})
diff --git a/third_party/blink/web_tests/http/tests/security/contentSecurityPolicy/image-document-default-src-none-expected.txt b/third_party/blink/web_tests/http/tests/security/contentSecurityPolicy/image-document-default-src-none-expected.txt
index 558cf72..0c240e8 100644
--- a/third_party/blink/web_tests/http/tests/security/contentSecurityPolicy/image-document-default-src-none-expected.txt
+++ b/third_party/blink/web_tests/http/tests/security/contentSecurityPolicy/image-document-default-src-none-expected.txt
@@ -4,4 +4,6 @@
 
 CONSOLE ERROR: Refused to apply inline style because it violates the following Content Security Policy directive: "default-src 'none'". Either the 'unsafe-inline' keyword, a hash ('sha256-VPZ2mdsWWlqXOFgt1tAllbbJhG8t9bh6emP1o9GwJxY='), or a nonce ('nonce-...') is required to enable inline execution. Note also that 'style-src' was not explicitly set, so 'default-src' is used as a fallback.
 
+CONSOLE ERROR: Refused to apply inline style because it violates the following Content Security Policy directive: "default-src 'none'". Either the 'unsafe-inline' keyword, a hash ('sha256-VPZ2mdsWWlqXOFgt1tAllbbJhG8t9bh6emP1o9GwJxY='), or a nonce ('nonce-...') is required to enable inline execution. Note also that 'style-src' was not explicitly set, so 'default-src' is used as a fallback.
+
 Ensure that we don't crash when loading an ImageDocument that sets CSP headers 
diff --git a/third_party/blink/web_tests/images/huge-image-viewport-scale-expected.txt b/third_party/blink/web_tests/images/huge-image-viewport-scale-expected.txt
index e1dd50a..a394685 100644
--- a/third_party/blink/web_tests/images/huge-image-viewport-scale-expected.txt
+++ b/third_party/blink/web_tests/images/huge-image-viewport-scale-expected.txt
@@ -4,5 +4,5 @@
 
 
 viewport meta: <meta name="viewport" content="width=device-width, minimum-scale=0.1">
-image style: -webkit-user-select: none;margin: auto;cursor: zoom-in;
+image style: -webkit-user-select: none;margin: auto;cursor: zoom-in;background-color: hsl(0, 0%, 90%);transition: background-color 300ms;
 image actual width: 100
diff --git a/third_party/blink/web_tests/fast/replaced/border-radius-clip-content-edge-expected.png b/third_party/blink/web_tests/platform/mac/fast/replaced/border-radius-clip-content-edge-expected.png
similarity index 100%
rename from third_party/blink/web_tests/fast/replaced/border-radius-clip-content-edge-expected.png
rename to third_party/blink/web_tests/platform/mac/fast/replaced/border-radius-clip-content-edge-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/images/color-profile-svg-foreign-object-expected.png b/third_party/blink/web_tests/platform/win/images/color-profile-svg-foreign-object-expected.png
similarity index 100%
rename from third_party/blink/web_tests/images/color-profile-svg-foreign-object-expected.png
rename to third_party/blink/web_tests/platform/win/images/color-profile-svg-foreign-object-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/virtual/trust-tokens/http/tests/inspector-protocol/trust-tokens/trust-token-params-fetch-expected.txt b/third_party/blink/web_tests/virtual/trust-tokens/http/tests/inspector-protocol/trust-tokens/trust-token-params-fetch-expected.txt
new file mode 100644
index 0000000..e6de47f
--- /dev/null
+++ b/third_party/blink/web_tests/virtual/trust-tokens/http/tests/inspector-protocol/trust-tokens/trust-token-params-fetch-expected.txt
@@ -0,0 +1,27 @@
+Check that TrustTokenParams are included in the basic Trust Token operations on 'fetch'
+Sending request: 
+    fetch('https://trusttoken.test', {
+      trustToken: {
+        type: 'token-request'
+      }
+    });
+  
+Included trustTokenParams in request: {"type":"Issuance","refreshPolicy":"UseCached"}
+Sending request: 
+    fetch('https://trusttoken.test', {
+      trustToken: {
+        type: 'srr-token-redemption'
+      }
+    });
+  
+Included trustTokenParams in request: {"type":"Redemption","refreshPolicy":"UseCached"}
+Sending request: 
+    fetch('https://destination.test', {
+      trustToken: {
+        type: 'send-srr',
+        issuers: ['https://issuer.test']
+      }
+    });
+  
+Included trustTokenParams in request: {"type":"Signing","refreshPolicy":"UseCached","issuers":["https://issuer.test"]}
+
diff --git a/third_party/blink/web_tests/virtual/trust-tokens/http/tests/inspector-protocol/trust-tokens/trust-token-params-iframe-expected.txt b/third_party/blink/web_tests/virtual/trust-tokens/http/tests/inspector-protocol/trust-tokens/trust-token-params-iframe-expected.txt
new file mode 100644
index 0000000..d27c0680
--- /dev/null
+++ b/third_party/blink/web_tests/virtual/trust-tokens/http/tests/inspector-protocol/trust-tokens/trust-token-params-iframe-expected.txt
@@ -0,0 +1,4 @@
+Check that TrustTokenParams are included when an iframe requests a trust token'
+Main frame navigation not expected to contain trustTokenParams.
+Included trustTokenParams in request: {"type":"Issuance","refreshPolicy":"UseCached"}
+
diff --git a/third_party/blink/web_tests/wpt_internal/sanitizer-api/sanitizer-config.tentative.html b/third_party/blink/web_tests/wpt_internal/sanitizer-api/sanitizer-config.tentative.html
index ed982b5..3897109 100644
--- a/third_party/blink/web_tests/wpt_internal/sanitizer-api/sanitizer-config.tentative.html
+++ b/third_party/blink/web_tests/wpt_internal/sanitizer-api/sanitizer-config.tentative.html
@@ -33,6 +33,17 @@
     }, "SanitizerAPI creator with config ignore unknown values.");
 
     test(t => {
+      let options = {allowElements: ["div"]};
+
+      let s = new Sanitizer(options);
+      assert_true(s instanceof Sanitizer);
+      assert_equals(s.sanitizeToString("<div>balabala</div><test>test</test>"), "<div>balabala</div>test");
+
+      options.allowElements.push("test");
+      assert_equals(s.sanitizeToString("<div>balabala</div><test>test</test>"), "<div>balabala</div>test");
+    }, "SanitizerAPI config allowElements is not editable.");
+
+    test(t => {
       let options = {dropElements: ["div"]};
 
       let s = new Sanitizer(options);
@@ -54,14 +65,19 @@
       assert_equals(s.sanitizeToString("<button id='btn' onclick='submit()'>balabala</button>"), "<button id=\"btn\">balabala</button>");
     }, "SanitizerAPI config dropAttributes is not editable.");
 
-    const config_names = ["dropElements", "dropAttributes"];
+    const config_names = ["dropElements", "allowElements", "dropAttributes"];
     config_names.forEach(cname => {
       let options = {};
       options[cname] = [];
       test(t => {
         let s = new Sanitizer(options);
         assert_true(s instanceof Sanitizer)
-        assert_equals(s.sanitizeToString("<div>balabala<i>test</i></div>"), "<div>balabala<i>test</i></div>");
+
+        if (cname == "allowElements") {
+          assert_equals(s.sanitizeToString("<div id='div'>balabala<i>test</i></div>"), "balabalatest");
+        } else {
+          assert_equals(s.sanitizeToString("<div id='div'>balabala<i>test</i></div>"), "<div id=\"div\">balabala<i>test</i></div>");
+        }
       }, "SanitizerAPI creator with config " + JSON.stringify(options) + ".");
 
       options = {};
diff --git a/third_party/blink/web_tests/wpt_internal/sanitizer-api/sanitizer-sanitize.tentative-expected.txt b/third_party/blink/web_tests/wpt_internal/sanitizer-api/sanitizer-sanitize.tentative-expected.txt
index 68e9b09..52887a9 100644
--- a/third_party/blink/web_tests/wpt_internal/sanitizer-api/sanitizer-sanitize.tentative-expected.txt
+++ b/third_party/blink/web_tests/wpt_internal/sanitizer-api/sanitizer-sanitize.tentative-expected.txt
@@ -12,7 +12,7 @@
 PASS SanitizerAPI with config: null, sanitize function for null
 PASS SanitizerAPI with config: document, sanitize function for document
 PASS SanitizerAPI with config: html without close tag, sanitize function for html without close tag
-FAIL SanitizerAPI with config: scripts for default configs, sanitize function for scripts for default configs assert_equals: expected "" but got "<script>alert('i am a test')</script>"
+PASS SanitizerAPI with config: scripts for default configs, sanitize function for scripts for default configs
 FAIL SanitizerAPI with config: onclick scripts, sanitize function for onclick scripts assert_equals: expected "<p>Click.</p>" but got "<p onclick=\"a= 123\">Click.</p>"
 PASS SanitizerAPI with config: invalid config_input, sanitize function for invalid config_input
 PASS SanitizerAPI with config: empty dropElements list, sanitize function for empty dropElements list
@@ -22,10 +22,12 @@
 PASS SanitizerAPI with config: dropElements list ["I", "AM"]}, sanitize function for dropElements list ["I", "AM"]}
 PASS SanitizerAPI with config: dropElements list ["am", "p"]}, sanitize function for dropElements list ["am", "p"]}
 PASS SanitizerAPI with config: dropElements list with invalid values}, sanitize function for dropElements list with invalid values}
+PASS SanitizerAPI with config: allowElements list ["p"]., sanitize function for allowElements list ["p"].
+PASS SanitizerAPI with config: allowElements list has no influence to dropElements., sanitize function for allowElements list has no influence to dropElements.
 PASS SanitizerAPI with config: dropAttributes list ["onclick"] with onclick scripts, sanitize function for dropAttributes list ["onclick"] with onclick scripts
 PASS SanitizerAPI with config: empty dropAttributes list with onclick scripts, sanitize function for empty dropAttributes list with onclick scripts
 PASS SanitizerAPI with config: dropAttributes list ["id"] with onclick scripts, sanitize function for dropAttributes list ["id"] with onclick scripts
 PASS SanitizerAPI with config: dropAttributes list ["ONCLICK"] with onclick scripts, sanitize function for dropAttributes list ["ONCLICK"] with onclick scripts
-FAIL SanitizerAPI with config: dropAttributes list ["data-attribute-with-dashes"] with dom dataset js access., sanitize function for dropAttributes list ["data-attribute-with-dashes"] with dom dataset js access. assert_equals: expected "<p id=\"p\">Click.</p><script></script>" but got "<p id=\"p\">Click.</p><script>document.getElementById('p').dataset.attributeWithDashes=123;</script>"
+FAIL SanitizerAPI with config: dropAttributes list ["data-attribute-with-dashes"] with dom dataset js access., sanitize function for dropAttributes list ["data-attribute-with-dashes"] with dom dataset js access. assert_equals: expected "<p id=\"p\">Click.</p><script></script>" but got "<p id=\"p\">Click.</p>"
 Harness: the test ran to completion.
 
diff --git a/third_party/blink/web_tests/wpt_internal/sanitizer-api/sanitizer-sanitize.tentative.html b/third_party/blink/web_tests/wpt_internal/sanitizer-api/sanitizer-sanitize.tentative.html
index a5eeaa49..ee9290e 100644
--- a/third_party/blink/web_tests/wpt_internal/sanitizer-api/sanitizer-sanitize.tentative.html
+++ b/third_party/blink/web_tests/wpt_internal/sanitizer-api/sanitizer-sanitize.tentative.html
@@ -21,7 +21,6 @@
 
     testcases.forEach(c => test(t => {
         let s = new Sanitizer(c.config_input);
-
         fragment = s.sanitize(c.value);
         assert_true(fragment instanceof DocumentFragment);
         assert_equals(getString(fragment), c.result);
diff --git a/third_party/blink/web_tests/wpt_internal/sanitizer-api/sanitizer-sanitizeToString.tentative-expected.txt b/third_party/blink/web_tests/wpt_internal/sanitizer-api/sanitizer-sanitizeToString.tentative-expected.txt
index fcda4bf7..1f60983 100644
--- a/third_party/blink/web_tests/wpt_internal/sanitizer-api/sanitizer-sanitizeToString.tentative-expected.txt
+++ b/third_party/blink/web_tests/wpt_internal/sanitizer-api/sanitizer-sanitizeToString.tentative-expected.txt
@@ -12,7 +12,7 @@
 PASS SanitizerAPI config: null, sanitizeToString function for null
 PASS SanitizerAPI config: document, sanitizeToString function for document
 PASS SanitizerAPI config: html without close tag, sanitizeToString function for html without close tag
-FAIL SanitizerAPI config: scripts for default configs, sanitizeToString function for scripts for default configs assert_equals: expected "" but got "<script>alert('i am a test')</script>"
+PASS SanitizerAPI config: scripts for default configs, sanitizeToString function for scripts for default configs
 FAIL SanitizerAPI config: onclick scripts, sanitizeToString function for onclick scripts assert_equals: expected "<p>Click.</p>" but got "<p onclick=\"a= 123\">Click.</p>"
 PASS SanitizerAPI config: invalid config_input, sanitizeToString function for invalid config_input
 PASS SanitizerAPI config: empty dropElements list, sanitizeToString function for empty dropElements list
@@ -22,10 +22,12 @@
 PASS SanitizerAPI config: dropElements list ["I", "AM"]}, sanitizeToString function for dropElements list ["I", "AM"]}
 PASS SanitizerAPI config: dropElements list ["am", "p"]}, sanitizeToString function for dropElements list ["am", "p"]}
 PASS SanitizerAPI config: dropElements list with invalid values}, sanitizeToString function for dropElements list with invalid values}
+PASS SanitizerAPI config: allowElements list ["p"]., sanitizeToString function for allowElements list ["p"].
+PASS SanitizerAPI config: allowElements list has no influence to dropElements., sanitizeToString function for allowElements list has no influence to dropElements.
 PASS SanitizerAPI config: dropAttributes list ["onclick"] with onclick scripts, sanitizeToString function for dropAttributes list ["onclick"] with onclick scripts
 PASS SanitizerAPI config: empty dropAttributes list with onclick scripts, sanitizeToString function for empty dropAttributes list with onclick scripts
 PASS SanitizerAPI config: dropAttributes list ["id"] with onclick scripts, sanitizeToString function for dropAttributes list ["id"] with onclick scripts
 PASS SanitizerAPI config: dropAttributes list ["ONCLICK"] with onclick scripts, sanitizeToString function for dropAttributes list ["ONCLICK"] with onclick scripts
-FAIL SanitizerAPI config: dropAttributes list ["data-attribute-with-dashes"] with dom dataset js access., sanitizeToString function for dropAttributes list ["data-attribute-with-dashes"] with dom dataset js access. assert_equals: expected "<p id=\"p\">Click.</p><script></script>" but got "<p id=\"p\">Click.</p><script>document.getElementById('p').dataset.attributeWithDashes=123;</script>"
+FAIL SanitizerAPI config: dropAttributes list ["data-attribute-with-dashes"] with dom dataset js access., sanitizeToString function for dropAttributes list ["data-attribute-with-dashes"] with dom dataset js access. assert_equals: expected "<p id=\"p\">Click.</p><script></script>" but got "<p id=\"p\">Click.</p>"
 Harness: the test ran to completion.
 
diff --git a/third_party/blink/web_tests/wpt_internal/sanitizer-api/support/testcases.sub.js b/third_party/blink/web_tests/wpt_internal/sanitizer-api/support/testcases.sub.js
index 622c0e2f..9e97563 100644
--- a/third_party/blink/web_tests/wpt_internal/sanitizer-api/support/testcases.sub.js
+++ b/third_party/blink/web_tests/wpt_internal/sanitizer-api/support/testcases.sub.js
@@ -21,6 +21,8 @@
   {config_input: {dropElements: ["I", "AM"]}, value: "<div>balabala<am>test</am></div>", result: "<div>balabala</div>", message: "dropElements list [\"I\", \"AM\"]}"},
   {config_input: {dropElements: ["am", "p"]}, value: "<div>balabala<i>i</i><p>t</p><test>a</test></div>", result: "<div>balabala<i>i</i><test>a</test></div>", message: "dropElements list [\"am\", \"p\"]}"},
   {config_input: {dropElements: [123, [], "test", "i"]}, value: "<div>balabala<i>test</i></div><test>t</test>", result: "<div>balabala</div>", message: "dropElements list with invalid values}"},
+  {config_input: {allowElements: ["p"]}, value: "<div>test<div>p</div>tt<p>div</p></div>", result: "testptt<p>div</p>", message: "allowElements list [\"p\"]."},
+  {config_input: {dropElements: ["div"], allowElements: ["div"]}, value: "<div>test</div><c>bla", result: "bla", message: "allowElements list has no influence to dropElements."},
   {config_input: {dropAttributes: ["onclick"]}, value: "<p onclick='a= 123'>Click.</p>", result: "<p>Click.</p>", message: "dropAttributes list [\"onclick\"] with onclick scripts"},
   {config_input: {dropAttributes: []}, value: "<p onclick='a= 123'>Click.</p>", result: "<p onclick=\"a= 123\">Click.</p>", message: "empty dropAttributes list with onclick scripts"},
   {config_input: {dropAttributes: ["id"]}, value: "<p onclick='a= 123'>Click.</p>", result: "<p onclick=\"a= 123\">Click.</p>", message: "dropAttributes list [\"id\"] with onclick scripts"},
diff --git a/third_party/closure_compiler/compiler.py b/third_party/closure_compiler/compiler.py
index 4e9521c..68fdefe 100755
--- a/third_party/closure_compiler/compiler.py
+++ b/third_party/closure_compiler/compiler.py
@@ -6,14 +6,8 @@
 """Runs Closure compiler on JavaScript files to check for errors and produce
 minified output."""
 
-import argparse
 import os
-import re
 import subprocess
-import sys
-import tempfile
-
-import processor
 
 
 _CURRENT_DIR = os.path.join(os.path.dirname(__file__))
@@ -34,28 +28,14 @@
       "-XX:+TieredCompilation",
   ]
 
-  _POLYMER_EXTERNS = os.path.join(_CURRENT_DIR, "externs", "polymer-1.0.js")
-
   def __init__(self, verbose=False):
     """
     Args:
       verbose: Whether this class should output diagnostic messages.
     """
     self._compiler_jar = os.path.join(_CURRENT_DIR, "compiler", "compiler.jar")
-    self._target = None
-    self._temp_files = []
     self._verbose = verbose
 
-  def _nuke_temp_files(self):
-    """Deletes any temp files this class knows about."""
-    if not self._temp_files:
-      return
-
-    self._log_debug("Deleting temp files: %s" % ", ".join(self._temp_files))
-    for f in self._temp_files:
-      os.remove(f)
-    self._temp_files = []
-
   def _log_debug(self, msg, error=False):
     """Logs |msg| to stdout if --verbose/-v is passed when invoking this script.
 
@@ -65,14 +45,6 @@
     if self._verbose:
       print "(INFO) %s" % msg
 
-  def _log_error(self, msg):
-    """Logs |msg| to stderr regardless of --flags.
-
-    Args:
-      msg: An error message to log.
-    """
-    print >> sys.stderr, "(ERROR) %s" % msg
-
   def run_jar(self, jar, args):
     """Runs a .jar from the command line with arguments.
 
@@ -92,223 +64,3 @@
     process = subprocess.Popen(shell_command, **kwargs)
     _, stderr = process.communicate()
     return process.returncode, stderr
-
-  def _get_line_number(self, match):
-    """When chrome is built, it preprocesses its JavaScript from:
-
-      <include src="blah.js">
-      alert(1);
-
-    to:
-
-      /* contents of blah.js inlined */
-      alert(1);
-
-    Because Closure Compiler requires this inlining already be done (as
-    <include> isn't valid JavaScript), this script creates temporary files to
-    expand all the <include>s.
-
-    When type errors are hit in temporary files, a developer doesn't know the
-    original source location to fix. This method maps from /tmp/file:300 back to
-    /original/source/file:100 so fixing errors is faster for developers.
-
-    Args:
-      match: A re.MatchObject from matching against a line number regex.
-
-    Returns:
-      The fixed up /file and :line number.
-    """
-    real_file = self._processor.get_file_from_line(match.group(1))
-    return "%s:%d" % (os.path.abspath(real_file.file), real_file.line_number)
-
-  def _clean_up_error(self, error):
-    """Reverse the effects that funky <include> preprocessing steps have on
-    errors messages.
-
-    Args:
-      error: A Closure compiler error (2 line string with error and source).
-
-    Return:
-      The fixed up error string.
-    """
-    assert self._target
-    assert self._expanded_file
-    expanded_file = self._expanded_file
-    fixed = re.sub("%s:(\d+)" % expanded_file, self._get_line_number, error)
-    return fixed.replace(expanded_file, os.path.abspath(self._target))
-
-  def _format_errors(self, errors):
-    """Formats Closure compiler errors to easily spot compiler output.
-
-    Args:
-      errors: A list of strings extracted from the Closure compiler's output.
-
-    Returns:
-      A formatted output string.
-    """
-    contents = "\n## ".join("\n\n".join(errors).splitlines())
-    return "## %s" % contents if contents else ""
-
-  def _create_temp_file(self, contents):
-    """Creates an owned temporary file with |contents|.
-
-    Args:
-      content: A string of the file contens to write to a temporary file.
-
-    Return:
-      The filepath of the newly created, written, and closed temporary file.
-    """
-    with tempfile.NamedTemporaryFile(mode="wt", delete=False) as tmp_file:
-      self._temp_files.append(tmp_file.name)
-      tmp_file.write(contents)
-    return tmp_file.name
-
-  def run(self, sources, out_file, closure_args=None,
-          custom_sources=False, custom_includes=False):
-    """Closure compile |sources| while checking for errors.
-
-    Args:
-      sources: Files to compile. sources[0] is the typically the target file.
-          sources[1:] are externs and dependencies in topological order. Order
-          is not guaranteed if custom_sources is True.
-      out_file: A file where the compiled output is written to.
-      closure_args: Arguments passed directly to the Closure compiler.
-      custom_sources: Whether |sources| was customized by the target (e.g. not
-          in GYP dependency order).
-      custom_includes: Whether <include>s are processed when |custom_sources|
-          is True.
-
-    Returns:
-      (found_errors, stderr) A boolean indicating whether errors were found and
-          the raw Closure compiler stderr (as a string).
-    """
-    is_extern = lambda f: 'externs' in f
-    externs_and_deps = [self._POLYMER_EXTERNS]
-
-    if custom_sources:
-      if custom_includes:
-        # TODO(dbeam): this is fairly hacky. Can we just remove custom_sources
-        # soon when all the things kept on life support using it die?
-        self._target = sources.pop()
-      externs_and_deps += sources
-    else:
-      self._target = sources[0]
-      externs_and_deps += sources[1:]
-
-    externs = filter(is_extern, externs_and_deps)
-    deps = filter(lambda f: not is_extern(f), externs_and_deps)
-
-    assert externs or deps or self._target
-
-    self._log_debug("Externs: %s" % externs)
-    self._log_debug("Dependencies: %s" % deps)
-    self._log_debug("Target: %s" % self._target)
-
-    js_args = deps + ([self._target] if self._target else [])
-
-    process_includes = custom_includes or not custom_sources
-    if process_includes:
-      # TODO(dbeam): compiler.jar automatically detects "@externs" in a --js arg
-      # and moves these files to a different AST tree. However, because we use
-      # one big funky <include> meta-file, it thinks all the code is one big
-      # externs. Just use --js when <include> dies.
-
-      cwd, tmp_dir = os.getcwd(), tempfile.gettempdir()
-      rel_path = lambda f: os.path.join(os.path.relpath(cwd, tmp_dir), f)
-      contents = ['<include src="%s">' % rel_path(f) for f in js_args]
-      meta_file = self._create_temp_file("\n".join(contents))
-      self._log_debug("Meta file: %s" % meta_file)
-
-      self._processor = processor.Processor(meta_file)
-      self._expanded_file = self._create_temp_file(self._processor.contents)
-      self._log_debug("Expanded file: %s" % self._expanded_file)
-
-      js_args = [self._expanded_file]
-
-    closure_args = closure_args or []
-    closure_args += ["summary_detail_level=3", "continue_after_errors"]
-
-    args = ["--externs=%s" % e for e in externs] + \
-           ["--js=%s" % s for s in js_args] + \
-           ["--%s" % arg for arg in closure_args]
-
-    assert out_file
-
-    out_dir = os.path.dirname(out_file)
-    if not os.path.exists(out_dir):
-      os.makedirs(out_dir)
-
-    checks_only = 'checks_only' in closure_args
-
-    if not checks_only:
-      args += ["--js_output_file=%s" % out_file]
-
-    self._log_debug("Args: %s" % " ".join(args))
-
-    return_code, stderr = self.run_jar(self._compiler_jar, args)
-
-    errors = stderr.strip().split("\n\n")
-    maybe_summary = errors.pop()
-
-    summary = re.search("(?P<error_count>\d+).*error.*warning", maybe_summary)
-    if summary:
-      self._log_debug("Summary: %s" % maybe_summary)
-    else:
-      # Not a summary. Running the jar failed. Bail.
-      self._log_error(stderr)
-      self._nuke_temp_files()
-      sys.exit(1)
-
-    if summary.group('error_count') != "0":
-      if os.path.exists(out_file):
-        os.remove(out_file)
-    elif checks_only and return_code == 0:
-      # Compile succeeded but --checks_only disables --js_output_file from
-      # actually writing a file. Write a file ourselves so incremental builds
-      # still work.
-      with open(out_file, 'w') as f:
-        f.write('')
-
-    if process_includes:
-      errors = map(self._clean_up_error, errors)
-      output = self._format_errors(errors)
-
-      if errors:
-        prefix = "\n" if output else ""
-        self._log_error("Error in: %s%s%s" % (self._target, prefix, output))
-      elif output:
-        self._log_debug("Output: %s" % output)
-
-    self._nuke_temp_files()
-    return bool(errors) or return_code > 0, stderr
-
-
-if __name__ == "__main__":
-  parser = argparse.ArgumentParser(
-      description="Typecheck JavaScript using Closure compiler")
-  parser.add_argument("sources", nargs=argparse.ONE_OR_MORE,
-                      help="Path to a source file to typecheck")
-  parser.add_argument("--custom_sources", action="store_true",
-                      help="Whether this rules has custom sources.")
-  parser.add_argument("--custom_includes", action="store_true",
-                      help="If present, <include>s are processed when "
-                           "using --custom_sources.")
-  parser.add_argument("-o", "--out_file", required=True,
-                      help="A file where the compiled output is written to")
-  parser.add_argument("-c", "--closure_args", nargs=argparse.ZERO_OR_MORE,
-                      help="Arguments passed directly to the Closure compiler")
-  parser.add_argument("-v", "--verbose", action="store_true",
-                      help="Show more information as this script runs")
-  opts = parser.parse_args()
-
-  compiler = Compiler(verbose=opts.verbose)
-
-  found_errors, stderr = compiler.run(opts.sources, out_file=opts.out_file,
-                                      closure_args=opts.closure_args,
-                                      custom_sources=opts.custom_sources,
-                                      custom_includes=opts.custom_includes)
-
-  if found_errors:
-    if opts.custom_sources:
-      print stderr
-    sys.exit(1)
diff --git a/third_party/closure_compiler/compiler_test.py b/third_party/closure_compiler/compiler_test.py
deleted file mode 100755
index fa60bad..0000000
--- a/third_party/closure_compiler/compiler_test.py
+++ /dev/null
@@ -1,362 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import imp
-import os
-import tempfile
-import unittest
-
-from compiler import Compiler
-from processor import FileCache, Processor
-
-
-_SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
-_SRC_DIR = os.path.join(_SCRIPT_DIR, os.pardir, os.pardir)
-_RESOURCES_DIR = os.path.join(_SRC_DIR, "ui", "webui", "resources", "js")
-_ASSERT_JS = os.path.join(_RESOURCES_DIR, "assert.js")
-_CR_JS = os.path.join(_RESOURCES_DIR, "cr.js")
-_CR_UI_JS = os.path.join(_RESOURCES_DIR, "cr", "ui.js")
-_PROMISE_RESOLVER_JS = os.path.join(_RESOURCES_DIR, "promise_resolver.js")
-_CHROME_EXTERNS = os.path.join(_SRC_DIR, "third_party", "closure_compiler",
-                               "externs", "chrome.js")
-_CHROME_SEND_EXTERNS = os.path.join(_SRC_DIR, "third_party", "closure_compiler",
-                                    "externs", "chrome_send.js")
-_CLOSURE_ARGS_GNI = os.path.join(_SCRIPT_DIR, "closure_args.gni")
-_CLOSURE_ARGS = imp.load_source('closure_gni', _CLOSURE_ARGS_GNI)
-_COMMON_CLOSURE_ARGS = _CLOSURE_ARGS.default_closure_args + \
-                       _CLOSURE_ARGS.default_disabled_closure_args
-
-class CompilerTest(unittest.TestCase):
-  _ASSERT_DEFINITION = Processor(_ASSERT_JS).contents
-  _PROMISE_RESOLVER_DEFINITION = (_ASSERT_DEFINITION +
-                                  Processor(_PROMISE_RESOLVER_JS).contents)
-  _CR_DEFINE_DEFINITION = (_PROMISE_RESOLVER_DEFINITION +
-                           Processor(_CR_JS).contents)
-  _CR_UI_DECORATE_DEFINITION = Processor(_CR_UI_JS).contents
-
-  def setUp(self):
-    self._compiler = Compiler()
-    self._tmp_files = []
-
-  def tearDown(self):
-    for file in self._tmp_files:
-      if os.path.exists(file):
-        os.remove(file)
-
-  def _runCompiler(self, source_code, needs_output, closure_args=None):
-    file_path = "/script.js"
-    FileCache._cache[file_path] = source_code
-    out_file = self._createOutFiles()
-    args = _COMMON_CLOSURE_ARGS + (closure_args or [])
-    if needs_output and "checks_only" in args:
-      args.remove("checks_only")
-
-    sources = [file_path, _CHROME_EXTERNS, _CHROME_SEND_EXTERNS]
-    found_errors, stderr = self._compiler.run(sources,
-                                              out_file=out_file,
-                                              closure_args=args)
-    return found_errors, stderr, out_file
-
-  def _runCompilerTestExpectError(self, source_code, expected_error,
-                                 closure_args=None):
-    _, stderr, out_file = self._runCompiler(
-        source_code, needs_output=False, closure_args=closure_args)
-
-    self.assertTrue(expected_error in stderr,
-        msg="Expected chunk: \n%s\n\nOutput:\n%s\n" % (
-            expected_error, stderr))
-    self.assertFalse(os.path.exists(out_file))
-
-  def _runCompilerTestExpectSuccess(self, source_code, expected_output=None,
-                                    closure_args=None):
-    found_errors, stderr, out_file = self._runCompiler(
-        source_code, needs_output=True, closure_args=closure_args)
-
-    self.assertFalse(found_errors,
-        msg="Expected success, but got failure\n\nOutput:\n%s\n" % stderr)
-
-    self.assertTrue(os.path.exists(out_file))
-    if expected_output:
-      with open(out_file, "r") as file:
-        self.assertEquals(file.read(), expected_output)
-
-  def _createOutFiles(self):
-    out_file = tempfile.NamedTemporaryFile(delete=False)
-
-    self._tmp_files.append(out_file.name)
-    return out_file.name
-
-  def testGetInstance(self):
-    self._runCompilerTestExpectError("""
-var cr = {
-  /** @param {!Function} ctor */
-  addSingletonGetter: function(ctor) {
-    ctor.getInstance = function() {
-      return ctor.instance_ || (ctor.instance_ = new ctor());
-    };
-  }
-};
-
-/** @constructor */
-function Class() {
-  /** @param {number} num */
-  this.needsNumber = function(num) {};
-}
-
-cr.addSingletonGetter(Class);
-Class.getInstance().needsNumber("wrong type");
-""", "ERROR - [JSC_TYPE_MISMATCH] actual parameter 1 of Class.needsNumber does "
-        "not match formal parameter")
-
-  def testCrDefineFunctionDefinition(self):
-    self._runCompilerTestExpectError(self._CR_DEFINE_DEFINITION + """
-cr.define('a.b.c', function() {
-  /** @param {number} num */
-  function internalName(num) {}
-
-  return {
-    needsNumber: internalName
-  };
-});
-
-a.b.c.needsNumber("wrong type");
-""", "ERROR - [JSC_TYPE_MISMATCH] actual parameter 1 of a.b.c.needsNumber does "
-        "not match formal parameter")
-
-  def testCrDefineFunctionAssignment(self):
-    self._runCompilerTestExpectError(self._CR_DEFINE_DEFINITION + """
-cr.define('a.b.c', function() {
-  /** @param {number} num */
-  var internalName = function(num) {};
-
-  return {
-    needsNumber: internalName
-  };
-});
-
-a.b.c.needsNumber("wrong type");
-""", "ERROR - [JSC_TYPE_MISMATCH] actual parameter 1 of a.b.c.needsNumber does "
-        "not match formal parameter")
-
-  def testCrDefineConstructorDefinitionPrototypeMethod(self):
-    self._runCompilerTestExpectError(self._CR_DEFINE_DEFINITION + """
-cr.define('a.b.c', function() {
-  /** @constructor */
-  function ClassInternalName() {}
-
-  ClassInternalName.prototype = {
-    /** @param {number} num */
-    method: function(num) {}
-  };
-
-  return {
-    ClassExternalName: ClassInternalName
-  };
-});
-
-new a.b.c.ClassExternalName().method("wrong type");
-""", "ERROR - [JSC_TYPE_MISMATCH] actual parameter 1 of "
-        "a.b.c.ClassExternalName.prototype.method does not match formal "
-        "parameter")
-
-  def testCrDefineConstructorAssignmentPrototypeMethod(self):
-    self._runCompilerTestExpectError(self._CR_DEFINE_DEFINITION + """
-cr.define('a.b.c', function() {
-  /** @constructor */
-  var ClassInternalName = function() {};
-
-  ClassInternalName.prototype = {
-    /** @param {number} num */
-    method: function(num) {}
-  };
-
-  return {
-    ClassExternalName: ClassInternalName
-  };
-});
-
-new a.b.c.ClassExternalName().method("wrong type");
-""", "ERROR - [JSC_TYPE_MISMATCH] actual parameter 1 of "
-        "a.b.c.ClassExternalName.prototype.method does not match formal "
-        "parameter")
-
-  def testCrDefineEnum(self):
-    self._runCompilerTestExpectError(self._CR_DEFINE_DEFINITION + """
-cr.define('a.b.c', function() {
-  /** @enum {string} */
-  var internalNameForEnum = {key: 'wrong_type'};
-
-  return {
-    exportedEnum: internalNameForEnum
-  };
-});
-
-/** @param {number} num */
-function needsNumber(num) {}
-
-needsNumber(a.b.c.exportedEnum.key);
-""", "ERROR - [JSC_TYPE_MISMATCH] actual parameter 1 of needsNumber does not "
-        "match formal parameter")
-
-  def testObjectDefineProperty(self):
-    self._runCompilerTestExpectSuccess("""
-/** @constructor */
-function Class() {}
-
-Object.defineProperty(Class.prototype, 'myProperty', {});
-
-alert(new Class().myProperty);
-""")
-
-  def testCrDefineProperty(self):
-    self._runCompilerTestExpectSuccess(self._CR_DEFINE_DEFINITION + """
-/** @constructor */
-function Class() {}
-
-cr.defineProperty(Class.prototype, 'myProperty', cr.PropertyKind.JS);
-
-alert(new Class().myProperty);
-""")
-
-  def testCrDefinePropertyTypeChecking(self):
-    self._runCompilerTestExpectError(self._CR_DEFINE_DEFINITION + """
-/** @constructor */
-function Class() {}
-
-cr.defineProperty(Class.prototype, 'booleanProp', cr.PropertyKind.BOOL_ATTR);
-
-/** @param {number} num */
-function needsNumber(num) {}
-
-needsNumber(new Class().booleanProp);
-""", "ERROR - [JSC_TYPE_MISMATCH] actual parameter 1 of needsNumber does not "
-        "match formal parameter")
-
-  def testCrDefineOnCrWorks(self):
-    self._runCompilerTestExpectSuccess(self._CR_DEFINE_DEFINITION + """
-cr.define('cr', function() {
-  return {};
-});
-""")
-
-  def testAssertWorks(self):
-    self._runCompilerTestExpectSuccess(self._ASSERT_DEFINITION + """
-/** @return {?string} */
-function f() {
-  return "string";
-}
-
-/** @type {!string} */
-var a = assert(f());
-""")
-
-  def testAssertInstanceofWorks(self):
-    self._runCompilerTestExpectSuccess(self._ASSERT_DEFINITION + """
-/** @constructor */
-function Class() {}
-
-/** @return {Class} */
-function f() {
-  var a = document.createElement('div');
-  return assertInstanceof(a, Class);
-}
-""")
-
-  def testCrUiDecorateWorks(self):
-    self._runCompilerTestExpectSuccess(self._CR_DEFINE_DEFINITION +
-        self._CR_UI_DECORATE_DEFINITION + """
-/** @constructor */
-function Class() {}
-
-/** @return {Class} */
-function f() {
-  var a = document.createElement('div');
-  cr.ui.decorate(a, Class);
-  return a;
-}
-""")
-
-  def testValidScriptCompilation(self):
-    self._runCompilerTestExpectSuccess("""
-var testScript = function() {
-  console.log("hello world")
-};
-""",
-"""'use strict';var testScript=function(){console.log("hello world")};\n""")
-
-  def testOutputWrapper(self):
-    source_code = """
-var testScript = function() {
-  console.log("hello world");
-};
-"""
-    expected_output = ("""(function(){'use strict';var testScript=function()"""
-                       """{console.log("hello world")};})();\n""")
-    closure_args=["output_wrapper='(function(){%output%})();'"]
-    self._runCompilerTestExpectSuccess(source_code, expected_output,
-                                       closure_args)
-
-  def testCustomSources(self):
-    source_file1 = tempfile.NamedTemporaryFile(delete=False)
-    with open(source_file1.name, "w") as f:
-      f.write("""
-var goog;
-goog.provide('testScript');
-
-var testScript = function() {};
-""")
-    self._tmp_files.append(source_file1.name)
-
-    source_file2 = tempfile.NamedTemporaryFile(delete=False)
-    with open(source_file2.name, "w") as f:
-      f.write("""
-goog.require('testScript');
-
-testScript();
-""")
-    self._tmp_files.append(source_file2.name)
-
-    out_file = self._createOutFiles()
-    sources = [source_file1.name, source_file2.name]
-    closure_args = [a for a in _COMMON_CLOSURE_ARGS if a != "checks_only"]
-    found_errors, stderr = self._compiler.run(sources, out_file=out_file,
-                                              closure_args=closure_args,
-                                              custom_sources=True)
-    self.assertFalse(found_errors,
-        msg="Expected success, but got failure\n\nOutput:\n%s\n" % stderr)
-
-    expected_output = "'use strict';var goog,testScript=function(){};testScript();\n"
-    self.assertTrue(os.path.exists(out_file))
-    with open(out_file, "r") as file:
-      self.assertEquals(file.read(), expected_output)
-
-  def testMissingReturnAssertNotReached(self):
-    template = self._ASSERT_DEFINITION + """
-/** @enum {number} */
-var Enum = {FOO: 1, BAR: 2};
-
-/**
- * @param {Enum} e
- * @return {number}
- */
-function enumToVal(e) {
-  switch (e) {
-    case Enum.FOO:
-      return 1;
-    case Enum.BAR:
-      return 2;
-  }
-  %s
-}
-"""
-    args = ['warning_level=VERBOSE']
-    self._runCompilerTestExpectError(template % '', 'Missing return',
-                                     closure_args=args)
-    self._runCompilerTestExpectSuccess(template % 'assertNotReached();',
-                                       closure_args=args)
-
-
-if __name__ == "__main__":
-  unittest.main()
diff --git a/third_party/closure_compiler/processor.py b/third_party/closure_compiler/processor.py
deleted file mode 100644
index d7163e4..0000000
--- a/third_party/closure_compiler/processor.py
+++ /dev/null
@@ -1,118 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""Process Chrome resources (HTML/CSS/JS) to handle <include> and <if> tags."""
-
-from collections import defaultdict
-import re
-import os
-
-
-class LineNumber(object):
-  """A simple wrapper to hold line information (e.g. file.js:32)."""
-  def __init__(self, source_file, line_number):
-    """
-    Args:
-      source_file: A file path (as a string).
-      line_number: The line in |file| (as an integer).
-    """
-    self.file = source_file
-    self.line_number = int(line_number)
-
-
-class FileCache(object):
-  """An in-memory cache to speed up reading the same files over and over.
-  
-  Usage:
-    FileCache.read(path_to_file)
-  """
-
-  _cache = defaultdict(str)
-
-  @classmethod
-  def read(self, source_file):
-    """Read a file and return it as a string.
-
-    Args:
-      source_file: a file path (as a string) to read and return the contents.
-
-    Returns:
-      The contents of |source_file| (as a string).
-    """
-    abs_file = os.path.abspath(source_file)
-    self._cache[abs_file] = self._cache[abs_file] or open(abs_file, "r").read()
-    return self._cache[abs_file]
-
-
-class Processor(object):
-  """Processes resource files, inlining the contents of <include> tags, removing
-  <if> tags, and retaining original line info.
-
-  For example
-
-    1: /* blah.js */
-    2: <if expr="is_win">
-    3: <include src="win.js">
-    4: </if>
-
-  would be turned into:
-
-    1: /* blah.js */
-    2:
-    3: /* win.js */
-    4: alert('Ew; Windows.');
-    5:
-  """
-
-  _IF_TAGS_REG = "</?if[^>]*?>"
-  _INCLUDE_REG = "<include[^>]+src=['\"]([^>]*)['\"]>"
-
-  def __init__(self, source_file):
-    """
-    Args:
-      source_file: A file path to process (as a string).
-    """
-    self.included_files = set()
-    self._index = 0
-    self._lines = self._get_file(source_file)
-
-    # Can't enumerate(self._lines) here because some lines are re-processed.
-    while self._index < len(self._lines):
-      current_line = self._lines[self._index]
-      match = re.search(self._INCLUDE_REG, current_line[2])
-      if match:
-        file_dir = os.path.dirname(current_line[0])
-        file_name = os.path.abspath(os.path.join(file_dir, match.group(1)))
-        if file_name not in self.included_files:
-          self._include_file(file_name)
-          continue  # Stay on the same line.
-        else:
-          # Found a duplicate <include>. Ignore and insert a blank line to
-          # preserve line numbers.
-          self._lines[self._index] = self._lines[self._index][:2] + ("",)
-      self._index += 1
-
-    for i, line in enumerate(self._lines):
-      self._lines[i] = line[:2] + (re.sub(self._IF_TAGS_REG, "", line[2]),)
-
-    self.contents = "\n".join(l[2] for l in self._lines)
-
-  # Returns a list of tuples in the format: (file, line number, line contents).
-  def _get_file(self, source_file):
-    lines = FileCache.read(source_file).splitlines()
-    return [(source_file, lnum + 1, line) for lnum, line in enumerate(lines)]
-
-  def _include_file(self, source_file):
-    self.included_files.add(source_file)
-    f = self._get_file(source_file)
-    self._lines = self._lines[:self._index] + f + self._lines[self._index + 1:]
-
-  def get_file_from_line(self, line_number):
-    """Get the original file and line number for an expanded file's line number.
-
-    Args:
-      line_number: A processed file's line number (as an integer or string).
-    """
-    line_number = int(line_number) - 1
-    return LineNumber(self._lines[line_number][0], self._lines[line_number][1])
diff --git a/third_party/closure_compiler/processor_test.py b/third_party/closure_compiler/processor_test.py
deleted file mode 100755
index f5517cc..0000000
--- a/third_party/closure_compiler/processor_test.py
+++ /dev/null
@@ -1,124 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""Test resources processing, i.e. <if> and <include> tag handling."""
-
-import unittest
-from processor import FileCache, Processor, LineNumber
-
-
-class ProcessorTest(unittest.TestCase):
-  """Test <include> tag processing logic."""
-
-  def __init__(self, *args, **kwargs):
-    unittest.TestCase.__init__(self, *args, **kwargs)
-    self.maxDiff = None
-
-  def setUp(self):
-    FileCache._cache["/debug.js"] = """
-// Copyright 2002 Older Chromium Author dudes.
-function debug(msg) { if (window.DEBUG) alert(msg); }
-""".strip()
-
-    FileCache._cache["/global.js"] = """
-// Copyright 2014 Old Chromium Author dudes.
-<include src="/debug.js">
-var global = 'type checking!';
-""".strip()
-
-    FileCache._cache["/checked.js"] = """
-// Copyright 2028 Future Chromium Author dudes.
-/**
- * @fileoverview Coolest app ever.
- * @author Douglas Crockford (douglas@crockford.com)
- */
-<include src="/global.js">
-debug(global);
-// Here continues checked.js, a swell file.
-""".strip()
-
-    FileCache._cache["/double-debug.js"] = """
-<include src="/debug.js">
-<include src="/debug.js">
-""".strip()
-
-    self._processor = Processor("/checked.js")
-
-  def testInline(self):
-    self.assertMultiLineEqual("""
-// Copyright 2028 Future Chromium Author dudes.
-/**
- * @fileoverview Coolest app ever.
- * @author Douglas Crockford (douglas@crockford.com)
- */
-// Copyright 2014 Old Chromium Author dudes.
-// Copyright 2002 Older Chromium Author dudes.
-function debug(msg) { if (window.DEBUG) alert(msg); }
-var global = 'type checking!';
-debug(global);
-// Here continues checked.js, a swell file.
-""".strip(), self._processor.contents)
-
-  def assertLineNumber(self, abs_line, expected_line):
-    actual_line = self._processor.get_file_from_line(abs_line)
-    self.assertEqual(expected_line.file, actual_line.file)
-    self.assertEqual(expected_line.line_number, actual_line.line_number)
-
-  def testGetFileFromLine(self):
-    """Verify that inlined files retain their original line info."""
-    self.assertLineNumber(1, LineNumber("/checked.js", 1))
-    self.assertLineNumber(5, LineNumber("/checked.js", 5))
-    self.assertLineNumber(6, LineNumber("/global.js", 1))
-    self.assertLineNumber(7, LineNumber("/debug.js", 1))
-    self.assertLineNumber(8, LineNumber("/debug.js", 2))
-    self.assertLineNumber(9, LineNumber("/global.js", 3))
-    self.assertLineNumber(10, LineNumber("/checked.js", 7))
-    self.assertLineNumber(11, LineNumber("/checked.js", 8))
-
-  def testIncludedFiles(self):
-    """Verify that files are tracked correctly as they're inlined."""
-    self.assertEquals(set(["/global.js", "/debug.js"]),
-                      self._processor.included_files)
-
-  def testDoubleIncludedSkipped(self):
-    """Verify that doubly included files are skipped."""
-    processor = Processor("/double-debug.js")
-    self.assertEquals(set(["/debug.js"]), processor.included_files)
-    self.assertEquals(FileCache.read("/debug.js") + "\n", processor.contents)
-
-class IfStrippingTest(unittest.TestCase):
-  """Test that the contents of XML <if> blocks are stripped."""
-
-  def __init__(self, *args, **kwargs):
-    unittest.TestCase.__init__(self, *args, **kwargs)
-    self.maxDiff = None
-
-  def setUp(self):
-    FileCache._cache["/century.js"] = """
-  function getCurrentCentury() {
-<if expr="netscape_os">
-    alert("Oh wow!");
-    return "XX";
-</if>
-    return "XXI";
-  }
-""".strip()
-
-    self.processor_ = Processor("/century.js")
-
-  def testIfStripping(self):
-    self.assertMultiLineEqual("""
-  function getCurrentCentury() {
-
-    alert("Oh wow!");
-    return "XX";
-
-    return "XXI";
-  }
-""".strip(), self.processor_.contents)
-
-
-if __name__ == '__main__':
-  unittest.main()
diff --git a/third_party/closure_compiler/run_tests.py b/third_party/closure_compiler/run_tests.py
deleted file mode 100755
index a1e078cd..0000000
--- a/third_party/closure_compiler/run_tests.py
+++ /dev/null
@@ -1,12 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2015 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 compiler_test
-import processor_test
-
-
-for test_module in [compiler_test, processor_test]:
-  test_module.unittest.main(test_module)
diff --git a/third_party/sqlite/sqlite_common_configuration_flags.gni b/third_party/sqlite/sqlite_common_configuration_flags.gni
index fbdfb852..04f1c12 100644
--- a/third_party/sqlite/sqlite_common_configuration_flags.gni
+++ b/third_party/sqlite/sqlite_common_configuration_flags.gni
@@ -40,6 +40,15 @@
   # private, so our databases use stricter settings.
   "SQLITE_DEFAULT_FILE_PERMISSIONS=0600",
 
+  # Databases are opened in EXCLUSIVE mode by default.
+  #
+  # NORMAL mode, where a database can be used by multiple processes
+  # simultaneously, can be enabled by executing "PRAGMA locking_mode=0".
+  #
+  # https://www.sqlite.org/compile.html#default_locking_mode
+  # https://www.sqlite.org/pragma.html#pragma_locking_mode
+  "SQLITE_DEFAULT_LOCKING_MODE=1",
+
   # Needed by the SQL MemoryDumpProvider.
   #
   # Setting this to 1 is needed to collect the information reported by
diff --git a/tools/grit/grit/format/resource_map.py b/tools/grit/grit/format/resource_map.py
index 95a8b83..35cce40 100644
--- a/tools/grit/grit/format/resource_map.py
+++ b/tools/grit/grit/format/resource_map.py
@@ -137,6 +137,10 @@
   return path1_abs == common
 
 def _GetItemPath(item):
+  resource_path = item.attrs.get('resource_path', '')
+  if resource_path:
+    return resource_path
+
   path = item.GetInputPath().replace("\\", "/")
 
   # Handle the case where the file resides within the output folder,
diff --git a/tools/grit/grit/format/resource_map_unittest.py b/tools/grit/grit/format/resource_map_unittest.py
index 3499b321..3531a8e 100755
--- a/tools/grit/grit/format/resource_map_unittest.py
+++ b/tools/grit/grit/format/resource_map_unittest.py
@@ -33,6 +33,8 @@
           </structures>
           <includes first_id="10000">
             <include type="foo" file="abc" name="IDS_FIRSTPRESENT" />
+            <include type="foo" file="rst" resource_path="new_path/rst_resource"
+                     name="IDS_WITHRESOURCEPATH" />
             <if expr="False">
               <include type="foo" file="def" name="IDS_MISSING" />
             </if>
@@ -44,7 +46,7 @@
             </if>
             <include type="foo" file="mno" name="IDS_THIRDPRESENT" />
             <include type="foo" file="opq" name="IDS_FOURTHPRESENT"
-                                   skip_in_resource_map="true" />
+                     skip_in_resource_map="true" />
          </includes>
        </release>''', run_gatherers=True)
     output = util.StripBlankLinesAndComments(''.join(
@@ -70,6 +72,7 @@
 const GritResourceMap kTheRcHeader[] = {
   {"IDC_KLONKMENU", IDC_KLONKMENU},
   {"IDS_FIRSTPRESENT", IDS_FIRSTPRESENT},
+  {"IDS_WITHRESOURCEPATH", IDS_WITHRESOURCEPATH},
   {"IDS_LANGUAGESPECIFIC", IDS_LANGUAGESPECIFIC},
   {"IDS_THIRDPRESENT", IDS_THIRDPRESENT},
 };
@@ -84,6 +87,7 @@
 const GritResourceMap kTheRcHeader[] = {
   {"grit/testdata/klonk.rc", IDC_KLONKMENU},
   {"abc", IDS_FIRSTPRESENT},
+  {"new_path/rst_resource", IDS_WITHRESOURCEPATH},
   {"ghi", IDS_LANGUAGESPECIFIC},
   {"mno", IDS_THIRDPRESENT},
 };
diff --git a/tools/grit/grit/node/include.py b/tools/grit/grit/node/include.py
index b06b988..98a6cac 100644
--- a/tools/grit/grit/node/include.py
+++ b/tools/grit/grit/node/include.py
@@ -48,6 +48,8 @@
     """Attributes:
        translateable:         False if the node has contents that should not be
                               translated.
+       resource_path:         If provided, is used to populate the |name|
+                              property of the generated GritResourceMap struct.
        preprocess:            Takes the same code path as flattenhtml, but it
                               disables any  processing/inlining outside of <if>
                               and <include>.
@@ -69,6 +71,7 @@
         'use_base_dir': 'true',
         'skip_minify': 'false',
         'skip_in_resource_map': 'false',
+        'resource_path': '',
     }
 
   def GetInputPath(self):
diff --git a/tools/grit/grit/node/include_unittest.py b/tools/grit/grit/node/include_unittest.py
index 4c658f1..cc68177 100755
--- a/tools/grit/grit/node/include_unittest.py
+++ b/tools/grit/grit/node/include_unittest.py
@@ -15,6 +15,7 @@
 if __name__ == '__main__':
   sys.path.append(os.path.join(os.path.dirname(__file__), '../..'))
 
+import grit.format.resource_map
 from grit.node import misc
 from grit.node import include
 from grit.node import empty
@@ -129,6 +130,37 @@
     self.assertIn(b'in the middle...', result)
     self.assertNotIn(b'should be removed', result)
 
+  def testAcceptsResourcePath(self):
+    root = util.ParseGrdForUnittest(
+        '''
+        <outputs>
+          <output filename="grit/test1_resources.h" type="rc_header">
+            <emit emit_type='prepend'></emit>
+          </output>
+          <output filename="grit/test1_resources_map.cc"
+              type="resource_file_map_source" />
+          <output filename="grit/test1_resources_map.h"
+              type="resource_map_header" />
+        </outputs>
+        <release seq="3">
+          <includes>
+            <include name="TEST1_TEXT" file="test1_text.txt"
+                     resource_path="foo/renamed1_text.txt"
+                     compress="false" type="BINDATA"/>
+          </includes>
+        </release>''',
+        base_dir=util.PathFromRoot('grit/testdata'))
+    inc, = root.GetChildrenOfType(include.IncludeNode)
+    formatter = grit.format.resource_map.GetFormatter(
+        'resource_file_map_source')
+    formatted = formatter(root,
+                          lang='en',
+                          output_dir=util.PathFromRoot('grit/testdata'))
+    found = False
+    for segment in formatted:
+      found = found or 'foo/renamed1_text.txt' in segment
+      self.assertNotIn('test1_text.txt', segment)
+    self.assertTrue(found)
 
 if __name__ == '__main__':
   unittest.main()
diff --git a/tools/gritsettings/resource_ids.spec b/tools/gritsettings/resource_ids.spec
index 6e16fec..feb72b2 100644
--- a/tools/gritsettings/resource_ids.spec
+++ b/tools/gritsettings/resource_ids.spec
@@ -191,9 +191,9 @@
   "chrome/browser/resources/settings/settings_resources_vulcanized.grd": {
     "includes": [1820],
   },
-  "chrome/browser/resources/settings/settings_resources.grd": {
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/settings/settings_resources.grd": {
+    "META": {"sizes": {"includes": [500],}},
     "includes": [1830],
-    "structures": [1840],
   },
   "chrome/browser/resources/signin/profile_picker/profile_picker_resources_vulcanized.grd": {
     "includes": [1850],
diff --git a/tools/ipc_fuzzer/fuzzer/fuzzer.cc b/tools/ipc_fuzzer/fuzzer/fuzzer.cc
index de92cf1..67097475 100644
--- a/tools/ipc_fuzzer/fuzzer/fuzzer.cc
+++ b/tools/ipc_fuzzer/fuzzer/fuzzer.cc
@@ -801,12 +801,12 @@
 };
 
 template <>
-struct FuzzTraits<content::PageState> {
-  static bool Fuzz(content::PageState* p, Fuzzer* fuzzer) {
+struct FuzzTraits<blink::PageState> {
+  static bool Fuzz(blink::PageState* p, Fuzzer* fuzzer) {
     std::string data = p->ToEncodedData();
     if (!FuzzParam(&data, fuzzer))
       return false;
-    *p = content::PageState::CreateFromEncodedData(data);
+    *p = blink::PageState::CreateFromEncodedData(data);
     return true;
   }
 };
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index a9eae6c5..eced207 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -16385,6 +16385,7 @@
   <int value="45" label="Keyboard shortcut removed"/>
   <int value="46" label="Keyboard shortcut modified"/>
   <int value="47" label="Link to custom property in var() clicked"/>
+  <int value="48" label="Custom property value edited"/>
 </enum>
 
 <enum name="DevToolsBackgroundService">
@@ -61249,6 +61250,14 @@
   <int value="6" label="In use"/>
 </enum>
 
+<enum name="RadioSignalLevel">
+  <int value="0" label="None or Unknown"/>
+  <int value="1" label="Poor"/>
+  <int value="2" label="Moderate"/>
+  <int value="3" label="Good"/>
+  <int value="4" label="Great"/>
+</enum>
+
 <enum name="RankerModelStatus">
   <int value="0" label="OK"/>
   <int value="1" label="Download Throttled"/>
diff --git a/tools/metrics/histograms/histograms_xml/gpu/histograms.xml b/tools/metrics/histograms/histograms_xml/gpu/histograms.xml
index 00bcf21..3fd9b46 100644
--- a/tools/metrics/histograms/histograms_xml/gpu/histograms.xml
+++ b/tools/metrics/histograms/histograms_xml/gpu/histograms.xml
@@ -351,9 +351,9 @@
 </histogram>
 
 <histogram name="GPU.DirectComposition.CreateSwapChainForComposition"
-    enum="Hresult" expires_after="M85">
+    enum="Hresult" expires_after="2021-01-10">
+  <owner>magchen@chromium.org</owner>
   <owner>zmo@chromium.org</owner>
-  <owner>rafael.cintron@microsoft.com</owner>
   <summary>
     HRESULT return value of IDXGIFactory2::CreateSwapChainForComposition.
   </summary>
diff --git a/tools/metrics/histograms/histograms_xml/histogram_suffixes_list.xml b/tools/metrics/histograms/histograms_xml/histogram_suffixes_list.xml
index e634afd..bb37f903 100644
--- a/tools/metrics/histograms/histograms_xml/histogram_suffixes_list.xml
+++ b/tools/metrics/histograms/histograms_xml/histogram_suffixes_list.xml
@@ -8214,12 +8214,18 @@
   <suffix name="NTPSnippets" label="Database for RemoteSuggestion snippets."/>
   <suffix name="OfflinePageMetadataStore"
       label="Databases for OfflinePageMetadataStore"/>
+  <suffix name="PersistedStateDatabase"
+      label="Database for NonCriticalPersistedTabData"/>
   <suffix name="PreviewsHintCacheStore" label="Databases for Previews Hints"/>
   <suffix name="PrintJobDatabase" label="Database for print job metadata."/>
   <suffix name="SharedDb" label="Shared database"/>
   <suffix name="StrikeService" label="Database for strike service."/>
   <suffix name="TabStateDatabase"
-      label="Database for NonCriticalPersistedTabData"/>
+      label="Database for NonCriticalPersistedTabData">
+    <obsolete>
+      Deprecated since 10/2020 in favor of PersistedStateDatabase
+    </obsolete>
+  </suffix>
   <suffix name="UpboardingQueryTileStore"
       label="Database for Upboarding query tiles."/>
   <suffix name="UsageReportsBufferBackend"
@@ -14839,6 +14845,7 @@
   <affected-histogram name="Profile.State.Avatar"/>
   <affected-histogram name="Profile.State.LastUsed"/>
   <affected-histogram name="Profile.State.Name"/>
+  <affected-histogram name="Profile.State.SyncEnabled"/>
   <affected-histogram name="Profile.State.UnconsentedPrimaryAccountType"/>
 </histogram_suffixes>
 
diff --git a/tools/metrics/histograms/histograms_xml/mobile/histograms.xml b/tools/metrics/histograms/histograms_xml/mobile/histograms.xml
index 48f63d2..866abd0 100644
--- a/tools/metrics/histograms/histograms_xml/mobile/histograms.xml
+++ b/tools/metrics/histograms/histograms_xml/mobile/histograms.xml
@@ -60,28 +60,6 @@
   </summary>
 </histogram>
 
-<histogram name="Mobile.ContextMenu.BookmarkEntry.Actions" enum="IOSMenuAction"
-    expires_after="2021-07-01">
-  <owner>seblalancette@chromium.org</owner>
-  <owner>gambard@chromium.org</owner>
-  <summary>
-    Tracks which action was selected in the context menu shown for Bookmark
-    entries. To view how often this context menu was shown, take a look at this
-    other histogram: Mobile.ContextMenu.EntryPoints. Currently only on iOS.
-  </summary>
-</histogram>
-
-<histogram name="Mobile.ContextMenu.BookmarkFolder.Actions"
-    enum="IOSMenuAction" expires_after="2021-07-01">
-  <owner>seblalancette@chromium.org</owner>
-  <owner>gambard@chromium.org</owner>
-  <summary>
-    Tracks which action was selected in the context menu shown for Bookmark
-    folders. To view how often this context menu was shown, take a look at this
-    other histogram: Mobile.ContextMenu.EntryPoints. Currently only on iOS.
-  </summary>
-</histogram>
-
 <histogram name="Mobile.ContextMenu.EntryPoints" enum="IOSMenuScenario"
     expires_after="2021-07-01">
   <owner>seblalancette@chromium.org</owner>
@@ -93,60 +71,24 @@
   </summary>
 </histogram>
 
-<histogram name="Mobile.ContextMenu.HistoryEntry.Actions" enum="IOSMenuAction"
+<histogram name="Mobile.ContextMenu.{EntryPoint}.Actions" enum="IOSMenuAction"
     expires_after="2021-07-01">
   <owner>seblalancette@chromium.org</owner>
   <owner>gambard@chromium.org</owner>
   <summary>
-    Tracks which action was selected in the context menu shown for History
-    entries. To view how often this context menu was shown, take a look at this
-    other histogram: Mobile.ContextMenu.EntryPoints. Currently only on iOS.
+    Tracks which action was selected in the context menu shown for a
+    {EntryPoint}. To view how often this context menu was shown, take a look at
+    this other histogram: Mobile.ContextMenu.EntryPoints. Currently only on iOS.
   </summary>
-</histogram>
-
-<histogram name="Mobile.ContextMenu.MostVisitedEntry.Actions"
-    enum="IOSMenuAction" expires_after="2021-07-01">
-  <owner>seblalancette@chromium.org</owner>
-  <owner>gambard@chromium.org</owner>
-  <summary>
-    Tracks which action was selected in the context menu shown for Most Visited
-    entries. To view how often this context menu was shown, take a look at this
-    other histogram: Mobile.ContextMenu.EntryPoints. Currently only on iOS.
-  </summary>
-</histogram>
-
-<histogram name="Mobile.ContextMenu.ReadingListEntry.Actions"
-    enum="IOSMenuAction" expires_after="2021-07-01">
-  <owner>seblalancette@chromium.org</owner>
-  <owner>gambard@chromium.org</owner>
-  <summary>
-    Tracks which action was selected in the context menu shown for Reading List
-    entries. To view how often this context menu was shown, take a look at this
-    other histogram: Mobile.ContextMenu.EntryPoints. Currently only on iOS.
-  </summary>
-</histogram>
-
-<histogram name="Mobile.ContextMenu.RecentTabsEntry.Actions"
-    enum="IOSMenuAction" expires_after="2021-07-01">
-  <owner>seblalancette@chromium.org</owner>
-  <owner>gambard@chromium.org</owner>
-  <summary>
-    Tracks which action was selected in the context menu shown for Recent Tabs
-    entries. To view how often this context menu was shown, take a look at this
-    other histogram: Mobile.ContextMenu.EntryPoints. Currently only on iOS.
-  </summary>
-</histogram>
-
-<histogram name="Mobile.ContextMenu.RecentTabsHeader.Actions"
-    enum="IOSMenuAction" expires_after="2021-07-01">
-  <owner>seblalancette@chromium.org</owner>
-  <owner>gambard@chromium.org</owner>
-  <summary>
-    Tracks which action was selected in the context menu shown for Recent Tabs
-    headers/devices. To view how often this context menu was shown, take a look
-    at this other histogram: Mobile.ContextMenu.EntryPoints. Currently only on
-    iOS.
-  </summary>
+  <token key="EntryPoint">
+    <variant name="BookmarkEntry" summary="Bookmark entry"/>
+    <variant name="BookmarkFolder" summary="Bookmark folder"/>
+    <variant name="HistoryEntry" summary="History entry"/>
+    <variant name="MostVisitedEntry" summary="Most Visited entry"/>
+    <variant name="ReadingListEntry" summary="Reading List entry"/>
+    <variant name="RecentTabsEntry" summary="Recent Tabs entry"/>
+    <variant name="RecentTabsHeader" summary="Recent Tabs header/device"/>
+  </token>
 </histogram>
 
 <histogram base="true" name="Mobile.DefaultBrowser.BrowserCount" units="units"
@@ -372,17 +314,6 @@
   </summary>
 </histogram>
 
-<histogram name="Mobile.Share.BookmarkEntry.Actions" enum="IOSShareAction"
-    expires_after="2021-06-01">
-  <owner>seblalancette@chromium.org</owner>
-  <owner>chrome-sharing-core@google.com</owner>
-  <summary>
-    Tracks the sharing actions executed when the sharing scenario was initiated
-    for a bookmark entry. To view how often this sharing scenario was triggered,
-    take a look at: Mobile.Share.EntryPoints. Currently only on iOS.
-  </summary>
-</histogram>
-
 <histogram name="Mobile.Share.EntryPoints" enum="IOSActivityScenario"
     expires_after="2021-06-01">
   <owner>seblalancette@chromium.org</owner>
@@ -394,70 +325,24 @@
   </summary>
 </histogram>
 
-<histogram name="Mobile.Share.HistoryEntry.Actions" enum="IOSShareAction"
+<histogram name="Mobile.Share.{EntryPoint}.Actions" enum="IOSShareAction"
     expires_after="2021-06-01">
   <owner>seblalancette@chromium.org</owner>
   <owner>chrome-sharing-core@google.com</owner>
   <summary>
     Tracks the sharing actions executed when the sharing scenario was initiated
-    for a history entry. To view how often this sharing scenario was triggered,
+    for a {EntryPoint}. To view how often this sharing scenario was triggered,
     take a look at: Mobile.Share.EntryPoints. Currently only on iOS.
   </summary>
-</histogram>
-
-<histogram name="Mobile.Share.MostVisitedEntry.Actions" enum="IOSShareAction"
-    expires_after="2021-06-01">
-  <owner>seblalancette@chromium.org</owner>
-  <owner>chrome-sharing-core@google.com</owner>
-  <summary>
-    Tracks the sharing actions executed when the sharing scenario was initiated
-    for a most visited tile. To view how often this sharing scenario was
-    triggered, take a look at: Mobile.Share.EntryPoints. Currently only on iOS.
-  </summary>
-</histogram>
-
-<histogram name="Mobile.Share.QRCodeImage.Actions" enum="IOSShareAction"
-    expires_after="2021-06-01">
-  <owner>seblalancette@chromium.org</owner>
-  <owner>chrome-sharing-core@google.com</owner>
-  <summary>
-    Tracks the sharing actions executed when the sharing scenario was initiated
-    for the generated QR code image. To view how often this sharing scenario was
-    triggered, take a look at: Mobile.Share.EntryPoints. Currently only on iOS.
-  </summary>
-</histogram>
-
-<histogram name="Mobile.Share.ReadingListEntry.Actions" enum="IOSShareAction"
-    expires_after="2021-06-01">
-  <owner>seblalancette@chromium.org</owner>
-  <owner>chrome-sharing-core@google.com</owner>
-  <summary>
-    Tracks the sharing actions executed when the sharing scenario was initiated
-    for a reading list entry. To view how often this sharing scenario was
-    triggered, take a look at: Mobile.Share.EntryPoints. Currently only on iOS.
-  </summary>
-</histogram>
-
-<histogram name="Mobile.Share.RecentTabsEntry.Actions" enum="IOSShareAction"
-    expires_after="2021-06-01">
-  <owner>seblalancette@chromium.org</owner>
-  <owner>chrome-sharing-core@google.com</owner>
-  <summary>
-    Tracks the sharing actions executed when the sharing scenario was initiated
-    for a recent tab entry. To view how often this sharing scenario was
-    triggered, take a look at: Mobile.Share.EntryPoints. Currently only on iOS.
-  </summary>
-</histogram>
-
-<histogram name="Mobile.Share.TabShareButton.Actions" enum="IOSShareAction"
-    expires_after="2021-06-01">
-  <owner>seblalancette@chromium.org</owner>
-  <owner>chrome-sharing-core@google.com</owner>
-  <summary>
-    Tracks the sharing actions executed when the sharing scenario was initiated
-    from the tab's share button. To view how often this sharing scenario was
-    triggered, take a look at: Mobile.Share.EntryPoints. Currently only on iOS.
-  </summary>
+  <token key="EntryPoint">
+    <variant name="BookmarkEntry" summary="Bookmark entry"/>
+    <variant name="HistoryEntry" summary="History entry"/>
+    <variant name="MostVisitedEntry" summary="Most Visited entry"/>
+    <variant name="QRCodeImage" summary="QR code image"/>
+    <variant name="ReadingListEntry" summary="Reading List entry"/>
+    <variant name="RecentTabsEntry" summary="Recent Tabs entry"/>
+    <variant name="TabShareButton" summary="current tab"/>
+  </token>
 </histogram>
 
 <histogram name="Mobile.SystemNotification.Action.Click"
diff --git a/tools/metrics/histograms/histograms_xml/obsolete_histograms.xml b/tools/metrics/histograms/histograms_xml/obsolete_histograms.xml
index d563cf5f..c314abf 100644
--- a/tools/metrics/histograms/histograms_xml/obsolete_histograms.xml
+++ b/tools/metrics/histograms/histograms_xml/obsolete_histograms.xml
@@ -56989,6 +56989,20 @@
   </summary>
 </histogram>
 
+<histogram name="Platform.MemoryBandwidth.ReadWrite" units="MB/s"
+    expires_after="M85">
+  <obsolete>
+    Removed 09/2020 due to lack of usage.
+  </obsolete>
+  <owner>hajimehoshi@chromium.org</owner>
+  <owner>kouhei@chromium.org</owner>
+  <owner>cast-analytics@google.com</owner>
+  <summary>
+    Peak memory bandwith (read and write) usage during the last sample interval.
+    The sample interval may vary from seconds to several minutes.
+  </summary>
+</histogram>
+
 <histogram name="Platform.MountEncrypted.EncryptedFsType"
     enum="MountEncryptedEncryptedFsType" expires_after="M85">
   <obsolete>
@@ -85704,6 +85718,35 @@
   </summary>
 </histogram>
 
+<histogram name="Uptime.LoginPromptSetupTimeAfterLogout" units="ms"
+    expires_after="M85">
+  <obsolete>
+    Removed 09/2020. No direct replacement.
+  </obsolete>
+  <owner>hajimehoshi@chromium.org</owner>
+  <owner>kouhei@chromium.org</owner>
+  <summary>
+    Measures the time elapsed on Chrome OS for setting up for a login after a
+    logout. More specifically, it is the time between when the Cryptohome is
+    unmounted (the last step in the logout process) and when the login prompt is
+    again visible after a logout.
+  </summary>
+</histogram>
+
+<histogram name="Uptime.Logout" units="ms" expires_after="M85">
+  <obsolete>
+    Removed 09/2020. No direct replacement.
+  </obsolete>
+  <owner>hajimehoshi@chromium.org</owner>
+  <owner>kouhei@chromium.org</owner>
+  <summary>
+    Measures the time elapsed on Chrome OS when performing a logout. More
+    specifically, it is the time between when a logout is initiated and when the
+    Cryptohome is unmounted, signaling the last step in the logout process. This
+    statistic is not collected when the logout is part of a restart or shutdown.
+  </summary>
+</histogram>
+
 <histogram name="Uptime.ProcessesTerminatedToXTerminatedAfterLogout" units="ms"
     expires_after="2018-06-06">
   <obsolete>
diff --git a/tools/metrics/histograms/histograms_xml/others/histograms.xml b/tools/metrics/histograms/histograms_xml/others/histograms.xml
index 4a3bad5..d257207 100644
--- a/tools/metrics/histograms/histograms_xml/others/histograms.xml
+++ b/tools/metrics/histograms/histograms_xml/others/histograms.xml
@@ -5916,7 +5916,7 @@
 </histogram>
 
 <histogram name="HIDDetection.OOBEDevicesDetectedOnContinuePressed"
-    enum="HIDContinueScenarioType" expires_after="M87">
+    enum="HIDContinueScenarioType" expires_after="M94">
   <owner>rsorokin@chromium.org</owner>
   <owner>cros-oac@google.com</owner>
   <summary>
@@ -5926,7 +5926,7 @@
 </histogram>
 
 <histogram name="HIDDetection.OOBEDialogShown" units="units"
-    expires_after="M87">
+    expires_after="M94">
   <owner>rsorokin@chromium.org</owner>
   <owner>cros-oac@google.com</owner>
   <summary>
@@ -15522,29 +15522,6 @@
   </summary>
 </histogram>
 
-<histogram name="Uptime.LoginPromptSetupTimeAfterLogout" units="ms"
-    expires_after="M85">
-  <owner>hajimehoshi@chromium.org</owner>
-  <owner>kouhei@chromium.org</owner>
-  <summary>
-    Measures the time elapsed on Chrome OS for setting up for a login after a
-    logout. More specifically, it is the time between when the Cryptohome is
-    unmounted (the last step in the logout process) and when the login prompt is
-    again visible after a logout.
-  </summary>
-</histogram>
-
-<histogram name="Uptime.Logout" units="ms" expires_after="M85">
-  <owner>hajimehoshi@chromium.org</owner>
-  <owner>kouhei@chromium.org</owner>
-  <summary>
-    Measures the time elapsed on Chrome OS when performing a logout. More
-    specifically, it is the time between when a logout is initiated and when the
-    Cryptohome is unmounted, signaling the last step in the logout process. This
-    statistic is not collected when the logout is part of a restart or shutdown.
-  </summary>
-</histogram>
-
 <histogram name="Uptime.LogoutToLoginPromptVisible" units="ms"
     expires_after="M77">
   <owner>hajimehoshi@chromium.org</owner>
diff --git a/tools/metrics/histograms/histograms_xml/platform/histograms.xml b/tools/metrics/histograms/histograms_xml/platform/histograms.xml
index 5ee5ab6..fda5737 100644
--- a/tools/metrics/histograms/histograms_xml/platform/histograms.xml
+++ b/tools/metrics/histograms/histograms_xml/platform/histograms.xml
@@ -655,17 +655,6 @@
   </summary>
 </histogram>
 
-<histogram name="Platform.MemoryBandwidth.ReadWrite" units="MB/s"
-    expires_after="M85">
-  <owner>hajimehoshi@chromium.org</owner>
-  <owner>kouhei@chromium.org</owner>
-  <owner>cast-analytics@google.com</owner>
-  <summary>
-    Peak memory bandwith (read and write) usage during the last sample interval.
-    The sample interval may vary from seconds to several minutes.
-  </summary>
-</histogram>
-
 <histogram name="Platform.MemuseAnon0" units="units" expires_after="M85">
   <owner>hajimehoshi@chromium.org</owner>
   <owner>kouhei@chromium.org</owner>
diff --git a/tools/metrics/histograms/histograms_xml/power/histograms.xml b/tools/metrics/histograms/histograms_xml/power/histograms.xml
index 882a842..6fa9d0f 100644
--- a/tools/metrics/histograms/histograms_xml/power/histograms.xml
+++ b/tools/metrics/histograms/histograms_xml/power/histograms.xml
@@ -498,6 +498,52 @@
   </summary>
 </histogram>
 
+<histogram name="Power.ForegroundRadio.SignalLevel.{NetworkType}"
+    enum="RadioSignalLevel" expires_after="2021-07-03">
+  <owner>eseckler@chromium.org</owner>
+  <owner>khokhlov@chromium.org</owner>
+  <owner>skyostil@chromium.org</owner>
+  <summary>
+    Periodically samples the radio (cellular/wifi) signal strength level while
+    Chrome is the foreground app and the device is on battery power. Sampled
+    every 30 seconds and when Chrome is backgrounded or the device connects to a
+    charger.
+
+    Only supported on Android.
+  </summary>
+  <token key="NetworkType">
+    <variant name="Cell"/>
+    <variant name="Wifi"/>
+  </token>
+</histogram>
+
+<histogram name="Power.ForegroundRadio.{Direction}KiB.{NetworkType}.30Seconds"
+    enum="RadioSignalLevel" expires_after="2021-07-03">
+  <owner>eseckler@chromium.org</owner>
+  <owner>khokhlov@chromium.org</owner>
+  <owner>skyostil@chromium.org</owner>
+  <summary>
+    Periodically samples the number of kibibytes received over network while
+    Chrome is the foreground app and the device is on battery power. Sampled
+    every 30 seconds and when Chrome is backgrounded or the device connects to a
+    charger. Values are distributed across buckets according to the radio signal
+    quality.
+
+    Caveat: signal quality is measured at the end of 30-sec period, so it might
+    not reflect the quality during the entire period.
+
+    Only supported on Android.
+  </summary>
+  <token key="Direction">
+    <variant name="Received"/>
+    <variant name="Sent"/>
+  </token>
+  <token key="NetworkType">
+    <variant name="Cell"/>
+    <variant name="Wifi"/>
+  </token>
+</histogram>
+
 <histogram name="Power.IdleScreenDimCountDaily" units="count"
     expires_after="M100">
   <owner>tbroch@chromium.org</owner>
diff --git a/tools/metrics/histograms/histograms_xml/profile/histograms.xml b/tools/metrics/histograms/histograms_xml/profile/histograms.xml
index 4677118..5a69b37 100644
--- a/tools/metrics/histograms/histograms_xml/profile/histograms.xml
+++ b/tools/metrics/histograms/histograms_xml/profile/histograms.xml
@@ -449,6 +449,16 @@
   </summary>
 </histogram>
 
+<histogram base="true" name="Profile.State.SyncEnabled" enum="BooleanEnabled"
+    expires_after="2021-10-08">
+  <owner>jkrcal@chromium.org</owner>
+  <owner>droger@chromium.org</owner>
+  <summary>
+    The sync status of the profile. Recorded on startup of Chrome and whenever
+    Chrome is used after at least 30 minutes of inactivity.
+  </summary>
+</histogram>
+
 <histogram base="true" name="Profile.State.UnconsentedPrimaryAccountType"
     enum="ProfileUnconsentedPrimaryAccountType" expires_after="2021-03-11">
   <owner>jkrcal@chromium.org</owner>
diff --git a/tools/perf/benchmarks/v8_browsing.py b/tools/perf/benchmarks/v8_browsing.py
index 1e6c454..b16fbe7 100644
--- a/tools/perf/benchmarks/v8_browsing.py
+++ b/tools/perf/benchmarks/v8_browsing.py
@@ -14,21 +14,22 @@
 
 def AugmentOptionsForV8BrowsingMetrics(options, enable_runtime_call_stats=True):
   categories = [
-    # Disable all categories by default.
-    '-*',
-    # Memory categories.
-    'disabled-by-default-memory-infra',
-    'toplevel',
-    # V8 categories.
-    'disabled-by-default-v8.gc',
-    'v8',
-    'v8.wasm',
-    'v8.console',
-    'webkit.console',
-    # Blink categories.
-    'blink_gc',
-    # Needed for the metric reported by page.
-    'blink.user_timing'
+      # Disable all categories by default.
+      '-*',
+      # Memory categories.
+      'disabled-by-default-memory-infra',
+      'toplevel',
+      # V8 categories.
+      'disabled-by-default-v8.gc',
+      'v8',
+      'v8.wasm',
+      'v8.console',
+      'webkit.console',
+      # Blink categories.
+      'blink_gc',
+      'partition_alloc',
+      # Needed for the metric reported by page.
+      'blink.user_timing'
   ]
 
   options.ExtendTraceCategoryFilter(categories)
diff --git a/tools/perf/core/perfetto_binary_roller/binary_deps.json b/tools/perf/core/perfetto_binary_roller/binary_deps.json
index 8640a0e5..41ecf46 100644
--- a/tools/perf/core/perfetto_binary_roller/binary_deps.json
+++ b/tools/perf/core/perfetto_binary_roller/binary_deps.json
@@ -5,12 +5,12 @@
             "remote_path": "perfetto_binaries/trace_processor_shell/win/935a915963e1482109b102c82585d78c12112b31/trace_processor_shell.exe"
         },
         "mac": {
-            "hash": "df1f27ed590454f652de0c9ea411189d0e2617b7",
-            "remote_path": "perfetto_binaries/trace_processor_shell/mac/7c2d888fdffc6294563173dc335f2d8d2d680b61/trace_processor_shell"
+            "hash": "f644b77335cd634c1e6c176e031ce0e1d592f489",
+            "remote_path": "perfetto_binaries/trace_processor_shell/mac/2bf76269e147bdf1f3d6b6b749eb44375c4fa3ff/trace_processor_shell"
         },
         "linux": {
-            "hash": "69c7c935f32f102a3af5c3d79317b7a55e57eec5",
-            "remote_path": "perfetto_binaries/trace_processor_shell/linux/7c2d888fdffc6294563173dc335f2d8d2d680b61/trace_processor_shell"
+            "hash": "3cb342f0066d4eaa41f167cae302c9052530142d",
+            "remote_path": "perfetto_binaries/trace_processor_shell/linux/c251d370b65ed2b50c02e89c8d8852026c2fda24/trace_processor_shell"
         }
     },
     "power_profile.sql": {
diff --git a/ui/file_manager/file_manager/foreground/elements/files_safe_video_webview_content.css b/ui/file_manager/file_manager/foreground/elements/files_safe_video_webview_content.css
index baf7f72a..85e918c 100644
--- a/ui/file_manager/file_manager/foreground/elements/files_safe_video_webview_content.css
+++ b/ui/file_manager/file_manager/foreground/elements/files_safe_video_webview_content.css
@@ -30,21 +30,15 @@
   display: none;
 }
 
-video::-webkit-media-controls-timeline,
-video::-webkit-media-controls-mute-button,
-video::-webkit-media-controls-play-button {
-  cursor: pointer;
-}
-
-video::-webkit-media-controls-fullscreen-button,
-video::-webkit-media-controls-volume-slider {
+video::-webkit-media-controls-fullscreen-button {
   display: none;
 }
 
 video:focus,
 video::-webkit-media-controls-timeline:focus,
 video::-webkit-media-controls-mute-button:focus,
-video::-webkit-media-controls-play-button:focus {
+video::-webkit-media-controls-play-button:focus,
+video::-webkit-media-controls-volume-slider:focus {
   outline: 2px solid rgba(66, 133, 244, 0.5);
   outline-offset: -2px;
 }
diff --git a/ui/message_center/message_center_impl.cc b/ui/message_center/message_center_impl.cc
index f10104f..fa2dc56 100644
--- a/ui/message_center/message_center_impl.cc
+++ b/ui/message_center/message_center_impl.cc
@@ -293,9 +293,13 @@
 
     ids.insert(notification->id());
     scoped_refptr<NotificationDelegate> delegate = notification->delegate();
+
+    // Remove notification before calling the Close method in case it calls
+    // RemoveNotification reentrantly.
+    notification_list_->RemoveNotification(notification->id());
+
     if (delegate.get())
       delegate->Close(by_user);
-    notification_list_->RemoveNotification(notification->id());
   }
 
   if (!ids.empty()) {
diff --git a/ui/message_center/message_center_impl_unittest.cc b/ui/message_center/message_center_impl_unittest.cc
index a4baca9..16523bb3 100644
--- a/ui/message_center/message_center_impl_unittest.cc
+++ b/ui/message_center/message_center_impl_unittest.cc
@@ -208,6 +208,13 @@
         NOTIFICATION_TYPE_SIMPLE);
   }
 
+  std::unique_ptr<Notification> CreateSimpleNotificationWithDelegate(
+      const std::string& id,
+      scoped_refptr<NotificationDelegate> delegate) {
+    return CreateNotificationWithNotifierIdAndDelegate(
+        id, kDefaultAppId, NOTIFICATION_TYPE_SIMPLE, delegate);
+  }
+
   std::unique_ptr<Notification> CreateNotification(const std::string& id,
                                                    NotificationType type) {
     return CreateNotificationWithNotifierId(id, kDefaultAppId, type);
@@ -217,6 +224,15 @@
       const std::string& id,
       const std::string& notifier_id,
       NotificationType type) {
+    return CreateNotificationWithNotifierIdAndDelegate(
+        id, notifier_id, type, base::MakeRefCounted<TestDelegate>());
+  }
+
+  std::unique_ptr<Notification> CreateNotificationWithNotifierIdAndDelegate(
+      const std::string& id,
+      const std::string& notifier_id,
+      NotificationType type,
+      scoped_refptr<NotificationDelegate> delegate) {
     RichNotificationData optional_fields;
     optional_fields.buttons.emplace_back(UTF8ToUTF16("foo"));
     optional_fields.buttons.emplace_back(UTF8ToUTF16("foo"));
@@ -224,7 +240,7 @@
         type, id, UTF8ToUTF16("title"), UTF8ToUTF16(id),
         gfx::Image() /* icon */, base::string16() /* display_source */, GURL(),
         NotifierId(NotifierType::APPLICATION, notifier_id), optional_fields,
-        base::MakeRefCounted<TestDelegate>());
+        delegate);
   }
 
   TestDelegate* GetDelegate(const std::string& id) const {
@@ -998,15 +1014,11 @@
 }
 
 TEST_F(MessageCenterImplTest, RemoveInCloseHandler) {
-  std::string id("id1");
+  const std::string id("id1");
 
   // Create a notification that calls RemoveNotification() on close.
-  auto notification = std::make_unique<Notification>(
-      NOTIFICATION_TYPE_SIMPLE, id, UTF8ToUTF16("title"), UTF8ToUTF16(id),
-      gfx::Image() /* icon */, base::string16() /* display_source */, GURL(),
-      NotifierId(NotifierType::APPLICATION, kDefaultAppId),
-      RichNotificationData(),
-      base::MakeRefCounted<DeleteOnCloseDelegate>(message_center(), id));
+  auto notification = CreateSimpleNotificationWithDelegate(
+      id, base::MakeRefCounted<DeleteOnCloseDelegate>(message_center(), id));
   message_center()->AddNotification(std::move(notification));
   EXPECT_TRUE(message_center()->FindVisibleNotificationById(id));
 
@@ -1015,6 +1027,29 @@
   EXPECT_FALSE(message_center()->FindVisibleNotificationById(id));
 }
 
+// Regression test for https://crbug.com/1135709
+TEST_F(MessageCenterImplTest, RemoveInCloseHandlerCloseAll) {
+  const std::string id1("id1");
+  const std::string id2("id2");
+
+  // Create two notifications that call RemoveNotification() on close.
+  auto notification1 = CreateSimpleNotificationWithDelegate(
+      id1, base::MakeRefCounted<DeleteOnCloseDelegate>(message_center(), id1));
+  auto notification2 = CreateSimpleNotificationWithDelegate(
+      id2, base::MakeRefCounted<DeleteOnCloseDelegate>(message_center(), id2));
+  message_center()->AddNotification(std::move(notification1));
+  message_center()->AddNotification(std::move(notification2));
+  EXPECT_TRUE(message_center()->FindVisibleNotificationById(id1));
+  EXPECT_TRUE(message_center()->FindVisibleNotificationById(id2));
+
+  // Then remove all notifications which calls RemoveNotification() reentrantly.
+  message_center()->RemoveAllNotifications(
+      true /* by_user */,
+      message_center::MessageCenter::RemoveType::NON_PINNED);
+  EXPECT_FALSE(message_center()->FindVisibleNotificationById(id1));
+  EXPECT_FALSE(message_center()->FindVisibleNotificationById(id2));
+}
+
 TEST_F(MessageCenterImplTest, FindNotificationsByAppId) {
   message_center()->SetHasMessageCenterView(true);
 
diff --git a/ui/ozone/BUILD.gn b/ui/ozone/BUILD.gn
index 1da5976..35ea309 100644
--- a/ui/ozone/BUILD.gn
+++ b/ui/ozone/BUILD.gn
@@ -90,6 +90,8 @@
     "public/ozone_switches.h",
     "public/platform_clipboard.h",
     "public/platform_gl_egl_utility.h",
+    "public/platform_menu_utils.cc",
+    "public/platform_menu_utils.h",
     "public/platform_screen.cc",
     "public/platform_screen.h",
     "public/platform_window_surface.h",
diff --git a/ui/ozone/platform/wayland/BUILD.gn b/ui/ozone/platform/wayland/BUILD.gn
index 2f4b01fc..a551ed0 100644
--- a/ui/ozone/platform/wayland/BUILD.gn
+++ b/ui/ozone/platform/wayland/BUILD.gn
@@ -47,12 +47,6 @@
     "host/gtk_primary_selection_device_manager.h",
     "host/gtk_primary_selection_offer.cc",
     "host/gtk_primary_selection_offer.h",
-    "host/zwp_primary_selection_device.cc",
-    "host/zwp_primary_selection_device.h",
-    "host/zwp_primary_selection_device_manager.cc",
-    "host/zwp_primary_selection_device_manager.h",
-    "host/zwp_primary_selection_offer.cc",
-    "host/zwp_primary_selection_offer.h",
     "host/shell_object_factory.cc",
     "host/shell_object_factory.h",
     "host/shell_popup_wrapper.cc",
@@ -99,6 +93,8 @@
     "host/wayland_input_method_context_factory.h",
     "host/wayland_keyboard.cc",
     "host/wayland_keyboard.h",
+    "host/wayland_menu_utils.cc",
+    "host/wayland_menu_utils.h",
     "host/wayland_output.cc",
     "host/wayland_output.h",
     "host/wayland_output_manager.cc",
@@ -138,6 +134,12 @@
     "host/xdg_popup_wrapper_impl.h",
     "host/xdg_surface_wrapper_impl.cc",
     "host/xdg_surface_wrapper_impl.h",
+    "host/zwp_primary_selection_device.cc",
+    "host/zwp_primary_selection_device.h",
+    "host/zwp_primary_selection_device_manager.cc",
+    "host/zwp_primary_selection_device_manager.h",
+    "host/zwp_primary_selection_offer.cc",
+    "host/zwp_primary_selection_offer.h",
     "host/zwp_text_input_wrapper.h",
     "host/zwp_text_input_wrapper_v1.cc",
     "host/zwp_text_input_wrapper_v1.h",
diff --git a/ui/ozone/platform/wayland/host/wayland_menu_utils.cc b/ui/ozone/platform/wayland/host/wayland_menu_utils.cc
new file mode 100644
index 0000000..8eed6ce
--- /dev/null
+++ b/ui/ozone/platform/wayland/host/wayland_menu_utils.cc
@@ -0,0 +1,23 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/ozone/platform/wayland/host/wayland_menu_utils.h"
+
+#include "ui/ozone/platform/wayland/host/wayland_connection.h"
+#include "ui/ozone/platform/wayland/host/wayland_event_source.h"
+
+namespace ui {
+
+WaylandMenuUtils::WaylandMenuUtils(WaylandConnection* connection)
+    : connection_(connection) {}
+
+WaylandMenuUtils::~WaylandMenuUtils() = default;
+
+int WaylandMenuUtils::GetCurrentKeyModifiers() const {
+  DCHECK(connection_);
+  DCHECK(connection_->event_source());
+  return connection_->event_source()->keyboard_modifiers();
+}
+
+}  // namespace ui
diff --git a/ui/ozone/platform/wayland/host/wayland_menu_utils.h b/ui/ozone/platform/wayland/host/wayland_menu_utils.h
new file mode 100644
index 0000000..c9a0bbaa
--- /dev/null
+++ b/ui/ozone/platform/wayland/host/wayland_menu_utils.h
@@ -0,0 +1,29 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_MENU_UTILS_H_
+#define UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_MENU_UTILS_H_
+
+#include "ui/ozone/public/platform_menu_utils.h"
+
+namespace ui {
+
+class WaylandConnection;
+
+class WaylandMenuUtils : public PlatformMenuUtils {
+ public:
+  explicit WaylandMenuUtils(WaylandConnection* connection);
+  WaylandMenuUtils(const WaylandMenuUtils&) = delete;
+  WaylandMenuUtils& operator=(const WaylandMenuUtils&) = delete;
+  ~WaylandMenuUtils() override;
+
+  int GetCurrentKeyModifiers() const override;
+
+ private:
+  WaylandConnection* const connection_;
+};
+
+}  // namespace ui
+
+#endif  // UI_OZONE_PLATFORM_WAYLAND_HOST_WAYLAND_MENU_UTILS_H_
diff --git a/ui/ozone/platform/wayland/ozone_platform_wayland.cc b/ui/ozone/platform/wayland/ozone_platform_wayland.cc
index e4968f1..9e14654 100644
--- a/ui/ozone/platform/wayland/ozone_platform_wayland.cc
+++ b/ui/ozone/platform/wayland/ozone_platform_wayland.cc
@@ -30,13 +30,14 @@
 #include "ui/ozone/platform/wayland/host/wayland_buffer_manager_connector.h"
 #include "ui/ozone/platform/wayland/host/wayland_buffer_manager_host.h"
 #include "ui/ozone/platform/wayland/host/wayland_connection.h"
-#include "ui/ozone/platform/wayland/host/wayland_event_source.h"
 #include "ui/ozone/platform/wayland/host/wayland_input_method_context_factory.h"
+#include "ui/ozone/platform/wayland/host/wayland_menu_utils.h"
 #include "ui/ozone/platform/wayland/host/wayland_output_manager.h"
 #include "ui/ozone/platform/wayland/host/wayland_window.h"
 #include "ui/ozone/public/gpu_platform_support_host.h"
 #include "ui/ozone/public/input_controller.h"
 #include "ui/ozone/public/ozone_platform.h"
+#include "ui/ozone/public/platform_menu_utils.h"
 #include "ui/ozone/public/system_input_injector.h"
 #include "ui/platform_window/platform_window_init_properties.h"
 
@@ -123,12 +124,6 @@
     return connection_->clipboard();
   }
 
-  int GetKeyModifiers() const override {
-    DCHECK(connection_);
-    DCHECK(connection_->event_source());
-    return connection_->event_source()->keyboard_modifiers();
-  }
-
   std::unique_ptr<InputMethod> CreateInputMethod(
       internal::InputMethodDelegate* delegate,
       gfx::AcceleratedWidget widget) override {
@@ -145,6 +140,10 @@
     return std::make_unique<InputMethodAuraLinux>(delegate);
   }
 
+  PlatformMenuUtils* GetPlatformMenuUtils() override {
+    return menu_utils_.get();
+  }
+
   bool IsNativePixmapConfigSupported(gfx::BufferFormat format,
                                      gfx::BufferUsage usage) const override {
     // If there is no drm render node device available, native pixmaps are not
@@ -189,6 +188,8 @@
     GtkUiDelegate::SetInstance(gtk_ui_delegate_.get());
 #endif
 
+    menu_utils_ = std::make_unique<WaylandMenuUtils>(connection_.get());
+
     // TODO(crbug.com/1097007): report which Wayland compositor is used.
   }
 
@@ -278,6 +279,7 @@
   std::unique_ptr<WaylandInputMethodContextFactory>
       input_method_context_factory_;
   std::unique_ptr<WaylandBufferManagerConnector> buffer_manager_connector_;
+  std::unique_ptr<WaylandMenuUtils> menu_utils_;
 
   // Objects, which solely live in the GPU process.
   std::unique_ptr<WaylandBufferManagerGpu> buffer_manager_;
diff --git a/ui/ozone/platform/wayland/ozone_platform_wayland.h b/ui/ozone/platform/wayland/ozone_platform_wayland.h
index 2eb802c..ca00bd4 100644
--- a/ui/ozone/platform/wayland/ozone_platform_wayland.h
+++ b/ui/ozone/platform/wayland/ozone_platform_wayland.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef UI_OZONE_PLATFORM_DRM_OZONE_PLATFORM_WAYLAND_H_
-#define UI_OZONE_PLATFORM_DRM_OZONE_PLATFORM_WAYLAND_H_
+#ifndef UI_OZONE_PLATFORM_OZONE_PLATFORM_WAYLAND_H_
+#define UI_OZONE_PLATFORM_OZONE_PLATFORM_WAYLAND_H_
 
 namespace ui {
 
@@ -14,4 +14,4 @@
 
 }  // namespace ui
 
-#endif  // UI_OZONE_PLATFORM_DRM_OZONE_PLATFORM_WAYLAND_H_
+#endif  // UI_OZONE_PLATFORM_OZONE_PLATFORM_WAYLAND_H_
diff --git a/ui/ozone/platform/x11/BUILD.gn b/ui/ozone/platform/x11/BUILD.gn
index e55210a7..31686b57 100644
--- a/ui/ozone/platform/x11/BUILD.gn
+++ b/ui/ozone/platform/x11/BUILD.gn
@@ -24,6 +24,8 @@
     "x11_canvas_surface.h",
     "x11_clipboard_ozone.cc",
     "x11_clipboard_ozone.h",
+    "x11_menu_utils.cc",
+    "x11_menu_utils.h",
     "x11_screen_ozone.cc",
     "x11_screen_ozone.h",
     "x11_surface_factory.cc",
diff --git a/ui/ozone/platform/x11/ozone_platform_x11.cc b/ui/ozone/platform/x11/ozone_platform_x11.cc
index 47e7edd6..70d581b 100644
--- a/ui/ozone/platform/x11/ozone_platform_x11.cc
+++ b/ui/ozone/platform/x11/ozone_platform_x11.cc
@@ -10,6 +10,7 @@
 #include "base/message_loop/message_pump_type.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/no_destructor.h"
+#include "base/strings/string16.h"
 #include "base/strings/utf_string_conversions.h"
 #include "build/build_config.h"
 #include "ui/base/buildflags.h"
@@ -24,12 +25,12 @@
 #include "ui/events/ozone/layout/keyboard_layout_engine_manager.h"
 #include "ui/events/ozone/layout/stub/stub_keyboard_layout_engine.h"
 #include "ui/events/platform/x11/x11_event_source.h"
-#include "ui/events/x/events_x_utils.h"
 #include "ui/gfx/native_widget_types.h"
 #include "ui/gfx/x/x11_types.h"
 #include "ui/ozone/common/stub_overlay_manager.h"
 #include "ui/ozone/platform/x11/gl_egl_utility_x11.h"
 #include "ui/ozone/platform/x11/x11_clipboard_ozone.h"
+#include "ui/ozone/platform/x11/x11_menu_utils.h"
 #include "ui/ozone/platform/x11/x11_screen_ozone.h"
 #include "ui/ozone/platform/x11/x11_surface_factory.h"
 #include "ui/ozone/public/gpu_platform_support_host.h"
@@ -125,8 +126,6 @@
     return gl_egl_utility_.get();
   }
 
-  int GetKeyModifiers() const override { return GetModifierKeyState(); }
-
   std::unique_ptr<InputMethod> CreateInputMethod(
       internal::InputMethodDelegate* delegate,
       gfx::AcceleratedWidget) override {
@@ -143,6 +142,10 @@
 #endif
   }
 
+  PlatformMenuUtils* GetPlatformMenuUtils() override {
+    return menu_utils_.get();
+  }
+
   std::unique_ptr<OSExchangeDataProvider> CreateProvider() override {
 #if defined(OS_CHROMEOS)
     return std::make_unique<OSExchangeDataProviderNonBacked>();
@@ -205,6 +208,8 @@
     GtkUiDelegate::SetInstance(gtk_ui_delegate_.get());
 #endif
 
+    menu_utils_ = std::make_unique<X11MenuUtils>();
+
     base::UmaHistogramEnumeration("Linux.WindowManager", GetWindowManagerUMA());
   }
 
@@ -269,6 +274,7 @@
   std::unique_ptr<X11ClipboardOzone> clipboard_;
   std::unique_ptr<CursorFactory> cursor_factory_;
   std::unique_ptr<GpuPlatformSupportHost> gpu_platform_support_host_;
+  std::unique_ptr<X11MenuUtils> menu_utils_;
 
   // Objects in the GPU process.
   std::unique_ptr<X11SurfaceFactory> surface_factory_ozone_;
diff --git a/ui/ozone/platform/x11/x11_menu_utils.cc b/ui/ozone/platform/x11/x11_menu_utils.cc
new file mode 100644
index 0000000..9633b73f3
--- /dev/null
+++ b/ui/ozone/platform/x11/x11_menu_utils.cc
@@ -0,0 +1,28 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/ozone/platform/x11/x11_menu_utils.h"
+
+#include "base/strings/utf_string_conversions.h"
+#include "ui/events/keycodes/keyboard_code_conversion_x.h"
+#include "ui/events/keycodes/keysym_to_unicode.h"
+#include "ui/events/x/events_x_utils.h"
+
+namespace ui {
+
+X11MenuUtils::X11MenuUtils() = default;
+
+X11MenuUtils::~X11MenuUtils() = default;
+
+int X11MenuUtils::GetCurrentKeyModifiers() const {
+  return GetModifierKeyState();
+}
+
+std::string X11MenuUtils::ToDBusKeySym(KeyboardCode code) const {
+  return base::UTF16ToUTF8(
+      base::string16(1, ui::GetUnicodeCharacterFromXKeySym(
+                            XKeysymForWindowsKeyCode(code, false))));
+}
+
+}  // namespace ui
diff --git a/ui/ozone/platform/x11/x11_menu_utils.h b/ui/ozone/platform/x11/x11_menu_utils.h
new file mode 100644
index 0000000..0e1b30e8
--- /dev/null
+++ b/ui/ozone/platform/x11/x11_menu_utils.h
@@ -0,0 +1,26 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_OZONE_PLATFORM_X11_X11_MENU_UTILS_H_
+#define UI_OZONE_PLATFORM_X11_X11_MENU_UTILS_H_
+
+#include "ui/ozone/public/platform_menu_utils.h"
+
+namespace ui {
+
+class X11MenuUtils : public PlatformMenuUtils {
+ public:
+  X11MenuUtils();
+  X11MenuUtils(const X11MenuUtils&) = delete;
+  X11MenuUtils& operator=(const X11MenuUtils&) = delete;
+  ~X11MenuUtils() override;
+
+  int GetCurrentKeyModifiers() const override;
+
+  std::string ToDBusKeySym(KeyboardCode code) const override;
+};
+
+}  // namespace ui
+
+#endif  // UI_OZONE_PLATFORM_X11_X11_MENU_UTILS_H_
diff --git a/ui/ozone/public/ozone_platform.cc b/ui/ozone/public/ozone_platform.cc
index bcc577c5..9561271 100644
--- a/ui/ozone/public/ozone_platform.cc
+++ b/ui/ozone/public/ozone_platform.cc
@@ -13,6 +13,7 @@
 #include "ui/events/devices/device_data_manager.h"
 #include "ui/ozone/platform_object.h"
 #include "ui/ozone/platform_selection.h"
+#include "ui/ozone/public/platform_menu_utils.h"
 #include "ui/ozone/public/platform_screen.h"
 
 namespace ui {
@@ -98,9 +99,8 @@
   return nullptr;
 }
 
-int OzonePlatform::GetKeyModifiers() const {
-  // Platform may override this to provide the current state of modifier keys.
-  return 0;
+PlatformMenuUtils* OzonePlatform::GetPlatformMenuUtils() {
+  return nullptr;
 }
 
 bool OzonePlatform::IsNativePixmapConfigSupported(
diff --git a/ui/ozone/public/ozone_platform.h b/ui/ozone/public/ozone_platform.h
index 764945e..7737507 100644
--- a/ui/ozone/public/ozone_platform.h
+++ b/ui/ozone/public/ozone_platform.h
@@ -24,14 +24,15 @@
 
 namespace ui {
 class CursorFactory;
-class InputController;
 class GpuPlatformSupportHost;
+class InputController;
 class OverlayManagerOzone;
+class PlatformClipboard;
+class PlatformGLEGLUtility;
+class PlatformMenuUtils;
 class PlatformScreen;
 class SurfaceFactoryOzone;
 class SystemInputInjector;
-class PlatformClipboard;
-class PlatformGLEGLUtility;
 
 namespace internal {
 class InputMethodDelegate;
@@ -188,10 +189,7 @@
       internal::InputMethodDelegate* delegate,
       gfx::AcceleratedWidget widget) = 0;
   virtual PlatformGLEGLUtility* GetPlatformGLEGLUtility();
-
-  // Returns a bitmask of EventFlags showing the state of Alt, Shift and Ctrl
-  // keys that came with the most recent UI event.
-  virtual int GetKeyModifiers() const;
+  virtual PlatformMenuUtils* GetPlatformMenuUtils();
 
   // Returns true if the specified buffer format is supported.
   virtual bool IsNativePixmapConfigSupported(gfx::BufferFormat format,
diff --git a/ui/ozone/public/platform_menu_utils.cc b/ui/ozone/public/platform_menu_utils.cc
new file mode 100644
index 0000000..cef955ec
--- /dev/null
+++ b/ui/ozone/public/platform_menu_utils.cc
@@ -0,0 +1,25 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/ozone/public/platform_menu_utils.h"
+
+#include "base/notreached.h"
+
+namespace ui {
+
+PlatformMenuUtils::PlatformMenuUtils() = default;
+
+PlatformMenuUtils::~PlatformMenuUtils() = default;
+
+int PlatformMenuUtils::GetCurrentKeyModifiers() const {
+  NOTIMPLEMENTED_LOG_ONCE();
+  return {};
+}
+
+std::string PlatformMenuUtils::ToDBusKeySym(KeyboardCode code) const {
+  NOTIMPLEMENTED_LOG_ONCE();
+  return {};
+}
+
+}  // namespace ui
diff --git a/ui/ozone/public/platform_menu_utils.h b/ui/ozone/public/platform_menu_utils.h
new file mode 100644
index 0000000..a082768
--- /dev/null
+++ b/ui/ozone/public/platform_menu_utils.h
@@ -0,0 +1,36 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_OZONE_PUBLIC_PLATFORM_MENU_UTILS_H_
+#define UI_OZONE_PUBLIC_PLATFORM_MENU_UTILS_H_
+
+#include <string>
+
+#include "base/component_export.h"
+#include "ui/events/keycodes/keyboard_codes_posix.h"
+
+namespace ui {
+
+enum class DomCode;
+
+// Platform-specific functions related to menus.
+class COMPONENT_EXPORT(OZONE_BASE) PlatformMenuUtils {
+ public:
+  PlatformMenuUtils();
+  PlatformMenuUtils(const PlatformMenuUtils&) = delete;
+  PlatformMenuUtils& operator=(const PlatformMenuUtils&) = delete;
+  virtual ~PlatformMenuUtils();
+
+  // Returns a bitmask of EventFlags showing the state of Alt, Shift and Ctrl
+  // keys that came with the most recent UI event.
+  virtual int GetCurrentKeyModifiers() const;
+
+  // Converts the keyboard code into a keysym label compatible with DBus menu
+  // protocol.
+  virtual std::string ToDBusKeySym(KeyboardCode code) const;
+};
+
+}  // namespace ui
+
+#endif  // UI_OZONE_PUBLIC_PLATFORM_MENU_UTILS_H_
diff --git a/ui/views/controls/menu/menu_runner_impl.cc b/ui/views/controls/menu/menu_runner_impl.cc
index a350498..b06b4c9 100644
--- a/ui/views/controls/menu/menu_runner_impl.cc
+++ b/ui/views/controls/menu/menu_runner_impl.cc
@@ -31,6 +31,7 @@
 #include "ui/base/ui_base_features.h"
 #include "ui/events/event_constants.h"
 #include "ui/ozone/public/ozone_platform.h"
+#include "ui/ozone/public/platform_menu_utils.h"
 #endif
 
 namespace views {
@@ -54,8 +55,11 @@
 bool IsAltPressed() {
 #if defined(USE_OZONE)
   if (features::IsUsingOzonePlatform()) {
-    return (ui::OzonePlatform::GetInstance()->GetKeyModifiers() &
-            ui::EF_ALT_DOWN) != 0;
+    const auto* const platorm_menu_utils =
+        ui::OzonePlatform::GetInstance()->GetPlatformMenuUtils();
+    if (platorm_menu_utils)
+      return (platorm_menu_utils->GetCurrentKeyModifiers() & ui::EF_ALT_DOWN) !=
+             0;
   }
 #endif
 #if defined(USE_X11)
diff --git a/ui/views/widget/desktop_aura/x11_topmost_window_finder_interactive_uitest.cc b/ui/views/widget/desktop_aura/x11_topmost_window_finder_interactive_uitest.cc
index 6d96811..515cf7b 100644
--- a/ui/views/widget/desktop_aura/x11_topmost_window_finder_interactive_uitest.cc
+++ b/ui/views/widget/desktop_aura/x11_topmost_window_finder_interactive_uitest.cc
@@ -11,6 +11,7 @@
 #include <vector>
 
 #include "base/stl_util.h"
+#include "build/build_config.h"
 #include "third_party/skia/include/core/SkRect.h"
 #include "ui/aura/window.h"
 #include "ui/aura/window_tree_host.h"
@@ -378,7 +379,13 @@
 }
 
 // Test that setting a Null shape removes the shape.
-TEST_F(X11TopmostWindowFinderTest, NonRectangularNullShape) {
+// crbug.com/955316: flaky on Linux
+#if defined(OS_LINUX)
+#define MAYBE_NonRectangularNullShape DISABLED_NonRectangularNullShape
+#else
+#define MAYBE_NonRectangularNullShape NonRectangularNullShape
+#endif
+TEST_F(X11TopmostWindowFinderTest, MAYBE_NonRectangularNullShape) {
   if (!ui::IsShapeExtensionAvailable())
     return;
 
diff --git a/ui/webui/resources/tools/generate_grd.py b/ui/webui/resources/tools/generate_grd.py
index 59d2a96..8a70741 100644
--- a/ui/webui/resources/tools/generate_grd.py
+++ b/ui/webui/resources/tools/generate_grd.py
@@ -57,7 +57,8 @@
 
 GRD_INCLUDE_TEMPLATE = '      <include name="{name}" ' \
                        'file="${{root_gen_dir}}/{path_from_gen}" ' \
-                       'use_base_dir="false" type="BINDATA" />\n'
+                       'resource_path="{path}" use_base_dir="false" ' \
+                       'type="BINDATA" />\n'
 
 GRD_END_TEMPLATE = '    </includes>\n'\
                    '  </release>\n'\
@@ -85,6 +86,7 @@
         filepath = os.path.join(base_dir, filename).replace('\\', '/')
         rebased_path = os.path.relpath(filepath, args.root_gen_dir)
         grd_file.write(GRD_INCLUDE_TEMPLATE.format(name=name,
+                                                   path=filename,
                                                    path_from_gen=rebased_path))
 
   grd_file.write(GRD_END_TEMPLATE)
diff --git a/ui/webui/resources/tools/tests/expected_grd.grd b/ui/webui/resources/tools/tests/expected_grd.grd
index 97c0a35..ea0e2642 100644
--- a/ui/webui/resources/tools/tests/expected_grd.grd
+++ b/ui/webui/resources/tools/tests/expected_grd.grd
@@ -12,12 +12,12 @@
   </outputs>
   <release seq="1">
     <includes>
-      <include name="IDR_TEST_TEST_HTML" file="${root_gen_dir}/preprocessed/test.html" use_base_dir="false" type="BINDATA" />
-      <include name="IDR_TEST_TEST_JS" file="${root_gen_dir}/preprocessed/test.js" use_base_dir="false" type="BINDATA" />
-      <include name="IDR_TEST_DIR_ELEMENT_IN_DIR_JS" file="${root_gen_dir}/preprocessed/dir/element_in_dir.js" use_base_dir="false" type="BINDATA" />
-      <include name="IDR_TEST_TEST_UI_JS" file="${root_gen_dir}/preprocessed/test_ui.js" use_base_dir="false" type="BINDATA" />
-      <include name="IDR_TEST_TEST_PROXY_JS" file="${root_gen_dir}/preprocessed/test_proxy.js" use_base_dir="false" type="BINDATA" />
-      <include name="IDR_TEST_DIR_ANOTHER_ELEMENT_IN_DIR_JS" file="${root_gen_dir}/preprocessed/dir/another_element_in_dir.js" use_base_dir="false" type="BINDATA" />
+      <include name="IDR_TEST_TEST_HTML" file="${root_gen_dir}/preprocessed/test.html" resource_path="test.html" use_base_dir="false" type="BINDATA" />
+      <include name="IDR_TEST_TEST_JS" file="${root_gen_dir}/preprocessed/test.js" resource_path="test.js" use_base_dir="false" type="BINDATA" />
+      <include name="IDR_TEST_DIR_ELEMENT_IN_DIR_JS" file="${root_gen_dir}/preprocessed/dir/element_in_dir.js" resource_path="dir/element_in_dir.js" use_base_dir="false" type="BINDATA" />
+      <include name="IDR_TEST_TEST_UI_JS" file="${root_gen_dir}/preprocessed/test_ui.js" resource_path="test_ui.js" use_base_dir="false" type="BINDATA" />
+      <include name="IDR_TEST_TEST_PROXY_JS" file="${root_gen_dir}/preprocessed/test_proxy.js" resource_path="test_proxy.js" use_base_dir="false" type="BINDATA" />
+      <include name="IDR_TEST_DIR_ANOTHER_ELEMENT_IN_DIR_JS" file="${root_gen_dir}/preprocessed/dir/another_element_in_dir.js" resource_path="dir/another_element_in_dir.js" use_base_dir="false" type="BINDATA" />
     </includes>
   </release>
 </grit>