diff --git a/DEPS b/DEPS
index 3d318f4b..db06dff 100644
--- a/DEPS
+++ b/DEPS
@@ -177,7 +177,7 @@
   # luci-go CIPD package version.
   # Make sure the revision is uploaded by infra-packagers builder.
   # https://ci.chromium.org/p/infra-internal/g/infra-packagers/console
-  'luci_go': 'git_revision:66f9c8541b85c7f6efc63e75e68d660d4fb30752',
+  'luci_go': 'git_revision:91769f0e2541d15de294dfc780205e98b49f7431',
 
   # This can be overridden, e.g. with custom_vars, to build clang from HEAD
   # instead of downloading the prebuilt pinned revision.
@@ -209,7 +209,7 @@
   # 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': '686dd910dd6cf93f2389980948464e49725a8bd7',
+  'skia_revision': '6100cd8c1aa0779f133c6067a40c1749e6c9b5a4',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
@@ -221,7 +221,7 @@
   # 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': 'd469dcb14189618088f344e5e8c14b836f11d259',
+  'angle_revision': '78fb9314e71bb0a51ba018ae3d8bae774f74ba9c',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling SwiftShader
   # and whatever else without interference from each other.
@@ -288,7 +288,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling devtools-frontend
   # and whatever else without interference from each other.
-  'devtools_frontend_revision': 'a123fcafd9112384c0001f68314c041270c11357',
+  'devtools_frontend_revision': 'b7b6d993d87f25972a1ab1aa7274377782ef4e47',
   # 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.
@@ -643,7 +643,7 @@
       'packages': [
         {
           'package': 'chromium/rts/model/linux-amd64',
-          'version': 'p0ewBQmfANIplrphEq2-2uHvF_8dnhDKvudlL_OKSXkC',
+          'version': 'WeiEp0njpTiO-7-MBnxQLtPCtQ5Bt_WMCYJhWXLz5YwC',
         },
       ],
       'dep_type': 'cipd',
@@ -654,7 +654,7 @@
       'packages': [
         {
           'package': 'chromium/rts/model/mac-amd64',
-          'version': 'grmbjC5ErnSRCMgWWEFAI9Vt4O2_yXt2gTFtKWOK83UC',
+          'version': 'UOQKgrp8FuQYuWnLupsppa9l_L_D0pmgUQDJb8lIxmQC',
         },
       ],
       'dep_type': 'cipd',
@@ -665,7 +665,7 @@
       'packages': [
         {
           'package': 'chromium/rts/model/windows-amd64',
-          'version': '0ha7qFkY9xSWjRtk6F7eLYfHOEFOsBuga8buY-2KSTAC',
+          'version': 'RPtJGpZ98nibL9TOY32pHPKGru3rWd6SrRf70cv0zzUC',
         },
       ],
       'dep_type': 'cipd',
@@ -966,7 +966,7 @@
   },
 
   'src/third_party/depot_tools':
-    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + 'b865acd3f2d8cd305f87215154351620354d075f',
+    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '1039f6ca14dda6ff3f145bbcd38db643665cd43e',
 
   'src/third_party/devtools-frontend/src':
     Var('chromium_git') + '/devtools/devtools-frontend' + '@' + Var('devtools_frontend_revision'),
@@ -1563,7 +1563,7 @@
     Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + '239db71432f4e4fe1f6192a7d54717701ef84f66',
 
   'src/third_party/webrtc':
-    Var('webrtc_git') + '/src.git' + '@' + '4a679eb0c036aa4aa5ad526fb0da0048354af31b',
+    Var('webrtc_git') + '/src.git' + '@' + 'c6fb22f9d339fc9c3844885844b4a822e77447de',
 
   'src/third_party/libgifcodec':
      Var('skia_git') + '/libgifcodec' + '@'+  Var('libgifcodec_revision'),
@@ -1624,7 +1624,7 @@
     Var('chromium_git') + '/v8/v8.git' + '@' +  Var('v8_revision'),
 
   'src-internal': {
-    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@9bc808f1b38cc73a50c73817de0bab618457f7b4',
+    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@88e8ade584e962502de1cd77bad4129ffb076e21',
     'condition': 'checkout_src_internal',
   },
 
@@ -1654,7 +1654,7 @@
     'packages': [
       {
         'package': 'chromeos_internal/apps/media_app/app',
-        'version': 'pRy6lrIQ69T7xPXPZWt4GPh_xJw7Lvzfm6tmlff59kIC',
+        'version': 'DUD6k164J3aIsNbH_tUj2bHh7b_z4GkBKJyD4E5h0EAC',
       },
     ],
     'condition': 'checkout_chromeos and checkout_src_internal',
diff --git a/ash/constants/ash_features.cc b/ash/constants/ash_features.cc
index 06c7df8..03aad08 100644
--- a/ash/constants/ash_features.cc
+++ b/ash/constants/ash_features.cc
@@ -430,7 +430,7 @@
 
 // Enables the Discover Tab in the help app.
 const base::Feature kHelpAppDiscoverTab{"HelpAppDiscoverTab",
-                                        base::FEATURE_DISABLED_BY_DEFAULT};
+                                        base::FEATURE_ENABLED_BY_DEFAULT};
 
 // Enable showing search results from the help app in the launcher.
 const base::Feature kHelpAppLauncherSearch{"HelpAppLauncherSearch",
diff --git a/ash/strings/ash_strings_iw.xtb b/ash/strings/ash_strings_iw.xtb
index 3ca59f0..507f79b 100644
--- a/ash/strings/ash_strings_iw.xtb
+++ b/ash/strings/ash_strings_iw.xtb
@@ -21,6 +21,7 @@
 <translation id="1104621072296271835">ביחד, המכשירים שלך יוכלו לעבוד עוד יותר טוב</translation>
 <translation id="1119348796022671382">במצב 'צבעים מעוצבים' נעשה שימוש בצבעים שנשלפים מהטפט שלך להוספת קצת צבע לממשק.</translation>
 <translation id="112308213915226829">הסתרה אוטומטית של המדף</translation>
+<translation id="1148499908455722006">פתיחת תיבת דו-שיח עם מידע על <ph name="USER_NAME" /></translation>
 <translation id="1153356358378277386">מכשירים מותאמים</translation>
 <translation id="1165712434476988950">יש להפעיל מחדש את המכשיר כדי להחיל את העדכון.</translation>
 <translation id="1175572348579024023">גלילה</translation>
@@ -437,7 +438,9 @@
 <translation id="4577274620589681794">הזמן נגמר · <ph name="LABEL" /></translation>
 <translation id="4577990005084629481">צפייה בתצוגות מקדימות</translation>
 <translation id="4578906031062871102">תפריט ההגדרות נפתח</translation>
+<translation id="4581047786858252841">המיקרופון פועל</translation>
 <translation id="4585337515783392668">הפסקת העברה במכשיר לא מוכר</translation>
+<translation id="4587299710837179226">המיקרופון כבוי</translation>
 <translation id="4596144739579517758">עיצוב כהה כבוי.</translation>
 <translation id="4611292653554630842">התחבר</translation>
 <translation id="4623167406982293031">יש לאמת את החשבון</translation>
@@ -569,6 +572,7 @@
 <translation id="5777841717266010279">להפסיק את שיתוף המסך?</translation>
 <translation id="5779721926447984944">קבצים מוצמדים</translation>
 <translation id="5790085346892983794">הצלחה</translation>
+<translation id="5805809050170488595">יש ללחוץ כדי להפעיל את <ph name="NETWORK_NAME" /></translation>
 <translation id="5820394555380036790">‏מערכת ההפעלה של Chromium</translation>
 <translation id="5825969630400862129">הגדרות של מכשירים מחוברים</translation>
 <translation id="5837036133683224804">הפסקת <ph name="ROUTE_TITLE" /> במכשיר <ph name="RECEIVER_NAME" /></translation>
diff --git a/ash/strings/ash_strings_uz.xtb b/ash/strings/ash_strings_uz.xtb
index 7712108..e43aacf 100644
--- a/ash/strings/ash_strings_uz.xtb
+++ b/ash/strings/ash_strings_uz.xtb
@@ -140,6 +140,7 @@
 <translation id="2079504693865562705">Ilovalar ishga tushirish panelida chiqmasin</translation>
 <translation id="2083190527011054446">Xayrli tun, <ph name="GIVEN_NAME" /></translation>
 <translation id="209965399369889474">Tarmoqqa ulanmagan</translation>
+<translation id="2108303511227308752">Alt + Backspace tezkor tugmasi oʻzgardi. Delete tugmasidan foydalanish uchun <ph name="LAUNCHER_KEY_NAME" /> tugmasi + Backspace tugmasini bosing.</translation>
 <translation id="2126242104232412123">Yangi ish stoli</translation>
 <translation id="2127372758936585790">Kam quvvatli zaryadlovchi vosita</translation>
 <translation id="2132302418721800944">Butun ekranni yozib olish</translation>
@@ -367,6 +368,7 @@
 <translation id="4021716437419160885">Pastga tushish</translation>
 <translation id="4028481283645788203">Xavfsizlikni oshirish uchun parol kiriting</translation>
 <translation id="4032485810211612751"><ph name="HOURS" />:<ph name="MINUTES" />:<ph name="SECONDS" /></translation>
+<translation id="403337028234783023"><ph name="LAUNCHER_KEY_NAME" /> + Raqam tezkor tugmasi oʻzgardi. Funksiya tugmalaridan foydalanish uchun <ph name="LAUNCHER_KEY_NAME" /> tugmasi + yuqori qatordagi kalitni bosing.</translation>
 <translation id="4042660782729322247">Ekraningiz namoyish qilinmoqda</translation>
 <translation id="4057003836560082631">Brauzerdagi <ph name="INDEX" />-varaq, jami <ph name="TOTAL_COUNT" /> ta. <ph name="SITE_TITLE" />, <ph name="SITE_URL" /></translation>
 <translation id="4065525899979931964">{NUM_APPS,plural, =1{Yoqilmagan, 1 ta ilova}other{Yoqilmagan, # ta ilova}}</translation>
@@ -392,6 +394,7 @@
 <translation id="425364040945105958">SIM kartasiz</translation>
 <translation id="4261870227682513959">Bildirishnoma sozlamalarini ochish. Bildirishnomalar yoqilmagan</translation>
 <translation id="4269883910223712419">Bu qurilma administratorining vakolatlari:</translation>
+<translation id="4274537685965975248">Ctrl + Alt + Pastga strelka tezkor tugmasi oʻzgardi. End tugmasidan foydalanish uchun <ph name="LAUNCHER_KEY_NAME" /> tugmasi + Oʻngga strelkani bosing.</translation>
 <translation id="4279490309300973883">Ekran nusxasini boshqa ekranga uzatish</translation>
 <translation id="4285498937028063278">Olib tashlash</translation>
 <translation id="4294319844246081198">Xayrli tong, <ph name="GIVEN_NAME" /></translation>
@@ -400,6 +403,7 @@
 <translation id="4303223480529385476">Holat panelini yoyish</translation>
 <translation id="4321179778687042513">ctrl</translation>
 <translation id="4321776623976362024">Yuqori kontrastli rejim tezkor havolasini bosdingiz. Ishga tushirilsinmi?</translation>
+<translation id="4322742403972824594">Ctrl + Alt + Tepaga strelka tezkor tugmasi oʻzgardi. Home tugmasidan foydalanish uchun <ph name="LAUNCHER_KEY_NAME" /> tugmasi + Chapga strelkani bosing.</translation>
 <translation id="4331809312908958774">Chrome OS</translation>
 <translation id="4333628967105022692">Bir nechta foydalanuvchi hisobiga kirganida Lacros ishlamaydi.</translation>
 <translation id="4338109981321384717">Lupa</translation>
@@ -417,6 +421,7 @@
 <translation id="4445159312344259901">Ochish uchun hisobga kiring</translation>
 <translation id="4449692009715125625">{NUM_NOTIFICATIONS,plural, =1{1 ta muhim bildirishnoma}other{# ta muhim bildirishnoma}}</translation>
 <translation id="4450893287417543264">Boshqa ko‘rsatilmasin</translation>
+<translation id="4451374464530248585">Alt + Pastga strelka tezkor tugmasi oʻzgardi. Page Down tugmasidan foydalanish uchun <ph name="LAUNCHER_KEY_NAME" /> tugmasi + Pastga strelkani bosing.</translation>
 <translation id="445864333228800152">Xayrli kech,</translation>
 <translation id="4458688154122353284">Ekranni yozib olishni toʻxtatish</translation>
 <translation id="4472575034687746823">Boshlash</translation>
@@ -708,6 +713,7 @@
 <translation id="6919251195245069855">Smart kartangiz aniqlanmadi. Qayta urining.</translation>
 <translation id="6945221475159498467">Tanlash</translation>
 <translation id="6961121602502368900">Telefon ish profilida sukut qilinmaydi</translation>
+<translation id="6961840794482373852">Alt + Tepaga strelka tezkor tugmasi oʻzgardi. Page Up tugmasidan foydalanish uchun <ph name="LAUNCHER_KEY_NAME" /> tugmasi + Tepaga strelkani bosing.</translation>
 <translation id="6965382102122355670">OK</translation>
 <translation id="6972754398087986839">Boshlash</translation>
 <translation id="6981982820502123353">Qulayliklar</translation>
diff --git a/base/allocator/partition_allocator/memory_reclaimer_unittest.cc b/base/allocator/partition_allocator/memory_reclaimer_unittest.cc
index f9b146b..21ac66c 100644
--- a/base/allocator/partition_allocator/memory_reclaimer_unittest.cc
+++ b/base/allocator/partition_allocator/memory_reclaimer_unittest.cc
@@ -115,8 +115,11 @@
   }
 }
 
+// ThreadCache tests disabled  when ENABLE_RUNTIME_BACKUP_REF_PTR_CONTROL is
+// enabled, because the "original" PartitionRoot has ThreadCache disabled.
 #if BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) && \
-    defined(PA_THREAD_CACHE_SUPPORTED)
+    defined(PA_THREAD_CACHE_SUPPORTED) &&       \
+    !BUILDFLAG(ENABLE_RUNTIME_BACKUP_REF_PTR_CONTROL)
 
 namespace {
 // malloc() / free() pairs can be removed by the compiler, this is enough (for
@@ -155,7 +158,8 @@
 }
 
 #endif  // BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) && \
-        // defined(PA_THREAD_CACHE_SUPPORTED)
+        // defined(PA_THREAD_CACHE_SUPPORTED) && \
+        // !BUILDFLAG(ENABLE_RUNTIME_BACKUP_REF_PTR_CONTROL)
 
 }  // namespace base
 #endif  // !defined(MEMORY_TOOL_REPLACES_ALLOCATOR)
diff --git a/base/process/process_fuchsia.cc b/base/process/process_fuchsia.cc
index 1136fe6..c50fac6 100644
--- a/base/process/process_fuchsia.cc
+++ b/base/process/process_fuchsia.cc
@@ -177,9 +177,22 @@
 }
 
 Time Process::CreationTime() const {
-  // TODO(https://crbug.com/726484): There is no syscall providing this data.
-  NOTIMPLEMENTED();
-  return Time();
+  zx_info_process_v2_t proc_info;
+  zx_status_t status =
+      zx_object_get_info(Handle(), ZX_INFO_PROCESS_V2, &proc_info,
+                         sizeof(proc_info), nullptr, nullptr);
+  if (status != ZX_OK) {
+    ZX_DLOG(ERROR, status) << "zx_process_get_info";
+    return Time();
+  }
+  if ((proc_info.flags & ZX_INFO_PROCESS_FLAG_STARTED) == 0) {
+    DLOG(WARNING) << "zx_process_get_info: Not started.";
+    return Time();
+  }
+  // Process creation times are expressed in ticks since system boot, so
+  // perform a best-effort translation from that to UTC "wall-clock" time.
+  return Time::Now() +
+         (TimeTicks::FromZxTime(proc_info.start_time) - TimeTicks::Now());
 }
 
 bool Process::is_current() const {
@@ -231,20 +244,20 @@
     internal::AssertBaseSyncPrimitivesAllowed();
   }
 
-  zx_time_t deadline = timeout == TimeDelta::Max()
-                           ? ZX_TIME_INFINITE
-                           : (TimeTicks::Now() + timeout).ToZxTime();
+  zx::time deadline = timeout == TimeDelta::Max()
+                          ? zx::time::infinite()
+                          : zx::time((TimeTicks::Now() + timeout).ToZxTime());
   zx_signals_t signals_observed = 0;
-  zx_status_t status = zx_object_wait_one(process_.get(), ZX_TASK_TERMINATED,
-                                          deadline, &signals_observed);
+  zx_status_t status =
+      process_.wait_one(ZX_TASK_TERMINATED, deadline, &signals_observed);
   if (status != ZX_OK) {
     ZX_DLOG(ERROR, status) << "zx_object_wait_one";
     return false;
   }
 
   zx_info_process_v2_t proc_info;
-  status = zx_object_get_info(process_.get(), ZX_INFO_PROCESS_V2, &proc_info,
-                              sizeof(proc_info), nullptr, nullptr);
+  status = process_.get_info(ZX_INFO_PROCESS_V2, &proc_info, sizeof(proc_info),
+                             nullptr, nullptr);
   if (status != ZX_OK) {
     ZX_DLOG(ERROR, status) << "zx_object_get_info";
     if (exit_code)
diff --git a/base/process/process_unittest.cc b/base/process/process_unittest.cc
index 92aa05d..2c7c515 100644
--- a/base/process/process_unittest.cc
+++ b/base/process/process_unittest.cc
@@ -124,7 +124,6 @@
 
 // TODO(https://crbug.com/726484): Enable these tests on Fuchsia when
 // CreationTime() is implemented.
-#if !defined(OS_FUCHSIA)
 TEST_F(ProcessTest, CreationTimeCurrentProcess) {
   // The current process creation time should be less than or equal to the
   // current time.
@@ -149,8 +148,8 @@
       // Time::Now() is a combination of system clock and
       // QueryPerformanceCounter(). Tolerate 100 ms for the clock mismatch.
       TimeDelta::FromMilliseconds(100);
-#elif defined(OS_APPLE)
-      // On Mac, process creation time should be very precise.
+#elif defined(OS_APPLE) || defined(OS_FUCHSIA)
+      // On Mac and Fuchsia, process creation time should be very precise.
       TimeDelta::FromMilliseconds(0);
 #else
 #error Unsupported platform
@@ -164,7 +163,6 @@
   EXPECT_TRUE(process.Terminate(kDummyExitCode, true));
 }
 #endif  // !defined(OS_ANDROID)
-#endif  // !defined(OS_FUCHSIA)
 
 TEST_F(ProcessTest, Terminate) {
   Process process(SpawnChild("SleepyChildProcess"));
diff --git a/base/task/thread_pool/worker_thread_unittest.cc b/base/task/thread_pool/worker_thread_unittest.cc
index bfae6ed..67ea74f 100644
--- a/base/task/thread_pool/worker_thread_unittest.cc
+++ b/base/task/thread_pool/worker_thread_unittest.cc
@@ -837,8 +837,11 @@
   Mock::VerifyAndClear(&observer);
 }
 
+// ThreadCache tests disabled  when ENABLE_RUNTIME_BACKUP_REF_PTR_CONTROL is
+// enabled, because the "original" PartitionRoot has ThreadCache disabled.
 #if BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) && \
-    defined(PA_THREAD_CACHE_SUPPORTED)
+    defined(PA_THREAD_CACHE_SUPPORTED) &&       \
+    !BUILDFLAG(ENABLE_RUNTIME_BACKUP_REF_PTR_CONTROL)
 namespace {
 NOINLINE void FreeForTest(void* data) {
   free(data);
@@ -900,7 +903,8 @@
 }
 
 #endif  // BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) &&
-        // defined(PA_THREAD_CACHE_SUPPORTED)
+        // defined(PA_THREAD_CACHE_SUPPORTED) &&
+        // !BUILDFLAG(ENABLE_RUNTIME_BACKUP_REF_PTR_CONTROL)
 
 }  // namespace internal
 }  // namespace base
diff --git a/base/test/launcher/test_results_tracker.cc b/base/test/launcher/test_results_tracker.cc
index 68c9889e..647995e 100644
--- a/base/test/launcher/test_results_tracker.cc
+++ b/base/test/launcher/test_results_tracker.cc
@@ -379,65 +379,64 @@
 bool TestResultsTracker::SaveSummaryAsJSON(
     const FilePath& path,
     const std::vector<std::string>& additional_tags) const {
-  std::unique_ptr<DictionaryValue> summary_root(new DictionaryValue);
+  Value summary_root(Value::Type::DICTIONARY);
 
-  std::unique_ptr<ListValue> global_tags(new ListValue);
+  std::vector<Value> global_tags;
   for (const auto& global_tag : global_tags_) {
-    global_tags->AppendString(global_tag);
+    global_tags.emplace_back(global_tag);
   }
   for (const auto& tag : additional_tags) {
-    global_tags->AppendString(tag);
+    global_tags.emplace_back(tag);
   }
-  summary_root->Set("global_tags", std::move(global_tags));
+  summary_root.SetKey("global_tags", Value(std::move(global_tags)));
 
-  std::unique_ptr<ListValue> all_tests(new ListValue);
+  std::vector<Value> all_tests;
   for (const auto& test : all_tests_) {
-    all_tests->AppendString(test);
+    all_tests.emplace_back(test);
   }
-  summary_root->Set("all_tests", std::move(all_tests));
+  summary_root.SetKey("all_tests", Value(std::move(all_tests)));
 
-  std::unique_ptr<ListValue> disabled_tests(new ListValue);
+  std::vector<Value> disabled_tests;
   for (const auto& disabled_test : disabled_tests_) {
-    disabled_tests->AppendString(disabled_test);
+    disabled_tests.emplace_back(disabled_test);
   }
-  summary_root->Set("disabled_tests", std::move(disabled_tests));
+  summary_root.SetKey("disabled_tests", Value(std::move(disabled_tests)));
 
-  std::unique_ptr<ListValue> per_iteration_data(new ListValue);
+  std::vector<Value> per_iteration_data;
 
   // Even if we haven't run any tests, we still have the dummy iteration.
   int max_iteration = iteration_ < 0 ? 0 : iteration_;
 
   for (int i = 0; i <= max_iteration; i++) {
-    std::unique_ptr<DictionaryValue> current_iteration_data(
-        new DictionaryValue);
+    Value current_iteration_data(Value::Type::DICTIONARY);
 
     for (const auto& j : per_iteration_data_[i].results) {
-      std::unique_ptr<ListValue> test_results(new ListValue);
+      std::vector<Value> test_results;
 
       for (size_t k = 0; k < j.second.test_results.size(); k++) {
         const TestResult& test_result = j.second.test_results[k];
 
-        std::unique_ptr<DictionaryValue> test_result_value(new DictionaryValue);
+        Value test_result_value(Value::Type::DICTIONARY);
 
-        test_result_value->SetStringKey("status", test_result.StatusAsString());
-        test_result_value->SetInteger(
+        test_result_value.SetStringKey("status", test_result.StatusAsString());
+        test_result_value.SetIntKey(
             "elapsed_time_ms",
             static_cast<int>(test_result.elapsed_time.InMilliseconds()));
 
         bool lossless_snippet = false;
         if (IsStringUTF8(test_result.output_snippet)) {
-          test_result_value->SetString(
-              "output_snippet", test_result.output_snippet);
+          test_result_value.SetStringKey("output_snippet",
+                                         test_result.output_snippet);
           lossless_snippet = true;
         } else {
-          test_result_value->SetString(
+          test_result_value.SetStringKey(
               "output_snippet",
               "<non-UTF-8 snippet, see output_snippet_base64>");
         }
 
         // TODO(phajdan.jr): Fix typo in JSON key (losless -> lossless)
         // making sure not to break any consumers of this data.
-        test_result_value->SetBoolKey("losless_snippet", lossless_snippet);
+        test_result_value.SetBoolKey("losless_snippet", lossless_snippet);
 
         // Also include the raw version (base64-encoded so that it can be safely
         // JSON-serialized - there are no guarantees about character encoding
@@ -445,80 +444,81 @@
         // debugging a test failure related to character encoding.
         std::string base64_output_snippet;
         Base64Encode(test_result.output_snippet, &base64_output_snippet);
-        test_result_value->SetStringKey("output_snippet_base64",
-                                        base64_output_snippet);
+        test_result_value.SetStringKey("output_snippet_base64",
+                                       base64_output_snippet);
         if (!test_result.links.empty()) {
-          auto links = std::make_unique<DictionaryValue>();
+          Value links(Value::Type::DICTIONARY);
           for (const auto& link : test_result.links) {
-            auto link_info = std::make_unique<DictionaryValue>();
-            link_info->SetStringKey("content", link.second);
-            links->Set(link.first, std::move(link_info));
+            Value link_info(Value::Type::DICTIONARY);
+            link_info.SetStringKey("content", link.second);
+            links.SetPath(link.first, std::move(link_info));
           }
-          test_result_value->Set("links", std::move(links));
+          test_result_value.SetKey("links", std::move(links));
         }
-        auto test_result_parts = std::make_unique<ListValue>();
+
+        std::vector<Value> test_result_parts;
         for (const TestResultPart& result_part :
              test_result.test_result_parts) {
-          std::unique_ptr<DictionaryValue> result_part_value(
-              new DictionaryValue);
-          result_part_value->SetStringKey("type", result_part.TypeAsString());
-          result_part_value->SetStringKey("file", result_part.file_name);
-          result_part_value->SetIntKey("line", result_part.line_number);
+          Value result_part_value(Value::Type::DICTIONARY);
+
+          result_part_value.SetStringKey("type", result_part.TypeAsString());
+          result_part_value.SetStringKey("file", result_part.file_name);
+          result_part_value.SetIntKey("line", result_part.line_number);
 
           bool lossless_summary = IsStringUTF8(result_part.summary);
           if (lossless_summary) {
-            result_part_value->SetStringKey("summary", result_part.summary);
+            result_part_value.SetStringKey("summary", result_part.summary);
           } else {
-            result_part_value->SetString(
+            result_part_value.SetStringKey(
                 "summary", "<non-UTF-8 snippet, see summary_base64>");
           }
-          result_part_value->SetBoolKey("lossless_summary", lossless_summary);
+          result_part_value.SetBoolKey("lossless_summary", lossless_summary);
 
           std::string encoded_summary;
           Base64Encode(result_part.summary, &encoded_summary);
-          result_part_value->SetStringKey("summary_base64", encoded_summary);
+          result_part_value.SetStringKey("summary_base64", encoded_summary);
 
           bool lossless_message = IsStringUTF8(result_part.message);
           if (lossless_message) {
-            result_part_value->SetStringKey("message", result_part.message);
+            result_part_value.SetStringKey("message", result_part.message);
           } else {
-            result_part_value->SetString(
+            result_part_value.SetStringKey(
                 "message", "<non-UTF-8 snippet, see message_base64>");
           }
-          result_part_value->SetBoolKey("lossless_message", lossless_message);
+          result_part_value.SetBoolKey("lossless_message", lossless_message);
 
           std::string encoded_message;
           Base64Encode(result_part.message, &encoded_message);
-          result_part_value->SetStringKey("message_base64", encoded_message);
+          result_part_value.SetStringKey("message_base64", encoded_message);
 
-          test_result_parts->Append(std::move(result_part_value));
+          test_result_parts.push_back(std::move(result_part_value));
         }
-        test_result_value->Set("result_parts", std::move(test_result_parts));
+        test_result_value.SetKey("result_parts",
+                                 Value(std::move(test_result_parts)));
 
-        test_results->Append(std::move(test_result_value));
+        test_results.push_back(std::move(test_result_value));
       }
 
-      current_iteration_data->SetWithoutPathExpansion(j.first,
-                                                      std::move(test_results));
+      current_iteration_data.SetKey(j.first, Value(std::move(test_results)));
     }
-    per_iteration_data->Append(std::move(current_iteration_data));
+    per_iteration_data.push_back(std::move(current_iteration_data));
   }
-  summary_root->Set("per_iteration_data", std::move(per_iteration_data));
+  summary_root.SetKey("per_iteration_data",
+                      Value(std::move(per_iteration_data)));
 
-  std::unique_ptr<DictionaryValue> test_locations(new DictionaryValue);
+  Value test_locations(Value::Type::DICTIONARY);
   for (const auto& item : test_locations_) {
     std::string test_name = item.first;
     CodeLocation location = item.second;
-    std::unique_ptr<DictionaryValue> location_value(new DictionaryValue);
-    location_value->SetStringKey("file", location.file);
-    location_value->SetIntKey("line", location.line);
-    test_locations->SetWithoutPathExpansion(test_name,
-                                            std::move(location_value));
+    Value location_value(Value::Type::DICTIONARY);
+    location_value.SetStringKey("file", location.file);
+    location_value.SetIntKey("line", location.line);
+    test_locations.SetKey(test_name, std::move(location_value));
   }
-  summary_root->Set("test_locations", std::move(test_locations));
+  summary_root.SetKey("test_locations", std::move(test_locations));
 
   std::string json;
-  if (!JSONWriter::Write(*summary_root, &json))
+  if (!JSONWriter::Write(summary_root, &json))
     return false;
 
   File output(path, File::FLAG_CREATE_ALWAYS | File::FLAG_WRITE);
diff --git a/build/fuchsia/linux.sdk.sha1 b/build/fuchsia/linux.sdk.sha1
index 1d0cc8c..7cd768c 100644
--- a/build/fuchsia/linux.sdk.sha1
+++ b/build/fuchsia/linux.sdk.sha1
@@ -1 +1 @@
-4.20210508.2.1
+4.20210509.3.1
diff --git a/build/fuchsia/mac.sdk.sha1 b/build/fuchsia/mac.sdk.sha1
index 1d0cc8c..7cd768c 100644
--- a/build/fuchsia/mac.sdk.sha1
+++ b/build/fuchsia/mac.sdk.sha1
@@ -1 +1 @@
-4.20210508.2.1
+4.20210509.3.1
diff --git a/chrome/VERSION b/chrome/VERSION
index 525eee6..7a170d41 100644
--- a/chrome/VERSION
+++ b/chrome/VERSION
@@ -1,4 +1,4 @@
 MAJOR=92
 MINOR=0
-BUILD=4502
+BUILD=4504
 PATCH=0
diff --git a/chrome/android/profiles/newest.txt b/chrome/android/profiles/newest.txt
index 67235d45..d6a4328c 100644
--- a/chrome/android/profiles/newest.txt
+++ b/chrome/android/profiles/newest.txt
@@ -1 +1 @@
-chromeos-chrome-amd64-92.0.4500.0_rc-r1-merged.afdo.bz2
+chromeos-chrome-amd64-92.0.4502.0_rc-r1-merged.afdo.bz2
diff --git a/chrome/app/resources/chromium_strings_iw.xtb b/chrome/app/resources/chromium_strings_iw.xtb
index be122417..5c8f6ef8 100644
--- a/chrome/app/resources/chromium_strings_iw.xtb
+++ b/chrome/app/resources/chromium_strings_iw.xtb
@@ -22,6 +22,7 @@
 <translation id="1911763535808217981">‏כיבוי הגדרה זו יאפשר לך להיכנס לאתרי Google, כמו Gmail, בלי להיכנס אל Chromium</translation>
 <translation id="1929939181775079593">‏Chromium אינו מגיב. להפעיל מחדש עכשיו?</translation>
 <translation id="1966382378801805537">‏ב-Chromium לא ניתן לקבוע או להגדיר את דפדפן ברירת המחדל</translation>
+<translation id="1981611865800294956">‏הפעלה מחדש לצורך עדכון &amp;Chromium OS</translation>
 <translation id="2008474315282236005">‏הפעולה הזו תמחק פריט אחד מהמכשיר. כדי לשחזר את הנתונים מאוחר יותר, היכנס אל Chromium עם <ph name="USER_EMAIL" />.</translation>
 <translation id="2020032459870799438">‏כדי לבדוק אם שאר הסיסמאות מוגנות מפני פרצות באבטחת מידע ובעיות אבטחה אחרות, <ph name="BEGIN_LINK" />יש להיכנס ל-Chromium<ph name="END_LINK" />.</translation>
 <translation id="2174178932569897599">‏התאמה אישית של Chromium</translation>
@@ -117,6 +118,7 @@
 <translation id="4788777615168560705">‏Chromium לא יכול לבדוק את הסיסמאות שלך. יש לנסות שוב בעוד 24 שעות או <ph name="BEGIN_LINK" />לבדוק את הסיסמאות בחשבון Google<ph name="END_LINK" />.</translation>
 <translation id="479167709087336770">‏נעשה כאן שימוש בבדיקת האיות של חיפוש Google. הטקסט המוקלד בדפדפן נשלח אל Google. אפשר לשנות את ההתנהגות הזו בכל שלב דרך ההגדרות.</translation>
 <translation id="4888717733111232871">‏כלל נכנס עבור Chromium על מנת לאפשר תנועת mDNS.</translation>
+<translation id="4893347770495441059">‏הפעלה מחדש לצורך עדכון &amp;Chromium</translation>
 <translation id="4943838377383847465">‏Chromium נמצא במצב רקע.</translation>
 <translation id="4987820182225656817">‏אורחים יכולים להשתמש ב-Chromium בלי להשאיר דבר מאחור.</translation>
 <translation id="4994636714258228724">‏הוספת החשבון שלך ל-Chromium</translation>
@@ -272,6 +274,7 @@
 <translation id="91086099826398415">‏פתיחת הקישור &amp;בכרטיסיית Chromium חדשה</translation>
 <translation id="911206726377975832">למחוק גם את נתוני הגלישה שלך?</translation>
 <translation id="9158494823179993217">‏לפי הגדרת מנהל המערכת, Chromium יפתח דפדפן חלופי כדי לגשת אל <ph name="TARGET_URL_HOSTNAME" />.</translation>
+<translation id="9185526690718004400">‏הפעלה מחדש לצורך עדכון &amp;Chromium</translation>
 <translation id="9190841055450128916">‏Chromium ‏(mDNS-In)</translation>
 <translation id="9214764063801632699">‏מערכת Chromium OS</translation>
 <translation id="93478295209880648">‏ייתכן ש-Chromium לא יפעל כראוי כי הוא כבר לא נתמך ב-Windows XP וב-Windows Vista</translation>
diff --git a/chrome/app/resources/generated_resources_iw.xtb b/chrome/app/resources/generated_resources_iw.xtb
index e7e95f4..7642479 100644
--- a/chrome/app/resources/generated_resources_iw.xtb
+++ b/chrome/app/resources/generated_resources_iw.xtb
@@ -3,6 +3,7 @@
 <translationbundle lang="iw">
 <translation id="1001307489511021749">‏אפליקציות, הגדרות ופריטים נוספים שהתאמת אישית יסונכרנו בין כל מכשירי Chrome OS שמחוברים באמצעות חשבון Google שלך.</translation>
 <translation id="1003088604756913841">פתיחת הקישור בחלון חדש של <ph name="APP" /></translation>
+<translation id="100323615638474026">‏התקן USB (<ph name="VENDOR_ID" />:<ph name="PRODUCT_ID" />)</translation>
 <translation id="1004218526896219317">גישה לאתרים</translation>
 <translation id="1005274289863221750">להשתמש במיקרופון ובמצלמה</translation>
 <translation id="1005333234656240382">‏להפעיל ניפוי באגים באמצעות ADB?</translation>
@@ -572,6 +573,7 @@
 <translation id="1614511179807650956">ייתכן שניצלת את כל חבילת הגלישה שלך. בפורטל ההפעלה של <ph name="NAME" /> ניתן לשלם על הרחבת החבילה</translation>
 <translation id="161460670679785907">לא ניתן לזהות את הטלפון שלך</translation>
 <translation id="1615402009686901181">בהתאם למדיניות מנהל המערכת, צילום המסך מושבת כשמוצג תוכן סודי</translation>
+<translation id="1615755956145364867">אתרים יכולים לבקש הרשאה להפעיל תוכן מוגן</translation>
 <translation id="1616206807336925449">אין צורך בהרשאות מיוחדות כדי להשתמש בתוסף זה.</translation>
 <translation id="1616298854599875024">לא ניתן לייבא את התוסף "<ph name="IMPORT_NAME" />" כי הוא לא מודול משותף</translation>
 <translation id="1617765145568323981">{NUM_FILES,plural, =0{המערכת בודקת אם הנתונים האלה מצייתים למדיניות האבטחה של הארגון שלך...}=1{המערכת בודקת אם הקובץ הזה מציית למדיניות האבטחה של הארגון שלך...}two{המערכת בודקת אם הקבצים האלה מצייתים למדיניות האבטחה של הארגון שלך...}many{המערכת בודקת אם הקבצים האלה מצייתים למדיניות האבטחה של הארגון שלך...}other{המערכת בודקת אם הקבצים האלה מצייתים למדיניות האבטחה של הארגון שלך...}}</translation>
@@ -766,6 +768,7 @@
 <translation id="1794051631868188691">אין להציג את <ph name="MERCHANT" /> אף פעם</translation>
 <translation id="1794791083288629568">שליחת משוב שיעזור לנו לפתור את הבעיה.</translation>
 <translation id="1795214765651529549">שימוש בעיצוב קלאסי</translation>
+<translation id="1796588414813960292">תכונות שצריכות צלילים לא יפעלו</translation>
 <translation id="1799071797295057738">התוסף "<ph name="EXTENSION_NAME" />" הושבת באופן אוטומטי.</translation>
 <translation id="1800973090344019061">התוסף "<ph name="APP_NAME" />" מבקש הרשאה לשתף את המסך שלך.</translation>
 <translation id="1802624026913571222">מעבר למצב שינה כשסוגרים את הכיסוי</translation>
@@ -964,6 +967,7 @@
 <translation id="2007404777272201486">דיווח על בעיה...</translation>
 <translation id="2010501376126504057">מכשירים תואמים</translation>
 <translation id="2015232545623037616">‏מחשב ו-Chromecast באותה רשת Wi-Fi</translation>
+<translation id="2016473077102413275">תכונות שצריכות תמונות לא יפעלו</translation>
 <translation id="2016574333161572915">‏הציוד ל-Google Meet מוכן להגדרה</translation>
 <translation id="2017334798163366053">השבתת האיסוף של נתוני ביצועים</translation>
 <translation id="2018352199541442911">מצטערים, מכשיר האחסון החיצוני שלך אינו נתמך בשלב זה.</translation>
@@ -1294,6 +1298,7 @@
 <translation id="2355604387869345912">הפעלת שיתוף אינטרנט מיידי בין מכשירים</translation>
 <translation id="2356070529366658676">לשאול</translation>
 <translation id="2357330829548294574">הסרה של <ph name="USER_NAME" /></translation>
+<translation id="2358561147588818967">‏אתרים יכולים להשתמש ב-JavaScript</translation>
 <translation id="2359071692152028734">‏ייתכן שאפליקציות Linux יפסיקו להגיב.</translation>
 <translation id="2359345697448000899">ניהול התוספים שלך על ידי לחיצה על 'תוספים' בתפריט כלים.</translation>
 <translation id="2359556993567737338">‏חיבור התקן Bluetooth</translation>
@@ -1471,6 +1476,7 @@
 <translation id="2544853746127077729">אישור האימות נדחה על ידי הרשת</translation>
 <translation id="2546283357679194313">‏נתוני אתר וקובצי Cookie</translation>
 <translation id="2548347166720081527">ההרשאה <ph name="PERMISSION" /> הוענקה</translation>
+<translation id="2548545707296594436">‏איפוס המטמון של פרופיל ה-eSIM</translation>
 <translation id="2549985041256363841">צילום סרטון</translation>
 <translation id="2550212893339833758">זיכרון מוחלף</translation>
 <translation id="2550596535588364872">האם להתיר ל-<ph name="EXTENSION_NAME" /> לפתוח את <ph name="FILE_NAME" />?</translation>
@@ -1665,6 +1671,7 @@
 <translation id="2765217105034171413">קטן</translation>
 <translation id="2766006623206032690">הדבקה והמשך</translation>
 <translation id="2766161002040448006">בקשת רשות מההורים</translation>
+<translation id="2767077837043621282">‏לא ניתן לעדכן את ה-Chromebook. יש לנסות שוב מאוחר יותר.</translation>
 <translation id="2767127727915954024">לאתר <ph name="ORIGIN" /> תהיה הרשאה לערוך את <ph name="FILENAME" /> עד שכל הכרטיסיות של האתר הזה ייסגרו</translation>
 <translation id="2770465223704140727">הסרה מהרשימה</translation>
 <translation id="2770690685823456775">אפשר לייצא את הסיסמאות לתיקייה אחרת</translation>
@@ -1942,6 +1949,7 @@
 <translation id="3060379269883947824">הפעלת הקראה</translation>
 <translation id="3060952009917586498">שינוי השפה במכשיר. השפה הנוכחית היא <ph name="LANGUAGE" />.</translation>
 <translation id="3060987956645097882">‏לא הצלחנו להתחבר לטלפון שלך. יש לוודא שהטלפון נמצא בקרבת מקום, אינו נעול, ושה-Bluetooth וה-Wi-Fi פועלים.</translation>
+<translation id="3064871050034234884">אתרים יכולים להשמיע צלילים</translation>
 <translation id="3065041951436100775">משוב על כרטיסייה שנסגרה.</translation>
 <translation id="3065522099314259755">קצב חזרה על פעולת מקלדת</translation>
 <translation id="3067198179881736288">להתקין את האפליקציה?</translation>
@@ -2292,6 +2300,7 @@
 <translation id="3462413494201477527">האם לבטל את הגדרת החשבון?</translation>
 <translation id="3464145797867108663">הוספת פרופיל עבודה</translation>
 <translation id="346431825526753">זהו חשבון לילדים, המנוהל על-ידי <ph name="CUSTODIAN_EMAIL" />.</translation>
+<translation id="3465480292013046659">אירעה בעיה במהלך הורדת העדכון. יש לנסות שוב מאוחר יותר.</translation>
 <translation id="3468298837301810372">תווית</translation>
 <translation id="3468999815377931311">‏טלפון Android</translation>
 <translation id="3470442499439619530">הסרת המשתמש הזה</translation>
@@ -2323,6 +2332,7 @@
 <translation id="3495496470825196617">מעבר למצב שינה בזמן טעינה</translation>
 <translation id="3495660573538963482">‏ההגדרות של Google Assistant</translation>
 <translation id="3496213124478423963">התרחקות מתצוגה</translation>
+<translation id="3497501929010263034">‏התקן USB מ-<ph name="VENDOR_NAME" /> (מוצר <ph name="PRODUCT_ID" />)</translation>
 <translation id="3497560059572256875">שיתוף הדודל</translation>
 <translation id="3498215018399854026">לא הצלחנו ליצור קשר עם ההורה שלך. נסה שוב מאוחר יותר.</translation>
 <translation id="3500417806337761827">‏אירעה שגיאה בטעינת השיתוף. כבר נטענו יותר מדי שיתופי SMB.</translation>
@@ -2410,6 +2420,7 @@
 <translation id="3600792891314830896">השתקת אתרים שמשמיעים צלילים</translation>
 <translation id="3601151620448429694"><ph name="NETWORK_NAME" /> · <ph name="CARRIER_NAME" /></translation>
 <translation id="360180734785106144">להציע תכונות חדשות כשהן זמינות</translation>
+<translation id="3602179428782502464">העדכון הזה נחסם על ידי מנהל המערכת שלך</translation>
 <translation id="3602290021589620013">תצוגה מקדימה</translation>
 <translation id="3602870520245633055">הדפסה וסריקה</translation>
 <translation id="3603622770190368340">השגת אישור רשת</translation>
@@ -2419,6 +2430,7 @@
 <translation id="3610369246614755442">המאוורר של אביזר העגינה צריך תיקון</translation>
 <translation id="361106536627977100">‏נתוני Flash</translation>
 <translation id="3611655097742243705">‏אפליקציות נוספות מחכות לך בחנות Play</translation>
+<translation id="3611658447322220736">אתרים שנסגרו לאחרונה יכולים לסיים שליחה וקבלה של נתונים</translation>
 <translation id="3612673635130633812">‏ההורדה בוצעה באמצעות &lt;a href="<ph name="URL" />"&gt;<ph name="EXTENSION" />&lt;/a&gt;</translation>
 <translation id="3613134908380545408">הצגת <ph name="FOLDER_NAME" /></translation>
 <translation id="3613422051106148727">&amp;פתיחה בכרטיסייה חדשה</translation>
@@ -2451,6 +2463,7 @@
 <translation id="3639220004740062347">יציאה ממצב קורא</translation>
 <translation id="3640214691812501263">האם להוסיף את "<ph name="EXTENSION_NAME" />" בשביל <ph name="USER_NAME" />?</translation>
 <translation id="3640613767643722554">‏ה-Assistant יכולה ללמוד לזהות את הקול שלך</translation>
+<translation id="3641456520301071208">אתרים יכולים לבקש הרשאת גישה למיקומך</translation>
 <translation id="3645372836428131288">יש להזיז קצת את האצבע כדי לסרוק חלק אחר של טביעת האצבע.</translation>
 <translation id="3647998456578545569">{COUNT,plural, =1{<ph name="ATTACHMENTS" /> התקבל מהמכשיר <ph name="DEVICE_NAME" />}two{<ph name="ATTACHMENTS" /> התקבלו מהמכשיר <ph name="DEVICE_NAME" />}many{<ph name="ATTACHMENTS" /> התקבלו מהמכשיר <ph name="DEVICE_NAME" />}other{<ph name="ATTACHMENTS" /> התקבלו מהמכשיר <ph name="DEVICE_NAME" />}}</translation>
 <translation id="3648348069317717750">המערכת זיהתה את <ph name="USB_DEVICE_NAME" /></translation>
@@ -2493,6 +2506,7 @@
 <translation id="3688526734140524629">מעבר לערוץ אחר</translation>
 <translation id="3688578402379768763">מעודכן</translation>
 <translation id="3688794912214798596">שינוי שפות...</translation>
+<translation id="3690128548376345212">רשת <ph name="NETWORK_INDEX" /> מתוך <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, לא פעילה, <ph name="CONNECTION_STATUS" />, חוזק האות <ph name="SIGNAL_STRENGTH" />%, פרטים</translation>
 <translation id="3690369331356918524">במצב הזה המערכת מזהירה אותך אם סיסמאות נחשפות כתוצאה מפרצה באבטחת המידע</translation>
 <translation id="3691231116639905343">אפליקציות מקלדת</translation>
 <translation id="3691267899302886494"><ph name="HOST" /> רוצה לשתף את המסך שלך</translation>
@@ -2574,6 +2588,7 @@
 <translation id="3772609330847318323">עדכון הסיסמה של <ph name="ORIGIN" /></translation>
 <translation id="3775432569830822555">‏אישור שרת SSL</translation>
 <translation id="3775705724665058594">שליחה אל המכשירים שלך</translation>
+<translation id="3776508619697147021">אתרים יכולים לבקש הרשאה להוריד מספר קבצים באופן אוטומטי</translation>
 <translation id="3776796446459804932">‏התוסף מפר את המדיניות בחנות האינטרנט של Chrome.</translation>
 <translation id="3777483481409781352">לא ניתן היה להפעיל את הטלפון הסלולרי</translation>
 <translation id="3777806571986431400">התוסף הופעל</translation>
@@ -2875,6 +2890,7 @@
 <translation id="4078738236287221428">תמיד</translation>
 <translation id="4079140982534148664">שימוש בבדיקת איות משופרת</translation>
 <translation id="4081242589061676262">לא ניתן להעביר את הקובץ.</translation>
+<translation id="408223403876103285">נשלחה התראה על ידי <ph name="WEBSITE" /> אל הטלפון. כדי לאמת את זהותך, עליך לפעול לפי השלבים המופיעים שם.</translation>
 <translation id="4084682180776658562">סימנייה</translation>
 <translation id="4084835346725913160">סגירת <ph name="TAB_NAME" /></translation>
 <translation id="4085270836953633510">תוצג שאלה כשאתר רוצה לגשת אל יציאות טוריות</translation>
@@ -3036,6 +3052,7 @@
 <translation id="4287502603002637393">{MUTED_NOTIFICATIONS_COUNT,plural, =1{הצגה}two{הצגת הכול}many{הצגת הכול}other{הצגת הכול}}</translation>
 <translation id="4289372044984810120">כאן אפשר לנהל את החשבונות שלך. <ph name="LINK_BEGIN" />מידע נוסף<ph name="LINK_END" /></translation>
 <translation id="4289540628985791613">סקירה כללית</translation>
+<translation id="4290791284969893584">לאחר סגירת דף, ייתכן שמשימות שהתחלת לא יסתיימו</translation>
 <translation id="4295072614469448764">האפליקציה זמינה במסוף שלך. בחלק מהמקרים מופיע סמל במרכז האפליקציות.</translation>
 <translation id="4295839147292213505">ניתן לשלוח הודעות טקסט מהמחשב, לשתף את החיבור לאינטרנט, להשיב להתראות על שיחות ולבטל את הנעילה של <ph name="DEVICE_TYPE" /> באמצעות הטלפון.<ph name="FOOTNOTE_POINTER" /> <ph name="LINK_BEGIN" />מידע נוסף<ph name="LINK_END" /></translation>
 <translation id="4295979599050707005">‏יש להיכנס שוב כדי לאשר את השימוש בחשבון שלך, <ph name="USER_EMAIL" />, ביחד עם אתרים, אפליקציות ותוספים ב-Chrome וב-Google Play. ניתן גם להסיר את החשבון הזה. <ph name="LINK_BEGIN" />מידע נוסף<ph name="LINK_END" /></translation>
@@ -3232,6 +3249,7 @@
 <translation id="4514610446763173167">הפעלת וידאו או הפסקת הפעולה</translation>
 <translation id="451515744433878153">הסרה</translation>
 <translation id="4515872537870654449">‏יש לפנות אל Dell כדי לקבל סיוע. אביזר העגינה יכבה אם המאוורר לא פועל.</translation>
+<translation id="4519331665958994620">אתרים יכולים לבקש הרשאה להשתמש במצלמה</translation>
 <translation id="4519935350946509010">שגיאת חיבור.</translation>
 <translation id="4520385623207007473">‏קובצי Cookie בשימוש</translation>
 <translation id="452039078290142656">מכשירים בלתי ידועים של <ph name="VENDOR_NAME" /></translation>
@@ -3411,6 +3429,7 @@
 <translation id="4694604912444486114">קוף</translation>
 <translation id="4697071790493980729">לא נמצאו תוצאות</translation>
 <translation id="4697551882387947560">כאשר הפעלת הגלישה מסתיימת</translation>
+<translation id="469838979880025581">אתרים יכולים לבקש הרשאה להשתמש במיקרופון</translation>
 <translation id="4699172675775169585">תמונות וקבצים במטמון</translation>
 <translation id="4699357559218762027">(מופעלת אוטומטית)</translation>
 <translation id="4701025263201366865">כניסה של הורה</translation>
@@ -3593,6 +3612,10 @@
 <translation id="4918086044614829423">אישור</translation>
 <translation id="4921290200821452703">פרטי חשבון בית ספרי להורים</translation>
 <translation id="4921348630401250116">המרת טקסט לדיבור</translation>
+<translation id="4921809350408880559">‏המסמכים האחרונים וכן הצעות למסמכים מוצגים לך על סמך הפעילות הקודמת שביצעת באמצעות Google Drive.
+        <ph name="BREAK" />
+        <ph name="BREAK" />
+        <ph name="BEGIN_LINK" />כאן<ph name="END_LINK" /> אפשר לקרוא מידע על הנתונים שנאספים על ידי Google Drive ועל הסיבות לכך.</translation>
 <translation id="49226369361073053">{0,plural, =0{יש לעדכן את המכשיר עכשיו}=1{יש לעדכן את המכשיר תוך שנייה אחת}two{יש לעדכן את המכשיר תוך # שניות}many{יש לעדכן את המכשיר תוך # שניות}other{יש לעדכן את המכשיר תוך # שניות}}</translation>
 <translation id="492299503953721473">‏הסרת אפליקציות Android</translation>
 <translation id="492363500327720082">ההסרה של <ph name="APP_NAME" /> מתבצעת…</translation>
@@ -4353,6 +4376,7 @@
 <translation id="5794700615121138172">‏תיקיות משותפות של Linux</translation>
 <translation id="5794786537412027208">‏יציאה מכל אפליקציות Chrome</translation>
 <translation id="5797070761912323120">‏Google עשויה להשתמש בהיסטוריית הגלישה שלך לצורך התאמה אישית של החיפוש, מודעות ושירותי Google אחרים</translation>
+<translation id="5798079537501238810">‏אתרים מורשים להתקין רכיבי handler של תשלומים</translation>
 <translation id="579907812742603813">תוכן מוגן</translation>
 <translation id="579915268381781820">מפתח האבטחה שלך הוסר.</translation>
 <translation id="5799478978078236781">אפשר לקבל טיפים, מידע על מבצעים ועדכונים בנוגע ל-<ph name="DEVICE_TYPE" /> ולשתף משוב.</translation>
@@ -4385,6 +4409,7 @@
 <translation id="5833726373896279253">רק הבעלים יכולים לשנות את ההגדרות האלה:</translation>
 <translation id="5834581999798853053">נותרו בערך <ph name="TIME" /> דקות</translation>
 <translation id="5835486486592033703"><ph name="WINDOW_TITLE" /> - הקלטה במצלמה או במיקרופון</translation>
+<translation id="583673505367439042">אתרים יכולים לבקש הרשאה לערוך קבצים ותיקיות במכשיר שלך</translation>
 <translation id="5840680448799937675">קבצים ישותפו תמיד במצב אופליין</translation>
 <translation id="5841270259333717135">‏הגדרת Ethernet</translation>
 <translation id="5842497610951477805">‏הפעלה של Bluetooth</translation>
@@ -4434,6 +4459,7 @@
 <translation id="5889282057229379085">המספר המרבי של רשויות אישורים ברמת ביניים: <ph name="NUM_INTERMEDIATE_CA" /></translation>
 <translation id="5891688036610113830">‏רשתות Wi-Fi מועדפות</translation>
 <translation id="5895138241574237353">הפעלה מחדש</translation>
+<translation id="5896749729057314184">רשת <ph name="NETWORK_INDEX" /> מתוך <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, לא פעילה, חוזק האות <ph name="SIGNAL_STRENGTH" />%, פרטים</translation>
 <translation id="5900302528761731119">‏תמונת פרופיל Google</translation>
 <translation id="590036993063074298">פרטי האיכות של שיקוף המסך</translation>
 <translation id="5901069264981746702">נתוני טביעות האצבע מאוחסנים באופן מאובטח ואף פעם לא נשלחים ממכשיר ה-<ph name="DEVICE_TYPE" />. <ph name="LINK_BEGIN" />מידע נוסף<ph name="LINK_END" /></translation>
@@ -4678,6 +4704,7 @@
 <translation id="6155141482566063812">כרטיסיית הרקע משתפת את המסך שלך</translation>
 <translation id="6156323911414505561">הצגת סרגל הסימניות</translation>
 <translation id="6156863943908443225">מטמון סקריפטים</translation>
+<translation id="615930144153753547">אתרים יכולים להציג תמונות</translation>
 <translation id="6160625263637492097">אספקת אישורים לאימות</translation>
 <translation id="6163363155248589649">&amp;רגיל</translation>
 <translation id="6163376401832887457">‏הגדרות Kerberos</translation>
@@ -4884,6 +4911,10 @@
 <translation id="6398715114293939307">‏הסרה של חנות Google Play</translation>
 <translation id="6398765197997659313">יציאה ממסך מלא</translation>
 <translation id="6399774419735315745">מרגלת</translation>
+<translation id="6400510847800135340">‏הפריט הזה מוצג לך על סמך הפעילות הקודמת שלך בשירותי Google. בכתובת <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> מוצגים הנתונים שלך, ואפשר למחוק אותם או לשנות את ההגדרות.
+        <ph name="BREAK" />
+        <ph name="BREAK" />
+        ניתן למצוא מידע על הנתונים שנאספים על ידי Google והסיבות לכך בכתובת <ph name="BEGIN_LINK" />policies.google.com<ph name="END_LINK" />.</translation>
 <translation id="6404511346730675251">עריכת סימנייה</translation>
 <translation id="6406303162637086258">ביצוע הדמיה של הפעלת דפדפן מחדש</translation>
 <translation id="6406506848690869874">סנכרון</translation>
@@ -4933,6 +4964,7 @@
 <translation id="6452251728599530347"><ph name="PERCENT" /> הושלמו</translation>
 <translation id="645286928527869380">מתכונים</translation>
 <translation id="6452961788130242735">בעיית רשת או תחום לא תקין</translation>
+<translation id="6453921811609336127">‏כדי לעבור לשיטת הקלט הבאה, יש להקיש על <ph name="BEGIN_SHORTCUT" /><ph name="BEGIN_CTRL" />Ctrl‏<ph name="END_CTRL" /><ph name="SEPARATOR1" /><ph name="BEGIN_SHIFT" />Shift<ph name="END_SHIFT" /><ph name="SEPARATOR2" /><ph name="BEGIN_SPACE" />רווח<ph name="END_SPACE" /><ph name="END_SHORTCUT" /></translation>
 <translation id="6455264371803474013">באתרים ספציפיים</translation>
 <translation id="6455894534188563617">&amp;תיקייה חדשה</translation>
 <translation id="645705751491738698">‏אני רוצה להמשיך לחסום JavaScript</translation>
@@ -5058,6 +5090,7 @@
 <translation id="6590458744723262880">שינוי שם התיקייה</translation>
 <translation id="6592267180249644460">‏יומני WebRTC תועדו בתאריך <ph name="WEBRTC_LOG_CAPTURE_TIME" /></translation>
 <translation id="6592808042417736307">טביעת האצבע שלך תועדה</translation>
+<translation id="6593881952206664229">ייתכן שמדיה שיש לה זכויות יוצרים לא תופעל</translation>
 <translation id="6594011207075825276">מתבצע חיפוש של מכשירים סריאליים...</translation>
 <translation id="6595187330192059106">‏לחסום תמיד – ל-<ph name="HOST" /> לא תהיה יותר שליטה מלאה במכשירי MIDI.</translation>
 <translation id="6596325263575161958">אפשרויות הצפנה</translation>
@@ -6015,6 +6048,7 @@
 <translation id="7661451191293163002">לא ניתן להשיג אישור הרשמה.</translation>
 <translation id="7662283695561029522">יש להקיש כדי להגדיר</translation>
 <translation id="7663719505383602579">מקבל: <ph name="ARC_PROCESS_NAME" /></translation>
+<translation id="7663774460282684730">יש מקשי קיצור</translation>
 <translation id="7664620655576155379">‏מכשיר Bluetooth שאינו נתמך: "<ph name="DEVICE_NAME" />".</translation>
 <translation id="7665082356120621510">הקצאת שטח קבוע</translation>
 <translation id="7665369617277396874">חשבון חדש</translation>
@@ -6193,6 +6227,7 @@
 <translation id="7835178595033117206">הסימנייה הוסרה</translation>
 <translation id="7836850009646241041">עליך לנסות לגעת שוב במפתח האבטחה</translation>
 <translation id="7837776265184002579">דף הבית השתנה ל-<ph name="URL" />.</translation>
+<translation id="7838971600045234625">{COUNT,plural, =1{בוצעה שליחה של <ph name="ATTACHMENTS" /> אל <ph name="DEVICE_NAME" />}two{בוצעה שליחה של <ph name="ATTACHMENTS" /> אל <ph name="DEVICE_NAME" />}many{בוצעה שליחה של <ph name="ATTACHMENTS" /> אל <ph name="DEVICE_NAME" />}other{בוצעה שליחה של <ph name="ATTACHMENTS" /> אל <ph name="DEVICE_NAME" />}}</translation>
 <translation id="7839051173341654115">הצגה/גיבוי של מדיה</translation>
 <translation id="7839192898639727867">מזהה מפתח של נושא אישור</translation>
 <translation id="7842692330619197998">‏אם צריך ליצור חשבון חדש, ניתן לעשות זאת בכתובת g.co/ChromeEnterpriseAccount.</translation>
@@ -6892,6 +6927,7 @@
 <translation id="8633025649649592204">פעילות אחרונה</translation>
 <translation id="8635628933471165173">בטעינה מחדש...</translation>
 <translation id="8636284842992792762">הפעלת התוספים בתהליך…</translation>
+<translation id="8636500887554457830">לא לאפשר לאתרים לשלוח חלונות קופצים או להשתמש בהפניות אוטומטיות</translation>
 <translation id="8637542770513281060">‏המחשב שלך מכיל מודול מאובטח המשמש ליישום תכונות אבטחה קריטיות רבות ב-Chrome OS. אפשר להיכנס למרכז העזרה של Chromebook כדי לקבל מידע נוסף: https://support.google.com/chromebook/?p=sm</translation>
 <translation id="8637688295594795546">עדכון מערכת זמין. המערכת מתכוננת להורדה…</translation>
 <translation id="863903787380594467">קוד האימות שגוי. נותרו לך עוד <ph name="RETRIES" /> ניסיונות.</translation>
@@ -7111,6 +7147,7 @@
 <translation id="8842594465773264717">מחיקת טביעת האצבע הזו</translation>
 <translation id="8845001906332463065">קבלת עזרה</translation>
 <translation id="8846132060409673887">קריאת היצרן והדגם של המחשב הזה</translation>
+<translation id="8846163936679269230">‏איפוס הפרופילים של ה-eSIM</translation>
 <translation id="8847523528195140327">יציאה מהחשבון כשסוגרים את הכיסוי</translation>
 <translation id="8847988622838149491">USB</translation>
 <translation id="8849001918648564819">מוסתר</translation>
@@ -7166,6 +7203,7 @@
 <translation id="8898822736010347272">‏שולח ל-Google כתובות URL של חלק מהדפים שאליהם נכנסת, פרטים מוגבלים לגבי המערכת וחלק מתוכן הדפים. פעולה זו עוזרת לזהות איומים חדשים ולהגן על כל המשתמשים באינטרנט.</translation>
 <translation id="8899851313684471736">פתיחת קישור &amp;בחלון חדש</translation>
 <translation id="8900413463156971200">הפעלת רשת סלולרית</translation>
+<translation id="8901994452417867840">הפרופיל התווסף בהצלחה. החיבור הזה יהיה זמין לכל המשתמשים במכשיר הזה.</translation>
 <translation id="8902059453911237649">{NUM_DAYS,plural, =1{לפי הדרישה של <ph name="MANAGER" />, עליך לגבות את הנתונים שלך ולהחזיר את מכשיר ה-<ph name="DEVICE_TYPE" /> היום.}two{לפי הדרישה של <ph name="MANAGER" />, עליך לגבות את הנתונים שלך ולהחזיר את מכשיר ה-<ph name="DEVICE_TYPE" /> לפני המועד האחרון.}many{לפי הדרישה של <ph name="MANAGER" />, עליך לגבות את הנתונים שלך ולהחזיר את מכשיר ה-<ph name="DEVICE_TYPE" /> לפני המועד האחרון.}other{לפי הדרישה של <ph name="MANAGER" />, עליך לגבות את הנתונים שלך ולהחזיר את מכשיר ה-<ph name="DEVICE_TYPE" /> לפני המועד האחרון.}}</translation>
 <translation id="8902667442496790482">פתיחה של הגדרות ההקראה</translation>
 <translation id="8903263458134414071">יש לבחור חשבון לצורך כניסה</translation>
@@ -7347,6 +7385,7 @@
 <translation id="9094982973264386462">הסרה</translation>
 <translation id="9095253524804455615">הסרה</translation>
 <translation id="909554839118732438">סגירת חלונות אנונימיים</translation>
+<translation id="9100416672768993722">‏כדי לעבור לשיטת הקלט שבה נעשה שימוש לאחרונה, יש להקיש על <ph name="BEGIN_SHORTCUT" /><ph name="BEGIN_CTRL" />Ctrl<ph name="END_CTRL" /><ph name="SEPARATOR" /><ph name="BEGIN_SPACE" />רווח<ph name="END_SPACE" /><ph name="END_SHORTCUT" /></translation>
 <translation id="9100610230175265781">יש להזין ביטוי סיסמה</translation>
 <translation id="9100765901046053179">הגדרות מתקדמות</translation>
 <translation id="9101691533782776290">הפעלת האפליקציה</translation>
diff --git a/chrome/app/resources/generated_resources_uz.xtb b/chrome/app/resources/generated_resources_uz.xtb
index f633cdee..bbbc431 100644
--- a/chrome/app/resources/generated_resources_uz.xtb
+++ b/chrome/app/resources/generated_resources_uz.xtb
@@ -62,6 +62,7 @@
 <translation id="1066613507389053689">Chrome OS tizimini yangilash zarur</translation>
 <translation id="1067048845568873861">Yaratilgan sanasi</translation>
 <translation id="1067922213147265141">Boshqa Google xizmatlari</translation>
+<translation id="1069355737714877171"><ph name="PROFILE_NAME" /> nomli eSIM profilini olib tashlash</translation>
 <translation id="1070377999570795893">Kompyuteringizdagi boshqa dastur bitta kengaytma o‘rnatdi. U Chrome brauzerinig ishlash usulini o‘zgartirishi mumkin.
 
 <ph name="EXTENSION_NAME" /></translation>
@@ -356,6 +357,7 @@
 <translation id="138784436342154190">Standart boshlang‘ich sahifa tiklansinmi?</translation>
 <translation id="1388253969141979417">Mikrofondan foydalanishga ruxsat berilgan</translation>
 <translation id="1388728792929436380">Yangilanishlar tugasa, <ph name="DEVICE_TYPE" /> qurilmasi qayta ishga tushiriladi.</translation>
+<translation id="138900021244932468">Hech qanday profil topilmadi. Yangi tarmoqni sozlash uchun qurilma kamerasi orqali QR kodni skanerlang yoki aloqa operatori taqdim qilgan aktivatsiya kodini kiriting.</translation>
 <translation id="139013308650923562">Qurilmangizga oʻrnatilgan shriftlardan foydalanishga ruxsat beradi</translation>
 <translation id="1390548061267426325">Oddiy ichki oynada ochish</translation>
 <translation id="1393283411312835250">Quyosh va bulutlar</translation>
@@ -983,6 +985,7 @@
 Oʻz qurilmangizda Family Link ilovasini oʻrnatib, bu hisob sozlamalarini boshqarishingiz mumkin.  Koʻrsatmalar email manzilingizga yuborildi.</translation>
 <translation id="2040460856718599782">Haqiqiylik tekshiruvini amalga oshirib bo‘lmadi. Hisob ma’lumotlarini tekshirib, qaytadan urinib ko‘ring.</translation>
 <translation id="2044014337866019681">Bu seansni qulfdan chiqarish uchun <ph name="ACCOUNT" /> hisobidan kiring.</translation>
+<translation id="2044023416777079300">Modem registratsiya qilinmagan</translation>
 <translation id="204497730941176055">Microsoft sertifikati andozasi nomi</translation>
 <translation id="2045117674524495717">Tezkor tugmalar yordamchisi</translation>
 <translation id="2045969484888636535">Cookie-fayllari saqlanishini doim bloklash</translation>
@@ -4086,6 +4089,7 @@
 <translation id="5486261815000869482">Parolni tasdiqlang</translation>
 <translation id="5486275809415469523">“<ph name="APP_NAME" />” ilovasi <ph name="TAB_NAME" /> saytiga ekraningizdan foydalanishga ruxsat berdi.</translation>
 <translation id="5486561344817861625">Brauzerning qayta ishga tushishini simulyatsiyalash</translation>
+<translation id="5487460042548760727">Profil nomini bunga qayta nomlash: <ph name="PROFILE_NAME" /></translation>
 <translation id="5487521232677179737">Tarixni tozalash</translation>
 <translation id="5488093641312826914">“<ph name="COPIED_ITEM_NAME" />” nusxa olindi</translation>
 <translation id="5488508217173274228">Sinxronizatsiyani shifrlash parametrlari</translation>
@@ -4827,6 +4831,7 @@
 <translation id="6308937455967653460">&amp;Havolani saqlash...</translation>
 <translation id="6309443618838462258">Bu klaviatura administrator tomonidan taqiqlangan</translation>
 <translation id="6309510305002439352">Mikrofon oʻchiq</translation>
+<translation id="6310141306111263820">eSIM profili oʻrnatilmadi. Yordam olish uchun aloqa operatoriga murojaat qiling.</translation>
 <translation id="6311220991371174222">Profilni ochib bo‘lmadi. Chrome’ni qaytadan ishga tushiring.</translation>
 <translation id="6312403991423642364">Noma’lum tarmoq xatoligi</translation>
 <translation id="6312567056350025599">{NUM_DAYS,plural, =1{Xavfsizlik tekshiruvi 1 kun oldin bajarilgan}other{Xavfsizlik tekshiruvi {NUM_DAYS} kun oldin bajarilgan}}</translation>
@@ -5963,6 +5968,7 @@
 <translation id="7582582252461552277">Shu tarmoq afzal ko‘rilsin</translation>
 <translation id="7582844466922312471">Mobil internet modemi</translation>
 <translation id="7583948862126372804">Hisob</translation>
+<translation id="7586051298768394542">Avtomatik subtitr fayllarni yuklanmadi. Ovozingiz Googlega yuborilishi orqali ovoz bilan yozish davom etadi.</translation>
 <translation id="7586498138629385861">Chrome ilovalari yopilmaguncha brauzer ishlashda davom etadi.</translation>
 <translation id="7589461650300748890">Ehtiyot bo‘ling.</translation>
 <translation id="7593653750169415785">Bildirishnomalar bir necha marta yopilganligi uchun avtomatik bloklandi</translation>
@@ -6550,6 +6556,7 @@
 <translation id="8191230140820435481">Ilovalar, kengaytmalar va mavzularni boshqarish</translation>
 <translation id="8195027750202970175">Diskdagi hajmi</translation>
 <translation id="8198323535106903877">Sizga bu <ph name="NUMBER_OF_APPS" /> ta ilovani o‘rnatib beramiz</translation>
+<translation id="8198456017687137612">Translatsiya varagʻi</translation>
 <translation id="8199300056570174101">Tarmoq (xizmat) va qurilma parametrlari</translation>
 <translation id="8200772114523450471">Davom ettirish</translation>
 <translation id="8201717382574620700">Albom tanlash: <ph name="TOPIC_SOURCE" /></translation>
@@ -7134,6 +7141,7 @@
 <translation id="8847523528195140327">Muqova yopilganda hisobdan chiqish</translation>
 <translation id="8847988622838149491">USB</translation>
 <translation id="8849001918648564819">Yashirin</translation>
+<translation id="8849219423513870962"><ph name="PROFILE_NAME" /> nomli eSIM profilini olib tashlashni bekor qilish</translation>
 <translation id="8850251000316748990">Yana...</translation>
 <translation id="885246833287407341">API funksiyasi argumentlari</translation>
 <translation id="8853586775156634952">Bu karta faqat shu qurilmada saqlanadi</translation>
diff --git a/chrome/app/resources/google_chrome_strings_iw.xtb b/chrome/app/resources/google_chrome_strings_iw.xtb
index f10deb9f..586c175a 100644
--- a/chrome/app/resources/google_chrome_strings_iw.xtb
+++ b/chrome/app/resources/google_chrome_strings_iw.xtb
@@ -11,6 +11,7 @@
 <translation id="1125124144982679672">‏מי משתמש/ת ב-Chrome?</translation>
 <translation id="1142745911746664600">‏לא ניתן לעדכן את Chrome</translation>
 <translation id="1154147086299354128">‏&amp;פתיחה ב-Chrome</translation>
+<translation id="1278833599417554002">‏הפעלה מחדש לצורך עדכון &amp;Chrome</translation>
 <translation id="1293325835983155583">‏<ph name="MANAGER" /> דורש לקרוא את התנאים וההגבלות הבאים ולהסכים להם לפני השימוש במכשיר הזה. תנאים אלה לא מרחיבים, משנים או מגבילים את התנאים לשימוש ב-Google Chrome OS</translation>
 <translation id="1302523850133262269">‏יש להמתין בזמן ש-Chrome מתקין את עדכוני המערכת האחרונים.</translation>
 <translation id="137466361146087520">‏גרסת הבטא של Google Chrome</translation>
@@ -46,6 +47,7 @@
 <translation id="2063848847527508675">‏יש להפעיל מחדש את מערכת ההפעלה של Chrome כדי להחיל את העדכון.</translation>
 <translation id="2094919256425865063">‏לסגור את Chrome בכל זאת?</translation>
 <translation id="2120620239521071941">‏פעולה זו תמחק <ph name="ITEMS_COUNT" /> פריטים מהמכשיר. כדי לשחזר את הנתונים מאוחר יותר, יש להיכנס אל Chrome עם <ph name="USER_EMAIL" />.</translation>
+<translation id="2121284319307530122">‏הפעלה מחדש לצורך עדכון &amp;Chrome</translation>
 <translation id="2123055963409958220">‏דיווח על <ph name="BEGIN_LINK" />ההגדרות הנוכחיות<ph name="END_LINK" /> יעזור לשפר את Chrome</translation>
 <translation id="2151406531797534936">‏יש להפעיל מחדש את Chrome עכשיו</translation>
 <translation id="2246246234298806438">‏Google Chrome לא יכול להציג תצוגה מקדימה של ההדפסה כאשר מציג ה-‏PDF המובנה חסר.</translation>
@@ -235,6 +237,7 @@
 <translation id="7629695634924605473">‏Chrome מודיע לך אם הסיסמאות שלך נמצאות בסיכון</translation>
 <translation id="7641148173327520642">‏לפי הגדרת מנהל המערכת, Google Chrome יפתח את <ph name="ALTERNATIVE_BROWSER_NAME" /> כדי לגשת אל <ph name="TARGET_URL_HOSTNAME" />.</translation>
 <translation id="7651907282515937834">‏לוגו של Chrome Enterprise</translation>
+<translation id="7665553140559834626">‏הפעלה מחדש לצורך עדכון &amp;Chrome OS</translation>
 <translation id="7747138024166251722">המתקין לא הצליח ליצור ספרייה זמנית. יש לבדוק את המקום הפנוי בדיסק ואת האישור להתקנת תוכנה.</translation>
 <translation id="7761834446675418963">‏אפשר ללחוץ על השם שלך כדי לפתוח את Chrome ולהתחיל לגלוש.</translation>
 <translation id="7777080907402804672">‏אם אין לתמונה תיאור מועיל, Chrome ינסה לספק לך תיאור. כדי ליצור תיאורים, התמונות נשלחות אל Google. אפשר להשבית את האפשרות הזו בכל זמן דרך ההגדרות.</translation>
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index 3512417..66df7184 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -2972,6 +2972,9 @@
     {"enable-dns-proxy", flag_descriptions::kEnableDnsProxyName,
      flag_descriptions::kEnableDnsProxyDescription, kOsCrOS,
      FEATURE_VALUE_TYPE(ash::features::kEnableDnsProxy)},
+    {"dns-proxy-enable-doh", flag_descriptions::kDnsProxyEnableDOHName,
+     flag_descriptions::kDnsProxyEnableDOHDescription, kOsCrOS,
+     FEATURE_VALUE_TYPE(::features::kDnsProxyEnableDOH)},
     {"instant-tethering", flag_descriptions::kTetherName,
      flag_descriptions::kTetherDescription, kOsCrOS,
      FEATURE_VALUE_TYPE(chromeos::features::kInstantTethering)},
diff --git a/chrome/browser/accessibility/caption_controller.cc b/chrome/browser/accessibility/caption_controller.cc
index 6843832..d644ce3 100644
--- a/chrome/browser/accessibility/caption_controller.cc
+++ b/chrome/browser/accessibility/caption_controller.cc
@@ -122,7 +122,8 @@
 void CaptionController::OnLiveCaptionLanguageChanged() {
   if (enabled_)
     speech::SodaInstaller::GetInstance()->InstallLanguage(
-        profile_->GetPrefs(), g_browser_process->local_state());
+        profile_->GetPrefs()->GetString(prefs::kLiveCaptionLanguageCode),
+        g_browser_process->local_state());
 }
 
 bool CaptionController::IsLiveCaptionEnabled() {
diff --git a/chrome/browser/accessibility/soda_installer_impl.cc b/chrome/browser/accessibility/soda_installer_impl.cc
index 79526d1..1dfc341 100644
--- a/chrome/browser/accessibility/soda_installer_impl.cc
+++ b/chrome/browser/accessibility/soda_installer_impl.cc
@@ -104,11 +104,11 @@
   }
 }
 
-void SodaInstallerImpl::InstallLanguage(PrefService* profile_prefs,
+void SodaInstallerImpl::InstallLanguage(const std::string& language,
                                         PrefService* global_prefs) {
   language_installed_ = false;
   component_updater::RegisterSodaLanguageComponent(
-      g_browser_process->component_updater(), profile_prefs, global_prefs,
+      g_browser_process->component_updater(), language, global_prefs,
       base::BindOnce(&SodaInstallerImpl::OnSodaLanguagePackInstalled,
                      weak_factory_.GetWeakPtr()));
 
diff --git a/chrome/browser/accessibility/soda_installer_impl.h b/chrome/browser/accessibility/soda_installer_impl.h
index 867e97f75..8217e02 100644
--- a/chrome/browser/accessibility/soda_installer_impl.h
+++ b/chrome/browser/accessibility/soda_installer_impl.h
@@ -39,7 +39,7 @@
   base::FilePath GetLanguagePath() const override;
 
   // SodaInstaller:
-  void InstallLanguage(PrefService* profile_prefs,
+  void InstallLanguage(const std::string& language,
                        PrefService* global_prefs) override;
   bool IsSodaInstalled() const override;
   bool IsLanguageInstalled(
diff --git a/chrome/browser/apps/app_service/publishers/web_apps_base.cc b/chrome/browser/apps/app_service/publishers/web_apps_base.cc
index f47cf92..d06ba48 100644
--- a/chrome/browser/apps/app_service/publishers/web_apps_base.cc
+++ b/chrome/browser/apps/app_service/publishers/web_apps_base.cc
@@ -377,11 +377,7 @@
     const base::Time& last_launch_time) {
   const web_app::WebApp* web_app = GetWebApp(app_id);
   if (web_app && Accepts(app_id)) {
-    apps::mojom::AppPtr app = apps::mojom::App::New();
-    app->app_type = app_type_;
-    app->app_id = app_id;
-    app->last_launch_time = web_app->last_launch_time();
-    Publish(std::move(app), subscribers_);
+    Publish(apps_util::ConvertLaunchedWebApp(web_app, app_type_), subscribers_);
   }
 }
 
diff --git a/chrome/browser/apps/app_service/web_apps_publisher_host.cc b/chrome/browser/apps/app_service/web_apps_publisher_host.cc
index d9c6ea8..05c74d8 100644
--- a/chrome/browser/apps/app_service/web_apps_publisher_host.cc
+++ b/chrome/browser/apps/app_service/web_apps_publisher_host.cc
@@ -5,15 +5,42 @@
 #include "chrome/browser/apps/app_service/web_apps_publisher_host.h"
 
 #include "base/bind.h"
+#include "base/feature_list.h"
 #include "base/one_shot_event.h"
+#include "chrome/browser/apps/app_service/app_icon_factory.h"
 #include "chrome/browser/apps/app_service/web_apps_utils.h"
 #include "chrome/browser/web_applications/web_app.h"
 #include "chrome/browser/web_applications/web_app_provider.h"
 #include "chrome/browser/web_applications/web_app_registrar.h"
+#include "chrome/common/chrome_features.h"
 #include "chromeos/lacros/lacros_service.h"
 
 namespace apps {
 
+namespace {
+
+IconEffects GetIconEffects(const web_app::WebApp* web_app) {
+  // TODO(crbug.com/1194709): Keep consistent behavior with WebAppsChromeOs:
+  // Support pausing and Chrome badging, and blocking based on
+  // chromeos_data()->is_disabled.
+  IconEffects icon_effects = IconEffects::kRoundCorners;
+  if (!web_app->is_locally_installed()) {
+    icon_effects |= IconEffects::kBlocked;
+  }
+
+  if (base::FeatureList::IsEnabled(features::kAppServiceAdaptiveIcon)) {
+    icon_effects |= web_app->is_generated_icon()
+                        ? IconEffects::kCrOsStandardMask
+                        : IconEffects::kCrOsStandardIcon;
+  } else {
+    icon_effects |= IconEffects::kResizeAndPad;
+  }
+
+  return icon_effects;
+}
+
+}  // namespace
+
 // static
 crosapi::mojom::AppPublisher* WebAppsPublisherHost::publisher_for_testing_ =
     nullptr;
@@ -82,6 +109,16 @@
   Publish(Convert(web_app, apps::mojom::Readiness::kReady));
 }
 
+void WebAppsPublisherHost::OnWebAppManifestUpdated(const web_app::AppId& app_id,
+                                                   base::StringPiece old_name) {
+  const web_app::WebApp* web_app = GetWebApp(app_id);
+  if (!web_app) {
+    return;
+  }
+
+  Publish(Convert(web_app, apps::mojom::Readiness::kReady));
+}
+
 void WebAppsPublisherHost::OnWebAppWillBeUninstalled(
     const web_app::AppId& app_id) {
   const web_app::WebApp* web_app = GetWebApp(app_id);
@@ -97,6 +134,33 @@
   registrar_observation_.Reset();
 }
 
+void WebAppsPublisherHost::OnWebAppLocallyInstalledStateChanged(
+    const web_app::AppId& app_id,
+    bool is_locally_installed) {
+  const web_app::WebApp* web_app = GetWebApp(app_id);
+  if (!web_app) {
+    return;
+  }
+
+  auto app = apps::mojom::App::New();
+  app->app_type = apps::mojom::AppType::kWeb;
+  app->app_id = app_id;
+  app->icon_key = icon_key_factory_.MakeIconKey(GetIconEffects(web_app));
+  Publish(std::move(app));
+}
+
+void WebAppsPublisherHost::OnWebAppLastLaunchTimeChanged(
+    const std::string& app_id,
+    const base::Time& last_launch_time) {
+  const web_app::WebApp* web_app = GetWebApp(app_id);
+  if (!web_app) {
+    return;
+  }
+
+  Publish(
+      apps_util::ConvertLaunchedWebApp(web_app, apps::mojom::AppType::kWeb));
+}
+
 const web_app::WebApp* WebAppsPublisherHost::GetWebApp(
     const web_app::AppId& app_id) const {
   return registrar().GetAppById(app_id);
@@ -104,9 +168,11 @@
 
 apps::mojom::AppPtr WebAppsPublisherHost::Convert(
     const web_app::WebApp* web_app,
-    apps::mojom::Readiness readiness) const {
-  return apps_util::ConvertWebApp(profile_, web_app, apps::mojom::AppType::kWeb,
-                                  readiness);
+    apps::mojom::Readiness readiness) {
+  apps::mojom::AppPtr app = apps_util::ConvertWebApp(
+      profile_, web_app, apps::mojom::AppType::kWeb, readiness);
+  app->icon_key = icon_key_factory_.MakeIconKey(GetIconEffects(web_app));
+  return app;
 }
 
 void WebAppsPublisherHost::Publish(apps::mojom::AppPtr app) {
diff --git a/chrome/browser/apps/app_service/web_apps_publisher_host.h b/chrome/browser/apps/app_service/web_apps_publisher_host.h
index 8b44d945..d250ec18 100644
--- a/chrome/browser/apps/app_service/web_apps_publisher_host.h
+++ b/chrome/browser/apps/app_service/web_apps_publisher_host.h
@@ -10,6 +10,9 @@
 
 #include "base/memory/weak_ptr.h"
 #include "base/scoped_observation.h"
+#include "base/strings/string_piece.h"
+#include "base/time/time.h"
+#include "chrome/browser/apps/app_service/icon_key_util.h"
 #include "chrome/browser/web_applications/components/app_registrar.h"
 #include "chrome/browser/web_applications/components/app_registrar_observer.h"
 #include "chrome/browser/web_applications/components/web_app_id.h"
@@ -46,13 +49,15 @@
 
   // web_app::AppRegistrarObserver:
   void OnWebAppInstalled(const web_app::AppId& app_id) override;
+  void OnWebAppManifestUpdated(const web_app::AppId& app_id,
+                               base::StringPiece old_name) override;
   void OnWebAppWillBeUninstalled(const web_app::AppId& app_id) override;
   void OnAppRegistrarDestroyed() override;
-
-  // TODO(crbug.com/1194709): override
-  // - OnWebAppLastLaunchTimeChanged
-  // - OnWebAppLocallyInstalledStateChanged
-  // - OnWebAppManifestUpdated
+  void OnWebAppLocallyInstalledStateChanged(const web_app::AppId& app_id,
+                                            bool is_locally_installed) override;
+  void OnWebAppLastLaunchTimeChanged(
+      const std::string& app_id,
+      const base::Time& last_launch_time) override;
 
   // TODO(crbug.com/1194709): inherit from content_settings::Observer and
   // override:
@@ -62,7 +67,7 @@
 
   const web_app::WebApp* GetWebApp(const web_app::AppId& app_id) const;
   apps::mojom::AppPtr Convert(const web_app::WebApp* web_app,
-                              apps::mojom::Readiness readiness) const;
+                              apps::mojom::Readiness readiness);
   void Publish(apps::mojom::AppPtr app);
 
   static crosapi::mojom::AppPublisher* publisher_for_testing_;
@@ -70,6 +75,8 @@
   Profile* const profile_;
   web_app::WebAppProvider* const provider_;
 
+  apps_util::IncrementingIconKeyFactory icon_key_factory_;
+
   base::ScopedObservation<web_app::AppRegistrar, web_app::AppRegistrarObserver>
       registrar_observation_{this};
 
diff --git a/chrome/browser/apps/app_service/web_apps_publisher_host_browsertest.cc b/chrome/browser/apps/app_service/web_apps_publisher_host_browsertest.cc
index 2b9c086..7abf539 100644
--- a/chrome/browser/apps/app_service/web_apps_publisher_host_browsertest.cc
+++ b/chrome/browser/apps/app_service/web_apps_publisher_host_browsertest.cc
@@ -5,14 +5,28 @@
 #include "chrome/browser/apps/app_service/web_apps_publisher_host.h"
 
 #include <iterator>
+#include <memory>
 #include <vector>
 
+#include "base/callback_helpers.h"
 #include "base/run_loop.h"
+#include "base/strings/utf_string_conversions.h"
 #include "base/test/bind.h"
+#include "base/test/scoped_feature_list.h"
+#include "chrome/browser/apps/app_service/app_icon_factory.h"
 #include "chrome/browser/ui/web_applications/test/web_app_browsertest_util.h"
 #include "chrome/browser/ui/web_applications/web_app_controller_browsertest.h"
+#include "chrome/browser/web_applications/components/app_registry_controller.h"
+#include "chrome/browser/web_applications/components/install_manager.h"
+#include "chrome/browser/web_applications/components/web_app_constants.h"
 #include "chrome/browser/web_applications/components/web_app_id.h"
+#include "chrome/browser/web_applications/components/web_app_install_utils.h"
+#include "chrome/browser/web_applications/components/web_application_info.h"
+#include "chrome/browser/web_applications/web_app_provider.h"
+#include "chrome/browser/web_applications/web_app_sync_bridge.h"
+#include "chrome/common/chrome_features.h"
 #include "chromeos/crosapi/mojom/app_service.mojom.h"
+#include "components/webapps/browser/installable/installable_metrics.h"
 #include "content/public/test/browser_test.h"
 #include "net/test/embedded_test_server/embedded_test_server.h"
 
@@ -42,7 +56,17 @@
   std::unique_ptr<base::RunLoop> run_loop_;
 };
 
-using WebAppsPublisherHostBrowserTest = web_app::WebAppControllerBrowserTest;
+class WebAppsPublisherHostBrowserTest
+    : public web_app::WebAppControllerBrowserTest {
+ public:
+  WebAppsPublisherHostBrowserTest() {
+    feature_list_.InitAndEnableFeature(features::kAppServiceAdaptiveIcon);
+  }
+  ~WebAppsPublisherHostBrowserTest() override = default;
+
+ private:
+  base::test::ScopedFeatureList feature_list_;
+};
 
 IN_PROC_BROWSER_TEST_F(WebAppsPublisherHostBrowserTest, PublishApps) {
   ASSERT_TRUE(embedded_test_server()->Start());
@@ -67,6 +91,8 @@
   EXPECT_EQ(mock_app_publisher.get_deltas().back()->app_id, app_id);
   EXPECT_EQ(mock_app_publisher.get_deltas().back()->readiness,
             apps::mojom::Readiness::kReady);
+  EXPECT_EQ(mock_app_publisher.get_deltas().back()->icon_key->icon_effects,
+            IconEffects::kRoundCorners | IconEffects::kCrOsStandardIcon);
 
   {
     base::RunLoop run_loop;
@@ -84,4 +110,117 @@
   }
 }
 
+IN_PROC_BROWSER_TEST_F(WebAppsPublisherHostBrowserTest, LaunchTime) {
+  ASSERT_TRUE(embedded_test_server()->Start());
+  MockAppPublisher mock_app_publisher;
+  WebAppsPublisherHost::SetPublisherForTesting(&mock_app_publisher);
+
+  web_app::AppId app_id = web_app::InstallWebAppFromManifest(
+      browser(), embedded_test_server()->GetURL("/web_apps/basic.html"));
+  WebAppsPublisherHost web_apps_publisher_host(profile());
+  mock_app_publisher.Wait();
+  ASSERT_TRUE(
+      mock_app_publisher.get_deltas().back()->last_launch_time.has_value());
+  const base::Time last_launch_time =
+      *mock_app_publisher.get_deltas().back()->last_launch_time;
+
+  LaunchWebAppBrowser(app_id);
+  mock_app_publisher.Wait();
+  EXPECT_EQ(mock_app_publisher.get_deltas().back()->app_id, app_id);
+  ASSERT_TRUE(
+      mock_app_publisher.get_deltas().back()->last_launch_time.has_value());
+  EXPECT_GT(*mock_app_publisher.get_deltas().back()->last_launch_time,
+            last_launch_time);
+}
+
+IN_PROC_BROWSER_TEST_F(WebAppsPublisherHostBrowserTest, ManifestUpdate) {
+  ASSERT_TRUE(embedded_test_server()->Start());
+  const GURL app_url =
+      embedded_test_server()->GetURL("app.site.com", "/simple.html");
+
+  MockAppPublisher mock_app_publisher;
+  WebAppsPublisherHost::SetPublisherForTesting(&mock_app_publisher);
+
+  WebAppsPublisherHost web_apps_publisher_host(profile());
+
+  web_app::AppId app_id;
+  {
+    const std::u16string original_description = u"Original Web App";
+    auto web_app_info = std::make_unique<WebApplicationInfo>();
+    web_app_info->start_url = app_url;
+    web_app_info->scope = app_url;
+    web_app_info->title = original_description;
+    web_app_info->description = original_description;
+    app_id = InstallWebApp(std::move(web_app_info));
+
+    mock_app_publisher.Wait();
+    EXPECT_EQ(*mock_app_publisher.get_deltas().back()->description,
+              base::UTF16ToUTF8(original_description));
+  }
+
+  {
+    const std::u16string updated_description = u"Updated Web App";
+    auto web_app_info = std::make_unique<WebApplicationInfo>();
+    web_app_info->start_url = app_url;
+    web_app_info->scope = app_url;
+    web_app_info->title = updated_description;
+    web_app_info->description = updated_description;
+
+    base::RunLoop run_loop;
+    provider().install_manager().UpdateWebAppFromInfo(
+        app_id, std::move(web_app_info),
+        /*redownload_app_icons=*/false,
+        base::BindLambdaForTesting(
+            [&run_loop](const web_app::AppId& app_id,
+                        web_app::InstallResultCode code) { run_loop.Quit(); }));
+
+    run_loop.Run();
+    mock_app_publisher.Wait();
+    EXPECT_EQ(*mock_app_publisher.get_deltas().back()->description,
+              base::UTF16ToUTF8(updated_description));
+  }
+}
+
+IN_PROC_BROWSER_TEST_F(WebAppsPublisherHostBrowserTest, LocallyInstalledState) {
+  ASSERT_TRUE(embedded_test_server()->Start());
+  const GURL app_url =
+      embedded_test_server()->GetURL("app.site.com", "/simple.html");
+
+  MockAppPublisher mock_app_publisher;
+  WebAppsPublisherHost::SetPublisherForTesting(&mock_app_publisher);
+
+  web_app::AppId app_id;
+  {
+    const std::u16string description = u"Web App";
+    auto web_app_info = std::make_unique<WebApplicationInfo>();
+    web_app_info->start_url = app_url;
+    web_app_info->scope = app_url;
+    web_app_info->title = description;
+    web_app_info->description = description;
+    app_id = InstallWebApp(std::move(web_app_info));
+
+    provider()
+        .registry_controller()
+        .AsWebAppSyncBridge()
+        ->SetAppIsLocallyInstalled(app_id,
+                                   /*is_locally_installed=*/false);
+  }
+
+  WebAppsPublisherHost web_apps_publisher_host(profile());
+  mock_app_publisher.Wait();
+  EXPECT_EQ(mock_app_publisher.get_deltas().back()->icon_key->icon_effects,
+            static_cast<IconEffects>(IconEffects::kRoundCorners |
+                                     IconEffects::kBlocked |
+                                     IconEffects::kCrOsStandardMask));
+
+  provider()
+      .registry_controller()
+      .AsWebAppSyncBridge()
+      ->SetAppIsLocallyInstalled(app_id,
+                                 /*is_locally_installed=*/true);
+  mock_app_publisher.Wait();
+  EXPECT_EQ(mock_app_publisher.get_deltas().back()->icon_key->icon_effects,
+            IconEffects::kRoundCorners | IconEffects::kCrOsStandardMask);
+}
+
 }  // namespace apps
diff --git a/chrome/browser/apps/app_service/web_apps_utils.cc b/chrome/browser/apps/app_service/web_apps_utils.cc
index 351eab9..9d95a2cb 100644
--- a/chrome/browser/apps/app_service/web_apps_utils.cc
+++ b/chrome/browser/apps/app_service/web_apps_utils.cc
@@ -156,6 +156,15 @@
   return app;
 }
 
+apps::mojom::AppPtr ConvertLaunchedWebApp(const web_app::WebApp* web_app,
+                                          apps::mojom::AppType app_type) {
+  apps::mojom::AppPtr app = apps::mojom::App::New();
+  app->app_type = app_type;
+  app->app_id = web_app->app_id();
+  app->last_launch_time = web_app->last_launch_time();
+  return app;
+}
+
 webapps::WebappUninstallSource ConvertUninstallSourceToWebAppUninstallSource(
     apps::mojom::UninstallSource uninstall_source) {
   switch (uninstall_source) {
diff --git a/chrome/browser/apps/app_service/web_apps_utils.h b/chrome/browser/apps/app_service/web_apps_utils.h
index c04d1db7..17ed1a5 100644
--- a/chrome/browser/apps/app_service/web_apps_utils.h
+++ b/chrome/browser/apps/app_service/web_apps_utils.h
@@ -42,6 +42,11 @@
 apps::mojom::AppPtr ConvertUninstalledWebApp(const web_app::WebApp* web_app,
                                              apps::mojom::AppType app_type);
 
+// Constructs an App with only the information required to update
+// last launch time.
+apps::mojom::AppPtr ConvertLaunchedWebApp(const web_app::WebApp* web_app,
+                                          apps::mojom::AppType app_type);
+
 // Converts |uninstall_source| to a |WebappUninstallSource|.
 webapps::WebappUninstallSource ConvertUninstallSourceToWebAppUninstallSource(
     apps::mojom::UninstallSource uninstall_source);
diff --git a/chrome/browser/apps/app_service/webapk/webapk_install_task.cc b/chrome/browser/apps/app_service/webapk/webapk_install_task.cc
index e995ed1..8e7af4b 100644
--- a/chrome/browser/apps/app_service/webapk/webapk_install_task.cc
+++ b/chrome/browser/apps/app_service/webapk/webapk_install_task.cc
@@ -11,6 +11,7 @@
 #include "base/command_line.h"
 #include "base/location.h"
 #include "base/logging.h"
+#include "base/strings/strcat.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/task/task_traits.h"
 #include "base/task/thread_pool.h"
@@ -29,6 +30,7 @@
 #include "components/webapk/webapk.pb.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/storage_partition.h"
+#include "google_apis/google_api_keys.h"
 #include "net/base/load_flags.h"
 #include "net/http/http_status_code.h"
 #include "net/traffic_annotation/network_traffic_annotation.h"
@@ -50,6 +52,9 @@
 // The seed to use when taking the murmur2 hash of the icon.
 const uint64_t kMurmur2HashSeed = 0;
 
+constexpr char kWebApkServerUrl[] =
+    "https://webapk.googleapis.com/v1/webApks?key=";
+
 constexpr net::NetworkTrafficAnnotationTag kWebApksTrafficAnnotation =
     net::DefineNetworkTrafficAnnotation("webapk_minter_install_request",
                                         R"(
@@ -77,12 +82,14 @@
       )");
 
 GURL GetServerUrl() {
-  // While the code is pre-Canary quality, a custom server URL must be supplied.
   std::string server_url =
       base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
           switches::kWebApkServerUrl);
-  CHECK(!server_url.empty())
-      << "A WebAPK server URL must be provided with --webapk-server-url";
+
+  if (server_url.empty()) {
+    server_url = base::StrCat({kWebApkServerUrl, google_apis::GetAPIKey()});
+  }
+
   return GURL(server_url);
 }
 
diff --git a/chrome/browser/ash/accessibility/soda_installer_impl_chromeos.cc b/chrome/browser/ash/accessibility/soda_installer_impl_chromeos.cc
index 161bc97..120d698 100644
--- a/chrome/browser/ash/accessibility/soda_installer_impl_chromeos.cc
+++ b/chrome/browser/ash/accessibility/soda_installer_impl_chromeos.cc
@@ -66,7 +66,7 @@
                           base::Unretained(this)));
 }
 
-void SodaInstallerImplChromeOS::InstallLanguage(PrefService* profile_prefs,
+void SodaInstallerImplChromeOS::InstallLanguage(const std::string& language,
                                                 PrefService* global_prefs) {
   if (!base::FeatureList::IsEnabled(media::kUseSodaForLiveCaption))
     return;
@@ -78,9 +78,7 @@
   // TODO(crbug.com/1055150): Compare user's language to a list of
   // supported languages and map it to a DLC ID. For now, default to
   // installing the SODA English-US DLC.
-  const std::string user_language =
-      profile_prefs->GetString(prefs::kLiveCaptionLanguageCode);
-  DCHECK_EQ(user_language, "en-US");
+  DCHECK_EQ(language, "en-US");
 
   language_installed_ = false;
   is_language_downloading_ = true;
diff --git a/chrome/browser/ash/accessibility/soda_installer_impl_chromeos.h b/chrome/browser/ash/accessibility/soda_installer_impl_chromeos.h
index eaf65a5..ccedccd9 100644
--- a/chrome/browser/ash/accessibility/soda_installer_impl_chromeos.h
+++ b/chrome/browser/ash/accessibility/soda_installer_impl_chromeos.h
@@ -37,7 +37,7 @@
   base::FilePath GetLanguagePath() const override;
 
   // SodaInstaller:
-  void InstallLanguage(PrefService* profile_prefs,
+  void InstallLanguage(const std::string& language,
                        PrefService* global_prefs) override;
   bool IsSodaInstalled() const override;
   bool IsLanguageInstalled(
diff --git a/chrome/browser/ash/arc/tracing/arc_system_stat_collector.cc b/chrome/browser/ash/arc/tracing/arc_system_stat_collector.cc
index 2b206be..9911fa0 100644
--- a/chrome/browser/ash/arc/tracing/arc_system_stat_collector.cc
+++ b/chrome/browser/ash/arc/tracing/arc_system_stat_collector.cc
@@ -196,6 +196,7 @@
   SystemReader reader = SystemReader::kTotal;
   int64_t* value = nullptr;
   int64_t default_value = 0;
+  bool error_reported = false;
 };
 
 struct ArcSystemStatCollector::SystemReadersContext {
@@ -255,6 +256,8 @@
       context->system_readers[reader].reset(
           open(counter_file_path.value().c_str(), O_RDONLY));
       if (!context->system_readers[reader].is_valid()) {
+        // TODO(b/182801299): Some intel-rapl files may not be opened from user
+        // process by design. Add support to access through debugd as root.
         LOG(ERROR) << "Failed to open power counter: " << domain_name << " as "
                    << counter_file_path.value();
       }
@@ -424,11 +427,16 @@
       cpu_temperature.MaybeAdd(timestamp, sample.cpu_temperature);
     if (sample.cpu_frequency > 0)
       cpu_frequency.MaybeAdd(timestamp, sample.cpu_frequency);
-    package_power_constraint.MaybeAdd(timestamp,
-                                      sample.package_power_constraint);
-    cpu_power.MaybeAdd(timestamp, sample.cpu_power);
-    gpu_power.MaybeAdd(timestamp, sample.gpu_power);
-    memory_power.MaybeAdd(timestamp, sample.memory_power);
+    if (sample.package_power_constraint > 0) {
+      package_power_constraint.MaybeAdd(timestamp,
+                                        sample.package_power_constraint);
+    }
+    if (sample.cpu_power > 0)
+      cpu_power.MaybeAdd(timestamp, sample.cpu_power);
+    if (sample.gpu_power > 0)
+      gpu_power.MaybeAdd(timestamp, sample.gpu_power);
+    if (sample.memory_power > 0)
+      memory_power.MaybeAdd(timestamp, sample.memory_power);
   }
 
   // These are optional. Keep it if non-zero value is detected.
@@ -650,16 +658,16 @@
 
   OneValueReaderInfo one_value_readers[] = {
       {SystemReader::kCpuTemperature, &context->current_frame.cpu_temperature,
-       std::numeric_limits<int>::min()},
-      {SystemReader::kCpuFrequency, &context->current_frame.cpu_frequency, 0},
+       std::numeric_limits<int>::min(), false},
+      {SystemReader::kCpuFrequency, &context->current_frame.cpu_frequency, 0,
+       false},
       {SystemReader::kPackagePowerConstraint,
-       &context->current_frame.package_power_constraint, 0},
-      {SystemReader::kCpuEnergy, &context->current_frame.cpu_energy, 0},
-      {SystemReader::kGpuEnergy, &context->current_frame.gpu_energy, 0},
-      {SystemReader::kMemoryEnergy, &context->current_frame.memory_energy, 0},
+       &context->current_frame.package_power_constraint, 0, false},
+      {SystemReader::kCpuEnergy, &context->current_frame.cpu_energy, 0, false},
+      {SystemReader::kGpuEnergy, &context->current_frame.gpu_energy, 0, false},
+      {SystemReader::kMemoryEnergy, &context->current_frame.memory_energy, 0,
+       false},
   };
-  static bool one_value_readers_error_reported[base::size(one_value_readers)] =
-      {0};
 
   for (size_t i = 0; i < base::size(one_value_readers); ++i) {
     if (!context->system_readers[one_value_readers[i].reader].is_valid() ||
@@ -667,11 +675,11 @@
             context->system_readers[one_value_readers[i].reader].get(),
             kOneValueColumns, one_value_readers[i].value)) {
       *one_value_readers[i].value = one_value_readers[i].default_value;
-      if (one_value_readers_error_reported[i])
+      if (one_value_readers[i].error_reported)
         continue;
-      LOG(ERROR) << "Failed to read system stat "
+      LOG(ERROR) << "Failed to read one value system stat: "
                  << one_value_readers[i].reader;
-      one_value_readers_error_reported[i] = true;
+      one_value_readers[i].error_reported = true;
     }
   }
 
diff --git a/chrome/browser/ash/arc/tracing/arc_value_event.h b/chrome/browser/ash/arc/tracing/arc_value_event.h
index 2350e3c0..051b235 100644
--- a/chrome/browser/ash/arc/tracing/arc_value_event.h
+++ b/chrome/browser/ash/arc/tracing/arc_value_event.h
@@ -52,7 +52,7 @@
    * kCpuFrequency - khz
    * kCpuPower - milli-watts
    * kGpuPower - milli-watts
-   * kMemporyPower - milli-watts
+   * kMemoryPower - milli-watts
    * kPackagePowerConstraint - milli-watts
    */
   int value;
diff --git a/chrome/browser/ash/borealis/borealis_context_manager_impl.cc b/chrome/browser/ash/borealis/borealis_context_manager_impl.cc
index c9f0fa2..08bca128 100644
--- a/chrome/browser/ash/borealis/borealis_context_manager_impl.cc
+++ b/chrome/browser/ash/borealis/borealis_context_manager_impl.cc
@@ -14,6 +14,7 @@
 #include "chrome/browser/ash/borealis/borealis_context_manager.h"
 #include "chrome/browser/ash/borealis/borealis_metrics.h"
 #include "chrome/browser/ash/borealis/borealis_task.h"
+#include "chrome/browser/ash/borealis/borealis_util.h"
 #include "chrome/browser/ash/borealis/infra/described.h"
 #include "chrome/browser/ash/profiles/profile_helper.h"
 #include "chromeos/dbus/concierge_client.h"
@@ -179,6 +180,7 @@
 
 void BorealisContextManagerImpl::ShutDownBorealis(
     base::OnceCallback<void(BorealisShutdownResult)> on_shutdown_callback) {
+  CloseBorealisSplashScreenView();
   // Get the context we are shutting down, either from an in-progress startup or
   // from the running one.
   std::unique_ptr<BorealisContext> shutdown_context;
@@ -253,6 +255,7 @@
   if (context_ && context_->vm_name() == signal.name() &&
       signal.owner_id() ==
           chromeos::ProfileHelper::GetUserIdHashFromProfile(profile_)) {
+    CloseBorealisSplashScreenView();
     // If |context_| exists, it's a "running" Borealis instance which we didn't
     // request to shut down.
     context_->NotifyUnexpectedVmShutdown();
diff --git a/chrome/browser/ash/kerberos/kerberos_credentials_manager.cc b/chrome/browser/ash/kerberos/kerberos_credentials_manager.cc
index aaceb7d6..add806b 100644
--- a/chrome/browser/ash/kerberos/kerberos_credentials_manager.cc
+++ b/chrome/browser/ash/kerberos/kerberos_credentials_manager.cc
@@ -33,7 +33,7 @@
 #include "net/base/escape.h"
 #include "third_party/cros_system_api/dbus/kerberos/dbus-constants.h"
 
-namespace chromeos {
+namespace ash {
 
 namespace {
 
@@ -301,7 +301,7 @@
       backoff_entry_for_managed_accounts_(&kBackoffPolicyForManagedAccounts) {
   DCHECK(primary_profile_);
   const user_manager::User* primary_user =
-      chromeos::ProfileHelper::Get()->GetUserByProfile(primary_profile);
+      ProfileHelper::Get()->GetUserByProfile(primary_profile);
   DCHECK(primary_user);
 
   // Set up expansions:
@@ -965,4 +965,4 @@
   add_managed_account_callback_for_testing_ = std::move(callback);
 }
 
-}  // namespace chromeos
+}  // namespace ash
diff --git a/chrome/browser/ash/kerberos/kerberos_credentials_manager.h b/chrome/browser/ash/kerberos/kerberos_credentials_manager.h
index a688fdc9..16cc63e 100644
--- a/chrome/browser/ash/kerberos/kerberos_credentials_manager.h
+++ b/chrome/browser/ash/kerberos/kerberos_credentials_manager.h
@@ -17,6 +17,8 @@
 #include "base/timer/timer.h"
 #include "chrome/browser/ash/authpolicy/kerberos_files_handler.h"
 #include "chromeos/dbus/kerberos/kerberos_service.pb.h"
+// TODO(https://crbug.com/1164001): forward declare when moved ash
+#include "chromeos/network/onc/variable_expander.h"
 #include "components/keyed_service/core/keyed_service.h"
 #include "components/policy/core/common/policy_namespace.h"
 #include "components/policy/core/common/policy_service.h"
@@ -29,12 +31,11 @@
 
 namespace policy {
 class PolicyMap;
-}
+}  // namespace policy
 
-namespace chromeos {
+namespace ash {
 
 class KerberosAddAccountRunner;
-class VariableExpander;
 
 class KerberosCredentialsManager : public KeyedService,
                                    public policy::PolicyService::Observer {
@@ -303,6 +304,11 @@
   DISALLOW_COPY_AND_ASSIGN(KerberosCredentialsManager);
 };
 
+}  // namespace ash
+
+// TODO(https://crbug.com/1164001): remove when ChromOS code migration is done.
+namespace chromeos {
+using ::ash::KerberosCredentialsManager;
 }  // namespace chromeos
 
 #endif  // CHROME_BROWSER_ASH_KERBEROS_KERBEROS_CREDENTIALS_MANAGER_H_
diff --git a/chrome/browser/ash/kerberos/kerberos_credentials_manager_factory.cc b/chrome/browser/ash/kerberos/kerberos_credentials_manager_factory.cc
index a3649599..0a516524 100644
--- a/chrome/browser/ash/kerberos/kerberos_credentials_manager_factory.cc
+++ b/chrome/browser/ash/kerberos/kerberos_credentials_manager_factory.cc
@@ -14,7 +14,7 @@
 #include "chrome/browser/profiles/profile.h"
 #include "components/keyed_service/content/browser_context_dependency_manager.h"
 
-namespace chromeos {
+namespace ash {
 
 namespace {
 
@@ -31,7 +31,7 @@
       return nullptr;
     // Get primary profile from primary user. Note that it only gets primary
     // profile if it is fully created.
-    profile = chromeos::ProfileHelper::Get()->GetProfileByUser(primary_user);
+    profile = ProfileHelper::Get()->GetProfileByUser(primary_user);
   }
   return profile;
 }
@@ -103,4 +103,4 @@
   return new KerberosCredentialsManager(local_state, profile);
 }
 
-}  // namespace chromeos
+}  // namespace ash
diff --git a/chrome/browser/ash/kerberos/kerberos_credentials_manager_factory.h b/chrome/browser/ash/kerberos/kerberos_credentials_manager_factory.h
index 3c4c1d8..565c42a 100644
--- a/chrome/browser/ash/kerberos/kerberos_credentials_manager_factory.h
+++ b/chrome/browser/ash/kerberos/kerberos_credentials_manager_factory.h
@@ -13,7 +13,7 @@
 struct DefaultSingletonTraits;
 }  // namespace base
 
-namespace chromeos {
+namespace ash {
 
 class KerberosCredentialsManager;
 
@@ -70,6 +70,11 @@
   mutable bool service_instance_created_;
 };
 
+}  // namespace ash
+
+// TODO(https://crbug.com/1164001): remove when ChromOS code migration is done.
+namespace chromeos {
+using ::ash::KerberosCredentialsManagerFactory;
 }  // namespace chromeos
 
 #endif  // CHROME_BROWSER_ASH_KERBEROS_KERBEROS_CREDENTIALS_MANAGER_FACTORY_H_
diff --git a/chrome/browser/ash/kerberos/kerberos_credentials_manager_factory_browsertest.cc b/chrome/browser/ash/kerberos/kerberos_credentials_manager_factory_browsertest.cc
index f041e58..5243178 100644
--- a/chrome/browser/ash/kerberos/kerberos_credentials_manager_factory_browsertest.cc
+++ b/chrome/browser/ash/kerberos/kerberos_credentials_manager_factory_browsertest.cc
@@ -14,7 +14,7 @@
 #include "chrome/test/base/in_process_browser_test.h"
 #include "content/public/test/browser_test.h"
 
-namespace chromeos {
+namespace ash {
 
 class KerberosCredentialsManagerFactoryBrowserTest
     : public InProcessBrowserTest {
@@ -72,4 +72,4 @@
   ASSERT_EQ(KerberosCredentialsManagerFactory::Get(other_profile), manager);
 }
 
-}  // namespace chromeos
+}  // namespace ash
diff --git a/chrome/browser/ash/kerberos/kerberos_credentials_manager_test.cc b/chrome/browser/ash/kerberos/kerberos_credentials_manager_test.cc
index aae1502..07b5dde 100644
--- a/chrome/browser/ash/kerberos/kerberos_credentials_manager_test.cc
+++ b/chrome/browser/ash/kerberos/kerberos_credentials_manager_test.cc
@@ -32,7 +32,7 @@
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-namespace chromeos {
+namespace ash {
 
 namespace {
 
@@ -154,7 +154,7 @@
       : scoped_user_manager_(
             std::make_unique<testing::NiceMock<MockUserManager>>()),
         local_state_(TestingBrowserProcess::GetGlobal()) {
-    SessionManagerClient::InitializeFakeInMemory();
+    chromeos::SessionManagerClient::InitializeFakeInMemory();
     KerberosClient::InitializeFake();
     client_test_interface()->SetTaskDelay(base::TimeDelta());
 
@@ -185,7 +185,7 @@
     profile_.reset();
     UserSessionManager::GetInstance()->Shutdown();
     KerberosClient::Shutdown();
-    SessionManagerClient::Shutdown();
+    chromeos::SessionManagerClient::Shutdown();
   }
 
   void SetPref(const char* name, base::Value value) {
@@ -1347,4 +1347,4 @@
 //   https://analysis.chromium.org/p/chromium/coverage/dir?host=chromium.googlesource.com&project=chromium/src&ref=refs/heads/master&revision=8e25360b5986bc807eb05927b59cb698b120140c&path=//chrome/browser/ash/kerberos/&platform=linux-chromeos
 // for code coverage (try to get as high as possible!).
 
-}  // namespace chromeos
+}  // namespace ash
diff --git a/chrome/browser/ash/kerberos/kerberos_ticket_expiry_notification.cc b/chrome/browser/ash/kerberos/kerberos_ticket_expiry_notification.cc
index f400e3b..b539064 100644
--- a/chrome/browser/ash/kerberos/kerberos_ticket_expiry_notification.cc
+++ b/chrome/browser/ash/kerberos/kerberos_ticket_expiry_notification.cc
@@ -29,7 +29,7 @@
 using message_center::RichNotificationData;
 using message_center::SystemNotificationWarningLevel;
 
-namespace chromeos {
+namespace ash {
 namespace kerberos_ticket_expiry_notification {
 
 namespace {
@@ -108,4 +108,4 @@
 }
 
 }  // namespace kerberos_ticket_expiry_notification
-}  // namespace chromeos
+}  // namespace ash
diff --git a/chrome/browser/ash/kerberos/kerberos_ticket_expiry_notification.h b/chrome/browser/ash/kerberos/kerberos_ticket_expiry_notification.h
index 42af2ecb..96768b1 100644
--- a/chrome/browser/ash/kerberos/kerberos_ticket_expiry_notification.h
+++ b/chrome/browser/ash/kerberos/kerberos_ticket_expiry_notification.h
@@ -12,7 +12,7 @@
 
 class Profile;
 
-namespace chromeos {
+namespace ash {
 namespace kerberos_ticket_expiry_notification {
 
 using ClickCallback =
@@ -28,6 +28,6 @@
 void Close(Profile* profile);
 
 }  // namespace kerberos_ticket_expiry_notification
-}  // namespace chromeos
+}  // namespace ash
 
 #endif  // CHROME_BROWSER_ASH_KERBEROS_KERBEROS_TICKET_EXPIRY_NOTIFICATION_H_
diff --git a/chrome/browser/ash/kerberos/kerberos_ticket_expiry_notification_test.cc b/chrome/browser/ash/kerberos/kerberos_ticket_expiry_notification_test.cc
index a4773e7..e210ec3 100644
--- a/chrome/browser/ash/kerberos/kerberos_ticket_expiry_notification_test.cc
+++ b/chrome/browser/ash/kerberos/kerberos_ticket_expiry_notification_test.cc
@@ -16,7 +16,7 @@
 
 using message_center::Notification;
 
-namespace chromeos {
+namespace ash {
 
 namespace {
 
@@ -85,4 +85,4 @@
   EXPECT_EQ(1, notification_click_count_[kUser]);
 }
 
-}  // namespace chromeos
+}  // namespace ash
diff --git a/chrome/browser/ash/web_applications/help_app/help_app_integration_browsertest.cc b/chrome/browser/ash/web_applications/help_app/help_app_integration_browsertest.cc
index f59658e..9859a3c 100644
--- a/chrome/browser/ash/web_applications/help_app/help_app_integration_browsertest.cc
+++ b/chrome/browser/ash/web_applications/help_app/help_app_integration_browsertest.cc
@@ -447,6 +447,79 @@
   run_loop.Run();
 }
 
+// Test that the Help App delegate filters out invalid search concepts when
+// updating the launcher search index.
+IN_PROC_BROWSER_TEST_P(HelpAppIntegrationTest,
+                       HelpAppV2UpdateLauncherSearchIndexFilterInvalid) {
+  WaitForTestSystemAppInstall();
+  base::HistogramTester histogram_tester;
+  content::WebContents* web_contents = LaunchApp(web_app::SystemAppType::HELP);
+
+  // Script that adds a data item to the launcher search index.
+  constexpr char kScript[] = R"(
+    (async () => {
+      const delegate = document.querySelector('showoff-app').getDelegate();
+      await delegate.updateLauncherSearchIndex([
+        {
+          id: '6318213',  // Fix connection problems.
+          title: 'Article 1: Invalid',
+          mainCategoryName: 'Help',
+          tags: ['verycomplicatedsearchquery'],
+          urlPathWithParameters: '',  // Invalid because empty field.
+          locale: '',
+        },
+        {
+          id: 'test-id-2',
+          title: 'Article 2: Valid',
+          mainCategoryName: 'Help',
+          tags: ['verycomplicatedsearchquery'],
+          urlPathWithParameters: 'help/',
+          locale: '',
+        },
+        {
+          id: '1700055',  // Open, save, or delete files.
+          title: 'Article 3: Invalid',
+          mainCategoryName: 'Help',
+          tags: [''],  // Invalid because no non-empty tags.
+          urlPathWithParameters: 'help/',
+          locale: '',
+        },
+      ]);
+      window.domAutomationController.send(true);
+    })();
+  )";
+
+  bool script_finished;
+  // Use ExtractBool to make the script wait until the update completes.
+  EXPECT_TRUE(content::ExecuteScriptAndExtractBool(
+      SandboxedWebUiAppTestBase::GetAppFrame(web_contents), kScript,
+      &script_finished));
+  EXPECT_TRUE(script_finished);
+
+  // These hash values can be found in the enum in the google-internal histogram
+  // file.
+  histogram_tester.ExpectBucketCount(
+      "Discover.LauncherSearch.InvalidConceptInUpdate", -20424143, 1);
+  histogram_tester.ExpectBucketCount(
+      "Discover.LauncherSearch.InvalidConceptInUpdate", 395626524, 1);
+
+  // Search using the search handler to confirm that only the valid article was
+  // added to the index.
+  base::RunLoop run_loop;
+  chromeos::help_app::HelpAppManagerFactory::GetForBrowserContext(profile())
+      ->search_handler()
+      ->Search(u"verycomplicatedsearchquery",
+               /*max_num_results=*/3u,
+               base::BindLambdaForTesting(
+                   [&](std::vector<chromeos::help_app::mojom::SearchResultPtr>
+                           search_results) {
+                     EXPECT_EQ(search_results.size(), 1u);
+                     EXPECT_EQ(search_results[0]->id, "test-id-2");
+                     run_loop.QuitClosure().Run();
+                   }));
+  run_loop.Run();
+}
+
 // Test that the Help App background task works.
 // It should open and update the index for launcher search, then close.
 IN_PROC_BROWSER_TEST_P(HelpAppIntegrationTest,
diff --git a/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc b/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc
index deacd10..dd436fa 100644
--- a/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc
+++ b/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc
@@ -2838,7 +2838,7 @@
     // which results in a round trip due to the need to fetch device state
     // on the client and return that to the server as part of a follow-up
     // interaction.
-    if (result_.empty())
+    if (result_.DictEmpty())
       return;
 
     query_status_->SetKey("queryResponse", std::move(result_));
diff --git a/chrome/browser/chromeos/input_method/suggestions_collector.cc b/chrome/browser/chromeos/input_method/suggestions_collector.cc
index d3d8cfc..ec1c3a00 100644
--- a/chrome/browser/chromeos/input_method/suggestions_collector.cc
+++ b/chrome/browser/chromeos/input_method/suggestions_collector.cc
@@ -9,8 +9,10 @@
 #include "chromeos/services/ime/public/mojom/input_engine.mojom.h"
 
 namespace chromeos {
+namespace {
 
 using ::chromeos::ime::TextSuggestion;
+using ::chromeos::ime::TextSuggestionMode;
 
 std::vector<TextSuggestion> CombineResults(
     const std::vector<TextSuggestion>& first,
@@ -22,6 +24,8 @@
   return combined;
 }
 
+}  // namespace
+
 SuggestionsCollector::SuggestionsCollector(
     SuggestionsSource* assistive_suggester,
     std::unique_ptr<AsyncSuggestionsSource> suggestions_service_client)
@@ -44,7 +48,7 @@
   }
 
   suggestions_service_client_->RequestSuggestions(
-      request->text, request->completion_candidates,
+      request->text, request->mode, request->completion_candidates,
       base::BindOnce(&SuggestionsCollector::OnSuggestionsGathered,
                      base::Unretained(this), std::move(callback),
                      assistive_suggestions));
diff --git a/chrome/browser/chromeos/input_method/suggestions_collector_unittest.cc b/chrome/browser/chromeos/input_method/suggestions_collector_unittest.cc
index c896a53..b0ed77a 100644
--- a/chrome/browser/chromeos/input_method/suggestions_collector_unittest.cc
+++ b/chrome/browser/chromeos/input_method/suggestions_collector_unittest.cc
@@ -16,10 +16,10 @@
 namespace chromeos {
 namespace {
 
-using TextCompletionCandidate = ::chromeos::ime::TextCompletionCandidate;
-using TextSuggestion = ::chromeos::ime::TextSuggestion;
-using TextSuggestionMode = ::chromeos::ime::TextSuggestionMode;
-using TextSuggestionType = ::chromeos::ime::TextSuggestionType;
+using ::chromeos::ime::TextCompletionCandidate;
+using ::chromeos::ime::TextSuggestion;
+using ::chromeos::ime::TextSuggestionMode;
+using ::chromeos::ime::TextSuggestionType;
 
 class FakeAssistiveSuggester : public SuggestionsSource {
  public:
@@ -37,6 +37,7 @@
  public:
   void RequestSuggestions(
       const std::string& preceding_text,
+      const ime::TextSuggestionMode& suggestion_mode,
       const std::vector<TextCompletionCandidate>& completion_candidates,
       RequestSuggestionsCallback callback) override {
     std::move(callback).Run(suggestions_);
@@ -58,7 +59,7 @@
 class SuggestionsCollectorTest : public ::testing::Test {
  public:
   void SetUp() override {
-    multi_word_result_ = TextSuggestion{.mode = TextSuggestionMode::kPrediction,
+    multi_word_result_ = TextSuggestion{.mode = TextSuggestionMode::kCompletion,
                                         .type = TextSuggestionType::kMultiWord,
                                         .text = "hello there"};
 
diff --git a/chrome/browser/chromeos/input_method/suggestions_service_client.cc b/chrome/browser/chromeos/input_method/suggestions_service_client.cc
index 2f7f99b..793c27a 100644
--- a/chrome/browser/chromeos/input_method/suggestions_service_client.cc
+++ b/chrome/browser/chromeos/input_method/suggestions_service_client.cc
@@ -28,8 +28,8 @@
 
   return TextSuggestion{
       // TODO(crbug/1146266): Introduce suggestion mode to suggestion service
-      // interface. For the moment, everything is a prediction.
-      .mode = TextSuggestionMode::kPrediction,
+      // interface. For the moment, everything is a completion.
+      .mode = TextSuggestionMode::kCompletion,
       .type = TextSuggestionType::kMultiWord,
       .text = candidate->get_multi_word()->text};
 }
@@ -55,9 +55,13 @@
 
 void SuggestionsServiceClient::RequestSuggestions(
     const std::string& preceding_text,
+    const ime::TextSuggestionMode& suggestion_mode,
     const std::vector<ime::TextCompletionCandidate>& completion_candidates,
     RequestSuggestionsCallback callback) {
-  if (!IsAvailable()) {
+  if (!IsAvailable() ||
+      suggestion_mode != ime::TextSuggestionMode::kCompletion) {
+    // TODO(crbug/1146266): Support prediction requests when suggestion mojo
+    // service introduces suggestion_mode to interface.
     std::move(callback).Run({});
     return;
   }
diff --git a/chrome/browser/chromeos/input_method/suggestions_service_client.h b/chrome/browser/chromeos/input_method/suggestions_service_client.h
index 34f7368..d6011ee 100644
--- a/chrome/browser/chromeos/input_method/suggestions_service_client.h
+++ b/chrome/browser/chromeos/input_method/suggestions_service_client.h
@@ -24,6 +24,7 @@
   // AsyncSuggestionsSource overrides
   void RequestSuggestions(
       const std::string& preceding_text,
+      const ime::TextSuggestionMode& suggestion_mode,
       const std::vector<ime::TextCompletionCandidate>& completion_candidates,
       RequestSuggestionsCallback callback) override;
   bool IsAvailable() override;
diff --git a/chrome/browser/chromeos/input_method/suggestions_service_client_unittest.cc b/chrome/browser/chromeos/input_method/suggestions_service_client_unittest.cc
index 2c67f7c..9aa1d9af 100644
--- a/chrome/browser/chromeos/input_method/suggestions_service_client_unittest.cc
+++ b/chrome/browser/chromeos/input_method/suggestions_service_client_unittest.cc
@@ -14,10 +14,10 @@
 namespace chromeos {
 namespace {
 
-using TextCompletionCandidate = ::chromeos::ime::TextCompletionCandidate;
-using TextSuggestion = ::chromeos::ime::TextSuggestion;
-using TextSuggestionMode = ::chromeos::ime::TextSuggestionMode;
-using TextSuggestionType = ::chromeos::ime::TextSuggestionType;
+using ::chromeos::ime::TextCompletionCandidate;
+using ::chromeos::ime::TextSuggestion;
+using ::chromeos::ime::TextSuggestionMode;
+using ::chromeos::ime::TextSuggestionType;
 
 class SuggestionsServiceClientTest : public testing::Test {
  public:
@@ -48,14 +48,17 @@
 
   std::vector<TextSuggestion> returned_results;
   client.RequestSuggestions(
-      "this is some text", std::vector<TextCompletionCandidate>{},
+      /*preceding_text=*/"this is some text",
+      /*suggestion_mode=*/TextSuggestionMode::kCompletion,
+      /*completion_candidates=*/std::vector<TextCompletionCandidate>{},
+      /*callback=*/
       base::BindLambdaForTesting(
           [&](const std::vector<TextSuggestion>& results) {
             returned_results = results;
           }));
 
   std::vector<TextSuggestion> expected_results = {
-      TextSuggestion{.mode = TextSuggestionMode::kPrediction,
+      TextSuggestion{.mode = TextSuggestionMode::kCompletion,
                      .type = TextSuggestionType::kMultiWord,
                      .text = "hi there"},
   };
@@ -64,5 +67,29 @@
   EXPECT_EQ(returned_results, expected_results);
 }
 
+TEST_F(SuggestionsServiceClientTest, DoesntRequestPredictionCandidates) {
+  machine_learning::FakeServiceConnectionImpl fake_service_connection;
+  machine_learning::ServiceConnection::UseFakeServiceConnectionForTesting(
+      &fake_service_connection);
+  machine_learning::ServiceConnection::GetInstance()->Initialize();
+
+  SuggestionsServiceClient client;
+  base::RunLoop().RunUntilIdle();
+
+  std::vector<TextSuggestion> returned_results;
+  client.RequestSuggestions(
+      /*preceding_text=*/"this is some text",
+      /*suggestion_mode=*/TextSuggestionMode::kPrediction,
+      /*completion_candidates=*/std::vector<TextCompletionCandidate>{},
+      /*callback=*/
+      base::BindLambdaForTesting(
+          [&](const std::vector<TextSuggestion>& results) {
+            returned_results = results;
+          }));
+
+  base::RunLoop().RunUntilIdle();
+  EXPECT_TRUE(returned_results.empty());
+}
+
 }  // namespace
 }  // namespace chromeos
diff --git a/chrome/browser/chromeos/input_method/suggestions_source.h b/chrome/browser/chromeos/input_method/suggestions_source.h
index 2bfd8d0..66a1267 100644
--- a/chrome/browser/chromeos/input_method/suggestions_source.h
+++ b/chrome/browser/chromeos/input_method/suggestions_source.h
@@ -36,6 +36,7 @@
   // returned in the callback passed.
   virtual void RequestSuggestions(
       const std::string& preceding_text,
+      const ime::TextSuggestionMode& suggestion_mode,
       const std::vector<ime::TextCompletionCandidate>& completion_candidates,
       RequestSuggestionsCallback callback) = 0;
 
diff --git a/chrome/browser/component_updater/soda_component_installer.cc b/chrome/browser/component_updater/soda_component_installer.cc
index acb2617..5503b9ba 100644
--- a/chrome/browser/component_updater/soda_component_installer.cc
+++ b/chrome/browser/component_updater/soda_component_installer.cc
@@ -241,7 +241,7 @@
 
 void RegisterSodaLanguageComponent(
     ComponentUpdateService* cus,
-    PrefService* profile_prefs,
+    const std::string& language,
     PrefService* global_prefs,
     OnSodaLanguagePackComponentReadyCallback on_ready_callback) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
@@ -249,8 +249,7 @@
   if (base::FeatureList::IsEnabled(media::kUseSodaForLiveCaption) &&
       media::IsLiveCaptionFeatureEnabled()) {
     base::Optional<speech::SodaLanguagePackComponentConfig> config =
-        speech::GetLanguageComponentConfig(
-            profile_prefs->GetString(prefs::kLiveCaptionLanguageCode));
+        speech::GetLanguageComponentConfig(language);
     if (config) {
       RegisterSodaLanguagePackComponent(config.value(), cus, global_prefs,
                                         std::move(on_ready_callback));
diff --git a/chrome/browser/component_updater/soda_component_installer.h b/chrome/browser/component_updater/soda_component_installer.h
index dd99cd9..9b7cbf0 100644
--- a/chrome/browser/component_updater/soda_component_installer.h
+++ b/chrome/browser/component_updater/soda_component_installer.h
@@ -74,7 +74,7 @@
 // Should only be called by SodaInstaller.
 void RegisterSodaLanguageComponent(
     ComponentUpdateService* cus,
-    PrefService* profile_prefs,
+    const std::string& language,
     PrefService* global_prefs,
     OnSodaLanguagePackComponentReadyCallback on_ready_callback);
 
diff --git a/chrome/browser/external_protocol/external_protocol_handler_unittest.cc b/chrome/browser/external_protocol/external_protocol_handler_unittest.cc
index 08d35a1..556876f 100644
--- a/chrome/browser/external_protocol/external_protocol_handler_unittest.cc
+++ b/chrome/browser/external_protocol/external_protocol_handler_unittest.cc
@@ -334,7 +334,7 @@
   EXPECT_TRUE(
       profile_->GetPrefs()
           ->GetDictionary(prefs::kProtocolHandlerPerOriginAllowedProtocols)
-          ->empty());
+          ->DictEmpty());
 }
 
 TEST_F(ExternalProtocolHandlerTest, TestGetBlockStateDefaultBlock) {
@@ -350,7 +350,7 @@
   EXPECT_TRUE(
       profile_->GetPrefs()
           ->GetDictionary(prefs::kProtocolHandlerPerOriginAllowedProtocols)
-          ->empty());
+          ->DictEmpty());
 }
 
 TEST_F(ExternalProtocolHandlerTest, TestGetBlockStateDefaultDontBlock) {
@@ -360,7 +360,7 @@
   EXPECT_TRUE(
       profile_->GetPrefs()
           ->GetDictionary(prefs::kProtocolHandlerPerOriginAllowedProtocols)
-          ->empty());
+          ->DictEmpty());
 }
 
 TEST_F(ExternalProtocolHandlerTest, TestSetBlockState) {
@@ -386,7 +386,7 @@
   EXPECT_TRUE(
       profile_->GetPrefs()
           ->GetDictionary(prefs::kProtocolHandlerPerOriginAllowedProtocols)
-          ->empty());
+          ->DictEmpty());
 
   // Set to DONT_BLOCK for {kScheme_1, example_origin_1}, and make sure it is
   // written to prefs.
@@ -463,7 +463,7 @@
   EXPECT_TRUE(
       profile_->GetPrefs()
           ->GetDictionary(prefs::kProtocolHandlerPerOriginAllowedProtocols)
-          ->empty());
+          ->DictEmpty());
 }
 
 TEST_F(ExternalProtocolHandlerTest, TestSetBlockStateWithUntrustowrthyOrigin) {
@@ -479,7 +479,7 @@
   EXPECT_TRUE(
       profile_->GetPrefs()
           ->GetDictionary(prefs::kProtocolHandlerPerOriginAllowedProtocols)
-          ->empty());
+          ->DictEmpty());
 
   // Set to DONT_BLOCK for {kScheme, untrustworthy_origin}, and make sure it is
   // not written to prefs. Calling SetBlockState with a non-trustworthy origin
@@ -493,7 +493,7 @@
   EXPECT_TRUE(
       profile_->GetPrefs()
           ->GetDictionary(prefs::kProtocolHandlerPerOriginAllowedProtocols)
-          ->empty());
+          ->DictEmpty());
 }
 
 // Test that an opaque initiating origin gets transformed to its precursor
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
index 7e184f8..a7f29367 100644
--- a/chrome/browser/flag-metadata.json
+++ b/chrome/browser/flag-metadata.json
@@ -1155,6 +1155,11 @@
     "expiry_milestone": 88
   },
   {
+    "name": "dns-proxy-enable-doh",
+    "owners": [ "garrick", "jasongustaman" ],
+    "expiry_milestone": 99
+  },
+   {
     "name": "document-transition",
     "owners": [ "vmpstr", "chrishtr" ],
     "expiry_milestone" : 94
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index 6515792..cc4551e 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -4229,6 +4229,12 @@
     "When enabled, standard DNS queries will be proxied through the system "
     "service";
 
+const char kDnsProxyEnableDOHName[] =
+    "Enable DNS-over-HTTPS in the DNS proxy service";
+const char kDnsProxyEnableDOHDescription[] =
+    "When enabled, the DNS proxy will perform DNS-over-HTTPS in accordance "
+    "with the Chrome OS SecureDNS settings.";
+
 const char kEnableEncryptionMigrationName[] =
     "Enable encryption migration of user data";
 const char kEnableEncryptionMigrationDescription[] =
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index bf3396d..0912524 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -2445,6 +2445,9 @@
 extern const char kEnableDnsProxyName[];
 extern const char kEnableDnsProxyDescription[];
 
+extern const char kDnsProxyEnableDOHName[];
+extern const char kDnsProxyEnableDOHDescription[];
+
 extern const char kEnableEncryptionMigrationName[];
 extern const char kEnableEncryptionMigrationDescription[];
 
diff --git a/chrome/browser/media/router/discovery/dial/dial_service.cc b/chrome/browser/media/router/discovery/dial/dial_service.cc
index 930b0fcc..424dab9 100644
--- a/chrome/browser/media/router/discovery/dial/dial_service.cc
+++ b/chrome/browser/media/router/discovery/dial/dial_service.cc
@@ -431,18 +431,17 @@
     return;
   }
 
-  auto task_runner = content::GetUIThreadTaskRunner({});
+  auto ui_task_runner = content::GetUIThreadTaskRunner({});
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
-  task_tracker_.PostTaskAndReplyWithResult(
-      task_runner.get(), FROM_HERE,
-      base::BindOnce(&GetBestBindAddressOnUIThread),
+  ui_task_runner->PostTaskAndReplyWithResult(
+      FROM_HERE, base::BindOnce(&GetBestBindAddressOnUIThread),
       base::BindOnce(&DialServiceImpl::DiscoverOnAddresses,
-                     base::Unretained(this)));
+                     weak_ptr_factory_.GetWeakPtr()));
 #else
-  task_tracker_.PostTask(task_runner.get(), FROM_HERE,
-                         base::BindOnce(&GetNetworkListOnUIThread,
-                                        weak_ptr_factory_.GetWeakPtr()));
+  ui_task_runner->PostTask(FROM_HERE,
+                           base::BindOnce(&GetNetworkListOnUIThread,
+                                          weak_ptr_factory_.GetWeakPtr()));
 #endif
 }
 
diff --git a/chrome/browser/media/router/discovery/dial/dial_service.h b/chrome/browser/media/router/discovery/dial/dial_service.h
index e2fd88e..140a568 100644
--- a/chrome/browser/media/router/discovery/dial/dial_service.h
+++ b/chrome/browser/media/router/discovery/dial/dial_service.h
@@ -12,7 +12,6 @@
 #include "base/gtest_prod_util.h"
 #include "base/macros.h"
 #include "base/observer_list.h"
-#include "base/task/cancelable_task_tracker.h"
 #include "base/timer/timer.h"
 #include "net/base/ip_address.h"
 #include "net/socket/udp_socket.h"
@@ -264,8 +263,6 @@
   // List of observers.
   base::ObserverList<Observer>::Unchecked observer_list_;
 
-  base::CancelableTaskTracker task_tracker_;
-
   // WeakPtrFactory for WeakPtrs that are invalidated on IO thread.
   base::WeakPtrFactory<DialServiceImpl> weak_ptr_factory_{this};
 
diff --git a/chrome/browser/prefs/browser_prefs.cc b/chrome/browser/prefs/browser_prefs.cc
index 0f58727d..fba43b9d 100644
--- a/chrome/browser/prefs/browser_prefs.cc
+++ b/chrome/browser/prefs/browser_prefs.cc
@@ -810,7 +810,7 @@
   chromeos::EnableDebuggingScreenHandler::RegisterPrefs(registry);
   chromeos::FastTransitionObserver::RegisterPrefs(registry);
   chromeos::HIDDetectionScreenHandler::RegisterPrefs(registry);
-  chromeos::KerberosCredentialsManager::RegisterLocalStatePrefs(registry);
+  ash::KerberosCredentialsManager::RegisterLocalStatePrefs(registry);
   ash::KioskAppManager::RegisterPrefs(registry);
   ash::KioskCryptohomeRemover::RegisterPrefs(registry);
   chromeos::language_prefs::RegisterPrefs(registry);
@@ -1119,7 +1119,7 @@
   chromeos::first_run::RegisterProfilePrefs(registry);
   chromeos::file_system_provider::RegisterProfilePrefs(registry);
   chromeos::full_restore::RegisterProfilePrefs(registry);
-  chromeos::KerberosCredentialsManager::RegisterProfilePrefs(registry);
+  ash::KerberosCredentialsManager::RegisterProfilePrefs(registry);
   chromeos::login::SecurityTokenSessionController::RegisterProfilePrefs(
       registry);
   chromeos::multidevice_setup::MultiDeviceSetupService::RegisterProfilePrefs(
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_iw.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_iw.xtb
index 72e4218..b2252b5 100644
--- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_iw.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_iw.xtb
@@ -180,6 +180,7 @@
 <translation id="2216790501338699346">‏כתובת ה-URL של הקישור: <ph name="LINK_URL" /></translation>
 <translation id="2220205454259065436">העברת הסמן לתו הקודם</translation>
 <translation id="2220529011494928058">דיווח על בעיה</translation>
+<translation id="2243633977138166243">‏כדי לנווט, יש ללחוץ על החץ שמאלה או על החץ ימינה. כדי להפעיל, יש ללחוץ על Enter</translation>
 <translation id="224426591676115802">אין קול ב<ph name="LANGUAGE" /></translation>
 <translation id="2247700577781885251">יציאה ממצב למידה</translation>
 <translation id="225732394367814946">הגברת קצב הדיבור</translation>
diff --git a/chrome/browser/resources/chromeos/arc_graphics_tracing/arc_overview_tracing.html b/chrome/browser/resources/chromeos/arc_graphics_tracing/arc_overview_tracing.html
index c5d0e163..98b68d0 100644
--- a/chrome/browser/resources/chromeos/arc_graphics_tracing/arc_overview_tracing.html
+++ b/chrome/browser/resources/chromeos/arc_graphics_tracing/arc_overview_tracing.html
@@ -45,6 +45,15 @@
       Render quality: <span class="arc-tracing-app-render-quality"></span>
       Commit deviation: <span class="arc-tracing-app-commit-deviation"></span>
       <span class="arc-tracing-new-line"></span>
+      <div class="arc-overview-tracing-power">
+        Average power:
+        <span class="arc-tracing-app-power-total"></span> watts.
+        <span class="arc-tracing-new-line"></span>
+        CPU: <span class="arc-tracing-app-power-cpu"></span>,
+        GPU: <span class="arc-tracing-app-power-gpu"></span>,
+        Memory: <span class="arc-tracing-app-power-memory"></span> watts.
+        <span class="arc-tracing-new-line"></span>
+      </div>
     </div>
     <div id="arc-overview-tracing-models"></div>
     <hr>
diff --git a/chrome/browser/resources/chromeos/arc_graphics_tracing/arc_overview_tracing_ui.js b/chrome/browser/resources/chromeos/arc_graphics_tracing/arc_overview_tracing_ui.js
index c970d876..a19be9f 100644
--- a/chrome/browser/resources/chromeos/arc_graphics_tracing/arc_overview_tracing_ui.js
+++ b/chrome/browser/resources/chromeos/arc_graphics_tracing/arc_overview_tracing_ui.js
@@ -131,6 +131,15 @@
 function addModelHeader(model) {
   var header = $('arc-overview-tracing-model-template').cloneNode(true);
   header.hidden = false;
+  var totalPowerElement =
+      header.getElementsByClassName('arc-tracing-app-power-total')[0];
+  var cpuPowerElement =
+      header.getElementsByClassName('arc-tracing-app-power-cpu')[0];
+  var gpuPowerElement =
+      header.getElementsByClassName('arc-tracing-app-power-gpu')[0];
+  var memoryPowerElement =
+      header.getElementsByClassName('arc-tracing-app-power-memory')[0];
+  totalPowerElement.parentNode.style.display = 'none';
 
   if (model.information.icon) {
     header.getElementsByClassName('arc-tracing-app-icon')[0].src =
@@ -163,6 +172,18 @@
   header.getElementsByClassName('arc-tracing-app-commit-deviation')[0]
       .textContent = renderQualityAndCommitDeviation[1].toFixed(2) + 'ms';
 
+  var cpuPower = getAveragePower(model, 10 /* kCpuPower */);
+  var gpuPower = getAveragePower(model, 11 /* kGpuPower */);
+  var memoryPower = getAveragePower(model, 12 /* kMemoryPower */);
+  if (cpuPower != -1 && gpuPower != -1 && memoryPower != -1) {
+    totalPowerElement.parentNode.style.display = 'block';
+    totalPowerElement.textContent =
+        (cpuPower + gpuPower + memoryPower).toFixed(2);
+    cpuPowerElement.textContent = cpuPower.toFixed(2);
+    gpuPowerElement.textContent = gpuPower.toFixed(2);
+    memoryPowerElement.textContent = memoryPower.toFixed(2);
+  }
+
   // Handler to remove model from the view.
   header.getElementsByClassName('arc-tracing-close-button')[0].onclick =
       function() {
@@ -210,7 +231,8 @@
  * energy consumption and returns average power between first and last event.
  *
  * @param {object} model source model to analyze.
- * @param {number} eventType event type to match particular power counter.
+ * @param {number} eventType event type to match particular power counter
+ * @returns {number} average power in watts or -1 in case no events found.
  */
 function getAveragePower(model, eventType) {
   var events = new Events(model.system.memory, eventType);
@@ -226,7 +248,7 @@
   }
 
   if (!lastTimestamp) {
-    return 0;
+    return -1;
   }
 
   return totalEnergy / lastTimestamp;
@@ -478,11 +500,7 @@
  * @param {number} eventType event type to match particular power counter.
  */
 function addPowerView(parent, title, resolution, duration, eventType) {
-  // power range from 0 to 10000 milli-watts.
-  // 200 milli-watts 1 pixel resolution. Each grid line 2 watts
-  bands = createChart(
-      parent, title, resolution, duration, 50 /* height */,
-      4 /* gridLinesCount */);
+  var bands = null;
   var attributesTemplate = {
     maxValue: 10000,
     minValue: 0,
@@ -491,11 +509,20 @@
     width: 1.0
   };
   for (i = 0; i < models.length; i++) {
+    var events = new Events(models[i].system.memory, eventType, eventType);
+    if (events.getFirstEvent() < 0) {
+      continue;
+    }
+    if (bands === null) {
+      // power range from 0 to 10000 milli-watts.
+      // 200 milli-watts 1 pixel resolution. Each grid line 2 watts
+      bands = createChart(
+          parent, title, resolution, duration, 50 /* height */,
+          4 /* gridLinesCount */);
+    }
     var attributes = Object.assign({}, attributesTemplate);
     attributes.color = modelColors.get(models[i]);
-    bands.addChartSources(
-        [new Events(models[i].system.memory, eventType, eventType)],
-        false /* smooth */, attributes);
+    bands.addChartSources([events], false /* smooth */, attributes);
   }
 }
 
@@ -532,6 +559,13 @@
   addDeltaView(parent, resolution, duration, true /* appView */);
   addFPSView(parent, resolution, duration, false /* appView */);
   addDeltaView(parent, resolution, duration, false /* appView */);
+  addPowerView(
+      parent, 'Package power constraint', resolution, duration,
+      13 /* eventType */);
+  addPowerView(parent, 'CPU Power', resolution, duration, 10 /* eventType */);
+  addPowerView(parent, 'GPU Power', resolution, duration, 11 /* eventType */);
+  addPowerView(
+      parent, 'Memory Power', resolution, duration, 12 /* eventType */);
 }
 
 /**
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_uz.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_uz.xtb
index e3195b2b..3af81a9 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_uz.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_uz.xtb
@@ -533,6 +533,7 @@
 <translation id="4583164079174244168">{MINUTES,plural, =1{# daqiqa oldin}other{# daqiqa oldin}}</translation>
 <translation id="4587589328781138893">Sites</translation>
 <translation id="4594952190837476234">Bu sahifa saytning <ph name="CREATION_TIME" /> kunidagi nusxasi va onlayn versiyasidan farq qilishi mumkin.</translation>
+<translation id="4615382002648696011">Kuzatilmoqda, ochilmagan hikoyalar tayyor</translation>
 <translation id="4616150815774728855"><ph name="WEBAPK_NAME" /> veb-ilovasini ochish</translation>
 <translation id="4619564267100705184">Bu siz ekaningizni isbotlang</translation>
 <translation id="4634124774493850572">Paroldan foydalanish</translation>
@@ -1180,6 +1181,7 @@
 <translation id="8659579665266920523">Chrome orqali qanday qidirish mumkin</translation>
 <translation id="8662811608048051533">Bir nechta saytlardagi hisobingizdan chiqasiz.</translation>
 <translation id="8664979001105139458">Bunday nomli fayl allaqachon bor</translation>
+<translation id="8676789164135894283">Kirishni tasdiqlash</translation>
 <translation id="8683039184091909753">rasm</translation>
 <translation id="8687353297350450808">{N_BARS,plural, =1{Signal darajasi: # chiziqda}other{Signal darajasi: # chiziqda}}</translation>
 <translation id="869891660844655955">Tugash muddati</translation>
diff --git a/chrome/browser/ui/app_list/search/app_list_search_browsertest.cc b/chrome/browser/ui/app_list/search/app_list_search_browsertest.cc
index 9253eb6..ac86b78 100644
--- a/chrome/browser/ui/app_list/search/app_list_search_browsertest.cc
+++ b/chrome/browser/ui/app_list/search/app_list_search_browsertest.cc
@@ -176,7 +176,7 @@
 
   ChromeSearchResult* result = FindResult("help-app://discover");
   ASSERT_TRUE(result);
-  EXPECT_EQ(base::UTF16ToASCII(result->title()), "Build a game");
+  EXPECT_EQ(base::UTF16ToASCII(result->title()), "Make your own game");
 
   // Open the search result. This should open the help app at the expected url.
   size_t num_browsers = chrome::GetTotalBrowserCount();
diff --git a/chrome/browser/ui/app_list/search/help_app_provider_unittest.cc b/chrome/browser/ui/app_list/search/help_app_provider_unittest.cc
index a28c0ad9..a00680d 100644
--- a/chrome/browser/ui/app_list/search/help_app_provider_unittest.cc
+++ b/chrome/browser/ui/app_list/search/help_app_provider_unittest.cc
@@ -23,7 +23,7 @@
 namespace {
 void ExpectDiscoverTabChip(ChromeSearchResult* result) {
   EXPECT_EQ("help-app://discover", result->id());
-  EXPECT_EQ("Build a game", base::UTF16ToASCII(result->title()));
+  EXPECT_EQ("Make your own game", base::UTF16ToASCII(result->title()));
   EXPECT_EQ(ash::AppListSearchResultType::kHelpApp, result->result_type());
   EXPECT_EQ(ash::SearchResultDisplayType::kChip, result->display_type());
 }
diff --git a/chrome/browser/ui/web_applications/web_app_ui_manager_impl.cc b/chrome/browser/ui/web_applications/web_app_ui_manager_impl.cc
index 91f75e3..c9a3a3a 100644
--- a/chrome/browser/ui/web_applications/web_app_ui_manager_impl.cc
+++ b/chrome/browser/ui/web_applications/web_app_ui_manager_impl.cc
@@ -118,9 +118,9 @@
     ++num_windows_for_apps_map_[GetAppIdForBrowser(browser)];
   }
 
-  extensions::ExtensionSystem::Get(profile_)
-      ->app_sorting()
-      ->InitializePageOrdinalMapFromWebApps();
+  extensions::ExtensionSystem::Get(profile_)->ready().Post(
+      FROM_HERE, base::BindOnce(&WebAppUiManagerImpl::OnExtensionSystemReady,
+                                weak_ptr_factory_.GetWeakPtr()));
 
   BrowserList::AddObserver(this);
 }
@@ -244,6 +244,12 @@
   return uninstall_triggered;
 }
 
+void WebAppUiManagerImpl::OnExtensionSystemReady() {
+  extensions::ExtensionSystem::Get(profile_)
+      ->app_sorting()
+      ->InitializePageOrdinalMapFromWebApps();
+}
+
 void WebAppUiManagerImpl::OnShortcutInfoReceivedSearchShortcutLocations(
     const AppId& from_app,
     const AppId& app_id,
diff --git a/chrome/browser/ui/web_applications/web_app_ui_manager_impl.h b/chrome/browser/ui/web_applications/web_app_ui_manager_impl.h
index d935f5b..3a57f9e9 100644
--- a/chrome/browser/ui/web_applications/web_app_ui_manager_impl.h
+++ b/chrome/browser/ui/web_applications/web_app_ui_manager_impl.h
@@ -83,6 +83,8 @@
   // must be true.
   const AppId GetAppIdForBrowser(Browser* browser);
 
+  void OnExtensionSystemReady();
+
   void OnShortcutInfoReceivedSearchShortcutLocations(
       const AppId& from_app,
       const AppId& app_id,
diff --git a/chrome/browser/ui/webui/inspect_ui.cc b/chrome/browser/ui/webui/inspect_ui.cc
index f9663f1..e2c67f2 100644
--- a/chrome/browser/ui/webui/inspect_ui.cc
+++ b/chrome/browser/ui/webui/inspect_ui.cc
@@ -698,7 +698,7 @@
   }
 
   // Do nothing if user already took explicit action.
-  if (enabled || !config->empty())
+  if (enabled || !config->DictEmpty())
     return;
 
   base::DictionaryValue default_config;
diff --git a/chrome/browser/ui/webui/policy/policy_ui_handler.cc b/chrome/browser/ui/webui/policy/policy_ui_handler.cc
index a9094104..05fb408 100644
--- a/chrome/browser/ui/webui/policy/policy_ui_handler.cc
+++ b/chrome/browser/ui/webui/policy/policy_ui_handler.cc
@@ -1176,13 +1176,13 @@
   updater_status_provider_->GetStatus(updater_status.get());
 
   base::DictionaryValue status;
-  if (!device_status->empty())
+  if (!device_status->DictEmpty())
     status.Set("device", std::move(device_status));
-  if (!machine_status->empty())
+  if (!machine_status->DictEmpty())
     status.Set("machine", std::move(machine_status));
-  if (!user_status->empty())
+  if (!user_status->DictEmpty())
     status.Set("user", std::move(user_status));
-  if (!updater_status->empty())
+  if (!updater_status->DictEmpty())
     status.Set("updater", std::move(updater_status));
 
   FireWebUIListener("status-updated", status);
diff --git a/chrome/browser/ui/webui/settings/chromeos/os_settings_manager.h b/chrome/browser/ui/webui/settings/chromeos/os_settings_manager.h
index fe45e845..89951d9 100644
--- a/chrome/browser/ui/webui/settings/chromeos/os_settings_manager.h
+++ b/chrome/browser/ui/webui/settings/chromeos/os_settings_manager.h
@@ -8,6 +8,8 @@
 #include <memory>
 
 #include "base/gtest_prod_util.h"
+// TODO(https://crbug.com/1164001): forward declare when moved ash
+#include "chrome/browser/ash/kerberos/kerberos_credentials_manager.h"
 #include "components/keyed_service/core/keyed_service.h"
 
 class ArcAppListPrefs;
@@ -34,7 +36,6 @@
 namespace chromeos {
 
 class CupsPrintersManager;
-class KerberosCredentialsManager;
 
 namespace android_sms {
 class AndroidSmsService;
diff --git a/chrome/browser/ui/webui/settings/chromeos/os_settings_sections.h b/chrome/browser/ui/webui/settings/chromeos/os_settings_sections.h
index bd98112e4..6cd2120 100644
--- a/chrome/browser/ui/webui/settings/chromeos/os_settings_sections.h
+++ b/chrome/browser/ui/webui/settings/chromeos/os_settings_sections.h
@@ -8,6 +8,8 @@
 #include <unordered_map>
 #include <vector>
 
+// TODO(https://crbug.com/1164001): forward declare when moved ash
+#include "chrome/browser/ash/kerberos/kerberos_credentials_manager.h"
 #include "chrome/browser/ui/webui/settings/chromeos/constants/routes.mojom.h"
 #include "chrome/browser/ui/webui/settings/chromeos/os_settings_section.h"
 
@@ -30,7 +32,6 @@
 namespace chromeos {
 
 class CupsPrintersManager;
-class KerberosCredentialsManager;
 
 namespace android_sms {
 class AndroidSmsService;
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt
index 858ee39..adfd0e0e8 100644
--- a/chrome/build/win32.pgo.txt
+++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@
-chrome-win32-master-1620485850-15cf79c5441dbaccb3c0fa29f85185f672a5443d.profdata
+chrome-win32-master-1620615409-0b1b9d67156cb605d3b357c0b29ff581cd515794.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt
index ddb781f8..d9bc586 100644
--- a/chrome/build/win64.pgo.txt
+++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@
-chrome-win64-master-1620470921-1eff33e3c9f4386a562b8865eb4872fccda7c739.profdata
+chrome-win64-master-1620604511-6724b285c0eaba1ec7f7a8d2abc46c41c146de6b.profdata
diff --git a/chrome/common/chrome_features.cc b/chrome/common/chrome_features.cc
index ffd739b..3d24176 100644
--- a/chrome/common/chrome_features.cc
+++ b/chrome/common/chrome_features.cc
@@ -367,6 +367,12 @@
 const base::FeatureParam<std::string> kDnsOverHttpsTemplatesParam{
     &kDnsOverHttps, "Templates", ""};
 
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+// Enables the DNS-Over-HTTPS in the DNS proxy.
+const base::Feature kDnsProxyEnableDOH{"DnsProxyEnableDOH",
+                                       base::FEATURE_DISABLED_BY_DEFAULT};
+#endif
+
 #if defined(OS_ANDROID)
 // Enable changing default downloads storage location on Android.
 const base::Feature kDownloadsLocationChange{"DownloadsLocationChange",
diff --git a/chrome/common/chrome_features.h b/chrome/common/chrome_features.h
index 6fe2e9e3..70ae670 100644
--- a/chrome/common/chrome_features.h
+++ b/chrome/common/chrome_features.h
@@ -232,6 +232,11 @@
 extern const base::FeatureParam<std::string>
     kDnsOverHttpsDisabledProvidersParam;
 
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+COMPONENT_EXPORT(CHROME_FEATURES)
+extern const base::Feature kDnsProxyEnableDOH;
+#endif
+
 #if defined(OS_ANDROID)
 COMPONENT_EXPORT(CHROME_FEATURES)
 extern const base::Feature kDownloadsLocationChange;
diff --git a/chrome/renderer/BUILD.gn b/chrome/renderer/BUILD.gn
index dbaf691..70c976d2 100644
--- a/chrome/renderer/BUILD.gn
+++ b/chrome/renderer/BUILD.gn
@@ -317,16 +317,11 @@
       "extensions/tabs_hooks_delegate.h",
     ]
     deps += [
-      # TODO(hclam): See crbug.com/298380 for details.
-      # We should isolate the APIs needed by the renderer.
       "//chrome/common/extensions/api",
       "//components/guest_view/renderer",
       "//extensions:extensions_resources",
       "//extensions/common:mojom",
       "//extensions/renderer",
-      "//media/cast:net",
-      "//media/cast:receiver",
-      "//media/cast:sender",
       "//services/network/public/cpp",
     ]
     public_deps += [ "//ipc" ]
diff --git a/chrome/renderer/media/DEPS b/chrome/renderer/media/DEPS
index c06d13a5..394e28a 100644
--- a/chrome/renderer/media/DEPS
+++ b/chrome/renderer/media/DEPS
@@ -3,7 +3,6 @@
   "+media/audio",  # For basic audio functions.
   "+media/video",  # For basic video functions.
   "+media/base",  # For basic media functions.
-  "+media/cast",  # For cast streaming library.
   "+media/capture",  # For capture library.
   "+media/mojo/mojom",  # For mojo interfaces.
 ]
diff --git a/chromeos/CHROMEOS_LKGM b/chromeos/CHROMEOS_LKGM
index 27838cc..a4c9a4d 100644
--- a/chromeos/CHROMEOS_LKGM
+++ b/chromeos/CHROMEOS_LKGM
@@ -1 +1 @@
-13958.0.0
\ No newline at end of file
+13961.0.0
\ No newline at end of file
diff --git a/chromeos/chromeos_strings.grd b/chromeos/chromeos_strings.grd
index c7760a2..254a81e 100644
--- a/chromeos/chromeos_strings.grd
+++ b/chromeos/chromeos_strings.grd
@@ -318,7 +318,7 @@
         Perks
       </message>
       <message name="IDS_HELP_APP_DISCOVER_TAB_SUGGESTION_CHIP" desc="Text for the suggestion chip to view a magazine showing the user how they could build/code/develop a game. [CHAR_LIMIT=24]">
-        Build a game
+        Make your own game
       </message>
       <message name="IDS_HELP_APP_WHATS_NEW_SUGGESTION_CHIP" desc="Text for the suggestion chip to view updated patch notes are available. [CHAR_LIMIT=24]">
         What's new with Chrome OS
diff --git a/chromeos/chromeos_strings_grd/IDS_HELP_APP_DISCOVER_TAB_SUGGESTION_CHIP.png.sha1 b/chromeos/chromeos_strings_grd/IDS_HELP_APP_DISCOVER_TAB_SUGGESTION_CHIP.png.sha1
index da7f35d..11bb390 100644
--- a/chromeos/chromeos_strings_grd/IDS_HELP_APP_DISCOVER_TAB_SUGGESTION_CHIP.png.sha1
+++ b/chromeos/chromeos_strings_grd/IDS_HELP_APP_DISCOVER_TAB_SUGGESTION_CHIP.png.sha1
@@ -1 +1 @@
-0170c58d5c9c99dac9c32850b99a2819589d1a49
\ No newline at end of file
+aceea7866d2030a9788e4b3666a128f994b563fd
\ No newline at end of file
diff --git a/chromeos/components/help_app_ui/resources/browser_proxy.js b/chromeos/components/help_app_ui/resources/browser_proxy.js
index d05ef5a..22d8fff6 100644
--- a/chromeos/components/help_app_ui/resources/browser_proxy.js
+++ b/chromeos/components/help_app_ui/resources/browser_proxy.js
@@ -256,12 +256,15 @@
       const dataFiltered = dataToSend.filter(item => {
         const valid = item.id && item.title && item.mainCategory
             && item.tags.length > 0 && item.urlPathWithParameters;
-        // TODO(b/182763045): Consider recording a metric for invalid items.
+        // This is a google-internal histogram. If changing this, also change
+        // the corresponding histograms file.
+        if (!valid) {
+          chrome.metricsPrivate.recordSparseHashable(
+            'Discover.LauncherSearch.InvalidConceptInUpdate', item.id);
+        }
         return valid;
       });
-      // Trying to update with an empty list causes an error.
-      if (dataFiltered.length === 0) return;
-      return await searchHandlerRemote.update(dataFiltered);
+      return searchHandlerRemote.update(dataFiltered);
     });
 
 /**
diff --git a/chromeos/components/help_app_ui/search/search_handler.cc b/chromeos/components/help_app_ui/search/search_handler.cc
index 3f27d93..46b1c5d 100644
--- a/chromeos/components/help_app_ui/search/search_handler.cc
+++ b/chromeos/components/help_app_ui/search/search_handler.cc
@@ -7,6 +7,7 @@
 #include <algorithm>
 #include <utility>
 
+#include "base/metrics/histogram_functions.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/utf_string_conversions.h"
 #include "chromeos/components/local_search_service/public/cpp/local_search_service_proxy.h"
@@ -15,6 +16,34 @@
 namespace help_app {
 namespace {
 
+// The end result of a search. Logged once per time a search finishes.
+// Not logged if the search is canceled by a new search starting. These values
+// persist to logs. Entries should not be renumbered and numeric values should
+// never be reused.
+enum class SearchResultStatus {
+  // The first Update hasn't finished yet, and the index is still empty, so the
+  // Search Handler is not ready to handle searches.
+  kNotReadyAndEmptyIndex = 0,
+  // Not ready and the status is something other than EmptyIndex. This should be
+  // far less common than kNotReadyAndEmptyIndex.
+  kNotReadyAndOtherStatus = 1,
+  // Ready and the LSS response status is Success.
+  kReadyAndSuccess = 2,
+  // Ready and the LSS response status is EmptyIndex. This can happen for
+  // languages with no localized content to add to the search index.
+  kReadyAndEmptyIndex = 3,
+  // Ready and the LSS response status is something other than Success or
+  // EmptyIndex.
+  kReadyAndOtherStatus = 4,
+  kMaxValue = kReadyAndOtherStatus,
+};
+
+// Use this in OnFindComplete.
+void LogSearchResultStatus(SearchResultStatus state) {
+  base::UmaHistogramEnumeration("Discover.SearchHandler.SearchResultStatus",
+                                state);
+}
+
 // Order search results by relevance score. Higher relevance first.
 bool CompareSearchResults(const mojom::SearchResultPtr& first,
                           const mojom::SearchResultPtr& second) {
@@ -26,7 +55,7 @@
 SearchHandler::SearchHandler(
     SearchTagRegistry* search_tag_registry,
     local_search_service::LocalSearchServiceProxy* local_search_service_proxy)
-    : search_tag_registry_(search_tag_registry) {
+    : search_tag_registry_(search_tag_registry), is_ready_(false) {
   local_search_service_proxy->GetIndex(
       local_search_service::IndexId::kHelpAppLauncher,
       local_search_service::Backend::kInvertedIndex,
@@ -63,6 +92,12 @@
 
 void SearchHandler::Update(std::vector<mojom::SearchConceptPtr> concepts,
                            UpdateCallback callback) {
+  if (concepts.size() == 0) {
+    // Trying to update with an empty list causes an error in the LSS.
+    is_ready_ = true;
+    std::move(callback).Run();
+    return;
+  }
   search_tag_registry_->Update(concepts, std::move(callback));
 }
 
@@ -72,6 +107,7 @@
 }
 
 void SearchHandler::OnRegistryUpdated() {
+  is_ready_ = true;
   for (auto& observer : observers_)
     observer->OnSearchResultAvailabilityChanged();
 }
@@ -101,9 +137,23 @@
     const base::Optional<std::vector<local_search_service::Result>>&
         local_search_service_results) {
   if (response_status != local_search_service::ResponseStatus::kSuccess) {
+    if (response_status == local_search_service::ResponseStatus::kEmptyIndex) {
+      if (is_ready_) {
+        LogSearchResultStatus(SearchResultStatus::kReadyAndEmptyIndex);
+      } else {
+        LogSearchResultStatus(SearchResultStatus::kNotReadyAndEmptyIndex);
+      }
+    } else {
+      if (is_ready_) {
+        LogSearchResultStatus(SearchResultStatus::kReadyAndOtherStatus);
+      } else {
+        LogSearchResultStatus(SearchResultStatus::kNotReadyAndOtherStatus);
+      }
+    }
     std::move(callback).Run({});
     return;
   }
+  LogSearchResultStatus(SearchResultStatus::kReadyAndSuccess);
 
   std::move(callback).Run(GenerateSearchResultsArray(
       local_search_service_results.value(), max_num_results));
diff --git a/chromeos/components/help_app_ui/search/search_handler.h b/chromeos/components/help_app_ui/search/search_handler.h
index 2611ec7..23415ae 100644
--- a/chromeos/components/help_app_ui/search/search_handler.h
+++ b/chromeos/components/help_app_ui/search/search_handler.h
@@ -74,6 +74,10 @@
   SearchTagRegistry* search_tag_registry_;
   mojo::Remote<local_search_service::mojom::Index> index_remote_;
 
+  // Whether or not the first Update has finished yet, which means the Search
+  // Handler is ready to search.
+  bool is_ready_;
+
   // Note: Expected to have multiple clients, so ReceiverSet/RemoteSet are used.
   mojo::ReceiverSet<mojom::SearchHandler> receivers_;
   mojo::RemoteSet<mojom::SearchResultsObserver> observers_;
diff --git a/chromeos/components/help_app_ui/search/search_handler_unittest.cc b/chromeos/components/help_app_ui/search/search_handler_unittest.cc
index 2bfdcdc..9380324 100644
--- a/chromeos/components/help_app_ui/search/search_handler_unittest.cc
+++ b/chromeos/components/help_app_ui/search/search_handler_unittest.cc
@@ -5,6 +5,7 @@
 #include "chromeos/components/help_app_ui/search/search_handler.h"
 
 #include "base/strings/utf_string_conversions.h"
+#include "base/test/metrics/histogram_tester.h"
 #include "base/test/task_environment.h"
 #include "chromeos/components/help_app_ui/search/search.mojom-test-utils.h"
 #include "chromeos/components/help_app_ui/search/search_tag_registry.h"
@@ -84,15 +85,11 @@
   search_concepts.push_back(std::move(new_concept_1));
   search_concepts.push_back(std::move(new_concept_2));
 
-  bool callback_done = false;
-  search_tag_registry_.Update(
-      search_concepts,
-      base::BindOnce([](bool* callback_done) { *callback_done = true; },
-                     &callback_done));
+  mojom::SearchHandlerAsyncWaiter(handler_remote_.get())
+      .Update(std::move(search_concepts));
   handler_remote_.FlushForTesting();
   task_environment_.RunUntilIdle();
 
-  EXPECT_TRUE(callback_done);
   EXPECT_EQ(1u, observer_.num_calls());
 
   std::vector<mojom::SearchResultPtr> search_results;
@@ -128,7 +125,8 @@
       /*locale=*/"");
   search_concepts.push_back(std::move(new_concept_1));
 
-  search_tag_registry_.Update(search_concepts, base::BindOnce([]() {}));
+  mojom::SearchHandlerAsyncWaiter(handler_remote_.get())
+      .Update(std::move(search_concepts));
   handler_remote_.FlushForTesting();
   task_environment_.RunUntilIdle();
 
@@ -165,7 +163,8 @@
   search_concepts.push_back(std::move(new_concept_1));
   search_concepts.push_back(std::move(new_concept_2));
 
-  search_tag_registry_.Update(search_concepts, base::BindOnce([]() {}));
+  mojom::SearchHandlerAsyncWaiter(handler_remote_.get())
+      .Update(std::move(search_concepts));
   handler_remote_.FlushForTesting();
   task_environment_.RunUntilIdle();
 
@@ -184,5 +183,112 @@
   EXPECT_GT(search_results[1]->relevance_score, 0.01);
 }
 
+TEST_F(HelpAppSearchHandlerTest, SearchStatusNotReadyAndEmptyIndex) {
+  base::HistogramTester histogram_tester;
+  std::vector<mojom::SearchResultPtr> search_results;
+
+  // Search without updating the index.
+  mojom::SearchHandlerAsyncWaiter(handler_remote_.get())
+      .Search(u"test query", /*max_num_results=*/3u, &search_results);
+
+  EXPECT_TRUE(search_results.empty());
+  // 0 is kNotReadyAndEmptyIndex.
+  histogram_tester.ExpectUniqueSample(
+      "Discover.SearchHandler.SearchResultStatus", 0, 1);
+}
+
+TEST_F(HelpAppSearchHandlerTest, SearchStatusNotReadyAndOtherStatus) {
+  base::HistogramTester histogram_tester;
+  std::vector<mojom::SearchResultPtr> search_results;
+
+  // The empty search query makes the LSS respond with kEmptyQuery rather than
+  // kEmptyIndex.
+  mojom::SearchHandlerAsyncWaiter(handler_remote_.get())
+      .Search(u"", /*max_num_results=*/3u, &search_results);
+
+  EXPECT_TRUE(search_results.empty());
+  // 1 is kNotReadyAndOtherStatus.
+  histogram_tester.ExpectUniqueSample(
+      "Discover.SearchHandler.SearchResultStatus", 1, 1);
+}
+
+TEST_F(HelpAppSearchHandlerTest, SearchStatusReadyAndSuccess) {
+  // Add one item to the search index.
+  std::vector<mojom::SearchConceptPtr> search_concepts;
+  mojom::SearchConceptPtr new_concept_1 = mojom::SearchConcept::New(
+      /*id=*/"test-id-1",
+      /*title=*/u"Title 1",
+      /*main_category=*/u"Help",
+      /*tags=*/std::vector<std::u16string>{u"Test tag", u"Printing"},
+      /*url_path_with_parameters=*/"help",
+      /*locale=*/"");
+  search_concepts.push_back(std::move(new_concept_1));
+  mojom::SearchHandlerAsyncWaiter(handler_remote_.get())
+      .Update(std::move(search_concepts));
+  handler_remote_.FlushForTesting();
+  task_environment_.RunUntilIdle();
+
+  base::HistogramTester histogram_tester;
+  std::vector<mojom::SearchResultPtr> search_results;
+
+  mojom::SearchHandlerAsyncWaiter(handler_remote_.get())
+      .Search(u"Printing", /*max_num_results=*/3u, &search_results);
+
+  EXPECT_EQ(search_results.size(), 1u);
+  // 2 is kReadyAndSuccess.
+  histogram_tester.ExpectUniqueSample(
+      "Discover.SearchHandler.SearchResultStatus", 2, 1);
+}
+
+TEST_F(HelpAppSearchHandlerTest, SearchStatusReadyAndEmptyIndex) {
+  // Update using an empty list. This can happen if there is no localized
+  // content for the current locale.
+  std::vector<mojom::SearchConceptPtr> search_concepts;
+  mojom::SearchHandlerAsyncWaiter(handler_remote_.get())
+      .Update(std::move(search_concepts));
+  handler_remote_.FlushForTesting();
+  task_environment_.RunUntilIdle();
+
+  base::HistogramTester histogram_tester;
+  std::vector<mojom::SearchResultPtr> search_results;
+
+  mojom::SearchHandlerAsyncWaiter(handler_remote_.get())
+      .Search(u"Printing", /*max_num_results=*/3u, &search_results);
+
+  EXPECT_TRUE(search_results.empty());
+  // 3 is kReadyAndEmptyIndex.
+  histogram_tester.ExpectUniqueSample(
+      "Discover.SearchHandler.SearchResultStatus", 3, 1);
+}
+
+TEST_F(HelpAppSearchHandlerTest, SearchStatusReadyAndOtherStatus) {
+  // Add one item to the search index.
+  std::vector<mojom::SearchConceptPtr> search_concepts;
+  mojom::SearchConceptPtr new_concept_1 = mojom::SearchConcept::New(
+      /*id=*/"test-id-1",
+      /*title=*/u"Title 1",
+      /*main_category=*/u"Help",
+      /*tags=*/std::vector<std::u16string>{u"Test tag", u"Printing"},
+      /*url_path_with_parameters=*/"help",
+      /*locale=*/"");
+  search_concepts.push_back(std::move(new_concept_1));
+  mojom::SearchHandlerAsyncWaiter(handler_remote_.get())
+      .Update(std::move(search_concepts));
+  handler_remote_.FlushForTesting();
+  task_environment_.RunUntilIdle();
+
+  base::HistogramTester histogram_tester;
+  std::vector<mojom::SearchResultPtr> search_results;
+
+  // Searching with an empty query results in a different status: kEmptyQuery.
+  mojom::SearchHandlerAsyncWaiter(handler_remote_.get())
+      .Search(u"", /*max_num_results=*/3u, &search_results);
+
+  EXPECT_TRUE(search_results.empty());
+  // 4 is kReadyAndOtherStatus.
+  histogram_tester.ExpectUniqueSample(
+      "Discover.SearchHandler.SearchResultStatus", 4, 1);
+}
+
 }  // namespace help_app
 }  // namespace chromeos
diff --git a/chromeos/components/media_app_ui/resources/js/launch.js b/chromeos/components/media_app_ui/resources/js/launch.js
index 95bbac10..138704d 100644
--- a/chromeos/components/media_app_ui/resources/js/launch.js
+++ b/chromeos/components/media_app_ui/resources/js/launch.js
@@ -341,14 +341,15 @@
   // also rejects extensions longer than 16 characters (including the .).
   let extension = '.' + (suffix.replaceAll(/[^A-Za-z0-9.+]+/g, '') || 'ext');
   extension = extension.substr(0, 16);
-  // TODO(b/161087799): Add a default filename when it's supported by the
-  // File System Access API.
+  // TODO(b/162541613): Add a `startIn` option when the file token is plumbed
+  // through from receiver.js.
   /** @type {!FilePickerOptions} */
   const options = {
     types: [
       {description: extension, accept: {[mimeType]: [extension]}},
     ],
     excludeAcceptAllOption: true,
+    suggestedName,
   };
   // This may throw an error, but we can handle and recover from it on the
   // unprivileged side.
diff --git a/chromeos/dbus/kerberos/kerberos_client.h b/chromeos/dbus/kerberos/kerberos_client.h
index bccf68d..3a59e2ee 100644
--- a/chromeos/dbus/kerberos/kerberos_client.h
+++ b/chromeos/dbus/kerberos/kerberos_client.h
@@ -133,4 +133,9 @@
 
 }  // namespace chromeos
 
+// TODO(https://crbug.com/1164001): remove when //chromeos/dbus moved to ash.
+namespace ash {
+using ::chromeos::KerberosClient;
+}  // namespace ash
+
 #endif  // CHROMEOS_DBUS_KERBEROS_KERBEROS_CLIENT_H_
diff --git a/chromeos/dbus/power/fake_power_manager_client.cc b/chromeos/dbus/power/fake_power_manager_client.cc
index 66a96ed..e61cb13 100644
--- a/chromeos/dbus/power/fake_power_manager_client.cc
+++ b/chromeos/dbus/power/fake_power_manager_client.cc
@@ -175,6 +175,8 @@
                                 weak_ptr_factory_.GetWeakPtr()));
 }
 
+void FakePowerManagerClient::RequestAllPeripheralBatteryUpdate() {}
+
 void FakePowerManagerClient::RequestThermalState() {}
 
 void FakePowerManagerClient::RequestSuspend() {}
diff --git a/chromeos/dbus/power/fake_power_manager_client.h b/chromeos/dbus/power/fake_power_manager_client.h
index f8967810..a30b76a2 100644
--- a/chromeos/dbus/power/fake_power_manager_client.h
+++ b/chromeos/dbus/power/fake_power_manager_client.h
@@ -102,6 +102,7 @@
   const base::Optional<power_manager::PowerSupplyProperties>& GetLastStatus()
       override;
   void RequestStatusUpdate() override;
+  void RequestAllPeripheralBatteryUpdate() override;
   void RequestThermalState() override;
   void RequestSuspend() override;
   void RequestRestart(power_manager::RequestRestartReason reason,
diff --git a/chromeos/dbus/power/power_manager_client.cc b/chromeos/dbus/power/power_manager_client.cc
index 0ab3756e..b31644a6 100644
--- a/chromeos/dbus/power/power_manager_client.cc
+++ b/chromeos/dbus/power/power_manager_client.cc
@@ -348,6 +348,18 @@
             weak_ptr_factory_.GetWeakPtr()));
   }
 
+  void RequestAllPeripheralBatteryUpdate() override {
+    POWER_LOG(USER) << "RequestAllPeripheralBatteryUpdate";
+    dbus::MethodCall method_call(
+        power_manager::kPowerManagerInterface,
+        power_manager::kRefreshAllPeripheralBatteryMethod);
+    power_manager_proxy_->CallMethod(
+        &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
+        base::BindOnce(
+            &PowerManagerClientImpl::OnRefreshAllPeripheralBatteryMethod,
+            weak_ptr_factory_.GetWeakPtr()));
+  }
+
   void RequestThermalState() override {
     POWER_LOG(USER) << "RequestThermalState";
     dbus::MethodCall method_call(power_manager::kPowerManagerInterface,
@@ -807,6 +819,14 @@
     }
   }
 
+  void OnRefreshAllPeripheralBatteryMethod(dbus::Response* response) {
+    if (!response) {
+      POWER_LOG(ERROR) << "Error calling "
+                       << power_manager::kRefreshAllPeripheralBatteryMethod;
+      return;
+    }
+  }
+
   void OnGetScreenOrKeyboardBrightnessPercent(
       DBusMethodCallback<double> callback,
       dbus::Response* response) {
diff --git a/chromeos/dbus/power/power_manager_client.h b/chromeos/dbus/power/power_manager_client.h
index 53e3bc3..a481370a 100644
--- a/chromeos/dbus/power/power_manager_client.h
+++ b/chromeos/dbus/power/power_manager_client.h
@@ -238,6 +238,10 @@
   // will be called asynchronously.
   virtual void RequestStatusUpdate() = 0;
 
+  // Requests all peripheral batteries have status re-issued.
+  // Observer::PeripheralBatteryStatusReceived() will be called asynchronously,
+  virtual void RequestAllPeripheralBatteryUpdate() = 0;
+
   // Requests the current thermal state.
   virtual void RequestThermalState() = 0;
 
diff --git a/chromeos/network/managed_network_configuration_handler_impl.cc b/chromeos/network/managed_network_configuration_handler_impl.cc
index a338557..e18228a 100644
--- a/chromeos/network/managed_network_configuration_handler_impl.cc
+++ b/chromeos/network/managed_network_configuration_handler_impl.cc
@@ -952,7 +952,7 @@
   // want information about all ipv4 and ipv6 IPConfig properties.
   base::Value ip_configs(base::Value::Type::LIST);
 
-  if (!device_state || device_state->ip_configs().empty()) {
+  if (!device_state || device_state->ip_configs().DictEmpty()) {
     // Shill may not provide IPConfigs for external Cellular devices/dongles
     // (https://crbug.com/739314) or VPNs, so build a dictionary of ipv4
     // properties from cached NetworkState properties .
diff --git a/chromeos/network/network_cert_migrator.cc b/chromeos/network/network_cert_migrator.cc
index 76479ddd..3f21030a 100644
--- a/chromeos/network/network_cert_migrator.cc
+++ b/chromeos/network/network_cert_migrator.cc
@@ -86,7 +86,7 @@
                                 base::Value::AsDictionaryValue(*properties),
                                 &new_properties);
 
-    if (new_properties.empty())
+    if (new_properties.DictEmpty())
       return;
     SendPropertiesToShill(service_path, new_properties);
   }
diff --git a/chromeos/network/network_configuration_handler.cc b/chromeos/network/network_configuration_handler.cc
index aeaa92c..8d0c641c 100644
--- a/chromeos/network/network_configuration_handler.cc
+++ b/chromeos/network/network_configuration_handler.cc
@@ -280,7 +280,7 @@
     const base::DictionaryValue& shill_properties,
     base::OnceClosure callback,
     network_handler::ErrorCallback error_callback) {
-  if (shill_properties.empty()) {
+  if (shill_properties.DictEmpty()) {
     if (!callback.is_null())
       std::move(callback).Run();
     return;
diff --git a/chromeos/network/network_connection_handler_impl.cc b/chromeos/network/network_connection_handler_impl.cc
index ae7db90..94c34b1e 100644
--- a/chromeos/network/network_connection_handler_impl.cc
+++ b/chromeos/network/network_connection_handler_impl.cc
@@ -705,7 +705,7 @@
     }
   }
 
-  if (!config_properties.empty()) {
+  if (!config_properties.DictEmpty()) {
     NET_LOG(EVENT) << "Configuring Network: " << NetworkPathId(service_path);
     configuration_handler_->SetShillProperties(
         service_path, config_properties,
diff --git a/chromeos/network/onc/onc_merger.cc b/chromeos/network/onc/onc_merger.cc
index 072f082..c0bdd91 100644
--- a/chromeos/network/onc/onc_merger.cc
+++ b/chromeos/network/onc/onc_merger.cc
@@ -122,7 +122,7 @@
             nested_dicts.push_back(nested_dict);
           }
           DictionaryPtr merged_dict(MergeNestedDictionaries(key, nested_dicts));
-          if (!merged_dict->empty())
+          if (!merged_dict->DictEmpty())
             merged_value = std::move(merged_dict);
         } else {
           std::vector<const base::Value*> values;
@@ -469,7 +469,7 @@
       augmented_value->SetKey(::onc::kAugmentationDeviceEditable,
                               base::Value(true));
     }
-    if (augmented_value->empty())
+    if (augmented_value->DictEmpty())
       augmented_value.reset();
     return std::move(augmented_value);
   }
diff --git a/chromeos/network/onc/onc_merger_unittest.cc b/chromeos/network/onc/onc_merger_unittest.cc
index 8a3d2a19..d0d283f3 100644
--- a/chromeos/network/onc/onc_merger_unittest.cc
+++ b/chromeos/network/onc/onc_merger_unittest.cc
@@ -114,7 +114,7 @@
   base::DictionaryValue emptyDict;
   std::unique_ptr<base::DictionaryValue> merged(
       MergeSettingsAndPoliciesToEffective(&emptyDict, NULL, user_.get(), NULL));
-  EXPECT_TRUE(merged->empty());
+  EXPECT_TRUE(merged->DictEmpty());
 }
 
 TEST_F(ONCMergerTest, MergeWithoutPolicyAllowsAnything) {
diff --git a/chromeos/network/onc/onc_translator_shill_to_onc.cc b/chromeos/network/onc/onc_translator_shill_to_onc.cc
index d3532ad7..a96a2fa 100644
--- a/chromeos/network/onc/onc_translator_shill_to_onc.cc
+++ b/chromeos/network/onc/onc_translator_shill_to_onc.cc
@@ -762,7 +762,7 @@
                                          network_state_);
   std::unique_ptr<base::DictionaryValue> nested_object =
       nested_translator.CreateTranslatedONCObject();
-  if (nested_object->empty())
+  if (nested_object->DictEmpty())
     return;
   onc_object_->SetKey(onc_field_name, std::move(*nested_object));
 }
@@ -797,7 +797,7 @@
     std::unique_ptr<base::DictionaryValue> nested_object =
         nested_translator.CreateTranslatedONCObject();
     // If the nested object couldn't be parsed, simply omit it.
-    if (nested_object->empty())
+    if (nested_object->DictEmpty())
       continue;
     result.Append(std::move(*nested_object));
   }
diff --git a/chromeos/network/onc/variable_expander.h b/chromeos/network/onc/variable_expander.h
index d9b4146..eea3605 100644
--- a/chromeos/network/onc/variable_expander.h
+++ b/chromeos/network/onc/variable_expander.h
@@ -58,4 +58,10 @@
 
 }  // namespace chromeos
 
+// TODO(https://crbug.com/1164001): remove when chromeos/network is moved to
+// ash.
+namespace ash {
+using ::chromeos::VariableExpander;
+}  // namespace ash
+
 #endif  // CHROMEOS_NETWORK_ONC_VARIABLE_EXPANDER_H_
diff --git a/chromeos/network/policy_applicator.cc b/chromeos/network/policy_applicator.cc
index 4a027f4..fee3828 100644
--- a/chromeos/network/policy_applicator.cc
+++ b/chromeos/network/policy_applicator.cc
@@ -300,7 +300,7 @@
   base::DictionaryValue shill_properties_to_update;
   policy_util::SetShillPropertiesForGlobalPolicy(
       entry_properties, global_network_config_, &shill_properties_to_update);
-  if (shill_properties_to_update.empty()) {
+  if (shill_properties_to_update.DictEmpty()) {
     VLOG(2) << "Ignore unmanaged entry.";
     // Calling a SetProperties of Shill with an empty dictionary is a no op.
     std::move(callback).Run();
diff --git a/chromeos/profiles/atom.afdo.newest.txt b/chromeos/profiles/atom.afdo.newest.txt
index a7b0a7c..803c65a 100644
--- a/chromeos/profiles/atom.afdo.newest.txt
+++ b/chromeos/profiles/atom.afdo.newest.txt
@@ -1 +1 @@
-chromeos-chrome-amd64-atom-92-4484.0-1620039320-benchmark-92.0.4500.0-r1-redacted.afdo.xz
+chromeos-chrome-amd64-atom-92-4484.0-1620039320-benchmark-92.0.4502.0-r1-redacted.afdo.xz
diff --git a/chromeos/profiles/bigcore.afdo.newest.txt b/chromeos/profiles/bigcore.afdo.newest.txt
index a37737c..a1b72313 100644
--- a/chromeos/profiles/bigcore.afdo.newest.txt
+++ b/chromeos/profiles/bigcore.afdo.newest.txt
@@ -1 +1 @@
-chromeos-chrome-amd64-bigcore-92-4484.0-1620036580-benchmark-92.0.4500.0-r1-redacted.afdo.xz
+chromeos-chrome-amd64-bigcore-92-4484.0-1620036580-benchmark-92.0.4502.0-r1-redacted.afdo.xz
diff --git a/chromeos/profiles/orderfile.newest.txt b/chromeos/profiles/orderfile.newest.txt
index c1db83a..2adde4c 100644
--- a/chromeos/profiles/orderfile.newest.txt
+++ b/chromeos/profiles/orderfile.newest.txt
@@ -1 +1 @@
-chromeos-chrome-orderfile-field-92-4484.0-1620039320-benchmark-92.0.4492.0-r1.orderfile.xz
+chromeos-chrome-orderfile-field-92-4484.0-1620039320-benchmark-92.0.4497.0-r1.orderfile.xz
diff --git a/chromeos/strings/chromeos_strings_uz.xtb b/chromeos/strings/chromeos_strings_uz.xtb
index bbff049..1549874f 100644
--- a/chromeos/strings/chromeos_strings_uz.xtb
+++ b/chromeos/strings/chromeos_strings_uz.xtb
@@ -105,6 +105,7 @@
 <translation id="3369013195428705271">Chop etish tarixi tozalansinmi? Joriy chop etish vazifalari oʻchirib tashlanmaydi.</translation>
 <translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation>
 <translation id="3435738964857648380">Xavfsizlik</translation>
+<translation id="3442340494009790209">Oʻyin qurish</translation>
 <translation id="3456078764689556234">Sahifa chop etildi: <ph name="PRINTED_PAGES" /> / <ph name="TOTAL_PAGES" />.</translation>
 <translation id="345898999683440380"><ph name="PAGE_NUM" /> ta sahifa skanerlandi. <ph name="PERCENTAGE_VALUE" />% tugallandi.</translation>
 <translation id="3459509316159669723">Chop etish</translation>
diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_compression_stats.cc b/components/data_reduction_proxy/core/browser/data_reduction_proxy_compression_stats.cc
index be4df7eb..f8e5adc0 100644
--- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_compression_stats.cc
+++ b/components/data_reduction_proxy/core/browser/data_reduction_proxy_compression_stats.cc
@@ -130,7 +130,7 @@
   base::DictionaryValue* pref_dict_src = pref_update_src.Get();
   pref_dict_dst->Clear();
   pref_dict_dst->Swap(pref_dict_src);
-  DCHECK(pref_dict_src->empty());
+  DCHECK(pref_dict_src->DictEmpty());
 }
 
 void MaybeInitWeeklyAggregateDataUsePrefs(const base::Time& now,
diff --git a/components/data_use_measurement/core/data_use_tracker_prefs_unittest.cc b/components/data_use_measurement/core/data_use_tracker_prefs_unittest.cc
index ca9de52e..f01213f 100644
--- a/components/data_use_measurement/core/data_use_tracker_prefs_unittest.cc
+++ b/components/data_use_measurement/core/data_use_tracker_prefs_unittest.cc
@@ -67,11 +67,11 @@
 
   // Verify other prefs are not set.
   EXPECT_TRUE(
-      test_prefs.GetDictionary(prefs::kDataUsedUserBackground)->empty());
+      test_prefs.GetDictionary(prefs::kDataUsedUserBackground)->DictEmpty());
   EXPECT_TRUE(
-      test_prefs.GetDictionary(prefs::kDataUsedServicesForeground)->empty());
+      test_prefs.GetDictionary(prefs::kDataUsedServicesForeground)->DictEmpty());
   EXPECT_TRUE(
-      test_prefs.GetDictionary(prefs::kDataUsedServicesBackground)->empty());
+      test_prefs.GetDictionary(prefs::kDataUsedServicesBackground)->DictEmpty());
 
   // Move clock forward 10 days. New data use reported must go in a separate
   // entry in the dictionary pref.
@@ -113,13 +113,13 @@
 
   // Verify prefs are not set.
   EXPECT_TRUE(
-      test_prefs.GetDictionary(prefs::kDataUsedUserForeground)->empty());
+      test_prefs.GetDictionary(prefs::kDataUsedUserForeground)->DictEmpty());
   EXPECT_TRUE(
-      test_prefs.GetDictionary(prefs::kDataUsedUserBackground)->empty());
+      test_prefs.GetDictionary(prefs::kDataUsedUserBackground)->DictEmpty());
   EXPECT_TRUE(
-      test_prefs.GetDictionary(prefs::kDataUsedServicesForeground)->empty());
+      test_prefs.GetDictionary(prefs::kDataUsedServicesForeground)->DictEmpty());
   EXPECT_TRUE(
-      test_prefs.GetDictionary(prefs::kDataUsedServicesBackground)->empty());
+      test_prefs.GetDictionary(prefs::kDataUsedServicesBackground)->DictEmpty());
 }
 
 TEST(DataUseTrackerPrefsTest, TestBasicUserForeground) {
@@ -152,21 +152,21 @@
         true, test.foreground, test.user_initiated, 10);
     // Verify that the expected pref has an entry.
     EXPECT_FALSE(
-        test_prefs.GetDictionary(test.pref_expected_as_non_empty)->empty());
+        test_prefs.GetDictionary(test.pref_expected_as_non_empty)->DictEmpty());
 
     // Verify other prefs are not set.
     EXPECT_TRUE(
         test.pref_expected_as_non_empty == prefs::kDataUsedUserForeground ||
-        test_prefs.GetDictionary(prefs::kDataUsedUserForeground)->empty());
+        test_prefs.GetDictionary(prefs::kDataUsedUserForeground)->DictEmpty());
     EXPECT_TRUE(
         test.pref_expected_as_non_empty == prefs::kDataUsedUserBackground ||
-        test_prefs.GetDictionary(prefs::kDataUsedUserBackground)->empty());
+        test_prefs.GetDictionary(prefs::kDataUsedUserBackground)->DictEmpty());
     EXPECT_TRUE(
         test.pref_expected_as_non_empty == prefs::kDataUsedServicesForeground ||
-        test_prefs.GetDictionary(prefs::kDataUsedServicesForeground)->empty());
+        test_prefs.GetDictionary(prefs::kDataUsedServicesForeground)->DictEmpty());
     EXPECT_TRUE(
         test.pref_expected_as_non_empty == prefs::kDataUsedServicesBackground ||
-        test_prefs.GetDictionary(prefs::kDataUsedServicesBackground)->empty());
+        test_prefs.GetDictionary(prefs::kDataUsedServicesBackground)->DictEmpty());
   }
 }
 
diff --git a/components/services/app_service/public/cpp/preferred_apps_list.cc b/components/services/app_service/public/cpp/preferred_apps_list.cc
index 131daaa..a11dfec 100644
--- a/components/services/app_service/public/cpp/preferred_apps_list.cc
+++ b/components/services/app_service/public/cpp/preferred_apps_list.cc
@@ -21,13 +21,74 @@
   }
 }
 
+// Given an intent filter, decide if the filter matches the required parameters
+// that determine that a filter has a supported link.
+bool IsSupportedLink(const apps::mojom::IntentFilterPtr& intent_filter) {
+  bool scheme = false;
+  bool host = false;
+  for (auto& condition : intent_filter->conditions) {
+    if (condition->condition_type == apps::mojom::ConditionType::kScheme) {
+      for (auto& condition_value : condition->condition_values) {
+        if (condition_value->value == "http" ||
+            condition_value->value == "https") {
+          scheme = true;
+          break;
+        }
+      }
+    } else if (condition->condition_type == apps::mojom::ConditionType::kHost) {
+      host = true;
+    }
+
+    if (scheme && host) {
+      break;
+    }
+  }
+
+  return scheme && host;
+}
+
 }  // namespace
 
 namespace apps {
 
+PreferredAppsList::Observer::Observer(PreferredAppsList* list) {
+  Observe(list);
+}
+
+PreferredAppsList::Observer::Observer() = default;
+
+PreferredAppsList::Observer::~Observer() {
+  if (list_) {
+    list_->RemoveObserver(this);
+  }
+}
+
+void PreferredAppsList::Observer::Observe(PreferredAppsList* list) {
+  if (list == list_) {
+    // Early exit to avoid infinite loops if we're in the middle of a callback.
+    return;
+  }
+  if (list_) {
+    list_->RemoveObserver(this);
+  }
+  list_ = list;
+  if (list_) {
+    list_->AddObserver(this);
+  }
+}
+
 PreferredAppsList::PreferredAppsList() = default;
 PreferredAppsList::~PreferredAppsList() = default;
 
+void PreferredAppsList::AddObserver(Observer* observer) {
+  DCHECK(observer);
+  observers_.AddObserver(observer);
+}
+
+void PreferredAppsList::RemoveObserver(Observer* observer) {
+  observers_.RemoveObserver(observer);
+}
+
 base::Optional<std::string> PreferredAppsList::FindPreferredAppForUrl(
     const GURL& url) {
   auto intent = apps_util::CreateIntentFromUrl(url);
@@ -65,6 +126,12 @@
   auto new_preferred_app =
       apps::mojom::PreferredApp::New(intent_filter->Clone(), app_id);
   preferred_apps_.push_back(std::move(new_preferred_app));
+
+  if (IsSupportedLink(intent_filter)) {
+    for (auto& obs : observers_) {
+      obs.OnPreferredAppChanged(app_id, true);
+    }
+  }
   return replaced_app_preferences;
 }
 
@@ -84,6 +151,13 @@
       iter++;
     }
   }
+
+  if (IsSupportedLink(intent_filter)) {
+    for (auto& obs : observers_) {
+      obs.OnPreferredAppChanged(app_id, false);
+    }
+  }
+
   return found;
 }
 
@@ -99,6 +173,11 @@
       iter++;
     }
   }
+
+  for (auto& obs : observers_) {
+    obs.OnPreferredAppChanged(app_id, false);
+  }
+
   return found;
 }
 
diff --git a/components/services/app_service/public/cpp/preferred_apps_list.h b/components/services/app_service/public/cpp/preferred_apps_list.h
index 7961ea75..c8d1a0c 100644
--- a/components/services/app_service/public/cpp/preferred_apps_list.h
+++ b/components/services/app_service/public/cpp/preferred_apps_list.h
@@ -9,6 +9,8 @@
 #include <string>
 #include <vector>
 
+#include "base/observer_list.h"
+#include "base/observer_list_types.h"
 #include "base/optional.h"
 #include "components/services/app_service/public/mojom/types.mojom.h"
 
@@ -20,9 +22,47 @@
 // an list of |intent_filter| vs. app_id.
 class PreferredAppsList {
  public:
+  class Observer : public base::CheckedObserver {
+   public:
+    virtual void OnPreferredAppChanged(const std::string& app_id,
+                                       bool is_preferred_app) = 0;
+
+    // Called when the PreferredAppsList object (the thing that this observer
+    // observes) will be destroyed. In response, the observer, |this|, should
+    // call "cache->RemoveObserver(this)", whether directly or indirectly (e.g.
+    // via base::ScopedObservation::Remove or via Observe(nullptr)).
+    virtual void OnPreferredAppsListWillBeDestroyed(
+        PreferredAppsList* list) = 0;
+
+    Observer(const Observer&) = delete;
+    Observer& operator=(const Observer&) = delete;
+
+   protected:
+    // Use this constructor when the observer |this| is tied to a single
+    // PreferredAppsList for its entire lifetime, or until the observee (the
+    // PreferredAppsList) is destroyed, whichever comes first.
+    explicit Observer(PreferredAppsList* list);
+
+    // Use this constructor when the observer |this| wants to observe a
+    // PreferredAppsList for part of its lifetime. It can then call Observe() to
+    // start and stop observing.
+    Observer();
+    ~Observer() override;
+
+    // Start observing a different PreferredAppsList. |cache| may be nullptr,
+    // meaning to stop observing.
+    void Observe(PreferredAppsList* list);
+
+   private:
+    PreferredAppsList* list_ = nullptr;
+  };
+
   PreferredAppsList();
   ~PreferredAppsList();
 
+  void AddObserver(Observer* observer);
+  void RemoveObserver(Observer* observer);
+
   PreferredAppsList(const PreferredAppsList&) = delete;
   PreferredAppsList& operator=(const PreferredAppsList&) = delete;
 
@@ -67,6 +107,7 @@
 
  private:
   PreferredApps preferred_apps_;
+  base::ObserverList<Observer> observers_;
   bool initialized_ = false;
 };
 
diff --git a/components/soda/soda_installer.cc b/components/soda/soda_installer.cc
index 690bb3b9..49ff13e 100644
--- a/components/soda/soda_installer.cc
+++ b/components/soda/soda_installer.cc
@@ -34,8 +34,9 @@
   if (IsAnyFeatureUsingSodaEnabled(profile_prefs)) {
     global_prefs->SetTime(prefs::kSodaScheduledDeletionTime, base::Time());
     speech::SodaInstaller::GetInstance()->InstallSoda(global_prefs);
-    speech::SodaInstaller::GetInstance()->InstallLanguage(profile_prefs,
-                                                          global_prefs);
+    speech::SodaInstaller::GetInstance()->InstallLanguage(
+        profile_prefs->GetString(prefs::kLiveCaptionLanguageCode),
+        global_prefs);
   } else {
     base::Time deletion_time =
         global_prefs->GetTime(prefs::kSodaScheduledDeletionTime);
diff --git a/components/soda/soda_installer.h b/components/soda/soda_installer.h
index 7365bf96..b2bf9e8 100644
--- a/components/soda/soda_installer.h
+++ b/components/soda/soda_installer.h
@@ -82,11 +82,10 @@
 
   // Installs the user-selected SODA language model. Called by CaptionController
   // when the kLiveCaptionEnabled or kLiveCaptionLanguageCode preferences
-  // change. `profile_prefs` is passed to share Live Captions preferences:
-  // whether it is enabled, which language to download, and what the download
-  // filepath should be. `global_prefs` is passed as part of component
-  // registration for the non-ChromeOS implementation.
-  virtual void InstallLanguage(PrefService* profile_prefs,
+  // change. `language` is a localized language e.g. "en-US". `global_prefs` is
+  // passed as part of component registration for the non-ChromeOS
+  // implementation.
+  virtual void InstallLanguage(const std::string& language,
                                PrefService* global_prefs) = 0;
 
   // Returns whether or not SODA is installed on this device. Will return a
diff --git a/components/strings/components_strings_uz.xtb b/components/strings/components_strings_uz.xtb
index 4dbb5da6..e3f7decd 100644
--- a/components/strings/components_strings_uz.xtb
+++ b/components/strings/components_strings_uz.xtb
@@ -1169,6 +1169,7 @@
 <translation id="5314967030527622926">Buklet yasash vositasi</translation>
 <translation id="5316812925700871227">Soat miliga teskari yo‘nalishda burish</translation>
 <translation id="5317780077021120954">Saqlash</translation>
+<translation id="5321288445143113935">Kattalashtirilgan</translation>
 <translation id="5323105697514565458"><ph name="FRIENDLY_MATCH_TEXT" />, <ph name="MATCH_POSITION" />/<ph name="NUM_MATCHES" /></translation>
 <translation id="5324080437450482387">Aloqa axborotini tanlang</translation>
 <translation id="5327248766486351172">Nomi</translation>
@@ -1393,6 +1394,7 @@
 <translation id="6218753634732582820">Ushbu manzilni brauzer unutsinmi?</translation>
 <translation id="622039917539443112">Eniga taxlash</translation>
 <translation id="6221345481584921695">Google saytlar xavfsizligini tekshirish tizimi <ph name="SITE" /> saytida <ph name="BEGIN_LINK" />zararli dasturiy ta’minotlarni aniqladi<ph name="END_LINK" />. Zararli dasturlar <ph name="SUBRESOURCE_HOST" /> serveridan tarqatilmoqda. Shuni unutmangki, hatto xavfsiz saytlarda ham zararli dasturlar paydo bo‘lishi mumkin. </translation>
+<translation id="6232619828520900263">ID hujjat hozirda yaroqsiz</translation>
 <translation id="6234122620015464377">Har bir hujjat chekkasini qirqish</translation>
 <translation id="6240447795304464094">Google Pay logotipi</translation>
 <translation id="6241121617266208201">Tavsiyalarni berkitish</translation>
diff --git a/components/translate/core/browser/translate_prefs.cc b/components/translate/core/browser/translate_prefs.cc
index edf7286..fd5b05f3 100644
--- a/components/translate/core/browser/translate_prefs.cc
+++ b/components/translate/core/browser/translate_prefs.cc
@@ -924,7 +924,7 @@
 
 bool TranslatePrefs::IsDictionaryEmpty(const char* pref_id) const {
   const base::DictionaryValue* dict = prefs_->GetDictionary(pref_id);
-  return (dict == nullptr || dict->empty());
+  return (dict == nullptr || dict->DictEmpty());
 }
 
 }  // namespace translate
diff --git a/content/browser/accessibility/dump_accessibility_tree_browsertest.cc b/content/browser/accessibility/dump_accessibility_tree_browsertest.cc
index 93f8ea7..e71c219d 100644
--- a/content/browser/accessibility/dump_accessibility_tree_browsertest.cc
+++ b/content/browser/accessibility/dump_accessibility_tree_browsertest.cc
@@ -1715,16 +1715,6 @@
 }
 
 IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest,
-                       AccessibilityCustomElementHidden) {
-  RunHtmlTest(FILE_PATH_LITERAL("custom-element-hidden.html"));
-}
-
-IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest,
-                       AccessibilityCustomElementRemoveNodes) {
-  RunHtmlTest(FILE_PATH_LITERAL("custom-element-remove-nodes.html"));
-}
-
-IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest,
                        AccessibilityCustomElementWithAriaOwnsOutside) {
   RunHtmlTest(FILE_PATH_LITERAL("custom-element-with-aria-owns-outside.html"));
 }
diff --git a/content/browser/renderer_host/render_frame_host_impl.cc b/content/browser/renderer_host/render_frame_host_impl.cc
index b1647921..3b397c7 100644
--- a/content/browser/renderer_host/render_frame_host_impl.cc
+++ b/content/browser/renderer_host/render_frame_host_impl.cc
@@ -1923,9 +1923,9 @@
 }
 
 void RenderFrameHostImpl::GetCanonicalUrlForSharing(
-    mojom::Frame::GetCanonicalUrlForSharingCallback callback) {
+    blink::mojom::LocalFrame::GetCanonicalUrlForSharingCallback callback) {
   if (IsRenderFrameCreated()) {
-    GetMojomFrameInRenderer()->GetCanonicalUrlForSharing(std::move(callback));
+    GetAssociatedLocalFrame()->GetCanonicalUrlForSharing(std::move(callback));
   } else {
     std::move(callback).Run(base::nullopt);
   }
diff --git a/content/browser/renderer_host/render_frame_host_impl.h b/content/browser/renderer_host/render_frame_host_impl.h
index ec2afec..d7f2075 100644
--- a/content/browser/renderer_host/render_frame_host_impl.h
+++ b/content/browser/renderer_host/render_frame_host_impl.h
@@ -648,7 +648,7 @@
   // Fetch the link-rel canonical URL to be used for sharing to external
   // applications.
   void GetCanonicalUrlForSharing(
-      mojom::Frame::GetCanonicalUrlForSharingCallback callback);
+      blink::mojom::LocalFrame::GetCanonicalUrlForSharingCallback callback);
 
   // Get HTML data for this RenderFrame by serializing contents on the renderer
   // side and replacing all links to both same-site and cross-site resources
diff --git a/content/browser/service_worker/service_worker_internals_ui.cc b/content/browser/service_worker/service_worker_internals_ui.cc
index 86b7af6ca..4e52598 100644
--- a/content/browser/service_worker/service_worker_internals_ui.cc
+++ b/content/browser/service_worker/service_worker_internals_ui.cc
@@ -253,7 +253,15 @@
   PartitionObserver(int partition_id,
                     WeakPtr<ServiceWorkerInternalsHandler> handler)
       : partition_id_(partition_id), handler_(handler) {}
-  ~PartitionObserver() override = default;
+  ~PartitionObserver() override {
+    if (handler_) {
+      // We need to remove PartitionObserver from the list of
+      // ServiceWorkerContextCoreObserver.
+      scoped_refptr<ServiceWorkerContextWrapper> context;
+      if (handler_->GetServiceWorkerContext(partition_id_, &context))
+        context->RemoveObserver(this);
+    }
+  }
   // ServiceWorkerContextCoreObserver overrides:
   void OnStarting(int64_t version_id) override {
     DCHECK_CURRENTLY_ON(BrowserThread::UI);
@@ -416,8 +424,8 @@
 void ServiceWorkerInternalsHandler::OnJavascriptDisallowed() {
   BrowserContext* browser_context =
       web_ui()->GetWebContents()->GetBrowserContext();
-  // Safe to use base::Unretained(this) because
-  // ForEachStoragePartition is synchronous.
+  // Safe to use base::Unretained(this) because ForEachStoragePartition is
+  // synchronous.
   browser_context->ForEachStoragePartition(base::BindRepeating(
       &ServiceWorkerInternalsHandler::RemoveObserverFromStoragePartition,
       base::Unretained(this)));
@@ -553,7 +561,7 @@
   context->RemoveObserver(observer.get());
 }
 
-void ServiceWorkerInternalsHandler::FindContext(
+void ServiceWorkerInternalsHandler::FindStoragePartitionById(
     int partition_id,
     StoragePartition** result_partition,
     StoragePartition* storage_partition) const {
@@ -570,8 +578,8 @@
       web_ui()->GetWebContents()->GetBrowserContext();
   StoragePartition* result_partition(nullptr);
   browser_context->ForEachStoragePartition(base::BindRepeating(
-      &ServiceWorkerInternalsHandler::FindContext, base::Unretained(this),
-      partition_id, &result_partition));
+      &ServiceWorkerInternalsHandler::FindStoragePartitionById,
+      base::Unretained(this), partition_id, &result_partition));
   if (!result_partition)
     return false;
   *context = static_cast<ServiceWorkerContextWrapper*>(
diff --git a/content/browser/service_worker/service_worker_internals_ui.h b/content/browser/service_worker/service_worker_internals_ui.h
index f072901d..6c5b4a7 100644
--- a/content/browser/service_worker/service_worker_internals_ui.h
+++ b/content/browser/service_worker/service_worker_internals_ui.h
@@ -81,9 +81,9 @@
   bool GetServiceWorkerContext(
       int partition_id,
       scoped_refptr<ServiceWorkerContextWrapper>* context);
-  void FindContext(int partition_id,
-                   StoragePartition** result_partition,
-                   StoragePartition* storage_partition) const;
+  void FindStoragePartitionById(int partition_id,
+                                StoragePartition** result_partition,
+                                StoragePartition* storage_partition) const;
 
   void StopWorkerWithId(scoped_refptr<ServiceWorkerContextWrapper> context,
                         int64_t version_id,
diff --git a/content/common/frame.mojom b/content/common/frame.mojom
index 3344db3..bd291401 100644
--- a/content/common/frame.mojom
+++ b/content/common/frame.mojom
@@ -377,8 +377,6 @@
   GetInterfaceProvider(
       pending_receiver<service_manager.mojom.InterfaceProvider> interfaces);
 
-  GetCanonicalUrlForSharing() => (url.mojom.Url? canonical_url);
-
   // Requests a one-time snapshot of the accessibility tree without enabling
   // accessibility if it wasn't already enabled.
   SnapshotAccessibilityTree(SnapshotAccessibilityTreeParams params)
diff --git a/content/public/test/fake_local_frame.cc b/content/public/test/fake_local_frame.cc
index a7f52c5..f57e2e1 100644
--- a/content/public/test/fake_local_frame.cc
+++ b/content/public/test/fake_local_frame.cc
@@ -174,6 +174,9 @@
 
 void FakeLocalFrame::HandleRendererDebugURL(const GURL& url) {}
 
+void FakeLocalFrame::GetCanonicalUrlForSharing(
+    GetCanonicalUrlForSharingCallback callback) {}
+
 void FakeLocalFrame::BindFrameHostReceiver(
     mojo::ScopedInterfaceEndpointHandle handle) {
   receiver_.Bind(mojo::PendingAssociatedReceiver<blink::mojom::LocalFrame>(
diff --git a/content/public/test/fake_local_frame.h b/content/public/test/fake_local_frame.h
index de13996..373188c 100644
--- a/content/public/test/fake_local_frame.h
+++ b/content/public/test/fake_local_frame.h
@@ -134,6 +134,8 @@
                             ExtractSmartClipDataCallback callback) override;
 #endif
   void HandleRendererDebugURL(const GURL& url) override;
+  void GetCanonicalUrlForSharing(
+      GetCanonicalUrlForSharingCallback callback) override;
 
  private:
   void BindFrameHostReceiver(mojo::ScopedInterfaceEndpointHandle handle);
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc
index 5050482..509f0ad8 100644
--- a/content/renderer/render_frame_impl.cc
+++ b/content/renderer/render_frame_impl.cc
@@ -2461,14 +2461,6 @@
   interface_provider_receivers_.Add(this, std::move(receiver), task_runner);
 }
 
-void RenderFrameImpl::GetCanonicalUrlForSharing(
-    GetCanonicalUrlForSharingCallback callback) {
-  WebURL canonical_url = GetWebFrame()->GetDocument().CanonicalUrlForSharing();
-  std::move(callback).Run(canonical_url.IsNull()
-                              ? base::nullopt
-                              : base::make_optional(GURL(canonical_url)));
-}
-
 void RenderFrameImpl::BlockRequests() {
   frame_request_blocker_->Block();
 }
diff --git a/content/renderer/render_frame_impl.h b/content/renderer/render_frame_impl.h
index e938059..5a193d4 100644
--- a/content/renderer/render_frame_impl.h
+++ b/content/renderer/render_frame_impl.h
@@ -796,8 +796,6 @@
   void GetInterfaceProvider(
       mojo::PendingReceiver<service_manager::mojom::InterfaceProvider> receiver)
       override;
-  void GetCanonicalUrlForSharing(
-      GetCanonicalUrlForSharingCallback callback) override;
   void SnapshotAccessibilityTree(
       mojom::SnapshotAccessibilityTreeParamsPtr params,
       SnapshotAccessibilityTreeCallback callback) override;
diff --git a/content/test/data/accessibility/html/custom-element-hidden-expected-blink.txt b/content/test/data/accessibility/html/custom-element-hidden-expected-blink.txt
deleted file mode 100644
index 63ac8e70..0000000
--- a/content/test/data/accessibility/html/custom-element-hidden-expected-blink.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-rootWebArea htmlTag='#document'
-++genericContainer ignored htmlTag='html'
-++++genericContainer htmlTag='body'
-++++++genericContainer ignored invisible htmlTag='template'
-++++++genericContainer ignored invisible htmlTag='my-element'
-++++++++genericContainer ignored invisible htmlTag='div'
-++++++++++genericContainer ignored invisible htmlTag='slot'
-++++++++++++genericContainer ignored invisible htmlTag='span'
-++++++button htmlTag='button' name='Done'
diff --git a/content/test/data/accessibility/html/custom-element-hidden.html b/content/test/data/accessibility/html/custom-element-hidden.html
deleted file mode 100644
index 1f90691..0000000
--- a/content/test/data/accessibility/html/custom-element-hidden.html
+++ /dev/null
@@ -1,42 +0,0 @@
-<!--
-@BLINK-ALLOW:htmlTag=*
-@WAIT-FOR:Done
--->
-<!DOCTYPE html>
-<html>
-<body>
-  <template id="template">
-    <div><slot name="my-slot"></slot></div>
-  </template>
-
-  <div hidden>
-    <my-element>
-      <span slot="my-slot">Slot contents</span>
-    </my-element>
-  </div>
-
-  <button id="status"></button>
-
-  <script>
-    // After a delay, make "my-element" into a custom element using
-    // the template defined above. That will cause the template to be
-    // rendered inside <my-element>, and the slot contents to be reparented
-    // to the <slot> element.
-    window.setTimeout(() => {
-        customElements.define(
-            'my-element',
-            class extends HTMLElement {
-                constructor() {
-                    super();
-                    let template = document.getElementById('template');
-                    let templateContent = template.content;
-
-                    const shadowRoot = this.attachShadow({mode: 'open'})
-                          .appendChild(templateContent.cloneNode(true));
-                }
-            }
-        );
-        document.getElementById('status').setAttribute('aria-label', 'Done');
-    }, 500);
-  </script>
-</body>
diff --git a/content/test/data/accessibility/html/custom-element-remove-nodes-expected-blink.txt b/content/test/data/accessibility/html/custom-element-remove-nodes-expected-blink.txt
deleted file mode 100644
index 7f60f6f..0000000
--- a/content/test/data/accessibility/html/custom-element-remove-nodes-expected-blink.txt
+++ /dev/null
@@ -1,51 +0,0 @@
-rootWebArea htmlTag='#document' name='done'
-++genericContainer ignored htmlTag='html'
-++++genericContainer ignored htmlTag='body'
-++++++genericContainer ignored className='dt1' htmlTag='x-details'
-++++++++genericContainer ignored htmlTag='slot'
-++++++++++genericContainer description='Details' htmlTag='summary' descriptionFrom=summary
-++++++++++++listMarker htmlTag='::marker' name='%E2%96%B8 '
-++++++++++++++staticText name='%E2%96%B8 '
-++++++++++++++++inlineTextBox name='%E2%96%B8 '
-++++++++++++staticText name='Details'
-++++++++++++++inlineTextBox name='Details'
-++++++genericContainer ignored className='dt2' htmlTag='x-details'
-++++++++genericContainer ignored htmlTag='slot'
-++++++++++genericContainer description='Details' htmlTag='summary' descriptionFrom=summary
-++++++++++++listMarker htmlTag='::marker' name='%E2%96%B8 '
-++++++++++++++staticText name='%E2%96%B8 '
-++++++++++++++++inlineTextBox name='%E2%96%B8 '
-++++++++++++staticText name='Details'
-++++++++++++++inlineTextBox name='Details'
-++++++genericContainer ignored className='dt3' htmlTag='x-details'
-++++++++genericContainer ignored htmlTag='slot'
-++++++++++genericContainer description='Details' htmlTag='summary' descriptionFrom=summary
-++++++++++++listMarker htmlTag='::marker' name='%E2%96%B8 '
-++++++++++++++staticText name='%E2%96%B8 '
-++++++++++++++++inlineTextBox name='%E2%96%B8 '
-++++++++++++staticText name='Details'
-++++++++++++++inlineTextBox name='Details'
-++++++genericContainer ignored className='dt4' htmlTag='x-details'
-++++++++genericContainer ignored htmlTag='slot'
-++++++++++genericContainer description='Details' htmlTag='summary' descriptionFrom=summary
-++++++++++++listMarker htmlTag='::marker' name='%E2%96%BE '
-++++++++++++++staticText name='%E2%96%BE '
-++++++++++++++++inlineTextBox name='%E2%96%BE '
-++++++++++++staticText name='Details'
-++++++++++++++inlineTextBox name='Details'
-++++++genericContainer ignored className='dt5' htmlTag='x-details'
-++++++++genericContainer ignored htmlTag='slot'
-++++++++++genericContainer description='Details' htmlTag='summary' descriptionFrom=summary
-++++++++++++listMarker htmlTag='::marker' name='%E2%96%BE '
-++++++++++++++staticText name='%E2%96%BE '
-++++++++++++++++inlineTextBox name='%E2%96%BE '
-++++++++++++staticText name='Details'
-++++++++++++++inlineTextBox name='Details'
-++++++genericContainer ignored className='dt6' htmlTag='x-details'
-++++++++genericContainer ignored htmlTag='slot'
-++++++++++genericContainer description='Details' htmlTag='summary' descriptionFrom=summary
-++++++++++++listMarker htmlTag='::marker' name='%E2%96%BE '
-++++++++++++++staticText name='%E2%96%BE '
-++++++++++++++++inlineTextBox name='%E2%96%BE '
-++++++++++++staticText name='Details'
-++++++++++++++inlineTextBox name='Details'
diff --git a/content/test/data/accessibility/html/custom-element-remove-nodes.html b/content/test/data/accessibility/html/custom-element-remove-nodes.html
deleted file mode 100644
index 5689e46..0000000
--- a/content/test/data/accessibility/html/custom-element-remove-nodes.html
+++ /dev/null
@@ -1,114 +0,0 @@
-<!--
-@BLINK-ALLOW:htmlTag*
-@BLINK-ALLOW:className*
-@WAIT-FOR:done
--->
-<script>
-class CustomDetails extends HTMLElement {
-  constructor() {
-    super();
-    const shadowRoot = this.attachShadow({mode: 'open', slotAssignment: 'manual'});
-
-    this.summarySlot = document.createElement('slot');
-    this.summarySlot.id = 'details-summary';
-    shadowRoot.appendChild(this.summarySlot);
-
-    const defaultSummary = document.createElement('summary');
-    defaultSummary.textContent = 'Details';
-    this.summarySlot.appendChild(defaultSummary);
-
-    this.contentSlot = document.createElement('slot');
-    this.contentSlot.id = 'details-content';
-    this.contentSlot.style = `content-visibility:hidden; display:block;`;
-    shadowRoot.appendChild(this.contentSlot);
-
-    const style = document.createElement('style');
-    style.textContent = `
-:host summary {
-  display: list-item;
-  counter-increment: list-item 0;
-  list-style: disclosure-closed inside;
-}
-:host([open]) summary {
-  list-style-type: disclosure-open;
-}
-`;
-    shadowRoot.appendChild(style);
-  }
-
-  connectedCallback() {
-    this.updateOpen();
-    this.updateAssignment();
-    this.addEventListener('DOMNodeInserted', this.updateAssignment);
-    this.addEventListener('DOMNodeRemoved', this.updateAssignment);
-  }
-
-  disconnectedCallback() {
-    this.removeEventListener('DOMNodeInserted', this.updateAssignment);
-    this.removeEventListener('DOMNodeRemoved', this.updateAssignment);
-  }
-
-  attributeChangedCallback(name, oldValue, newValue) {
-    this.updateOpen();
-  }
-
-  static get observedAttributes() {
-    return ['open'];
-  }
-
-  updateOpen() {
-    if (this.hasAttribute('open')) {
-      this.contentSlot.style = ``;
-    } else {
-      this.contentSlot.style = `content-visibility: hidden; display:block`;
-    }
-  }
-
-  updateAssignment() {
-    let summary = null;
-    const content = [];
-
-    for (let child = this.firstChild; child; child = child.nextSibling) {
-      if (!summary && child.tagName === 'SUMMARY') {
-        summary = child;
-      } else {
-        content.push(child);
-      }
-    }
-
-    if (summary) {
-      this.summarySlot.assign([summary]);
-    } else {
-      this.summarySlot.assign([]);
-    }
-    this.contentSlot.assign(content);
-  }
-};
-customElements.define('x-details', CustomDetails);
-</script>
-
-<script>
-const $ = document.querySelector.bind(document);
-
-document.addEventListener('DOMContentLoaded', () => {
-  setTimeout(() => {
-  $('#dt1').removeChild($('#dt1 > summary'));
-  $('#dt2').removeChild($('#dt2 > summary'));
-  $('#dt3').removeChild($('#dt3 > summary:last-of-type'));
-  $('#dt4').removeChild($('#dt4 > summary'));
-  $('#dt5').removeChild($('#dt5 > summary'));
-  $('#dt6').removeChild($('#dt6 > summary:last-of-type'));
-
-    document.title = 'done';
-  }, 200);
-});
-
-</script>
-<body>
-<x-details id="dt1" class="dt1"><summary>summary</summary></x-details>
-<x-details id="dt2" class="dt2"><summary>summary 1</summary><summary>summary 2</summary></x-details>
-<x-details id="dt3" class="dt3"><summary>summary 1</summary><summary>summary <b>2</b></summary></x-details>
-<x-details id="dt4" class="dt4" open><summary>summary</summary></x-details>
-<x-details id="dt5" class="dt5" open><summary>summary 1</summary><summary>summary <mark>2</mark></summary></x-details>
-<x-details id="dt6" class="dt6" open><summary>summary 1</summary><summary>summary <mark>2</mark></summary></x-details>
-</body>
diff --git a/google_apis/drive/drive_api_parser.cc b/google_apis/drive/drive_api_parser.cc
index f73bcc9..918fe2c 100644
--- a/google_apis/drive/drive_api_parser.cc
+++ b/google_apis/drive/drive_api_parser.cc
@@ -77,7 +77,7 @@
   if (!value->GetAsDictionary(&dictionary_value))
     return false;
 
-  result->reserve(dictionary_value->size());
+  result->reserve(dictionary_value->DictSize());
   for (base::DictionaryValue::Iterator iter(*dictionary_value);
        !iter.IsAtEnd(); iter.Advance()) {
     std::string string_value;
diff --git a/google_apis/drive/drive_api_requests.cc b/google_apis/drive/drive_api_requests.cc
index 4bc95ba3..7791f8a 100644
--- a/google_apis/drive/drive_api_requests.cc
+++ b/google_apis/drive/drive_api_requests.cc
@@ -822,7 +822,7 @@
   }
 
   AttachProperties(properties_, &root);
-  if (root.empty())
+  if (root.DictEmpty())
     return false;
 
   *upload_content_type = util::kContentTypeApplicationJson;
diff --git a/infra/config/generated/cr-buildbucket-dev.cfg b/infra/config/generated/cr-buildbucket-dev.cfg
index 1d11d9e..9fe593df 100644
--- a/infra/config/generated/cr-buildbucket-dev.cfg
+++ b/infra/config/generated/cr-buildbucket-dev.cfg
@@ -247,6 +247,10 @@
       build_numbers: YES
       service_account: "chromium-ci-builder-dev@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -286,6 +290,10 @@
       build_numbers: YES
       service_account: "chromium-ci-builder-dev@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
diff --git a/infra/config/generated/cr-buildbucket.cfg b/infra/config/generated/cr-buildbucket.cfg
index dabc37b..d36a276 100644
--- a/infra/config/generated/cr-buildbucket.cfg
+++ b/infra/config/generated/cr-buildbucket.cfg
@@ -3021,6 +3021,10 @@
       build_numbers: YES
       service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -3083,6 +3087,10 @@
       build_numbers: YES
       service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -3893,6 +3901,10 @@
       build_numbers: YES
       service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -3955,6 +3967,10 @@
       build_numbers: YES
       service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -4017,6 +4033,10 @@
       build_numbers: YES
       service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -4327,6 +4347,10 @@
       build_numbers: YES
       service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -4389,6 +4413,10 @@
       build_numbers: YES
       service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -5571,6 +5599,10 @@
       build_numbers: YES
       service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -5633,6 +5665,10 @@
       build_numbers: YES
       service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -5695,6 +5731,10 @@
       build_numbers: YES
       service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -5757,6 +5797,10 @@
       build_numbers: YES
       service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -5819,6 +5863,10 @@
       build_numbers: YES
       service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -5881,6 +5929,10 @@
       build_numbers: YES
       service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -6195,6 +6247,10 @@
       build_numbers: YES
       service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -6257,6 +6313,10 @@
       build_numbers: YES
       service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -7250,6 +7310,10 @@
       build_numbers: YES
       service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -12915,6 +12979,10 @@
       build_numbers: YES
       service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -15224,6 +15292,10 @@
       build_numbers: YES
       service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -15286,6 +15358,10 @@
       build_numbers: YES
       service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -15348,6 +15424,10 @@
       build_numbers: YES
       service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -15410,6 +15490,10 @@
       build_numbers: YES
       service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -15472,6 +15556,10 @@
       build_numbers: YES
       service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -15534,6 +15622,10 @@
       build_numbers: YES
       service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -15596,6 +15688,10 @@
       build_numbers: YES
       service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -15658,6 +15754,10 @@
       build_numbers: YES
       service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -16353,6 +16453,10 @@
       build_numbers: YES
       service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -16414,6 +16518,10 @@
       build_numbers: YES
       service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -16476,6 +16584,10 @@
       build_numbers: YES
       service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -16537,6 +16649,10 @@
       build_numbers: YES
       service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -16598,6 +16714,10 @@
       build_numbers: YES
       service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -16659,6 +16779,10 @@
       build_numbers: YES
       service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -16720,6 +16844,10 @@
       build_numbers: YES
       service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -16847,6 +16975,10 @@
       build_numbers: YES
       service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -16909,6 +17041,10 @@
       build_numbers: YES
       service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -17591,6 +17727,10 @@
       build_numbers: YES
       service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -17714,6 +17854,10 @@
       build_numbers: YES
       service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -17775,6 +17919,10 @@
       build_numbers: YES
       service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -17961,6 +18109,10 @@
       build_numbers: YES
       service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -18209,6 +18361,10 @@
       build_numbers: YES
       service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -18271,6 +18427,10 @@
       build_numbers: YES
       service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -18332,6 +18492,10 @@
       build_numbers: YES
       service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -29742,6 +29906,10 @@
       build_numbers: YES
       service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -29804,6 +29972,10 @@
       build_numbers: YES
       service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -29866,6 +30038,10 @@
       build_numbers: YES
       service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -29928,6 +30104,10 @@
       build_numbers: YES
       service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -29990,6 +30170,10 @@
       build_numbers: YES
       service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -30051,6 +30235,10 @@
       build_numbers: YES
       service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -30112,6 +30300,10 @@
       build_numbers: YES
       service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -30174,6 +30366,10 @@
       build_numbers: YES
       service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -30236,6 +30432,10 @@
       build_numbers: YES
       service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -30298,6 +30498,10 @@
       build_numbers: YES
       service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -30359,6 +30563,10 @@
       build_numbers: YES
       service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -30420,6 +30628,10 @@
       build_numbers: YES
       service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -30481,6 +30693,10 @@
       build_numbers: YES
       service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -30542,6 +30758,10 @@
       build_numbers: YES
       service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -30664,6 +30884,10 @@
       build_numbers: YES
       service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -30726,6 +30950,10 @@
       build_numbers: YES
       service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -30788,6 +31016,10 @@
       build_numbers: YES
       service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -30850,6 +31082,10 @@
       build_numbers: YES
       service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -30912,6 +31148,10 @@
       build_numbers: YES
       service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -30974,6 +31214,10 @@
       build_numbers: YES
       service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -31036,6 +31280,10 @@
       build_numbers: YES
       service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -31098,6 +31346,10 @@
       build_numbers: YES
       service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -31160,6 +31412,10 @@
       build_numbers: YES
       service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -31222,6 +31478,10 @@
       build_numbers: YES
       service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -31532,6 +31792,10 @@
       build_numbers: YES
       service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -31717,6 +31981,10 @@
       build_numbers: YES
       service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -31778,6 +32046,10 @@
       build_numbers: YES
       service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -31839,6 +32111,10 @@
       build_numbers: YES
       service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -31900,6 +32176,10 @@
       build_numbers: YES
       service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -31962,6 +32242,10 @@
       build_numbers: YES
       service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -32024,6 +32308,10 @@
       build_numbers: YES
       service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -32836,6 +33124,10 @@
       build_numbers: YES
       service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -33363,6 +33655,10 @@
       build_numbers: YES
       service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "luci.use_realms"
         value: 100
       }
@@ -33389,6 +33685,10 @@
       build_numbers: YES
       service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "luci.use_realms"
         value: 100
       }
@@ -33415,6 +33715,10 @@
       build_numbers: YES
       service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "luci.use_realms"
         value: 100
       }
@@ -33441,6 +33745,10 @@
       build_numbers: YES
       service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "luci.use_realms"
         value: 100
       }
@@ -33467,6 +33775,10 @@
       build_numbers: YES
       service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "luci.use_realms"
         value: 100
       }
@@ -33493,6 +33805,10 @@
       build_numbers: YES
       service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "luci.use_realms"
         value: 100
       }
@@ -33667,6 +33983,10 @@
       build_numbers: YES
       service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "luci.use_realms"
         value: 100
       }
@@ -33693,6 +34013,10 @@
       build_numbers: YES
       service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "luci.use_realms"
         value: 100
       }
@@ -33719,6 +34043,10 @@
       build_numbers: YES
       service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "luci.use_realms"
         value: 100
       }
@@ -33745,6 +34073,10 @@
       build_numbers: YES
       service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "luci.use_realms"
         value: 100
       }
@@ -33771,6 +34103,10 @@
       build_numbers: YES
       service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "luci.use_realms"
         value: 100
       }
@@ -33797,6 +34133,10 @@
       build_numbers: YES
       service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "luci.use_realms"
         value: 100
       }
@@ -33823,6 +34163,10 @@
       build_numbers: YES
       service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "luci.use_realms"
         value: 100
       }
@@ -33849,6 +34193,10 @@
       build_numbers: YES
       service_account: "goma-release-testing@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "luci.use_realms"
         value: 100
       }
@@ -39320,6 +39668,10 @@
         value: 5
       }
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -39383,6 +39735,10 @@
         value: 5
       }
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -39446,6 +39802,10 @@
         value: 5
       }
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -39509,6 +39869,10 @@
         value: 5
       }
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -43136,6 +43500,10 @@
         value: 5
       }
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -43197,6 +43565,10 @@
         value: 5
       }
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -43258,6 +43630,10 @@
         value: 5
       }
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -43319,6 +43695,10 @@
         value: 5
       }
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -43380,6 +43760,10 @@
         value: 5
       }
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -43441,6 +43825,10 @@
         value: 5
       }
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -43502,6 +43890,10 @@
         value: 5
       }
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -43563,6 +43955,10 @@
         value: 5
       }
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -43624,6 +44020,10 @@
         value: 5
       }
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -43685,6 +44085,10 @@
         value: 5
       }
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -43746,6 +44150,10 @@
         value: 5
       }
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -43807,6 +44215,10 @@
         value: 5
       }
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -43868,6 +44280,10 @@
         value: 5
       }
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -44240,6 +44656,10 @@
         value: 5
       }
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -53019,6 +53439,10 @@
         value: 5
       }
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -53083,6 +53507,10 @@
         value: 5
       }
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -53147,6 +53575,10 @@
         value: 5
       }
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -53211,6 +53643,10 @@
         value: 5
       }
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -53276,6 +53712,10 @@
         value: 5
       }
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -53341,6 +53781,10 @@
         value: 5
       }
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -53406,6 +53850,10 @@
         value: 5
       }
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -53469,6 +53917,10 @@
         value: 5
       }
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -53533,6 +53985,10 @@
         value: 5
       }
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -53598,6 +54054,10 @@
         value: 5
       }
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -53660,6 +54120,10 @@
         value: 5
       }
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -53722,6 +54186,10 @@
         value: 5
       }
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -53784,6 +54252,10 @@
         value: 5
       }
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -53846,6 +54318,10 @@
         value: 5
       }
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -53908,6 +54384,10 @@
         value: 5
       }
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -53970,6 +54450,10 @@
         value: 5
       }
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -54032,6 +54516,10 @@
         value: 5
       }
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -54097,6 +54585,10 @@
         value: 5
       }
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -54162,6 +54654,10 @@
         value: 5
       }
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -54227,6 +54723,10 @@
         value: 5
       }
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -54292,6 +54792,10 @@
         value: 5
       }
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -54356,6 +54860,10 @@
         value: 5
       }
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -54421,6 +54929,10 @@
         value: 5
       }
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -54486,6 +54998,10 @@
         value: 5
       }
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -54550,6 +55066,10 @@
         value: 5
       }
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -54614,6 +55134,10 @@
         value: 5
       }
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -54679,6 +55203,10 @@
         value: 5
       }
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -54744,6 +55272,10 @@
         value: 5
       }
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -54809,6 +55341,10 @@
         value: 5
       }
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -54874,6 +55410,10 @@
         value: 5
       }
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -54939,6 +55479,10 @@
         value: 5
       }
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -55004,6 +55548,10 @@
         value: 5
       }
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -55069,6 +55617,10 @@
         value: 5
       }
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -55134,6 +55686,10 @@
         value: 5
       }
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -55199,6 +55755,10 @@
         value: 5
       }
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -55264,6 +55824,10 @@
         value: 5
       }
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -55328,6 +55892,10 @@
         value: 5
       }
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -55393,6 +55961,10 @@
         value: 5
       }
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "chromium.resultdb.result_sink"
         value: 100
       }
@@ -55613,6 +56185,10 @@
       build_numbers: YES
       service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "luci.use_realms"
         value: 100
       }
@@ -55637,6 +56213,10 @@
       build_numbers: YES
       service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "luci.use_realms"
         value: 100
       }
@@ -55661,6 +56241,10 @@
       build_numbers: YES
       service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "luci.use_realms"
         value: 100
       }
@@ -55685,6 +56269,10 @@
       build_numbers: YES
       service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "luci.use_realms"
         value: 100
       }
@@ -56003,6 +56591,10 @@
       build_numbers: YES
       service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "luci.use_realms"
         value: 100
       }
@@ -56027,6 +56619,10 @@
       build_numbers: YES
       service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "luci.use_realms"
         value: 100
       }
@@ -56051,6 +56647,10 @@
       build_numbers: YES
       service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "luci.use_realms"
         value: 100
       }
@@ -56075,6 +56675,10 @@
       build_numbers: YES
       service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "luci.use_realms"
         value: 100
       }
@@ -56099,6 +56703,10 @@
       build_numbers: YES
       service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
+        key: "chromium.chromium_tests.use_rbe_cas"
+        value: 20
+      }
+      experiments {
         key: "luci.use_realms"
         value: 100
       }
diff --git a/infra/config/lib/builders.star b/infra/config/lib/builders.star
index b2536b5..c93ca53 100644
--- a/infra/config/lib/builders.star
+++ b/infra/config/lib/builders.star
@@ -589,6 +589,8 @@
     experiments = experiments or {}
     if os and os.category == os_category.MAC:
         experiments["chromium.chromium_tests.use_rbe_cas"] = 50
+    elif os and os.category == os_category.WINDOWS:
+        experiments["chromium.chromium_tests.use_rbe_cas"] = 20
     kwargs["experiments"] = experiments
 
     configure_kitchen = defaults.get_value("configure_kitchen", configure_kitchen)
diff --git a/ios/chrome/app/strings/resources/ios_strings_uz.xtb b/ios/chrome/app/strings/resources/ios_strings_uz.xtb
index b80a3b3..6f2ed267 100644
--- a/ios/chrome/app/strings/resources/ios_strings_uz.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_uz.xtb
@@ -33,6 +33,7 @@
 <translation id="122699739164161391">Barcha varaqlarni yopish</translation>
 <translation id="1229222343402087523">${searchPhrase} – Chrome orqali qidirish</translation>
 <translation id="1231733316453485619">Sinxronizatsiya yoqilsinmi?</translation>
+<translation id="1242044645101871359">Qaytadan kiring</translation>
 <translation id="1254117744268754948">Jildni tanlash</translation>
 <translation id="1265739287306757398">Batafsil axborot</translation>
 <translation id="1272079795634619415">To‘xtatish</translation>
@@ -97,6 +98,7 @@
 <translation id="1820259098641718022">Mutolaa ro‘yxatiga qo‘shildi</translation>
 <translation id="1870148520156231997">Parolni ochish</translation>
 <translation id="1872096359983322073">Fonar</translation>
+<translation id="1894205589103145703">Hisobga kirishda nimadir xato ketdi.</translation>
 <translation id="1911619930368729126">Google Drive’ga yuklash</translation>
 <translation id="1923342640370224680">So‘nggi soat</translation>
 <translation id="1941314575388338491">Nusxalash uchun ikki marta bosing.</translation>
@@ -110,6 +112,7 @@
 <translation id="2073572773299281212"><ph name="DAYS" /> kun oldin onlayn edi</translation>
 <translation id="2074131957428911366">Nimani sinxronlashni istalgan vaqtda <ph name="BEGIN_LINK" />sozlamalar<ph name="END_LINK" /> orqali tanlash mumkin.</translation>
 <translation id="2079545284768500474">Bekor qilish</translation>
+<translation id="2086623437239112659">Kirishga oid saqlangan axborotingiz eskirgan.</translation>
 <translation id="209018056901015185">To‘liq versiya</translation>
 <translation id="2103075008456228677">history.google.com sahifasini ochish</translation>
 <translation id="2116625576999540962"><ph name="NUMBER_OF_SELECTED_BOOKMARKS" /> ta xatcho‘p ko‘chirildi</translation>
@@ -400,6 +403,7 @@
 <translation id="5132942445612118989">Parollar, tarix va boshqa sozlamalaringizni barcha qurilmalaringizda sinxronlang</translation>
 <translation id="5140288047769711648">Chrome bu parolni eslab qoladi. Yodda tutishingiz shart emas.</translation>
 <translation id="5150492518600715772">Qurilmangizga yuborish</translation>
+<translation id="5168414296986405587">iPadOS uchun ishlab chiqilgan</translation>
 <translation id="5181140330217080051">Yuklab olinmoqda</translation>
 <translation id="5186185447130319458">Shaxsiy</translation>
 <translation id="5188482106078495165">Cookie sozlamalaringiz barcha varaqlarga tadbiq qilinadi. Yangi sozlamani tadbiq qilish uchun, varaqni ochib, uni yangilang.</translation>
@@ -429,6 +433,7 @@
 <translation id="5508435575041083207">Hisobdan chiqish va bu qurilmadagi maʼlumotlarni tozalash</translation>
 <translation id="5513681519188741830"><ph name="TIME" /> soat oldin</translation>
 <translation id="5525269841082836315">Kodli ibora yaratish</translation>
+<translation id="5532698011560297095">Kirish amalga oshmadi</translation>
 <translation id="5548760955356983418">Handoff funksiyasi veb-saytni bir qurilmada ochib, boshqasida davom etish imkoniyatini beradi. Ochilgan sayt Mac kompyuteringizning Dock panelida paydo bo‘ladi.
 
 Handoff funksiyasini faqatgina Chrome sozlamalarida emas, balki qurilma sozlamalarida (“Umumiy” bo‘limida) ham yoqish kerak. Barcha qurilmalaringiz umumiy iCloud hisobida sinxronlanishi zarur.</translation>
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.arm64.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.arm64.zip.sha1
index 34f11bb..e89e8cf9 100644
--- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.arm64.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.arm64.zip.sha1
@@ -1 +1 @@
-7cd105c18f88662bd2324d33f22974581992fff8
\ No newline at end of file
+35d7ae19040e80213bb06980fc3eedce4c9d0bce
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.x64.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.x64.zip.sha1
index 45463e0..b14017ed6 100644
--- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.x64.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.x64.zip.sha1
@@ -1 +1 @@
-ac62deb2059fd9daf912dfa56b83aa48e14b8d3f
\ No newline at end of file
+59ca4ceb38baff1c9e2eeeb502556b641aba3f38
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.arm64.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.arm64.zip.sha1
index 5b05684..eb4921e1 100644
--- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.arm64.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.arm64.zip.sha1
@@ -1 +1 @@
-8aee3f44b81a87763ef5d1b1fe49a452d1725bd9
\ No newline at end of file
+01aa7452836219f25c06154691cfa80c5be4eb29
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.x64.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.x64.zip.sha1
index f86dce2..bd897c7 100644
--- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.x64.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.x64.zip.sha1
@@ -1 +1 @@
-70c6c69f3842d2c96e8f08edab202a8813f2aff9
\ No newline at end of file
+444aca6a525e0c7d9819294fece138b14968d378
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.arm64.zip.sha1 b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.arm64.zip.sha1
index 0bba83c..d4b75f00 100644
--- a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.arm64.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.arm64.zip.sha1
@@ -1 +1 @@
-5de7e7b4a6b01610561f8990cec9414b751d74cf
\ No newline at end of file
+92538aa587ca462479e95d44fef04387d29cb7ab
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.x64.zip.sha1 b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.x64.zip.sha1
index acdb1c39..c2d44cc 100644
--- a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.x64.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.x64.zip.sha1
@@ -1 +1 @@
-36339e3c3b9ebea37b8ba0d3a258b6ca54120ee7
\ No newline at end of file
+5893af5486cdc1d6ab608d5e05b05799e60b8be5
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.arm64.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.arm64.zip.sha1
index 0fe954bf..d08c962 100644
--- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.arm64.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.arm64.zip.sha1
@@ -1 +1 @@
-356cca1c7a93862de57547840f8bd3d515da3dbf
\ No newline at end of file
+d45355c9f46f8f579890e0f1b2bd4418b92dfd58
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.x64.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.x64.zip.sha1
index 43fa9e92..b3ab907 100644
--- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.x64.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.x64.zip.sha1
@@ -1 +1 @@
-dd6e0339710d31a7e41e40c08b4db924c2fd75d1
\ No newline at end of file
+28619a92d294036dbd5f57f63542c8e1637095f9
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.arm64.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.arm64.zip.sha1
index c0d4340..a7378f38 100644
--- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.arm64.zip.sha1
+++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.arm64.zip.sha1
@@ -1 +1 @@
-8b43a283aa7e6b093d3d5be1c897d7bbee519f78
\ No newline at end of file
+f7e79edf5b139e3e8e0f1ed00279b9b1c9475239
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.x64.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.x64.zip.sha1
index 18cef3f..d9e42da 100644
--- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.x64.zip.sha1
+++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.x64.zip.sha1
@@ -1 +1 @@
-71e1d3aa8cacb5d3f8b54b2d24312b66b88391f2
\ No newline at end of file
+398b440d6bf365bd5ffd0853c978a75480d7315b
\ No newline at end of file
diff --git a/media/cast/BUILD.gn b/media/cast/BUILD.gn
index 242ea403..9a69682a2 100644
--- a/media/cast/BUILD.gn
+++ b/media/cast/BUILD.gn
@@ -182,25 +182,25 @@
   }
 }
 
-source_set("receiver") {
+source_set("test_receiver") {
   sources = [
-    "cast_receiver.h",
-    "net/rtp/cast_message_builder.cc",
-    "net/rtp/cast_message_builder.h",
-    "net/rtp/frame_buffer.cc",
-    "net/rtp/frame_buffer.h",
-    "net/rtp/framer.cc",
-    "net/rtp/framer.h",
-    "net/rtp/receiver_stats.cc",
-    "net/rtp/receiver_stats.h",
-    "receiver/audio_decoder.cc",
-    "receiver/audio_decoder.h",
-    "receiver/cast_receiver_impl.cc",
-    "receiver/cast_receiver_impl.h",
-    "receiver/frame_receiver.cc",
-    "receiver/frame_receiver.h",
-    "receiver/video_decoder.cc",
-    "receiver/video_decoder.h",
+    "test/receiver/audio_decoder.cc",
+    "test/receiver/audio_decoder.h",
+    "test/receiver/cast_message_builder.cc",
+    "test/receiver/cast_message_builder.h",
+    "test/receiver/cast_receiver.h",
+    "test/receiver/cast_receiver_impl.cc",
+    "test/receiver/cast_receiver_impl.h",
+    "test/receiver/frame_buffer.cc",
+    "test/receiver/frame_buffer.h",
+    "test/receiver/frame_receiver.cc",
+    "test/receiver/frame_receiver.h",
+    "test/receiver/framer.cc",
+    "test/receiver/framer.h",
+    "test/receiver/receiver_stats.cc",
+    "test/receiver/receiver_stats.h",
+    "test/receiver/video_decoder.cc",
+    "test/receiver/video_decoder.h",
   ]
 
   deps = [
@@ -252,8 +252,8 @@
 
   deps = [
     ":net",
-    ":receiver",
     ":sender",
+    ":test_receiver",
     "//base/test:test_support",
     "//media",
     "//net",
@@ -301,22 +301,15 @@
     # files.
     "net/rtcp/test_rtcp_packet_builder.cc",
     "net/rtcp/test_rtcp_packet_builder.h",
-    "net/rtp/cast_message_builder_unittest.cc",
-    "net/rtp/frame_buffer_unittest.cc",
-    "net/rtp/framer_unittest.cc",
     "net/rtp/mock_rtp_payload_feedback.cc",
     "net/rtp/mock_rtp_payload_feedback.h",
     "net/rtp/packet_storage_unittest.cc",
-    "net/rtp/receiver_stats_unittest.cc",
     "net/rtp/rtp_packet_builder.cc",
     "net/rtp/rtp_packet_builder.h",
     "net/rtp/rtp_packetizer_unittest.cc",
     "net/rtp/rtp_parser_unittest.cc",
     "net/udp_packet_pipe_unittest.cc",
     "net/udp_transport_unittest.cc",
-    "receiver/audio_decoder_unittest.cc",
-    "receiver/frame_receiver_unittest.cc",
-    "receiver/video_decoder_unittest.cc",
     "sender/audio_encoder_unittest.cc",
     "sender/audio_sender_unittest.cc",
     "sender/congestion_control_unittest.cc",
@@ -327,6 +320,13 @@
     "sender/video_sender_unittest.cc",
     "sender/vp8_quantizer_parser_unittest.cc",
     "test/end2end_unittest.cc",
+    "test/receiver/audio_decoder_unittest.cc",
+    "test/receiver/cast_message_builder_unittest.cc",
+    "test/receiver/frame_buffer_unittest.cc",
+    "test/receiver/frame_receiver_unittest.cc",
+    "test/receiver/framer_unittest.cc",
+    "test/receiver/receiver_stats_unittest.cc",
+    "test/receiver/video_decoder_unittest.cc",
     "test/utility/audio_utility_unittest.cc",
     "test/utility/barcode_unittest.cc",
   ]
@@ -334,8 +334,8 @@
   deps = [
     ":common",
     ":net",
-    ":receiver",
     ":sender",
+    ":test_receiver",
     ":test_support",
     "//base",
     "//base:cfi_buildflags",
@@ -386,8 +386,8 @@
     deps = [
       ":common",
       ":net",
-      ":receiver",
       ":sender",
+      ":test_receiver",
       ":test_support",
       "//base",
       "//base/test:test_support",
@@ -424,8 +424,8 @@
       ":common",
       ":net",
       ":network_simulation_model_proto",
-      ":receiver",
       ":sender",
+      ":test_receiver",
       ":test_support",
       "//base",
       "//base/test:test_support",
@@ -499,5 +499,5 @@
 static_library("cast_receiver") {
   complete_static_lib = true
   configs -= [ "//build/config/compiler:thin_archive" ]
-  deps = [ ":receiver" ]
+  deps = [ ":test_receiver" ]
 }
diff --git a/media/cast/README.md b/media/cast/README.md
index 5d28612..679e0a2 100644
--- a/media/cast/README.md
+++ b/media/cast/README.md
@@ -18,11 +18,11 @@
 
 * net/ - Wire-level packetization and pacing.
 
-* receiver/ - A minimal receiver implementation, used only for end-to-end
-  testing.
-
 * sender/ - Encoder front-ends and frame-level sender implementation for
   audio/video.
 
 * test/ - A collection of end-to-end tests, experiments, benchmarks, and related
   utility code.
+
+* test/receiver/ - A minimal receiver implementation, used only for end-to-end
+  testing.
diff --git a/media/cast/sender/vp8_quantizer_parser_unittest.cc b/media/cast/sender/vp8_quantizer_parser_unittest.cc
index d0017776..3f42076 100644
--- a/media/cast/sender/vp8_quantizer_parser_unittest.cc
+++ b/media/cast/sender/vp8_quantizer_parser_unittest.cc
@@ -10,10 +10,10 @@
 #include "base/macros.h"
 #include "base/time/time.h"
 #include "media/cast/cast_config.h"
-#include "media/cast/receiver/video_decoder.h"
 #include "media/cast/sender/sender_encoded_frame.h"
 #include "media/cast/sender/vp8_encoder.h"
 #include "media/cast/sender/vp8_quantizer_parser.h"
+#include "media/cast/test/receiver/video_decoder.h"
 #include "media/cast/test/utility/default_config.h"
 #include "media/cast/test/utility/video_utility.h"
 #include "testing/gtest/include/gtest/gtest.h"
diff --git a/media/cast/test/cast_benchmarks.cc b/media/cast/test/cast_benchmarks.cc
index b72cb146..25e535e 100644
--- a/media/cast/test/cast_benchmarks.cc
+++ b/media/cast/test/cast_benchmarks.cc
@@ -51,7 +51,6 @@
 #include "media/base/video_frame.h"
 #include "media/cast/cast_config.h"
 #include "media/cast/cast_environment.h"
-#include "media/cast/cast_receiver.h"
 #include "media/cast/cast_sender.h"
 #include "media/cast/logging/simple_event_subscriber.h"
 #include "media/cast/net/cast_transport.h"
@@ -59,6 +58,7 @@
 #include "media/cast/net/cast_transport_defines.h"
 #include "media/cast/net/cast_transport_impl.h"
 #include "media/cast/test/loopback_transport.h"
+#include "media/cast/test/receiver/cast_receiver.h"
 #include "media/cast/test/skewed_single_thread_task_runner.h"
 #include "media/cast/test/skewed_tick_clock.h"
 #include "media/cast/test/utility/audio_utility.h"
diff --git a/media/cast/test/end2end_unittest.cc b/media/cast/test/end2end_unittest.cc
index c4958fc9d4..1259c86 100644
--- a/media/cast/test/end2end_unittest.cc
+++ b/media/cast/test/end2end_unittest.cc
@@ -28,13 +28,13 @@
 #include "media/base/video_frame.h"
 #include "media/cast/cast_config.h"
 #include "media/cast/cast_environment.h"
-#include "media/cast/cast_receiver.h"
 #include "media/cast/cast_sender.h"
 #include "media/cast/logging/simple_event_subscriber.h"
 #include "media/cast/net/cast_transport.h"
 #include "media/cast/net/cast_transport_config.h"
 #include "media/cast/net/cast_transport_defines.h"
 #include "media/cast/net/cast_transport_impl.h"
+#include "media/cast/test/receiver/cast_receiver.h"
 #include "media/cast/test/skewed_single_thread_task_runner.h"
 #include "media/cast/test/skewed_tick_clock.h"
 #include "media/cast/test/utility/audio_utility.h"
diff --git a/media/cast/receiver/audio_decoder.cc b/media/cast/test/receiver/audio_decoder.cc
similarity index 97%
rename from media/cast/receiver/audio_decoder.cc
rename to media/cast/test/receiver/audio_decoder.cc
index d3b760b81..b881bf7 100644
--- a/media/cast/receiver/audio_decoder.cc
+++ b/media/cast/test/receiver/audio_decoder.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 "media/cast/receiver/audio_decoder.h"
+#include "media/cast/test/receiver/audio_decoder.h"
 
 #include <stdint.h>
 
@@ -40,9 +40,7 @@
     }
   }
 
-  OperationalStatus InitializationResult() const {
-    return operational_status_;
-  }
+  OperationalStatus InitializationResult() const { return operational_status_; }
 
   void DecodeFrame(std::unique_ptr<EncodedFrame> encoded_frame,
                    DecodeFrameCallback callback) {
@@ -123,7 +121,7 @@
       return;
     }
     if (opus_decoder_init(opus_decoder_, sampling_rate, num_channels) !=
-            OPUS_OK) {
+        OPUS_OK) {
       ImplBase::operational_status_ = STATUS_INVALID_CONFIGURATION;
       return;
     }
diff --git a/media/cast/receiver/audio_decoder.h b/media/cast/test/receiver/audio_decoder.h
similarity index 93%
rename from media/cast/receiver/audio_decoder.h
rename to media/cast/test/receiver/audio_decoder.h
index 608ff01..5606b60 100644
--- a/media/cast/receiver/audio_decoder.h
+++ b/media/cast/test/receiver/audio_decoder.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 MEDIA_CAST_RECEIVER_AUDIO_DECODER_H_
-#define MEDIA_CAST_RECEIVER_AUDIO_DECODER_H_
+#ifndef MEDIA_CAST_TEST_RECEIVER_AUDIO_DECODER_H_
+#define MEDIA_CAST_TEST_RECEIVER_AUDIO_DECODER_H_
 
 #include "base/callback.h"
 #include "base/macros.h"
@@ -63,4 +63,4 @@
 }  // namespace cast
 }  // namespace media
 
-#endif  // MEDIA_CAST_RECEIVER_AUDIO_DECODER_H_
+#endif  // MEDIA_CAST_TEST_RECEIVER_AUDIO_DECODER_H_
diff --git a/media/cast/receiver/audio_decoder_unittest.cc b/media/cast/test/receiver/audio_decoder_unittest.cc
similarity index 84%
rename from media/cast/receiver/audio_decoder_unittest.cc
rename to media/cast/test/receiver/audio_decoder_unittest.cc
index 39268d6..4c11aaf3 100644
--- a/media/cast/receiver/audio_decoder_unittest.cc
+++ b/media/cast/test/receiver/audio_decoder_unittest.cc
@@ -16,7 +16,7 @@
 #include "base/time/time.h"
 #include "build/build_config.h"
 #include "media/cast/cast_config.h"
-#include "media/cast/receiver/audio_decoder.h"
+#include "media/cast/test/receiver/audio_decoder.h"
 #include "media/cast/test/utility/audio_utility.h"
 #include "media/cast/test/utility/standalone_cast_environment.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -39,8 +39,7 @@
 class AudioDecoderTest : public ::testing::TestWithParam<TestScenario> {
  public:
   AudioDecoderTest()
-      : cast_environment_(new StandaloneCastEnvironment()),
-        cond_(&lock_) {}
+      : cast_environment_(new StandaloneCastEnvironment()), cond_(&lock_) {}
 
   virtual ~AudioDecoderTest() {
     // Make sure all threads have stopped before the environment goes away.
@@ -49,17 +48,14 @@
 
  protected:
   void SetUp() final {
-    audio_decoder_.reset(new AudioDecoder(cast_environment_,
-                                          GetParam().num_channels,
-                                          GetParam().sampling_rate,
-                                          GetParam().codec));
+    audio_decoder_.reset(
+        new AudioDecoder(cast_environment_, GetParam().num_channels,
+                         GetParam().sampling_rate, GetParam().codec));
     CHECK_EQ(STATUS_INITIALIZED, audio_decoder_->InitializationResult());
 
-    audio_bus_factory_.reset(
-        new TestAudioBusFactory(GetParam().num_channels,
-                                GetParam().sampling_rate,
-                                TestAudioBusFactory::kMiddleANoteFreq,
-                                0.5f));
+    audio_bus_factory_.reset(new TestAudioBusFactory(
+        GetParam().num_channels, GetParam().sampling_rate,
+        TestAudioBusFactory::kMiddleANoteFreq, 0.5f));
     last_frame_id_ = FrameId::first();
     decoded_frames_seen_ = 0;
 
@@ -68,10 +64,9 @@
           new uint8_t[opus_encoder_get_size(GetParam().num_channels)]);
       OpusEncoder* const opus_encoder =
           reinterpret_cast<OpusEncoder*>(opus_encoder_memory_.get());
-      CHECK_EQ(OPUS_OK, opus_encoder_init(opus_encoder,
-                                          GetParam().sampling_rate,
-                                          GetParam().num_channels,
-                                          OPUS_APPLICATION_AUDIO));
+      CHECK_EQ(OPUS_OK, opus_encoder_init(
+                            opus_encoder, GetParam().sampling_rate,
+                            GetParam().num_channels, OPUS_APPLICATION_AUDIO));
       CHECK_EQ(OPUS_OK,
                opus_encoder_ctl(opus_encoder, OPUS_SET_BITRATE(OPUS_AUTO)));
     }
@@ -82,8 +77,7 @@
 
   // Called from the unit test thread to create another EncodedFrame and push it
   // into the decoding pipeline.
-  void FeedMoreAudio(const base::TimeDelta& duration,
-                     int num_dropped_frames) {
+  void FeedMoreAudio(base::TimeDelta duration, int num_dropped_frames) {
     // Prepare a simulated EncodedFrame to feed into the AudioDecoder.
     std::unique_ptr<EncodedFrame> encoded_frame(new EncodedFrame());
     encoded_frame->dependency = EncodedFrame::KEY;
@@ -110,12 +104,9 @@
           reinterpret_cast<OpusEncoder*>(opus_encoder_memory_.get());
       const int kOpusEncodeBufferSize = 4000;
       encoded_frame->data.resize(kOpusEncodeBufferSize);
-      const int payload_size =
-          opus_encode(opus_encoder,
-                      &interleaved.front(),
-                      audio_bus->frames(),
-                      encoded_frame->mutable_bytes(),
-                      encoded_frame->data.size());
+      const int payload_size = opus_encode(
+          opus_encoder, &interleaved.front(), audio_bus->frames(),
+          encoded_frame->mutable_bytes(), encoded_frame->data.size());
       CHECK_GT(payload_size, 1);
       encoded_frame->data.resize(payload_size);
     } else {
@@ -165,7 +156,8 @@
     // recovery) because it introduces a tiny, significant delay.
     bool examine_signal = true;
     if (GetParam().codec == CODEC_AUDIO_OPUS) {
-      decoded_frames_seen_ = should_be_continuous ? decoded_frames_seen_ + 1 : 1;
+      decoded_frames_seen_ =
+          should_be_continuous ? decoded_frames_seen_ + 1 : 1;
       examine_signal = (decoded_frames_seen_ > 2) && should_be_continuous;
     }
     if (examine_signal) {
@@ -173,15 +165,14 @@
         EXPECT_NEAR(
             TestAudioBusFactory::kMiddleANoteFreq * 2 * audio_bus->frames() /
                 GetParam().sampling_rate,
-            CountZeroCrossings(audio_bus->channel(ch), audio_bus->frames()),
-            1);
+            CountZeroCrossings(audio_bus->channel(ch), audio_bus->frames()), 1);
       }
     }
 
     // Signal the main test thread that more audio was decoded.
     base::AutoLock auto_lock(lock_);
     total_audio_decoded_ += base::TimeDelta::FromSeconds(1) *
-        audio_bus->frames() / GetParam().sampling_rate;
+                            audio_bus->frames() / GetParam().sampling_rate;
     cond_.Signal();
   }
 
@@ -211,7 +202,7 @@
 
 TEST_P(AudioDecoderTest, DecodesFramesWithVaryingDuration) {
   // These are the set of frame durations supported by the Opus encoder.
-  const int kFrameDurationMs[] = { 5, 10, 20, 40, 60 };
+  const int kFrameDurationMs[] = {5, 10, 20, 40, 60};
 
   const int kNumFrames = 10;
   for (size_t i = 0; i < base::size(kFrameDurationMs); ++i)
diff --git a/media/cast/net/rtp/cast_message_builder.cc b/media/cast/test/receiver/cast_message_builder.cc
similarity index 96%
rename from media/cast/net/rtp/cast_message_builder.cc
rename to media/cast/test/receiver/cast_message_builder.cc
index 61a152b..49d4d969 100644
--- a/media/cast/net/rtp/cast_message_builder.cc
+++ b/media/cast/test/receiver/cast_message_builder.cc
@@ -2,11 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "media/cast/net/rtp/cast_message_builder.h"
+#include "media/cast/test/receiver/cast_message_builder.h"
 
 #include "base/logging.h"
 #include "media/cast/constants.h"
-#include "media/cast/net/rtp/framer.h"
+#include "media/cast/test/receiver/framer.h"
 
 namespace media {
 namespace cast {
@@ -183,8 +183,7 @@
     PacketIdSet missing;
     if (framer_->FrameExists(next_expected_frame_id)) {
       bool last_frame = (newest_frame_id == next_expected_frame_id);
-      framer_->GetMissingPackets(
-          next_expected_frame_id, last_frame, &missing);
+      framer_->GetMissingPackets(next_expected_frame_id, last_frame, &missing);
       if (!missing.empty()) {
         time_last_nacked_map_[next_expected_frame_id] = now;
         cast_msg_.missing_frames_and_packets.insert(
diff --git a/media/cast/net/rtp/cast_message_builder.h b/media/cast/test/receiver/cast_message_builder.h
similarity index 90%
rename from media/cast/net/rtp/cast_message_builder.h
rename to media/cast/test/receiver/cast_message_builder.h
index 9afd8c1..5e4d14dc 100644
--- a/media/cast/net/rtp/cast_message_builder.h
+++ b/media/cast/test/receiver/cast_message_builder.h
@@ -4,8 +4,8 @@
 
 // Handles NACK list and manages ACK.
 
-#ifndef MEDIA_CAST_NET_RTP_CAST_MESSAGE_BUILDER_H_
-#define MEDIA_CAST_NET_RTP_CAST_MESSAGE_BUILDER_H_
+#ifndef MEDIA_CAST_TEST_RECEIVER_CAST_MESSAGE_BUILDER_H_
+#define MEDIA_CAST_TEST_RECEIVER_CAST_MESSAGE_BUILDER_H_
 
 #include <stdint.h>
 
@@ -66,4 +66,4 @@
 }  // namespace cast
 }  // namespace media
 
-#endif  //  MEDIA_CAST_NET_RTP_CAST_MESSAGE_BUILDER_H_
+#endif  //  MEDIA_CAST_TEST_RECEIVER_CAST_MESSAGE_BUILDER_H_
diff --git a/media/cast/net/rtp/cast_message_builder_unittest.cc b/media/cast/test/receiver/cast_message_builder_unittest.cc
similarity index 98%
rename from media/cast/net/rtp/cast_message_builder_unittest.cc
rename to media/cast/test/receiver/cast_message_builder_unittest.cc
index 370a575..a4efd25 100644
--- a/media/cast/net/rtp/cast_message_builder_unittest.cc
+++ b/media/cast/test/receiver/cast_message_builder_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 "media/cast/net/rtp/cast_message_builder.h"
+#include "media/cast/test/receiver/cast_message_builder.h"
 
 #include <stddef.h>
 #include <stdint.h>
@@ -12,8 +12,8 @@
 #include "base/macros.h"
 #include "base/test/simple_test_tick_clock.h"
 #include "media/cast/net/rtcp/rtcp_defines.h"
-#include "media/cast/net/rtp/framer.h"
 #include "media/cast/net/rtp/rtp_defines.h"
+#include "media/cast/test/receiver/framer.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace media {
@@ -85,11 +85,7 @@
 class CastMessageBuilderTest : public ::testing::Test {
  protected:
   CastMessageBuilderTest()
-      : framer_(&testing_clock_,
-                &feedback_,
-                kSsrc,
-                true,
-                10),
+      : framer_(&testing_clock_, &feedback_, kSsrc, true, 10),
         cast_msg_builder_(new CastMessageBuilder(&testing_clock_,
                                                  &feedback_,
                                                  &framer_,
diff --git a/media/cast/cast_receiver.h b/media/cast/test/receiver/cast_receiver.h
similarity index 94%
rename from media/cast/cast_receiver.h
rename to media/cast/test/receiver/cast_receiver.h
index 659531b..5b76b58f 100644
--- a/media/cast/cast_receiver.h
+++ b/media/cast/test/receiver/cast_receiver.h
@@ -5,8 +5,8 @@
 // This is the main interface for the cast receiver. All configuration are done
 // at creation.
 
-#ifndef MEDIA_CAST_CAST_RECEIVER_H_
-#define MEDIA_CAST_CAST_RECEIVER_H_
+#ifndef MEDIA_CAST_TEST_RECEIVER_CAST_RECEIVER_H_
+#define MEDIA_CAST_TEST_RECEIVER_CAST_RECEIVER_H_
 
 #include <memory>
 
@@ -70,4 +70,4 @@
 }  // namespace cast
 }  // namespace media
 
-#endif  // MEDIA_CAST_CAST_RECEIVER_H_
+#endif  // MEDIA_CAST_TEST_RECEIVER_CAST_RECEIVER_H_
diff --git a/media/cast/receiver/cast_receiver_impl.cc b/media/cast/test/receiver/cast_receiver_impl.cc
similarity index 97%
rename from media/cast/receiver/cast_receiver_impl.cc
rename to media/cast/test/receiver/cast_receiver_impl.cc
index 9e279fb4..db967d0 100644
--- a/media/cast/receiver/cast_receiver_impl.cc
+++ b/media/cast/test/receiver/cast_receiver_impl.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 "media/cast/receiver/cast_receiver_impl.h"
+#include "media/cast/test/receiver/cast_receiver_impl.h"
 
 #include <stddef.h>
 
@@ -15,8 +15,8 @@
 #include "base/memory/ptr_util.h"
 #include "base/trace_event/trace_event.h"
 #include "media/cast/net/rtcp/rtcp_utility.h"
-#include "media/cast/receiver/audio_decoder.h"
-#include "media/cast/receiver/video_decoder.h"
+#include "media/cast/test/receiver/audio_decoder.h"
+#include "media/cast/test/receiver/video_decoder.h"
 
 namespace media {
 namespace cast {
@@ -156,7 +156,7 @@
     const AudioFrameDecodedCallback& callback,
     FrameId frame_id,
     RtpTimeTicks rtp_timestamp,
-    const base::TimeTicks& playout_time,
+    base::TimeTicks playout_time,
     std::unique_ptr<AudioBus> audio_bus,
     bool is_continuous) {
   DCHECK(cast_environment->CurrentlyOn(CastEnvironment::MAIN));
@@ -183,7 +183,7 @@
     const VideoFrameDecodedCallback& callback,
     FrameId frame_id,
     RtpTimeTicks rtp_timestamp,
-    const base::TimeTicks& playout_time,
+    base::TimeTicks playout_time,
     scoped_refptr<VideoFrame> video_frame,
     bool is_continuous) {
   DCHECK(cast_environment->CurrentlyOn(CastEnvironment::MAIN));
diff --git a/media/cast/receiver/cast_receiver_impl.h b/media/cast/test/receiver/cast_receiver_impl.h
similarity index 92%
rename from media/cast/receiver/cast_receiver_impl.h
rename to media/cast/test/receiver/cast_receiver_impl.h
index 81b8304..97dbc956 100644
--- a/media/cast/receiver/cast_receiver_impl.h
+++ b/media/cast/test/receiver/cast_receiver_impl.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 MEDIA_CAST_RECEIVER_CAST_RECEIVER_IMPL_H_
-#define MEDIA_CAST_RECEIVER_CAST_RECEIVER_IMPL_H_
+#ifndef MEDIA_CAST_TEST_RECEIVER_CAST_RECEIVER_IMPL_H_
+#define MEDIA_CAST_TEST_RECEIVER_CAST_RECEIVER_IMPL_H_
 
 #include <stdint.h>
 
@@ -12,10 +12,10 @@
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
 #include "media/cast/cast_environment.h"
-#include "media/cast/cast_receiver.h"
 #include "media/cast/common/rtp_time.h"
 #include "media/cast/net/pacing/paced_sender.h"
-#include "media/cast/receiver/frame_receiver.h"
+#include "media/cast/test/receiver/cast_receiver.h"
+#include "media/cast/test/receiver/frame_receiver.h"
 
 namespace media {
 namespace cast {
@@ -63,7 +63,7 @@
       const AudioFrameDecodedCallback& callback,
       FrameId frame_id,
       RtpTimeTicks rtp_timestamp,
-      const base::TimeTicks& playout_time,
+      base::TimeTicks playout_time,
       std::unique_ptr<AudioBus> audio_bus,
       bool is_continuous);
 
@@ -77,7 +77,7 @@
       const VideoFrameDecodedCallback& callback,
       FrameId frame_id,
       RtpTimeTicks rtp_timestamp,
-      const base::TimeTicks& playout_time,
+      base::TimeTicks playout_time,
       scoped_refptr<VideoFrame> video_frame,
       bool is_continuous);
 
@@ -112,4 +112,4 @@
 }  // namespace cast
 }  // namespace media
 
-#endif  // MEDIA_CAST_RECEIVER_CAST_RECEIVER_IMPL_H_
+#endif  // MEDIA_CAST_TEST_RECEIVER_CAST_RECEIVER_IMPL_H_
diff --git a/media/cast/net/rtp/frame_buffer.cc b/media/cast/test/receiver/frame_buffer.cc
similarity index 95%
rename from media/cast/net/rtp/frame_buffer.cc
rename to media/cast/test/receiver/frame_buffer.cc
index 255b506..2785320 100644
--- a/media/cast/net/rtp/frame_buffer.cc
+++ b/media/cast/test/receiver/frame_buffer.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 "media/cast/net/rtp/frame_buffer.h"
+#include "media/cast/test/receiver/frame_buffer.h"
 
 #include "base/check_op.h"
 
@@ -49,8 +49,8 @@
 
   // Insert the packet.
   retval.first->second.resize(payload_size);
-  std::copy(
-      payload_data, payload_data + payload_size, retval.first->second.begin());
+  std::copy(payload_data, payload_data + payload_size,
+            retval.first->second.begin());
 
   ++num_packets_received_;
   max_seen_packet_id_ = std::max(max_seen_packet_id_, rtp_header.packet_id);
@@ -108,6 +108,5 @@
   }
 }
 
-
 }  // namespace cast
 }  // namespace media
diff --git a/media/cast/net/rtp/frame_buffer.h b/media/cast/test/receiver/frame_buffer.h
similarity index 91%
rename from media/cast/net/rtp/frame_buffer.h
rename to media/cast/test/receiver/frame_buffer.h
index 7f9b9859..d7ffef4c 100644
--- a/media/cast/net/rtp/frame_buffer.h
+++ b/media/cast/test/receiver/frame_buffer.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 MEDIA_CAST_NET_RTP_FRAME_BUFFER_H_
-#define MEDIA_CAST_NET_RTP_FRAME_BUFFER_H_
+#ifndef MEDIA_CAST_TEST_RECEIVER_FRAME_BUFFER_H_
+#define MEDIA_CAST_TEST_RECEIVER_FRAME_BUFFER_H_
 
 #include <stddef.h>
 #include <stdint.h>
@@ -60,4 +60,4 @@
 }  // namespace cast
 }  // namespace media
 
-#endif  // MEDIA_CAST_NET_RTP_FRAME_BUFFER_H_
+#endif  // MEDIA_CAST_TEST_RECEIVER_FRAME_BUFFER_H_
diff --git a/media/cast/net/rtp/frame_buffer_unittest.cc b/media/cast/test/receiver/frame_buffer_unittest.cc
similarity index 98%
rename from media/cast/net/rtp/frame_buffer_unittest.cc
rename to media/cast/test/receiver/frame_buffer_unittest.cc
index 60f35378..f93c107 100644
--- a/media/cast/net/rtp/frame_buffer_unittest.cc
+++ b/media/cast/test/receiver/frame_buffer_unittest.cc
@@ -6,7 +6,7 @@
 
 #include "base/macros.h"
 #include "media/cast/net/cast_transport_defines.h"
-#include "media/cast/net/rtp/frame_buffer.h"
+#include "media/cast/test/receiver/frame_buffer.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace media {
@@ -92,5 +92,5 @@
   EXPECT_TRUE(buffer_.Complete());
 }
 
-}  // namespace media
 }  // namespace cast
+}  // namespace media
diff --git a/media/cast/receiver/frame_receiver.cc b/media/cast/test/receiver/frame_receiver.cc
similarity index 96%
rename from media/cast/receiver/frame_receiver.cc
rename to media/cast/test/receiver/frame_receiver.cc
index 33a3583..fb92f460 100644
--- a/media/cast/receiver/frame_receiver.cc
+++ b/media/cast/test/receiver/frame_receiver.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 "media/cast/receiver/frame_receiver.h"
+#include "media/cast/test/receiver/frame_receiver.h"
 
 #include <algorithm>
 #include <string>
@@ -90,10 +90,8 @@
     RtpCastHeader rtp_header;
     const uint8_t* payload_data;
     size_t payload_size;
-    if (!packet_parser_.ParsePacket(&packet->front(),
-                                    packet->size(),
-                                    &rtp_header,
-                                    &payload_data,
+    if (!packet_parser_.ParsePacket(&packet->front(), packet->size(),
+                                    &rtp_header, &payload_data,
                                     &payload_size)) {
       return false;
     }
@@ -171,8 +169,8 @@
           (fresh_sync_rtp - lip_sync_rtp_timestamp_).ToTimeDelta(rtp_timebase_);
     }
     lip_sync_rtp_timestamp_ = fresh_sync_rtp;
-    lip_sync_drift_.Update(
-        now, fresh_sync_reference - lip_sync_reference_time_);
+    lip_sync_drift_.Update(now,
+                           fresh_sync_reference - lip_sync_reference_time_);
   }
 
   // Another frame is complete from a non-duplicate packet.  Attempt to emit
@@ -262,8 +260,7 @@
     // Decrypt the payload data in the frame, if crypto is being used.
     if (decryptor_.is_activated()) {
       std::string decrypted_data;
-      if (!decryptor_.Decrypt(encoded_frame->frame_id,
-                              encoded_frame->data,
+      if (!decryptor_.Decrypt(encoded_frame->frame_id, encoded_frame->data,
                               &decrypted_data)) {
         // Decryption failed.  Give up on this frame.
         framer_.ReleaseFrame(encoded_frame->frame_id);
@@ -306,8 +303,8 @@
 base::TimeTicks FrameReceiver::GetPlayoutTime(const EncodedFrame& frame) const {
   base::TimeDelta target_playout_delay = target_playout_delay_;
   if (frame.new_playout_delay_ms) {
-    target_playout_delay = base::TimeDelta::FromMilliseconds(
-        frame.new_playout_delay_ms);
+    target_playout_delay =
+        base::TimeDelta::FromMilliseconds(frame.new_playout_delay_ms);
   }
   return lip_sync_reference_time_ + lip_sync_drift_.Current() +
          (frame.rtp_timestamp - lip_sync_rtp_timestamp_)
diff --git a/media/cast/receiver/frame_receiver.h b/media/cast/test/receiver/frame_receiver.h
similarity index 96%
rename from media/cast/receiver/frame_receiver.h
rename to media/cast/test/receiver/frame_receiver.h
index c5d2cb4..ba61c64 100644
--- a/media/cast/receiver/frame_receiver.h
+++ b/media/cast/test/receiver/frame_receiver.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 MEDIA_CAST_RECEIVER_FRAME_RECEIVER_H_
-#define MEDIA_CAST_RECEIVER_FRAME_RECEIVER_H_
+#ifndef MEDIA_CAST_TEST_RECEIVER_FRAME_RECEIVER_H_
+#define MEDIA_CAST_TEST_RECEIVER_FRAME_RECEIVER_H_
 
 #include <stddef.h>
 #include <stdint.h>
@@ -15,17 +15,17 @@
 #include "base/memory/ref_counted.h"
 #include "base/memory/weak_ptr.h"
 #include "base/time/time.h"
-#include "media/cast/cast_receiver.h"
 #include "media/cast/common/clock_drift_smoother.h"
 #include "media/cast/common/rtp_time.h"
 #include "media/cast/common/transport_encryption_handler.h"
 #include "media/cast/logging/logging_defines.h"
 #include "media/cast/net/rtcp/receiver_rtcp_event_subscriber.h"
 #include "media/cast/net/rtcp/receiver_rtcp_session.h"
-#include "media/cast/net/rtp/framer.h"
-#include "media/cast/net/rtp/receiver_stats.h"
 #include "media/cast/net/rtp/rtp_defines.h"
 #include "media/cast/net/rtp/rtp_parser.h"
+#include "media/cast/test/receiver/cast_receiver.h"
+#include "media/cast/test/receiver/framer.h"
+#include "media/cast/test/receiver/receiver_stats.h"
 
 namespace media {
 namespace cast {
@@ -218,4 +218,4 @@
 }  // namespace cast
 }  // namespace media
 
-#endif  // MEDIA_CAST_RECEIVER_FRAME_RECEIVER_H_
+#endif  // MEDIA_CAST_TEST_RECEIVER_FRAME_RECEIVER_H_
diff --git a/media/cast/receiver/frame_receiver_unittest.cc b/media/cast/test/receiver/frame_receiver_unittest.cc
similarity index 98%
rename from media/cast/receiver/frame_receiver_unittest.cc
rename to media/cast/test/receiver/frame_receiver_unittest.cc
index 9e8bdbe..cfd3e6c7 100644
--- a/media/cast/receiver/frame_receiver_unittest.cc
+++ b/media/cast/test/receiver/frame_receiver_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 "media/cast/receiver/frame_receiver.h"
+#include "media/cast/test/receiver/frame_receiver.h"
 
 #include <stddef.h>
 #include <stdint.h>
@@ -45,7 +45,7 @@
   virtual ~FakeFrameClient() = default;
 
   void AddExpectedResult(FrameId expected_frame_id,
-                         const base::TimeTicks& expected_playout_time) {
+                         base::TimeTicks expected_playout_time) {
     expected_results_.push_back(
         std::make_pair(expected_frame_id, expected_playout_time));
   }
@@ -117,8 +117,7 @@
 
   void FeedOneFrameIntoReceiver() {
     // Note: For testing purposes, a frame consists of only a single packet.
-    receiver_->ProcessParsedPacket(
-        rtp_header_, &payload_[0], payload_.size());
+    receiver_->ProcessParsedPacket(rtp_header_, &payload_[0], payload_.size());
   }
 
   void FeedLipSyncInfoIntoReceiver() {
@@ -310,7 +309,7 @@
                                   first_frame_capture_time +
                                       3 * time_advance_per_frame +
                                       target_playout_delay);
-  FeedOneFrameIntoReceiver();    // Frame 4
+  FeedOneFrameIntoReceiver();  // Frame 4
   task_runner_->RunTasks();
   EXPECT_EQ(3, frame_client_.number_times_called());
 
@@ -424,7 +423,7 @@
                                   first_frame_capture_time +
                                       2 * time_advance_per_frame +
                                       target_playout_delay);
-  --rtp_header_.frame_id;  // "Frame 2"
+  --rtp_header_.frame_id;            // "Frame 2"
   --rtp_header_.reference_frame_id;  // "Frame 1"
   rtp_header_.rtp_timestamp -= rtp_advance_per_frame;
   FeedOneFrameIntoReceiver();  // Frame 2
diff --git a/media/cast/net/rtp/framer.cc b/media/cast/test/receiver/framer.cc
similarity index 97%
rename from media/cast/net/rtp/framer.cc
rename to media/cast/test/receiver/framer.cc
index 369c9db..b87bb4b 100644
--- a/media/cast/net/rtp/framer.cc
+++ b/media/cast/test/receiver/framer.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 "media/cast/net/rtp/framer.h"
+#include "media/cast/test/receiver/framer.h"
 
 #include "base/logging.h"
 #include "media/cast/constants.h"
@@ -151,7 +151,9 @@
   return false;
 }
 
-bool Framer::Empty() const { return frames_.empty(); }
+bool Framer::Empty() const {
+  return frames_.empty();
+}
 
 int Framer::NumberOfCompleteFrames() const {
   int count = 0;
diff --git a/media/cast/net/rtp/framer.h b/media/cast/test/receiver/framer.h
similarity index 92%
rename from media/cast/net/rtp/framer.h
rename to media/cast/test/receiver/framer.h
index 1d0160a..6c565c7 100644
--- a/media/cast/net/rtp/framer.h
+++ b/media/cast/test/receiver/framer.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 MEDIA_CAST_NET_RTP_FRAMER_H_
-#define MEDIA_CAST_NET_RTP_FRAMER_H_
+#ifndef MEDIA_CAST_TEST_RECEIVER_FRAMER_H_
+#define MEDIA_CAST_TEST_RECEIVER_FRAMER_H_
 
 #include <stddef.h>
 #include <stdint.h>
@@ -14,9 +14,9 @@
 #include "base/macros.h"
 #include "base/time/tick_clock.h"
 #include "base/time/time.h"
-#include "media/cast/net/rtp/cast_message_builder.h"
-#include "media/cast/net/rtp/frame_buffer.h"
 #include "media/cast/net/rtp/rtp_defines.h"
+#include "media/cast/test/receiver/cast_message_builder.h"
+#include "media/cast/test/receiver/frame_buffer.h"
 
 namespace media {
 namespace cast {
@@ -95,4 +95,4 @@
 }  //  namespace cast
 }  //  namespace media
 
-#endif  // MEDIA_CAST_NET_RTP_FRAMER_H_
+#endif  // MEDIA_CAST_TEST_RECEIVER_FRAMER_H_
diff --git a/media/cast/net/rtp/framer_unittest.cc b/media/cast/test/receiver/framer_unittest.cc
similarity index 81%
rename from media/cast/net/rtp/framer_unittest.cc
rename to media/cast/test/receiver/framer_unittest.cc
index cc6a05d..f65e0ad 100644
--- a/media/cast/net/rtp/framer_unittest.cc
+++ b/media/cast/test/receiver/framer_unittest.cc
@@ -7,8 +7,8 @@
 #include "base/macros.h"
 #include "base/test/simple_test_tick_clock.h"
 #include "media/cast/net/cast_transport_defines.h"
-#include "media/cast/net/rtp/framer.h"
 #include "media/cast/net/rtp/mock_rtp_payload_feedback.h"
+#include "media/cast/test/receiver/framer.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace media {
@@ -51,15 +51,15 @@
   bool duplicate = false;
 
   // Insert non key first frame.
-  complete = framer_.InsertPacket(
-      &payload_[0], payload_.size(), rtp_header_, &duplicate);
+  complete = framer_.InsertPacket(&payload_[0], payload_.size(), rtp_header_,
+                                  &duplicate);
   EXPECT_TRUE(complete);
   EXPECT_FALSE(framer_.GetEncodedFrame(&frame, &next_frame, &multiple));
   rtp_header_.frame_id = FrameId::first() + 1;
   rtp_header_.reference_frame_id = FrameId::first() + 1;
   rtp_header_.is_key_frame = true;
-  complete = framer_.InsertPacket(
-      &payload_[0], payload_.size(), rtp_header_, &duplicate);
+  complete = framer_.InsertPacket(&payload_[0], payload_.size(), rtp_header_,
+                                  &duplicate);
   EXPECT_TRUE(complete);
   EXPECT_TRUE(framer_.GetEncodedFrame(&frame, &next_frame, &multiple));
   EXPECT_TRUE(next_frame);
@@ -81,8 +81,8 @@
   rtp_header_.is_key_frame = true;
   rtp_header_.frame_id = FrameId::first();
   rtp_header_.reference_frame_id = FrameId::first();
-  complete = framer_.InsertPacket(
-      &payload_[0], payload_.size(), rtp_header_, &duplicate);
+  complete = framer_.InsertPacket(&payload_[0], payload_.size(), rtp_header_,
+                                  &duplicate);
   EXPECT_TRUE(complete);
   EXPECT_TRUE(framer_.GetEncodedFrame(&frame, &next_frame, &multiple));
   EXPECT_TRUE(next_frame);
@@ -97,8 +97,8 @@
   rtp_header_.reference_frame_id = rtp_header_.frame_id - 1;
   rtp_header_.is_key_frame = false;
   rtp_header_.max_packet_id = 2;
-  complete = framer_.InsertPacket(
-      &payload_[0], payload_.size(), rtp_header_, &duplicate);
+  complete = framer_.InsertPacket(&payload_[0], payload_.size(), rtp_header_,
+                                  &duplicate);
   EXPECT_FALSE(complete);
   EXPECT_FALSE(framer_.GetEncodedFrame(&frame, &next_frame, &multiple));
 
@@ -106,8 +106,8 @@
   ++rtp_header_.frame_id;
   rtp_header_.reference_frame_id = rtp_header_.frame_id - 1;
   rtp_header_.max_packet_id = 0;
-  complete = framer_.InsertPacket(
-      &payload_[0], payload_.size(), rtp_header_, &duplicate);
+  complete = framer_.InsertPacket(&payload_[0], payload_.size(), rtp_header_,
+                                  &duplicate);
   EXPECT_TRUE(complete);
   EXPECT_FALSE(framer_.GetEncodedFrame(&frame, &next_frame, &multiple));
 }
@@ -125,16 +125,16 @@
   rtp_header_.reference_frame_id = FrameId::first();
   rtp_header_.max_packet_id = 1;
   duplicate = true;
-  complete = framer_.InsertPacket(
-      &payload_[0], payload_.size(), rtp_header_, &duplicate);
+  complete = framer_.InsertPacket(&payload_[0], payload_.size(), rtp_header_,
+                                  &duplicate);
   EXPECT_FALSE(complete);
   EXPECT_FALSE(duplicate);
   EXPECT_FALSE(framer_.GetEncodedFrame(&frame, &next_frame, &multiple));
 
   // Add same packet again in incomplete key frame.
   duplicate = false;
-  complete = framer_.InsertPacket(
-      &payload_[0], payload_.size(), rtp_header_, &duplicate);
+  complete = framer_.InsertPacket(&payload_[0], payload_.size(), rtp_header_,
+                                  &duplicate);
   EXPECT_FALSE(complete);
   EXPECT_TRUE(duplicate);
   EXPECT_FALSE(framer_.GetEncodedFrame(&frame, &next_frame, &multiple));
@@ -142,8 +142,8 @@
   // Complete key frame.
   rtp_header_.packet_id = 1;
   duplicate = true;
-  complete = framer_.InsertPacket(
-      &payload_[0], payload_.size(), rtp_header_, &duplicate);
+  complete = framer_.InsertPacket(&payload_[0], payload_.size(), rtp_header_,
+                                  &duplicate);
   EXPECT_TRUE(complete);
   EXPECT_FALSE(duplicate);
   EXPECT_TRUE(framer_.GetEncodedFrame(&frame, &next_frame, &multiple));
@@ -153,8 +153,8 @@
 
   // Add same packet again in complete key frame.
   duplicate = false;
-  complete = framer_.InsertPacket(
-      &payload_[0], payload_.size(), rtp_header_, &duplicate);
+  complete = framer_.InsertPacket(&payload_[0], payload_.size(), rtp_header_,
+                                  &duplicate);
   EXPECT_FALSE(complete);
   EXPECT_TRUE(duplicate);
   EXPECT_TRUE(framer_.GetEncodedFrame(&frame, &next_frame, &multiple));
@@ -170,16 +170,16 @@
   rtp_header_.packet_id = 0;
   rtp_header_.is_key_frame = false;
   duplicate = true;
-  complete = framer_.InsertPacket(
-      &payload_[0], payload_.size(), rtp_header_, &duplicate);
+  complete = framer_.InsertPacket(&payload_[0], payload_.size(), rtp_header_,
+                                  &duplicate);
   EXPECT_FALSE(complete);
   EXPECT_FALSE(duplicate);
   EXPECT_FALSE(framer_.GetEncodedFrame(&frame, &next_frame, &multiple));
 
   // Add same packet again in incomplete delta frame.
   duplicate = false;
-  complete = framer_.InsertPacket(
-      &payload_[0], payload_.size(), rtp_header_, &duplicate);
+  complete = framer_.InsertPacket(&payload_[0], payload_.size(), rtp_header_,
+                                  &duplicate);
   EXPECT_FALSE(complete);
   EXPECT_TRUE(duplicate);
   EXPECT_FALSE(framer_.GetEncodedFrame(&frame, &next_frame, &multiple));
@@ -187,8 +187,8 @@
   // Complete delta frame.
   rtp_header_.packet_id = 1;
   duplicate = true;
-  complete = framer_.InsertPacket(
-      &payload_[0], payload_.size(), rtp_header_, &duplicate);
+  complete = framer_.InsertPacket(&payload_[0], payload_.size(), rtp_header_,
+                                  &duplicate);
   EXPECT_TRUE(complete);
   EXPECT_FALSE(duplicate);
   EXPECT_TRUE(framer_.GetEncodedFrame(&frame, &next_frame, &multiple));
@@ -199,8 +199,8 @@
 
   // Add same packet again in complete delta frame.
   duplicate = false;
-  complete = framer_.InsertPacket(
-      &payload_[0], payload_.size(), rtp_header_, &duplicate);
+  complete = framer_.InsertPacket(&payload_[0], payload_.size(), rtp_header_,
+                                  &duplicate);
   EXPECT_FALSE(complete);
   EXPECT_TRUE(duplicate);
   EXPECT_TRUE(framer_.GetEncodedFrame(&frame, &next_frame, &multiple));
@@ -221,8 +221,8 @@
   rtp_header_.is_key_frame = true;
   rtp_header_.frame_id = FrameId::first();
   rtp_header_.reference_frame_id = FrameId::first();
-  complete = framer_.InsertPacket(
-      &payload_[0], payload_.size(), rtp_header_, &duplicate);
+  complete = framer_.InsertPacket(&payload_[0], payload_.size(), rtp_header_,
+                                  &duplicate);
   EXPECT_TRUE(complete);
   EXPECT_TRUE(framer_.GetEncodedFrame(&frame, &next_frame, &multiple));
   EXPECT_TRUE(next_frame);
@@ -236,8 +236,8 @@
   rtp_header_.frame_id = FrameId::first() + 2;
   rtp_header_.reference_frame_id = rtp_header_.frame_id - 1;
   rtp_header_.is_key_frame = false;
-  complete = framer_.InsertPacket(
-      &payload_[0], payload_.size(), rtp_header_, &duplicate);
+  complete = framer_.InsertPacket(&payload_[0], payload_.size(), rtp_header_,
+                                  &duplicate);
   EXPECT_TRUE(complete);
   EXPECT_FALSE(framer_.GetEncodedFrame(&frame, &next_frame, &multiple));
 }
@@ -251,14 +251,12 @@
   // Start with a complete key frame.
   rtp_header_.is_key_frame = false;
   rtp_header_.frame_id = FrameId::first();
-  framer_.InsertPacket(
-      &payload_[0], payload_.size(), rtp_header_, &duplicate);
+  framer_.InsertPacket(&payload_[0], payload_.size(), rtp_header_, &duplicate);
   EXPECT_FALSE(framer_.GetEncodedFrame(&frame, &next_frame, &multiple));
   rtp_header_.frame_id = FrameId::first() + 1;
   rtp_header_.reference_frame_id = FrameId::first() + 1;
   rtp_header_.is_key_frame = true;
-  framer_.InsertPacket(
-      &payload_[0], payload_.size(), rtp_header_, &duplicate);
+  framer_.InsertPacket(&payload_[0], payload_.size(), rtp_header_, &duplicate);
   EXPECT_TRUE(framer_.GetEncodedFrame(&frame, &next_frame, &multiple));
   EXPECT_TRUE(next_frame);
   EXPECT_TRUE(multiple);
@@ -273,8 +271,7 @@
   rtp_header_.is_key_frame = true;
   rtp_header_.frame_id = FrameId::first();
   rtp_header_.reference_frame_id = FrameId::first();
-  framer_.InsertPacket(
-      &payload_[0], payload_.size(), rtp_header_, &duplicate);
+  framer_.InsertPacket(&payload_[0], payload_.size(), rtp_header_, &duplicate);
 
   EXPECT_TRUE(framer_.GetEncodedFrame(&frame, &next_frame, &multiple));
   EXPECT_FALSE(multiple);
@@ -283,8 +280,7 @@
   rtp_header_.is_key_frame = false;
   rtp_header_.frame_id = FrameId::first() + 5;
   rtp_header_.reference_frame_id = FrameId::first();
-  framer_.InsertPacket(
-      &payload_[0], payload_.size(), rtp_header_, &duplicate);
+  framer_.InsertPacket(&payload_[0], payload_.size(), rtp_header_, &duplicate);
 
   EXPECT_TRUE(framer_.GetEncodedFrame(&frame, &next_frame, &multiple));
   EXPECT_FALSE(next_frame);
@@ -301,23 +297,19 @@
   rtp_header_.is_key_frame = true;
   rtp_header_.frame_id = FrameId::first();
   rtp_header_.reference_frame_id = FrameId::first();
-  framer_.InsertPacket(
-      &payload_[0], payload_.size(), rtp_header_, &duplicate);
+  framer_.InsertPacket(&payload_[0], payload_.size(), rtp_header_, &duplicate);
   rtp_header_.is_key_frame = false;
   rtp_header_.frame_id = FrameId::first() + 1;
-  framer_.InsertPacket(
-      &payload_[0], payload_.size(), rtp_header_, &duplicate);
+  framer_.InsertPacket(&payload_[0], payload_.size(), rtp_header_, &duplicate);
 
   // Insert frame #2 partially.
   rtp_header_.frame_id = FrameId::first() + 2;
   rtp_header_.max_packet_id = 1;
-  framer_.InsertPacket(
-      &payload_[0], payload_.size(), rtp_header_, &duplicate);
+  framer_.InsertPacket(&payload_[0], payload_.size(), rtp_header_, &duplicate);
   rtp_header_.frame_id = FrameId::first() + 4;
   rtp_header_.max_packet_id = 0;
   rtp_header_.reference_frame_id = FrameId::first();
-  framer_.InsertPacket(
-      &payload_[0], payload_.size(), rtp_header_, &duplicate);
+  framer_.InsertPacket(&payload_[0], payload_.size(), rtp_header_, &duplicate);
   EXPECT_TRUE(framer_.GetEncodedFrame(&frame, &next_frame, &multiple));
   EXPECT_EQ(EncodedFrame::KEY, frame.dependency);
   EXPECT_EQ(FrameId::first(), frame.frame_id);
@@ -341,15 +333,13 @@
   // Insert remaining packet of frame #2 - should no be continuous.
   rtp_header_.frame_id = FrameId::first() + 2;
   rtp_header_.packet_id = 1;
-  framer_.InsertPacket(
-      &payload_[0], payload_.size(), rtp_header_, &duplicate);
+  framer_.InsertPacket(&payload_[0], payload_.size(), rtp_header_, &duplicate);
   EXPECT_FALSE(framer_.GetEncodedFrame(&frame, &next_frame, &multiple));
   rtp_header_.frame_id = FrameId::first() + 5;
   rtp_header_.reference_frame_id = rtp_header_.frame_id - 1;
   rtp_header_.packet_id = 0;
   rtp_header_.max_packet_id = 0;
-  framer_.InsertPacket(
-      &payload_[0], payload_.size(), rtp_header_, &duplicate);
+  framer_.InsertPacket(&payload_[0], payload_.size(), rtp_header_, &duplicate);
   EXPECT_TRUE(framer_.GetEncodedFrame(&frame, &next_frame, &multiple));
   EXPECT_TRUE(next_frame);
   EXPECT_FALSE(multiple);
@@ -368,8 +358,7 @@
   rtp_header_.frame_id = FrameId::first() + 254;
   rtp_header_.reference_frame_id = FrameId::first() + 254;
 
-  framer_.InsertPacket(
-      &payload_[0], payload_.size(), rtp_header_, &duplicate);
+  framer_.InsertPacket(&payload_[0], payload_.size(), rtp_header_, &duplicate);
   EXPECT_TRUE(framer_.GetEncodedFrame(&frame, &next_frame, &multiple));
   EXPECT_TRUE(next_frame);
   EXPECT_FALSE(multiple);
@@ -380,14 +369,12 @@
 
   rtp_header_.frame_id = FrameId::first() + 255;
   rtp_header_.reference_frame_id = FrameId::first() + 255;
-  framer_.InsertPacket(
-      &payload_[0], payload_.size(), rtp_header_, &duplicate);
+  framer_.InsertPacket(&payload_[0], payload_.size(), rtp_header_, &duplicate);
 
   // Insert wrapped frame - should be continuous.
   rtp_header_.frame_id = FrameId::first() + 256;
   rtp_header_.reference_frame_id = FrameId::first() + 256;
-  framer_.InsertPacket(
-      &payload_[0], payload_.size(), rtp_header_, &duplicate);
+  framer_.InsertPacket(&payload_[0], payload_.size(), rtp_header_, &duplicate);
 
   EXPECT_TRUE(framer_.GetEncodedFrame(&frame, &next_frame, &multiple));
   EXPECT_TRUE(next_frame);
@@ -416,8 +403,7 @@
   rtp_header_.is_key_frame = true;
   rtp_header_.frame_id = FrameId::first() + 253;
   rtp_header_.reference_frame_id = FrameId::first() + 253;
-  framer_.InsertPacket(
-      &payload_[0], payload_.size(), rtp_header_, &duplicate);
+  framer_.InsertPacket(&payload_[0], payload_.size(), rtp_header_, &duplicate);
   EXPECT_TRUE(framer_.GetEncodedFrame(&frame, &next_frame, &multiple));
   EXPECT_TRUE(next_frame);
   EXPECT_FALSE(multiple);
@@ -429,12 +415,10 @@
   // Insert third and fourth frames' packet.
   rtp_header_.frame_id = FrameId::first() + 255;
   rtp_header_.reference_frame_id = FrameId::first() + 255;
-  framer_.InsertPacket(
-      &payload_[0], payload_.size(), rtp_header_, &duplicate);
+  framer_.InsertPacket(&payload_[0], payload_.size(), rtp_header_, &duplicate);
   rtp_header_.frame_id = FrameId::first() + 256;
   rtp_header_.reference_frame_id = FrameId::first() + 256;
-  framer_.InsertPacket(
-      &payload_[0], payload_.size(), rtp_header_, &duplicate);
+  framer_.InsertPacket(&payload_[0], payload_.size(), rtp_header_, &duplicate);
 
   // Get third and fourth frame.
   EXPECT_TRUE(framer_.GetEncodedFrame(&frame, &next_frame, &multiple));
diff --git a/media/cast/net/rtp/receiver_stats.cc b/media/cast/test/receiver/receiver_stats.cc
similarity index 98%
rename from media/cast/net/rtp/receiver_stats.cc
rename to media/cast/test/receiver/receiver_stats.cc
index c9d3f68c..ab5d673 100644
--- a/media/cast/net/rtp/receiver_stats.cc
+++ b/media/cast/test/receiver/receiver_stats.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 "media/cast/net/rtp/receiver_stats.h"
+#include "media/cast/test/receiver/receiver_stats.h"
 
 #include "media/cast/net/rtp/rtp_defines.h"
 
diff --git a/media/cast/net/rtp/receiver_stats.h b/media/cast/test/receiver/receiver_stats.h
similarity index 88%
rename from media/cast/net/rtp/receiver_stats.h
rename to media/cast/test/receiver/receiver_stats.h
index a1cd903..dc8d7a2d 100644
--- a/media/cast/net/rtp/receiver_stats.h
+++ b/media/cast/test/receiver/receiver_stats.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 MEDIA_CAST_NET_RTP_RECEIVER_STATS_H_
-#define MEDIA_CAST_NET_RTP_RECEIVER_STATS_H_
+#ifndef MEDIA_CAST_TEST_RECEIVER_RECEIVER_STATS_H_
+#define MEDIA_CAST_TEST_RECEIVER_RECEIVER_STATS_H_
 
 #include <stdint.h>
 
@@ -47,4 +47,4 @@
 }  // namespace cast
 }  // namespace media
 
-#endif  // MEDIA_CAST_NET_RTP_RECEIVER_STATS_H_
+#endif  // MEDIA_CAST_TEST_RECEIVER_RECEIVER_STATS_H_
diff --git a/media/cast/net/rtp/receiver_stats_unittest.cc b/media/cast/test/receiver/receiver_stats_unittest.cc
similarity index 97%
rename from media/cast/net/rtp/receiver_stats_unittest.cc
rename to media/cast/test/receiver/receiver_stats_unittest.cc
index ec132e4..462292a2 100644
--- a/media/cast/net/rtp/receiver_stats_unittest.cc
+++ b/media/cast/test/receiver/receiver_stats_unittest.cc
@@ -10,8 +10,8 @@
 #include "base/test/simple_test_tick_clock.h"
 #include "base/time/time.h"
 #include "media/cast/constants.h"
-#include "media/cast/net/rtp/receiver_stats.h"
 #include "media/cast/net/rtp/rtp_defines.h"
+#include "media/cast/test/receiver/receiver_stats.h"
 
 namespace media {
 namespace cast {
@@ -21,8 +21,7 @@
 
 class ReceiverStatsTest : public ::testing::Test {
  protected:
-  ReceiverStatsTest()
-      : stats_(&testing_clock_) {
+  ReceiverStatsTest() : stats_(&testing_clock_) {
     testing_clock_.Advance(
         base::TimeDelta::FromMilliseconds(kStartMillisecond));
     start_time_ = testing_clock_.NowTicks();
diff --git a/media/cast/receiver/video_decoder.cc b/media/cast/test/receiver/video_decoder.cc
similarity index 94%
rename from media/cast/receiver/video_decoder.cc
rename to media/cast/test/receiver/video_decoder.cc
index 27f6aed..2508f0b 100644
--- a/media/cast/receiver/video_decoder.cc
+++ b/media/cast/test/receiver/video_decoder.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 "media/cast/receiver/video_decoder.h"
+#include "media/cast/test/receiver/video_decoder.h"
 
 #include <stdint.h>
 #include <utility>
@@ -36,9 +36,7 @@
         codec_(codec),
         operational_status_(STATUS_UNINITIALIZED) {}
 
-  OperationalStatus InitializationResult() const {
-    return operational_status_;
-  }
+  OperationalStatus InitializationResult() const { return operational_status_; }
 
   void DecodeFrame(std::unique_ptr<EncodedFrame> encoded_frame,
                    const DecodeFrameCallback& callback) {
@@ -54,9 +52,9 @@
     }
     last_frame_id_ = encoded_frame->frame_id;
 
-    const scoped_refptr<VideoFrame> decoded_frame = Decode(
-        encoded_frame->mutable_bytes(),
-        static_cast<int>(encoded_frame->data.size()));
+    const scoped_refptr<VideoFrame> decoded_frame =
+        Decode(encoded_frame->mutable_bytes(),
+               static_cast<int>(encoded_frame->data.size()));
     if (!decoded_frame) {
       VLOG(2) << "Decoding of frame " << encoded_frame->frame_id << " failed.";
       cast_environment_->PostTask(
@@ -117,9 +115,7 @@
     cfg.threads = 1;
 
     DCHECK(vpx_codec_get_caps(vpx_codec_vp8_dx()) & VPX_CODEC_CAP_POSTPROC);
-    if (vpx_codec_dec_init(&context_,
-                           vpx_codec_vp8_dx(),
-                           &cfg,
+    if (vpx_codec_dec_init(&context_, vpx_codec_vp8_dx(), &cfg,
                            VPX_CODEC_USE_POSTPROC) != VPX_CODEC_OK) {
       ImplBase::operational_status_ = STATUS_INVALID_CONFIGURATION;
       return;
@@ -183,8 +179,7 @@
 class VideoDecoder::FakeImpl final : public VideoDecoder::ImplBase {
  public:
   explicit FakeImpl(const scoped_refptr<CastEnvironment>& cast_environment)
-      : ImplBase(cast_environment, CODEC_VIDEO_FAKE),
-        last_decoded_id_(-1) {
+      : ImplBase(cast_environment, CODEC_VIDEO_FAKE), last_decoded_id_(-1) {
     if (ImplBase::operational_status_ != STATUS_UNINITIALIZED)
       return;
     ImplBase::operational_status_ = STATUS_INITIALIZED;
diff --git a/media/cast/receiver/video_decoder.h b/media/cast/test/receiver/video_decoder.h
similarity index 93%
rename from media/cast/receiver/video_decoder.h
rename to media/cast/test/receiver/video_decoder.h
index 2116217c..9c3396e5 100644
--- a/media/cast/receiver/video_decoder.h
+++ b/media/cast/test/receiver/video_decoder.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 MEDIA_CAST_RECEIVER_VIDEO_DECODER_H_
-#define MEDIA_CAST_RECEIVER_VIDEO_DECODER_H_
+#ifndef MEDIA_CAST_TEST_RECEIVER_VIDEO_DECODER_H_
+#define MEDIA_CAST_TEST_RECEIVER_VIDEO_DECODER_H_
 
 #include <memory>
 
@@ -63,4 +63,4 @@
 }  // namespace cast
 }  // namespace media
 
-#endif  // MEDIA_CAST_RECEIVER_VIDEO_DECODER_H_
+#endif  // MEDIA_CAST_TEST_RECEIVER_VIDEO_DECODER_H_
diff --git a/media/cast/receiver/video_decoder_unittest.cc b/media/cast/test/receiver/video_decoder_unittest.cc
similarity index 98%
rename from media/cast/receiver/video_decoder_unittest.cc
rename to media/cast/test/receiver/video_decoder_unittest.cc
index 49619564..e31a613 100644
--- a/media/cast/receiver/video_decoder_unittest.cc
+++ b/media/cast/test/receiver/video_decoder_unittest.cc
@@ -16,9 +16,9 @@
 #include "base/synchronization/lock.h"
 #include "base/time/time.h"
 #include "media/cast/cast_config.h"
-#include "media/cast/receiver/video_decoder.h"
 #include "media/cast/sender/sender_encoded_frame.h"
 #include "media/cast/sender/vp8_encoder.h"
+#include "media/cast/test/receiver/video_decoder.h"
 #include "media/cast/test/utility/default_config.h"
 #include "media/cast/test/utility/standalone_cast_environment.h"
 #include "media/cast/test/utility/video_utility.h"
@@ -70,9 +70,7 @@
     total_video_frames_decoded_ = 0;
   }
 
-  void SetNextFrameSize(const gfx::Size& size) {
-    next_frame_size_ = size;
-  }
+  void SetNextFrameSize(const gfx::Size& size) { next_frame_size_ = size; }
 
   // Called from the unit test thread to create another EncodedFrame and push it
   // into the decoding pipeline.
diff --git a/media/cast/test/simulator.cc b/media/cast/test/simulator.cc
index 8a217a36..fe3e426 100644
--- a/media/cast/test/simulator.cc
+++ b/media/cast/test/simulator.cc
@@ -66,7 +66,6 @@
 #include "media/base/video_frame.h"
 #include "media/cast/cast_config.h"
 #include "media/cast/cast_environment.h"
-#include "media/cast/cast_receiver.h"
 #include "media/cast/cast_sender.h"
 #include "media/cast/logging/encoding_event_subscriber.h"
 #include "media/cast/logging/logging_defines.h"
@@ -80,6 +79,7 @@
 #include "media/cast/test/fake_media_source.h"
 #include "media/cast/test/loopback_transport.h"
 #include "media/cast/test/proto/network_simulation_model.pb.h"
+#include "media/cast/test/receiver/cast_receiver.h"
 #include "media/cast/test/skewed_tick_clock.h"
 #include "media/cast/test/utility/audio_utility.h"
 #include "media/cast/test/utility/default_config.h"
diff --git a/media/cast/test/utility/in_process_receiver.cc b/media/cast/test/utility/in_process_receiver.cc
index 2e5ea63..3b5caa5 100644
--- a/media/cast/test/utility/in_process_receiver.cc
+++ b/media/cast/test/utility/in_process_receiver.cc
@@ -17,9 +17,9 @@
 #include "media/base/video_frame.h"
 #include "media/cast/cast_config.h"
 #include "media/cast/cast_environment.h"
-#include "media/cast/cast_receiver.h"
 #include "media/cast/net/cast_transport_config.h"
 #include "media/cast/net/udp_transport_impl.h"
+#include "media/cast/test/receiver/cast_receiver.h"
 
 using media::cast::CastTransportStatus;
 using media::cast::UdpTransportImpl;
diff --git a/services/preferences/public/cpp/dictionary_value_update.cc b/services/preferences/public/cpp/dictionary_value_update.cc
index 61dca381..7d7efe2 100644
--- a/services/preferences/public/cpp/dictionary_value_update.cc
+++ b/services/preferences/public/cpp/dictionary_value_update.cc
@@ -28,11 +28,11 @@
 }
 
 size_t DictionaryValueUpdate::size() const {
-  return value_->size();
+  return value_->DictSize();
 }
 
 bool DictionaryValueUpdate::empty() const {
-  return value_->empty();
+  return value_->DictEmpty();
 }
 
 void DictionaryValueUpdate::Clear() {
diff --git a/services/preferences/tracked/pref_hash_filter_unittest.cc b/services/preferences/tracked/pref_hash_filter_unittest.cc
index ce4d419..241bcd7a 100644
--- a/services/preferences/tracked/pref_hash_filter_unittest.cc
+++ b/services/preferences/tracked/pref_hash_filter_unittest.cc
@@ -366,7 +366,7 @@
   MockHashStoreContents() {}
 
   // Returns the number of hashes stored.
-  size_t stored_hashes_count() const { return dictionary_.size(); }
+  size_t stored_hashes_count() const { return dictionary_.DictSize(); }
 
   // Returns the number of paths cleared.
   size_t cleared_paths_count() const { return removed_entries_.size(); }
@@ -1030,7 +1030,7 @@
     // invalid keys.
     const base::Value* split_value_in_store;
     ASSERT_TRUE(pref_store_contents_->Get(kSplitPref, &split_value_in_store));
-    ASSERT_EQ(2U, dict_value->size());
+    ASSERT_EQ(2U, dict_value->DictSize());
     ASSERT_FALSE(dict_value->HasKey("a"));
     ASSERT_TRUE(dict_value->HasKey("b"));
     ASSERT_FALSE(dict_value->HasKey("c"));
@@ -1049,7 +1049,7 @@
     const base::Value* split_value_in_store;
     ASSERT_TRUE(pref_store_contents_->Get(kSplitPref, &split_value_in_store));
     ASSERT_EQ(dict_value, split_value_in_store);
-    ASSERT_EQ(4U, dict_value->size());
+    ASSERT_EQ(4U, dict_value->DictSize());
     ASSERT_TRUE(dict_value->HasKey("a"));
     ASSERT_TRUE(dict_value->HasKey("b"));
     ASSERT_TRUE(dict_value->HasKey("c"));
diff --git a/services/preferences/tracked/pref_hash_store_impl_unittest.cc b/services/preferences/tracked/pref_hash_store_impl_unittest.cc
index 64d73549..20664d4 100644
--- a/services/preferences/tracked/pref_hash_store_impl_unittest.cc
+++ b/services/preferences/tracked/pref_hash_store_impl_unittest.cc
@@ -65,7 +65,7 @@
   const std::string mac_3 =
       computed_macs->FindKey("http://www.example.com")->GetString();
 
-  EXPECT_EQ(3U, computed_macs->size());
+  EXPECT_EQ(3U, computed_macs->DictSize());
 
   base::Value string_1("string1");
   base::Value string_2("string2");
diff --git a/testing/buildbot/chromium.android.fyi.json b/testing/buildbot/chromium.android.fyi.json
index 19633099..e5641e3 100644
--- a/testing/buildbot/chromium.android.fyi.json
+++ b/testing/buildbot/chromium.android.fyi.json
@@ -4675,11 +4675,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_instrumentation_test_versions_apk_Client Library Skew Tests For 90.0.4430.212"
+            "weblayer_instrumentation_test_versions_apk_Client Library Skew Tests For 90.0.4430.214"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_instrumentation_test_versions_apk_Client Library Skew Tests For 90.0.4430.212",
+        "name": "weblayer_instrumentation_test_versions_apk_Client Library Skew Tests For 90.0.4430.214",
         "resultdb": {
           "enable": true
         },
@@ -4689,7 +4689,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M90",
-              "revision": "version:90.0.4430.212"
+              "revision": "version:90.0.4430.214"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -4754,11 +4754,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_instrumentation_test_versions_apk_Client Library Skew Tests For 91.0.4472.50"
+            "weblayer_instrumentation_test_versions_apk_Client Library Skew Tests For 91.0.4472.52"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_instrumentation_test_versions_apk_Client Library Skew Tests For 91.0.4472.50",
+        "name": "weblayer_instrumentation_test_versions_apk_Client Library Skew Tests For 91.0.4472.52",
         "resultdb": {
           "enable": true
         },
@@ -4768,7 +4768,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M91",
-              "revision": "version:91.0.4472.50"
+              "revision": "version:91.0.4472.52"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -4912,11 +4912,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_instrumentation_test_versions_apk_Implementation Library Skew Tests For 90.0.4430.212"
+            "weblayer_instrumentation_test_versions_apk_Implementation Library Skew Tests For 90.0.4430.214"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_instrumentation_test_versions_apk_Implementation Library Skew Tests For 90.0.4430.212",
+        "name": "weblayer_instrumentation_test_versions_apk_Implementation Library Skew Tests For 90.0.4430.214",
         "resultdb": {
           "enable": true
         },
@@ -4926,7 +4926,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M90",
-              "revision": "version:90.0.4430.212"
+              "revision": "version:90.0.4430.214"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -4991,11 +4991,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_instrumentation_test_versions_apk_Implementation Library Skew Tests For 91.0.4472.50"
+            "weblayer_instrumentation_test_versions_apk_Implementation Library Skew Tests For 91.0.4472.52"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_instrumentation_test_versions_apk_Implementation Library Skew Tests For 91.0.4472.50",
+        "name": "weblayer_instrumentation_test_versions_apk_Implementation Library Skew Tests For 91.0.4472.52",
         "resultdb": {
           "enable": true
         },
@@ -5005,7 +5005,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M91",
-              "revision": "version:91.0.4472.50"
+              "revision": "version:91.0.4472.52"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
diff --git a/testing/buildbot/chromium.android.json b/testing/buildbot/chromium.android.json
index 0a2fe5891..4161e64f 100644
--- a/testing/buildbot/chromium.android.json
+++ b/testing/buildbot/chromium.android.json
@@ -53838,11 +53838,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_instrumentation_test_versions_with_chrome_apk_Client Library Skew Tests For 90.0.4430.212"
+            "weblayer_instrumentation_test_versions_with_chrome_apk_Client Library Skew Tests For 90.0.4430.214"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_instrumentation_test_versions_with_chrome_apk_Client Library Skew Tests For 90.0.4430.212",
+        "name": "weblayer_instrumentation_test_versions_with_chrome_apk_Client Library Skew Tests For 90.0.4430.214",
         "resultdb": {
           "enable": true
         },
@@ -53852,7 +53852,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M90",
-              "revision": "version:90.0.4430.212"
+              "revision": "version:90.0.4430.214"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -53918,11 +53918,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_instrumentation_test_versions_with_chrome_apk_Client Library Skew Tests For 91.0.4472.50"
+            "weblayer_instrumentation_test_versions_with_chrome_apk_Client Library Skew Tests For 91.0.4472.52"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_instrumentation_test_versions_with_chrome_apk_Client Library Skew Tests For 91.0.4472.50",
+        "name": "weblayer_instrumentation_test_versions_with_chrome_apk_Client Library Skew Tests For 91.0.4472.52",
         "resultdb": {
           "enable": true
         },
@@ -53932,7 +53932,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M91",
-              "revision": "version:91.0.4472.50"
+              "revision": "version:91.0.4472.52"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -54078,11 +54078,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_instrumentation_test_versions_with_chrome_apk_Implementation Library Skew Tests For 90.0.4430.212"
+            "weblayer_instrumentation_test_versions_with_chrome_apk_Implementation Library Skew Tests For 90.0.4430.214"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_instrumentation_test_versions_with_chrome_apk_Implementation Library Skew Tests For 90.0.4430.212",
+        "name": "weblayer_instrumentation_test_versions_with_chrome_apk_Implementation Library Skew Tests For 90.0.4430.214",
         "resultdb": {
           "enable": true
         },
@@ -54092,7 +54092,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M90",
-              "revision": "version:90.0.4430.212"
+              "revision": "version:90.0.4430.214"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -54158,11 +54158,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_instrumentation_test_versions_with_chrome_apk_Implementation Library Skew Tests For 91.0.4472.50"
+            "weblayer_instrumentation_test_versions_with_chrome_apk_Implementation Library Skew Tests For 91.0.4472.52"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_instrumentation_test_versions_with_chrome_apk_Implementation Library Skew Tests For 91.0.4472.50",
+        "name": "weblayer_instrumentation_test_versions_with_chrome_apk_Implementation Library Skew Tests For 91.0.4472.52",
         "resultdb": {
           "enable": true
         },
@@ -54172,7 +54172,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M91",
-              "revision": "version:91.0.4472.50"
+              "revision": "version:91.0.4472.52"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -54383,11 +54383,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_instrumentation_test_versions_apk_Client Library Skew Tests For 90.0.4430.212"
+            "weblayer_instrumentation_test_versions_apk_Client Library Skew Tests For 90.0.4430.214"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_instrumentation_test_versions_apk_Client Library Skew Tests For 90.0.4430.212",
+        "name": "weblayer_instrumentation_test_versions_apk_Client Library Skew Tests For 90.0.4430.214",
         "resultdb": {
           "enable": true
         },
@@ -54397,7 +54397,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M90",
-              "revision": "version:90.0.4430.212"
+              "revision": "version:90.0.4430.214"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -54462,11 +54462,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_instrumentation_test_versions_apk_Client Library Skew Tests For 91.0.4472.50"
+            "weblayer_instrumentation_test_versions_apk_Client Library Skew Tests For 91.0.4472.52"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_instrumentation_test_versions_apk_Client Library Skew Tests For 91.0.4472.50",
+        "name": "weblayer_instrumentation_test_versions_apk_Client Library Skew Tests For 91.0.4472.52",
         "resultdb": {
           "enable": true
         },
@@ -54476,7 +54476,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M91",
-              "revision": "version:91.0.4472.50"
+              "revision": "version:91.0.4472.52"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -54620,11 +54620,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_instrumentation_test_versions_apk_Implementation Library Skew Tests For 90.0.4430.212"
+            "weblayer_instrumentation_test_versions_apk_Implementation Library Skew Tests For 90.0.4430.214"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_instrumentation_test_versions_apk_Implementation Library Skew Tests For 90.0.4430.212",
+        "name": "weblayer_instrumentation_test_versions_apk_Implementation Library Skew Tests For 90.0.4430.214",
         "resultdb": {
           "enable": true
         },
@@ -54634,7 +54634,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M90",
-              "revision": "version:90.0.4430.212"
+              "revision": "version:90.0.4430.214"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -54699,11 +54699,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_instrumentation_test_versions_apk_Implementation Library Skew Tests For 91.0.4472.50"
+            "weblayer_instrumentation_test_versions_apk_Implementation Library Skew Tests For 91.0.4472.52"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_instrumentation_test_versions_apk_Implementation Library Skew Tests For 91.0.4472.50",
+        "name": "weblayer_instrumentation_test_versions_apk_Implementation Library Skew Tests For 91.0.4472.52",
         "resultdb": {
           "enable": true
         },
@@ -54713,7 +54713,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M91",
-              "revision": "version:91.0.4472.50"
+              "revision": "version:91.0.4472.52"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -54924,11 +54924,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_instrumentation_test_versions_apk_Client Library Skew Tests For 90.0.4430.212"
+            "weblayer_instrumentation_test_versions_apk_Client Library Skew Tests For 90.0.4430.214"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_instrumentation_test_versions_apk_Client Library Skew Tests For 90.0.4430.212",
+        "name": "weblayer_instrumentation_test_versions_apk_Client Library Skew Tests For 90.0.4430.214",
         "resultdb": {
           "enable": true
         },
@@ -54938,7 +54938,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M90",
-              "revision": "version:90.0.4430.212"
+              "revision": "version:90.0.4430.214"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -55003,11 +55003,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_instrumentation_test_versions_apk_Client Library Skew Tests For 91.0.4472.50"
+            "weblayer_instrumentation_test_versions_apk_Client Library Skew Tests For 91.0.4472.52"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_instrumentation_test_versions_apk_Client Library Skew Tests For 91.0.4472.50",
+        "name": "weblayer_instrumentation_test_versions_apk_Client Library Skew Tests For 91.0.4472.52",
         "resultdb": {
           "enable": true
         },
@@ -55017,7 +55017,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M91",
-              "revision": "version:91.0.4472.50"
+              "revision": "version:91.0.4472.52"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -55161,11 +55161,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_instrumentation_test_versions_apk_Implementation Library Skew Tests For 90.0.4430.212"
+            "weblayer_instrumentation_test_versions_apk_Implementation Library Skew Tests For 90.0.4430.214"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_instrumentation_test_versions_apk_Implementation Library Skew Tests For 90.0.4430.212",
+        "name": "weblayer_instrumentation_test_versions_apk_Implementation Library Skew Tests For 90.0.4430.214",
         "resultdb": {
           "enable": true
         },
@@ -55175,7 +55175,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M90",
-              "revision": "version:90.0.4430.212"
+              "revision": "version:90.0.4430.214"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -55240,11 +55240,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_instrumentation_test_versions_apk_Implementation Library Skew Tests For 91.0.4472.50"
+            "weblayer_instrumentation_test_versions_apk_Implementation Library Skew Tests For 91.0.4472.52"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_instrumentation_test_versions_apk_Implementation Library Skew Tests For 91.0.4472.50",
+        "name": "weblayer_instrumentation_test_versions_apk_Implementation Library Skew Tests For 91.0.4472.52",
         "resultdb": {
           "enable": true
         },
@@ -55254,7 +55254,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M91",
-              "revision": "version:91.0.4472.50"
+              "revision": "version:91.0.4472.52"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
diff --git a/testing/buildbot/chromium.perf.calibration.json b/testing/buildbot/chromium.perf.calibration.json
index 6c764861..437f1bb 100644
--- a/testing/buildbot/chromium.perf.calibration.json
+++ b/testing/buildbot/chromium.perf.calibration.json
@@ -19,6 +19,9 @@
         "override_compile_targets": [
           "performance_test_suite"
         ],
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
diff --git a/testing/buildbot/chromium.perf.json b/testing/buildbot/chromium.perf.json
index 5475ddb..2fde9c8 100644
--- a/testing/buildbot/chromium.perf.json
+++ b/testing/buildbot/chromium.perf.json
@@ -19,6 +19,9 @@
         "override_compile_targets": [
           "performance_test_suite"
         ],
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -66,6 +69,9 @@
         "override_compile_targets": [
           "performance_webview_test_suite"
         ],
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -113,6 +119,9 @@
         "override_compile_targets": [
           "performance_test_suite"
         ],
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -158,6 +167,9 @@
         "override_compile_targets": [
           "performance_test_suite"
         ],
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -407,6 +419,9 @@
         "override_compile_targets": [
           "performance_test_suite"
         ],
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -461,6 +476,9 @@
         "override_compile_targets": [
           "performance_webview_test_suite"
         ],
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -511,6 +529,9 @@
         "override_compile_targets": [
           "performance_test_suite"
         ],
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -565,6 +586,9 @@
         "override_compile_targets": [
           "performance_weblayer_test_suite"
         ],
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -615,6 +639,9 @@
         "override_compile_targets": [
           "performance_webview_test_suite"
         ],
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -669,6 +696,9 @@
         "override_compile_targets": [
           "performance_test_suite"
         ],
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -715,6 +745,9 @@
         "override_compile_targets": [
           "performance_weblayer_test_suite"
         ],
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -761,6 +794,9 @@
         "override_compile_targets": [
           "performance_webview_test_suite"
         ],
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -808,6 +844,9 @@
         "override_compile_targets": [
           "performance_test_suite"
         ],
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1147,6 +1186,9 @@
         "override_compile_targets": [
           "performance_test_suite_eve"
         ],
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1237,6 +1279,9 @@
         "override_compile_targets": [
           "performance_test_suite"
         ],
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1283,6 +1328,9 @@
         "override_compile_targets": [
           "performance_test_suite"
         ],
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1341,6 +1389,9 @@
         "override_compile_targets": [
           "performance_test_suite"
         ],
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1400,6 +1451,9 @@
         "override_compile_targets": [
           "performance_test_suite"
         ],
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1523,6 +1577,9 @@
         "override_compile_targets": [
           "performance_test_suite"
         ],
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1573,6 +1630,9 @@
         "override_compile_targets": [
           "performance_test_suite"
         ],
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1627,6 +1687,9 @@
         "override_compile_targets": [
           "performance_test_suite"
         ],
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -1677,6 +1740,9 @@
         "override_compile_targets": [
           "performance_test_suite"
         ],
+        "resultdb": {
+          "enable": true
+        },
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
diff --git a/testing/buildbot/variants.pyl b/testing/buildbot/variants.pyl
index 8aec531..0a2c7e0 100644
--- a/testing/buildbot/variants.pyl
+++ b/testing/buildbot/variants.pyl
@@ -346,13 +346,13 @@
       '../../weblayer/browser/android/javatests/skew/expectations.txt',
       '--impl-version=91',
     ],
-    'identifier': 'Implementation Library Skew Tests For 91.0.4472.50',
+    'identifier': 'Implementation Library Skew Tests For 91.0.4472.52',
     'swarming': {
       'cipd_packages': [
         {
           'cipd_package': 'chromium/testing/weblayer-x86',
           'location': 'weblayer_instrumentation_test_M91',
-          'revision': 'version:91.0.4472.50',
+          'revision': 'version:91.0.4472.52',
         }
       ],
     },
@@ -370,13 +370,13 @@
       '../../weblayer/browser/android/javatests/skew/expectations.txt',
       '--impl-version=90',
     ],
-    'identifier': 'Implementation Library Skew Tests For 90.0.4430.212',
+    'identifier': 'Implementation Library Skew Tests For 90.0.4430.214',
     'swarming': {
       'cipd_packages': [
         {
           'cipd_package': 'chromium/testing/weblayer-x86',
           'location': 'weblayer_instrumentation_test_M90',
-          'revision': 'version:90.0.4430.212',
+          'revision': 'version:90.0.4430.214',
         }
       ],
     },
@@ -418,13 +418,13 @@
       '../../weblayer/browser/android/javatests/skew/expectations.txt',
       '--impl-version=91',
     ],
-    'identifier': 'Implementation Library Skew Tests For 91.0.4472.50',
+    'identifier': 'Implementation Library Skew Tests For 91.0.4472.52',
     'swarming': {
       'cipd_packages': [
         {
           'cipd_package': 'chromium/testing/weblayer-x86',
           'location': 'weblayer_instrumentation_test_M91',
-          'revision': 'version:91.0.4472.50',
+          'revision': 'version:91.0.4472.52',
         }
       ],
     },
@@ -442,13 +442,13 @@
       '../../weblayer/browser/android/javatests/skew/expectations.txt',
       '--impl-version=90',
     ],
-    'identifier': 'Implementation Library Skew Tests For 90.0.4430.212',
+    'identifier': 'Implementation Library Skew Tests For 90.0.4430.214',
     'swarming': {
       'cipd_packages': [
         {
           'cipd_package': 'chromium/testing/weblayer-x86',
           'location': 'weblayer_instrumentation_test_M90',
-          'revision': 'version:90.0.4430.212',
+          'revision': 'version:90.0.4430.214',
         }
       ],
     },
@@ -490,13 +490,13 @@
       '../../weblayer/browser/android/javatests/skew/expectations.txt',
       '--client-version=91',
     ],
-    'identifier': 'Client Library Skew Tests For 91.0.4472.50',
+    'identifier': 'Client Library Skew Tests For 91.0.4472.52',
     'swarming': {
       'cipd_packages': [
         {
           'cipd_package': 'chromium/testing/weblayer-x86',
           'location': 'weblayer_instrumentation_test_M91',
-          'revision': 'version:91.0.4472.50',
+          'revision': 'version:91.0.4472.52',
         }
       ],
     },
@@ -514,13 +514,13 @@
       '../../weblayer/browser/android/javatests/skew/expectations.txt',
       '--client-version=90',
     ],
-    'identifier': 'Client Library Skew Tests For 90.0.4430.212',
+    'identifier': 'Client Library Skew Tests For 90.0.4430.214',
     'swarming': {
       'cipd_packages': [
         {
           'cipd_package': 'chromium/testing/weblayer-x86',
           'location': 'weblayer_instrumentation_test_M90',
-          'revision': 'version:90.0.4430.212',
+          'revision': 'version:90.0.4430.214',
         }
       ],
     },
diff --git a/third_party/blink/public/mojom/frame/frame.mojom b/third_party/blink/public/mojom/frame/frame.mojom
index d80d6662..5eb0ea16 100644
--- a/third_party/blink/public/mojom/frame/frame.mojom
+++ b/third_party/blink/public/mojom/frame/frame.mojom
@@ -806,6 +806,10 @@
 
   // Asks the renderer to handle a renderer-debug URL.
   HandleRendererDebugURL(url.mojom.Url url);
+
+  // Requests the link-rel calnonical URL. The canonical url could be null if
+  // the document of this frame doesn't have the HTMLLinkElement.
+  GetCanonicalUrlForSharing() => (url.mojom.Url? canonical_url);
 };
 
 // Also implemented in Blink, this interface defines frame-specific methods
diff --git a/third_party/blink/public/web/web_view.h b/third_party/blink/public/web/web_view.h
index 733afd6..5c90d30 100644
--- a/third_party/blink/public/web/web_view.h
+++ b/third_party/blink/public/web/web_view.h
@@ -443,8 +443,8 @@
   // Session history -----------------------------------------------------
   // Returns the number of history items before/after the current
   // history item.
-  virtual int32_t HistoryBackListCount() = 0;
-  virtual int32_t HistoryForwardListCount() = 0;
+  virtual int32_t HistoryBackListCount() const = 0;
+  virtual int32_t HistoryForwardListCount() const = 0;
 
   // Portals --------------------------------------------------------------
 
diff --git a/third_party/blink/renderer/bindings/generated_in_modules.gni b/third_party/blink/renderer/bindings/generated_in_modules.gni
index 34f5d89..684845ba 100644
--- a/third_party/blink/renderer/bindings/generated_in_modules.gni
+++ b/third_party/blink/renderer/bindings/generated_in_modules.gni
@@ -391,7 +391,6 @@
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_gpu_image_data_layout.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_gpu_limits.cc",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_gpu_limits.h",
-  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_gpu_multisample_state.idl",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_gpu_object_descriptor_base.cc",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_gpu_object_descriptor_base.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_gpu_origin_2d_dict.cc",
@@ -506,8 +505,6 @@
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_image_object.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_image_resource.cc",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_image_resource.h",
-  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_image_track.cc",
-  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_image_track.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ink_trail_style.cc",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ink_trail_style.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_item_details.cc",
diff --git a/third_party/blink/renderer/bindings/idl_in_core.gni b/third_party/blink/renderer/bindings/idl_in_core.gni
index 670987c..9322ce63 100644
--- a/third_party/blink/renderer/bindings/idl_in_core.gni
+++ b/third_party/blink/renderer/bindings/idl_in_core.gni
@@ -248,7 +248,6 @@
           "//third_party/blink/renderer/core/events/ui_event_init.idl",
           "//third_party/blink/renderer/core/events/wheel_event.idl",
           "//third_party/blink/renderer/core/events/wheel_event_init.idl",
-          "//third_party/blink/renderer/core/permissions_policy/feature_policy.idl",
           "//third_party/blink/renderer/core/fetch/body.idl",
           "//third_party/blink/renderer/core/fetch/headers.idl",
           "//third_party/blink/renderer/core/fetch/request.idl",
@@ -272,7 +271,6 @@
           "//third_party/blink/renderer/core/frame/deprecation_report_body.idl",
           "//third_party/blink/renderer/core/frame/document_policy_violation_report_body.idl",
           "//third_party/blink/renderer/core/frame/external.idl",
-          "//third_party/blink/renderer/core/frame/permissions_policy_violation_report_body.idl",
           "//third_party/blink/renderer/core/frame/fragment_directive.idl",
           "//third_party/blink/renderer/core/frame/history.idl",
           "//third_party/blink/renderer/core/frame/impression_params.idl",
@@ -293,6 +291,7 @@
           "//third_party/blink/renderer/core/frame/navigator_ua_data.idl",
           "//third_party/blink/renderer/core/frame/navigator_user_activation.idl",
           "//third_party/blink/renderer/core/frame/navigator_window_controls_overlay.idl",
+          "//third_party/blink/renderer/core/frame/permissions_policy_violation_report_body.idl",
           "//third_party/blink/renderer/core/frame/report.idl",
           "//third_party/blink/renderer/core/frame/report_body.idl",
           "//third_party/blink/renderer/core/frame/reporting_observer.idl",
@@ -308,11 +307,11 @@
           "//third_party/blink/renderer/core/frame/visual_viewport.idl",
           "//third_party/blink/renderer/core/frame/window.idl",
           "//third_party/blink/renderer/core/frame/window_controls_overlay.idl",
+          "//third_party/blink/renderer/core/frame/window_controls_overlay_geometry_change_event.idl",
+          "//third_party/blink/renderer/core/frame/window_controls_overlay_geometry_change_event_init.idl",
           "//third_party/blink/renderer/core/frame/window_event_handlers.idl",
           "//third_party/blink/renderer/core/frame/window_or_worker_global_scope.idl",
           "//third_party/blink/renderer/core/frame/window_post_message_options.idl",
-          "//third_party/blink/renderer/core/frame/window_controls_overlay_geometry_change_event.idl",
-          "//third_party/blink/renderer/core/frame/window_controls_overlay_geometry_change_event_init.idl",
           "//third_party/blink/renderer/core/fullscreen/document_fullscreen.idl",
           "//third_party/blink/renderer/core/fullscreen/element_fullscreen.idl",
           "//third_party/blink/renderer/core/fullscreen/fullscreen_options.idl",
@@ -329,9 +328,9 @@
           "//third_party/blink/renderer/core/geometry/dom_rect_init.idl",
           "//third_party/blink/renderer/core/geometry/dom_rect_list.idl",
           "//third_party/blink/renderer/core/geometry/dom_rect_read_only.idl",
+          "//third_party/blink/renderer/core/highlight/css_highlight_registry.idl",
           "//third_party/blink/renderer/core/highlight/highlight.idl",
           "//third_party/blink/renderer/core/highlight/highlight_registry.idl",
-          "//third_party/blink/renderer/core/highlight/css_highlight_registry.idl",
           "//third_party/blink/renderer/core/html/assigned_nodes_options.idl",
           "//third_party/blink/renderer/core/html/canvas/baselines.idl",
           "//third_party/blink/renderer/core/html/canvas/html_canvas_element.idl",
@@ -505,6 +504,7 @@
           "//third_party/blink/renderer/core/page/page_popup_controller.idl",
           "//third_party/blink/renderer/core/page/scrolling/scroll_state.idl",
           "//third_party/blink/renderer/core/page/scrolling/scroll_state_init.idl",
+          "//third_party/blink/renderer/core/permissions_policy/feature_policy.idl",
           "//third_party/blink/renderer/core/resize_observer/resize_observer.idl",
           "//third_party/blink/renderer/core/resize_observer/resize_observer_entry.idl",
           "//third_party/blink/renderer/core/resize_observer/resize_observer_options.idl",
@@ -514,8 +514,8 @@
           "//third_party/blink/renderer/core/streams/queuing_strategy_init.idl",
           "//third_party/blink/renderer/core/streams/readable_byte_stream_controller.idl",
           "//third_party/blink/renderer/core/streams/readable_stream.idl",
-          "//third_party/blink/renderer/core/streams/readable_stream_byob_reader.idl",
           "//third_party/blink/renderer/core/streams/readable_stream_byob_read_result.idl",
+          "//third_party/blink/renderer/core/streams/readable_stream_byob_reader.idl",
           "//third_party/blink/renderer/core/streams/readable_stream_byob_request.idl",
           "//third_party/blink/renderer/core/streams/readable_stream_default_controller.idl",
           "//third_party/blink/renderer/core/streams/readable_stream_default_reader.idl",
@@ -642,10 +642,10 @@
           "//third_party/blink/renderer/core/timing/largest_contentful_paint.idl",
           "//third_party/blink/renderer/core/timing/layout_shift.idl",
           "//third_party/blink/renderer/core/timing/layout_shift_attribution.idl",
-          "//third_party/blink/renderer/core/timing/measure_memory/memory_measurement.idl",
-          "//third_party/blink/renderer/core/timing/measure_memory/memory_breakdown_entry.idl",
           "//third_party/blink/renderer/core/timing/measure_memory/memory_attribution.idl",
           "//third_party/blink/renderer/core/timing/measure_memory/memory_attribution_container.idl",
+          "//third_party/blink/renderer/core/timing/measure_memory/memory_breakdown_entry.idl",
+          "//third_party/blink/renderer/core/timing/measure_memory/memory_measurement.idl",
           "//third_party/blink/renderer/core/timing/memory_info.idl",
           "//third_party/blink/renderer/core/timing/performance.idl",
           "//third_party/blink/renderer/core/timing/performance_element_timing.idl",
diff --git a/third_party/blink/renderer/bindings/idl_in_modules.gni b/third_party/blink/renderer/bindings/idl_in_modules.gni
index bd1048d..3742478 100644
--- a/third_party/blink/renderer/bindings/idl_in_modules.gni
+++ b/third_party/blink/renderer/bindings/idl_in_modules.gni
@@ -54,13 +54,13 @@
           "//third_party/blink/renderer/modules/bluetooth/bluetooth_advertising_event.idl",
           "//third_party/blink/renderer/modules/bluetooth/bluetooth_advertising_event_init.idl",
           "//third_party/blink/renderer/modules/bluetooth/bluetooth_characteristic_properties.idl",
-          "//third_party/blink/renderer/modules/bluetooth/bluetooth_device.idl",
           "//third_party/blink/renderer/modules/bluetooth/bluetooth_data_filter_init.idl",
+          "//third_party/blink/renderer/modules/bluetooth/bluetooth_device.idl",
           "//third_party/blink/renderer/modules/bluetooth/bluetooth_le_scan.idl",
           "//third_party/blink/renderer/modules/bluetooth/bluetooth_le_scan_filter_init.idl",
           "//third_party/blink/renderer/modules/bluetooth/bluetooth_le_scan_options.idl",
-          "//third_party/blink/renderer/modules/bluetooth/bluetooth_manufacturer_data_map.idl",
           "//third_party/blink/renderer/modules/bluetooth/bluetooth_manufacturer_data_filter_init.idl",
+          "//third_party/blink/renderer/modules/bluetooth/bluetooth_manufacturer_data_map.idl",
           "//third_party/blink/renderer/modules/bluetooth/bluetooth_remote_gatt_characteristic.idl",
           "//third_party/blink/renderer/modules/bluetooth/bluetooth_remote_gatt_descriptor.idl",
           "//third_party/blink/renderer/modules/bluetooth/bluetooth_remote_gatt_server.idl",
@@ -193,8 +193,6 @@
           "//third_party/blink/renderer/modules/delegated_ink/ink.idl",
           "//third_party/blink/renderer/modules/delegated_ink/ink_trail_style.idl",
           "//third_party/blink/renderer/modules/delegated_ink/navigator_ink.idl",
-          "//third_party/blink/renderer/modules/managed_device/navigator_managed_data.idl",
-          "//third_party/blink/renderer/modules/managed_device/navigator_managed.idl",
           "//third_party/blink/renderer/modules/device_orientation/device_motion_event.idl",
           "//third_party/blink/renderer/modules/device_orientation/device_motion_event_acceleration.idl",
           "//third_party/blink/renderer/modules/device_orientation/device_motion_event_acceleration_init.idl",
@@ -238,6 +236,7 @@
           "//third_party/blink/renderer/modules/file_system_access/file_picker_options.idl",
           "//third_party/blink/renderer/modules/file_system_access/file_system_create_writable_options.idl",
           "//third_party/blink/renderer/modules/file_system_access/file_system_directory_handle.idl",
+          "//third_party/blink/renderer/modules/file_system_access/file_system_directory_iterator.idl",
           "//third_party/blink/renderer/modules/file_system_access/file_system_file_handle.idl",
           "//third_party/blink/renderer/modules/file_system_access/file_system_get_directory_options.idl",
           "//third_party/blink/renderer/modules/file_system_access/file_system_get_file_options.idl",
@@ -245,7 +244,6 @@
           "//third_party/blink/renderer/modules/file_system_access/file_system_handle_permission_descriptor.idl",
           "//third_party/blink/renderer/modules/file_system_access/file_system_remove_options.idl",
           "//third_party/blink/renderer/modules/file_system_access/file_system_writable_file_stream.idl",
-          "//third_party/blink/renderer/modules/file_system_access/file_system_directory_iterator.idl",
           "//third_party/blink/renderer/modules/file_system_access/open_file_picker_options.idl",
           "//third_party/blink/renderer/modules/file_system_access/save_file_picker_options.idl",
           "//third_party/blink/renderer/modules/file_system_access/storage_manager_file_system_access.idl",
@@ -358,6 +356,8 @@
           "//third_party/blink/renderer/modules/launch/dom_window_launch_queue.idl",
           "//third_party/blink/renderer/modules/launch/launch_params.idl",
           "//third_party/blink/renderer/modules/launch/launch_queue.idl",
+          "//third_party/blink/renderer/modules/lock_screen/dom_window_lock_screen.idl",
+          "//third_party/blink/renderer/modules/lock_screen/lock_screen_data.idl",
           "//third_party/blink/renderer/modules/locks/lock.idl",
           "//third_party/blink/renderer/modules/locks/lock_info.idl",
           "//third_party/blink/renderer/modules/locks/lock_manager.idl",
@@ -365,8 +365,8 @@
           "//third_party/blink/renderer/modules/locks/lock_options.idl",
           "//third_party/blink/renderer/modules/locks/navigator_locks.idl",
           "//third_party/blink/renderer/modules/locks/worker_navigator_locks.idl",
-          "//third_party/blink/renderer/modules/lock_screen/dom_window_lock_screen.idl",
-          "//third_party/blink/renderer/modules/lock_screen/lock_screen_data.idl",
+          "//third_party/blink/renderer/modules/managed_device/navigator_managed.idl",
+          "//third_party/blink/renderer/modules/managed_device/navigator_managed_data.idl",
           "//third_party/blink/renderer/modules/manifest/image_resource.idl",
           "//third_party/blink/renderer/modules/media_capabilities/audio_configuration.idl",
           "//third_party/blink/renderer/modules/media_capabilities/key_system_track_configuration.idl",
@@ -786,32 +786,32 @@
           "//third_party/blink/renderer/modules/webcodecs/audio_decoder_config.idl",
           "//third_party/blink/renderer/modules/webcodecs/audio_decoder_init.idl",
           "//third_party/blink/renderer/modules/webcodecs/audio_decoder_support.idl",
-          "//third_party/blink/renderer/modules/webcodecs/audio_encoder_support.idl",
           "//third_party/blink/renderer/modules/webcodecs/audio_encoder.idl",
           "//third_party/blink/renderer/modules/webcodecs/audio_encoder_config.idl",
           "//third_party/blink/renderer/modules/webcodecs/audio_encoder_init.idl",
+          "//third_party/blink/renderer/modules/webcodecs/audio_encoder_support.idl",
           "//third_party/blink/renderer/modules/webcodecs/audio_frame.idl",
           "//third_party/blink/renderer/modules/webcodecs/audio_frame_init.idl",
           "//third_party/blink/renderer/modules/webcodecs/audio_frame_output_callback.idl",
           "//third_party/blink/renderer/modules/webcodecs/avc_encoder_config.idl",
           "//third_party/blink/renderer/modules/webcodecs/codec_state.idl",
-          "//third_party/blink/renderer/modules/webcodecs/encoded_audio_chunk.idl",
           "//third_party/blink/renderer/modules/webcodecs/color_space_matrix_id.idl",
           "//third_party/blink/renderer/modules/webcodecs/color_space_primary_id.idl",
           "//third_party/blink/renderer/modules/webcodecs/color_space_range_id.idl",
           "//third_party/blink/renderer/modules/webcodecs/color_space_transfer_id.idl",
+          "//third_party/blink/renderer/modules/webcodecs/encoded_audio_chunk.idl",
           "//third_party/blink/renderer/modules/webcodecs/encoded_audio_chunk_init.idl",
+          "//third_party/blink/renderer/modules/webcodecs/encoded_audio_chunk_metadata.idl",
+          "//third_party/blink/renderer/modules/webcodecs/encoded_audio_chunk_output_callback.idl",
           "//third_party/blink/renderer/modules/webcodecs/encoded_video_chunk.idl",
           "//third_party/blink/renderer/modules/webcodecs/encoded_video_chunk_init.idl",
-          "//third_party/blink/renderer/modules/webcodecs/encoded_audio_chunk_metadata.idl",
           "//third_party/blink/renderer/modules/webcodecs/encoded_video_chunk_metadata.idl",
-          "//third_party/blink/renderer/modules/webcodecs/encoded_audio_chunk_output_callback.idl",
           "//third_party/blink/renderer/modules/webcodecs/encoded_video_chunk_output_callback.idl",
           "//third_party/blink/renderer/modules/webcodecs/hardware_preference.idl",
-          "//third_party/blink/renderer/modules/webcodecs/image_decoder.idl",
-          "//third_party/blink/renderer/modules/webcodecs/image_decoder_init.idl",
           "//third_party/blink/renderer/modules/webcodecs/image_decode_options.idl",
           "//third_party/blink/renderer/modules/webcodecs/image_decode_result.idl",
+          "//third_party/blink/renderer/modules/webcodecs/image_decoder.idl",
+          "//third_party/blink/renderer/modules/webcodecs/image_decoder_init.idl",
           "//third_party/blink/renderer/modules/webcodecs/image_track.idl",
           "//third_party/blink/renderer/modules/webcodecs/image_track_list.idl",
           "//third_party/blink/renderer/modules/webcodecs/plane.idl",
@@ -822,11 +822,11 @@
           "//third_party/blink/renderer/modules/webcodecs/video_decoder_config.idl",
           "//third_party/blink/renderer/modules/webcodecs/video_decoder_init.idl",
           "//third_party/blink/renderer/modules/webcodecs/video_decoder_support.idl",
-          "//third_party/blink/renderer/modules/webcodecs/video_encoder_support.idl",
           "//third_party/blink/renderer/modules/webcodecs/video_encoder.idl",
           "//third_party/blink/renderer/modules/webcodecs/video_encoder_config.idl",
           "//third_party/blink/renderer/modules/webcodecs/video_encoder_encode_options.idl",
           "//third_party/blink/renderer/modules/webcodecs/video_encoder_init.idl",
+          "//third_party/blink/renderer/modules/webcodecs/video_encoder_support.idl",
           "//third_party/blink/renderer/modules/webcodecs/video_frame.idl",
           "//third_party/blink/renderer/modules/webcodecs/video_frame_init.idl",
           "//third_party/blink/renderer/modules/webcodecs/video_frame_output_callback.idl",
@@ -942,8 +942,8 @@
           "//third_party/blink/renderer/modules/webgpu/gpu_compute_pass_encoder.idl",
           "//third_party/blink/renderer/modules/webgpu/gpu_compute_pipeline.idl",
           "//third_party/blink/renderer/modules/webgpu/gpu_compute_pipeline_descriptor.idl",
-          "//third_party/blink/renderer/modules/webgpu/gpu_depth_stencil_state_descriptor.idl",
           "//third_party/blink/renderer/modules/webgpu/gpu_depth_stencil_state.idl",
+          "//third_party/blink/renderer/modules/webgpu/gpu_depth_stencil_state_descriptor.idl",
           "//third_party/blink/renderer/modules/webgpu/gpu_device.idl",
           "//third_party/blink/renderer/modules/webgpu/gpu_device_descriptor.idl",
           "//third_party/blink/renderer/modules/webgpu/gpu_device_lost_info.idl",
@@ -1081,8 +1081,6 @@
           "//third_party/blink/renderer/modules/xr/xr_frame.idl",
           "//third_party/blink/renderer/modules/xr/xr_frame_request_callback.idl",
           "//third_party/blink/renderer/modules/xr/xr_hand.idl",
-          "//third_party/blink/renderer/modules/xr/xr_joint_pose.idl",
-          "//third_party/blink/renderer/modules/xr/xr_joint_space.idl",
           "//third_party/blink/renderer/modules/xr/xr_hit_test_options_init.idl",
           "//third_party/blink/renderer/modules/xr/xr_hit_test_result.idl",
           "//third_party/blink/renderer/modules/xr/xr_hit_test_source.idl",
@@ -1093,6 +1091,8 @@
           "//third_party/blink/renderer/modules/xr/xr_input_source_event_init.idl",
           "//third_party/blink/renderer/modules/xr/xr_input_sources_change_event.idl",
           "//third_party/blink/renderer/modules/xr/xr_input_sources_change_event_init.idl",
+          "//third_party/blink/renderer/modules/xr/xr_joint_pose.idl",
+          "//third_party/blink/renderer/modules/xr/xr_joint_space.idl",
           "//third_party/blink/renderer/modules/xr/xr_layer.idl",
           "//third_party/blink/renderer/modules/xr/xr_light_estimate.idl",
           "//third_party/blink/renderer/modules/xr/xr_light_probe.idl",
diff --git a/third_party/blink/renderer/bindings/scripts/bind_gen/union.py b/third_party/blink/renderer/bindings/scripts/bind_gen/union.py
index 3e8825d..842e92d 100644
--- a/third_party/blink/renderer/bindings/scripts/bind_gen/union.py
+++ b/third_party/blink/renderer/bindings/scripts/bind_gen/union.py
@@ -273,7 +273,16 @@
     # 4.1. If types includes a dictionary type, ...
     member = find_by_type(lambda t: t.is_dictionary)
     if member:
-        dispatch_if("${v8_value}->IsNullOrUndefined()")
+        if member.idl_type.type_definition_object.has_required_member:
+            dispatch_if("${v8_value}->IsNullOrUndefined()")
+        else:
+            dispatch_if(
+                "${v8_value}->IsNullOrUndefined()",
+                # Shortcut to reduce the binary size
+                S("blink_value", (_format(
+                    "auto&& ${blink_value} = {}::Create(${isolate});",
+                    blink_class_name(
+                        member.idl_type.type_definition_object)))))
 
     # 5. If V is a platform object, then:
     # 5.1. If types includes an interface type that V implements, ...
@@ -292,7 +301,12 @@
             member.idl_type.type_definition_object)
         dispatch_if(
             _format("{}::HasInstance(${isolate}, ${v8_value})",
-                    v8_bridge_name))
+                    v8_bridge_name),
+            # Shortcut to reduce the binary size
+            S("blink_value", (_format(
+                "auto&& ${blink_value} = "
+                "{}::ToWrappableUnsafe(${v8_value}.As<v8::Object>());",
+                v8_bridge_name))))
 
     # 6. If Type(V) is Object and V has an [[ArrayBufferData]] internal slot,
     #   then:
@@ -329,7 +343,13 @@
     # 9.1. If types includes a callback function type, ...
     member = find_by_type(lambda t: t.is_callback_function)
     if member:
-        dispatch_if("${v8_value}->IsFunction()")
+        dispatch_if(
+            "${v8_value}->IsFunction()",
+            # Shortcut to reduce the binary size
+            S("blink_value", (_format(
+                "auto&& ${blink_value} = "
+                "{}::Create(${v8_value}.As<v8::Function>());",
+                blink_class_name(member.idl_type.type_definition_object)))))
 
     # 10. If Type(V) is Object, then:
     # 10.1. If types includes a sequence type, ...
@@ -355,13 +375,12 @@
             def symbol_definition_constructor(symbol_node):
                 node = SymbolDefinitionNode(symbol_node)
                 node.extend([
-                    F(
-                        "auto&& ${blink_value} = "
-                        "bindings::CreateIDLSequenceFromIterator<{}>("
-                        "${isolate}, std::move(script_iterator), "
-                        "${exception_state});",
-                        native_value_tag(
-                            union_member.idl_type.unwrap().element_type)),
+                    F(("auto&& ${blink_value} = "
+                       "bindings::CreateIDLSequenceFromIterator<{}>("
+                       "${isolate}, std::move(script_iterator), "
+                       "${exception_state});"),
+                      native_value_tag(
+                          union_member.idl_type.unwrap().element_type)),
                     CxxUnlikelyIfNode(cond="${exception_state}.HadException()",
                                       body=T("return nullptr;")),
                 ])
@@ -378,18 +397,42 @@
     # 10. If Type(V) is Object, then:
     # 10.3. If types includes a dictionary type, ...
     # 10.4. If types includes a record type, ...
-    # 10.5. If types includes a callback interface type, ...
-    # 10.6. If types includes object, ...
-    member = find_by_type(lambda t: t.is_dictionary or t.is_record or t.
-                          is_callback_interface or t.is_object)
+    member = find_by_type(lambda t: t.is_dictionary or t.is_record)
     if member:
         dispatch_if("${v8_value}->IsObject()")
 
+    # 10. If Type(V) is Object, then:
+    # 10.5. If types includes a callback interface type, ...
+    member = find_by_type(lambda t: t.is_callback_interface)
+    if member:
+        dispatch_if(
+            "${v8_value}->IsObject()",
+            # Shortcut to reduce the binary size
+            S("blink_value", (_format(
+                "auto&& ${blink_value} = "
+                "{}::Create(${v8_value}.As<v8::Object>();",
+                blink_class_name(member.idl_type.type_definition_object)))))
+
+    # 10. If Type(V) is Object, then:
+    # 10.6. If types includes object, ...
+    member = find_by_type(lambda t: t.is_object)
+    if member:
+        dispatch_if(
+            "${v8_value}->IsObject()",
+            # Shortcut to reduce the binary size
+            S("blink_value",
+              (_format("auto&& ${blink_value} = "
+                       "ScriptValue(${isolate}, ${v8_value});"))))
+
     # 11. If Type(V) is Boolean, then:
     # 11.1. If types includes boolean, ...
     member = find_by_type(lambda t: t.is_boolean)
     if member:
-        dispatch_if("${v8_value}->IsBoolean()")
+        dispatch_if(
+            "${v8_value}->IsBoolean()",
+            # Shortcut to reduce the binary size
+            S("blink_value", ("auto&& ${blink_value} = "
+                              "${v8_value}.As<v8::Boolean>()->Value();")))
 
     # 12. If Type(V) is Number, then:
     # 12.1. If types includes a numeric type, ...
@@ -408,9 +451,8 @@
     else:
         # 19. Throw a TypeError.
         body.append(
-            T("${exception_state}.ThrowTypeError("
-              "ExceptionMessages::ValueNotOfType("
-              "UnionNameInIDL().Ascii().c_str()));"))
+            T("ThrowTypeErrorNotOfType"
+              "(${exception_state}, UnionNameInIDL());"))
         body.append(T("return nullptr;"))
 
     return func_decl, func_def
@@ -701,23 +743,19 @@
 
     func_def = CxxFuncDefNode(name="UnionNameInIDL",
                               arg_decls=[],
-                              return_type="String",
-                              static=True)
+                              return_type="const char*",
+                              static=True,
+                              constexpr=True)
     func_def.set_base_template_vars(cg_context.template_bindings())
     body = func_def.body
 
-    body.extend([
-        TextNode("static constexpr const char* const member_names[] = {"),
-        ListNode(list(
-            map(
-                lambda name: TextNode("\"{}\"".format(name)),
-                sorted(
-                    map(lambda idl_type: idl_type.syntactic_form,
-                        cg_context.union.flattened_member_types)))),
-                 separator=", "),
-        TextNode("};"),
-        TextNode("return ProduceUnionNameInIDL(member_names);"),
-    ])
+    member_type_names = sorted(
+        map(lambda idl_type: idl_type.syntactic_form,
+            cg_context.union.flattened_member_types))
+    body.append(
+        TextNode("return \"({}){}\";".format(
+            " or ".join(member_type_names),
+            "?" if cg_context.union.does_include_nullable_type else "")))
 
     return func_def, None
 
diff --git a/third_party/blink/renderer/bindings/scripts/web_idl/dictionary.py b/third_party/blink/renderer/bindings/scripts/web_idl/dictionary.py
index 01d2cded..400c266 100644
--- a/third_party/blink/renderer/bindings/scripts/web_idl/dictionary.py
+++ b/third_party/blink/renderer/bindings/scripts/web_idl/dictionary.py
@@ -104,6 +104,13 @@
 
         return tuple(collect_inherited_members(self))
 
+    @property
+    def has_required_member(self):
+        """
+        Returns True if the dictionary has any required dictionary members.
+        """
+        return bool(any(member.is_required for member in self.members))
+
     # UserDefinedType overrides
     @property
     def is_dictionary(self):
diff --git a/third_party/blink/renderer/core/dom/slot_assignment.cc b/third_party/blink/renderer/core/dom/slot_assignment.cc
index d375b59..5ac4a53d 100644
--- a/third_party/blink/renderer/core/dom/slot_assignment.cc
+++ b/third_party/blink/renderer/core/dom/slot_assignment.cc
@@ -4,7 +4,6 @@
 
 #include "third_party/blink/renderer/core/dom/slot_assignment.h"
 
-#include "third_party/blink/renderer/core/accessibility/ax_object_cache.h"
 #include "third_party/blink/renderer/core/display_lock/display_lock_utilities.h"
 #include "third_party/blink/renderer/core/dom/element_traversal.h"
 #include "third_party/blink/renderer/core/dom/flat_tree_traversal_forbidden_scope.h"
@@ -269,16 +268,6 @@
                     *slot, kIncludeSelf));
     }
 
-    // The accessibility cache must be invalidated before flat tree traversal
-    // is forbidden, because the process of invalidation accesses the old flat
-    // tree children in order to clean up soon to be stale relationships.
-    // Any <slot> within this shadow root may lose or gain flat tree children
-    // during slot reassignment, so call ChildrenChanged() on all of them.
-    if (AXObjectCache* cache = owner_->GetDocument().ExistingAXObjectCache()) {
-      for (Member<HTMLSlotElement> slot : Slots())
-        cache->ChildrenChanged(slot);
-    }
-
     FlatTreeTraversalForbiddenScope forbid_flat_tree_traversal(
         owner_->GetDocument());
 
diff --git a/third_party/blink/renderer/core/editing/layout_selection.cc b/third_party/blink/renderer/core/editing/layout_selection.cc
index ee69daa..4eada752 100644
--- a/third_party/blink/renderer/core/editing/layout_selection.cc
+++ b/third_party/blink/renderer/core/editing/layout_selection.cc
@@ -660,10 +660,33 @@
 // LayoutText and not of each fragment for it.
 LayoutSelectionStatus LayoutSelection::ComputeSelectionStatus(
     const NGInlineCursor& cursor) const {
+  const NGInlineCursorPosition& current = cursor.Current();
+  if (!current.IsLayoutGeneratedText())
+    return ComputeSelectionStatus(cursor, current.TextOffset());
+
   // We don't paint selection on ellipsis.
-  if (cursor.Current().IsEllipsis())
+  if (current.IsEllipsis())
     return {0, 0, SelectSoftLineBreak::kNotSelected};
-  const NGTextOffset offset = cursor.Current().TextOffset();
+
+  // Layout-generated text does not have corresponding text in the DOM. Find if
+  // the previous character is selected. This is a soft-hyphen character if the
+  // hyphen is generated from it, or the character before the hyphen if
+  // automatic hyphenation.
+  const unsigned offset = current->StartOffsetInContainer(cursor);
+  DCHECK_GT(offset, 0u);
+  LayoutSelectionStatus status =
+      ComputeSelectionStatus(cursor, {offset - 1, offset});
+  if (!status.HasValidRange())
+    return status;
+  // Make |LayoutSelectionStatus| to select the whole text of the hyphen.
+  status.start = 0;
+  status.end = current->TextLength();
+  return status;
+}
+
+LayoutSelectionStatus LayoutSelection::ComputeSelectionStatus(
+    const NGInlineCursor& cursor,
+    const NGTextOffset& offset) const {
   const unsigned start_offset = offset.start;
   const unsigned end_offset = offset.end;
   switch (GetSelectionStateFor(cursor.Current())) {
diff --git a/third_party/blink/renderer/core/editing/layout_selection.h b/third_party/blink/renderer/core/editing/layout_selection.h
index 31082f3f..0563d4a 100644
--- a/third_party/blink/renderer/core/editing/layout_selection.h
+++ b/third_party/blink/renderer/core/editing/layout_selection.h
@@ -35,6 +35,7 @@
 class LayoutText;
 class NGInlineCursor;
 class NGInlineCursorPosition;
+struct NGTextOffset;
 class FrameSelection;
 struct LayoutSelectionStatus;
 struct LayoutTextSelectionStatus;
@@ -77,6 +78,8 @@
   void Trace(Visitor*) const;
 
  private:
+  LayoutSelectionStatus ComputeSelectionStatus(const NGInlineCursor&,
+                                               const NGTextOffset&) const;
   SelectionState ComputeSelectionStateFromOffsets(SelectionState state,
                                                   unsigned start_offset,
                                                   unsigned end_offset) const;
diff --git a/third_party/blink/renderer/core/editing/layout_selection_test.cc b/third_party/blink/renderer/core/editing/layout_selection_test.cc
index c150b24..df6deb3 100644
--- a/third_party/blink/renderer/core/editing/layout_selection_test.cc
+++ b/third_party/blink/renderer/core/editing/layout_selection_test.cc
@@ -1318,4 +1318,42 @@
             ComputeLayoutSelectionStateForCursor(*layout_wbr));
 }
 
+TEST_F(NGLayoutSelectionTest, SoftHyphen0to1) {
+  SetSelectionAndUpdateLayoutSelection(
+      "<div id='container' style='width:3ch'>^0|123&shy;456</div>");
+  auto* element = GetElementById("container");
+  auto* block_flow = To<LayoutBlockFlow>(element->GetLayoutObject());
+  NGInlineCursor cursor(*block_flow);
+  while (!cursor.Current()->IsLayoutGeneratedText())
+    cursor.MoveToNext();
+  auto status = Selection().ComputeLayoutSelectionStatus(cursor);
+  EXPECT_FALSE(status.HasValidRange());
+}
+
+TEST_F(NGLayoutSelectionTest, SoftHyphen0to4) {
+  SetSelectionAndUpdateLayoutSelection(
+      "<div id='container' style='width:3ch'>^0123|&shy;456</div>");
+  auto* element = GetElementById("container");
+  auto* block_flow = To<LayoutBlockFlow>(element->GetLayoutObject());
+  NGInlineCursor cursor(*block_flow);
+  while (!cursor.Current()->IsLayoutGeneratedText())
+    cursor.MoveToNext();
+  auto status = Selection().ComputeLayoutSelectionStatus(cursor);
+  EXPECT_FALSE(status.HasValidRange());
+}
+
+TEST_F(NGLayoutSelectionTest, SoftHyphen1to5) {
+  SetSelectionAndUpdateLayoutSelection(
+      "<div id='container' style='width:3ch'>0^123&shy;|456</div>");
+  auto* element = GetElementById("container");
+  auto* block_flow = To<LayoutBlockFlow>(element->GetLayoutObject());
+  NGInlineCursor cursor(*block_flow);
+  while (!cursor.Current()->IsLayoutGeneratedText())
+    cursor.MoveToNext();
+  auto status = Selection().ComputeLayoutSelectionStatus(cursor);
+  EXPECT_TRUE(status.HasValidRange());
+  EXPECT_EQ(LayoutSelectionStatus(0u, 1u, SelectSoftLineBreak::kNotSelected),
+            status);
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/exported/web_view_impl.cc b/third_party/blink/renderer/core/exported/web_view_impl.cc
index b05d3ca..5c1f917 100644
--- a/third_party/blink/renderer/core/exported/web_view_impl.cc
+++ b/third_party/blink/renderer/core/exported/web_view_impl.cc
@@ -3175,11 +3175,11 @@
   history_list_length_ = history_list_offset_ + 1;
 }
 
-int32_t WebViewImpl::HistoryBackListCount() {
+int32_t WebViewImpl::HistoryBackListCount() const {
   return std::max(history_list_offset_, 0);
 }
 
-int32_t WebViewImpl::HistoryForwardListCount() {
+int32_t WebViewImpl::HistoryForwardListCount() const {
   return history_list_length_ - HistoryBackListCount() - 1;
 }
 
diff --git a/third_party/blink/renderer/core/exported/web_view_impl.h b/third_party/blink/renderer/core/exported/web_view_impl.h
index 21774b0..5149d97 100644
--- a/third_party/blink/renderer/core/exported/web_view_impl.h
+++ b/third_party/blink/renderer/core/exported/web_view_impl.h
@@ -207,8 +207,8 @@
       int32_t history_offset,
       base::Optional<int32_t> history_length) override;
   void IncreaseHistoryListFromNavigation() override;
-  int32_t HistoryBackListCount() override;
-  int32_t HistoryForwardListCount() override;
+  int32_t HistoryBackListCount() const override;
+  int32_t HistoryForwardListCount() const override;
   const SessionStorageNamespaceId& GetSessionStorageNamespaceId() override;
 
   // Functions to add and remove observers for this object.
diff --git a/third_party/blink/renderer/core/frame/local_frame.cc b/third_party/blink/renderer/core/frame/local_frame.cc
index fe637b88..9f3da4a7 100644
--- a/third_party/blink/renderer/core/frame/local_frame.cc
+++ b/third_party/blink/renderer/core/frame/local_frame.cc
@@ -134,6 +134,7 @@
 #include "third_party/blink/renderer/core/fullscreen/fullscreen.h"
 #include "third_party/blink/renderer/core/fullscreen/scoped_allow_fullscreen.h"
 #include "third_party/blink/renderer/core/html/html_frame_element_base.h"
+#include "third_party/blink/renderer/core/html/html_link_element.h"
 #include "third_party/blink/renderer/core/html/html_object_element.h"
 #include "third_party/blink/renderer/core/html/html_plugin_element.h"
 #include "third_party/blink/renderer/core/html/media/html_media_element.h"
@@ -3891,6 +3892,17 @@
     Client()->DidStopLoading();
 }
 
+void LocalFrame::GetCanonicalUrlForSharing(
+    GetCanonicalUrlForSharingCallback callback) {
+  KURL canonical_url;
+  HTMLLinkElement* link_element = GetDocument()->LinkCanonical();
+  if (link_element)
+    canonical_url = link_element->Href();
+  std::move(callback).Run(canonical_url.IsNull()
+                              ? base::nullopt
+                              : base::make_optional(canonical_url));
+}
+
 bool LocalFrame::ShouldThrottleDownload() {
   const auto now = base::TimeTicks::Now();
   if (num_burst_download_requests_ == 0) {
diff --git a/third_party/blink/renderer/core/frame/local_frame.h b/third_party/blink/renderer/core/frame/local_frame.h
index 8d36f3e..b67f416 100644
--- a/third_party/blink/renderer/core/frame/local_frame.h
+++ b/third_party/blink/renderer/core/frame/local_frame.h
@@ -737,6 +737,8 @@
                             ExtractSmartClipDataCallback callback) final;
 #endif
   void HandleRendererDebugURL(const KURL& url) final;
+  void GetCanonicalUrlForSharing(
+      GetCanonicalUrlForSharingCallback callback) final;
 
   // blink::mojom::LocalMainFrame overrides:
   void AnimateDoubleTapZoom(const gfx::Point& point,
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_item.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_item.cc
index 95ee74c..d146f17 100644
--- a/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_item.cc
+++ b/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_item.cc
@@ -308,18 +308,16 @@
   return LineBoxType() == NGLineBoxType::kEmptyLineBox;
 }
 
-bool NGFragmentItem::IsGeneratedText() const {
-  if (Type() == kGeneratedText) {
-    DCHECK_EQ(TextType(), NGTextType::kLayoutGenerated);
-    return true;
-  }
-  DCHECK_NE(TextType(), NGTextType::kLayoutGenerated);
+bool NGFragmentItem::IsStyleGeneratedText() const {
   if (Type() == kText || Type() == kSVGText)
     return GetLayoutObject()->IsStyleGenerated();
-  NOTREACHED();
   return false;
 }
 
+bool NGFragmentItem::IsGeneratedText() const {
+  return IsLayoutGeneratedText() || IsStyleGeneratedText();
+}
+
 bool NGFragmentItem::IsListMarker() const {
   return layout_object_ && layout_object_->IsLayoutNGOutsideListMarker();
 }
@@ -469,6 +467,26 @@
   return {};
 }
 
+unsigned NGFragmentItem::StartOffsetInContainer(
+    const NGInlineCursor& container) const {
+  DCHECK_EQ(Type(), kGeneratedText);
+  DCHECK(!IsEllipsis());
+  // Hyphens don't have the text offset in the container. Find the closest
+  // previous text fragment.
+  DCHECK_EQ(container.Current().Item(), this);
+  NGInlineCursor cursor(container);
+  for (cursor.MoveToPrevious(); cursor; cursor.MoveToPrevious()) {
+    const NGInlineCursorPosition& current = cursor.Current();
+    if (current->IsText() && !current->IsLayoutGeneratedText())
+      return current->EndOffset();
+    // A box doesn't have the offset either.
+    if (current->Type() == kBox && !current->IsInlineBox())
+      break;
+  }
+  NOTREACHED();
+  return 0;
+}
+
 StringView NGFragmentItem::Text(const NGFragmentItems& items) const {
   if (Type() == kText) {
     return StringView(items.Text(UsesFirstLineStyle()), text_.text_offset.start,
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_item.h b/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_item.h
index 1e24daeb..fa7e57e 100644
--- a/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_item.h
+++ b/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_item.h
@@ -343,9 +343,9 @@
   //  * ellipsis            kGeneratedText
   //  * first-letter-part   kText
   //  * list marker         kGeneratedText
-  //  * soft hyphen         kGeneratedText
-  // TODO(yosin): When we implement |kGeneratedText|, we rename this function
-  // to avoid confliction with |kGeneratedText|.
+  //  * hyphen (soft/auto)  kGeneratedText
+  bool IsLayoutGeneratedText() const { return Type() == kGeneratedText; }
+  bool IsStyleGeneratedText() const;
   bool IsGeneratedText() const;
 
   bool IsSymbolMarker() const {
@@ -361,6 +361,12 @@
   unsigned StartOffset() const { return TextOffset().start; }
   unsigned EndOffset() const { return TextOffset().end; }
   unsigned TextLength() const { return TextOffset().Length(); }
+
+  // Layout-generated text has two offsets; one for its own generated string,
+  // and the other for the container. |TextOffset| returns the former, while
+  // this function returns the latter.
+  unsigned StartOffsetInContainer(const NGInlineCursor& container) const;
+
   StringView Text(const NGFragmentItems& items) const;
   String GeneratedText() const {
     DCHECK_EQ(Type(), kGeneratedText);
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_item_test.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_item_test.cc
index 51ff532..17ee1d1 100644
--- a/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_item_test.cc
+++ b/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_item_test.cc
@@ -366,6 +366,32 @@
     EXPECT_TRUE(cursor.Current()->IsInkOverflowComputed());
 }
 
+TEST_F(NGFragmentItemTest, StartOffsetInContainer) {
+  SetBodyInnerHTML(R"HTML(
+    <style>
+    atomic {
+      display: inline-block;
+      width: 3ch;
+    }
+    </style>
+    <div id="container" style="font-size: 10px; width: 3ch">
+      012&shy;456&shy;<span>8</span>90&shy;<atomic></atomic>
+    </div>
+  )HTML");
+  auto* container =
+      To<LayoutBlockFlow>(GetLayoutObjectByElementId("container"));
+  NGInlineCursor cursor(*container);
+  while (!cursor.Current()->IsLayoutGeneratedText())
+    cursor.MoveToNext();
+  EXPECT_EQ(4u, cursor.Current()->StartOffsetInContainer(cursor));
+  for (cursor.MoveToNext(); !cursor.Current()->IsLayoutGeneratedText();)
+    cursor.MoveToNext();
+  EXPECT_EQ(8u, cursor.Current()->StartOffsetInContainer(cursor));
+  for (cursor.MoveToNext(); !cursor.Current()->IsLayoutGeneratedText();)
+    cursor.MoveToNext();
+  EXPECT_EQ(12u, cursor.Current()->StartOffsetInContainer(cursor));
+}
+
 // Various nodes/elements to test insertions.
 using CreateNode = Node* (*)(Document&);
 static CreateNode node_creators[] = {
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object.cc b/third_party/blink/renderer/modules/accessibility/ax_object.cc
index 58dbac3..a1ff2d6 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_object.cc
+++ b/third_party/blink/renderer/modules/accessibility/ax_object.cc
@@ -4225,11 +4225,6 @@
                                    << ToString(true, true);
 
   for (const auto& child : children_) {
-    // Check parent first, as the child might be several levels down if there
-    // are unincluded nodes in between, in which case the cached parent will
-    // also be a descendant (unlike children_, parent_ does not skip levels).
-    // Another case where the parent is not the same is when the child has been
-    // reparented using aria-owns.
     if (child->CachedParentObject() == this)
       child->DetachFromParent();
   }
@@ -4239,16 +4234,23 @@
   if (!GetNode())
     return;
 
-  if (GetDocument()->IsFlatTreeTraversalForbidden() ||
-      GetDocument()->IsSlotAssignmentRecalcForbidden()) {
-    // Cannot use layout tree builder traversal now, will have to rely on
-    // RepairParent() at a later point.
-    return;
-  }
+  // <slot> content is always included in the tree, so there is no need to
+  // iterate through the nodes. This also protects us against slot use "after
+  // poison", where attempts to access assigned nodes triggers a DCHECK.
 
-  // Detach children that were not cleared from first loop.
-  // These must have been an unincluded node who's parent is this,
-  // although it may now be included since the children were last updated.
+  // Detailed explanation:
+  // <slot> elements are placeholders marking locations in a shadow tree where
+  // users of a web component can insert their own custom nodes. Inserted nodes
+  // (also known as distributed nodes) become children of their respective slots
+  // in the accessibility tree. In other words, the accessibility tree mirrors
+  // the flattened DOM tree or the layout tree, not the original DOM tree.
+  // Distributed nodes still maintain their parent relations and computed style
+  // information with their original location in the DOM. Therefore, we need to
+  // ensure that in the accessibility tree no remnant information from the
+  // unflattened DOM tree remains, such as the cached parent.
+  if (IsA<HTMLSlotElement>(GetNode()))
+    return;
+
   for (Node* child_node = LayoutTreeBuilderTraversal::FirstChild(*GetNode());
        child_node;
        child_node = LayoutTreeBuilderTraversal::NextSibling(*child_node)) {
@@ -4256,6 +4258,9 @@
     AXObject* ax_child_from_node = AXObjectCache().Get(child_node);
     if (ax_child_from_node &&
         ax_child_from_node->CachedParentObject() == this) {
+      // Child was not cleared from first loop.
+      // It must have been an unincluded node who's parent is this,
+      // although it may now be included since the children were last updated.
       // Check current parent first. It may be owned by another node.
       ax_child_from_node->DetachFromParent();
     }
diff --git a/third_party/blink/renderer/platform/bindings/union_base.cc b/third_party/blink/renderer/platform/bindings/union_base.cc
index 4b37e3b9..453574a 100644
--- a/third_party/blink/renderer/platform/bindings/union_base.cc
+++ b/third_party/blink/renderer/platform/bindings/union_base.cc
@@ -4,28 +4,18 @@
 
 #include "third_party/blink/renderer/platform/bindings/union_base.h"
 
-#include "third_party/blink/renderer/platform/wtf/text/string_builder.h"
+#include "third_party/blink/renderer/platform/bindings/exception_messages.h"
+#include "third_party/blink/renderer/platform/bindings/exception_state.h"
 
 namespace blink {
 
 namespace bindings {
 
 // static
-String UnionBase::ProduceUnionNameInIDL(
-    const base::span<const char* const>& member_names) {
-  DCHECK_GE(member_names.size(), 2u);
-
-  StringBuilder builder;
-
-  builder.Append("(");
-  builder.Append(member_names[0]);
-  for (size_t i = 1; i < member_names.size(); ++i) {
-    builder.Append(" or ");
-    builder.Append(member_names[i]);
-  }
-  builder.Append(")");
-
-  return builder.ToString();
+void UnionBase::ThrowTypeErrorNotOfType(ExceptionState& exception_state,
+                                        const char* expected_type) {
+  exception_state.ThrowTypeError(
+      ExceptionMessages::ValueNotOfType(expected_type));
 }
 
 }  // namespace bindings
diff --git a/third_party/blink/renderer/platform/bindings/union_base.h b/third_party/blink/renderer/platform/bindings/union_base.h
index 0a3fa4c..f0ef5df 100644
--- a/third_party/blink/renderer/platform/bindings/union_base.h
+++ b/third_party/blink/renderer/platform/bindings/union_base.h
@@ -13,6 +13,7 @@
 
 namespace blink {
 
+class ExceptionState;
 class ScriptState;
 
 namespace bindings {
@@ -32,8 +33,9 @@
   virtual void Trace(Visitor*) const {}
 
  protected:
-  static String ProduceUnionNameInIDL(
-      const base::span<const char* const>& member_names);
+  // Helper function to reduce the binary size of the generated bindings.
+  static void ThrowTypeErrorNotOfType(ExceptionState& exception_state,
+                                      const char* expected_type);
 
   UnionBase() = default;
 };
diff --git a/third_party/blink/renderer/platform/heap/test/heap_test.cc b/third_party/blink/renderer/platform/heap/test/heap_test.cc
index f2dfa360..715cafe 100644
--- a/third_party/blink/renderer/platform/heap/test/heap_test.cc
+++ b/third_party/blink/renderer/platform/heap/test/heap_test.cc
@@ -3248,8 +3248,6 @@
 namespace blink {
 #endif
 
-// TODO(1181269): Enable for the library once implemented.
-#if !BUILDFLAG(USE_V8_OILPAN)
 TEST_F(HeapTest, CollectNodeAndCssStatistics) {
   PreciselyCollectGarbage();
   size_t node_bytes_before, css_bytes_before;
@@ -3274,6 +3272,5 @@
   EXPECT_LE(node_bytes_before + sizeof(FakeNode), node_bytes_after);
   EXPECT_LE(css_bytes_before + sizeof(FakeCSSValue), css_bytes_after);
 }
-#endif
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/platform/heap/v8_wrapper/thread_state.cc b/third_party/blink/renderer/platform/heap/v8_wrapper/thread_state.cc
index 204e72c5..25fca65 100644
--- a/third_party/blink/renderer/platform/heap/v8_wrapper/thread_state.cc
+++ b/third_party/blink/renderer/platform/heap/v8_wrapper/thread_state.cc
@@ -204,11 +204,49 @@
   }
 }
 
+namespace {
+
+class CustomSpaceStatisticsReceiverImpl final
+    : public v8::CustomSpaceStatisticsReceiver {
+ public:
+  explicit CustomSpaceStatisticsReceiverImpl(
+      base::OnceCallback<void(size_t allocated_node_bytes,
+                              size_t allocated_css_bytes)> callback)
+      : callback_(std::move(callback)) {}
+
+  ~CustomSpaceStatisticsReceiverImpl() final {
+    DCHECK(node_bytes_.has_value());
+    DCHECK(css_bytes_.has_value());
+    std::move(callback_).Run(*node_bytes_, *css_bytes_);
+  }
+
+  void AllocatedBytes(cppgc::CustomSpaceIndex space_index, size_t bytes) final {
+    if (space_index.value == NodeSpace::kSpaceIndex.value) {
+      node_bytes_ = bytes;
+    } else {
+      DCHECK_EQ(space_index.value, CSSValueSpace::kSpaceIndex.value);
+      css_bytes_ = bytes;
+    }
+  }
+
+ private:
+  base::OnceCallback<void(size_t allocated_node_bytes,
+                          size_t allocated_css_bytes)>
+      callback_;
+  base::Optional<size_t> node_bytes_;
+  base::Optional<size_t> css_bytes_;
+};
+
+}  // anonymous namespace
+
 void ThreadState::CollectNodeAndCssStatistics(
     base::OnceCallback<void(size_t allocated_node_bytes,
                             size_t allocated_css_bytes)> callback) {
-  // TODO(1181269): Implement.
-  std::move(callback).Run(0u, 0u);
+  std::vector<cppgc::CustomSpaceIndex> spaces{NodeSpace::kSpaceIndex,
+                                              CSSValueSpace::kSpaceIndex};
+  cpp_heap().CollectCustomSpaceStatisticsAtLastGC(
+      std::move(spaces),
+      std::make_unique<CustomSpaceStatisticsReceiverImpl>(std::move(callback)));
 }
 
 void ThreadState::EnableDetachedGarbageCollectionsForTesting() {
diff --git a/third_party/blink/web_tests/VirtualTestSuites b/third_party/blink/web_tests/VirtualTestSuites
index 24b7078..544df26 100644
--- a/third_party/blink/web_tests/VirtualTestSuites
+++ b/third_party/blink/web_tests/VirtualTestSuites
@@ -1019,8 +1019,7 @@
   },
   {
     "prefix": "force-renderer-accessibility",
-    "bases": ["accessibility/slot-poison.html",
-              "accessibility/details-summary-crash.html"],
+    "bases": ["accessibility/slot-poison.html"],
     "args": ["--force-renderer-accessibility"]
   },
   {
diff --git a/third_party/blink/web_tests/accessibility/details-summary-crash-expected.txt b/third_party/blink/web_tests/accessibility/details-summary-crash-expected.txt
deleted file mode 100644
index 15d8618..0000000
--- a/third_party/blink/web_tests/accessibility/details-summary-crash-expected.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-This test passes if it doesn't crash.
-summary 1
-summary 1
-summary 2
-summary 2
-summary 1
-summary 1
diff --git a/third_party/blink/web_tests/accessibility/details-summary-crash.html b/third_party/blink/web_tests/accessibility/details-summary-crash.html
deleted file mode 100644
index fcd5593..0000000
--- a/third_party/blink/web_tests/accessibility/details-summary-crash.html
+++ /dev/null
@@ -1,158 +0,0 @@
-<!DOCTYPE html>
-
-This test passes if it doesn't crash.
-
-<script>
-  if (window.testRunner)
-    testRunner.dumpAsText();
-</script>
-
-<script>
-class CustomDetails extends HTMLElement {
-  constructor() {
-    super();
-    const shadowRoot = this.attachShadow({mode: 'open', slotAssignment: 'manual'});
-
-    this.summarySlot = document.createElement('slot');
-    this.summarySlot.id = 'details-summary';
-    shadowRoot.appendChild(this.summarySlot);
-
-    const defaultSummary = document.createElement('summary');
-    defaultSummary.textContent = 'Details';
-    this.summarySlot.appendChild(defaultSummary);
-
-    this.contentSlot = document.createElement('slot');
-    this.contentSlot.id = 'details-content';
-    this.contentSlot.style = `content-visibility:hidden; display:block;`;
-    shadowRoot.appendChild(this.contentSlot);
-
-    const style = document.createElement('style');
-    style.textContent = `
-:host summary {
-  display: list-item;
-  counter-increment: list-item 0;
-  list-style: disclosure-closed inside;
-}
-:host([open]) summary {
-  list-style-type: disclosure-open;
-}
-`;
-    shadowRoot.appendChild(style);
-  }
-
-  connectedCallback() {
-    this.updateOpen();
-    this.updateAssignment();
-    this.addEventListener('DOMNodeInserted', this.updateAssignment);
-    this.addEventListener('DOMNodeRemoved', this.updateAssignment);
-  }
-
-  disconnectedCallback() {
-    this.removeEventListener('DOMNodeInserted', this.updateAssignment);
-    this.removeEventListener('DOMNodeRemoved', this.updateAssignment);
-  }
-
-  attributeChangedCallback(name, oldValue, newValue) {
-    this.updateOpen();
-  }
-
-  static get observedAttributes() {
-    return ['open'];
-  }
-
-  updateOpen() {
-    if (this.hasAttribute('open')) {
-      this.contentSlot.style = ``;
-    } else {
-      this.contentSlot.style = `content-visibility: hidden; display:block`;
-    }
-  }
-
-  updateAssignment() {
-    let summary = null;
-    const content = [];
-
-    for (let child = this.firstChild; child; child = child.nextSibling) {
-      if (!summary && child.tagName === 'SUMMARY') {
-        summary = child;
-      } else {
-        content.push(child);
-      }
-    }
-
-    if (summary)
-      this.summarySlot.assign(summary);
-    if (content.length)
-      this.contentSlot.assign(...content);
-  }
-};
-customElements.define('x-details', CustomDetails);
-</script>
-
-<script>
-function clickOn(element, x, y) {
-  const rect = element.getBoundingClientRect();
-  return new Promise((resolve, reject) => {
-    chrome.gpuBenchmarking.pointerActionSequence([
-        {source: 'mouse',
-         actions: [
-             {name: 'pointerMove', x: rect.x + x, y: rect.y + y},
-             {name: 'pointerDown', x: rect.x + x, y: rect.y + y, button: 0},
-             {name: 'pointerUp', button: 0}]
-        }], resolve);
-  });
-}
-
-const $ = document.querySelector.bind(document);
-
-async function runTests() {
-  $('#dt1').removeChild($('#dt1 > summary'));
-
-  $('#dt1c').removeChild($('#dt1c > summary'));
-  await clickOn($('#dt1c'), 2, 2);
-
-  $('#dt2').removeChild($('#dt2 > summary'));
-
-  $('#dt2c').removeChild($('#dt2c > summary'));
-  await clickOn($('#dt2c'), 2, 2);
-
-  $('#dt3').removeChild($('#dt3 > summary:last-of-type'));
-
-  $('#dt3c').removeChild($('#dt3c > summary:last-of-type'));
-  await clickOn($('#dt3c'), 2, 2);
-
-  $('#dt4').removeChild($('#dt4 > summary'));
-
-  $('#dt4c').removeChild($('#dt4c > summary'));
-  await clickOn($('#dt4c'), 2, 2);
-
-  $('#dt5').removeChild($('#dt5 > summary'));
-
-  $('#dt5c').removeChild($('#dt5c > summary'));
-  await clickOn($('#dt5c'), 2, 2);
-
-  $('#dt6').removeChild($('#dt6 > summary:last-of-type'));
-
-  $('#dt6c').removeChild($('#dt6c > summary:last-of-type'));
-  await clickOn($('#dt6c'), 2, 2);
-
-  testRunner.notifyDone();
-}
-
-testRunner.waitUntilDone();
-
-</script>
-<body onload="runTests()">
-<x-details id="dt1"><summary>summary</summary></x-details>
-<x-details id="dt1c"><summary>summary</summary></x-details>
-<x-details id="dt2"><summary>summary 1</summary><summary>summary 2</summary></x-details>
-<x-details id="dt2c"><summary>summary 1</summary><summary>summary 2</summary></x-details>
-<x-details id="dt3"><summary>summary 1</summary><summary>summary 2</summary></x-details>
-<x-details id="dt3c"><summary>summary 1</summary><summary>summary 2</summary></x-details>
-<x-details id="dt4" open><summary>summary</summary></x-details>
-<x-details id="dt4c" open><summary>summary</summary></x-details>
-<x-details id="dt5" open><summary>summary 1</summary><summary>summary 2</summary></x-details>
-<x-details id="dt5c" open><summary>summary 1</summary><summary>summary 2</summary></x-details>
-<x-details id="dt6" open><summary>summary 1</summary><summary>summary 2</summary></x-details>
-<x-details id="dt6c" open><summary>summary 1</summary><summary>summary 2</summary></x-details>
-</body>
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index a05ea86..de4c8e0 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -38366,6 +38366,14 @@
       label="Search canceled because the search backend isn't available"/>
 </enum>
 
+<enum name="HelpAppSearchHandlerSearchResultStatus">
+  <int value="0" label="Not ready, empty index"/>
+  <int value="1" label="Not ready, other status (not empty index)"/>
+  <int value="2" label="Ready and success"/>
+  <int value="3" label="Ready, empty index (not success)"/>
+  <int value="4" label="Ready, other status (not success, not empty index)"/>
+</enum>
+
 <enum name="HermesResponseStatus">
   <summary>
     Statuses returned by Hermes, the Chrome OS daemon process which configures
@@ -39989,6 +39997,11 @@
   <int value="3" label="Voice"/>
 </enum>
 
+<enum name="IMENonAutocorrectDiacriticStatus">
+  <int value="0" label="WITHOUT_DIACRITICS"/>
+  <int value="1" label="WITH_DIACRITICS"/>
+</enum>
+
 <enum name="IMERegisterProxyView">
   <obsolete>
     Removed as of Jan 2020.
@@ -46162,6 +46175,7 @@
   <int value="-595353721" label="RecordWebAppDebugInfo:enabled"/>
   <int value="-594076614" label="PluginVmShowCameraPermissions:disabled"/>
   <int value="-593536514" label="ExperimentalTabController:enabled"/>
+  <int value="-592628080" label="DnsProxyEnableDOH:disabled"/>
   <int value="-591874964" label="LiteVideo:enabled"/>
   <int value="-589096918" label="ash-enable-fullscreen-app-list"/>
   <int value="-588669613"
@@ -48221,6 +48235,7 @@
   <int value="1247293682" label="topchrome-md"/>
   <int value="1249215617" label="SelectToSpeakNavigationControl:enabled"/>
   <int value="1250071868" label="disable-timezone-tracking-option"/>
+  <int value="1250776846" label="DnsProxyEnableDOH:enabled"/>
   <int value="1253001092" label="FeedShare:enabled"/>
   <int value="1253698118" label="ash-disable-stable-overview-order"/>
   <int value="1254472299" label="PrivacySettingsRedesign:disabled"/>
diff --git a/tools/metrics/histograms/histograms_xml/file/histograms.xml b/tools/metrics/histograms/histograms_xml/file/histograms.xml
index 2dacb23..b782bdb 100644
--- a/tools/metrics/histograms/histograms_xml/file/histograms.xml
+++ b/tools/metrics/histograms/histograms_xml/file/histograms.xml
@@ -625,16 +625,16 @@
 </histogram>
 
 <histogram name="FileBrowser.Share.ActionSource" enum="SharingActionSource"
-    expires_after="2021-09-05">
-  <owner>lucmult@chromium.org</owner>
-  <owner>majewski@chromium.org</owner>
+    expires_after="2021-11-05">
+  <owner>simmonsjosh@google.com</owner>
+  <owner>src/ui/file_manager/OWNERS</owner>
   <summary>Chrome OS File Browser: the source of file sharing action.</summary>
 </histogram>
 
 <histogram name="FileBrowser.Share.FileCount" units="files"
-    expires_after="2021-05-05">
-  <owner>lucmult@chromium.org</owner>
-  <owner>majewski@chromium.org</owner>
+    expires_after="2021-11-05">
+  <owner>simmonsjosh@google.com</owner>
+  <owner>src/ui/file_manager/OWNERS</owner>
   <summary>
     Chrome OS File Browser: The number of files shared via a single Share
     action.
@@ -642,9 +642,9 @@
 </histogram>
 
 <histogram name="FileBrowser.Share.FileType" enum="ViewFileType"
-    expires_after="2021-05-05">
-  <owner>lucmult@chromium.org</owner>
-  <owner>majewski@chromium.org</owner>
+    expires_after="2021-11-05">
+  <owner>simmonsjosh@google.com</owner>
+  <owner>src/ui/file_manager/OWNERS</owner>
   <summary>
     Chrome OS File Browser: The type of the file shared via Share action.
     Recorded for each file being shared by a share action
diff --git a/tools/metrics/histograms/histograms_xml/help_app/histograms.xml b/tools/metrics/histograms/histograms_xml/help_app/histograms.xml
index 32f69273..559beed 100644
--- a/tools/metrics/histograms/histograms_xml/help_app/histograms.xml
+++ b/tools/metrics/histograms/histograms_xml/help_app/histograms.xml
@@ -33,6 +33,19 @@
   </summary>
 </histogram>
 
+<histogram name="Discover.SearchHandler.SearchResultStatus"
+    enum="HelpAppSearchHandlerSearchResultStatus" expires_after="2022-05-05">
+  <owner>zufeng@google.com</owner>
+  <owner>showoff-eng@google.com</owner>
+  <summary>
+    The end result of a search using the help app search handler. Logged once
+    per time a search finishes. Not logged if the search is canceled by a new
+    search starting. Use this to calculate the proportion of searches where the
+    search handler is ready vs not ready. &quot;Ready&quot; means the first
+    update finished and the search handler is ready to handle searches.
+  </summary>
+</histogram>
+
 </histograms>
 
 </histogram-configuration>
diff --git a/tools/metrics/histograms/histograms_xml/input/histograms.xml b/tools/metrics/histograms/histograms_xml/input/histograms.xml
index 54abbd1..3e43c10 100644
--- a/tools/metrics/histograms/histograms_xml/input/histograms.xml
+++ b/tools/metrics/histograms/histograms_xml/input/histograms.xml
@@ -567,6 +567,17 @@
   </summary>
 </histogram>
 
+<histogram name="InputMethod.MultilingualExperiment.NonAutocorrect"
+    enum="IMENonAutocorrectDiacriticStatus" expires_after="2021-06-30">
+  <owner>tranbaoduy@google.com</owner>
+  <owner>essential-inputs-team@google.com</owner>
+  <summary>
+    Diacritic status of non-autocorrected user-typed words. Recorded when the
+    user finishes typing a word. Only recorded for CrOS 1P experimental
+    multilingual input methods.
+  </summary>
+</histogram>
+
 <histogram name="InputMethod.NextWordPrediction" enum="BooleanEnabled"
     expires_after="2021-10-17">
   <owner>myy@chromium.org</owner>
diff --git a/tools/perf/core/perf_data_generator.py b/tools/perf/core/perf_data_generator.py
index a6e5f87..8f47c31 100755
--- a/tools/perf/core/perf_data_generator.py
+++ b/tools/perf/core/perf_data_generator.py
@@ -1459,8 +1459,9 @@
     ]
   }
 
-  # TODO(crbug.com/1104244) Enable Result DB on all platforms when verified.
-  if builder_name in FYI_BUILDERS:
+  # Enable Result DB on all perf test bots. Builders with names including
+  # "builder-perf" are used for compiling only, and do not run perf tests.
+  if 'builder-perf' not in builder_name:
     result['resultdb'] = {'enable': True}
 
   # For now we either get shards from the number of devices specified
diff --git a/ui/base/ime/chromeos/input_method_chromeos.cc b/ui/base/ime/chromeos/input_method_chromeos.cc
index 177d9b8..6c50d93 100644
--- a/ui/base/ime/chromeos/input_method_chromeos.cc
+++ b/ui/base/ime/chromeos/input_method_chromeos.cc
@@ -398,6 +398,7 @@
         PendingSetCompositionRange{composition_range, non_empty_text_spans};
     return true;
   } else {
+    composing_text_ = true;
     return client->SetCompositionFromExistingText(composition_range,
                                                   non_empty_text_spans);
   }
@@ -453,13 +454,15 @@
   if (IsPasswordOrNoneInputFieldFocused() || !GetTextInputClient())
     return;
 
+  const bool was_composing = composing_text_;
+
   pending_composition_ = base::nullopt;
   result_text_.clear();
   result_text_cursor_ = 0;
   composing_text_ = false;
   composition_changed_ = false;
 
-  if (reset_engine && GetEngine())
+  if (reset_engine && was_composing && GetEngine())
     GetEngine()->Reset();
 
   character_composer_.Reset();
diff --git a/ui/base/ime/chromeos/input_method_chromeos_unittest.cc b/ui/base/ime/chromeos/input_method_chromeos_unittest.cc
index 7c1674e..eabd531 100644
--- a/ui/base/ime/chromeos/input_method_chromeos_unittest.cc
+++ b/ui/base/ime/chromeos/input_method_chromeos_unittest.cc
@@ -1288,4 +1288,31 @@
   EXPECT_EQ(fake_text_input_client.text(), u"");
 }
 
+TEST_F(InputMethodChromeOSTest, ResetsEngineWithComposition) {
+  FakeTextInputClient fake_text_input_client(TEXT_INPUT_TYPE_TEXT);
+  fake_text_input_client.SetTextAndSelection(u"hello ", gfx::Range(6, 6));
+  InputMethodChromeOS ime(this);
+  ime.SetFocusedTextInputClient(&fake_text_input_client);
+
+  ui::CompositionText composition;
+  composition.text = u"world";
+  ime.UpdateCompositionText(composition, /*cursor_pos=*/5, /*visible=*/true);
+  ime.CancelComposition(&fake_text_input_client);
+
+  EXPECT_EQ(mock_ime_engine_handler_->reset_call_count(), 1);
+}
+
+TEST_F(InputMethodChromeOSTest, DoesNotResetEngineWithNoComposition) {
+  FakeTextInputClient fake_text_input_client(TEXT_INPUT_TYPE_TEXT);
+  InputMethodChromeOS ime(this);
+  ime.SetFocusedTextInputClient(&fake_text_input_client);
+
+  ime.CommitText(
+      u"hello",
+      TextInputClient::InsertTextCursorBehavior::kMoveCursorAfterText);
+  ime.CancelComposition(&fake_text_input_client);
+
+  EXPECT_EQ(mock_ime_engine_handler_->reset_call_count(), 0);
+}
+
 }  // namespace ui
diff --git a/ui/content_accelerators/accelerator_util.cc b/ui/content_accelerators/accelerator_util.cc
index 3d66d744..d5f2965 100644
--- a/ui/content_accelerators/accelerator_util.cc
+++ b/ui/content_accelerators/accelerator_util.cc
@@ -22,7 +22,11 @@
     // TODO: This must be the same as below and it's simpler.
     // Cleanup if this change sticks.
     auto* os_event = static_cast<ui::KeyEvent*>(event.os_event);
-    return ui::Accelerator(*os_event);
+
+    // If there is no |os_event| fall through to the default code path.
+    // This can occur when keys are injected from dev tools.
+    if (os_event)
+      return ui::Accelerator(*os_event);
   }
 #endif
   Accelerator::KeyState key_state =